A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 evenzhu1989 于 2015-6-1 19:23 编辑

这是我做基础测试题遇到的最难的题,代码是在如意大师的“通讯录”基础上修改而来,现在将代码贴出来,希望和同学们可以一起交流和讨论
  1. /*
  2. 9、 编写一个学生管理系统程序,用来记录学生的信息(包括姓名、年龄、性别、学号、分数),提供增加、删除、查询学生信息的入口。(C语言)
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. //定义宏
  7. #define N 100 //定义通讯录容量
  8. #define NAMELEN 22
  9. #define AGELEN 16
  10. #define SEXLEN 4
  11. #define STUNUMLEN 22
  12. #define SCORELEN 16
  13. #define NUMLEN 12
  14. //定义部分
  15. //定义学生的结构体
  16. typedef struct
  17. {
  18.     //学生姓名
  19.     char name[NAMELEN];
  20.     //学生年龄
  21.     char age[AGELEN];
  22.     //学生性别
  23.     char sex[SEXLEN];
  24.     //学生学号
  25.     char stuNum[STUNUMLEN];
  26.     //分数
  27.     char score[SCORELEN];
  28. }Student;
  29. //存储所有学生的数组
  30. Student students[N];//能够存储100个学生
  31. //定义学生的个数
  32. int totalStudentCount=0;
  33. //接收用户输入的编号
  34. int fno;
  35. //定义数据文件保存位置
  36. char *filePath="telbook.data";
  37. //**************函数的声明部分***************
  38. int valifateInput(int num,int min, int max);
  39. //添加学生
  40. void doAdd();
  41. //删除学生
  42. void doDelete();
  43. //修改学生
  44. void doUpdate();
  45. //显示学生
  46. void doList();
  47. //搜索学生
  48. void doSearchByName();
  49. //通讯里初始化
  50. void init();
  51. //将数组写入文件
  52. void writeFile();
  53. int main(int argc, const char * argv[]) {
  54.      init();
  55.      printf("学生信息初始化完成");
  56.      while (1) {
  57.          printf("\n");
  58.          //软件的界面
  59.          printf("**************************\n");
  60.          printf("** 欢迎使用学生信息管理系统 **\n");
  61.          printf("****** 1、添加学生  ******\n");
  62.          printf("****** 2、删除学生  ******\n");
  63.          printf("****** 3、修改学生  ******\n");
  64.          printf("****** 4、查看所有学生  ***\n");
  65.          printf("****** 5、查询学生  ******\n");
  66.          printf("****** 6、退出系统  ********\n");
  67.          printf("**************************\n");
  68.          //提示用户选择序号
  69.          printf("请选择1-6之间的功能编号:\n");
  70.          scanf("%d",&fno);
  71.          //判断编号是否合法
  72.          valifateInput(fno, 1, 6);
  73.          switch (fno) {
  74.              case 1:
  75.                  //添加
  76.                  doAdd();
  77.                  break;
  78.              case 2:
  79.                  //删除
  80.                  doDelete();
  81.                  break;
  82.              case 3:
  83.                  //修改
  84.                  doUpdate();
  85.                  break;
  86.              case 4:
  87.                  //显示所有学生
  88.                  doList();
  89.                  break;
  90.              case 5:
  91.                  //查找
  92.                  doSearchByName();
  93.                  break;
  94.              case 6:
  95.                  //退出
  96.                  printf("系统已经退出!\n");
  97.                  return 0;
  98.                  break;
  99.              default:
  100.                  break;
  101.          }
  102.      }
  103.     return 0;
  104. }
  105. //验证输入是否合法,1非法0正确
  106. int valifateInput(int num,int min, int max)
  107. {
  108.     if (num<min || num>max) {
  109.         printf("非法输入!");
  110.         return 1;
  111.     }
  112.     return 0;
  113. }
  114. //添加学生
  115. void doAdd()
  116. {
  117.     printf("您选择的是添加学生,你按提示操作:\n");
  118.     //提示用户输入学生姓名
  119.     printf("请输入学生姓名:(*注意学生姓名不能有空格)\n");
  120.     //接收学生姓名
  121.     scanf("%s",students[totalStudentCount].name);
  122.     //提示用户输入学生年龄
  123.     printf("请输入学生年龄:(*注意学生年龄不能有空格)\n");
  124.     //接收学生年龄
  125.     scanf("%s",students[totalStudentCount].age);
  126.     //提示输入学生性别
  127.     printf("请输入学生性别:(*注意学生性别不能有空格)\n");
  128.     //接收学生性别
  129.     scanf("%s",students[totalStudentCount].sex);
  130.     //提示输入学生学号
  131.     printf("请输入学生学号:(*注意学生学号不能有空格)\n");
  132.     //接收学生学号
  133.     scanf("%s",students[totalStudentCount].stuNum);
  134.     //提示输入学生分数
  135.     printf("请输入学生分数:(*注意学生分数不能有空格)\n");
  136.     //接收学生分数
  137.     scanf("%s",students[totalStudentCount].score);
  138.     //提示是否确认添加
  139.     int flag;
  140.     printf("您确认要添加吗?1、确认 0、取消\n");
  141.     scanf("%d",&flag);
  142.     if (flag) {
  143.         //学生+1
  144.         totalStudentCount++;
  145.         //把学生写入文件
  146.         writeFile();
  147.     }
  148. }

  149. //删除学生
  150. void doDelete()
  151. {
  152.     printf("您选择的是删除学生,你按提示操作:\n");
  153.     doList();//将所有学生显示出来供删除
  154.     //提示用户输入一个学生编号
  155.     int no;
  156.     printf("请输入要删除学生编号:\n");
  157.     scanf("%d",&no);
  158.     //判断输入的编号是否合法
  159.     if (valifateInput(no,1, totalStudentCount)) {
  160.         return ;
  161.     }
  162.     //提示用户再次确认删除
  163.     int flag;
  164.     printf("删除学生后数据将无法恢复,您确认要删除吗?1、确认 0、取消\n");
  165.     scanf("%d",&flag);
  166.     if (flag) {
  167.         //开始删除学生
  168.         //删除的学生是最后一个学生
  169.         if (no==totalStudentCount) {
  170.             totalStudentCount--;
  171.         }else //删除的学生不是最后一个学生
  172.         {
  173.             for (int i=no; i<totalStudentCount; i++) {
  174.                 //将后一个元素的移动和覆盖到前一个元素,得到删除的效果
  175.                 students[no-1]=students[no];
  176.             }
  177.             //学生少一个
  178.             totalStudentCount--;
  179.         }
  180.         //将数组同步到文件中
  181.         writeFile();
  182.     }
  183. }
  184. //修改学生
  185. void doUpdate()
  186. {
  187.     printf("您选择的是修改学生,你按提示操作:\n");
  188.     doList();//展示所有学生信息供修改
  189.     //提示用户输入一个学生编号
  190.     int no;
  191.     printf("请输入要删除学生编号:\n");
  192.     scanf("%d",&no);
  193.     //判断输入的编号是否合法
  194.     if (valifateInput(no,1, totalStudentCount)) {
  195.         return ;
  196.     }
  197.     //输入新的学生信息
  198.     char newname[NAMELEN];
  199.     char newage[AGELEN];
  200.     char newsex[SEXLEN];
  201.     char newstuNum[STUNUMLEN];
  202.     char newscore[SCORELEN];
  203.     //提示用户输入学生姓名
  204.     printf("请输入学生姓名:(*注意学生姓名不能有空格)\n");
  205.     //接收学生姓名
  206.     scanf("%s",newname);
  207.     //提示用户输入学生年龄
  208.     printf("请输入学生年龄:(*注意学生年龄不能有空格)\n");
  209.     //接收学生年龄
  210.     scanf("%s",newage);
  211.     //提示输入学生性别
  212.     printf("请输入学生性别:(*注意学生性别不能有空格)\n");
  213.     //接收学生性别
  214.     scanf("%s",newsex);
  215.     //提示输入学生学号
  216.     printf("请输入学生学号:(*注意学生学号不能有空格)\n");
  217.     //接收学生学号
  218.     scanf("%s",newstuNum);
  219.     //提示输入学生分数
  220.     printf("请输入学生分数:(*注意学生分数不能有空格)\n");
  221.     //接收学生分数
  222.     scanf("%s",newscore);
  223.     //让用户确认更新
  224.     int flag;
  225.     printf("确认修改后信息将永久修改,确认修改吗?1、确认 0、取消\n");
  226.     scanf("%d",&flag);
  227.     if (flag) {
  228.         //更新数组
  229.         strcpy(students[no-1].name, newname);
  230.         strcpy(students[no-1].age, newage);
  231.         strcpy(students[no-1].sex, newsex);
  232.         strcpy(students[no-1].stuNum, newstuNum);
  233.         strcpy(students[no-1].score, newscore);
  234.         //写入文件
  235.         writeFile();
  236.     }
  237. }
  238. //显示学生
  239. void doList()
  240. {
  241.    printf("显示所有学生,学生如下:\n");
  242.     //判断学生信息是否为空
  243.     if (totalStudentCount==0) {
  244.         printf("学生信息为空,请添加!");
  245.     }
  246.     else
  247.     {
  248.         //输出格式
  249.         printf("编号\t     姓名\t     年龄\t     性别\t     学号\t     分数\t\n");
  250.         //不为空,遍历学生数组
  251.         for (int i=0; i<totalStudentCount; i++) {
  252.             printf("%d\t     %s\t     %s\t     %s\t     %s\t     %s\t\n",i+1,students[i].name,students[i].age,students[i].sex,students[i].stuNum,students[i].score);
  253.         }
  254.     }
  255. }
  256. //搜索学生
  257. void doSearchByName()
  258. {
  259.     printf("您选择的是搜索学生,你按提示操作:\n");
  260.     char name1[NAMELEN];
  261.     //提示用户输入要搜索的学生姓名
  262.     printf("请输入要查找的学生姓名:\n");
  263.     scanf("%s",name1);
  264.     //按照姓名进行查找
  265.     int i;
  266.     for (i = 0; i<totalStudentCount; i++) {
  267.         //比较两个字符串是否相等
  268.         if(strcmp(students[i].name, name1)==0)
  269.         {
  270.             //打印出姓名对应的电话号码
  271.             //printf("您搜索的学生%s的电话是%s:\n",name1,contacts[i].telNum);
  272.             printf("您搜索的学生信息是:\n");
  273.             printf("姓名\t     年龄\t     性别\t     学号\t     分数\t\n");
  274.             printf("%s\t     %s\t     %s\t     %s\t     %s\t\n",students[i].name,students[i].age,students[i].sex,students[i].stuNum,students[i].score);
  275.             break;//循环停止
  276.         }
  277.     }
  278.     //当i与totalStudentCount相等时,表示遍历完后没找到此人
  279.     if (i==totalStudentCount) {
  280.         printf("查无此人!\n");
  281.     }
  282.    
  283. }

复制代码


18 个回复

倒序浏览
  1. void init()
  2. {
  3.     //定义文件指针,并且打开文件
  4.     FILE *fp = fopen(filePath, "r");
  5.    
  6.     if (fp != NULL) {
  7.         //第一步:读取学生的个数
  8.         fread(&totalStudentCount, sizeof(totalStudentCount), 1, fp);
  9.         //第二步:读取每一个学生
  10.         for (int i=0; i<totalStudentCount; i++) {
  11.             //读取学生数据到学生数组
  12.             fread(&students[i], sizeof(Student), 1, fp);
  13.         }
  14.     }else
  15.     {
  16.         //创建文件
  17.         fp = fopen(filePath, "wb");
  18.         //写入学生个数
  19.         fwrite(&totalStudentCount, sizeof(totalStudentCount), 1, fp);
  20.         printf("学生信息文件创建成功!\n");
  21.     }
  22.     //关闭文件指针
  23.     fclose(fp);
  24. }

  25. //将数组写入文件
  26. void writeFile()
  27. {
  28.     //以wb方式打开文件
  29.     FILE *fp = fopen(filePath, "wb");
  30.    
  31.     if (fp!=NULL) {
  32.         //先写学生个数
  33.         fwrite(&totalStudentCount, sizeof(totalStudentCount), 1, fp);
  34.         //写学生数据
  35.         for (int i=0; i<totalStudentCount; i++) {
  36.             //每次都写入一个数组元素
  37.             fwrite(&students[i], sizeof(students), 1, fp);
  38.         }
  39.         printf("文件数据更新成功!\n");
  40.     }
  41.    
  42.     //关闭指针
  43.     fclose(fp);
  44. }
复制代码
回复 使用道具 举报
祝你好运
回复 使用道具 举报

彼此彼此
回复 使用道具 举报
厉害!!!!!:D
回复 使用道具 举报
学习学习!!!
回复 使用道具 举报
写这么长啊,赞
回复 使用道具 举报
基础测试这么变态啊
回复 使用道具 举报
C语言也可以创建对象
但是这是基础题吗?!
回复 使用道具 举报
Dariel 发表于 2015-6-2 08:23
基础测试这么变态啊

题目只是说只要给入口就行了,没有说要实现功能,不过还是写完了
回复 使用道具 举报
talent123 发表于 2015-6-2 08:56
C语言也可以创建对象
但是这是基础题吗?!

是的,一不小心抽到了
回复 使用道具 举报

菜鸟起飞阶段
回复 使用道具 举报
lyricdon 发表于 2015-6-1 23:25
学习学习!!!

共同学习
回复 使用道具 举报

百来行吧,不算长的吧
回复 使用道具 举报
talent123 发表于 2015-6-2 08:56
C语言也可以创建对象
但是这是基础题吗?!

你说的对象是这里的结构体吧?
回复 使用道具 举报
感觉好变态,复制代码学习下
回复 使用道具 举报
过来 学习  一起进步
回复 使用道具 举报
这个我觉得是不是创建个链表更方便? 这么大的数据都放到栈里是不是有点过分?
回复 使用道具 举报
cui0wei0 发表于 2015-6-2 18:26
这个我觉得是不是创建个链表更方便? 这么大的数据都放到栈里是不是有点过分? ...

恩,是的,有空就改改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马