本文为大大维原创,最早于博客园发表,转载请注明出处!!!

一、要求:

学生成绩管理系统

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。使用链表编程实现如下菜单驱动的学生成绩管理系统。

  1. 从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。
  2. 增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。
  3. 计算每门课程的总分和平均分;
  4. 计算每个学生的总分和平均分;
  5. 按每个学生的总分由高到低排出名次表;
  6. 按每个学生的总分由低到高排出名次表;
  7. 按学号由小到大排出成绩表;
  8. 按姓名的字典顺序排出成绩表;
  9. 按学号查询学生排名及其考试成绩;
  10. 按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。
  11. 按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。
  12. 将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;
  13. 将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

二、程序结构与设计

  1. 模块划分:

整个函数划分为:

      a. 用户欢迎与权限通过界面

b. 主菜单与用户退出界面

c. 函数调用用程序执行界面

三个模块。

2.主函数的主要功能:

     a. 通过switch函数调用各功能函数

     b. 构建良好亲和的用户体验界面

3. 各子函数主要功能:

F1:  从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。

F2:增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。

F3:计算每门课程的总分和平均分;

F4:计算每个学生的总分和平均分;

F5:按每个学生的总分由高到低排出名次表;

F6:按每个学生的总分由低到高排出名次表;

F7:按学号由小到大排出成绩表;

F8:按姓名的字典顺序排出成绩表;

F9:按学号查询学生排名及其考试成绩;

F10:按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。

F11:按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。

F12:将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;

F13:将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

4.函数之间的调用关系:

以结构体数组为主体,辅以链表,通过switch函数调用各功能函数。

Main函数负责对各个小函数的调用,而f1---f13分别完成对题目所要求的13个操作的实现,程序整体大方整洁,风格良好,有较好的结构化特点

