1 / 75

项目 8 学生成绩单制作

项目 8 学生成绩单制作. 项目 8 学生成绩单制作. 【 学习目标 】. (1) 掌握结构体的定义与引用。 (2) 掌握结构体数组的定义以及应用。 (3) 掌握指向结构体类型数据的指针变量的定义以及应用 。. 任务 8.1 用结构体数组进行学生信息的输入 / 输出. 任务介绍. 一个班 45 名学生参加了高等数学、大学英语、 C 程序设计三门课程的考试。现要求输入全班同学成绩单信息 ( 姓名、学号、三门课程成绩 ) ,并输出。为了程序运行的方便,只选择了前三同学。 前三位学生信息如下: 20100001 李阳 男 89 56 76

Download Presentation

项目 8 学生成绩单制作

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 项目8 学生成绩单制作

  2. 项目8 学生成绩单制作 【学习目标】 • (1) 掌握结构体的定义与引用。 • (2) 掌握结构体数组的定义以及应用。 • (3) 掌握指向结构体类型数据的指针变量的定义以及应用。

  3. 任务8.1 用结构体数组进行学生信息的输入/输出 任务介绍 一个班45名学生参加了高等数学、大学英语、C程序设计三门课程的考试。现要求输入全班同学成绩单信息(姓名、学号、三门课程成绩),并输出。为了程序运行的方便,只选择了前三同学。 前三位学生信息如下: 20100001 李阳男89 56 76 20100002 李雪女75 95 83 20100003 王刚男91 89 61 要求输出格式为: 前三位学生成绩信息为: 20100001 李阳男89 56 76 20100002 李雪女75 95 83 20100003 王刚男91 89 61

  4. 任务8.1 用结构体数组进行学生信息的输入/输出 解决思路 方法1: S1:把学生信息输入到多个数组中。 S2:输出每个数组中的数据。 通过方法1的描述,可以发现此方法不仅复杂,而且把与学生有关的整体信息分割到各个数组中,对数据的组织,引用非常不方便。要是能将不同的类型的数据组合成一个有机的整体,将会对数据的引用带来极大的方便。

  5. 任务8.1 用结构体数组进行学生信息的输入/输出 解决思路 由上述的分析可知,采用方式1实现本任务是不科学的。现介绍一种新的方法,采用结构体将学生相关信息(学号、姓名、性别、三门课程成绩)组合成一个有机整体,每个学生是一个结构体,多个学生组成一个结构体数组。 方法2: S1:把学生信息输入到结构体数组。 S2:输出结构体数组中的所有数据。

  6. 任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<stdio.h> #define SIZE 3 struct student { char number[10]; char name [10]; char sex [3]; float score[SIZE]; float avg; };

  7. 任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: void main() { int i; struct student stud[SIZE]; for(i=0;i<SIZE;i++) { printf("请输入第%d个学生的信息:",i+1); scanf("%s%s%s%f%f%f",&stud[i].number,&stud[i].name,&stud[i].sex, &stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);

  8. 任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: } printf("前三位学生成绩信息为:\n"); for(i=0;i<SIZE;i++) { printf("%s\t%s\t%s\t%3.0f\t%3.0f\t%3.0f\n",stud[i].number, stud[i].name,stud[i].sex,stud[i].score[0],stud[i].score[1], stud[i].score[2]); } }

  9. 任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 结构体类型与变量。 (2) 结构体变量的引用。 (3) 结构体变量的初始化。 (4) 结构体数组。

  10. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.1 结构体类型 (1) 语法。 struct 结构体名 {成员表列}; 成员表列中各成员也都要进行类型声明: 类型名 成员名 struct student { char name[10]; int age; float score; }; 例如:

  11. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.1 结构体类型 (2) 语义。 定义一个名为student的结构体。struct是一个关键字,它向编译系统声明这是一个“结构体类型”,而struct student 是一个类型名,它和系统提供的标准类型(如int,float,char等)具有相同的地位与作用。定义的这个结构体包含了3个成员变量:一个字符数组成员变量、一个整型成员变量和一个实型成员变量。

  12. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.2 结构体变量 (1) 先声明结构体类型再定义变量名。 struct studentstud1,stud2; 结构体类型名 结构体变量名 (2) 在声明类型的同时定义变量。 struct 结构体名 { 成员表列; }变量名表列;

  13. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.2 结构体变量 (3) 直接定义结构体类型变量。 一般形式如下: struct { 成员表列; }变量名表列;

  14. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 结构体变量名.成员名 例如: stud1.score 表示stud1变量中的score成员。可以对变量的成员变量赋值,例如: stud1.score=95.0f;

  15. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 可以引用结构体变量的成员的地址,也可以引用结构体变量的地址。例如: scanf("%f",&stud1.score); /*输入stud1.score的值*/ printf("%o",&stud1); /*输出stud1的首地址*/ 不能用下面的语句把数据整体读入结构体变量,例如: scanf("%s,%d,%f",&sutd1); 只能是一个成员一个成员进行数据读入,例如: scanf("%s,%d,%f",&stud1.name,&stud1.age,&stud1.score);

  16. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 【例8-1】结构体变量的引用。 程序如下: struct student { char number[10]; char name[10]; int age; char sex[3]; char address[20]; };

  17. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 void main() { struct student stud; printf("请输入学生信息,各数据之间用空格隔开:"); scanf("%s%s%d%s%s",&stud.number,&stud.name,&stud.age,stud.sex, stud.address); printf("学生信息为:\n"); printf("学号:%s\n姓名:%s\n年龄:%d\n性别:%s\n地址:%s\n", stud.number,stud.name,stud.age,stud.sex,stud.address); }

  18. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 【运行结果】

  19. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.4 结构体变量的初始化 【例8-2】对结构体变量初始化,并输出显示在屏幕上。 程序如下: #include<stdio.h> struct student { char number[10]; char name[10]; int age; char sex[3]; char address[20];

  20. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.4 结构体变量的初始化 }; struct student stud={"20100001","肖飞",19,"男","GuangZhou"}; void main() { printf("学号:%s\n姓名:%s\n年龄:%d\n性别:%s\n地址:%s\n", stud.number,stud.name,stud.age,stud.sex,stud.address); }

  21. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.4 结构体变量的初始化 【运行结果】

  22. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.1 定义结构体数组 例如: struct student { char number[10]; char name[10]; int age; char sex[3]; char address[20]; }; struct student stud[5];

  23. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.1 定义结构体数组 以上定义了一个数组stud,其元素为struct student类型数据,数组有5个元素。 也可以直接定义一个结构体数组,例如: struct student { char number[10]; char name[10]; int age; char sex[3]; char address[20]; }stud[5];

  24. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.1 定义结构体数组 或 struct { char number[10]; char name[10]; int age; char sex[3]; char address[20]; }stud[5];

  25. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 结构体数组类型结构体数组名称={{初始值列1},{初始值列2},…,{初始值列n}}; 例如: struct student { char number[10]; char name[10]; int age; char sex[3]; char address[20];

  26. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 }; struct student stud[4]={{"20100001","肖飞",19,"男","广州"}, {"20100002","李雪",18,"女","深圳"}, {"20100003","郭键",20,"男","惠州"}, {"20100004","董敏",18,"女","东莞"}};

  27. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 【例8-3】从键盘上输入5个学生的信息,统计男生与女生的人数。 程序如下: #include<stdio.h> #define SIZE 5 struct student { char number[10]; char name[10]; int age;

  28. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 char sex[3]; char address[20]; }; void main() { int i; int mcount=0; int fcount=0; struct student stud[SIZE]; printf("请输入学生信息(学号、姓名、年龄、性别、地址),各数据之间用空格隔开:\n");

  29. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 for(i=0;i<SIZE;i++) { scanf("%s%s%d%s%s",&stud[i].number,&stud[i].name,&stud[i].age, stud[i].sex,stud[i].address); } printf("学生信息为:\n"); printf("学号\t\t姓名\t年龄\t性别\t地址\n"); for(i=0;i<SIZE;i++) {

  30. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 printf("%s\t%s\t%d\t%s\t%s\n",stud[i].number,stud[i].name, stud[i].age,stud[i].sex,stud[i].address); } for(i=0;i<SIZE;i++) { if(strcmp(stud[i].sex,"男")==0) { mcount++;

  31. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 } else { fcount++; } } printf("男生的人数为:%d\n",mcount); printf("女生的人数为:%d\n",fcount); }

  32. 任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 【运行结果】

  33. 任务8.2 输出平均分最高的学生信息 任务介绍 任务8.1已经把学生相关信息输入到了结构体数组。现要求输出平均分最高的学生的相关信息。 学生成绩信息为: 学号姓名性别数学英语C程序 20100001 肖飞男86 56 76 20100002 李雪女75 95 83 20100003 郭键男91 89 61 20100004 董明男87 69 90 20100005 唐霞女93 88 79

  34. 任务8.2 输出平均分最高的学生信息 任务介绍 要求输出格式为: 学生成绩信息为: 学号姓名性别数学英语C程序平均分 20100001 肖飞男86 56 76 73 20100002 李雪女75 95 83 84 20100003 郭键男91 89 61 80 20100004 董明男87 69 90 82 20100005 唐霞女93 88 79 87 平均分最高的学生信息为: 20100005 唐霞女93 88 79 87

  35. 任务8.2 输出平均分最高的学生信息 解决思路 方法: S1:学生信息输入到结构体数组中。 S2:计算每个学生的总分与平均分,并把求得的平均分赋值给结构体中avg成员变量。 S3:查找最高平均分学生在结构体数组中的下标。 S4:根据数组下标输出学生信息。

  36. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<stdio.h> #define SIZE 5 struct student { char number[10]; char name [10]; char sex [3]; float score[3]; float avg; };

  37. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: struct student stud[SIZE]={{"20100001","肖飞","男",86,56,76}, {"20100002","李雪","女",75,95,83}, {"20100003","郭键","男",91,89,61}, {"20100004","董明","男",87,69,90}, {"20100005","唐霞","女",93,88,79}}; float Sum(struct student *pStu); /*计算总分*/ void Avg(struct student *pStu); /*计算每个学生的平均分*/ int Search(struct student *pStu); /*查找平均分最高学生在结构体数组中的下标*/ void main()

  38. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: { int i; Avg(stud); printf("学生成绩信息为:\n"); printf("学号\t\t姓名\t性别\t数学\t英语\tC程序\t平均分\n"); for(i=0;i<SIZE;i++) { printf("%s\t%s\t%s\t%3.0f\t%3.0f\t%3.0f\t%3.0f\n", stud[i].number,stud[i].name,stud[i].sex,stud[i].score[0], stud[i].score[1],stud[i].score[2],stud[i].avg); } printf("\n"); i = Search(stud);

  39. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: printf("平均分最高的学生信息为:\n"); printf("%s\t%s\t%s\t%3.0f\t%3.0f\t%3.0f\t%3.0f\n",stud[i].number, stud[i].name,stud[i].sex,stud[i].score[0],stud[i].score[1], stud[i].score[2],stud[i].avg); }  float Sum(struct student *pStu) /*计算总分*/ { return (pStu->score[0]+pStu->score[1]+pStu->score[2]);

  40. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: }  void Avg(struct student *pStu) /*计算每个学生的平均分*/ { int i; for(i=0;i<SIZE;i++) { float sum=Sum(&stud[i]); stud[i].avg=sum/3; } } 

  41. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: int Search(struct student *pStu) /*查找平均分最高学生在结构体数组中的下标*/ { float max,index; int i; max=pStu->avg; index=0; for(i=0;i<SIZE;i++,pStu++) { if(max<pStu->avg) {

  42. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index; }

  43. 任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index; }

  44. 任务8.2 输出平均分最高的学生信息 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下: (1) 指向结构体变量的指针。 (2) 指向结构体数组的指针。 (3) 结构体指针作为函数的参数。

  45. 任务8.2 输出平均分最高的学生信息 8.2.1 指向结构体变量的指针 结构体指针变量的定义与其他类型的指针变量一样: 结构体类型 * 变量名; 【例8-4】指向结构体变量的指针应用。 程序如下: #include<stdio.h> struct student { char name[10]; char sex [3]; int age; };

  46. 任务8.2 输出平均分最高的学生信息 8.2.1 指向结构体变量的指针 void main() { struct student stud; struct student *pStud; /*定义结构体指针*/ pStud=&stud; /*结构体指针指向结构体变量*/ strcpy(stud.name,"TangTao"); strcpy(stud.sex,"男"); stud.age=28; printf("%s\t%s\t%d\n",stud.name,stud.sex,stud.age); printf("%s\t%s\t%d\n",(*pStud).name,(*pStud).sex,(*pStud).age); printf("%s\t%s\t%d\n",pStud->name,pStud->sex,pStud->age); }

  47. 任务8.2 输出平均分最高的学生信息 8.2.1 指向结构体变量的指针 【运行结果】 【运行结果分析】 从运行的结果来看,三个printf()函数输出的结果是相同的。第二个输出结构体各成员采用的是(*p).name这种形式。(*p)表示p指向的结构体变量,(*p).name是p指向的结构体变量中的成员name。而第三个输出采用的是p->name这种形式,是(*p).name一种方便直观的简化形式。p->name与(*p).name是等价的。也就是说,以下三中形式是等价的: (1) 结构体变量.成员名 (2)  (*p).成员名 (3)  p->成员名(->称为指向运算符)

  48. 任务8.2 输出平均分最高的学生信息 8.2.2 指向结构体数组的指针 【例8-5】指向结构体数组的指针应用。 程序如下: #define SIZE 5 struct student { char name [10]; char sex [3]; int age; }; void main() {

  49. 任务8.2 输出平均分最高的学生信息 8.2.2 指向结构体数组的指针 【例8-5】指向结构体数组的指针应用。 程序如下: struct student stud[SIZE]={{"肖飞","男",19},{"李雪","女",18},{"郭键", "男",20},{"董明","男",21},{"唐霞","女",22}}; struct student * p; printf("姓名\t性别\t年龄\n"); printf("采用数组下标进行输出\n"); for(int i=0;i<SIZE;i++) { printf("%s\t%s\t%d\n",stud[i].name,stud[i].sex,stud[i].age);

  50. 任务8.2 输出平均分最高的学生信息 8.2.2 指向结构体数组的指针 【例8-5】指向结构体数组的指针应用。 程序如下: } printf("采用指向数组的指针进行输出\n"); for(p=stud;p<stud+SIZE;p++) { printf("%s\t%s\t%d\n",p->name,p->sex,p->age); } }

More Related