1. 程式人生 > 實用技巧 >C語言利用結構體陣列實現學生成績管理系統

C語言利用結構體陣列實現學生成績管理系統

這篇文章主要為大家詳細介紹了C語言利用結構體陣列實現學生成績管理系統,文中示例程式碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下

要求:

某班有最多不超過30人(具體人數由鍵盤輸入)參加期末考試,最多不超過6門(具體門數由鍵盤輸入)。定義結構體型別描述學生資訊,每個學生資訊包括:學號、姓名、多門課的成績、總成績和平均成績。用結構體陣列作為函式引數,程式設計實現如下選單驅動的學生成績管理系統。
(1) 錄入每個學生的學號、姓名和各科考試成績。
(2) 計算每門課程的總分和平均分。
(3) 計算每個學生的總分和平均分。
(4) 按每個學生的總分由高到低排出名次表。
(5) 按學號由小到大排出成績表。
(6) 按姓名的字典順序排出成績表。
(7) 按學號查詢學生排名極其考試成績。
(8) 按姓名查詢學生排名極其考試成績。
(9) 按優秀(90~100)、良好(80~90)、中等(70~80)、及格(60~70)、不及格(0~59)5個類別,對每門課程分別統計每個類別的人數以及所佔的百分比。
(10) 輸出每個學生的學號、姓名、各科考試成績以及每門課程的總分和平均分。