三、项目代码

  1. /*student achievement management system*/
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<windows.h>
  7. #define L 32
  8. #define N 6
  9. #define M 30
  10. #define LEN sizeof(struct student)
  11. struct student
  12. {
  13. char name [L]; ///姓名
  14. int num; ///学号
  15. float ach[N]; ///成绩数组
  16. float total; ///总分
  17. struct student *next;
  18. };
  19. struct student stu[M];
  20. int count=,n,m,j,i,k,l;
  21. char filename[L]={}; ///声明变量 存储文件名
  22. int f1(int m,int n,char filename[L]);
  23. int f2(int m,int n,char filename[L]);
  24. int f3(int m,int n,char filename[L]);
  25. int f4(int m,int n,char filename[L]);
  26. int f5(int m,int n,char filename[L]);
  27. int f6(int m,int n,char filename[L]);
  28. int f7(int m,int n,char filename[L]);
  29. int f8(int m,int n,char filename[L]);
  30. int f9(int m,int n,char filename[L]);
  31. int f10(int m,int n,char filename[L]);
  32. int f11(int m,int n,char filename[L]);
  33. int f12(int m,int n,char filename[L]);
  34. int f13(int m,int n,char filename[L]);
  35. int main()
  36. {
  37. int cishu=;
  38. r0: system("CLS");
  39. system("color 0C");
  40. char mima[L];
  41. printf("-------------------------------------------------------------------------------\n");
  42. printf("| 欢迎使用学生信息管理系统 |");
  43. printf("-------------------------------------------------------------------------------\n");
  44. printf("\n\n\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  45. printf("+ 系 统 权 限 认 证 +\n");
  46. printf(">>>>>>>>>>>>>>>>>>>>>请提供管理员权限,输入系统启动密码<<<<<<<<<<<<<<<<<<<<<<<\n");
  47. printf("+ +\n");
  48. printf("+----------------------------------------------------------------------------+\n");
  49. printf("\n>>>>>> 密 码: ");
  50. scanf("%s",&mima);
  51. cishu --;
  52. for(;strcmp(mima,"LLL1996")!=;)
  53. {
  54. if(cishu==)
  55. {
  56. printf("对不起,程序即将关闭,谢谢使用");
  57. getchar();
  58. getchar();
  59. exit ();
  60. }
  61. else
  62. {
  63. printf("对不起,密码错误,请重新输入(你还有%d次输入机会)",cishu);
  64. getchar();
  65. getchar();
  66. goto r0;
  67. }
  68. }
  69. getchar();
  70. system("CLS");
  71. system("color BC");
  72. printf("-------------------------------------------------------------------------------\n");
  73. printf("| WELCOME TO USE THE SYSTEM |");
  74. printf("-------------------------------------------------------------------------------\n");
  75. printf(" 建议:1. 使用本系统时需要首先输入班级总人数、总科目数、录入信息文件 \n");
  76. printf(" 2. 如果您已经有输入文件,建议请先选择选项1,用于检查文件信息总数 \n");
  77. printf(" 与录入人数、科目数是否一致,避免计算出错 \n");
  78. printf(" 3. 如果您是初次使用本系统请先选择选项2用于创建学生信息文件,录入 \n");
  79. printf(" 信息时填写数据较多,并耐心仔细地录入学生信息 \n O(∩_∩)O谢谢合作!!\n");
  80. printf("-------------------------------------------------------------------------------\n\n");
  81. printf("\n<<<< 请输入班级的总人数: ");
  82. scanf("%d",&m);
  83. printf("\n<<<< 请输入课程总数: ");
  84. scanf("%d",&n);
  85. printf("\n<<<< 请输入要读取或录入信息的文件的名字: "); ///提示输入文件名
  86. getchar();
  87. gets(filename); ///接收输入
  88. for(j;;j++)
  89. {
  90. char xuanze[]={};
  91. printf("\n\n>>>>>>>>如果想进行清屏操作请输入yes,如果想跳过清屏直接继续请按任意键!<<<<<<<<\n");
  92. getchar();
  93. gets(xuanze);
  94. if(strcmp(xuanze,"yes")==) system("CLS");
  95. printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
  96. printf("\n * 欢迎进入学生成绩信息管理系统 *");
  97. printf("\n * 一、读取文件 >>请按1 *");
  98. printf("\n * 二、录入学生成绩信息 >>请按2 *");
  99. printf("\n * 三、课程总成绩与平均分数据统计 >>请按3 *");
  100. printf("\n * 四、学生个人总成绩与平均分统计 >>请按4 *");
  101. printf("\n * 五、学生成绩降序排名 >>请按5 *");
  102. printf("\n * 六、学生成绩升序排名 >>请按6 *");
  103. printf("\n * 七、学生成绩按学号大小排序 >>请按7 *");
  104. printf("\n * 八、姓名字典顺序排出成绩表 >>请按8 *");
  105. printf("\n * 九、按学号查询学生排名及其考试成绩 >>请按9 *");
  106. printf("\n * 十、按姓名查询学生排名及其考试成绩 >>请按10 *");
  107. printf("\n * 十一、学生成绩各等级数据统计 >>请按11 Designd by:刘佳维 *");
  108. printf("\n * 十二、学生信息输出到屏幕 >>请按12 刘成亮 *");
  109. printf("\n * 十三、学生信息导出到文件 >>请按13 李乐 *");
  110. printf("\n * 零 、退出系统 >>请按0 *");
  111. printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n");
  112. printf("\n请从菜单中选择一项进行操作>>>>>>>>>>\n");
  113. scanf("%d",&i);
  114. if(i==)
  115. break;
  116. else
  117. switch(i)
  118. {
  119. case : f1(m,n,filename); break;
  120. case : f2(m,n,filename); break;
  121. case : f3(m,n,filename); break;
  122. case : f4(m,n,filename); break;
  123. case : f5(m,n,filename); break;
  124. case : f6(m,n,filename); break;
  125. case : f7(m,n,filename); break;
  126. case : f8(m,n,filename); break;
  127. case : f9(m,n,filename); break;
  128. case : f10(m,n,filename); break;
  129. case : f11(m,n,filename); break;
  130. case : f12(m,n,filename); break;
  131. case : f13(m,n,filename); break;
  132. default: break;
  133. }
  134. }
  135. printf("\n\n=====谢谢使用本系统,祝您生活愉快!=====\n\n"); ///退出界面
  136. return ;
  137. }
  138. int f1(int m,int n,char filename[L])
  139. {
  140. struct student card;
  141. FILE *file;
  142. if((file =fopen(filename,"rb"))!=NULL) ///打开 并判断
  143. {
  144. printf("=====文件打开成功!=====\n\n"); ///成功则提示成功
  145. count=;
  146. while((fread(&card,sizeof(student),,file))!=(int)NULL)
  147. {
  148. stu[i].num=card.num;
  149. strcpy(stu[i].name,card.name);
  150. for(j=;j<n;j++)
  151. stu[i].ach[j]=card.ach[j];
  152. stu[i].total=card.total;
  153. count++;
  154. }
  155. if(count<m)
  156. printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====\n",count,m-count);
  157. else if(count==m)
  158. printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",count);
  159. else
  160. {
  161. printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
  162. getchar();
  163. exit();
  164. }
  165. fclose(file);
  166. return count;
  167. }
  168. else
  169. printf("=====文件打开失败!=====\n"); ///打开失败则提示打开失败
  170. return ;
  171. };
  172. int f2(int m,int n,char filename[L])
  173. {
  174. struct student card;
  175. FILE *file;
  176. if((file =fopen(filename,"rb"))!=NULL) ///打开 并判断
  177. {
  178. count=;
  179. while((fread(&card,LEN,,file))!=(int)NULL)
  180. {
  181. stu[i].num=card.num;
  182. strcpy(stu[i].name,card.name);
  183. for(j=;j<n;j++)
  184. stu[i].ach[j]=card.ach[j];
  185. stu[i].total=card.total;
  186. count++;
  187. }
  188. if(count<m)
  189. {
  190. printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====\n",count,m-count);
  191. printf("<<<< 注:录入信息时,如果想中途停止输入,以后再进行补录,请将学号输为-1,谢谢!\n");
  192. }
  193. else if(count==m)
  194. printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",count);
  195. else
  196. {
  197. printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
  198. getchar();
  199. exit();
  200. }
  201. }
  202. fclose(file);
  203. if((file=fopen(filename,"ab"))!=NULL)
  204. {
  205. for(count;count<m;count ++)
  206. {
  207. printf("<<<< 请输入该学生的学号:\n");
  208. scanf("%d",&stu[count].num);
  209. if(stu[count].num==-)
  210. goto r2;
  211. for(j=;j<count;j++)
  212. {
  213. if(stu[j].num==stu[count].num)
  214. {
  215. printf("=====学号输入重复,输入错误,请检查后再进行录入=====\n");
  216. count --;
  217. goto r2;
  218. }
  219. }
  220. stu[count].total=;
  221. printf("<<<< 请输入该学生的姓名:\n");
  222. getchar();
  223. gets(stu[count].name);
  224. for(j=;j<=n;j++)
  225. {
  226. printf("<<<< 请输入该学生第%d门功课的成绩:",j);
  227. scanf("%f",&stu[count].ach[j-]);
  228. stu[count].total=stu[count].total+stu[count].ach[j-];
  229. }
  230. fwrite(&stu[count],LEN,,file);
  231. }
  232. }
  233. printf("\n=====学生信息已成功录入二进制文件 %s 中,谢谢=====\n",filename);
  234. fclose (file);
  235. r2: return ;
  236. };
  237. int f3(int m,int n,char filename[L])
  238. {
  239. struct student card;
  240. FILE *fp1;
  241. float zf[N]={};
  242. fp1=fopen(filename,"rb");
  243. if(fp1==NULL)
  244. {
  245. printf("\n=====文件%s打开失败=====\n",filename);
  246. goto r3;
  247. }
  248. while((fread(&card,LEN,,fp1))!=(int)NULL)
  249. {
  250. for(i=;i<n;i++)
  251. {
  252. zf[i]=zf[i]+card.ach[i];
  253. }
  254. }
  255. printf("=====课程总成绩与平均分为=====\n");
  256. for(i=;i<n;i++)
  257. {
  258. printf("<<<< 第%d门课程的总成绩为%.3f 平均分为%.3f\n",i+,zf[i],zf[i]/m);
  259. }
  260. fclose (fp1);
  261. r3: return ;
  262. };
  263. int f4(int m,int n,char filename[L])
  264. {
  265. struct student card;
  266. FILE *fp1;
  267. float zf[M]={};
  268. char nam[M][L]={};
  269. fp1=fopen(filename,"rb");
  270. if(fp1==NULL)
  271. {
  272. printf("\n=====文件%s打开失败=====\n",filename);
  273. goto r4;
  274. }
  275. printf("=====学生个人总成绩与平均分为=====\n");
  276. for(i=;(fread(&card,LEN,,fp1))!=(int)NULL;i++)
  277. {
  278. strcpy(nam[i],card.name);
  279. zf[i]=card.total;
  280. printf("<<<< %s的课程的总成绩为%.3f 平均分为%.3f\n",nam[i],zf[i],zf[i]/n);
  281. }
  282. fclose (fp1);
  283. r4: return ;
  284. }
  285. int f5(int m,int n,char filename[L])
  286. {
  287. struct student card;
  288. FILE *fp1;
  289. fp1=fopen(filename,"rb");
  290. if(fp1==NULL)
  291. {
  292. printf("\n=====文件%s打开失败=====\n",filename);
  293. goto r5;
  294. }
  295. i=;
  296. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  297. {
  298. stu[i].num=card.num;
  299. strcpy(stu[i].name,card.name);
  300. for(j=;j<n;j++)
  301. stu[i].ach[j]=card.ach[j];
  302. stu[i].total=card.total;
  303. i++;
  304. }
  305. for(k=;k<=i;k++)
  306. {
  307. for(j=k+;j<i;j++)
  308. if(stu[k].total<stu[j].total)
  309. {
  310. card=stu[k];
  311. stu[k]=stu[j];
  312. stu[j]=card;
  313. }
  314. }
  315. printf("=====成绩正序排名为=====\n");
  316. for(j=;j<i;j++)
  317. {
  318. printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",j+,stu[j].num,stu[j].name,stu[j].total);
  319. }
  320. fclose (fp1);
  321. r5: return ;
  322. };
  323. int f6(int m,int n,char filename[L])
  324. {
  325. struct student card;
  326. FILE *fp1;
  327. fp1=fopen(filename,"rb");
  328. if(fp1==NULL)
  329. {
  330. printf("\n文件%s打开失败\n",filename);
  331. goto r6;
  332. }
  333. i=;
  334. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  335. {
  336. stu[i].num=card.num;
  337. strcpy(stu[i].name,card.name);
  338. for(j=;j<n;j++)
  339. stu[i].ach[j]=card.ach[j];
  340. stu[i].total=card.total;
  341. i++;
  342. }
  343. for(k=;k<=i;k++)
  344. {
  345. for(j=k+;j<i;j++)
  346. if(stu[j].total<stu[k].total)
  347. {
  348. card=stu[k];
  349. stu[k]=stu[j];
  350. stu[j]=card;
  351. }
  352. }
  353. printf("=====成绩倒序排名为=====\n");
  354. for(j=;j<i;j++)
  355. {
  356. printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",m-j,stu[j].num,stu[j].name,stu[j].total);
  357. }
  358. fclose (fp1);
  359. r6: return ;
  360. };
  361. int f7(int m,int n,char filename[L])
  362. {
  363. struct student card;
  364. FILE *fp1;
  365. fp1=fopen(filename,"rb");
  366. if(fp1==NULL)
  367. {
  368. printf("\n=====文件%s打开失败=====\n",filename);
  369. goto r7;
  370. }
  371. i=;
  372. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  373. {
  374. stu[i].num=card.num;
  375. strcpy(stu[i].name,card.name);
  376. for(j=;j<n;j++)
  377. stu[i].ach[j]=card.ach[j];
  378. stu[i].total=card.total;
  379. i++;
  380. }
  381. for(k=;k<=i;k++)
  382. {
  383. for(j=k+;j<i;j++)
  384. if(stu[j].num<stu[k].num)
  385. {
  386. card=stu[k];
  387. stu[k]=stu[j];
  388. stu[j]=card;
  389. }
  390. }
  391. printf("=====成绩依靠学号顺序排名=====\n");
  392. for(j=;j<i;j++)
  393. {
  394. printf("----------------------------------------------------\n");
  395. printf("序号;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
  396. for(k=;k<n;k++)
  397. printf("第%d科:%.3f ",k+,stu[j].ach[k]);
  398. printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
  399. }
  400. printf("----------------------------------------------------");
  401. fclose(fp1);
  402. r7: return ;
  403. };
  404.  
  405. int f8(int m,int n,char filename[L])
  406. {
  407. struct student card;
  408. FILE *fp1;
  409. fp1=fopen(filename,"rb");
  410. if(fp1==NULL)
  411. {
  412. printf("\n=====文件%s打开失败=====\n",filename);
  413. goto r8;
  414. }
  415. i=;
  416. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  417. {
  418. stu[i].num=card.num;
  419. strcpy(stu[i].name,card.name);
  420. for(j=;j<n;j++)
  421. stu[i].ach[j]=card.ach[j];
  422. stu[i].total=card.total;
  423. i++;
  424. } ///将信息读入结构体
  425. for(i=;i<m-;i++)
  426. for(j=i+;j<m;j++)
  427. if(strcmp(stu[i].name,stu[j].name)>)
  428. {
  429. card=stu[i];
  430. stu[i]=stu[j];
  431. stu[j]=card;
  432. }
  433. printf("=====按姓名的字典顺序排出成绩表=====");
  434. for(k=;k<m;k++)
  435. {
  436.  
  437. printf("----------------------------------------------------\n");
  438. printf("序号;%d 学号:%d 姓名:%s\n",k+,stu[k].num,stu[k].name);
  439. for(i=;i<n;i++)
  440. printf("第%d科:%.3f ",i+,stu[k].ach[i]);
  441. printf("\n总分%.3f 平均分%.3f\n",stu[k].total,stu[k].total/n);
  442. }
  443. printf("----------------------------------------------------");
  444. fclose(fp1);
  445. r8: return ;
  446. };
  447. int f9(int m,int n,char filename[L])
  448. {
  449. struct student *head,*p1,*p2;
  450. int ChooseNum;
  451. printf("=====请输入要查询信息的学生的学号:=====\n");
  452. scanf("%d",&ChooseNum);
  453. struct student card;
  454. FILE *fp1;
  455. fp1=fopen(filename,"rb");
  456. if(fp1==NULL)
  457. {
  458. printf("\n=====文件%s打开失败=====\n",filename);
  459. goto r9;
  460. }
  461. i=;
  462. while((fread(&card,LEN,,fp1))!=(int)NULL)
  463. {
  464. stu[i].num=card.num;
  465. strcpy(stu[i].name,card.name);
  466. for(j=;j<n;j++)
  467. stu[i].ach[j]=card.ach[j];
  468. stu[i].total=card.total;
  469. i++;
  470. } ///读入到结构体数组
  471. for(k=;k<=i;k++)
  472. {
  473. for(j=k+;j<i;j++)
  474. if(stu[k].total<stu[j].total)
  475. {
  476. card=stu[k];
  477. stu[k]=stu[j];
  478. stu[j]=card;
  479. }
  480. } ///排名
  481. head=&stu[];
  482. p1=&stu[];
  483. p2=NULL;
  484. head->next=p1;
  485. p1->next=p2; ///建立链表
  486. if(head->num==ChooseNum)
  487. {
  488. {
  489. printf("名次;%d 学号:%d 姓名:%s\n",i+,head->num,head->name);
  490. for(k=;k<n;k++)
  491. printf("第%d科:%.3f ",k+,head->ach[k]);
  492. printf("\n总分%.3f 平均分%.3f\n",head->total,head->total/n);
  493. goto r9;
  494. }
  495. }
  496. else
  497. for(i=;<m;i++)
  498. {
  499. p1=&stu[i];
  500. p1->next=p2;
  501. if(p1->num==ChooseNum)
  502. {
  503. printf("名次;%d 学号:%d 姓名:%s\n",i+,p1->num,p1->name);
  504. for(k=;k<n;k++)
  505. printf("第%d科:%.3f ",k+,p1->ach[k]);
  506. printf("\n总分%.3f 平均分%.3f\n",p1->total,p1->total/n);
  507. goto r9;
  508. }
  509. else {
  510. printf("没有该学号!!!!!!");
  511. goto r9;
  512. }
  513. }
  514. r9: return ;
  515. }
  516. int f10(int m,int n,char filename[L])
  517. {
  518. char ChooseName[L];
  519. printf("<<<< 请输入要查询的学生的姓名:\n");
  520. getchar();
  521. gets(ChooseName);
  522. struct student card;
  523. FILE *fp1;
  524. fp1=fopen(filename,"rb");
  525. if(fp1==NULL)
  526. {
  527. printf("\n=====文件%s打开失败=====\n",filename);
  528. goto r10;
  529. }
  530. i=;
  531. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  532. {
  533. stu[i].num=card.num;
  534. strcpy(stu[i].name,card.name);
  535. for(j=;j<n;j++)
  536. stu[i].ach[j]=card.ach[j];
  537. stu[i].total=card.total;
  538. i++;
  539. }
  540. for(k=;k<=i;k++)
  541. {
  542. for(j=k+;j<i;j++)
  543. if(stu[k].total<stu[j].total)
  544. {
  545. card=stu[k];
  546. stu[k]=stu[j];
  547. stu[j]=card;
  548. }
  549. }
  550. printf("=====按姓名查询学生排名及其考试成绩=====\n");
  551. for(j=;j<i;j++)
  552. {
  553. if(strcmp(stu[j].name,ChooseName)==)
  554. {
  555. printf("----------------------------------------------------\n");
  556. printf("名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
  557. for(k=;k<n;k++)
  558. printf("第%d科:%.3f ",k+,stu[j].ach[k]);
  559. printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
  560. }
  561. }
  562. printf("----------------------------------------------------");
  563. fclose(fp1);
  564. r10: return ;
  565. };
  566. int f11(int m,int n,char filename[L])
  567. {
  568. char output[L];
  569. float a=,b=,c=,d=,e=;
  570. struct student card;
  571. FILE *fp1,*fp2;
  572. fp1=fopen(filename,"rb");
  573. printf("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
  574. getchar();
  575. gets(output); ///接收输入
  576. fp2=fopen(output,"w");
  577. if(fp1==NULL)
  578. {
  579. printf("\n=====文件%s打开失败=====\n",filename);
  580. goto r11;
  581. }
  582. if(fp2==NULL)
  583. {
  584. printf("\n=====文件%s打开失败=====\n",output);
  585. goto r11;
  586. }
  587. i=;
  588. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  589. {
  590. stu[i].num=card.num;
  591. strcpy(stu[i].name,card.name);
  592. for(j=;j<n;j++)
  593. stu[i].ach[j]=card.ach[j];
  594. stu[i].total=card.total;
  595. i++;
  596. }
  597. fprintf(fp2,"=======================================各科目成绩分析=============================================\n总参考人数:%d\n考试科目数:%d\n",i,n);
  598. fprintf(fp2," 科目 优秀(比例) 良好(比例) 中等(比例) 及格(比例) 不及格(比例)\n");
  599. fprintf(fp2," <90-100> <80-89> <70-79> <60-69> <0-59>\n");
  600. fprintf(fp2,"==================================================================================================\n");
  601. for(k=;k<n;k++) ///课程
  602. {
  603. a=,b=,c=,d=,e=;
  604. for(j=;j<m;j++) ///学生
  605. {
  606. if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
  607. a++;
  608. else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
  609. b++;
  610. else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>))
  611. c++;
  612. else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
  613. d++;
  614. else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
  615. e++;
  616. }
  617. fprintf(fp2," 第%d科 %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%)\n",k+,a,a/m*,b,b/m*,c,c/m*,d,d/m*,e,e/m*);
  618. }
  619. printf("=====已经将所有信息写入到文件%s中,请注意接收!=====\n",output);
  620. r11: return ;
  621. };
  622. int f12(int m,int n,char filename[L])
  623. {
  624. struct student card;
  625. FILE *fp1;
  626. fp1=fopen(filename,"rb");
  627. if(fp1==NULL)
  628. {
  629. printf("\n=====文件%s打开失败=====\n",filename);
  630. goto r12;
  631. }
  632. i=;
  633. while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
  634. {
  635. stu[i].num=card.num;
  636. strcpy(stu[i].name,card.name);
  637. for(j=;j<n;j++)
  638. stu[i].ach[j]=card.ach[j];
  639. stu[i].total=card.total;
  640. i++;
  641. }
  642. for(k=;k<=i;k++)
  643. {
  644. for(j=k+;j<i;j++)
  645. if(stu[k].total<stu[j].total)
  646. {
  647. card=stu[k];
  648. stu[k]=stu[j];
  649. stu[j]=card;
  650. }
  651. }
  652. printf("=====学生所有信息屏幕输出=====\n");
  653. for(j=;j<i;j++)
  654. {
  655. printf("----------------------------------------------------\n");
  656. printf("名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
  657. for(k=;k<n;k++)
  658. printf("第%d科:%.3f ",k+,stu[j].ach[k]);
  659. printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
  660. }
  661. printf("----------------------------------------------------");
  662. fclose(fp1);
  663. r12: return ;
  664. };
  665. int f13(int m,int n,char filename[L])
  666. {
  667. char output[L]={};
  668. struct student card;
  669. FILE *fp1,*fp2;
  670. fp1=fopen(filename,"rb");
  671. printf("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
  672. getchar();
  673. gets(output); ///接收输入
  674. fp2=fopen(output,"w");
  675. if(fp1==NULL)
  676. {
  677. printf("\n=====文件%s打开失败=====\n",filename);
  678. goto r13;
  679. }
  680. if(fp2==NULL)
  681. {
  682. printf("\n=====文件%s打开失败=====\n",output);
  683. goto r13;
  684. }
  685. i=;
  686. while((fread(&card,LEN,,fp1))!=(int)NULL)
  687. {
  688. stu[i].num=card.num;
  689. strcpy(stu[i].name,card.name);
  690. for(j=;j<n;j++)
  691. stu[i].ach[j]=card.ach[j];
  692. stu[i].total=card.total;
  693. i++;
  694. }
  695. for(k=;k<=i;k++)
  696. {
  697. for(j=k+;j<i;j++)
  698. if(stu[k].total<stu[j].total)
  699. {
  700. card=stu[k];
  701. stu[k]=stu[j];
  702. stu[j]=card;
  703. }
  704. }
  705. printf("=====已经将所有信息写入到文件%s中,请注意接收!=====\n",output);
  706. for(j=;j<i;j++)
  707. {
  708. fprintf(fp2,"----------------------------------------------------\n");
  709. fprintf(fp2,"名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
  710. for(k=;k<n;k++)
  711. fprintf(fp2,"第%d科:%.3f ",k+,stu[j].ach[k]);
  712. fprintf(fp2,"\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
  713. }
  714. fprintf(fp2,"----------------------------------------------------");
  715. fclose(fp1);
  716. fclose(fp2);
  717. r13: return ;
  718. };

四、程序备注

这是笔者在大一刚学c的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份

笔者在vc6.0和codeblocks下均通过运行,进入系统的密码为LLL1996

本程序纯属原创,如有引用,请注明出处

[项目记录] 用c语言完成的一个学生成绩管理系统的更多相关文章

  1. 基于C语言文件操作的学生成绩管理系统

    原理 在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号.姓名.各科名称和成绩等并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找.浏览.插入.排 ...

  2. C语言项目:学生成绩管理系统

    C语言项目:学生成绩管理系统    1.数据结构:学生信息:学号.姓名.年龄.性别.3课成绩    2.功能:   (1)增加学生记录    (2)  删除学生记录    (3)  查找学生信息(学号 ...

  3. 【学生成绩管理系统】 大二c语言作业

    几年前写的了,只能在命令行窗口运行,虽然比较挫,还是有一定参考价值... #include <cstdio> #include <conio.h> #include <i ...

  4. 第一次写C语言小程序,可以初步理解学生成绩管理系统的概念

    1 成绩管理系统概述 1.1  管理信息系统的概念  管理信息系统(Management Information Systems,简称MIS),是一个不断发展的新型学科,MIS的定义随着科技的进步也在 ...

  5. C语言实现---学生成绩管理系统

    C语言实现了学生成绩管理系统,可以进行学生成绩的增加,删除,更新,查询,计算和展示. 完整代码如下: #include<stdio.h> #include<stdlib.h> ...

  6. C项目实践--学生成绩管理系统

    1.功能需求分析 学生成绩管理系统是对学生基本信息及成绩的管理.本程序主要实现了对学生的学号.姓名等基本信息以及各项学科成绩进行增加.删除.修改.查询和保存到磁盘文件等操作.主要功能描述如下: (1) ...

  7. C语言小练习之学生信息管理系统

    C语言小练习之学生信息管理系统 main.c文件   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 2 ...

  8. Java项目:学生成绩管理系统(二)

    学生成绩管理系统(二):项目介绍 一.设计要求: 1.1 简单的图形界面登录功能. 1.2 对数据库的的信息的查询功能. 1.3 对数据库的的信息的修改功能. 1.4 对数据库的的信息的删除功能. 1 ...

  9. Java项目:学生成绩管理系统(一)

    学生成绩管理系统(一) 项目名称:学生成绩管理系统 项目需求分析(Need 需求): (1)该系统的用户分为教师和学生.教师的功能有:管理某一学生或课程的信息以及成绩,包括增.删.查.报表打印等:学生 ...

随机推荐

  1. [CSS3] 学习笔记-CSS3常用操作

    1.对齐操作 使用margin属性进行水平对齐:使用position进行左右对齐:使用float属性进行左右对齐. <!doctype html> <html> <hea ...

  2. codeforces div2.C

    C. New Year and Rating time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. 快速排序时间复杂度为O(n×log(n))的证明

    快速排序时间复杂度为O(n×log(n))的证明 之前只知道快速排序的平均时间复杂度为O(n×log(n)),最糟糕时复杂度为O(n^2),但却不知道具体原因,今天好好证明一下,最后部分摘自<算 ...

  4. TFS2010升级至TFS2013完全指南

    一.背景:         公司已使用tfs2010很长时间,目前随着公司的发展,项目越来越少,而产品越来越多,采用的开发模式,也逐渐从瀑布式.迭代式转向敏捷开发.为了更好的支持产品研发,决定将tfs ...

  5. 关于js的parseInt方式在不同浏览器下的表现

    今天开发期间遇到个需求要把日期格式转换成毫秒数 日期为:2015-08-10 split之后使用parseInt将2015,08,10分别转化为数字格式. 但是使用parseInt('08')的时候却 ...

  6. Xamarin开发IOS系列教程一:安装黑苹果

    经过一番思想挣扎和斗争之后,最终还是选择采用Xamarin来开发跨平台移动应用,好处和优点大家可以搜索其它博文,因为家里面穷加上谈了恋爱,就不买苹果了,开发阶段在Windows上面直接搞定哈,时候不早 ...

  7. python实现多变量线性回归(Linear Regression with Multiple Variables)

    本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...

  8. 有关HTTP的粗读

    .mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...

  9. 使用jQuery快速高效制作网页交互特效

    第四章:JQuery选择器 1.Jquery选择器简介 (1) Jquery中的选择器完全继承了CSS的风格,利用Jquery选择器,可以非常便捷和快速的找出特定的Dom元素,然后为他们添加相应的行为 ...

  10. burp插件开发

    最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下: 第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续的代码开发: 第二 ...