当前位置:   article > 正文

C语言学生信息管理系统

c语言学生信息管理系统

C语言学生信息管理系统

此系统主要通过链表实现学生信息的增删查改。

目录

1.定义结构体

 2.新增学生信息

3.查找学生信息

(1)打印所有学生信息

 (2)按照姓名查找学生

(3)按照性别查找

(4)按照学号查找

4.添加新的学生信息

5.按照学生成绩排序

6.修改学生信息

(1)打印出修改前此学生的信息

(2)修改姓名

(3)修改学号

(4)修改全部信息

7.删除学生信息

8.保存学生信息

9.主函数

10.演示


1.定义结构体

定义一个结构体,里面包括学生的姓名、年龄、专业、学号、成绩,另外包括一个结构体指针。结构体指针用来存放下一个结点的地址,连接链表。

  1. typedef struct student {
  2. char name[20];//姓名
  3. int age;//年龄
  4. char sex[20] ;//性别
  5. char major[20];//专业
  6. char id[20];//学号
  7. int score;//成绩
  8. struct student *next;//结构体指针
  9. } stu;

 

 2.新增学生信息

通过一个for循环控制录入的学生信息个数。每新增一个学生信息都会开辟一块新空间,将信息录入,并通过尾插法接入链表。

  1. void add(stu *head) {
  2. system("cls");
  3. stu *p=head;
  4. stu *q;
  5. int a;
  6. printf("请输入你想新增几个学生信息:\n");
  7. scanf("%d",&a);
  8. int c=0;
  9. for(int n=0; n<a; n++) {
  10. stu *p1=(stu*)malloc(sizeof(stu));
  11. c++;
  12. printf("请输入第%d个学生的信息\n",c);
  13. printf("请输入学生姓名:\n");
  14. scanf("%s",&p1->name );
  15. printf("请输入学生年龄:\n");
  16. scanf("%d",&p1->age );
  17. while(p1->age <0) { //判断年龄是否小于0
  18. printf("请检查是否输入错误,请重新输入!\n");
  19. scanf("%d",&p1->age );
  20. }
  21. printf("请输入学生性别:\n");
  22. scanf("%s",&p1->sex );
  23. while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) { //判断性别是否为男女
  24. printf("输入格式有误,请重新输入: (输入男或女!)\n");
  25. scanf("%s",&p1->sex );
  26. }
  27. printf("请输入学生专业:\n");
  28. scanf("%s",&p1->major );
  29. printf("请输入学生学号:\n");
  30. scanf("%s",&p1->id );
  31. q=head;
  32. while(q->next !=NULL) { //判断录入的学号是否重复
  33. q=q->next ;
  34. while(strcmp(p1->id ,q->id)==0) {
  35. printf("该学号已存在,请重新输入!\n");
  36. scanf("%s",&p1->id);
  37. }
  38. }
  39. printf("请输入学生成绩:\n");
  40. scanf("%d",&p1->score );
  41. while(p1->score < 0) { //判断成绩是否小于0
  42. printf("请检查是否输入错误,请重新输入!\n");
  43. scanf("%d",&p1->score );
  44. }
  45. p->next=p1; //尾插法
  46. p=p->next;
  47. p->next=NULL;
  48. printf("添加成功!!\n");
  49. printf("\n");
  50. }
  51. p->next=NULL;
  52. printf("\n创建完毕!\n");
  53. system("pause");
  54. return;
  55. }

3.查找学生信息

查找学生信息可以通过姓名、学号、性别查找,或打印出所有学生信息。

  1. void find(stu *head) {
  2. printf("查看所有学生信息请按1\n");
  3. printf("按照学生姓名查找请按2\n");
  4. printf("按照学生学号查找请按3\n");
  5. printf("按照学生性别查找请按4\n");
  6. printf("请输入查询模式:\n");
  7. int i;
  8. scanf("%d",&i);
  9. system("cls");
  10. switch(i) {
  11. case 1:
  12. whileList(head);
  13. break;
  14. case 2:
  15. chazhao(head);
  16. break;
  17. case 3:
  18. xuehao(head);
  19. break;
  20. case 4:
  21. Xingbie(head);
  22. break;
  23. }
  24. }

