当前位置:   article > 正文

C语言学生管理系统(最终版本)_c语言管理系统

c语言管理系统

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #define FILE_NAME "student.csv"
  5. #define RD_ID (1<<0)
  6. #define RD_NAME (1<<1)
  7. #define RD_SCORE (1<<2)
  8. //描述1个学生的属性
  9. struct student
  10. {
  11. int ID;
  12. char name[20];
  13. float score;
  14. };
  15. //创建链表的节点数据结构
  16. struct node
  17. {
  18. struct student data;//该节点的数据域
  19. struct node *next;//该节点的指针域
  20. };
  21. void GetInfo(struct student *p,unsigned char flag);
  22. int menu(void); //菜单函数声明
  23. int add(struct node *p); //添加
  24. int del(struct node *p); //删除
  25. int change(struct node *p); //修改
  26. int find(struct node *p); //查找
  27. void all_pri(struct node *p); //打印所有
  28. //int quit(void); //退出
  29. int save(struct node *p); //保存
  30. void read(struct node *p); //读取保存的文件
  31. struct node *head = NULL; //指向头节点的指针变量
  32. static int Add1(struct node *p,struct student temp);
  33. int close(struct node *p1);
  34. int main()
  35. {
  36. int num=0;
  37. read(head);
  38. while(1)
  39. {
  40. num = menu();
  41. switch(num)
  42. {
  43. case 1:add(head);break;
  44. case 2:del(head);break;
  45. case 3:change(head);break;
  46. case 4:find(head);break;
  47. case 5:all_pri(head);break;
  48. case 6:save(head);return 0;
  49. }
  50. }
  51. }
  52. int menu(void)
  53. {
  54. int num;
  55. printf("\t\t*****欢迎进入学生管理系统*****\n");
  56. printf("\t\t***** 1 添加学生 ***** \n");
  57. printf("\t\t***** 2 删除学生 ***** \n");
  58. printf("\t\t***** 3 修改学生 ***** \n");
  59. printf("\t\t***** 4 查找学生 ***** \n");
  60. printf("\t\t***** 5 打印所有信息 ***** \n");
  61. printf("\t\t***** 6 保存并退出学生系统 ***** \n");
  62. printf("请输入选项:");
  63. scanf("%d",&num);
  64. return num;
  65. }
  66. /******************************************
  67. int add(struct node *p)
  68. {
  69. //1.开辟新的节点,使用new指向该新的节点
  70. struct node *new = malloc(sizeof(struct node));
  71. //2.1给节点的数据域赋值
  72. GetInfo(&new->data,RD_ID|RD_NAME|RD_SCORE);
  73. //2.2给节点的指针域赋值
  74. new->next = NULL;
  75. //3.把新的节点添加到链表中去
  76. //3.1 链表为空
  77. if(head == NULL)
  78. {
  79. head = new;
  80. return 0;
  81. }
  82. else//尾插法
  83. {
  84. while(p->next != NULL)
  85. {
  86. p = p->next;
  87. }
  88. //把新节点添加到链表最后节点的后面
  89. p->next = new;
  90. return 0;
  91. }
  92. }
  93. ******************************************/
  94. int add(struct node *p)
  95. {
  96. //1.开辟新的节点,使用new指向该新的节点
  97. struct node *new = malloc(sizeof(struct node));
  98. //2.1给节点的数据域赋值
  99. GetInfo(&new->data,RD_ID|RD_NAME|RD_SCORE);
  100. //2.2给节点的指针域赋值
  101. new->next = NULL;
  102. //3.把新的节点添加到链表中去 -- 中间插入
  103. //3.1 链表为空
  104. if(head == NULL)
  105. {
  106. head = new;
  107. return 0;
  108. }
  109. //3.2 查找位置,进行插入
  110. while(p != NULL)
  111. {
  112. if(p->data.ID < new->data.ID)
  113. {
  114. //后续节点为空,直接插入后面
  115. if(p->next == NULL)
  116. {
  117. p->next = new;
  118. return 0;
  119. }
  120. else if(p->next->data.ID > new->data.ID)
  121. {
  122. new->next = p->next;
  123. p->next = new;
  124. return 0;
  125. }
  126. }
  127. else if(p == head)
  128. {
  129. new->next = head;
  130. head = new;
  131. return 0;
  132. }
  133. p = p->next;
  134. }
  135. }
  136. /*
  137. 删除链表中某个节点
  138. p1 -- 链表头
  139. 返回值: 0 -- 成功
  140. >0 -- 失败
  141. 1 -- 链表为空
  142. 2 -- 链表中查询不到
  143. */
  144. int del(struct node *p)
  145. {
  146. if(p == NULL) //空链表
  147. {
  148. return 1;
  149. }
  150. struct student temp={0}; //定义一个结构体数组
  151. GetInfo(&temp,RD_ID); //输入要删除的ID
  152. struct node *del = NULL;
  153. //定义一个结构体指针,用来保存要删除节点的首地址
  154. //1.判断是否是第一个节点
  155. if(p->data.ID == temp.ID)
  156. {
  157. del = p;
  158. head = del->next;
  159. free(del);
  160. return 0;
  161. }
  162. //2个节点开始
  163. while(p->next != NULL) //寻找到最后一个结点
  164. {
  165. if(p->next->data.ID == temp.ID)
  166. {
  167. del = p->next; //将被删结点的地址给del
  168. p->next = del->next; //被删结点的下个地址给p的next
  169. free(del); //释放被删结点
  170. return 0;
  171. }
  172. p = p->next;
  173. }
  174. printf("无名之辈,不足挂齿\n");
  175. return 2;
  176. }
  177. int change(struct node *p)
  178. {
  179. struct student temp = {0}; //初始化结构体数组
  180. GetInfo(&temp,RD_ID|RD_NAME);//输入你想要修改的学生信息的学号
  181. while(p != NULL)
  182. {
  183. if(p->data.ID == temp.ID)
  184. {
  185. if(strcmp(p->data.name,temp.name)==0)
  186. {
  187. GetInfo(&temp,RD_ID|RD_NAME|RD_SCORE);
  188. //输入想要修改的信息
  189. p->data = temp;
  190. return 0;
  191. }
  192. }
  193. p = p->next;
  194. }
  195. printf("查无此人\n");
  196. return 1;
  197. }
  198. int find(struct node *p)
  199. {
  200. struct student temp = {0}; //保存要查找的信息
  201. GetInfo(&temp,RD_ID); //输入要查找学生的学号
  202. while(p != NULL) //循环比较学号
  203. {
  204. if(p->data.ID == temp.ID)
  205. {
  206. printf("找到该学生,信息如下:\n");
  207. printf("%d\t",p->data.ID);
  208. printf("%s\t",p->data.name);
  209. printf("%f\n",p->data.score);
  210. return 0;
  211. }
  212. p = p->next;
  213. }
  214. printf("查无此人\n");
  215. return 1;
  216. }
  217. void all_pri(struct node *p)
  218. {
  219. printf("打印所有学生信息操作……\n");
  220. printf("学号\t姓名\t成绩\n");
  221. while(p != NULL)
  222. {
  223. printf("%d\t",p->data.ID);
  224. printf("%s\t",p->data.name);
  225. printf("%f\n",p->data.score);
  226. p = p->next;
  227. }
  228. }
  229. /*
  230. flag = 相应的选项是否允许输入
  231. [0]位 -- no_flag 1--允许输入 0 -- 不允许输入
  232. [1]位 -- name_flag 1--允许输入 0 -- 不允许输入
  233. [2]位 -- sex_flag 1--允许输入 0 -- 不允许输入
  234. */
  235. void GetInfo(struct student *p,unsigned char flag)
  236. {
  237. if(flag & (1<<0))
  238. {
  239. printf("请输入学号:");
  240. scanf("%d",&p->ID);
  241. }
  242. if(flag & (1<<1))
  243. {
  244. printf("请输入姓名:");
  245. scanf("%s",p->name);
  246. }
  247. if(flag &(1<<2))
  248. {
  249. printf("请输入成绩:");
  250. scanf("%f",&p->score);
  251. }
  252. }
  253. int save(struct node *p) //保存
  254. {
  255. FILE *fp = fopen(FILE_NAME,"w");
  256. fprintf(fp,"学号,姓名,分数\n");
  257. if(p == NULL) //链表为空
  258. {
  259. perror("文件打开失败");
  260. return 1;
  261. }
  262. while(p != NULL)
  263. {
  264. fprintf(fp,"%d,",p->data.ID);
  265. fprintf(fp,"%s ,",p->data.name);
  266. fprintf(fp,"%.2f\n",p->data.score);
  267. p = p->next;
  268. }
  269. fclose(fp);
  270. return 0;
  271. }
  272. /**************************************************
  273. void read(struct node *p)
  274. {
  275. FILE *fp = fopen("data.txt","a+");
  276. if (fp == NULL)
  277. {
  278. perror("fopen");
  279. return ;
  280. }
  281. struct node *new = NULL,*end = p;
  282. while (fgetc(fp) != -1)
  283. {
  284. fseek(fp,-1,1);//光标位置
  285. new = malloc(sizeof(struct node));
  286. fscanf(fp,"ID: %d\t 姓名: %s\t\t成绩: %f\t\n",&new->data.ID,new->data.name,&new->data.score);
  287. new->next = NULL;
  288. end->next = new;
  289. end = new;
  290. }
  291. fclose(fp);
  292. //return ;
  293. }
  294. *************************************************/
  295. void read(struct node *p)
  296. {
  297. //1.打开 FILE_NAME r
  298. FILE *fp = fopen(FILE_NAME,"r");
  299. //2.往链表中添加新的数据
  300. //2.1 偏移文件指针 -- 跳过列名
  301. fseek(fp,sizeof("学号,姓名,性别,分数"),SEEK_SET);
  302. //2.2 读取文件信息 -- 判断文件是否到最后
  303. struct student temp={0};
  304. int res = 0;
  305. while(1){
  306. memset(&temp,0,sizeof(temp));
  307. res = fscanf(fp,"%d,",&temp.ID);
  308. res = fscanf(fp,"%s",temp.name);
  309. res = fscanf(fp,"%f",&temp.score);
  310. if(res == EOF){
  311. break;
  312. }
  313. //2.3 往链表中添加
  314. Add1(p,temp);
  315. p = head;//p1从新值指向链表头
  316. }
  317. //3.关闭文件
  318. fclose(fp);
  319. }
  320. static int Add1(struct node *p,struct student temp)
  321. {
  322. //1.开辟新的节点,使用pnew指向该新的节点
  323. struct node *new = malloc(sizeof(struct node));
  324. //2.1给节点的数据域赋值
  325. new->data = temp;
  326. //2.2给节点的指针域赋值
  327. new->next = NULL;
  328. //3.把新的节点添加到链表中去 -- 中间插入
  329. //3.1 是否为空链表
  330. if(head == NULL){
  331. head = new;
  332. return 0;
  333. }
  334. //3.2 查找位置,进行插入
  335. while(p != NULL){
  336. if(p->data.ID < new->data.ID)
  337. {
  338. //后续节点为空,直接插入后面
  339. if(p->next == NULL){
  340. p->next = new;
  341. return 0;
  342. }else if(p->next->data.ID > new->data.ID){
  343. new->next = p->next;
  344. p->next = new;
  345. return 0;
  346. }
  347. }else if(p == head){
  348. new->next = head;
  349. head = new;
  350. return 0;
  351. }
  352. p = p->next;
  353. }
  354. }
  355. int close(struct node *p1)
  356. {
  357. printf("系统正在关闭\n");
  358. save(p1);
  359. printf("系统关闭完成\n");
  360. return 0;
  361. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/783306
推荐阅读
相关标签
  

闽ICP备14008679号