[应用方案] 学生管理系统

[复制链接]
 楼主| LOVEEVER 发表于 2024-3-12 11:21 | 显示全部楼层 |阅读模式
运行效果


  1.                                                 【学生管理系统2.0】
  2.                 ★————————————————————————————————————————★

  3.                            | 1. 信息录入                2. 成绩录入             3. 信息查询  |

  4.                            | 4. 成绩查询                5. 删除信息             6. 信息追加  |

  5.                            | 7. 更改分数                8. 查看排名             9. 成绩分段  |

  6.                            | 10.保存文件                11.文件输出             12.文件导入  |

  7.                 ★————————————————按0并回车退出——————————————————★
  8. 请输入执行数字:1
  9. *****************************************************信息录入***********************************************************
  10. 依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。
  11.                                              【退出请输入'0'并回车】



样例:
541913460230 张三 男 1717 66666
在此输入:
1001 张三丰 男 521 888888
1001 张三丰 男 521 888888

1002 李四 男 522 555555
1002 李四 男 522 555555


0
0
请输入执行数字:3
请在此输入:1002
1002
输入了错误的第一次选择数字!重新输入:
3
3
输入了错误的第一次选择数字!重新输入:
0
0
输入了错误的第一次选择数字!重新输入:
1
1
通过学号(输入1),姓名(输入2):1
1

输入学号(输入0并回车结束):1001
1001
学号:1001 姓名:张三丰 性别:男 宿舍号码:521 电话号码:888888

输入学号(输入0并回车结束):



 楼主| LOVEEVER 发表于 2024-3-12 11:21 | 显示全部楼层
