功能描述:
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)】。