75
项项 8 项项项项项项项

项目 8 学生成绩单制作

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 项目 8   学生成绩单制作

项目 8 学生成绩单制作

Page 2: 项目 8   学生成绩单制作

项目 8 学生成绩单制作【学习目

标】(1) 掌握结构体的定义与引用。(2) 掌握结构体数组的定义以及应用。(3) 掌握指向结构体类型数据的指针变量的定义以及应用。

Page 3: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

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

Page 4: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

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

Page 5: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

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

Page 6: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>#define SIZE 3struct student{ char number[10]; char name [10]; char sex [3]; float score[SIZE]; float avg;};

Page 7: 项目 8   学生成绩单制作

任务 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]);

Page 8: 项目 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]); }}

Page 9: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握如下知识点:(1) 结构体类型与变量。(2) 结构体变量的引用。(3) 结构体变量的初始化。(4) 结构体数组。

Page 10: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.1 结构体类型(1) 语法。

struct 结构体名{成员表列} ;

成员表列中各成员也都要进行类型声明:

类型名 成员名

例如: struct student{ char name[10]; int age; float score;};

Page 11: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.1 结构体类型(2) 语义。

定义一个名为 student的结构体。 struct是一个关键字,“ ”它向编译系统声明这是一个 结构体类型 ,而 struct

student 是一个类型名,它和系统提供的标准类型 ( 如int , float , char 等 )具有相同的地位与作用。定义的这个结构体包含了 3个成员变量:一个字符数组成员变量、一个整型成员变量和一个实型成员变量。

Page 12: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.2 结构体变量(1) 先声明结构体类型再定义变量名。

struct student stud1,stud2;

结构体类型名 结构体变量名

struct student stud1,stud2;

结构体类型名 结构体变量名

(2) 在声明类型的同时定义变量。

struct 结构体名{ 成员表列 ;}变量名表列 ;

Page 13: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.2 结构体变量(3) 直接定义结构体类型变量。

一般形式如下:struct{ 成员表列 ;}变量名表列 ;

Page 14: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.3 结构体变量的引用

结构体变量名.成员名

例如:

stud1.score=95.0f;

stud1.score 表示 stud1变量中的 score成员。可以对变量的成员变量赋值,例如:

Page 15: 项目 8   学生成绩单制作

任务 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);

只能是一个成员一个成员进行数据读入,例如:

Page 16: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.3 结构体变量的引用【例 8-1 】结构体变量的引用。【例 8-1 】结构体变量的引用。

程序如下:struct student{ char number[10]; char name[10]; int age; char sex[3]; char address[20];};

Page 17: 项目 8   学生成绩单制作

任务 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);}

Page 18: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.3 结构体变量的引用【运行结果】

Page 19: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.4 结构体变量的初始化【例 8-2】对结构体变量初始化,并输出显示在屏幕上。【例 8-2】对结构体变量初始化,并输出显示在屏幕上。

程序如下:#include<stdio.h>struct student{ char number[10]; char name[10]; int age; char sex[3]; char address[20];

Page 20: 项目 8   学生成绩单制作

任务 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);}

Page 21: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.1 结构体类型与变量8.1.1.4 结构体变量的初始化【运行结果】

Page 22: 项目 8   学生成绩单制作

任务 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];

Page 23: 项目 8   学生成绩单制作

任务 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];

Page 24: 项目 8   学生成绩单制作

任务 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];

Page 25: 项目 8   学生成绩单制作

任务 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];

例如:

Page 26: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.2 结构体数组8.1.2.2 结构体数组初始化};struct student stud[4]={{ "20100001","肖飞 ",19," 男 ","广州 " } , { "20100002","李雪 ",18," 女 ","深圳 " } , { "20100003","郭键 ",20," 男 ","惠州 " } , { "20100004","董敏 ",18," 女 ","东莞 "}} ;

Page 27: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.2 结构体数组8.1.2.2 结构体数组初始化【例 8-3 】从键盘上输入 5 个学生的信息,统计男生与女生的人数。【例 8-3 】从键盘上输入 5 个学生的信息,统计男生与女生的人数。

程序如下:#include<stdio.h>#define SIZE 5struct student{ char number[10]; char name[10]; int age;

Page 28: 项目 8   学生成绩单制作

任务 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");

Page 29: 项目 8   学生成绩单制作

任务 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++) {

Page 30: 项目 8   学生成绩单制作

任务 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++;

Page 31: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.2 结构体数组8.1.2.2 结构体数组初始化 } else { fcount++; } } printf("男生的人数为:%d\n",mcount); printf("女生的人数为:%d\n",fcount);}

Page 32: 项目 8   学生成绩单制作

任务 8.1 用结构体数组进行学生信息的输入 / 输出

8.1.2 结构体数组8.1.2.2 结构体数组初始化【运行结果】

Page 33: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

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

Page 34: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

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

Page 35: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

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

Page 36: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

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

Page 37: 项目 8   学生成绩单制作