源码
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #define LEN sizeof(struct student)
  6. struct student
  7. {
  8.     char num[20];//学号
  9.     char name[20];//姓名
  10.     char sex[20];//性别
  11.     char room[20];//宿舍号码
  12.     char tel[20];//电话号码

  13.     char CHN[20];//语文
  14.     char MATH[20];//数学
  15.     char ENG[20];//英语
  16.     char PE[20];//体育
  17.     char PRO[20];//专业
  18.     char average_score[20];//平均分

  19.     struct student *next;
  20. };
  21. int n;//节点数

  22. struct student *creat();//信息录入
  23. void score(struct student *head);//成绩录入
  24. void findinformation(struct student *head);//信息查询
  25. void findscore(struct student *head);//成绩查询
  26. struct student *del(struct student *head);//信息删除
  27. struct student *insert(struct student *head);//信息插入
  28. void update(struct student *head);//修改分数
  29. void Oscore(struct student*head);//排序输出
  30. void swap(struct student*p1,struct student*p2);//交换数据
  31. void fenduan(struct student*head);//分段输出
  32. int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
  33. int transformint(char ch[]);//纯数字整数(字符串转向int类型)
  34. void save(struct student *head); //文件存储
  35. void export1();//文件输出
  36. struct student *import();//文件导入
  37. int checkscore(char ch[]);//检查分数是否为0-99的纯数字
  38. int IncludeChinese(char *str); //检查性名、性别是否包含汉字
  39. int main()
  40. {
  41.     //微信关注公众号:C语言中文社区,免费领取更多
  42.     struct student *head=NULL;
  43.     char choose[20];
  44.     menu://设置主菜单的点
  45.     printf("\n");
  46.     printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n");
  47.     printf("\t\t★————————————————————————————————————————★\n\n");
  48.     printf("\t\t\t   | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询  |\n\n");
  49.     printf("\t\t\t   | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加  |\n\n");
  50.     printf("\t\t\t   | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段  |\n\n");
  51.     printf("\t\t\t   | 10.保存文件\t\t11.文件输出\t\t12.文件导入  |\n\n");
  52.     printf("\t\t★————————————————按0并回车退出——————————————————★\n");
  53.     printf("请输入执行数字:");
  54.     while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入
  55.     {
  56.         printf("输入无效,重新输入:");
  57.     }
  58.     switch(transformint(choose))
  59.     {
  60.         case 1:
  61.             head=creat();
  62.             break;
  63.         case 2:
  64.             score(head);
  65.             break;
  66.         case 3:
  67.             findinformation(head);
  68.             break;
  69.         case 4:
  70.             findscore(head);
  71.             break;
  72.         case 5:
  73.             head=del(head);
  74.             break;
  75.         case 6:
  76.             head=insert(head);
  77.             break;
  78.         case 7:
  79.             update(head);
  80.             break;
  81.         case 8:
  82.             Oscore(head);
  83.             break;
  84.         case 9:
  85.             fenduan(head);
  86.             break;
  87.         case 10:
  88.             save(head);
  89.             break;
  90.         case 11:
  91.             export1();
  92.             break;
  93.         case 12:
  94.             head=import();
  95.             break;
  96.     }
  97.     if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点
  98.     {
  99.         system("cls");//清理屏幕和缓冲区
  100.         fflush(stdin);
  101.         goto menu;
  102.     }
  103.     if(transformint(choose)!=0)//输入不是0,继续回到主菜单
  104.     {
  105.         goto menu;
  106.     }
  107.     system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽
  108.     fflush(stdin);
  109.     printf("\n感谢使用!\n");
  110.     printf("\n                                                     *\n");
  111.     printf("                                                *  ***  ****\n");
  112.     printf("                                              *** **** ****\n");
  113.     printf("                                             **** **** **** ****\n");
  114.     printf("                                             **** **** **** ****\n");
  115.     printf("                                             **** **** **** ****\n");
  116.     printf("                                             **** **** **** ****\n");
  117.     printf("                                             **** **** **** ****\n");
  118.     printf("                                              **** ******* ****\n");
  119.     printf("                                                *************\n");
  120.     printf("                                                    *****\n");
  121.     system("pause");
  122.     return 0;
  123. }

  124. struct student *creat()//录入信息,创建链表
  125. {
  126.     system("cls");
  127.     fflush(stdin);
  128.     printf("*****************************************************信息录入***********************************************************\n");
  129.     printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。         \n");
  130.     printf("                                             【退出请输入'0'并回车】                                                     \n");
  131.     printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n");
  132.     n=0;
  133.     struct student *head,*p1,*p2;
  134.     head = NULL;
  135.     p1=p2=(struct student*)malloc(LEN);

  136.     while(scanf("%s",p1->num)&&checknum(p1->num)==0)
  137.     {
  138.         printf("输入错误的学号,重新输入:\n");
  139.     }
  140.     if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head
  141.     {
  142.         system("cls");
  143.         fflush(stdin);
  144.         return(head);
  145.     }
  146.     while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!!
  147.     {
  148.         printf("输入错误的名字,重新输入:\n");
  149.     }
  150.     while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
  151.     {
  152.         printf("输入错误的性别,重新输入:\n");
  153.     }
  154.     while(scanf("%s",p1->room)&&checknum(p1->room)==0)
  155.     {
  156.         printf("输入错误的宿舍号码,重新输入:\n");
  157.     }
  158.     while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
  159.     {
  160.         printf("输入错误的手机号码,重新输入:\n");
  161.     }
  162.     printf("\n");
  163.     while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。
  164.     {
  165.         n+=1;//节点+1
  166.         if(n==1)    //PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本)
  167.         {
  168.             head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时
  169.         }else
  170.         {
  171.             p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起
  172.             p2=p1;//p2再跟p1
  173.         }
  174.         p1=(struct student*)malloc(LEN);//p1指向开辟的新节点
  175.         while(scanf("%s",p1->num)&&checknum(p1->num)==0)
  176.         {
  177.             printf("输入错误的学号,重新输入:\n");
  178.         }
  179.         if(transformint(p1->num)==0)
  180.         {
  181.             break;
  182.         }
  183.         while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)
  184.         {
  185.             printf("输入错误的名字,重新输入:\n");
  186.         }
  187.         while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
  188.         {
  189.             printf("输入错误的性别,重新输入:\n");
  190.         }
  191.         while(scanf("%s",p1->room)&&checknum(p1->room)==0)
  192.         {
  193.             printf("输入错误的宿舍号码,重新输入:\n");
  194.         }
  195.         while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
  196.         {
  197.             printf("输入错误的手机号码,重新输入:\n");
  198.         }
  199.         printf("\n\n");
  200.     }
  201.     p2->next=NULL;//最后p1开辟的新节点丢弃了,让p2的next指向空,形成表尾结束链表。 录入结束
  202.     system("cls");
  203.     fflush(stdin);
  204.     return(head);
  205. }

  206. void score(struct student *head)//拿到链表,录入成绩
  207. {
  208.     system("cls");
  209.     fflush(stdin);
  210.     printf("*****************************************************成绩录入***********************************************************\n");
  211.     printf("依次键入语文、数学、英语、体育、专业成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n");
  212.     printf("                                              【录完分数后自动退出】                                                      \n");
  213.     printf("例如:\n10 20 30 40 50\n在此输入:\n");

  214.     int Aver;//平均分
  215.     struct student *p;
  216.     for(p=head;p!=NULL;p=p->next)//遍历链表
  217.     {
  218.         printf("\n现在录入%s(%s)的成绩\n",p->name,p->num);
  219.         while(scanf("%s",p->CHN)&&checkscore(p->CHN)==0)
  220.         {
  221.             printf("输入错误的语文分数,重新输入:\n");
  222.         }
  223.         while(scanf("%s",p->MATH)&&checkscore(p->MATH)==0)
  224.         {
  225.             printf("输入错误的数学分数,重新输入:\n");
  226.         }
  227.         while(scanf("%s",p->ENG)&&checkscore(p->ENG)==0)
  228.         {
  229.             printf("输入错误的英语分数,重新输入:\n");
  230.         }
  231.         while(scanf("%s",p->PE)&&checkscore(p->PE)==0)
  232.         {
  233.             printf("输入错误的体育分数,重新输入:\n");
  234.         }
  235.         while(scanf("%s",p->PRO)&&checkscore(p->PRO)==0)
  236.         {
  237.             printf("输入错误的专业分数,重新输入:\n");
  238.         }
  239.         Aver=(transformint(p->CHN)+transformint(p->MATH)+transformint(p->ENG)+transformint(p->PE)+transformint(p->PRO))/5;
  240.         itoa(Aver,p->average_score,10);//Aver十进制形式转化为字符串存储在链表的average_score平均分里
  241.         printf("%s的成绩录入完了\n",p->name);
  242.     }
  243.     system("cls");
  244.     fflush(stdin);
  245. }

  246. void findinformation(struct student *head)//学生信息查询
  247. {
  248.     system("cls");
  249.     fflush(stdin);
  250.     char choose1[20],choose2[20];//两个选择的地方,choose1选择学号/姓名 or 宿舍号 ,choose2在选择了学号/姓名时选择 学号 or 姓名
  251.     char num[20]={'1'};//用户即将输入的学号
  252.     char name[20];//用户即将输入的姓名
  253.     char room[20]={'1'};//用户即将输入的宿舍号
  254.     struct student *p;
  255.     p=head;
  256.     int flag=0;
  257.     printf("*****************************************************信息查询***********************************************************\n");
  258.     printf("\n选择查找方式,学号/姓名查找(输入1),宿舍号(输入2)\n请在此输入:");
  259.     choosestation1://第一次选择的点
  260.     fflush(stdin);
  261.     while(scanf("%s",choose1)&&checknum(choose1)==0)
  262.     {
  263.         printf("输入无效,重新输入:\n");
  264.     }
  265.     if(transformint(choose1)==1)
  266.     {
  267.         printf("通过学号(输入1),姓名(输入2):");
  268.         choosestation2://第二次选择的点
  269.         fflush(stdin);
  270.         while(scanf("%s",choose2)&&checknum(choose2)==0)
  271.         {
  272.             printf("输入无效,重新输入:\n");
  273.         }
  274.         if(transformint(choose2)==1)
  275.         {
  276.             while(transformint(num)!=0)
  277.             {
  278.                 printf("\n输入学号(输入0并回车结束):");
  279.                 while(scanf("%s",num)&&checknum(num)==0)
  280.                 {
  281.                     printf("输入错误的学号,重新输入:\n");
  282.                 }
  283.                 for(p=head;p!=NULL;p=p->next)
  284.                 {
  285.                     if(transformint(p->num)==transformint(num))
  286.                     {
  287.                         printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
  288.                         flag=1;
  289.                         break;
  290.                     }
  291.                 }
  292.                 if(flag==0&&transformint(num)!=0)
  293.                 {
  294.                     printf("未找到此学生信息\n");
  295.                 }
  296.             }
  297.         }else if(transformint(choose2)==2)
  298.         {
  299.             while(name[0]!='#')
  300.             {
  301.                 printf("\n输入姓名(输入#并回车结束):");
  302.                 scanf("%s",name);
  303.                 for(p=head;p!=NULL;p=p->next)//遍历链表
  304.                 {
  305.                     if(strcmp(p->name,name)==0)//比较两字符串
  306.                     {
  307.                         printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
  308.                         flag=1;
  309.                         break;
  310.                     }
  311.                 }
  312.                 if(flag==0&&name[0]!='#')
  313.                 {
  314.                     printf("未找到此学生信息!\n");
  315.                 }
  316.             }
  317.         }else
  318.         {
  319.             printf("输入了错误的第二次选择数字!重新输入:\n");
  320.             goto choosestation2;//返回上面第二次选择的点
  321.         }
  322.     }else if(transformint(choose1)==2)
  323.     {
  324.         while(transformint(room)!=0)
  325.         {
  326.             printf("\n输入宿舍号(输入0并回车结束):");
  327.             while(scanf("%s",room)&&checknum(room)==0)
  328.             {
  329.                 printf("输入错误的宿舍号码,重新输入:\n");
  330.             }
  331.             for(p=head;p!=NULL;p=p->next)
  332.             {
  333.                 if(p->room==room)
  334.                 {
  335.                     printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
  336.                     flag=1;
  337.                     break;
  338.                 }
  339.             }
  340.             if(flag==0&&transformint(room)!=0)
  341.             {
  342.                 printf("未找到此学生信息!\n");
  343.             }
  344.         }
  345.     }else
  346.     {
  347.         printf("输入了错误的第一次选择数字!重新输入:\n");
  348.         goto choosestation1;//返回最上面第一次选择的点
  349.     }
  350.     system("cls");
  351.     fflush(stdin);
  352. }

  353. void findscore(struct student *head)//成绩查询
  354. {
  355.     system("cls");
  356.     fflush(stdin);
  357.     char num[20]={'1'};//初始化用户即将输入的学号
  358.     struct student *p;
  359.     int flag=0;//学号是否找到的标志,1找到0没找到
  360.     p=head;
  361.     printf("*****************************************************成绩查询***********************************************************\n");
  362.     printf("因为有重名的可能,暂时只能通过学号进行查询。请输入学号并回车进行查询!\n");
  363.     printf("                                               【退出请输入'0'并回车】                                                    \n");
  364.     while(transformint(num)!=0)
  365.     {
  366.         printf("\n输入学号:");
  367.         while(scanf("%s",num)&&checknum(num)==0)
  368.         {
  369.             printf("输入错误的学号,重新输入:\n");
  370.         }
  371.         for(p=head;p!=NULL;p=p->next)
  372.         {
  373.             if(transformint(p->num)==transformint(num))
  374.             {
  375.                 printf("学号:%s 姓名:%s 语文:%s 数学:%s 英语:%s 体育:%s 专业:%s \n",p->num,p->name,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
  376.                 flag=1;
  377.                 break;
  378.             }
  379.         }
  380.         if(flag==0)
  381.         {
  382.             printf("学号未找到!\n");
  383.         }
  384.     }
  385.     system("cls");
  386.     fflush(stdin);
  387. }

  388. struct student *del(struct student *head)//删除信息函数
  389. {
  390.     system("cls");
  391.     fflush(stdin);
  392.     char num[20]={'1'};//用户即将输入的学号
  393.     struct student *p1,*p2;
  394.     printf("*****************************************************信息删除***********************************************************\n");
  395.     if(head == NULL)
  396.     {
  397.         system("cls");
  398.         fflush(stdin);
  399.         return(head);
  400.     }
  401.     printf("\n***************************************输入学号进行删除学生信息(输入0结束)**********************************************\n");
  402.     do{
  403.         printf("\n请输入学号:");
  404.         while(scanf("%s",num)&&checknum(num)==0)
  405.         {
  406.             printf("输入错误的学号,重新输入:\n");
  407.         }
  408.         if(transformint(num)==0)
  409.         {
  410.             break;
  411.         }
  412.         p1=p2=head;
  413.         while(transformint(num)!=transformint(p1->num)&&p1->next!=NULL)
  414.         {
  415.             p2=p1;
  416.             p1=p1->next;
  417.         }
  418.         if(transformint(num)==transformint(p1->num))//找到数字
  419.         {
  420.             if(p1==head)//如果是要删开头的节点,直接改变表头指向第二个节点,让第二个节点成为新的表头,原来的头用free释放掉
  421.             {
  422.                 head=p1->next;
  423.                 free(p1);
  424.             }else//如果删后面的节点,要把p2连到p1所在节点后面的一个节点,将p1所在节点free释放掉
  425.             {
  426.                 p2->next=p1->next;
  427.                 free(p1);
  428.             }
  429.             printf("已删除学号为%s的信息",num);
  430.             n=n-1;
  431.         }else
  432.         {
  433.             printf("没有找到学号为%s的学生\n",num);
  434.         }
  435.     }while(transformint(num)!=0);
  436.     system("cls");
  437.     fflush(stdin);
  438.     return(head);
  439. }

  440. struct student *insert(struct student *head)//插入信息函数
  441. {
  442.     system("cls");
  443.     fflush(stdin);
  444.     printf("*****************************************************信息追加***********************************************************\n");
  445.     printf("                                            【加入一组信息后自动退出】                                                  \n");
  446.     printf("请按照 学号 姓名 性别 宿舍号码 电话号码 语文 数学 英语 体育 专业 顺序输入\n");
  447.     printf("样例:\n542013460658 李四 男 1206 10086 10 20 30 40 50\n");
  448.     int Aver;
  449.     struct student *stud=(struct student*)malloc(LEN);//开辟一个单元,这一块存我们追加的信息,后面的操作把这一块连接到链表的表头
  450.     stud->next=NULL;
  451.     stud->next=head;
  452.     head=stud;
  453.     while(scanf("%s",stud->num)&&checknum(stud->num)==0)
  454.     {
  455.         printf("输入错误的学号,重新输入:\n");
  456.     }
  457.     while(scanf("%s",stud->name)&&IncludeChinese(stud->name)==0)
  458.     {
  459.         printf("输入错误的名字,重新输入:\n");
  460.     }
  461.     while(scanf("%s",stud->sex)&&IncludeChinese(stud->sex)==0)
  462.     {
  463.         printf("输入错误的性别,重新输入:\n");
  464.     }
  465.     while(scanf("%s",stud->room)&&checknum(stud->room)==0)
  466.     {
  467.         printf("输入错误的宿舍号码,重新输入:\n");
  468.     }
  469.     while(scanf("%s",stud->tel)&&checknum(stud->tel)==0)
  470.     {
  471.         printf("输入错误的电话号码,重新输入:\n");
  472.     }
  473.     while(scanf("%s",stud->CHN)&&checkscore(stud->CHN)==0)
  474.     {
  475.         printf("输入错误的语文分数,重新输入:\n");
  476.     }
  477.     while(scanf("%s",stud->MATH)&&checkscore(stud->MATH)==0)
  478.     {
  479.         printf("输入错误的数学分数,重新输入:\n");
  480.     }
  481.     while(scanf("%s",stud->ENG)&&checkscore(stud->ENG)==0)
  482.     {
  483.         printf("输入错误的英语分数,重新输入:\n");
  484.     }
  485.     while(scanf("%s",stud->PE)&&checkscore(stud->PE)==0)
  486.     {
  487.         printf("输入错误的体育分数,重新输入:\n");
  488.     }
  489.     while(scanf("%s",stud->PRO)&&checkscore(stud->PRO)==0)
  490.     {
  491.         printf("输入错误的专业分数,重新输入:\n");
  492.     }
  493.     Aver=(transformint(stud->CHN)+transformint(stud->MATH)+transformint(stud->ENG)+transformint(stud->PE)+transformint(stud->PRO))/5;//计算平均分
  494.     itoa(Aver,stud->average_score,10);
  495.     n=n+1; //节点+1
  496.     system("cls");
  497.     fflush(stdin);
  498.     return(head);
  499. }

  500. void update(struct student *head)//修改分数
  501. {
  502.     system("cls");
  503.     fflush(stdin);
  504.     int Aver;
  505.     struct student *p1,*p2;
  506.     char num[20]={'1'};//用户即将输入的学号
  507.     char choose[20];
  508.     printf("*****************************************************分数修改***********************************************************\n");
  509.     if(head == NULL)//没有录信息 空表直接返回
  510.     {
  511.         system("cls");
  512.         fflush(stdin);
  513.         return;
  514.     }
  515.     printf("\n***************************************输入学号进行修改学生分数(输入0结束)**********************************************\n");
  516.     do{
  517.         printf("\n请输入学号:");
  518.         while(scanf("%s",num)&&checknum(num)==0)
  519.         {
  520.             printf("输入错误的学号,重新输入:\n");
  521.         }
  522.         if(transformint(num)==0)
  523.         {
  524.             break;
  525.         }
  526.         p1=p2=head;
  527.         while(transformint(p1->num)!=transformint(num)&&p1->next!=NULL)//没找到,往后走
  528.         {
  529.             p2=p1;
  530.             p1=p1->next;
  531.         }
  532.         if(transformint(p1->num)==transformint(num))//找到了,开始选修改的科目
  533.         {
  534.             printf("修改语文请输入1,数学输入2,英语3,体育4,专业5\n");
  535.             printf("请输入修改科目对应的数字:");
  536.             while(scanf("%s",choose)&&checknum(choose)==0||transformint(choose)<1||transformint(choose)>5)
  537.             {
  538.                 printf("输入无效的编号,重新输入:\n");
  539.             }
  540.             printf("请输入修改后的分数:");
  541.             switch(transformint(choose))
  542.             {
  543.                 case 1:
  544.                     while(scanf("%s",p1->CHN)&&checknum(p1->CHN)==0)
  545.                     {
  546.                         printf("输入错误的语文分数,重新输入:\n");
  547.                     }
  548.                     break;
  549.                 case 2:
  550.                     while(scanf("%s",p1->MATH)&&checknum(p1->MATH)==0)
  551.                     {
  552.                         printf("输入错误的数学分数,重新输入:\n");
  553.                     }
  554.                     break;
  555.                 case 3:
  556.                     while(scanf("%s",p1->ENG)&&checknum(p1->ENG)==0)
  557.                     {
  558.                         printf("输入错误的英语分数,重新输入:\n");
  559.                     }
  560.                     break;
  561.                 case 4:
  562.                     while(scanf("%s",p1->PE)&&checknum(p1->PE)==0)
  563.                     {
  564.                         printf("输入错误的体育分数,重新输入:\n");
  565.                     }
  566.                     break;
  567.                 case 5:
  568.                     while(scanf("%s",p1->PRO)&&checknum(p1->PRO)==0)
  569.                     {
  570.                         printf("输入错误的专业分数,重新输入:\n");
  571.                     }
  572.                     break;
  573.             }
  574.             Aver=(transformint(p1->CHN)+transformint(p1->MATH)+transformint(p1->ENG)+transformint(p1->PE)+transformint(p1->PRO))/5;
  575.             itoa(Aver,p1->average_score,10);//平均分转换字符串形式
  576.         }else
  577.         {
  578.             printf("没有找到学号为%s的学生\n",num);
  579.         }
  580.     }while(transformint(num)!=0);
  581.     system("cls");
  582.     fflush(stdin);
  583. }

  584. void Oscore(struct student*head)//排序输出
  585. {
  586.     system("cls");
  587.     fflush(stdin);
  588.     printf("*****************************************************查看排名***********************************************************\n");
  589.     int ranking=0;
  590.     struct student *p=NULL,*p1=NULL;
  591.     for(p=head;p!=NULL;p=p->next)
  592.     {
  593.         if(checkscore(p->average_score)==0)
  594.         {
  595.             printf("有同学只录取了信息,没有录成绩。所以无法公布排名\n");
  596.             system("pause");
  597.             system("cls");
  598.             fflush(stdin);
  599.             return;
  600.         }
  601.     }
  602.     for(p=head;p!=NULL;p=p->next)
  603.     {
  604.         for(p1=p->next;p1!=NULL;p1=p1->next)
  605.         {
  606.             if(transformint(p->average_score)<transformint(p1->average_score))
  607.             {
  608.                 swap(p,p1);
  609.             }
  610.         }
  611.     }
  612.     printf("学号\t\t姓名\t\t平均分\t\t名次\t语文\t数学\t英语\t体育\t专业\t\n");
  613.     for(p=head;p!=NULL;p=p->next)
  614.     {
  615.         ranking+=1;
  616.         printf("%s\t\t%s\t\t%s\t\t%d\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,ranking,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
  617.     }
  618.     printf("\n");
  619.     system("pause");
  620.     system("cls");
  621.     fflush(stdin);
  622. }

  623. void swap(struct student*p1,struct student*p2)//交换数据(辅助函数)
  624. {
  625.     char tempCHN[20];
  626.     char tempMATH[20];
  627.     char tempENG[20];
  628.     char tempPE[20];
  629.     char tempPRO[20];
  630.     char tempaverage[20];
  631.     char tempname[20];
  632.     char tempnum[20];

  633.     strcpy(tempnum,p1->num);///
  634.     strcpy(p1->num,p2->num);
  635.     strcpy(p2->num,tempnum);
  636.     strcpy(tempname,p1->name);//
  637.     strcpy(p1->name,p2->name);
  638.     strcpy(p2->name,tempname);
  639.     strcpy(tempCHN,p1->CHN);///
  640.     strcpy(p1->CHN,p2->CHN);
  641.     strcpy(p2->CHN,tempCHN);
  642.     strcpy(tempMATH,p1->MATH);///
  643.     strcpy(p1->MATH,p2->MATH);
  644.     strcpy(p2->MATH,tempMATH);
  645.     strcpy(tempENG,p1->ENG);///
  646.     strcpy(p1->ENG,p2->ENG);
  647.     strcpy(p2->ENG,tempENG);
  648.     strcpy(tempPE,p1->PE);///
  649.     strcpy(p1->PE,p2->PE);
  650.     strcpy(p2->PE,tempPE);
  651.     strcpy(tempPRO,p1->PRO);///
  652.     strcpy(p1->PRO,p2->PRO);
  653.     strcpy(p2->PRO,tempPRO);
  654.     strcpy(tempaverage,p1->average_score);///
  655.     strcpy(p1->average_score,p2->average_score);
  656.     strcpy(p2->average_score,tempaverage);
  657. }

  658. void fenduan(struct student*head)//分段输出
  659. {
  660.     system("cls");
  661.     fflush(stdin);
  662.     printf("*****************************************************成绩分段***********************************************************\n\n");
  663.     struct student *p;
  664.     for(p=head;p!=NULL;p=p->next)
  665.     {
  666.         if(checkscore(p->average_score)==0)
  667.         {
  668.             printf("有同学只录取了信息,没有录成绩。所以无法公布分段\n");
  669.             system("pause");
  670.             system("cls");
  671.             fflush(stdin);
  672.             return;
  673.         }
  674.     }
  675.     printf("********************************************************A***************************************************************\n");
  676.     printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
  677.     for(p=head;p!=NULL;p=p->next)
  678.     {
  679.         if(transformint(p->average_score)>=80)
  680.         {
  681.             printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
  682.         }
  683.     }
  684.     printf("********************************************************B***************************************************************\n");
  685.     printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
  686.     for(p=head;p!=NULL;p=p->next)
  687.     {
  688.         if(transformint(p->average_score)<80&&transformint(p->average_score)>=60)
  689.         {
  690.             printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
  691.         }
  692.     }
  693.     printf("********************************************************C***************************************************************\n");
  694.     printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
  695.     for(p=head;p!=NULL;p=p->next)
  696.     {
  697.         if(transformint(p->average_score)<60)
  698.         {
  699.             printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
  700.         }
  701.     }
  702.     printf("\n");
  703.     system("pause");
  704.     system("cls");
  705.     fflush(stdin);
  706. }



  707. void save(struct student *head)//文件保存
  708. {
  709.     system("cls");
  710.     fflush(stdin);
  711.     FILE *fp;
  712.     struct student *p;
  713.     fp=fopen("stu.db","wb");

  714.     for(p=head;p!=NULL;p=p->next)
  715.     {
  716.         fwrite(p,LEN,1,fp);
  717.     }
  718.     fclose(fp);
  719.     printf("♂♂♂♂保存完毕♂♂♂♂♂\n");
  720.     system("pause");
  721.     system("cls");
  722.     fflush(stdin);
  723. }

  724. void export1()//文件输出
  725. {
  726.     system("cls");
  727.     fflush(stdin);
  728.     FILE *fp;
  729.     struct student *t;
  730.     t=(struct student *)malloc(LEN);
  731.     if((fp=fopen("stu.db","r"))==NULL){
  732.         printf("未找到文件\n");
  733.     }
  734.     else{
  735.         printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
  736.         int w;
  737.         fseek(fp,0,2);
  738.         w=ftell(fp);
  739.         fseek(fp,0,0);
  740.         while(w!=ftell(fp)){
  741.             fread(t,LEN,1,fp);
  742.             printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",t->num,t->name,t->average_score,t->CHN,t->MATH,t->ENG,t->PE,t->PRO);
  743.         }
  744.         fclose(fp);
  745.     }
  746.     system("pause");
  747.     system("cls");
  748.     fflush(stdin);
  749. }

  750. struct student *import()//文件导入
  751. {
  752.     system("cls");
  753.     fflush(stdin);
  754.     FILE *fp;
  755.     if((fp=fopen("stu.db","r"))==NULL){
  756.         printf("未找到文件\n");
  757.     }
  758.     else{
  759.         struct student *p1,*p2,*head;
  760.         p1=p2=(struct student *)malloc(LEN);
  761.         fread(p1,LEN,1,fp);
  762.         while(!feof(fp)) {//end of file
  763.             n+=1;
  764.             if(n==1){
  765.                 head=p1;
  766.             }
  767.             else{
  768.                 p2->next=p1;
  769.             }
  770.             p2=p1;
  771.             p1=(struct student *)malloc(LEN);
  772.             fread(p1,LEN,1,fp);
  773.         }
  774.         p2->next=NULL;
  775.         fclose(fp);
  776.         printf("文件导入成功\n");
  777.         system("pause");
  778.         system("cls");
  779.         fflush(stdin);
  780.         return head;
  781.     }
  782.     system("cls");
  783.     fflush(stdin);
  784.     return NULL;
  785. }

  786. int checknum(char ch[])//检查纯数字的数据里是否混入了非数字的非法输入;
  787. {
  788.     int i,flag=1;
  789.     for(i=0;i<strlen(ch);i++)
  790.     {
  791.         if(ch[i]<'0'||ch[i]>'9')
  792.         {
  793.             flag=0;
  794.             break;
  795.         }
  796.     }
  797.     return flag;
  798. }

  799. int checkscore(char ch[])//检查0-99分数
  800. {
  801.     int i,flag=1;
  802.     if(strlen(ch)>=3)
  803.     {
  804.         return 0;
  805.     }
  806.     for(i=0;i<strlen(ch);i++)
  807.     {
  808.         if(ch[i]<'0'||ch[i]>'9')
  809.         {
  810.             flag=0;
  811.             break;
  812.         }
  813.     }
  814.     return flag;
  815. }

  816. int IncludeChinese(char *str)//是否包含中文
  817. {
  818.     char c;
  819.     while(1)
  820.     {
  821.         c=*str++;
  822.         if (c==0) break;  //如果到字符串尾则说明该字符串没有中文字符
  823.         if (c&0x80)        //如果字符高位为1且下一字符高位也是1则有中文字符
  824.             if (*str & 0x80) return 1;
  825.     }
  826.     return 0;
  827. }

  828. int transformint(char ch[])//纯数字整数(字符串转向int类型)
  829. {
  830.     int i=0,sum=0;
  831.     for(i=0;i<strlen(ch);i++)
  832.     {
  833.         sum=sum*10+ch[i]-48;
  834.     }
  835.     return sum;
  836. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

348

主题

2625

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部