(1)打印所有学生信息

  1. void whileList(stu *head) {
  2. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  3. stu *p,*p1;
  4. p=head;
  5. p1=p->next ;
  6. while(p1!=NULL) {
  7. printf("%13s",p1->name );
  8. printf("%6d",p1->age );
  9. printf("%8s",p1->sex );
  10. printf("%10s",p1->major );
  11. printf("%17s",p1->id );
  12. printf("%13d",p1->score );
  13. printf("\n");
  14. p1=p1->next ;
  15. }
  16. system("pause");
  17. }

 (2)按照姓名查找学生

通过字符串比较来找出要查询的姓名与链表中所相同的姓名,并将其打印出来。特别的,如果存在相同的姓名,则会将同名的人全部打印。

  1. void chazhao(stu *head) {
  2. stu *p,*p1;
  3. p=head;
  4. p1=p->next ;
  5. char named[20];
  6. printf("请输入要查找的学生的姓名:\n");
  7. scanf("%s",&named);
  8. int n=0;
  9. while(p1!=NULL) {
  10. while(strcmp(p1->name ,named)==0) {
  11. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  12. printf("%13s",p1->name );
  13. printf("%6d",p1->age );
  14. printf("%8s",p1->sex );
  15. printf("%10s",p1->major );
  16. printf("%17s",p1->id );
  17. printf("%13d",p1->score );
  18. printf("\n");
  19. n=1;
  20. break;
  21. }
  22. p=p1;
  23. p1=p1->next ;
  24. }
  25. if(n==0) {
  26. printf("该学生不存在!\n请先添加学生信息!\n");
  27. }
  28. system("pause");
  29. return;
  30. }

(3)按照性别查找

同样也是通过字符串比较打印性别为“男”或“女”的学生。

  1. void Xingbie(stu *head) {
  2. stu *p,*p1;
  3. p=head;
  4. p1=p->next ;
  5. char sexed[20];
  6. printf("请输入要查找的学生的性别:\n");
  7. scanf("%s",&sexed);
  8. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  9. while(p1!=NULL) {
  10. while(strcmp(p1->sex ,sexed)==0) {
  11. printf("%13s",p1->name );
  12. printf("%6d",p1->age );
  13. printf("%8s",p1->sex );
  14. printf("%10s",p1->major );
  15. printf("%17s",p1->id );
  16. printf("%13d",p1->score );
  17. printf("\n");
  18. break;
  19. }
  20. p=p1;
  21. p1=p1->next ;
  22. if(p1==NULL) {
  23. system("pause");
  24. return;
  25. }
  26. }
  27. }

(4)按照学号查找

同样也是通过字符串比较打印出相应学号的学生。

  1. void xuehao(stu *head) {
  2. stu *p,*p1;
  3. char id_[20];
  4. printf("请输入要查找的学生的学号:\n");
  5. scanf("%s",&id_);
  6. p=head;
  7. p1=p->next ;
  8. while(p1!=NULL) {
  9. while(strcmp(p1->id ,id_)==0) {
  10. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  11. printf("%13s",p1->name );
  12. printf("%6d",p1->age );
  13. printf("%8s",p1->sex );
  14. printf("%10s",p1->major );
  15. printf("%17s",p1->id );
  16. printf("%13d",p1->score );
  17. printf("\n");
  18. system("pause");
  19. return;
  20. }
  21. p=p1;
  22. p1=p1->next ;
  23. }
  24. if(p1==NULL||strcmp(p1->id ,id_)!=0) {
  25. printf("该学生不存在!\n请先添加学生信息!\n");
  26. system("pause");
  27. }
  28. }

4.添加新的学生信息

