c語言學生成績管理系統
阿新 • • 發佈:2018-12-30
此篇部落格內容與百度文庫中 https://wenku.baidu.com/view/3cb7659332d4b14e852458fb770bf78a65293ad0 均為本人個人所寫,希望大家支援點選獲得瀏覽量!
#include<stdio.h> //編譯預處理指令 #include<string.h> //定義處理字串函式 #include<process.h> //巨集指令的宣告 #include<conio.h> //定義通過控制檯進行資料輸入以及輸出 #define N 2000 //最多的人數人 #define M 3 //統計成績 typedef struct student //定義型別 { char number[10]; //儲存所有人的學號 char name[20]; //儲存學生姓名 char sex[10]; //儲存性別 float score[M]; //儲存所有課程成績 float aver; //儲存每個人的平均成績 float total; //總計成績 }STU; STU stu[N]; int n; void inputscore(void); //學生成績新建 void savescore(void); //學生成績儲存 void avergescore(void); //學生平均成績 void total(void); //學生成績總計 void modifyscore(void); //學生成績修改 void lookscore(void); //學生成績檢視 void searchscore(void); //學生成績查詢 void statistic(void); //學生成績統計 void add(void); //學生成績新增 void modify(void); //學生成績修改 void delscore(void); //學生成績刪除 void menu(void); //學生成績選單 void main() { short int flag=0; menu(); do { flag=1; switch(getch()) { case '1' : inputscore();break; //在選單介面輸入1,呼叫i函式nputscore()實現輸入學生成績資訊功能 case '2' : lookscore();break; //在選單介面輸入2,呼叫函式lookscore()實現學生成績按平均分高低排序輸出,同時lookscore()函式呼叫avregescore()函式實現各個學生的平均分計算 case '3' : searchscore();break; //在選單介面輸入3,呼叫searchscore()函式實現通過學號查詢學生成績資訊功能 case '4' : statistic();break; //在選單介面輸入4,呼叫statistic()函式輸出每一門課程的最高分,平均分以及不及格人員 case '5' : modify();break; //在選單介面輸入5,呼叫modify()函式實現通過學號修改學生成績的功能 case '6' : add();break; //在選單介面輸入6,呼叫add()函式實現新增學生成績 case '7' : delscore();break; //在選單介面輸入7,呼叫delscore()函式實現刪除指定學生的成績 case '8' : savescore();break; //在選單介面輸入8,呼叫savescore()函式將學生成績資訊儲存 case '9' :exit(0); break; //在選單介面輸入9,退出成績管理系統 default : printf("輸入有誤\n"); } printf("按任意鍵繼續\n"); getch(); //按任意鍵繼續,起到暫停的作用,函式標頭檔案conio.h已經定義過 menu(); // 選單 }while (flag==1); } void menu(void) { system("cls"); //清屏 printf("\n"); printf(" ★★★★★★★歡迎進入學生成績管理系統★★★★★★★\n"); printf(" 選單 \n"); printf(" ☆輸入成績-------------------------------------1\n"); printf(" ☆檢視成績及成績排序---------------------------2\n"); printf(" ☆查詢學生成績---------------------------------3\n"); printf(" ☆成績統計-------------------------------------4\n"); printf(" ☆修改成績-------------------------------------5\n"); printf(" ☆新增成績-------------------------------------6\n"); printf(" ☆刪除成績-------------------------------------7\n"); printf(" ☆儲存成績-------------------------------------8\n"); printf(" ☆退出系統-------------------------------------9\n"); printf(" ★★★★★★★★★★★★★★★★★★★★★★★★\n"); printf(" 請輸入您的選擇(1~9)\n"); } /***************輸入各個同學的學生資訊******************************/ void inputscore(void) //輸入成績 { int i,j; system("cls"); //清屏專用,以下出現位置作用相同 printf(" 已經轉到輸入成績選單\n"); printf("請輸入學生總數:\n"); scanf("%d",&n); printf("提示:輸入學號時請輸入9位學生編號:圖書借閱證上的學號\n"); //因二維表上下需對正故有此要求 for(i=0;i<n;i++) { printf("\n"); printf("請輸入第%d位學生的學號:\n",i+1); scanf("%s",stu[i].number); //輸入學生學號 printf("姓名:\n"); scanf("%s",stu[i].name); //輸入學生名字 printf("請輸入該學生性別\n"); scanf("%s",stu[i].sex); //輸入性別 printf("請輸入學生成績:\n"); printf("高數分\t英語分\tC語言分\n"); for(j=0;j<M;j++) scanf("%f",&stu[i].score[j]); //輸入高數、英語、C語言的成績 } printf(" 成功輸入(按任意鍵繼續後請輸入8進行儲存)\n"); } /*****************計算各個同學的總分*****************************/ void total(void) { int i,j; //定義變數i,j;i用來表示學生個數,j則用來表示學生每門課的分數 for(i=0;i<n;i++) { stu[i].total=0; for(j=0;j<M;j++) //M表示科目在標頭檔案出已經定義 { stu[i].total+=stu[i].score[j]; } } } /*****************計算各個同學的平均分*****************************/ void avergescore(void) { int i,j; //定義變數i,j;i用來表示學生個數,j則用來表示學生每門課的分數 for(i=0;i<n;i++) { stu[i].aver=0; for(j=0;j<M;j++) //M表示科目在標頭檔案出已經定義 { stu[i].aver+=stu[i].score[j]; } stu[i].aver=stu[i].aver/M; //計算平均分 } } /************檢視學生成績及根據平均分對學生進行排序*********************/ void lookscore(void) { int i,j,k; // i,j,k都表示學生成績比較用來調換順序 STU t; total(); // 此處用來對呼叫函式的宣告 avergescore(); system("cls"); // 清屏專用 printf(" 已經轉到檢視成績及成績排序選單\n"); for(i=0;i<n-1;i++) { for(k=i,j=i+1;j<n;j++) if(stu[j].aver>stu[k].aver) k=j; if(k!=j) { t=stu[k]; stu[k]=stu[i]; stu[i]=t; } } printf("名次\t學號\t\t姓名\t性別\t高數分\t英語分\tC語言分\t總分\t平均分\n"); for(i=0;i<n;i++) { printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex); for(j=0;j<M;j++) printf("%4.2f\t",stu[i].score[j]); printf("%4.2f\t",stu[i].total); printf("%4.2f",stu[i].aver); printf("\n"); } } /*****************通過輸入學號查詢學生成績***************************/ void searchscore(void) { char a[10]; //定義陣列a的型別可輸入數字,字母或字元 int i,j; system("cls"); //清屏 printf(" 已經轉到查詢學生成績選單\n"); printf("請輸入需查詢的學生學號\n"); scanf("%s",a); for(i=0;i<n;i++) { if(strcmp(a,stu[i].number)==0) //如果輸入的學號為真則輸出相關資訊 { printf("名次\t學號\t\t姓名\t性別\t高數分\t英語分\tC語言分\t總分\t平均分\n"); printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex); for(j=0;j<M;j++) printf("%4.2f\t",stu[i].score[j]); printf("%4.2f\t",stu[i].total); printf("%4.2f",stu[i].aver); printf("\n"); break; //找到該學生成績資訊後跳出for迴圈 } else printf("未找到該學生資訊\n"); } } /*******統計學生成績資訊,計算出每一門課的最高分****************/ void statistic() { int i,j=0,k=0,c1; char str[2]; float average[M],sum=0; printf("沒有可被查詢的記錄\n"); // system("cls"); if(M==0) //如果沒有輸入成績則輸出沒有可查詢的記錄 printf("沒有可被查詢的記錄\n"); else { while(1) { printf("下面將統計考試成績\n"); printf("請選擇你要統計哪科的成績 1.高數\t2.英語\t3.C語言\n"); scanf("%d",&c1); printf("\t一共有%d個記錄\n",M); /*總共記錄數*/ switch(c1) { case 1: //用來判斷高數的最高分,平均分,輸出不及格人員名單 for(i=0;i<M;i++) { sum+=stu[i].score[0]; if(stu[k].score[0]>stu[i].score[0]) k=i; if(stu[j].score[0]<stu[i].score[0]) j=i; } average[0]=sum/M; printf("\t高數的最高分:\n"); printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[j].number,stu[j].name,stu[j].score[0]); printf("\t高數的最低分是:\n"); printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[k].number,stu[k].name,stu[k].score[0]); printf("\t高數的平均分是 %5.2f\n",average[0]); printf("平均分低於60分的學生成員名單\n"); for(i=0;i<M;i++) { if(stu[i].score[0]<60) printf("%s\n",stu[i].name); } break; case 2: // 用來判斷英語的最高分,平均分,輸出不及格人員名單 for(i=0;i<M;i++) { sum+=stu[i].score[1]; if(stu[k].score[1]>stu[i].score[1]) k=i; if(stu[j].score[1]<stu[i].score[1]) j=i; } average[1]=sum/M; printf("\t英語的最高分:\n"); printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[j].number,stu[j].name,stu[j].score[1]); printf("\t英語的最低分是:\n"); printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[k].number,stu[k].name,stu[k].score[1]); printf("\t英語的平均分是 %5.2f\n",average[1]); printf("平均分低於60分的學生成員名單\n"); for(i=0;i<M;i++) { if(stu[i].score[1]<60) printf("%s\n",stu[i].name); } break; case 3: //用來判斷C語言的最高分,平均分,輸出不及格人員名單 for(i=0;i<M;i++) /*迴圈輸入判斷*/ { sum+=stu[i].score[2]; if(stu[k].score[2]>stu[i].score[2]) k=i; if(stu[j].score[2]<stu[i].score[2]) j=i; } average[2]=sum/M; printf("\tC語言的最高分:\n"); /*最高分*/ printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[j].number,stu[j].name,stu[j].score[2]); printf("\tC語言的最低分是:\n"); /*最低分*/ printf("\t\t學號:%s 姓名:%s 分數:%.2f\n",stu[k].number,stu[k].name,stu[k].score[2]); printf("\tC語言的平均分是 %5.2f\n",average[2]); printf("平均分低於60分的學生成員名單\n"); for(i=0;i<M;i++) { if(stu[i].score[2]<60) printf("%s\n",stu[i].name); } break; default: //如果輸入的數字不符合要求則顯示錯誤資訊 printf("輸入錯誤!請輸入1~3之間的數\n"); } sum=0; getchar(); printf("是否繼續進行統計?(y/n)"); gets(str); if(str[0]=='y'||str[0]=='Y') statistic(); else break; } } } /***************修改學生成績*****************/ void modify(void) { char a[10]; int i,j; system("cls"); printf(" 已經轉到修改成績選單\n"); printf("請輸入需要修改成績的學生學號\n"); scanf("%s",a); for(i=0;i<n;i++) { if(strcmp(a,stu[i].number)==0) { printf("名次\t學號\t\t姓名\t性別\t高數分\t英語分\tC語言分\t總分\t平均分\n"); printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex); for(j=0;j<M;j++) printf("%4.2f\t",stu[i].score[j]); printf("%4.2f",stu[i].total); printf("%4.2f",stu[i].aver); printf("\n"); printf("請重新輸入該學生的姓名:\n"); scanf("%%s",stu[i].number); printf("\n"); scanf("%s",stu[i].name); printf("請輸入該學生性別\n"); scanf("%s",stu[i].sex); printf("請重新輸入該學生成績:\n"); printf("高數分\t英語分\tC語言分\n"); for(j=0;j<M;j++) scanf("%f",&stu[i].score[j]); printf("修改成功\n"); break; //找到該學生成績後進行修改,跳出for迴圈 } else printf("請確認該學生是否為該校學生!\n"); } } /*****************新增學生成績********************/ void add(void) { int a,i,j; //i定義為學生,j為學生分數,a代表加入學生的數量 system("cls"); printf(" 已經轉到新增成績選單\n"); printf("請輸入新增加的學生人數:\n"); scanf("%d",&a); n=n+a; for(i=n-a;i<n;i++) { printf("\n"); printf("請輸入第%d位學生的學號:\n",i+1); scanf("%s",stu[i].number); printf("姓名:\n"); scanf("%s",stu[i].name); printf("輸入該學生性別\n"); scanf("%s",stu[i].sex); printf("請輸入學生成績:\n"); printf("高數分\t英語分\tC語言分\n"); for(j=0;j<M;j++) scanf("%f",&stu[i].score[j]); printf("新增成功\n"); } } /*******************刪除學生成績*************************/ void delscore(void) { int i,j,c; char m,a[10]; //m用來存放後面輸入刪除的字母y或n system("cls"); printf(" 已經轉到刪除成績選單\n"); printf("請輸入學生學號\n"); scanf("%s",a); for(i=0;i<n;i++) { if(strcmp(a,stu[i].number)==0) { printf("名次\t學號\t\t姓名\t性別\t高數分\t英語分\tC語言分\t總分\t平均分\n"); printf("%d\t%s\t%s\t%s\t",i+1,stu[i].number,stu[i].name,stu[i].sex); for(j=0;j<M;j++) printf("%4.2f\t",stu[i].score[j]); printf("%4.2f\t",stu[i].total); printf("%4.2f",stu[i].aver); printf("\n"); c=i; break; } else printf("未找到該學生資訊\n"); } printf("是否刪除該學生成績(y/n)\n"); scanf("%s",&m); if(m=='y') { for(i=c;i<n-1;i++) stu[i]=stu[i+1]; //結構體整體賦值將後一位學生成績資訊拷貝進入前一位學生資訊的儲存位置 n=n-1; //刪除該學生資訊後學生總數減一 printf("刪除成績成功\n"); } else printf("刪除成績失敗\n"); } /******************儲存學生成績************************/ void savescore(void) { FILE *fp; //定義指標 int i,flag=1; char m; system("cls"); printf(" 已經轉到儲存成績選單\n"); puts("是否儲存學生成績(y/n)"); scanf("%s",&m); if(m=='y') { if((fp=fopen("score.dat","wb"))==NULL) //從檔案score中開啟 { printf("檔案開啟失敗\n"); return; } for(i=0;i<n;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) //學生成績寫入 { printf("儲存失敗\n"); flag=0; } if(flag==1) printf("儲存成功!\n"); fclose(fp); //介面關閉 } else return; }