750 likes | 853 Views
项目 8 学生成绩单制作. 项目 8 学生成绩单制作. 【 学习目标 】. (1) 掌握结构体的定义与引用。 (2) 掌握结构体数组的定义以及应用。 (3) 掌握指向结构体类型数据的指针变量的定义以及应用 。. 任务 8.1 用结构体数组进行学生信息的输入 / 输出. 任务介绍. 一个班 45 名学生参加了高等数学、大学英语、 C 程序设计三门课程的考试。现要求输入全班同学成绩单信息 ( 姓名、学号、三门课程成绩 ) ,并输出。为了程序运行的方便,只选择了前三同学。 前三位学生信息如下: 20100001 李阳 男 89 56 76
E N D
项目8 学生成绩单制作 【学习目标】 • (1) 掌握结构体的定义与引用。 • (2) 掌握结构体数组的定义以及应用。 • (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
任务8.1 用结构体数组进行学生信息的输入/输出 解决思路 方法1: S1:把学生信息输入到多个数组中。 S2:输出每个数组中的数据。 通过方法1的描述,可以发现此方法不仅复杂,而且把与学生有关的整体信息分割到各个数组中,对数据的组织,引用非常不方便。要是能将不同的类型的数据组合成一个有机的整体,将会对数据的引用带来极大的方便。
任务8.1 用结构体数组进行学生信息的输入/输出 解决思路 由上述的分析可知,采用方式1实现本任务是不科学的。现介绍一种新的方法,采用结构体将学生相关信息(学号、姓名、性别、三门课程成绩)组合成一个有机整体,每个学生是一个结构体,多个学生组成一个结构体数组。 方法2: S1:把学生信息输入到结构体数组。 S2:输出结构体数组中的所有数据。
任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<stdio.h> #define SIZE 3 struct student { char number[10]; char name [10]; char sex [3]; float score[SIZE]; float avg; };
任务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.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]); } }
任务8.1 用结构体数组进行学生信息的输入/输出 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 结构体类型与变量。 (2) 结构体变量的引用。 (3) 结构体变量的初始化。 (4) 结构体数组。
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.1 结构体类型 (1) 语法。 struct 结构体名 {成员表列}; 成员表列中各成员也都要进行类型声明: 类型名 成员名 struct student { char name[10]; int age; float score; }; 例如:
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.1 结构体类型 (2) 语义。 定义一个名为student的结构体。struct是一个关键字,它向编译系统声明这是一个“结构体类型”,而struct student 是一个类型名,它和系统提供的标准类型(如int,float,char等)具有相同的地位与作用。定义的这个结构体包含了3个成员变量:一个字符数组成员变量、一个整型成员变量和一个实型成员变量。
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.2 结构体变量 (1) 先声明结构体类型再定义变量名。 struct studentstud1,stud2; 结构体类型名 结构体变量名 (2) 在声明类型的同时定义变量。 struct 结构体名 { 成员表列; }变量名表列;
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.2 结构体变量 (3) 直接定义结构体类型变量。 一般形式如下: struct { 成员表列; }变量名表列;
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 结构体变量名.成员名 例如: stud1.score 表示stud1变量中的score成员。可以对变量的成员变量赋值,例如: stud1.score=95.0f;
任务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);
任务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]; };
任务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); }
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.3 结构体变量的引用 【运行结果】
任务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];
任务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); }
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.1 结构体类型与变量 8.1.1.4 结构体变量的初始化 【运行结果】
任务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];
任务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];
任务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];
任务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];
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 }; struct student stud[4]={{"20100001","肖飞",19,"男","广州"}, {"20100002","李雪",18,"女","深圳"}, {"20100003","郭键",20,"男","惠州"}, {"20100004","董敏",18,"女","东莞"}};
任务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;
任务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");
任务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++) {
任务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++;
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 } else { fcount++; } } printf("男生的人数为:%d\n",mcount); printf("女生的人数为:%d\n",fcount); }
任务8.1 用结构体数组进行学生信息的输入/输出 8.1.2 结构体数组 8.1.2.2 结构体数组初始化 【运行结果】
任务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
任务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
任务8.2 输出平均分最高的学生信息 解决思路 方法: S1:学生信息输入到结构体数组中。 S2:计算每个学生的总分与平均分,并把求得的平均分赋值给结构体中avg成员变量。 S3:查找最高平均分学生在结构体数组中的下标。 S4:根据数组下标输出学生信息。
任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<stdio.h> #define SIZE 5 struct student { char number[10]; char name [10]; char sex [3]; float score[3]; float avg; };
任务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()
任务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);
任务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]);
任务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; } }
任务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) {
任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index; }
任务8.2 输出平均分最高的学生信息 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: max=pStu->avg; index=i; } } return index; }
任务8.2 输出平均分最高的学生信息 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下: (1) 指向结构体变量的指针。 (2) 指向结构体数组的指针。 (3) 结构体指针作为函数的参数。
任务8.2 输出平均分最高的学生信息 8.2.1 指向结构体变量的指针 结构体指针变量的定义与其他类型的指针变量一样: 结构体类型 * 变量名; 【例8-4】指向结构体变量的指针应用。 程序如下: #include<stdio.h> struct student { char name[10]; char sex [3]; int age; };
任务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); }
任务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->成员名(->称为指向运算符)
任务8.2 输出平均分最高的学生信息 8.2.2 指向结构体数组的指针 【例8-5】指向结构体数组的指针应用。 程序如下: #define SIZE 5 struct student { char name [10]; char sex [3]; int age; }; void main() {
任务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);
任务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); } }