同学课程设计的加工
对同学的课程设计加入两个功能——文件的输入和输出。
代码如下:
1 #include <stdio.h> 2 #include <conio.h> 3 #include <string.h> 4 #define NUMSTU 5000 /*最大学生人数*/ 5 #define NUMSCORE 4 /*成绩个数*/ 6 #define NAMELEN 10 /*姓名的最大长度<10*/ 7 void main() 8 { 9 char menuItem,subItem; /*用户输入的菜单项*/ 10 int i,j,l; 11 unsigned long tempNo; //用于排序对调内存的中间变量 12 char tempName[NAMELEN],namewj[100]; 13 float sum,k; 14 FILE *zp,*fp; 15 16 /*主要数据结构*/ 17 unsigned long no[NUMSTU]={0}; /*学号*/ 18 char name[NUMSTU][NAMELEN]={""}; /*姓名*/ 19 float score[NUMSTU][NUMSCORE]={0}; /*数学、语文、英语、平均成绩*/ 20 int excellentNum[3]={0}; /*每科成绩为优秀(>=90)的人数*/ 21 char subject[NUMSCORE][NAMELEN]={"数学","语文","英语","平均"}; 22 int currentNumStu; /*当前表中的学生人数*/ 23 24 currentNumStu=0; 25 do 26 { 27 printf("|-------------------------------------------------------|\n"); 28 printf("|\t\t\t\t\t\t\t|\n"); 29 printf("|\t\t 请输入选项编号(0 ~~ 7): \t\t|\n"); 30 printf("|\t\t\t\t\t\t\t|\n"); 31 printf("|-------------------------------------------------------|\n"); 32 printf("|\t\t\t\t\t\t\t|\n"); 33 printf("|\t\t 1——创建成绩单 \t\t|\n"); 34 printf("|\t\t 2——添加学生 \t\t|\n"); 35 printf("|\t\t 3——编辑学生 \t\t|\n"); 36 printf("|\t\t 4——删除学生 \t\t|\n"); 37 printf("|\t\t 5——统计成绩 \t\t|\n"); 38 printf("|\t\t 6——排序成绩单 \t\t|\n"); 39 printf("|\t\t 7——显示成绩 \t\t|\n"); 40 printf("|\t\t 8——从文件读入 \t\t|\n"); 41 printf("|\t\t 9——输出到文件 \t\t|\n"); 42 printf("|\t\t 0——退出 \t\t|\n"); 43 printf("|-------------------------------------------------------|\n"); 44 45 printf("请输入选项编号(0 ~ 7): "); 46 /*清除键盘缓冲区*/ 47 fflush(stdin); 48 scanf("%c",&menuItem); 49 50 switch(menuItem) 51 { 52 case '1':/*创建成绩单*/ 53 if(currentNumStu>0) 54 { 55 printf("\n不能重新创建学生成绩单\n"); 56 } 57 else 58 { 59 printf("注意:输入的结束标志为学号为0!\n"); 60 i=0; 61 printf("请输入学号:"); 62 scanf("%lu",&no[i]); 63 64 /*清除键盘缓冲区*/ 65 fflush(stdin); 66 while(no[i]!=0&¤tNumStu<NUMSTU) 67 { 68 printf("请输入姓名:"); 69 gets(name[i]); 70 for(j=0; j<NUMSCORE-1; j++) 71 { 72 printf("请输入%s成绩:",subject[j]); 73 scanf("%f",&score[i][j]); 74 } 75 76 /*计算平均成绩*/ 77 sum=0; 78 for(j=0; j<NUMSCORE-1; j++) 79 sum = sum+score[i][j]; 80 score[i][3] = sum/3; 81 82 currentNumStu++; 83 if(currentNumStu==NUMSTU) 84 { printf("成绩单已满!结束创建!!\n"); 85 break; 86 } 87 i++; 88 89 printf("请输入学号:"); 90 scanf("%lu",&no[i]); 91 /*清楚键盘缓冲区*/ 92 fflush(stdin); 93 } 94 } 95 break; 96 case '2': 97 /*添加学生*/ 98 if(currentNumStu>=NUMSTU) 99 { 100 printf("成绩单已满!不可再加学生信息!!\n"); 101 } 102 else 103 { 104 i=currentNumStu; 105 printf("请输入学号:"); 106 scanf("%lu",&no[i]); 107 fflush(stdin); 108 printf("请输入姓名:"); 109 gets(name[i]); 110 for(j=0; j<NUMSCORE-1; j++) 111 { 112 printf("请输入%s成绩:",subject[j]); 113 scanf("%f",&score[i][j]); 114 } 115 116 /*计算平均成绩*/ 117 sum=0; 118 for(j=0; j<NUMSCORE-1; j++) 119 sum = sum+score[i][j]; 120 score[i][3] =sum/3; 121 currentNumStu++; 122 printf("添加成功!\n"); 123 } 124 break; 125 case '3':/*编辑学生信息*/ 126 scanf("%lu",&tempNo); 127 for(i=0;i<currentNumStu;i++) 128 if(no[i]==tempNo) 129 break; 130 if(i!=currentNumStu) 131 { 132 for(j=0; j<NUMSCORE-1; j++) 133 { 134 printf("请输入%s成绩:",subject[j]); 135 scanf("%f",&score[i][j]); 136 } 137 138 /*计算平均成绩*/ 139 sum=0; 140 for(j=0; j<NUMSCORE-1; j++) 141 sum = sum+score[i][j]; 142 score[i][3] =sum/3; 143 printf("编辑成功!\n"); 144 } 145 else 146 printf("不存在该学生!\n"); 147 break; 148 case '4':/*删除指定学号的学生信息*/ 149 printf("请输入学号:"); 150 scanf("%lu",&tempNo); 151 for(i=0;i<currentNumStu;i++) 152 if(no[i]==tempNo) 153 break; 154 if(i!=currentNumStu) 155 { 156 for(;i<currentNumStu-1;i++) 157 { 158 no[i]=no[i+1]; 159 strcpy(name[i],name[i+1]); 160 for(j=0; j<NUMSCORE; j++) 161 { 162 score[i][j]=score[i+1][j]; 163 } 164 } 165 currentNumStu--; 166 printf("删除成功!\n"); 167 } 168 else 169 printf("不存在该学生!\n"); 170 break; 171 case '5':/*统计每科成绩>=90分以上的学生人数*/ 172 if(currentNumStu==0) 173 printf("目前无记录,请添加成绩单信息!\n"); 174 else 175 { 176 for(i=0;i<currentNumStu;i++) 177 for(j=0; j<NUMSCORE-1; j++) 178 { 179 if(score[i][j]>=90) 180 excellentNum[j]++; 181 } 182 printf("%10s%10s%10s\n","数学成绩","语文成绩","英语成绩"); 183 for(j=0; j<NUMSCORE-1; j++) 184 printf("%10d", excellentNum[j]); 185 printf("\n"); 186 } 187 break; 188 case '6':/*按学号升序或降序排列实现*/ 189 printf("|---------------------------------------|\n"); 190 printf("| |\n"); 191 printf("| 排序菜单 |\n"); 192 printf("| |\n"); 193 printf("|---------------------------------------|\n"); 194 printf("| |\n"); 195 printf("| 1——按学号升序排列 |\n"); 196 printf("| 2——按学号降序排列 |\n"); 197 printf("|---------------------------------------|\n"); 198 199 printf("请输入选项编号(1 ~2): "); 200 fflush(stdin); 201 scanf("%c",&subItem); 202 203 switch(subItem) 204 { 205 case '1': 206 if(currentNumStu<2) 207 { 208 printf("成绩表中少于2人则不做排序!\n"); 209 } 210 else 211 { 212 /*按学号升序排列*/ 213 for(i=0;i<currentNumStu-1;i++) 214 for(j=i+1; j<currentNumStu; j++) 215 { 216 if(no[i]>no[j]) 217 { 218 tempNo=no[i]; 219 no[i]=no[j]; 220 no[j]=tempNo; 221 strcpy(tempName,name[i]); 222 strcpy(name[i],name[j]); 223 strcpy(name[j],tempName); 224 for(l=0; l<NUMSCORE; l++) 225 { 226 k=score[i][l]; 227 score[i][l]=score[j][l]; 228 score[j][l]=k; 229 } 230 } 231 } 232 printf("排序结束,请选择菜单项显示信息!\n"); 233 } 234 break; 235 case '2': 236 if(currentNumStu<2) 237 { 238 printf("成绩表中少于2人则不做排序!\n"); 239 } 240 else 241 { 242 /*按学号降序排列*/ 243 for(i=0;i<currentNumStu-1;i++) 244 for(j=i+1; j<currentNumStu; j++) 245 { 246 if(no[i]<no[j]) 247 { 248 tempNo=no[i]; 249 no[i]=no[j]; 250 no[j]=tempNo; 251 strcpy(tempName,name[i]); 252 strcpy(name[i],name[j]); 253 strcpy(name[j],tempName); 254 for(l=0; l<NUMSCORE; l++) 255 { 256 k=score[i][l]; 257 score[i][l]=score[j][l]; 258 score[j][l]=k; 259 } 260 } 261 } 262 printf("排序结束,请选择菜单项显示信息!\n"); 263 } 264 break; 265 default:printf("非法输入\n"); 266 } 267 break; 268 case '7':/*显示学生信息*/ 269 if(currentNumStu==0) 270 { 271 printf("无学生记录,请创建成绩单!\n"); 272 } 273 else 274 { 275 printf("学生信息如下:\n"); 276 printf("%15s%15s%10s%10s%10s%10s\n","学号","姓名","数学成绩","语文成绩","英语成绩","平均成绩"); 277 for(i=0; i<currentNumStu; i++) 278 { 279 printf("%15lu",no[i]); 280 printf("%15s",name[i]); 281 for(j=0; j<NUMSCORE; j++) 282 printf("%10.1f", score[i][j]); 283 printf("\n"); 284 } 285 } 286 break; 287 case '8': 288 if(currentNumStu>=NUMSTU) 289 { 290 printf("成绩单已满!不可打开文件添加信息!\n"); 291 } 292 else 293 { 294 printf("请输入文件名:"); 295 scanf("%s",namewj); 296 if((fp=fopen(namewj,"r"))==NULL) 297 { 298 printf("文件打开失败!\n"); 299 break; 300 } 301 i=currentNumStu; 302 while(!feof(fp)) 303 { 304 if(currentNumStu==5) 305 { 306 printf("成绩单已添加满!不可再加文件剩余学生信息!!\n"); 307 break; 308 } 309 fscanf(fp,"%lu",&no[i]); 310 fflush(stdin); 311 fscanf(fp,"%s",&name[i]); 312 for(j=0; j<NUMSCORE-1; j++) 313 { 314 fscanf(fp,"%f",&score[i][j]); 315 } 316 /*计算平均成绩*/ 317 sum=0; 318 for(j=0; j<NUMSCORE-1; j++) 319 sum = sum+score[i][j]; 320 score[i][3] =sum/3; 321 currentNumStu++; 322 } 323 if(!feof(fp)) 324 printf("文件信息添加完成!\n"); 325 fclose(fp); 326 } 327 328 break; 329 case '9': 330 printf("请输入文件名:"); 331 scanf("%s",namewj); 332 if((zp=fopen(namewj,"w"))==NULL) 333 { 334 printf("文件打开失败!\n"); 335 break; 336 } 337 fprintf(zp,"count=%d\n",currentNumStu); 338 fprintf(zp,"%15s%15s%10s%10s%10s%10s\n","number","name","math","chinese","english","average"); 339 for(i=0; i<currentNumStu; i++) 340 { 341 fprintf(zp,"%15lu",no[i]); 342 fprintf(zp,"%15s",name[i]); 343 for(j=0; j<NUMSCORE; j++) 344 fprintf(zp,"%10.1f", score[i][j]); 345 fprintf(zp,"\n"); 346 } 347 printf("文件输入完成!\n"); 348 fclose(fp); 349 break; 350 case '0':printf("您选择了“0——退出”\n");break; 351 default:printf("非法输入\n"); 352 } 353 354 }while(menuItem!='0'); 355 }