程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 #include<stdio.h> #include<Windows.h> #include<conio.h> #define SN 30 //學生人數 #define CN 6 //科目數 #define NL 20 //名字位元組長度 typedef struct student{ long int num; char name[NL]; float score[CN]; float sum; float aver; }STU; STU s[SN]; int itemSelected=-1; int n=0;//學生數 int m=0;//課程數 int Menu();
//選單 void chose(int itemSelected);//選擇 void inputScore();//輸入分數 void AverofC();//計算每門課程平均數 void AverofS();//每名學生總分和平均分 void sortByNum();//學生總分排行 void sortByGrade(); void sortByName(); void findByNum(); void findByName(); void statisticsAnalysis(); void printScore(); void main(){ printf("請輸入學生總數(n<%d):\n",SN); scanf("%d",&n); printf("請輸入課程總數(m<%d):\n",CN); scanf("%d",&m); while(1){ itemSelected=Menu(); chose(itemSelected); itemSelected=-1; } } int Menu(){ int itemSelected; system("cls"); printf("\n ==============學生成績管理系統===============\n"); printf("\t 1.輸入學號、姓名及各科成績\n"); printf("\t 2.計算每門課程總分和平均分\n"); printf("\t 3.計算每個學生總分和平局分\n"); printf("\t 4.按每個學生總分高低排出名次表\n"); printf("\t 5.按學號從小到大排出成績表\n"); printf("\t 6.按學生字典順序排出成績表\n"); printf("\t 7.按學號查詢學生排名和考試成績\n"); printf("\t 8.按姓名查詢學生排名和成績\n"); printf("\t 9.結果分析\n"); printf("\t 10.輸出資訊\n"); printf("\t 0.退出\n"); printf("===============================================\n"); printf("請選擇選項:"); scanf("%d",&itemSelected); return itemSelected; } void chose(int itemSelected){ switch(itemSelected){ case 1: inputScore(); break; case 2: AverofC();break; case 3: AverofS();break; case 4: sortByGrade();break; case 5: sortByNum();break; case 6: sortByName();break; case 7: findByNum();break; case 8: findByName();break; case 9: statisticsAnalysis();break; case 10: printScore();break; case 0: exit(0); printf("即將退出程式");break; default: printf("輸入錯誤!");break; } } void inputScore(){ printf("\n===============================================\n"); printf("請輸入學生學號、姓名及各科資訊(輸入0停止資訊輸入)\n"); for(int i=0;i<n;i++){ printf("學號(8位)"); scanf("%ld",&s[i].num); if(s[i].num==0) break; getchar();//吸收多餘換行符 printf("姓名"); gets(s[i].name); printf("請輸入各科成績"); s[i].sum=0; for(int j =0;j<m;j++){ scanf("%f",&s[i].score[j]); s[i].sum +=s[i].score[j]; } } } void AverofC(){ float sum[CN]={0}; float average[CN]={0}; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ sum[i]+=s[j].score[i]; } average[i]=sum[i]/n; printf("第%d門課程的總分為:%.2f,平均分為%.2f\n",i+1,sum[i],average[i]); } getch(); } void AverofS(){ float sum[SN]={0}; float average[SN]={0}; for (int i=0;i<n;i++){ for(int j=0;j<m;j++){ sum[i]+=s[i].score[j]; } average[i]=sum[i]/m; printf("第%d個學生的總分為:%.2f,平均分為%.2f\n",i+1,sum[i],average[i]); } getch(); } void sortByNum(){ //按學號從小到大排序 STU temp1={0}; for(int i=0;i<n-1;i++){ if(s[i].num>s[i+1].num){ temp1=s[i]; s[i]=s[i+1]; s[i+1]=temp1; } } printf("\n==============按學號從小到排序===============\n"); for(int j=0;j<n;j++){ printf("該學生的學號為:%d\n",s[j].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[j].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[j].score[c]); } printf("\n"); } getch(); } void sortByGrade(){ //按總分從高到低排序 STU temp1={0}; for(int i=0;i<n-1;i++){ if(s[i].sum<s[i+1].sum){ temp1=s[i]; s[i]=s[i+1]; s[i+1]=temp1; } } printf("\n============按總成績從高到低排序===========\n"); for(int j=0;j<n;j++){ printf("該學生的學號為:%d\n",s[j].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[j].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[j].score[c]); } printf("該學生的總成績為:%.2f",s[j].sum); printf("\n"); } getch(); } void sortByName(){ //按姓名首字母字典順序排序 STU temp1={0}; for(int i=0;i<n-1;i++){ if(((int)(s[i].name[0])>(int)(s[i+1].name[0]))){ //將名字首字母轉成成ASCII碼從而比較大小排序 temp1=s[i]; s[i]=s[i+1]; s[i+1]=temp1; } } printf("\n==============按學號從小到排序===============\n"); for(int j=0;j<n;j++){ printf("該學生的學號為:%d\n",s[j].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[j].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[j].score[c]); } printf("該學生的總成績為:%.2f",s[j].sum); printf("\n"); } getch(); } void findByNum() { int find=-1; //記錄需要查詢的學號,並作為查詢成功與否的識別符號 printf("請輸入要查詢的學號:"); scanf("%d",&find); for(int i=0;i<n;i++){ if(s[i].num==find){ printf("\n查詢成功\n"); printf("該學生的學號為%d\n",s[i].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[i].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[i].score[c]); } printf("該學生的總成績為:%.2f",s[i].sum); printf("\n"); find=-2; } } if(find!=-2){ printf("查無此人\n"); printf("按任意鍵繼續"); } getch(); } void findByName(){ int is_find=0; char find[SN]; printf("請輸入要查詢的姓名:"); getchar(); gets(find); for(int i=0;i<n;i++){ if(strcmp(s[i].name,find)==0){ printf("\n查詢成功\n"); printf("該學生的學號為%d\n",s[i].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[i].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[i].score[c]); } printf("該學生的總成績為:%.2f",s[i].sum); printf("\n"); is_find=1; } } if(is_find!=1){ printf("查無此人\n"); printf("按任意鍵繼續"); } getch(); } void statisticsAnalysis(){ printf("輸出每門課程優秀、良好、中等、及格、不及格人數所佔的百分比\n"); int a1[CN]={0},a2[CN]={0},a3[CN]={0},a4[CN]={0},a5[CN]={0}; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i].score[j]>=90 && s[i].score[j]<=100){ a1[j]++; }else if (s[i].score[j]>=80 && s[i].score[j]<90){ a2[j]++; }else if (s[i].score[j]>=70 && s[i].score[j]<80){ a3[j]++; }else if (s[i].score[j]>=60 && s[i].score[j]<70){ a4[j]++; }else if (s[i].score[j]<60){ a5[j]++; } } } printf("\n====================各們課程概況==================\n"); for(int k=0;k<m;k++){ printf("第%d門課的優秀人數佔%.2f%%,",k+1,(a1[k]/(n*1.0))*100); printf("良好人數佔%.2f%%,",(a2[k]/(n*1.0))*100); printf("中等人數佔%.2f%%,",(a3[k]/(n*1.0))*100); printf("及格人數佔%.2f%%,",(a4[k]/(n*1.0))*100); printf("不及格人數佔%.2f%%,",(a5[k]/(n*1.0))*100); printf("\n"); } getch(); } void printScore(){ printf("==============以下為學生資訊=============="); for(int j=0;j<n;j++){ printf("該學生的學號為:%d\n",s[j].num); printf("該學生的姓名為:"); for(int k=0;k<NL;k++){ printf("%c",s[j].name[k]); } printf("\n該學生的各科成績為\n"); for(int c=0;c<m;c++){ printf("第%d門成績為%.2f\n",c+1,s[j].score[c]); } printf("該學生的總成績為:%.2f",s[j].sum); printf("\n"); } getch(); }