在链表中新增一个学生信息。使用的是头插法。

  1. void insert(stu*head) {
  2. stu *p,*p1;
  3. stu *q;
  4. p1=(stu*)malloc(sizeof(stu));
  5. p1->next=NULL;
  6. p = head;
  7. printf("请输入学生姓名:\n");
  8. scanf("%s",&p1->name );
  9. printf("请输入学生年龄:\n");
  10. scanf("%d",&p1->age );
  11. while(p1->age <0) {
  12. printf("请检查是否输入错误,请重新输入!\n");
  13. scanf("%d",&p1->age );
  14. }
  15. printf("请输入学生性别:\n");
  16. scanf("%s",&p1->sex );
  17. while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) {
  18. printf("输入格式有误,请重新输入: (输入男或女!)\n");
  19. scanf("%s",&p1->sex );
  20. }
  21. printf("请输入学生专业:\n");
  22. scanf("%s",&p1->major );
  23. printf("请输入学生学号:\n");
  24. scanf("%s",&p1->id );
  25. q=head;
  26. while(q!=NULL) {
  27. while(strcmp(p1->id ,q->id)==0) {
  28. printf("该学号已存在,请重新输入!\n");
  29. scanf("%s",&p1->id);
  30. q=head;
  31. }
  32. q=q->next ;
  33. }
  34. printf("请输入学生成绩:\n");
  35. scanf("%d",&p1->score );
  36. while(p1->score < 0) {
  37. printf("请检查是否输入错误,请重新输入!\n");
  38. scanf("%d",&p1->score );
  39. }
  40. while(p->next!=NULL) {
  41. p=p->next;
  42. }
  43. p->next=p1;
  44. p=p1;
  45. printf("添加成功!\n");
  46. system("pause");
  47. }

5.按照学生成绩排序

通过冒泡排序将学生信息按照从高到低的顺序排序并打印出来。

  1. void Paixu(stu *head) {
  2. stu *p,*p1,*q;
  3. p=head;
  4. p1=head->next;
  5. system("cls");
  6. while(p->next!=NULL) { //冒泡排序
  7. while(p1->next!=NULL) {
  8. if(p->next->score<p1->next->score) {
  9. q=p->next;
  10. p->next=p1->next;
  11. p1->next=p1->next->next;
  12. p->next->next=q;
  13. } else {
  14. p1=p1->next;
  15. }
  16. }
  17. p=p->next;
  18. p1=p->next;
  19. }
  20. p=head->next;
  21. printf("按总成绩从高到低排名如下: \n");
  22. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  23. while(p) {
  24. printf("%13s",p->name );
  25. printf("%6d",p->age );
  26. printf("%8s",p->sex );
  27. printf("%10s",p->major );
  28. printf("%17s",p->id );
  29. printf("%13d",p->score );
  30. printf("\n");
  31. p=p->next ;
  32. }
  33. system("pause");
  34. }

6.修改学生信息

可以选择更改学生姓名、学号或者全部信息三种修改模式。

  1. void change(stu *head) {
  2. printf("请选择需要更改的信息:\n");
  3. printf("更改全部信息请按1:\n");
  4. printf("更改姓名请按2:\n");
  5. printf("更改学号请按3:\n");
  6. int i;
  7. scanf("%d",&i);
  8. system("cls");
  9. switch(i) {
  10. case 1:
  11. All(head);
  12. break;
  13. case 2:
  14. Name(head);
  15. break;
  16. case 3:
  17. Id(head);
  18. break;
  19. }
  20. }

(1)打印出修改前此学生的信息

在每次修改学生信息打印出该学生的信息,方便修改。

  1. void XiugaiDayin(stu *N) {
  2. printf("修改前信息为:\n");
  3. printf("学生信息:\n\t姓名\t年龄\t性别 \t专业\t\t学号\t\t成绩\n");
  4. printf("%13s",N->name );
  5. printf("%6d",N->age );
  6. printf("%8s",N->sex );
  7. printf("%10s",N->major );
  8. printf("%17s",N->id );
  9. printf("%13d",N->score );
  10. printf("\n");
  11. }

