功能描述:
1、录入成绩
2、显示不及格学生信息
3、统计每档学生数量
4、总成绩统计
代码:
#include<stdio.h>#define N 30//结构体:typedef struct STUDENT{char id[10];//学号char name[20];//姓名float score[3];//三门成绩,分别代表:数学 英语 计算机float sum;//用于计算总分} Stu;Stu stu[N];//创建一个30个数量的结构体//打印学生信息函数void printStuInfo(Stu st)//打印学生信息数据{printf("学号:%s\t姓名:%s\t数学:%3.2f\t英语:%3.2f\t计算机:%3.2f\t总分:%3.2f\n",//学号 //姓名 //数学成绩st.id, st.name, st.score[0],//英语成绩 //计算机成绩 //总分st.score[1], st.score[2], st.sum);}//读取文本信息函数void readStuList(){int i = 0;int k;float sum;FILE *fp = fopen("score.txt", "r");//以读的方式打开文件if(fp == NULL){return; /*若打不开则返回*/}while(!feof(fp))//逐条读取文件信息{fscanf(fp, "%s\t%s\t%f\t%f\t%f\n",//学号 //姓名 //数学成绩&stu[i].id, &stu[i].name, &stu[i].score[0],//英语成绩 //计算机成绩&stu[i].score[1], &stu[i].score[2]);//计算总分sum = 0;for(k=0; k<3; k++){sum += stu[i].score[k];}//存入总分stu[i].sum = sum;i++;}fclose(fp);//关闭文件}//写入数据到文件的函数void writeStuInfo(Stu st) //存入一条学生信息{FILE *fp = fopen("score.txt", "a+");//添加一条信息到score.txt末尾if(fp == NULL){printf("打不开文件Cannot open the file\n");return; /*若打不开则返回*/}//存入信息fprintf(fp, "%s\t%s\t%3.2f\t%3.2f\t%3.2f\n",//学号 //姓名 //数学成绩st.id, st.name, st.score[0],//英语成绩 //计算机成绩st.score[1], st.score[2]);fclose(fp);//关闭文件}//菜单函数void menu() //菜单{printf("\n\t\t--------------1、录入成绩--------------\n");printf("\t\t--------------2、显示不及格学生信息--------------\n");printf("\t\t--------------3、统计每档学生数量--------------\n");printf("\t\t--------------4、总成绩统计--------------\n");printf("\t\t--------------0、退出程序--------------\n");}//统计每科的五档水平的人数的函数void showLevel(char* score[3]){int i, k;int level[3][5] = {0};//每科5档水平for(k=0; k<3; k++){printf("%s学科每档人数如下:\n", score[k]);for(i=0; i<N; i++){switch((int)(stu[i].score[k]) / 10){//除以10取整case 9://>=90level[k][0]++;break;case 8://80-89level[k][1]++;break;case 7://70-79level[k][2]++;break;case 6://60-69level[k][3]++;break;default://<60level[k][4]++;break;}}printf("A档学生人数有【%d】人\n", level[k][0]);printf("B档学生人数有【%d】人\n", level[k][1]);printf("C档学生人数有【%d】人\n", level[k][2]);printf("D档学生人数有【%d】人\n", level[k][3]);printf("E档学生人数有【%d】人\n\n", level[k][4]);}}//主函数int main(){int i, j, k, l;Stu tempStu;// int sort[N];float sumAvg;//总成绩平均分char* score[3] = {"数学", "英语", "计算机"};while(1){menu();//菜单readStuList();//读取学生信息printf("请输入你的选择:");scanf("%d", &l);if(l == 0){printf("谢谢使用!程序已退出!\n");return 0;//退出程序}else if(l == 1){for(i=0; i<N; i++){printf("输入第[%d]个学生信息:\n",i+1);printf("学号:");scanf("%s",stu[i].id);printf("姓名:");scanf("%s",stu[i].name);for(k=0; k<3; k++){printf("%s成绩:", score[k]);scanf("%f",&stu[i].score[k]);}writeStuInfo(stu[i]);//保存输入的信息到score.txt文本中// printf("数学成绩:");// scanf("%f", &stu[i].score[0]);// printf("英语成绩:");// scanf("%f", &stu[i].score[0]);// printf("计算机成绩:");// scanf("%f", &stu[i].score[0]);// stu[i].sum = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];// sort[i] = i;}}else if(l == 2){/* 2. 统计各课及格和不及格的人数,输出对应学生的数据信息。 */for(k=0; k<3; k++){printf("%s不及格学生如下:\n", score[k]);j = 0;for(i=0; i<N; i++){if(stu[i].score[k] < 60){//学号 姓名 对应单科成绩printf("%s\t%s\t%3.2f\n",stu[i].id, stu[i].name, stu[i].score[k]);j++;//计算不及格人数}}printf("%s不及格学生人数有【%d】个。\n\n", score[k], j);}}else if(l == 3){showLevel(score);//显示每档学生人数}else if(l == 4){//总成绩统计/* 1.按总分排序 *///冒泡排序for(i=0; i<N-1; i++){for(j=0; j<N-i-1; j++){if (stu[j].sum < stu[j+1].sum)//如果前一个比后一个分数小,就交换{tempStu = stu[j];//tempStu为交换媒介stu[j] = stu[j+1];stu[j+1] = tempStu;}}}printf("按总分排名的学生信息如下:\n");for(i=0; i<N; i++){sumAvg += stu[i].sum;//逐个累加总成绩printStuInfo(stu[i]);//逐个输出学生信息}printf("总成绩平均分为【%3.2f】\n", sumAvg / N);//累加的总成绩除以人数printf("总成绩最高分为【%3.2f】\n", stu[0].sum);//第一位即为最高分printf("总成绩最低分为【%3.2f】\n", stu[N-1].sum);//最后一位即为最低分}else{printf("输入有误!请重新输入!\n");}}return 0;}
结果截图:
- 菜单截图:
2、选择1录入学生信息截图:
3、选择2显示不及格学生信息截图:
4、选择3统计每档学生数量截图:
5、选择4总成绩统计截图:
6、选择0退出。
7、选择其他数字提示错误的截图:
- Score.txt文件内容【自己创建在代码同级目录下,内容也可以自己编写,格式是一行一条记录,每条记录里每个字段之间是一个tab键(也就是\t)】。