任务 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()

Page 38: 项目 8   学生成绩单制作

任务 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);

Page 39: 项目 8   学生成绩单制作

任务 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]);

Page 40: 项目 8   学生成绩单制作

任务 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; }} 

Page 41: 项目 8   学生成绩单制作

任务 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) {

Page 42: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index;}

Page 43: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index;}

Page 44: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下:(1) 指向结构体变量的指针。(2) 指向结构体数组的指针。(3) 结构体指针作为函数的参数。

Page 45: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.1 指向结构体变量的指针结构体指针变量的定义与其他类型的指针变量一样:结构体指针变量的定义与其他类型的指针变量一样:

结构体类型 * 变量名 ;

【例 8-4 】指向结构体变量的指针应用。【例 8-4 】指向结构体变量的指针应用。程序如下:#include<stdio.h>struct student{

char name[10];char sex [3];int age;

};

Page 46: 项目 8   学生成绩单制作

任务 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);}

Page 47: 项目 8   学生成绩单制作

任务 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->成员名 (->称为指向运算符 )

【运行结果分析】

Page 48: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.2 指向结构体数组的指针【例 8-5 】指向结构体数组的指针应用。【例 8-5 】指向结构体数组的指针应用。程序如下:#define SIZE 5struct student{ char name [10]; char sex [3]; int age;};void main(){

Page 49: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.2 指向结构体数组的指针【例 8-5 】指向结构体数组的指针应用。【例 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);

Page 50: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.2 指向结构体数组的指针【例 8-5 】指向结构体数组的指针应用。【例 8-5 】指向结构体数组的指针应用。程序如下: } printf("采用指向数组的指针进行输出 \n"); for(p=stud;p<stud+SIZE;p++) { printf("%s\t%s\t%d\n",p->name,p->sex,p->age); }}

Page 51: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.2 指向结构体数组的指针【运行结果】

Page 52: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.2 指向结构体数组的指针【运行结果分析】

p是指向 struct student 结构体类型数据的指针变量。在 for语句中先使 p指向数组的第一个元素的起始地址,也就是stud[0]的地址,即让 p=stud。在第一次循环中输出 stud[0]的各个成员值,然后 p++,使 p的值加 1 。 p的值加 1意味着 p所增加的值为结构体数组 stud的一个元素所占的字节数 (本例中一个元素在 VC++环境下所占的字节数为10+3+4=17)。执行 p++后, p的值等于 stud+1 , p指向stud[1],在第二次循环的时候输出 stud[1]的各成员值。直到 p的值变为 stud+5,结束循环。

Page 53: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数

(1) 用结构体变量的成员作为参数。

(2) 用结构体变量作为实参。

(3) 用指向结构体变量 ( 或数组 ) 的指针作实参,将结构体变量 ( 或数组 ) 的地址传给形参。

Page 54: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数【例 8-6 】有 3 个学生信息 ( 学号、姓名、三门课成绩 ) 结构体数组,要求输出总分最高的学生信息 ( 包括学号、姓名、三门课成绩和总分 ) 。

【例 8-6 】有 3 个学生信息 ( 学号、姓名、三门课成绩 ) 结构体数组,要求输出总分最高的学生信息 ( 包括学号、姓名、三门课成绩和总分 ) 。程序如下:#define SIZE 3struct student{ char number[10]; char name [10]; float score[SIZE]; float sum;};

Page 55: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数void Sum(struct student *p); /*求总分 */struct student Max(struct student *p); /*查找最高分 */void print(struct student stu); /*输出最高分 */void main(){ struct student stud[SIZE]; printf("请输入三个学生的信息:学号、姓名、三门课成绩:\n"); for(int i=0;i<SIZE;i++) { printf("请输入第%d个学生的信息: ",i+1); scanf("%s%s%f%f%f",&stud[i].number,&stud[i].name, &stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);

Page 56: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数 } printf("成绩最高的学生是: \n");print(Max(stud));}void print(struct student stu){ printf("%s\t%s\t%3.0f\t%3.0f\t%3.0f\t%3.0f\n",stu.number,stu.name, stu.score[0],stu.score[1],stu.score[2],stu.sum);}void Sum(struct student *p){

Page 57: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数 for(int i=0;i<SIZE;i++ , p++) { p->sum=p->score[0]+p->score[1]+p->score[2]; }}struct student Max(struct student * p){ Sum(p); /*求每个学生三门课总分 */ struct student * p1=p; /*p1 , p2都指向结构体数组的首地址 */ int max = p1->sum; /* 用 max存放学生的最高分,初始值为第一个学生的总分 */

Page 58: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数 int index=0; /* 用 index存放总分最高的学生在数组中的序号 */ for(int i=0;i<SIZE;i++,p1++) /*移动 p1指针 */ { if(max<p1->sum) { max=p1->sum; index=i; } } return *(p+index); /*返回 (p+index)所指向的结构体的值 */}

Page 59: 项目 8   学生成绩单制作

