C语言课程设计实践报告_c语言课程设计报告书
C语言课程设计实践报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言课程设计报告书”。
北京理工大学珠海学院 C语言程序设计实践报告
2014—2015学年第1学期
学 院: 计算机学院 专业班级: 软件工程5班 学 号: ***6 学生姓名: 陈洪阳 指导教师: 戴俊雅
成 绩:
时 间:
2015年 1月5日
实践1.猜数游戏 题目概述:
编程先由计算机“想”一个1~100 之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10 次,如果猜了10 次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。
程序设计概要与分析:
在源程序的开头中包含stdlib和time库函数,这样我们就可以调用srand()和rand()函数,其中调用srand()提供一个种子,它是一个unsigned int类型,取值范围是0~65535,然后调用rand(),根据提供给srand()的种子值返回一个随机数,我们用rand()%100就把随机决定的数值范围确定在1~100之间,然后定义一个num,记录这个随机产生的随机数,定义input,来储存用户输入的猜数值,用times来记录猜的次数,用do while循环来执行用户猜的次数有10次,用if else条件语句来判断用户是否猜中,或猜得太大、太小,用一个while循环来做总嵌套,设置n的值一开始不为零,while循环的条件是当n的值不等于0,最后用户就可以修改n的值来决定是否退出。
程序代码:
#include #include #include
int main(){
int n=1;while(n!=0){
srand((unsigned)time(NULL));int num,input;int times=0;num=(rand()%100)+1;printf(“在1~100间猜一个数n”);scanf(“%d”,&input);do{
if(input==num){
} else if(input>num){
} else if(input
}
}
} printf(“你猜的数太小了,请再猜一个n”);scanf(“%d”,&input);times++;}while(times=9)printf(“你已经猜了10次都猜不中,你输了n”);printf(“继续下一轮新的猜数请按1,退出请按0n”);scanf(“%d”,&n);return 0;运行结果示例:
选择继续下一轮新的猜数,猜了10次都没猜中
心得体会:
要懂得如何生成一个随机数,并且要确定它的范围在1~100之间,同时我们还要用do while循环体把猜数的次数控制在10次,每当我们输入猜想的数时就要做出判断,看看是否猜中,或者猜得太大或太小,输出提示信息。也懂得了通过修改while判断循环里面的条件,使得循环体里面的程序受我们修改的条件控制,可以继续循环执行或者不再继续执行。
实践2.成绩排名次 题目概述:
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30 人参加考 试,学号可以用输入的序号代替。考试后要求:(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
程序设计与概要:
定义存储学生信息的结构体,包括学生编号,姓名,各科成绩,总分,平均分还有名次。该结构体命名为student,然后定义结构体数组student s[],首先输入准备录入学生信息的人数,用amount来记录人数,用一个for循环,从0~amount-1,依次输入每个学生的各种信息,如学号,姓名,数学、英语和物理成绩。用grade[]数组来存这三科的成绩,如grade[0]存储数学成绩,grade[1]存储英语成绩。输入之后,再用一个for循环把每个同学的总分求出来,总分再除去3求出该名同学的平均分。按总分成绩由高到低排出名次,用两个for循环嵌套,第一个循环从0~amount,表示从第一个同学开始拿出来比较,第二个循环从1~amount,表示除了之前取出的同学以外的每一个同学,如果前一位同学的总分小于后一个同学的话,就交换两人的信息,第二个循环比较之后,便会把总分最高的同学的信息储存在第一个,然后我们设置排名rank的值为1,rank++,进行筛选第二名的,之后对应地把rank的值设给学生的总分排名
打印学生信息,输出表格的基本框架后,用一个for循环,依次输出每个学生的信息,最后还有根据学号查询学生信息,用户输入要查询的学生学号,在for循环里面依次比较,如果找到学号与用户输入相同的,便输出该名学生的信息。
程序代码:
#include #include #include #define M 30 struct student { unsigned int num;char name[10];int grade[3];int sum;float ave;int rank;};student s[M];int amount;
void input(student s[]);void title();
void list(student s[]);int main(){ input(s);int i=0;for(i=0;i
//要求1 计算总分 平均分
s[i].sum=s[i].grade[0]+s[i].grade[1]+s[i].grade[2];
s[i].ave=(float)s[i].sum/3;} //要求2 按总成绩排序
int rank=1;student t;for(i=0;i
for(int j=i+1;j
{
if(s[i].sum
{
{t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
s[i].rank=rank;
rank++;} //要求3 打印名次表
title();list(s);//要求4 查询
int number;printf(“请输入你要查询学生的学号:n”);scanf(“%d”,&number);for(int i=0;i
if(number==s[i].num)
{
printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);
printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);
} } system(“pause”);return 0;}
void input(student s[]){ printf(“输入班上参加期末考试的人数(不大于30人)”);scanf(“%d”,&amount);printf(“请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩n”);for(int i=0;i
printf(“第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩n”,i+1);
scanf(“%u%s%d%d%d”,&s[i].num,s[i].name,&s[i].grade[0],&s[i].grade[1],&s[i].grade[2]);} }
void title(){
printf(“ 学生成绩表n”);
printf(“-----------------------------n”);
printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);
printf(“-----------------------------n”);}
void list(student s[]){ //n表示人数
int i;//rank=1;for(i=0;i
printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);
printf(“-----------------------------n”);} }
运行结果示例:
确定录入人数之后,依次输入每个学生的信息
打印出名次表:
输入学生的学号,查询学生信息:
心得体会:
懂得了用结构体将不同的数据类型结合在一起,然后定义结构体数组,使得每个数组中的成员都具有不同的数据类型变量。而且同属于一个数据类型,也可以定义数组来表示相同的类型但是有多个不同值,比如成绩这个变量。也懂得了用for循环语句求总分,用for循环语句将数组从头到尾输出。
实践3.单科成绩统计 题目概述:
学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过 30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实
现下列功能:(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)以直方图方式统计各分数段的学生人数及所占的百分比。形式如下: 分段 人数 图形 =90 4(…)****
程序设计与概要:
定义一个结构体stu,里面有学生的姓名和成绩,然后定义一个s[]数组存放每个学生的姓名和成绩,输入函数中用一个for循环来依次输入每个学生的姓名,还有输入成绩,用if条件语句判断输入的成绩是否为负数,如果是就退出整个输入函数,同时,我们还用if条件语句来判断输入的成绩处于哪个分数阶段,定义n1、n2、等整形变量来存储各个分数段的总人数,变量num来存放输入的学生共有多少人,变量sum是将每个学生的成绩都加在一起,最后用sum/num就等于全班该门成绩的平均分,我们用一个for循环语句,判断每个学生的成绩是否小于60分,如果是就输出他的姓名,这样就可以打印出不及格学生的名单了。同样的,用一个for循环语句,判断每个学生的成绩是否大于等于平均分,如果是就变量count+1,用来记录成绩大于或等于平均分的学生人数,同时可将成绩大于平均分的同学姓名输出,这样就打印出了成绩在大于等于平均分的学生名单了。最后是输出分数段,用前面记录各个分数段人数的n值除以总人数再乘以100%就得出比例,每一个分数段都用一句for循环语句,根据n值的大小输入对应数目的*。
程序代码:
#include #include #define M 30 struct stu { char name[20];int score;};stu s[M];int i=0,num=0;int n1=0,n2=0,n3=0,n4=0,n5=0;float sum=0,ave=0;int count=0;void input(stu s[]);void getnotpa(stu s[]);
void getavg(stu s[]);void percent(stu s[]);int main(){ /*stu s[M];int i=0,num=0;int n1=0,n2=0,n3=0,n4=0,n5=0;float sum=0,ave=0;*/ input(s);getnotpa(s);getavg(s);percent(s);return 0;} void input(stu s[]){ for(i=0;i
printf(“请输入第%d个学生的姓名和成绩n”,i+1);
scanf(“%s%d”,&s[i].name,&s[i].score);
if(s[i].score
break;
if(s[i].score>=0&&s[i].score
n1++;
if(s[i].score>=60&&s[i].score
n2++;
if(s[i].score>=70&&s[i].score
n3++;
if(s[i].score>=80&&s[i].score
n4++;
if(s[i].score>90)
n5++;
num++;
sum+=s[i].score;} printf(“学生信息录入完毕nnn”);} void getnotpa(stu s[]){ printf(“不及格人数为:%dn”,n1);printf(“不及格人员名单如下:n”);for(i=0;i
if(s[i].score>=0&&s[i].score
printf(“%st”,s[i].name);} printf(“n”);ave=sum/num;} void getavg(stu s[]){ for(i=0;i
if(s[i].score>=ave)count++;} printf(“成绩在全班平均分及平均分之上的学生人数为:%dn”,count);printf(“成绩在全班平均分及平均分之上的学生名单如下:n”);for(i=0;i
if(s[i].score>=ave)
printf(“%st”,s[i].name);} printf(“nnn”);} void percent(stu s[]){ printf(“各分数段的学生人数及所占的百分比如下:n”);printf(“分段t 人数t 图形n”);printf(“=90t%d(%.0f%%)t ”,n5,(float)n5/(float)num*100);for(i=0;i
运行结果示例:
依次输入每个学生的姓名和成绩,当输入成绩为负时,便退出整个输入:
统计不及格人数还有打印不及格学生名单:
统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单:
以直方图方式统计各分数段的学生人数及所占的百分比:
心得体会:
懂得了在for循环体内用if条件判断语句判断输入的值为负值时退出循环体。用变量计数器把符合要求的计数起来,最后可以得出符合要求的值共有多少个,也懂得了用for循环从所有值里进行筛选符合条件的值出来,更懂得了在求百分比时候要强制类型转换,把int类型的计算结果给转换为float单精度类型。
实践4.函数与文件训练 题目概述:
将实践练习2 中的第2题利用函数的思想进行修改,并将学生的成绩等信息输出到文件中。要求函数参数中
包含结构体数组或指针。输出到ASCII 文件的信息包括每个学生的学号、三门成绩和名次,每人一行。
程序设计与概要:由于我的实践2中就已经用了函数,所以我只需要把学生的成绩等信息输出到文件中。用FILE *fp,fp就代表我们要对其操作的文件,用open函数,根据文件的所在位置还有文件名,打开文件,并对应要求进行只写的操作,如源代码中fp=fopen(“f: st udent.txt”,“w”),w代表写入操作,char一个c[]数组,存放对应项的名称,用fputs函数把数组里面的字符串写入到文件里面去,用一个for循环,循环调用fprintf函数,把每个学生的学号,各科成绩和排名都写入到文件当中去,最后关闭文件即可。
程序代码:
#include #include #include #define M 30 struct student { unsigned int num;char name[10];int grade[3];int sum;float ave;int rank;};student s[M];int amount;
void input(student s[]);void title();void list(student s[]);int save();//输出到文件中 int main(){ input(s);int i=0;for(i=0;i
//要求1 计算总分 平均分
s[i].sum=s[i].grade[0]+s[i].grade[1]+s[i].grade[2];
s[i].ave=(float)s[i].sum/3;}
//要求2 按总成绩排序
int rank=1;student t;for(i=0;i
for(int j=i+1;j
{
if(s[i].sum
{
{t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
s[i].rank=rank;
rank++;} save();//要求3 打印名次表
title();list(s);//要求4 查询
int number;printf(“请输入你要查询学生的学号:n”);scanf(“%d”,&number);for(int i=0;i
if(number==s[i].num)
{
printf(“学号t姓名t数学t英语tC语言t总分t平均分t排名n”);
printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);
} } system(“pause”);return 0;} void input(student s[]){ printf(“输入班上参加期末考试的人数(不大于30人)”);scanf(“%d”,&amount);printf(“请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩n”);
for(int i=0;i
printf(“第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩n”,i+1);
scanf(“%u%s%d%d%d”,&s[i].num,s[i].name,&s[i].grade[0],&s[i].grade[1],&s[i].grade[2]);} } int save(){
FILE *fp;fp=fopen(“f:student.txt”,“w”);if(!fp){
printf(“can not open file!n”);
exit(1);} char c[]=“学号t 数学t 物理t 英语t 排名n”;fputs(c,fp);for(int i=0;i
fprintf(fp,“%ut %dt %dt %dt %dn”,s[i].num,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].rank);} fclose(fp);} void title(){
printf(“ 学生成绩表n”);
printf(“-----------------------------n”);
printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);
printf(“-----------------------------n”);}
void list(student s[]){ int i;for(i=0;i
printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);
printf(“-----------------------------n”);} }
运行结果示例:
首先输入准备录入的学生人数,然后依次输入每个学生的信息:
打印出按总成绩排序后的学生信息表,以及根据学号查询:
在f盘中找到文件并打开:
心得体会:
懂得了用如何运用文件,把向程序中输入的数据全部输出到文件中去。用FILE *fp,fp就代表我们要对其操作的文件,用open函数,根据文件的所在位置还有文件名,打开文件,并对应要求进行只写的操作,如源代码中fp=fopen(“f: st udent.txt”,“w”),w代表写入操作,char一个c[]数组,存放对应项的名称,用fputs函数把数组里面的字符串写入到文件里面去,用一个for循环,循环调用fprintf函数,把每个学生的学号,各科成绩和排名都写入到文件当中去,最后关闭文件即可。
实践5.实践4(1)(2)题目概述:
每位学生信息包括:学号、姓名、性别、学院、10 门成绩。共有不超过100 位同学的信息存放在ASCII 文件StudentInfo.txt 中;不超过10 个学院的信息存放在CodeInfo.txt 中,性别代码存放在SexInfo.txt 中,均为代码和其对应的名称。要求:
1.定义至少包含以上学生信息和学院代码的结构体类型和指针(或数组)变量。2.函数实现从文件中输入信息到定义的数据中。
程序设计与概要:
定义一个结构体,名为student,里面的内容有学生的学号,姓名,性别,还有那个学院,以及10门成绩,构造结构体数组,student stu[100],用于存储100名学生的信息。定义读取文件中内容的函数,FILE *fp代表文件,调用fopen函数,通过文件所在位置以及文件名打开特定的文件,r表示只对文件进行读取,接着调用fscanf函数,把第一个位置的数据赋给学生的学号,用while循环体,循环的条件是调用feof判断文件是否读取结束,如果没有则返回0,用!feof()来让没读取结束的文件继续读取,接着再把同一行后面的数据分别赋给学生的姓名,性别代码和所属学院代码,再用一个for循环,把同一行后面10个数据分别赋给学生的10门成绩。一行读取完毕后,意味着已经读取完一个学生的所有个人信息,定义一个I值来存储已经读取学生的人数,每读完一人就i+1,再读取下一行的第一个数据赋给下一个学生作为他的学号。通过while循环把文件中的全部信息读取出来赋给所有学生,函数最后返回的是读取学生的人数i。定义结构体名为sxy,用于存储性别代码和代码对应的性别,可以在后面输出的时候,把对应的性别代码转变为用中文表示性别。定义一个结构体名为scode,用于存储学院代码和代码对应的学院名称,可以在最后输出的时候,把学院代码对应的学院名称输出。再定义一个输出函数,通过for循环,从0~i-1,把i个学生的全部信息输出,所以我们在主函数里面先调用读取文件中内容的函数之后再调用输出函数即可。
程序代码:
#include #include #include int readData(char *filename,struct student *stu);int readDataxy(char *filename,struct sxy *s1);int readDataco(char *filename,struct scode *s2);void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k);struct student { int id;char name[10];int sexno;char sex[4];int deptno;char dept[20];int scores[10];float ave;
};struct sxy { int id;char sex[4];};struct scode { int id;char dept[20];};int main(){ struct student stu[100];struct sxy s1[2];struct scode s2[10];int n,m,k;n=readData(“f:StudentInfo.txt”,stu);m=readDataxy(“f:SexInfo.txt”,s1);k=readDataco(“f:CodeInfo.txt”,s2);if(n==-1||n==0)
return 0;if(m==-1||m==0)
return 0;if(k==-1||k==0)
return 0;printStudent(stu,s1,s2,n,m,k);
system(“pause”);return 0;} int readData(char *filename,struct student *stu){ FILE *fp;int i=0,j;fp=fopen(filename,“r”);if(!fp){
printf(“error1”);
return-1;} fscanf(fp,“%d”,&stu[i].id);while(!feof(fp))//feof返回0 表示文件还没结束 返回1表示结束
{
fscanf(fp,“%s%d%d”,stu[i].name,&stu[i].sexno,&stu[i].deptno);
for(j=0;j
fscanf(fp,“%d”,&stu[i].scores[j]);
++i;
fscanf(fp,“%d”,&stu[i].id);} return i;} int readDataxy(char *filename,struct sxy *s1){ FILE *fp;int i=0;fp=fopen(filename,“r”);if(!fp){
printf(“error2”);
return-1;} fscanf(fp,“%d”,&s1[i].id);while(!feof(fp)){
fscanf(fp,“%s”,s1[i].sex);
++i;
fscanf(fp,“%d”,&s1[i].id);} return i;} int readDataco(char *filename,struct scode *s2){ FILE *fp;int i=0;fp=fopen(filename,“r”);if(!fp){
printf(“error3”);
return-1;} fscanf(fp,“%d”,&s2[i].id);while(!feof(fp)){
fscanf(fp,“%s”,s2[i].dept);
++i;
fscanf(fp,“%d”,&s2[i].id);}
return i;} void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k){ int i,j;printf(“ 学生信息统计n”);for(i=0;i
for(j=0;j
{
if(stu[i].sexno==s1[j].id)
{
strcpy(stu[i].sex,s1[j].sex);
}
} } for(i=0;i
for(j=0;j
{
if(stu[i].deptno==s2[j].id)
{
strcpy(stu[i].dept,s2[j].dept);
}
} } for(i=0;i
printf(“%d%8s%4s%12s”,stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);
for(j=0;j
printf(“%4d”,stu[i].scores[j]);
printf(“n”);} }
运行结果示例:
心得体会:
懂得了从文件中输入信息到定义的数据中。就是要先构造与文件信息中相对应的结构体数组,然后用打开文件,需要知道文件的具体位置还有文件名,”r”就是表示只采取读取操作,用while循环,循环条件的判断标准就是用feof来判断文件是否读取到文件尾部,用fscanf把每个数据赋给对应的变量。其中最难解决的就是一开始学生文件里面的信息,学生性别用代号表示,学生所在学院也用代码显示,这样一来我们把文件中的信息赋给定义好的结构体
数组之后,用for循环把结构体数组一个一个输出后,显示的是性别代码和学院代码,我们要把代码都改为相对应的值,所以我们同样定义性别的结构体数组,学院的结构体数据,之后用for循环把性别数组里面的代号和学生数组中的性别代码想比较,用strcpy函数,相同的就把代码对应的性别赋给学生数组里面定义好的性别字符数组。同理的,学院代码相对同的就把代码对应的学院名称赋给学生数组里面定义好的学院字符数组。
实践6.实践4(3)(4)(5)题目概述:
每位学生信息包括:学号、姓名、性别、学院、10 门成绩。共有不超过100 位同学的信息存放在ASCII 文件StudentInfo.txt 中;不超过10 个学院的信息存放在CodeInfo.txt 中,性别代码存放在SexInfo.txt 中,均为代码和其对应的名称。要求:
3.函数实现排序(1):学生平均成绩的降序排序,并输出所有信息到显示屏。4.函数实现排序(2):学生姓名的升序排序,并输出所有信息到显示器。
5.函数实现查询(1):根据学号查询学生信息,并输出该生信息,并输出所有信息到显示器。
程序设计与概要:
同上个实践一样构造结构体名为student,用来存储学生的信息,如学生姓名,性别代号,学号,学院代号和成绩等。构造结构体名为sxy用来存储性别代号和性别名称,构造结构体名为scode用来存储学院代号和学院名称。用三个不同的函数来实现读取三个不同文件中的内容,把文件里面的内容放到以上构造的三个结构体里面去,定义输出函数,用for循环把每个学生的性别代号同sxy结构体数组中的代号对应,把代号对应的性别名称赋给每个学生的性别sex属性值中,把每个学生的学院代号同scode结构体数组中的代号对应,把代号对应的学院名称赋给每个学生的学院sdept属性值中,最后再用一个for循环把从第一个学生到最后一个学生的全部信息输出。实现要求3中的根据学生平均成绩的降序排序,要求在从文件中读取成绩之后要计算出总分然后再除以10门成绩得出平均分,然后定义一个函数,用双重for循环,把第一个学生同其他学生比较平均分,如果比下一个同学的平均分低就交换两个的位置,否则就继续与下一个同学比较,直到第一层的for循环结束退出为止。再用for循环把排序后的学生信息从第一位到最后一位输出即可。实现要求4中的根据学生姓名的升序排序,要求也是用双重for循环,用函数strcmp比较两个学生的姓名,把第一个学生的姓名同下一个同学比较,如何比下一个同学大,就交两个学生的位置,否则就继续与下一个同学比较,直到第二层的for循环结束,意味一个同学的位置确定,继续第一层for循环的下一个同学,直到第一个层的for循环结束,就意味所有同学比较完毕,再用for循环语句把从第一个位置的同学到最后一个位置的同学,把他们的信息输出。实现要求5的查询要求,需要我们从键盘上输入要查询的学生的学号,然后用for循环从我们的学生结构体数组中遍历一遍,如果有找到学号同输入的学号相同的学生,便把他的所有信息输出,否则则输出不存在该名学生。
程序代码:
#include #include #include int readData(char *filename,struct student *stu);int readDataxy(char *filename,struct sxy *s1);int readDataco(char *filename,struct scode *s2);void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k);void search(struct student *stu,int n);void sortbyname(struct student *stu,int n);void sortbyave(struct student *stu,int n);struct student
{ int id;char name[10];int sexno;char sex[4];int deptno;char dept[20];int scores[10];double ave;};struct sxy { int id;char sex[4];};struct scode { int id;char dept[20];};int main(){ struct student stu[100];struct sxy s1[2];struct scode s2[10];int n,m,k,b;while(1){
system(“cls”);
printf(“1.显示学生信息n”);
printf(“2.姓名升序排序n”);
printf(“3.平均成绩降序n”);
printf(“4.学号查询学生信息n”);
printf(“0.退出n”);
printf(“n输入需要查询的序号:”);
scanf_s(“%d”,&b);
switch(b)
{
case 1:
n=readData(“f:StudentInfo.txt”,stu);
m=readDataxy(“f:SexInfo.txt”,s1);
k=readDataco(“f:CodeInfo.txt”,s2);
if(n==-1||n==0)
return 0;
if(m==-1||m==0)
return 0;
if(k==-1||k==0)
return 0;
printStudent(stu,s1,s2,n,m,k);
break;
case 2:
sortbyname(stu,n);
break;
case 3:
printf(“按平均成绩降序排序如下:”);
sortbyave(stu,n);
printStudent(stu,s1,s2,n,m,k);
break;
case 4:
search(stu,n);
break;
case 0:
return 0;
} system(“pause”);} system(“pause”);return 0;} int readData(char *filename,struct student *stu){ FILE *fp;int i=0,j;double sum;fp=fopen(filename,“r”);if(!fp){
printf(“error”);
return-1;} fscanf(fp,“%d”,&stu[i].id);while(!feof(fp))//feof返回0 表示文件还没结束 返回1表示结束
{
fscanf(fp,“%s%d%d”,stu[i].name,&stu[i].sexno,&stu[i].deptno);
for(j=0;j
{
fscanf(fp,“%d”,&stu[i].scores[j]);
sum=stu[i].scores[j];
}
stu[i].ave=sum/10;
++i;
fscanf(fp,“%d”,&stu[i].id);} return i;} int readDataxy(char *filename,struct sxy *s1){ FILE *fp;int i=0;fp=fopen(filename,“r”);if(!fp){
printf(“error2”);
return-1;} fscanf(fp,“%d”,&s1[i].id);while(!feof(fp)){
fscanf(fp,“%s”,s1[i].sex);
++i;
fscanf(fp,“%d”,&s1[i].id);} return i;} int readDataco(char *filename,struct scode *s2){ FILE *fp;int i=0;fp=fopen(filename,“r”);if(!fp){
printf(“error3”);
return-1;} fscanf(fp,“%d”,&s2[i].id);while(!feof(fp)){
fscanf(fp,“%s”,s2[i].dept);
++i;
fscanf(fp,“%d”,&s2[i].id);} return i;
} void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k){ int i,j;printf(“ 学生信息统计n”);for(i=0;i
for(j=0;j
{
if(stu[i].sexno==s1[j].id)
{
strcpy(stu[i].sex,s1[j].sex);
}
} } for(i=0;i
for(j=0;j
{
if(stu[i].deptno==s2[j].id)
{
strcpy(stu[i].dept,s2[j].dept);
}
} } for(i=0;i
printf(“%d%8s%4s%12s”,stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);
for(j=0;j
printf(“%4d”,stu[i].scores[j]);
printf(“n”);} } void search(struct student *stu,int n){ int m,col=0;printf(“请输入你要查询学生的学号:n”);scanf(“%d”,&m);for(int i=0;i
if(stu[i].id==m)
{
col=1;
printf(“%d%8s%4s%12s”,stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);
for(int j=0;j
{
printf(“%4d”,stu[i].scores[j]);
}
} } if(col==0)printf(“不存在该名学生信息n”);} void sortbyname(struct student *stu,int n){ student temp;for(int i=0;i
for(int j=0;j
{
if(strcmp(stu[i].name,stu[j].name)>0)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
} } printf(“按姓名的升序排序如下!n”);for(int i=0;i
printf(“%8d%8s%4s%12s”,stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);
for(int j=0;j
{
printf(“%4d”,stu[i].scores[j]);
}
printf(“n”);} } void sortbyave(struct student *stu,int n){ int i,j,flag;student s;for(j=0;j
flag=0;
for(i=0;i
{
if(stu[i].ave
{
s=stu[i];
stu[i]=stu[i+1];
stu[i+1]=s;
flag=1;
}
}
if(flag==0)break;} }
运行结果示例: 开始的菜单界面:
输入1便会显示文件中所有学生的信息:
输入2便会实现学生姓名升序排序,且把排序后的学生所有信息输出:
输入3便会实现学生平均成绩降序排序,且把排序后的学生所有信息输出:
输入4便会实现根据学号查询学生信息:
心得体会:
懂得了运用双重for循环比较全体成员,如题目中所要求的姓名升序排序还有平均成绩降序,比较平均成绩可以用值的大小进行比较,但是比较姓名的大小就要用strcmp函数进行比较,如果有需要交换位置的,就定义一个同类型的中间值,作为交换的协助者,帮助完成两个值的交换,完成整个过程之后,把交换完成后的全体成员从头到尾用for循环输出即可。
参考文献:
[1] 张克军:《程序设计基础》,科学出版社。