(2)修改姓名

通过学号找出要修改的学生,并单独修改其姓名。

  1. void Name(stu *head) {
  2. char ided[20];
  3. printf("请输入要更改的学生的学号:\n");
  4. scanf("%s",ided);
  5. stu *p,*p1;
  6. p=head;
  7. p1=p->next ;
  8. while(p1!=NULL) {
  9. while(strcmp(p1->id ,ided)==0 ) {
  10. XiugaiDayin(p1);
  11. printf("请输入更改后的学生姓名:\n");
  12. scanf("%s",&p1->name );
  13. printf("更改成功!\n");
  14. system("pause");
  15. return;
  16. }
  17. p=p1;
  18. p1=p1->next ;
  19. }
  20. if(p1==NULL||strcmp(p1->id ,ided )!=0) {
  21. printf("没有该学生!\n");
  22. system("pause");
  23. }
  24. }

(3)修改学号

通过学号找出要修改的学生,并单独修改其学号。

  1. void Id(stu *head) {
  2. char ided[20];
  3. printf("请输入要更改的学生的学号:\n");
  4. scanf("%s",ided);
  5. stu *p,*p1;
  6. stu *q;
  7. p=head;
  8. p1=p->next ;
  9. while(p1!=NULL) {
  10. while(strcmp(p1->id ,ided)==0 ) {
  11. XiugaiDayin(p1);
  12. printf("请输入更改后的学生学号:\n");
  13. scanf("%s",&p1->id );
  14. printf("更改成功!\n");
  15. system("pause");
  16. return;
  17. }
  18. p=p1;
  19. p1=p1->next ;
  20. }
  21. if(p1==NULL||strcmp(p1->id ,ided )!=0) {
  22. printf("没有该学生!\n");
  23. system("pause");
  24. }
  25. }

(4)修改全部信息

通过学号找出要修改的学生,并修改其全部信息。

  1. void All(stu *head) {
  2. char ided[20];
  3. printf("请输入要更改的学生的学号:\n");
  4. scanf("%s",ided);
  5. stu *p,*p1;
  6. stu *q;
  7. p=head;
  8. p1=p->next ;
  9. while(p1!=NULL) {
  10. while(strcmp(p1->id ,ided)==0 ) {
  11. XiugaiDayin(p1);
  12. printf("请输入更改后的学生姓名:\n");
  13. scanf("%s",&p1->name );
  14. printf("请输入更改后的学生年龄:\n");
  15. scanf("%d",&p1->age );
  16. while(p1->age <0) {
  17. printf("请检查是否输入错误,请重新输入!\n");
  18. scanf("%d",&p1->age );
  19. }
  20. printf("请输入更改后的学生性别:\n");
  21. scanf("%s",&p1->sex );
  22. while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) {
  23. printf("输入格式有误,请重新输入: (输入男或女!)\n");
  24. scanf("%s",&p1->sex );
  25. }
  26. printf("请输入更改后的学生专业:\n");
  27. scanf("%s",&p1->major );
  28. printf("请输入更改后的学生学号:\n");
  29. scanf("%s",&p1->id );
  30. printf("请输入更改后的学生成绩:\n");
  31. scanf("%d",&p1->score );
  32. while(p1->score < 0) {
  33. printf("请检查是否输入错误,请重新输入!\n");
  34. scanf("%d",&p1->score );
  35. }
  36. printf("更改成功!\n");
  37. system("pause");
  38. return;
  39. }
  40. p=p1;
  41. p1=p1->next ;
  42. }
  43. if(p1==NULL||strcmp(p1->id ,ided )!=0) {
  44. printf("没有该学生!\n");
  45. system("pause");
  46. }
  47. }

7.删除学生信息