任务 8.2 输出平均分最高的学生信息

8.2.3 结构体指针作为函数的参数【运行结果】

Page 60: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务介绍任务 8.1 已经把学生相关信息输入到了结构体数组。现要求按总分从高到低输出的学生的相关信息。学生成绩信息为: 学号 姓名 性别 数学 英语 C 程序20100001 肖飞 男 86 56 7620100002 李雪 女 75 95 8320100003 郭键 男 91 89 6120100004 董明 男 87 69 9020100005 唐霞 女 93 88 79

Page 61: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务介绍要求输出格式为:学生成绩信息为: 学号 姓名 性别 数学 英语 C 程序 总分20100001 肖飞 男 86 56 76 28120100002 李雪 女 75 95 83 25320100003 郭键 男 91 89 61 24120100004 董明 男 87 69 90 24620100005 唐霞 女 93 88 79 260按总分由高排列为:20100005 唐霞 女 93 88 79 260

Page 62: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

解决思路方法:S1:学生信息输入到结构体数组中。S2:计算每个学生的总分,并把求得的总分赋值给结构体中sum成员变量。S3:按总分降序排序。S4:输出排好序的结构体数组。

Page 63: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>#define SIZE 5struct student{ char number[10]; char name [10]; char sex [3]; float score[3]; float sum;};void Sum(struct student *pStu); /*计算总分 */void Sort(struct student *pStu); /*按总分降序排序 */

Page 64: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:void print(struct student *pStu); /*学生信息输出 */void main(){ struct student stud[SIZE]={{"20100001","肖飞 "," 男 ",86,56,76}, {"20100002","李雪 "," 女 ",75,95,83}, {"20100003","郭键 "," 男 ",91,89,61}, {"20100004","董明 "," 男 ",87,69,90}, {"20100005","唐霞 "," 女 ",93,88,79}}; Sum(stud); /*求成绩总分 */ printf("学生成绩信息为: \n");

Page 65: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:printf("学号 \t\t姓名 \t性别 \t数学 \t英语 \tC程序 \t总分 \n"); print(stud); /*输出学生成绩单 */ printf("\n"); Sort(stud); /*按总分排序 */ printf("按总分由高排列为: \n"); print(stud); /*输出排序后的学生成绩单 */}void print(struct student *pStu){ int I;

Page 66: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:

for(i=0;i<SIZE;i++;pStu++) { printf("%s\t%s\t%s\t%3.0f\t%3.0f\t%3.0f\t%3.0f\n",pStu->number, pStu->name,pStu->sex,pStu->score[0],pStu->score[1],pStu->score[2], pStu->sum); }}void Sum(struct student *pStu) /*计算总分 */{

Page 67: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: int i; for(i=0;i<SIZE;i++,pStu++) { pStu->sum= pStu->score[0]+pStu->score[1]+pStu->score[2]; }}void Sort(struct student *pStu) /*按总分降序排序 */{ int i,j; struct student temp;

Page 68: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: for(i=0;i<SIZE-1;i++) { for(j=0;j<SIZE-1-i;j++) { if((*(pStu+j)).sum <(*(pStu+j+1)).sum) { temp=*(pStu+j); *(pStu+j)=*(pStu+j+1); *(pStu+j+1)=temp; } } }}

Page 69: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点为结构体数组排序。

Page 70: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。程序如下:#include<stdio.h>#define SIZE 5struct student{

char name[10];char sex [3];int age;

};void Sort(struct student * pStu); /*按姓名升序排序 */void print(struct student * pStu); /*学生信息输出 */void main(){

Page 71: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。程序如下: struct student stu[SIZE]={{"肖飞 "," 男 ",21},{"李雪 "," 女 ",19}, {"郭键 ", 男 ",20},{"董明 "," 男 ",22},{"唐霞 "," 女 ",23}}; printf("学生信息为: \n"); print(stu); Sort(stu); printf("按姓名进行排序后的信息为: \n"); print(stu);}void print(struct student *pStu){ int I;

Page 72: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。程序如下: for(i=0;i<SIZE;i++,pStu++) { printf("%s\t%s\t%d\n",pStu->name,pStu->sex,pStu->age); }}void Sort(struct student stu[]) /*按姓名升序排序 */{ int i,j; struct student temp; for(i=0;i<SIZE-1;i++) {

Page 73: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。【例 8-7 】用选择排序算法对结构体数组按姓名升序进行排序。程序如下: for(j=i+1;j<SIZE;j++) { if(strcmp(stu[i].name,stu[j].name)>0) { temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } } }}

Page 74: 项目 8   学生成绩单制作

任务 8.3 按总分从高到低排序并输出

【运行结果】

【运行结果分析】

“程序中语句 stu[i]=stu[j];”相当于下面三条语句:strcpy(stu[i].name,stu[j].name);strcpy(stu[i].sex,stu[j].sex);stu[i].age=stu[j].age;

Page 75: 项目 8   学生成绩单制作