对结构体的练习
1.有三个学生,每个学生的数据包括,学号、姓名和三科成绩,从键盘输入这三个学生的数据,要求输入每门课的总平均成绩及最高分学生的数据(包括学号、姓名)。(题与课本上有差别,懒得做全了,太繁琐)
#include<stdio.h> #include<stdlib.h> #include<string.h> struct student { int num; char name[9]; int score[3]; }; int main() { struct student Stu[3]; int i=0,j=0; char temp[9]; int max[3],n=0,m=0; double average[3]; for(i=0;i<3;i++) { printf("请输入%d个学生的学号:\n",i+1); scanf("%d",&Stu[i].num); printf("请输入%d个学生的姓名:\n",i+1); fflush(stdin); gets(temp); strcpy(Stu[i].name,temp); for(j=0;j<3;j++) { printf("请输入%d个学生的第%d科成绩:\n",i+1,j+1); scanf("%d",&Stu[i].score[j]); } } for(i=0;i<3;i++) { n=0; for(j=0;j<3;j++) { n+=Stu[j].score[i]; } average[i]=n/3.0; } for(i=0;i<3;i++) { printf("第%d课的平均成绩为%lf。\n",i+1,average[i]); } for(i=0;i<3;i++) { m=0; for(j=0;j<3;j++) { if(Stu[j].score[i]>Stu[m].score[i]) { m=j; } } max[i]=m; } for(i=0;i<3;i++) { printf("第%d课成绩,最高分为%d:\n",i+1,Stu[i].score[max[i]]); printf("学生的学号是%d\n",Stu[i].num ); printf("学生姓名是:%s\n",Stu[i].name ); } return 0; }
2.对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的姓名,要求最后输出各人得票结果。
#include<stdio.h> #include<string.h> #include<stdlib.h> struct num { char name[9]; int n; } ; int main() { struct num cd[3]; char a[9],b[]={"0"}; int i=0; for(i=0;i<3;i++) { printf("请输入第%d个候选人的名字:",i+1); gets(a); strcpy(cd[i].name ,a); } while(1) { printf("请输入你要投候选人的姓名,输入0结束:\n"); gets(a); if(strcmp(a,b)==0) { break; } for(i=0;i<3;i++) { if(strcmp(a,cd[i].name)==0) { cd[i].n++; break; } } } for(i=0;i<3;i++) { printf("第%d名候选人的票数是%d\n",i+1,cd[i].n); } return 0; }
总结:不能对结构体整体进行==或!=的判断,对结构体可以进行整体赋值,但两个结构体必须类型相同。
结构体只声明时,不分配内存。
对结构体,以多种类型从键盘输入时,容易出先问题,最好采用:1.转换函数。2.接触简单变量,间接赋值。