黑马程序员技术交流社区

标题: 编写一个学生管理系统程序,用来记录学生的信息(包括... [打印本页]

作者: 恋梦    时间: 2015-2-8 00:04
标题: 编写一个学生管理系统程序,用来记录学生的信息(包括...
本帖最后由 恋梦 于 2015-3-28 00:44 编辑

同样,废话不多说,虽然论坛里已经有一个这种类似的贴子了,但我感觉还是太少,所以想了想还是把我的这个贴子发出来,因为这个思路确实太乱了,太深了,而且我感觉这道题就是个坑,零基础怎么可能全都能弄出来,反正我是零基础,所以我把这个贴子贴出来让给同样类似的零基础的一个思路,另注明,里面函数命名乱七八糟的基本要靠猜,代码相当不规范,还有部分没有注释,如果不是为了赶时间我会再好好调适的,还有一点就是目前有个问题未解决就是scanf挡不住程序运行,所以我在前面加了个getchar();,所以一开始要多输一个无用的字符,才是程序正式开始使用。如果有谁能帮我解决这个问题,还望给我回个贴我看下怎么解决,谢谢。
如果对你有帮忙,求个赞。[hide=d20]//
  1. //  main.c
  2. //  测试题9
  3. //
  4. //  Created by osx on 15-2-5.
  5. //  Copyright (c) 2015年 osx. All rights reserved.
  6. //

  7. // 9、 编写一个学生管理系统程序,用来记录学生的信息(包括姓名、年龄、性别、学号、分数),提供增加、删除、查询学生信息的入口。(C语言)

  8. #include <stdio.h>
  9. #include <string.h>

  10. void gongNing (); // 增加、删除、查询的功能声明
  11. void zengJia(); // 增加功能声明
  12. void shanchu(); // 删除功能声明
  13. void chaxun(); // 查询功能声明
  14. void xuehao();
  15. void xingming();
  16. void xingbie();
  17. void fenshu();
  18. void suoyou();
  19. void shanchuxingming();
  20. void shanchuxuehao();
  21. void shanchuxingbie();
  22. void shanchufenshu();
  23. void shanchusuoyou();

  24. // 定义一个学生的结构体
  25. struct Student
  26. {
  27.     char name[10]; // 姓名
  28.     int age; // 年龄
  29.     char set[10]; // 姓别
  30.     int number;  // 学号
  31.     double score; // 分数
  32. } ;
  33. // 定义一个学生数组可放100人
  34. struct Student str[100];

  35. int main()
  36. {
  37.     // 提示用户登陆学生管理系统
  38.     //    printf("欢迎登陆学生管理系统\n");
  39.     printf("\n\n\n\n\t\t\t\t\t\t 欢迎使用学生管理系统!\n");
  40.    
  41.     // 调用功能
  42.     gongNing();
  43.    
  44.    
  45.     // 程序归零,正常退出
  46.     return 0;
  47. }
  48. // 所有功能定义
  49. void gongNing ()
  50. {
  51.     // 保证功能函数一直不退出循环,想退出的时候再退出(可退出的死循环)
  52.     for (; ; ) {

  53.     // 定义功能的标识
  54.     int n = 0;
  55.    
  56.     // 提示用户输入
  57.     printf("\t\t\t\t\t\t*******************\n");
  58.     printf("\t\t\t\t\t\t   1.增加学生信息\n");
  59.     printf("\t\t\t\t\t\t   2.删除学生信息\n");
  60.     printf("\t\t\t\t\t\t   3.查询学生信息\n");
  61.     printf("\t\t\t\t\t\t   退出系统按任意键\n");
  62.     printf("\t\t\t\t\t\t*******************\n");
  63.    
  64.     // 接收用户的选择
  65.     getchar();
  66.     scanf("%d", &n);
  67.    
  68.     // 定义用户所需进入的选择
  69.     if (n == 1)
  70.     {
  71.         zengJia(); // 增加
  72.     }
  73.     else if (n == 2)
  74.     {
  75.         shanchu(); // 删除
  76.     }
  77.     else if (n == 3)
  78.     {
  79.         chaxun(); // 查询
  80.     }
  81.     else {
  82.         break;
  83.     }
  84.    
  85.     }
  86. }

  87. // 增加功能定义
  88. void zengJia()
  89. {
  90.     // 定义学生数组每个人的信息
  91.     static int i;
  92.     while (i<100) {
  93.         printf("请输入该学生的姓名\n");
  94.         scanf("%s",str.name);
  95.         printf("请输入该学生的年龄(5岁-30岁之间)\n");
  96.         scanf("%d",&str.age);
  97.         // 检察年龄是否适当(5岁-30岁之间)
  98.         while  (str.age<5 || str.age>30)
  99.         {
  100.             printf("对不起您的学生年龄输入可能有误\n");
  101.             printf("请重新输入该学生年龄\n");
  102.             getchar();
  103.             scanf("%d",&str.age);
  104.         }
  105.         
  106.         printf("请输入该学生的性别(man或woman)\n");
  107.         scanf("%s",str.set);
  108.         // 只能输入男或女或man或woman
  109.         while ((strcmp("man",str.set)!=0) && (strcmp("woman",str.set)!=0))
  110.         {
  111.             printf("您输入的性别有误\n请重新输入\n");
  112.             scanf("%s",str.set);
  113.         }
  114.         
  115.         printf("请输入该学生的学号\n");
  116.         scanf("%d",&str.number);
  117.         // 检察学号是否相同,学号具有惟一性,不能同时给多人赋值
  118.         for (int a = 0; a<i; a++)
  119.         {
  120.             while  (str.number == str[a].number)
  121.             {
  122.                 printf("对不起学号具有惟一性,不能同时给多人同一学号\n");
  123.                 printf("请重新输入该学生的学号\n");
  124.                 scanf("%d",&str.number);
  125.             }
  126.         }
  127.         printf("请输入该学生的分数\n");
  128.         scanf("%lf",&str.score);
  129.         // 检察分数是否适当
  130.         while  (str.score<0 || str.score>100)
  131.         {
  132.             printf("对不起您的考生考分不符合判卷标准\n");
  133.             printf("请重新输入该学生的分数\n");
  134.             scanf("%lf",&str.score);
  135.         }
  136.         
  137.         // 确保每次调用函数都输入下一个数组的信息
  138.         i++;
  139.         printf("是否继续添加,请按1,返回菜单请按任意键\n");
  140.         int a = 0;
  141.         scanf("%d", &a);
  142.         if (a == 1)
  143.         {
  144.             zengJia();
  145.             break;
  146.         }
  147.         else
  148.         {
  149.             break;
  150.         }
  151.     }
  152. }
  153. // 删除功能定义
  154. void shanchu()
  155. {
  156.     printf("请输入需要删除的选择\n学号删除请按1\n姓名删除请按2\n性别删除请按3\n分数删除请按4\n删除所有请按5\n返回请按任意键\n");
  157.     int a = 0;
  158.     scanf("%d",&a);
  159.     if (a == 1) {
  160.         shanchuxuehao();
  161.     } else if (a == 2) {
  162.         shanchuxingming();
  163.     } else if (a == 3) {
  164.         shanchuxingbie();
  165.     } else if (a == 4) {
  166.         shanchufenshu();
  167.     } else if (a == 5){
  168.         shanchusuoyou();
  169.     }
  170. }
  171. void shanchuxuehao()
  172. {
  173.     // 提示用户需要删除该学生的学号
  174.     printf("请输入需要删除该学生的学号\n");
  175.     int n = 0;
  176.     scanf("%d",&n);
  177.     // 找到这个学号对应的数组
  178.     for (int i = 0,count = 0; i<100; i++)
  179.     {
  180.         // 定义一个空的学生变量a
  181.         struct Student a;
  182.         // 如果数组某一个元素的学号与需要删除的学号相等
  183.         if (str.number == n)
  184.         {
  185.             printf("您要删除的学生姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n如不是很按1(跳过继续查找),返回请按2,删除请按任意键\n",str.name, str.age, str.set, str.number,str.score);
  186.             int b = 0;
  187.             scanf("%d",&b);
  188.             if (b==1) {
  189.                 continue;
  190.             } else if (b ==2) {
  191.                 shanchu();
  192.             } else {
  193.                 str = a; // 然后将这个数组元素清空
  194.                 --count;
  195.             };
  196.         }
  197.         ++count;
  198.         if (count==100) {
  199.             printf("无此学生\n");
  200.             shanchu();
  201.         }
  202.     }
  203.    
  204. }
  205. void shanchuxingming()
  206. {
  207.     // 提示用户需要删除该学生的学姓名
  208.     printf("请输入需要删除该学生的姓名\n");
  209.     char n[10] = {0};
  210.     scanf("%s",n);
  211.     // 找到这个性别对应的数组
  212.     for (int i = 0,count = 0; i<100; i++)
  213.     {
  214.         // 定义一个空的学生变量a
  215.         struct Student a;
  216.         // 如果数组某一个元素的姓名与需要删除的姓名相等
  217.         if (strcmp(str.name, n) == 0)
  218.         {
  219.             printf("您要删除的学生姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n如不是很按1(跳过继续查找),返回请按2,删除请按任意键\n",str.name, str.age, str.set, str.number,str.score);
  220.             int b = 0;
  221.             scanf("%d",&b);
  222.             if (b==1) {
  223.                 continue;
  224.             } else if (b ==2) {
  225.                 shanchu();
  226.             } else {
  227.                 str = a; // 然后将这个数组元素清空
  228.                 --count;
  229.             };
  230.         }
  231.         ++count;
  232.         if (count==99) {
  233.             printf("无此学生\n");
  234.             shanchu();
  235.         }
  236.     }
  237. }
复制代码



作者: 恋梦    时间: 2015-2-8 00:05
  1. void shanchuxingbie()
  2. {
  3. // 提示用户需要删除该学生的学姓别
  4. printf("请输入需要删除该学生的姓别(man或woman)\n");
  5. char n[10] = {0};
  6. scanf("%s",n);
  7. // 找到这个性别对应的数组
  8. for (int i = 0,count = 0; i<100; i++)
  9. {
  10. // 定义一个空的学生变量a
  11. struct Student a;
  12. // 如果数组某一个元素的姓名与需要删除的姓名相等
  13. if (strcmp(str[i].set, n) == 0)
  14. {
  15. printf("您要删除的学生姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n如不是很按1(跳过继续查找),返回请按2,删除请按任意键\n",str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  16. int b = 0;
  17. scanf("%d",&b);
  18. if (b==1) {
  19. continue;
  20. } else if (b ==2) {
  21. shanchu();
  22. } else {
  23. str[i] = a; // 然后将这个数组元素清空
  24. --count;
  25. };
  26. }
  27. ++count;
  28. if (count==99) {
  29. printf("无此学生\n");
  30. shanchu();
  31. }
  32. }

  33. }
  34. void shanchufenshu()
  35. {
  36. // 提示用户需要删除该学生的分数
  37. printf("请输入需要删除多少学生的分数以内的数据用“-”(如:90-100,单个成绩100-100)\n");
  38. int n = 0,m = 0;
  39. scanf("%d-%d",&n, &m);
  40. for (;n <= m;n++)
  41. {
  42. // 找到这个学号对应的数组
  43. for (int i = 0,count = 0; i<100; i++)
  44. {
  45. // 定义一个空的学生变量a printf("您要删除的学生是%d-%d将被删除,返回请按2,确认请按任意键\n",n,m);
  46. struct Student a;
  47. // 如果数组某一个元素的学号与需要删除的学号相等
  48. if (str[i].number == n)
  49. {
  50. str[i] = a; // 然后将这个数组元素清空
  51. --count;
  52. }
  53. ++count;
  54. if (count==99) {
  55. printf("无此学生\n");
  56. shanchu();
  57. }
  58. }
  59. }
  60. }
  61. void shanchusuoyou()
  62. {
  63. for (int i = 0; i<100; i++) {
  64. struct Student a;
  65. // 如果数组某一个元素的姓名与需要删除的姓名相等

  66. printf("您将要删除所有学生信息,返回请按1,删除请按任意键\n");
  67. int b = 0;
  68. scanf("%d",&b);
  69. if (b==1) {
  70. continue;
  71. } else if (b ==2) {
  72. shanchu();
  73. } else {
  74. str[i] = a; // 然后将这个数组元素清空
  75. };
  76. }
  77. }

  78. // 查询功能定义
  79. void chaxun()
  80. {
  81. printf("按学号查询请按1\n按姓名查询请按2\n按性别查询请按3\n按分数查询请按4\n查询所有(按录入顺序)请按5\n");
  82. int a = 0;
  83. scanf("%d", &a);
  84. if (a==1) {
  85. xuehao();
  86. } else if (a == 2) {
  87. xingming();
  88. } else if (a == 3) {
  89. xingbie();
  90. } else if (a == 4) {
  91. fenshu();
  92. } else if (a == 5) {
  93. suoyou();
  94. }
  95. printf("是否继续查询,查询请按1,返回菜单请按任意键\n");
  96. int b = 0;
  97. scanf("%d",&b);
  98. if (b == 1) {
  99. chaxun();
  100. }
  101. }
  102. void suoyou()
  103. {
  104. printf("从录入顺序\n");
  105. for (int i = 0; i<=99; i++) {
  106. printf("第%d个的姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n",(i+1),str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  107. }
  108. }
  109. void fenshu()
  110. {
  111. // 提示用户输入需要查询的学生分数
  112. printf("请输入需要查询的学生分数\n");
  113. double n = 0;
  114. scanf("%lf",&n);
  115. // 将这个分数找出
  116. for (int i = 0,count = 0; i<100; i++)
  117. {
  118. // 如果数组的某一个元素分数与需要查找的元素分数相等
  119. if (str[i].score == n)
  120. {
  121. // 打印这个学生元素的所有信息
  122. printf("该学生的姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n",str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  123. --count;
  124. }
  125. ++count;
  126. // 遍历每一个分数,如果找不到打印无此学生,退出此功能
  127. if (count==100)
  128. {
  129. printf("无此学生\n");
  130. break;
  131. }
  132. }

  133. }

  134. void xingbie()
  135. {
  136. // 提示用户输入需要查询的学生姓别
  137. printf("请输入需要查询的学生姓别\n");
  138. char n[10] = {0};
  139. scanf("%s",n);
  140. // 将这个姓别找出
  141. for (int i = 0,count = 0; i<100; i++)
  142. {
  143. // 如果数组的某一个元素姓别与需要查找的元素姓别相等
  144. if (strcmp(str[i].set, n) == 0)
  145. {
  146. // 打印这个学生元素的所有信息
  147. printf("该学生的姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n",str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  148. --count;
  149. }
  150. ++count;
  151. // 遍历每一个姓别,如果找不到打印无此学生,退出此功能
  152. if (count == 100)
  153. {
  154. printf("无此学生\n");
  155. break;
  156. }
  157. }

  158. }

  159. void xingming()
  160. {
  161. // 提示用户输入需要查询的学生姓名
  162. printf("请输入需要查询的学生姓名\n");
  163. char n[10] = {0};
  164. scanf("%s",n);
  165. // 将这个姓名找出
  166. for (int i = 0, count = 0; i<100; i++)
  167. {
  168. // 如果数组的某一个元素姓名与需要查找的元素姓名相等
  169. if (strcmp(str[i].name, n) == 0)
  170. {
  171. // 打印这个学生元素的所有信息
  172. printf("该学生的姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n",str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  173. --count;
  174. }
  175. // 遍历每一个姓名,如果找不到打印无此学生,退出此功能
  176. ++count;
  177. if (count==100)
  178. {
  179. printf("无此学生\n");
  180. break;
  181. }

  182. }

  183. }
  184. void xuehao()
  185. {
  186. // 提示用户输入需要查询的学生学号
  187. printf("请输入需要查询的学生学号\n");
  188. int n = 0;
  189. scanf("%d",&n);
  190. // 将这个学号找出
  191. for (int i = 0; i<100; i++)
  192. {
  193. // 如果数组的某一个元素学号与需要查找的元素学号相等
  194. if (str[i].number == n)
  195. {
  196. // 打印这个学生元素的所有信息
  197. printf("该学生的姓名是%s、年龄是%d、性别是%s、学号是%d、分数是%f\n",str[i].name, str[i].age, str[i].set, str[i].number,str[i].score);
  198. break;
  199. }
  200. // 遍历每一个学号,如果找不到打印无此学生,退出此功能
  201. else if (i == 99)
  202. {
  203. printf("无此学生\n");
  204. break;
  205. }
  206. }

  207. }
  208. [/hide]
复制代码

作者: byuan04    时间: 2015-2-8 00:13
同做这道题 感觉难度和之前人做的完全不是一个级别的
作者: 恋梦    时间: 2015-2-8 00:17
byuan04 发表于 2015-2-8 00:13
同做这道题 感觉难度和之前人做的完全不是一个级别的

你感觉难还是不难
作者: Zeus-S    时间: 2015-2-8 00:19
没这题,不过感觉好难
作者: byuan04    时间: 2015-2-8 00:37
恋梦 发表于 2015-2-8 00:17
你感觉难还是不难

零基础还是很难的...
作者: 恋梦    时间: 2015-2-8 00:39
byuan04 发表于 2015-2-8 00:37
零基础还是很难的...

我同样是零基础不过学了一个多月了,已经把视频全部学完了,但是光凭学完的视频做出这些来,可能性并不大,因为这里面我用到了几个很小的功能都是零基础里面没有讲过的

作者: cararila    时间: 2015-2-8 00:54
好贴,点赞!
作者: Kuaile天使    时间: 2015-2-8 01:13
恋梦 发表于 2015-2-8 00:05

死循环可以考虑用while(1)多重判断可以考虑用switch。代码可以优化一下,嘿嘿。
作者: xiezhongmin    时间: 2015-2-8 09:18
又不是要你开发项目,写这么多干啥,就是几个函数的事!
作者: 恋梦    时间: 2015-2-8 09:21
xiezhongmin 发表于 2015-2-8 09:18
又不是要你开发项目,写这么多干啥,就是几个函数的事!

我哪知道这是什么要求呀,所以尽量写好一点吧
再者说,自己写一个这个东西,真的进步很大
作者: Micro    时间: 2015-2-8 10:09
我只想问你是怎么把代码行数给弄上去的
作者: xiezhongmin    时间: 2015-2-8 10:58
iOS开发用到C的地方不多,赶紧学OC吧,浪费那个时间,别人早就成大神了
作者: 陈明辉    时间: 2015-3-20 19:31
最近也在为这个题发愁,来看看
作者: 魏建国    时间: 2015-3-27 23:08
题目看似很短,其实功能很多,看完这些需要好久,学习一下
作者: 魏建国    时间: 2015-3-29 03:49
我刚写完这个题目,我用的时switch ,一输入字母就GG,完全挡不住,我最后就直接说输入其它数字返回上一菜单,不让他们输入字母了,坑爹

作者: 张亚超2015    时间: 2015-5-23 13:17
我也是这道题,感觉好难啊。。。。估计自己的知识量还不够吧

作者: 771288886    时间: 2015-6-22 21:41
我也是零基础,零基础学起来真难
作者: 红双喜    时间: 2015-8-16 23:53
要是抽到这个题   可真是得先哭一会。
作者: jacob_ios    时间: 2015-11-3 15:54
是不是运气不出来哦?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2