通过学号找出要删除的学生信息,将其从链表中剔除,并将其所占用的空间释放掉。

  1. void Delete(stu *head) {
  2. stu *p,*p1;
  3. char n[20];
  4. printf("请输入要删除的学生的学号:\n");
  5. scanf("%s",&n);
  6. p= head;
  7. p1=p->next ;
  8. while(p1!=NULL) {
  9. while(strcmp(p1->id ,n)==0) {
  10. p->next =p1->next ;
  11. free(p1);
  12. printf("删除成功!\n");
  13. system("pause");
  14. return;
  15. }
  16. p=p1;
  17. p1=p->next ;
  18. }
  19. if(p1==NULL||strcmp(n,p1->id )!=0) {
  20. printf("没有该学生!\n");
  21. system("pause");
  22. }
  23. }

8.保存学生信息

将当前链表中的学生信息保存到电脑D盘中。

  1. void save(stu *head) {
  2. FILE *fp;
  3. fp=fopen("D:\\学生信息.txt","w");
  4. stu *p=head;
  5. p=p->next ;
  6. fprintf(fp,"学生信息:\n\t姓名\t年龄\t性别\t专业 \t学号 \t成绩\n");
  7. while(p!=NULL) {
  8. fprintf(fp,"\t%3s %6d %6s %10s %15s %12d\n",p->name ,p->age ,p->sex ,p->major ,p->id ,p->score );
  9. p=p->next ;
  10. }
  11. fclose(fp);
  12. printf("保存成功!");
  13. system("pause");
  14. }

9.主函数

主函数包括控制小黑框的大小,更改背景与字体颜色,头指针与头节点的创建,打印出相应菜单,通过switch语句选择要实现的功能。

  1. int main() {
  2. system("mode concols=100 lines=30");
  3. system("color 3E");
  4. stu *head=(stu*)malloc(sizeof(stu));
  5. head->next =NULL;
  6. char a;
  7. while(1) {
  8. system("cls");
  9. printf("\t\t\t\t\t**************************\n");
  10. printf("\t\t\t\t\t* 欢迎使用学生管理系统 *\n");
  11. printf("\t\t\t\t\t* 请选择想要使用的功能 *\n");
  12. printf("\t\t\t\t\t* 添加学生信息请按1 *\n");
  13. printf("\t\t\t\t\t* 查看学生信息请按2 *\n");
  14. printf("\t\t\t\t\t* 新增学生信息请按3 *\n");
  15. printf("\t\t\t\t\t* 按照成绩排序请按4 *\n");
  16. printf("\t\t\t\t\t* 更改学生信息请按5 *\n");
  17. printf("\t\t\t\t\t* 删除学生信息请按6 *\n");
  18. printf("\t\t\t\t\t* 保存学生信息请按7 *\n");
  19. printf("\t\t\t\t\t* 退出系统请按8 *\n");
  20. printf("\t\t\t\t\t**************************\n");
  21. scanf("%s",&a);
  22. switch(a) {
  23. case '1':
  24. system("cls");
  25. add(head);
  26. break;
  27. case '2':
  28. system("cls");
  29. find(head);
  30. break;
  31. case '3':
  32. system("cls");
  33. insert(head);
  34. break;
  35. case '4':
  36. system("cls");
  37. Paixu(head);
  38. break;
  39. case '5':
  40. system("cls");
  41. change(head);
  42. break;
  43. case '6':
  44. system("cls");
  45. Delete(head);
  46. break;
  47. case '7':
  48. system("cls");
  49. save(head);
  50. break;
  51. case '8':
  52. exit(0);
  53. break;
  54. default :
  55. system("cls");
  56. printf("输入方式错误,请重新输入!\n");
  57. system("pause");
  58. break;
  59. }
  60. }
  61. return 0;
  62. }

10.演示

 1.添加学生信息

2.查看学生信息

 

 

3.按照成绩排序

 

4.更改学生信息

 

5.删除学生

 

篇幅有限不过多演示! 

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

闽ICP备14008679号