C程序设计-教案-38(2课时——结构体指针)

教案
序号
038
周 次
授课形式
新授
授课章节名称
教学目的
理解和使用结构体指针
教学重点
理解和使用结构体指针
教学难点
理解和使用结构体指针
使用教具
机房
课外作业
课后体会
授课主要内容
9.3.1 指向结构体变量的指针
指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。
指针变量的基类型必须与结构体变量的类型相同。例如:
  struct Student *pt;
9.3.1 指向结构体变量的指针
  9.5  通过指向结构体变量的指针变量输出结构体变量中成员的信息。
解题思路:在已有的基础上,本题要解决两个问题:
怎样对结构体变量成员赋值;
怎样通过指向结构体变量的指针访问结构体变量中成员。
#include <stdio.h>
#include <string.h>
int main()
{  struct Student
长寿热线  { long num;
      char name[20];
      char sex;
      float score;
  };
……
  struct Student stu_1; 
  struct Student * p;   
贵州省公路局局长  p=&stu_1;   
  stu_1.num=10101; 
  strcpy(stu_1.name,“Li Lin”);
  stu_1.sex='M‘;  stu_1.score=89.5;
  printf("No.:%ld\n”,stu_1.num);
  printf("name:%s\n",stu_1.name);
  printf("sex:%c\n”,stu_1.sex);
  printf(”score:%5.1f\n”,stu_1.score);
  return 0;
}
  struct Student stu_1; 
  struct Student * p;   
  p=&stu_1;   
  stu_1.num=10101; 
  strcpy(stu_1.name,“Li Lin”);
  stu_1.sex='M‘;  stu_1.score=89.5;
  printf("No.:%ld\n”,stu_1.num);
  printf("name:%s\n",stu_1.name);
  printf("sex:%c\n”,stu_1.sex);
  printf(”score:%5.1f\n”,stu_1.score);
  return 0;
}
说明:
为了使用方便和直观,C语言允许把(*p).nump->num来代替
(*p).name等价于p->name
如果p指向一个结构体变量stu,以下等价:
  stu.成员名(stu.num)
  (*p).成员名((*p).num)
康柏显示器
    p->成员名(p->num)
9.3.2 指向结构体数组的指针
  9.6  3个学生的信息,放在结构体数组中,要求输出全部学生的信息。
解题思路:用指向结构体变量的指针处理
(1)声明struct Student,并定义结构体数组、初始化
(2)定义指向struct Student类型指针p
(3)使p指向数组首元素,输出元素中各信息
(4)使p指向下一个元素,输出元素中各信息
(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息
#include <stdio.h>
struct Student                 
{ int num;    char name[20];
  char sex;  int age;
};
struct Student stu[3]={
              {10101,"Li Lin",'M',18},
              {10102,"Zhang Fun",'M',19},
              {10104,"Wang Min",'F',20} };
int main()
{ struct Student *p; 
  printf(" No.  Name        sex  age\n");
  for(p=stu;p<stu+3;p++)
      printf(“%5d %-20s %2c %4d\n”,
                          p->num, p->name,
                                p->sex, p->age);
  return 0;
}
int main()
{ struct Student *p; 
  printf(" No.  Name        sex  age\n");
  for(p=stu;p<stu+3;p++)
      printf(“%5d %-20s %2c %4d\n”,
                          p->num, p->name,
                                p->sex, p->age);
  return 0;
}
int main()
{ struct Student *p; 
  printf(" No.  Name        sex  age\n");
  for(p=stu;p<stu+3;p++)
      printf(“%5d %-20s %2c %4d\n”,
                          p->num, p->name,
                                p->sex, p->age);
  return 0;
}
int main()
{ struct Student *p; 
  printf(" No.  Name        sex  age\n");
  for(p=stu;p<stu+3;p++)
      printf(“%5d %-20s %2c %4d\n”,
                          p->num, p->name,
                                p->sex, p->age);
  return 0;
}暗房易根经
9.3.3  用结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值传递给另一个函数,有3个方法。
(1) 用结构体变量的成员作参数。
  例如,用stu[1].numstu[2].name作函数实参,将实参值传给形参。
用法和用普通变量作实参是一样的,属于“值传递”方式。
应当注意实参与形参的类型保持一致。
(2) 用结构体变量作实参。
用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量
在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大
在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数
一般较少用这种方法
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。
  9.7 n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)
解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:
input函数输入数据和求各学生平均成绩
银针秀◆max函数平均成绩最高的学生
print函数输出成绩最高学生的信息
在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。
本程序假设n=3
#include <stdio.h>
#define N 3
struct Student
{  int num; 
    char name[20];   
    float score[3]; 
    float aver; 
};
int main()
{ void input(struct Student stu[]); 
  struct Student max(struct Student stu[]);   
  void print(struct Student stu); 
  struct Student stu[N],*p=stu; 
  input(p); 
  print(max(p)); 
  return 0;
}
void input(struct Student stu[]) 
{ int i;
  printf("请输入各学生的信息:
                学号、姓名、三门课成绩电磁搅拌:\n");
  for(i=0;i<N;i++)
  {scanf("%d %s %f %f %f",
                  &stu[i].num,stu[i].name,
              &stu[i].score[0],&stu[i].score[1],
                &stu[i].score[2]); 
    stu[i].aver=(stu[i].score[0]+
          stu[i].score[1]+stu[i].score[2])/3.0; 
  }
}
void input(struct Student stu[]) 
{ int i;
  printf("请输入各学生的信息:
                学号、姓名、三门课成绩:\n");
  for(i=0;i<N;i++)
  {scanf("%d %s %f %f %f",
                  &stu[i].num,stu[i].name,
              &stu[i].score[0],&stu[i].score[1],
                &stu[i].score[2]); 
    stu[i].aver=(stu[i].score[0]+
          stu[i].score[1]+stu[i].score[2])/3.0; 
  }
}
void input(struct Student stu[]) 
{ int i;
  printf("请输入各学生的信息:
                学号、姓名、三门课成绩:\n");
  for(i=0;i<N;i++)
  {scanf("%d %s %f %f %f",
                  &stu[i].num,stu[i].name,
              &stu[i].score[0],&stu[i].score[1],
                &stu[i].score[2]); 
    stu[i].aver=(stu[i].score[0]+
          stu[i].score[1]+stu[i].score[2])/3.0; 
  }
}
struct Student max(struct Student stu[]) 
{int i,m=0; 
  for(i=0;i<N;i++)
    if (stu[i].aver>stu[m].aver) m=i;   
  return stu[m]; 
void print(struct Student stud) 
{ printf("\n成绩最高的学生是:\n");
    printf("学号:%d\n姓名:%s\n
          三门课成绩:%5.1f,%5.1f,%5.1f\n
            平均成绩:%6.2f\n”, stud.num,
              stud.name,stud.score[0],
      stud.score[1],stud.score[2],stud.aver);
}
以上3个函数的调用,情况各不相同:
调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。
调用max函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。
调用print函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。

本文发布于:2024-09-23 20:20:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361253.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   变量   指针
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议