搜索
查看: 373|回复: 3
打印 上一主题 下一主题

编制一个学生的选课及学籍管理程序!急!求大神帮助!谢谢!

[复制链接]
跳转到指定楼层
楼主
 楼主| 发表于 2018-12-27 23:24:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
16啊哈币
【问题描述】
现有若干个班级的学生,进行下学期课程的选课,假设已经通过文件储存了选课内容的数据库,数据库中包括n门课(课程内容由学生自己定)
第i门课程能接纳的学生数为10×i,i为课程的序号,即第一门课能接纳的学生数为10×1,第二门课为10×2,...... 依此类推,每门课的学分数分别为
1、2、3、4、5、6、7,现要求每一个学生至少选3门课,最多不超过5门。
【实现提示】
(1)显示课程内容供学生选择,并能进行选课的操作。
(2)随着学生选课工作的进行,动态更新数据库的内容,显示各科剩余学位。
(3)进行学生的最少选课量和最多选课量的控制。
(4)显示所有学生的选课的结果。
(5)把学生所选的课按学分总积分由小到大排列,同样学分按姓名的英文字母排序。
(6)学生总人数和选课数量由程序自动控制
(7)选课情况需存入文件,能从文件读取并显示。
【测试数据】
自定模拟数据

沙发
发表于 2019-1-1 17:07:19 | 只看该作者
这个用C太麻烦了,还是用C++或者Python吧……(个人推荐Python)
板凳
发表于 2019-1-26 10:27:49 | 只看该作者
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>
  4. #include<dos.h>
  5. #include<string.h>
  6. #define LEN sizeof(struct student)
  7. #define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
  8. #define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum
  9. float Felec,Fexpe,Frequ;
  10. struct student/*定义学生成绩结构体*/
  11. {
  12.         int num;/*学号*/
  13.         char name[15];/*姓名*/
  14.         double elec;/*选修课*/
  15.         double expe;/*实验课*/
  16.         double requ;/*必修课*/
  17.         double sum;/*总分*/
  18. };
  19. struct student stu[50];/*定义结构体数组*/
  20. void in();/*录入学生成绩信息*/
  21. void show();/*显示学生信息*/
  22. void order();/*按总分排序*/
  23. void del();/*删除学生成绩信息*/
  24. void modify();/*修改学生成绩信息*/
  25. void menu();/*主菜单*/
  26. void insert();/*插入学生信息*/
  27. void total();/*计算总人数*/
  28. void search();/*查找学生信息*/
  29. int main()/*主函数*/
  30. {
  31.         int n;
  32.         menu();
  33.         scanf("%d",&n);/*输入选择功能的编号*/
  34.         while(n)
  35.         {
  36.                 switch(n)
  37.                 {
  38.                 case 1:
  39.                         in();
  40.                         break;
  41.                 case 2:
  42.                         search();
  43.                         break;
  44.                 case 3:
  45.                         del();
  46.                         break;
  47.                 case 4:
  48.                         modify();
  49.                         break;
  50.                 case 5:
  51.                         insert();
  52.                         break;
  53.                 case 6:
  54.                         order();
  55.                         break;
  56.                 case 7:
  57.                         total();
  58.                         break;
  59.                 default:break;
  60.                 }
  61.                 getch();
  62.                 menu();/*执行完功能再次显示菜单界面*/
  63.                 scanf("%d",&n);
  64.         }
  65. }

  66. void in()/*录入学生信息*/
  67. {
  68.         int i,m=0;/*m是记录的条数*/
  69.         char ch[2];
  70.         FILE *fp;/*定义文件指针*/
  71.         if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
  72.         {
  73.                 printf("can not open\n");
  74.                 return 0;
  75.         }
  76.         while(!feof(fp))
  77.         {
  78.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  79.                         m++;/*统计当前记录条数*/
  80.         }
  81.         fclose(fp);
  82.         if(m==0)
  83.                 printf("No record!\n");
  84.         else
  85.         {
  86.                 system("cls");
  87.                 show();/*调用show函数,显示原有信息*/
  88.         }
  89.         if((fp=fopen("data","wb"))==NULL)
  90.         {
  91.                 printf("can not open\n");
  92.                 return 0;
  93.         }
  94.         for(i=0;i<m;i++)
  95.                 fwrite(&stu[i] ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
  96.         printf("please input(y/n):");
  97.         scanf("%s",ch);
  98.         if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
  99.         {
  100.                 printf("please input per centum:");
  101.                 printf("\nelective:");
  102.                 scanf("%f",&Felec);
  103.                 printf("\nexperiment:");
  104.                 scanf("%f",&Fexpe);
  105.                 printf("\nrequired course:");
  106.                 scanf("%f",&Frequ);
  107.         }
  108.         while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
  109.         {
  110.                 printf("number:");
  111.                 scanf("%d",&stu[m].num);/*输入学生学号*/
  112.                 for(i=0;i<m;i++)
  113.                         if(stu[i].num==stu[m].num)
  114.                         {
  115.                                 printf("the number is existing,press any to continue!");
  116.                                 getch();
  117.                                 fclose(fp);
  118.                                 return 0;
  119.                         }
  120.                         printf("name:");
  121.                         scanf("%s",stu[m].name);/*输入学生姓名*/
  122.                         printf("elective:");
  123.                         scanf("%lf",&stu[m].elec);/*输入选修课成绩*/
  124.                         printf("experiment:");
  125.                         scanf("%lf",&stu[m].expe);/*输入实验课成绩*/
  126.                         printf("required course:");
  127.                         scanf("%lf",&stu[m].requ);/*输入必修课成绩*/
  128.                         stu[m].sum=stu[m].elec*Felec+stu[m].expe*Fexpe+stu[m].requ*Frequ;/*计算出总成绩*/
  129.                         if(fwrite(&stu[m],LEN,1,fp)!=1)/*将新录入的信息写入指定的磁盘文件*/
  130.                         {
  131.                                 printf("can not save!");
  132.                                 getch();
  133.                         }
  134.                         else
  135.                         {
  136.                                 printf("%s saved!\n",stu[m].name);
  137.                                 m++;
  138.                         }
  139.                         printf("continue?(y/n):");/*询问是否继续*/
  140.                         scanf("%s",ch);
  141.         }
  142.         fclose(fp);
  143.         printf("OK!\n");
  144. }

  145. void show()
  146. {
  147.         FILE *fp;
  148.         int i,m=0;
  149.         fp=fopen("data","ab+");
  150.         while(!feof(fp))
  151.         {
  152.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  153.                         m++;
  154.         }  
  155.         fclose(fp);
  156.         printf("number  name           elective    experiment  required    sum\t\n");
  157.         for(i=0;i<m;i++)
  158.         {
  159.                 printf(FORMAT,DATA);/*将信息按指定格式打印*/
  160.         }
  161. }

  162. void menu()/*自定义函数实现菜单功能*/
  163. {
  164.         system("cls");
  165.         printf("\n\n\n\n\n");
  166.         printf("\t\t|---------------------STUDENT-------------------|\n");
  167.         printf("\t\t|\t 0. exit                                |\n");
  168.         printf("\t\t|\t 1. input record                        |\n");
  169.         printf("\t\t|\t 2. search record                       |\n");
  170.         printf("\t\t|\t 3. delete record                       |\n");
  171.         printf("\t\t|\t 4. modify record                       |\n");
  172.         printf("\t\t|\t 5. insert record                       |\n");
  173.         printf("\t\t|\t 6. order                               |\n");
  174.         printf("\t\t|\t 7. number                              |\n");
  175.         printf("\t\t|-----------------------------------------------|\n\n");
  176.         printf("\t\t\tchoose(0-7):");
  177. }

  178. void order()/*自定义排序函数*/
  179. {
  180.         FILE *fp;
  181.         struct student t;
  182.         int i=0,j=0,m=0;
  183.         if((fp=fopen("data","ab+"))==NULL)
  184.         {
  185.                 printf("can not open!\n");
  186.                 return 0;
  187.         }
  188.         while(!feof(fp))
  189.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  190.                         m++;
  191.                 fclose(fp);
  192.                 if(m==0)
  193.                 {
  194.                         printf("no record!\n");
  195.                         return 0;
  196.                 }
  197.                 for(i=0;i<m-1;i++)
  198.                         for(j=i+1;j<m;j++)/*双重循环实现成绩比较并交换*/
  199.                                 if(stu[i].sum<stu[j].sum)
  200.                                 {
  201.                                         t=stu[i];
  202.                                         stu[i]=stu[j];
  203.                                         stu[j]=t;
  204.                                 }
  205.                                 if((fp=fopen("data","wb"))==NULL)
  206.                                 {
  207.                                         printf("can not open\n");
  208.                                         return 0;
  209.                                 }
  210.                                 for(i=0;i<m;i++)/*将重新排好序的内容重新写入指定的磁盘文件中*/
  211.                                         if(fwrite(&stu[i] ,LEN,1,fp)!=1)
  212.                                         {
  213.                                                 printf("%s can not save!\n");
  214.                                                 getch();
  215.                                         }
  216.                                         fclose(fp);
  217.                                         printf("save successfully\n");
  218. }
  219. void del()/*自定义删除函数*/
  220. {
  221.         FILE *fp;
  222.         int snum,i,j,m=0;
  223.         char ch[2];
  224.         if((fp=fopen("data","ab+"))==NULL)
  225.         {
  226.                 printf("can not open\n");
  227.                 return 0;
  228.         }
  229.         while(!feof(fp))  
  230.                 if(fread(&stu[m],LEN,1,fp)==1)
  231.                         m++;
  232.                 fclose(fp);
  233.                 if(m==0)
  234.                 {
  235.                         printf("no record!\n");
  236.                         return 0;
  237.                 }
  238.                 printf("please input the number:");
  239.                 scanf("%d",&snum);
  240.                 for(i=0;i<m;i++)
  241.                         if(snum==stu[i].num)
  242.                                 break;
  243.                  if(i==m)
  244.                         {
  245.                         printf("can not find");
  246.                         getchar();
  247.                         return 0;
  248.                         }
  249.                         printf("find the student,delete?(y/n)");
  250.                         scanf("%s",ch);
  251.                         if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
  252.                         {
  253.                                 for(j=i;j<m;j++)
  254.                                         stu[j]=stu[j+1];/*将后一个记录移到前一个记录的位置*/
  255.                                         m--;/*记录的总个数减1*/
  256.                                         printf("delete successfully!\n");
  257.                                 }
  258.                                 if((fp=fopen("data","wb"))==NULL)
  259.                                 {
  260.                                         printf("can not open\n");
  261.                                         return 0;
  262.                                 }
  263.                                 for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
  264.                                         if(fwrite(&stu[j] ,LEN,1,fp)!=1)
  265.                                         {
  266.                                                 printf("can not save!\n");
  267.                                                 getch();
  268.                                         }
  269.                                         fclose(fp);
  270.                                
  271. }

  272. void search()/*自定义查找函数*/
  273. {
  274.         FILE *fp;
  275.         int snum,i,m=0;
  276.         char ch[2];
  277.         if((fp=fopen("data","ab+"))==NULL)
  278.         {
  279.                 printf("can not open\n");
  280.                 return 0;
  281.         }
  282.         while(!feof(fp))
  283.                 if(fread(&stu[m],LEN,1,fp)==1)
  284.                         m++;
  285.                 fclose(fp);
  286.                 if(m==0)
  287.                 {
  288.                         printf("no record!\n");
  289.                         return 0;
  290.                 }
  291.                 printf("please input the number:");
  292.                 scanf("%d",&snum);
  293.                 for(i=0;i<m;i++)
  294.                         if(snum==stu[i].num)/*查找输入的学号是否在记录中*/
  295.                         {
  296.                                 printf("find the student,show?(y/n)");
  297.                                 scanf("%s",ch);
  298.                                 if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
  299.                                 {
  300.                                         printf("number  name           elective    experiment  required    sum\t\n");
  301.                                         printf(FORMAT,DATA);/*将查找出的结果按指定格式输出*/
  302.                                         break;
  303.                                 }
  304.                                 else
  305.                                         return 0;
  306.                         }   
  307.                         if(i==m)
  308.                                 printf("can not find the student!\n");/*未找到要查找的信息*/
  309. }

  310. void modify()/*自定义修改函数*/
  311. {
  312.         FILE *fp;
  313.         int i,j,m=0,snum;
  314.         if((fp=fopen("data","ab+"))==NULL)
  315.         {
  316.                 printf("can not open\n");
  317.                 return 0;
  318.         }
  319.         while(!feof(fp))  
  320.                 if(fread(&stu[m],LEN,1,fp)==1)
  321.                         m++;
  322.                 if(m==0)
  323.                 {
  324.                         printf("no record!\n");
  325.                         fclose(fp);
  326.                         return 0;
  327.                 }
  328.                 printf("please input the number of the student which do you want to modify!\n");
  329.                 scanf("%d",&snum);
  330.                 for(i=0;i<m;i++)
  331.                         if(snum==stu[i].num)/*检索记录中是否有要修改的信息*/
  332.                                 break;
  333.                         if(i<m)
  334.                         {       
  335.                                 printf("find the student!you can modify!\n");
  336.                                 printf("please input per centum:");
  337.                                 printf("\nelective:");
  338.                                 scanf("%f",&Felec);
  339.                                 printf("\nexperiment:");
  340.                                 scanf("%f",&Fexpe);
  341.                                 printf("\nrequired course:");
  342.                                 scanf("%f",&Frequ);
  343.                                 printf("name:\n");
  344.                                 scanf("%s",stu[i].name);/*输入名字*/
  345.                                 printf("\nelective:");
  346.                                 scanf("%lf",&stu[i].elec);/*输入选修课成绩*/
  347.                                 printf("\nexperiment:");
  348.                                 scanf("%lf",&stu[i].expe);/*输入实验课成绩*/
  349.                                 printf("\nrequired course:");
  350.                                 scanf("%lf",&stu[i].requ);/*输入必修课成绩*/
  351.                                 stu[i].sum=stu[i].elec*Felec+stu[i].expe*Fexpe+stu[i].requ*Frequ;
  352.                         }
  353.                         else
  354.                         {
  355.                                 printf("can not find!");
  356.                                 getchar();
  357.                                 return 0;
  358.                         }
  359.                         if((fp=fopen("data","wb"))==NULL)
  360.                         {
  361.                                 printf("can not open\n");
  362.                                 return 0;
  363.                         }
  364.                         for(j=0;j<m;j++)/*将新修改的信息写入指定的磁盘文件中*/
  365.                                 if(fwrite(&stu[j] ,LEN,1,fp)!=1)
  366.                                 {
  367.                                         printf("can not save!");
  368.                                         getch();
  369.                                 }
  370.                                 fclose(fp);
  371. }

  372. void insert()/*自定义插入函数*/
  373. {
  374.         FILE *fp;
  375.         int i,j,k,m=0,snum;
  376.         if((fp=fopen("data","ab+"))==NULL)
  377.         {
  378.                 printf("can not open\n");
  379.                 return 0;
  380.         }
  381.         while(!feof(fp))  
  382.                 if(fread(&stu[m],LEN,1,fp)==1)
  383.                         m++;
  384.                 if(m==0)
  385.                 {
  386.                         printf("no record!\n");
  387.                         fclose(fp);
  388.                         return 0;
  389.                 }
  390.                 printf("please input position where do you want to insert!(input the number)\n");
  391.                 scanf("%d",&snum);/*输入要插入的位置*/
  392.                 for(i=0;i<m;i++)
  393.                         if(snum==stu[i].num)
  394.                                 break;
  395.                         for(j=m-1;j>i;j--)
  396.                                 stu[j+1]=stu[j];/*从最后一条记录开始均向后移一位*/
  397.                         printf("now please input the new information.\n");
  398.                         printf("number:");
  399.                         scanf("%d",&stu[i+1].num);
  400.                         for(k=0;k<m;k++)
  401.                                 if(stu[k].num==stu[i+1].num&&k!=i+1)
  402.                                 {
  403.                                         printf("the number is existing,press any to continue!");
  404.                                         getch();
  405.                                         fclose(fp);
  406.                                         return 0;
  407.                                 }
  408.                                 printf("please input per centum:");
  409.                                 printf("\nelective:");
  410.                                 scanf("%f",&Felec);
  411.                                 printf("\nexperiment:");
  412.                                 scanf("%f",&Fexpe);
  413.                                 printf("\nrequired course:");
  414.                                 scanf("%f",&Frequ);
  415.                                 printf("name:\n");
  416.                                 scanf("%s",stu[i+1].name);
  417.                                 printf("\nelective:");
  418.                                 scanf("%lf",&stu[i+1].elec);
  419.                                 printf("\nexperiment:");
  420.                                 scanf("%lf",&stu[i+1].expe);
  421.                                 printf("\nrequired course:");
  422.                                 scanf("%lf",&stu[i+1].requ);
  423.                                 stu[i+1].sum=stu[i+1].elec*Felec+stu[i+1].expe*Fexpe+stu[i+1].requ*Frequ;
  424.                                 if((fp=fopen("data","wb"))==NULL)
  425.                                 {
  426.                                         printf("can not open\n");
  427.                                         return 0;
  428.                                 }
  429.                                 for(k=0;k<=m;k++)
  430.                                         if(fwrite(&stu[k] ,LEN,1,fp)!=1)/*将修改后的记录写入磁盘文件中*/
  431.                                         {
  432.                                                 printf("can not save!");
  433.                                                 getch();
  434.                                         }
  435.                                         fclose(fp);
  436. }

  437. void total()
  438. {
  439.         FILE *fp;
  440.         int m=0;
  441.         if((fp=fopen("data","ab+"))==NULL)
  442.         {         
  443.                 printf("can not open\n");
  444.                 return 0;
  445.         }
  446.         while(!feof(fp))  
  447.                 if(fread(&stu[m],LEN,1,fp)==1)
  448.                         m++;/*统计记录个数即学生个数*/
  449.                 if(m==0)
  450.                 {
  451.                         printf("no record!\n");
  452.                         fclose(fp);
  453.                         return 0;
  454.                 }
  455.                 printf("the class are %d students!\n",m);/*将统计的个数输出*/
  456.                 fclose(fp);
  457. }
复制代码
地板
发表于 2019-1-26 10:29:13 | 只看该作者
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>
  4. #include<dos.h>
  5. #include<string.h>
  6. #define LEN sizeof(struct student)
  7. #define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
  8. #define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum
  9. float Felec,Fexpe,Frequ;
  10. struct student/*定义学生成绩结构体*/
  11. {
  12.         int num;/*学号*/
  13.         char name[15];/*姓名*/
  14.         double elec;/*选修课*/
  15.         double expe;/*实验课*/
  16.         double requ;/*必修课*/
  17.         double sum;/*总分*/
  18. };
  19. struct student stu[50];/*定义结构体数组*/
  20. void in();/*录入学生成绩信息*/
  21. void show();/*显示学生信息*/
  22. void order();/*按总分排序*/
  23. void del();/*删除学生成绩信息*/
  24. void modify();/*修改学生成绩信息*/
  25. void menu();/*主菜单*/
  26. void insert();/*插入学生信息*/
  27. void total();/*计算总人数*/
  28. void search();/*查找学生信息*/
  29. int main()/*主函数*/
  30. {
  31.         int n;
  32.         menu();
  33.         scanf("%d",&n);/*输入选择功能的编号*/
  34.         while(n)
  35.         {
  36.                 switch(n)
  37.                 {
  38.                 case 1:
  39.                         in();
  40.                         break;
  41.                 case 2:
  42.                         search();
  43.                         break;
  44.                 case 3:
  45.                         del();
  46.                         break;
  47.                 case 4:
  48.                         modify();
  49.                         break;
  50.                 case 5:
  51.                         insert();
  52.                         break;
  53.                 case 6:
  54.                         order();
  55.                         break;
  56.                 case 7:
  57.                         total();
  58.                         break;
  59.                 default:break;
  60.                 }
  61.                 getch();
  62.                 menu();/*执行完功能再次显示菜单界面*/
  63.                 scanf("%d",&n);
  64.         }
  65. }

  66. void in()/*录入学生信息*/
  67. {
  68.         int i,m=0;/*m是记录的条数*/
  69.         char ch[2];
  70.         FILE *fp;/*定义文件指针*/
  71.         if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
  72.         {
  73.                 printf("哎呀 打不开呀\n");
  74.                 return 0;
  75.         }
  76.         while(!feof(fp))
  77.         {
  78.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  79.                         m++;/*统计当前记录条数*/
  80.         }
  81.         fclose(fp);
  82.         if(m==0)
  83.                 printf("没有学生!\n");
  84.         else
  85.         {
  86.                 system("cls");
  87.                 show();/*调用show函数,显示原有信息*/
  88.         }
  89.         if((fp=fopen("data","wb"))==NULL)
  90.         {
  91.                 printf("哎呀 打不开呀\n");
  92.                 return 0;
  93.         }
  94.         for(i=0;i<m;i++)
  95.                 fwrite(&stu[i] ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
  96.         printf("请输入读入信息(Y/N):");
  97.         scanf("%s",ch);
  98.         if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
  99.         {
  100.                 printf("请输入课程所占百分比:");
  101.                 printf("\n选修课:");
  102.                 scanf("%f",&Felec);
  103.                 printf("\n实验课:");
  104.                 scanf("%f",&Fexpe);
  105.                 printf("\n必修课:");
  106.                 scanf("%f",&Frequ);
  107.         }
  108.         while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
  109.         {
  110.                 printf("学号:");
  111.                 scanf("%d",&stu[m].num);/*输入学生学号*/
  112.                 for(i=0;i<m;i++)
  113.                         if(stu[i].num==stu[m].num)
  114.                         {
  115.                                 printf("此号码已存在!按任意键退出");
  116.                                 getch();
  117.                                 fclose(fp);
  118.                                 return 0;
  119.                         }
  120.                         printf("姓名:");
  121.                         scanf("%s",stu[m].name);/*输入学生姓名*/
  122.                         printf("选修课:");
  123.                         scanf("%lf",&stu[m].elec);/*输入选修课成绩*/
  124.                         printf("实验课:");
  125.                         scanf("%lf",&stu[m].expe);/*输入实验课成绩*/
  126.                         printf("必修课:");
  127.                         scanf("%lf",&stu[m].requ);/*输入必修课成绩*/
  128.                         stu[m].sum=stu[m].elec*Felec+stu[m].expe*Fexpe+stu[m].requ*Frequ;/*计算出总成绩*/
  129.                         if(fwrite(&stu[m],LEN,1,fp)!=1)/*将新录入的信息写入指定的磁盘文件*/
  130.                         {
  131.                                 printf("无法读入!");
  132.                                 getch();
  133.                         }
  134.                         else
  135.                         {
  136.                                 printf("%s 录入成功!\n",stu[m].name);
  137.                                 m++;
  138.                         }
  139.                         printf("继续吗(Y/N):");/*询问是否继续*/
  140.                         scanf("%s",ch);
  141.         }
  142.         fclose(fp);
  143.         printf("OK!\n");
  144. }

  145. void show()
  146. {
  147.         FILE *fp;
  148.         int i,m=0;
  149.         fp=fopen("data","ab+");
  150.         while(!feof(fp))
  151.         {
  152.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  153.                         m++;
  154.         }  
  155.         fclose(fp);
  156.         printf("number  name           elective    experiment  required    sum\t\n");
  157.     printf("学号    姓名           选修课      实验课      必修课      总和\t\n");
  158.         for(i=0;i<m;i++)
  159.         {
  160.                 printf(FORMAT,DATA);/*将信息按指定格式打印*/
  161.         }
  162. }

  163. void menu()/*自定义函数实现菜单功能*/
  164. {
  165.         system("cls");
  166.         printf("\n\n\n\n\n");
  167.         printf("\t\t|------------------学生成绩管理-----------------|\n");
  168.         printf("\t\t|\t 0. 退出                                |\n");
  169.         printf("\t\t|\t 1. 录入成绩                            |\n");
  170.         printf("\t\t|\t 2. 成绩查找                            |\n");
  171.         printf("\t\t|\t 3. 信息删除                            |\n");
  172.         printf("\t\t|\t 4. 信息修改                            |\n");
  173.         printf("\t\t|\t 5. 信息插入                            |\n");
  174.         printf("\t\t|\t 6. 成绩排名                            |\n");
  175.         printf("\t\t|\t 7. 人数统计                            |\n");
  176.         printf("\t\t|-----------------------------------------------|\n\n");
  177.         printf("\t\t\t选择功能(0-7):");
  178. }

  179. void order()/*自定义排序函数*/
  180. {
  181.         FILE *fp;
  182.         struct student t;
  183.         int i=0,j=0,m=0;
  184.         if((fp=fopen("data","ab+"))==NULL)
  185.         {
  186.                 printf("哎呀 打不开呀!\n");
  187.                 return 0;
  188.         }
  189.         while(!feof(fp))
  190.                 if(fread(&stu[m] ,LEN,1,fp)==1)
  191.                         m++;
  192.                 fclose(fp);
  193.                 if(m==0)
  194.                 {
  195.                         printf("没有记录!\n");
  196.                         return 0;
  197.                 }
  198.                 for(i=0;i<m-1;i++)
  199.                         for(j=i+1;j<m;j++)/*双重循环实现成绩比较并交换*/
  200.                                 if(stu[i].sum<stu[j].sum)
  201.                                 {
  202.                                         t=stu[i];
  203.                                         stu[i]=stu[j];
  204.                                         stu[j]=t;
  205.                                 }
  206.                                 if((fp=fopen("data","wb"))==NULL)
  207.                                 {
  208.                                         printf("哎呀 打不开呀\n");
  209.                                         return 0;
  210.                                 }
  211.                                 for(i=0;i<m;i++)/*将重新排好序的内容重新写入指定的磁盘文件中*/
  212.                                         if(fwrite(&stu[i] ,LEN,1,fp)!=1)
  213.                                         {
  214.                                                 printf("%s 出问题了!\n");
  215.                                                 getch();
  216.                                         }
  217.                                         fclose(fp);
  218.                                         printf("刷新录入成功\n");
  219. }
  220. void del()/*自定义删除函数*/
  221. {
  222.         FILE *fp;
  223.         int snum,i,j,m=0;
  224.         char ch[2];
  225.         if((fp=fopen("data","ab+"))==NULL)
  226.         {
  227.                 printf("哎呀 打不开呀\n");
  228.                 return 0;
  229.         }
  230.         while(!feof(fp))  
  231.                 if(fread(&stu[m],LEN,1,fp)==1)
  232.                         m++;
  233.                 fclose(fp);
  234.                 if(m==0)
  235.                 {
  236.                         printf("未查询到记录!\n");
  237.                         return 0;
  238.                 }
  239.                 printf("请输入删除学生序号:");
  240.                 scanf("%d",&snum);
  241.                 for(i=0;i<m;i++)
  242.                         if(snum==stu[i].num)
  243.                                 break;
  244.                  if(i==m)
  245.                         {
  246.                         printf("哎呀 找不到");
  247.                         getchar();
  248.                         return 0;
  249.                         }
  250.                         printf("找到该学生 是否删除?(y/n)");
  251.                         scanf("%s",ch);
  252.                         if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
  253.                         {
  254.                                 for(j=i;j<m;j++)
  255.                                         stu[j]=stu[j+1];/*将后一个记录移到前一个记录的位置*/
  256.                                         m--;/*记录的总个数减1*/
  257.                                         printf("删除成功!\n");
  258.                                 }
  259.                                 if((fp=fopen("data","wb"))==NULL)
  260.                                 {
  261.                                         printf("哎呀 打不开呀\n");
  262.                                         return 0;
  263.                                 }
  264.                                 for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
  265.                                         if(fwrite(&stu[j] ,LEN,1,fp)!=1)
  266.                                         {
  267.                                                 printf("出问题了!\n");
  268.                                                 getch();
  269.                                         }
  270.                                         fclose(fp);
  271.                                
  272. }

  273. void search()/*自定义查找函数*/
  274. {
  275.         FILE *fp;
  276.         int snum,i,m=0;
  277.         char ch[2];
  278.         if((fp=fopen("data","ab+"))==NULL)
  279.         {
  280.                 printf("哎呀 打不开呀\n");
  281.                 return 0;
  282.         }
  283.         while(!feof(fp))
  284.                 if(fread(&stu[m],LEN,1,fp)==1)
  285.                         m++;
  286.                 fclose(fp);
  287.                 if(m==0)
  288.                 {
  289.                         printf("哎呀 找不到!\n");
  290.                         return 0;
  291.                 }
  292.                 printf("请输入查找学生的学号:");
  293.                 scanf("%d",&snum);
  294.                 for(i=0;i<m;i++)
  295.                         if(snum==stu[i].num)/*查找输入的学号是否在记录中*/
  296.                         {
  297.                                 printf("已找到 是否输出结果?(y/n)");
  298.                                 scanf("%s",ch);
  299.                                 if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
  300.                                 {
  301.                                         printf("number  name           elective    experiment  required    sum\t\n");
  302.                     printf("学号    姓名           选修课      实验课      必修课      总和\t\n");
  303.                                         printf(FORMAT,DATA);/*将查找出的结果按指定格式输出*/
  304.                                         break;
  305.                                 }
  306.                                 else
  307.                                         return 0;
  308.                         }   
  309.                         if(i==m)
  310.                                 printf("哎呀 找不到该学生!\n");/*未找到要查找的信息*/
  311. }

  312. void modify()/*自定义修改函数*/
  313. {
  314.         FILE *fp;
  315.         int i,j,m=0,snum;
  316.         if((fp=fopen("data","ab+"))==NULL)
  317.         {
  318.                 printf("哎呀 打不开呀\n");
  319.                 return 0;
  320.         }
  321.         while(!feof(fp))  
  322.                 if(fread(&stu[m],LEN,1,fp)==1)
  323.                         m++;
  324.                 if(m==0)
  325.                 {
  326.                         printf("哎呀 找不到!\n");
  327.                         fclose(fp);
  328.                         return 0;
  329.                 }
  330.                 printf("请输入你想修改学生的学号!\n");
  331.                 scanf("%d",&snum);
  332.                 for(i=0;i<m;i++)
  333.                         if(snum==stu[i].num)/*检索记录中是否有要修改的信息*/
  334.                                 break;
  335.                         if(i<m)
  336.                         {       
  337.                                 printf("找到该学生!请修改!\n");
  338.                                 printf("请输入课程所占百分比:");
  339.                                 printf("\n选修课:");
  340.                                 scanf("%f",&Felec);
  341.                                 printf("\n实验课:");
  342.                                 scanf("%f",&Fexpe);
  343.                                 printf("\n必修课:");
  344.                                 scanf("%f",&Frequ);
  345.                                 printf("姓名:\n");
  346.                                 scanf("%s",stu[i].name);/*输入名字*/
  347.                                 printf("\n选修课:");
  348.                                 scanf("%lf",&stu[i].elec);/*输入选修课成绩*/
  349.                                 printf("\n实验课:");
  350.                                 scanf("%lf",&stu[i].expe);/*输入实验课成绩*/
  351.                                 printf("\n必修课:");
  352.                                 scanf("%lf",&stu[i].requ);/*输入必修课成绩*/
  353.                                 stu[i].sum=stu[i].elec*Felec+stu[i].expe*Fexpe+stu[i].requ*Frequ;
  354.                         }
  355.                         else
  356.                         {
  357.                                 printf("哎呀 找不到!");
  358.                                 getchar();
  359.                                 return 0;
  360.                         }
  361.                         if((fp=fopen("data","wb"))==NULL)
  362.                         {
  363.                                 printf("哎呀 打不开呀\n");
  364.                                 return 0;
  365.                         }
  366.                         for(j=0;j<m;j++)/*将新修改的信息写入指定的磁盘文件中*/
  367.                                 if(fwrite(&stu[j] ,LEN,1,fp)!=1)
  368.                                 {
  369.                                         printf("出问题了!");
  370.                                         getch();
  371.                                 }
  372.                                 fclose(fp);
  373. }

  374. void insert()/*自定义插入函数*/
  375. {
  376.         FILE *fp;
  377.         int i,j,k,m=0,snum;
  378.         if((fp=fopen("data","ab+"))==NULL)
  379.         {
  380.                 printf("哎呀 打不开呀\n");
  381.                 return 0;
  382.         }
  383.         while(!feof(fp))  
  384.                 if(fread(&stu[m],LEN,1,fp)==1)
  385.                         m++;
  386.                 if(m==0)
  387.                 {
  388.                         printf("没有信息!\n");
  389.                         fclose(fp);
  390.                         return 0;
  391.                 }
  392.                 printf("请输入你想插入学生的学号\n");
  393.                 scanf("%d",&snum);/*输入要插入的位置*/
  394.                 for(i=0;i<m;i++)
  395.                         if(snum==stu[i].num)
  396.                                 break;
  397.                         for(j=m-1;j>i;j--)
  398.                                 stu[j+1]=stu[j];/*从最后一条记录开始均向后移一位*/
  399.                         printf("请输入相关信息.\n");
  400.                         printf("学号:");
  401.                         scanf("%d",&stu[i+1].num);
  402.                         for(k=0;k<m;k++)
  403.                                 if(stu[k].num==stu[i+1].num&&k!=i+1)
  404.                                 {
  405.                                         printf("输入错误!");
  406.                                         getch();
  407.                                         fclose(fp);
  408.                                         return 0;
  409.                                 }
  410.                             printf("找到该学生!请修改!\n");
  411.                                 printf("请输入课程所占百分比:");
  412.                                 printf("\n选修课:");
  413.                                 scanf("%f",&Felec);
  414.                                 printf("\n实验课:");
  415.                                 scanf("%f",&Fexpe);
  416.                                 printf("\n必修课:");
  417.                                 scanf("%f",&Frequ);
  418.                                 printf("姓名:\n");
  419.                                 scanf("%s",stu[i].name);/*输入名字*/
  420.                                 printf("\n选修课:");
  421.                                 scanf("%lf",&stu[i].elec);/*输入选修课成绩*/
  422.                                 printf("\n实验课:");
  423.                                 scanf("%lf",&stu[i].expe);/*输入实验课成绩*/
  424.                                 printf("\n必修课:");
  425.                                 scanf("%lf",&stu[i].requ);/*输入必修课成绩*/
  426.                                 stu[i+1].sum=stu[i+1].elec*Felec+stu[i+1].expe*Fexpe+stu[i+1].requ*Frequ;
  427.                  
  428.                  
  429.                                 if((fp=fopen("data","wb"))==NULL)
  430.                                 {
  431.                                         printf("打不开呀\n");
  432.                                         return 0;
  433.                                 }
  434.                                 for(k=0;k<=m;k++)
  435.                                         if(fwrite(&stu[k] ,LEN,1,fp)!=1)/*将修改后的记录写入磁盘文件中*/
  436.                                         {
  437.                                                 printf("上传失败!");
  438.                                                 getch();
  439.                                         }
  440.                                         fclose(fp);
  441. }

  442. void total()
  443. {
  444.         FILE *fp;
  445.         int m=0;
  446.         if((fp=fopen("data","ab+"))==NULL)
  447.         {         
  448.                 printf("哎呀 打不开呀\n");
  449.                 return 0;
  450.         }
  451.         while(!feof(fp))  
  452.                 if(fread(&stu[m],LEN,1,fp)==1)
  453.                         m++;/*统计记录个数即学生个数*/
  454.                 if(m==0)
  455.                 {
  456.                         printf("没有记录!\n");
  457.                         fclose(fp);
  458.                         return 0;
  459.                 }
  460.                 printf("班级内有 %d 个学生!\n",m);/*将统计的个数输出*/
  461.                 fclose(fp);
  462. }
复制代码

中文版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表