找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16052|回复: 0
打印 上一主题 下一主题
收起左侧

C语言做的一个学生选课系统程序源代码

[复制链接]
跳转到指定楼层
楼主
ID:85764 发表于 2015-7-15 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int N1,N2,kk1,kk2,kk3;
  4. struct couse * head1;
  5. struct student * head2;
  6. struct couse//课程信息结构体
  7. {
  8.     int num1;
  9.     char name1[20];
  10.     int score;
  11.     int nelepeo;//课程已选人数
  12.     int Melepeo;//课程人数上限
  13.     struct couse * next;
  14. };
  15. struct student//学生信息结构体
  16. {
  17.     int num2;
  18.     char name2[20];
  19.     int nelenum[50];//已选课程编号
  20.     int nelen;//已选课程数量
  21.     struct student * next;
  22. };
  23. void Ms()
  24. {
  25.     for(kk1=0;kk1<1100;kk1++)
  26.                 for(kk2=0;kk2<1200;kk2++)
  27.                     for(kk3=0;kk3<1200;kk3++);
  28. }
  29. void keyboardc()//录入课程子函数(从键盘录入)
  30. {
  31. struct couse *p1,*p2;
  32. N1=0;
  33. p1=p2=(struct couse*)malloc(sizeof(struct couse));
  34. printf("课程编号\t课程名称\t学分\t课程人数上限\n");
  35. scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo);
  36. p1->nelepeo=0;
  37. head1=NULL;
  38. while(p1->num1!=0)
  39. {
  40.     N1=N1+1;
  41.     if(N1==1)head1=p1;
  42.     else p2->next=p1;
  43.     p2=p1;
  44.     p1=(struct couse * )malloc(sizeof(struct couse));
  45.     scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo);
  46.     p1->nelepeo=0;
  47. }
  48. p2->next=NULL;
  49. }
  50. void filec()//录入键盘子函数(从文件录入)
  51. {
  52.     FILE * fp;
  53.     char filepath[20];
  54.     struct couse *p1,*p2;
  55.     N1=0;
  56.     printf("输入要读入的文件路径:");
  57.     getchar();
  58.     gets(filepath);
  59.     if((fp=fopen(filepath,"r"))==NULL)
  60.     {
  61.         printf("找不到%s文件!\n",filepath);
  62.         exit(0);
  63.     }
  64.     p1=p2=(struct couse*)malloc(sizeof(struct couse));
  65.     fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo);
  66.     head1=NULL;
  67.     while(!feof(fp))
  68.     {
  69.         N1=N1+1;
  70.         if(N1==1)head1=p1;
  71.         else p2->next=p1;
  72.         p2=p1;
  73.         p1=(struct couse * )malloc(sizeof(struct couse));
  74.         fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo);
  75.     }
  76.     p2->next=NULL;
  77. }
  78. void inputc()//录入课程主函数
  79. {
  80.     int i;
  81.     printf("\t\t\t录入课程信息\n");
  82.     printf("\n1.从键盘录入\n");
  83.     printf("2.从文件录入\n");
  84.     printf("3.返回主菜单\n");
  85.     printf("请选择(1~3):\n");
  86.     scanf("%d",&i);
  87.     switch(i)
  88.     {
  89.     case(1):keyboardc();break;
  90.     case(2):filec();break;
  91.     case(3):break;
  92.     }
  93. }
  94. void insertc(struct couse *incouse)//课程管理子函数(增加课程)
  95. {
  96.     struct couse *p0,*p1,*p2;
  97.     p1=head1;
  98.     p0=incouse;
  99.     if(head1==NULL)
  100.     {
  101.         head1=p0;
  102.         p0->next=NULL;
  103.     }
  104.     else
  105.     {
  106.         while((p0->num1 > p1->num1) && (p1->next!=NULL))
  107.         {
  108.             p2=p1;
  109.             p1=p1->next;
  110.         }
  111.         if(p0->num1 <= p1->num1)
  112.         {
  113.             if(head1==p1) head1=p0;
  114.             else p2->next=p0;
  115.             p0->next=p1;
  116.         }
  117.         else
  118.         {
  119.             p1->next=p0;
  120.             p0->next=NULL;
  121.         }
  122.     }
  123.     N1=N1+1;
  124. }
  125. void delc(int num1)//课程管理子函数(删除课程)
  126. {
  127.     struct couse *p1,*p2;
  128.     if(head1==NULL)
  129.     {
  130.         printf("\n没有课程,无法删除!\n");
  131.         goto end;
  132.     }
  133.     p1=head1;
  134.     while(num1!=p1->num1 && p1->next!=NULL)
  135.     {
  136.         p2=p1;
  137.         p1=p1->next;
  138.     }
  139.     if(num1==p1->num1)
  140.     {
  141.         if(p1==head1) head1=p1->next;
  142.         else p2->next=p1->next;
  143.         printf("已删除该编号课程!\n");
  144.         N1=N1-1;
  145.     }
  146.     else printf("无该编号的课程!\n");
  147.     end:;
  148. }
  149. void managementc()//课程管理主函数
  150. {
  151.     struct couse * incouse;
  152.     int i,num1;
  153.     printf("\t\t\t课程管理\n");
  154.     printf("1.新增课程\n");
  155.     printf("2.删除课程\n");
  156.     printf("3.返回主菜单\n");
  157.     printf("请选择(1~3):\n");
  158.     scanf("%d",&i);
  159.     switch(i)
  160.     {
  161.     case(1):
  162.         {
  163.             incouse=(struct couse *)malloc(sizeof(struct couse));
  164.             printf("课程编号\t课程名称\t学分\t课程人数上限\n");
  165.             scanf("%d%s%d%d",&incouse->num1,incouse->name1,&incouse->score,&incouse->Melepeo);
  166.             incouse->nelepeo=0;
  167.             insertc(incouse);
  168.             break;
  169.         }
  170.     case(2):
  171.         {
  172.             printf("请输入要删除课程的编号:\n");
  173.             scanf("%d",&num1);
  174.             delc(num1);
  175.             break;
  176.         }
  177.     case(3):break;
  178.     }
  179. }
  180. void keyboards()//录入学生信息子函数(从键盘录入)
  181. {
  182.     int i;
  183.     struct student *p1,*p2;
  184.     N2=0;
  185.     p1=p2=(struct student *)malloc(sizeof(struct student));
  186.     printf("学生学号\t学生姓名\n");
  187.     scanf("%d%s",&p1->num2,p1->name2);
  188.     p1->nelen=0;
  189.     for(i=0;i<20;i++) p1->nelenum[i]=0;
  190.     head2=NULL;
  191.     while(p1->num2!=0)
  192.     {
  193.         N2=N2+1;
  194.         if(N2==1)head2=p1;
  195.         else p2->next=p1;
  196.         p2=p1;
  197.         p1=(struct student * )malloc(sizeof(struct student));
  198.         scanf("%d%s",&p1->num2,p1->name2);
  199.         p1->nelen=0;
  200.         for(i=0;i<20;i++) p1->nelenum[i]=0;
  201.     }
  202.     p2->next=NULL;
  203. }
  204. void files()//录入学生信息子函数(从文件录入)
  205. {
  206.     int i=0;
  207.     FILE * fp;
  208.     char filepath[20];
  209.     struct student *p1,*p2;
  210.     N2=0;
  211.     printf("输入要读入的文件路径:");
  212.     getchar();
  213.     gets(filepath);
  214.     if((fp=fopen(filepath,"r"))==NULL)
  215.     {
  216.         printf("找不到%s文件!\n",filepath);
  217.         exit(0);
  218.     }
  219.     p1=p2=(struct student*)malloc(sizeof(struct student));
  220.     fread(p1,sizeof(struct student),1,fp);
  221.     head2=NULL;
  222.     while(!feof(fp))
  223.     {
  224.         i=0;
  225.         N2=N2+1;
  226.         if(N2==1)head2=p1;
  227.         else p2->next=p1;
  228.         p2=p1;
  229.         p1=(struct student * )malloc(sizeof(struct student));
  230.         fread(p1,sizeof(struct student),1,fp);
  231.     }
  232.     p2->next=NULL;
  233. }
  234. void inputs()//录入学生信息主函数
  235. {
  236.     int i;
  237.     printf("\t\t\t录入学生信息\n");
  238.     printf("\n1.从键盘录入\n");
  239.     printf("2.从文件录入\n");
  240.     printf("3.返回主菜单\n");
  241.     printf("请选择(1~3):\n");
  242.     scanf("%d",&i);
  243.     switch(i)
  244.     {
  245.     case(1):keyboards();break;
  246.     case(2):files();break;
  247.     case(3):break;
  248.     }
  249. }
  250. void inserts(struct student * incouse)//学生信息管理子函数(填加学生信息)
  251. {
  252.     struct student *p0,*p1,*p2;
  253.     p1=head2;
  254.     p0=incouse;
  255.     if(head2==NULL)
  256.     {
  257.         head2=p0;
  258.         p0->next=NULL;
  259.     }
  260.     else
  261.     {
  262.         while((p0->num2 > p1->num2) && (p1->next!=NULL))
  263.         {
  264.             p2=p1;
  265.             p1=p1->next;
  266.         }
  267.         if(p0->num2 <= p1->num2)
  268.         {
  269.             if(head2==p1) head2=p0;
  270.             else p2->next=p0;
  271.             p0->next=p1;
  272.         }
  273.         else
  274.         {
  275.             p1->next=p0;
  276.             p0->next=NULL;
  277.         }
  278.     }
  279.     N2=N2+1;
  280. }
  281. void dels(int num2)//学生信息管理子函数(删除学生信息)
  282. {
  283.     struct student *p1,*p2;
  284.     if(head2==NULL)
  285.     {
  286.         printf("\n没有该学生信息,无法删除!\n");
  287.         goto end;
  288.     }
  289.     p1=head2;
  290.     while(num2!=p1->num2 && p1->next!=NULL)
  291.     {
  292.         p2=p1;
  293.         p1=p1->next;
  294.     }
  295.     if(num2==p1->num2)
  296.     {
  297.         if(p1==head2) head2=p1->next;
  298.         else p2->next=p1->next;
  299.         printf("已删除该学生信息!\n");
  300.         N2=N2-1;
  301.     }
  302.     else printf("无该学号的学生!\n");
  303.     end:;
  304. }
  305. void managements()//学生信息管理主函数
  306. {
  307.     struct student * incouse;
  308.     int i,num2;
  309.     printf("\t\t\t学生信息管理\n");
  310.     printf("1.新增学生信息\n");
  311.     printf("2.删除学生信息\n");
  312.     printf("3.返回主菜单\n");
  313.     printf("请选择(1~3):\n");
  314.     scanf("%d",&i);
  315.     switch(i)
  316.     {
  317.     case(1):
  318.         {
  319.             incouse=(struct student *)malloc(sizeof(struct student));
  320.             incouse->nelen=0;
  321.             incouse->nelenum[0]=0;
  322.             printf("学生学号\t学生姓名\n");
  323.             scanf("%d%s",&incouse->num2,incouse->name2);
  324.             inserts(incouse);
  325.             break;
  326.         }
  327.     case(2):
  328.         {
  329.             printf("请输入要删除学生的学号:\n");
  330.             scanf("%d",&num2);
  331.             dels(num2);
  332.             break;
  333.         }
  334.     case(3):break;
  335.     }
  336. }
  337. void elect(struct student * s)//选课
  338. {
  339.     struct couse * p;
  340.     int num1,i;
  341.     printf("请输入要选课的编号:\n");
  342.     scanf("%d",&num1);
  343.     for(i=0;s->nelenum[i]!=0;i++);
  344.     s->nelenum[i]=num1;
  345.     (s->nelen)++;
  346.     p=head1;
  347.     while(p->num1!=num1) p=p->next;
  348.     (p->nelepeo)++;
  349. }
  350. void cheak()//学生选课子函数(查询可选课程)
  351. {
  352.     char e;
  353.     struct couse * c;
  354.     struct student * s;
  355.     int num2,i,j=0,t=0;
  356.     printf("请输入你的学号:");
  357.     scanf("%d",&num2);
  358.     s=head2;
  359.     while(s->num2!=num2 && s->next!=NULL) s=s->next;
  360.     if(s->num2!=num2)
  361.     {
  362.         printf("不存在你的信息,请进入主菜单录入你的信息!\n");
  363.         goto end;
  364.     }
  365.     c=head1;
  366.     printf("你的可选课程编号:\n");
  367.     while(c!=NULL)
  368.     {
  369.         for(t=0,i=0;s->nelenum[i]!=0;i++)
  370.         {
  371.             if(c->num1==s->nelenum[i]) t=1;
  372.         }
  373.         if(t==0 && (c->nelepeo!=c->Melepeo))
  374.         {
  375.             printf("%d\n",c->num1);
  376.             j++;
  377.         }
  378.         c=c->next;
  379.     }
  380.     if(j==0)
  381.     {
  382.         printf("你已选完所有课程,无法再多选!\n");
  383.         goto end;
  384.     }
  385.     printf("选课(y/n)?:\n");
  386.     getchar();
  387.     e=getchar();
  388.     i=0;
  389.     while(e=='y')
  390.     {
  391.         elect(s);
  392.         printf("继续选课(y/n)?:\n");
  393.         getchar();
  394.         e=getchar();
  395.     }
  396.     end:;
  397. }
  398. void back(struct student * p)//退课
  399. {
  400.     struct couse * p1;
  401.     int num1,i,j;
  402.     printf("请输入你要退掉的课程编号:\n");
  403.     scanf("%d",&num1);
  404.     p1=head1;
  405.     while(p1->num1!=num1) p1=p1->next;
  406.     for(i=0;p->nelenum[i]!=num1;i++);
  407.     for(j=i;p->nelenum[j]!=0;j++) p->nelenum[j]=p->nelenum[j+1];
  408.     p->nelenum[--j]=0;
  409.     (p1->nelepeo)--;
  410.     printf("退课成功!\n");
  411. }
  412. void hcheak()//学生选课子函数(查询已选课程)
  413. {
  414.     char c;
  415.     struct couse * p0;
  416.     struct student * p;
  417.     int num2,i,f=0;
  418.     printf("请输入学号:\n");
  419.     scanf("%d",&num2);
  420.     p=head2;
  421.     while(p->num2!=num2 && p!=NULL) p=p->next;
  422.     if(p==NULL)
  423.     {
  424.         printf("不存在你的信息,请回主菜单录入信息:\n");
  425.         goto end;
  426.     }
  427.     printf("已选课程编号:\n");
  428.     if(p->nelenum[0]==0)
  429.     {
  430.         printf("你还没选课!\n");
  431.         goto end;
  432.     }
  433.     for(i=0;p->nelenum[i]!=0;i++)
  434.     {
  435.         printf("%d\n",p->nelenum[i]);
  436.         p0=head1;
  437.         while(p0->num1!=p->nelenum[i]) p0=p0->next;
  438.         f=f+p0->score;
  439.     }
  440.     printf("总学分:%d\n",f);
  441.     printf("是否进行退课(y/n)?");
  442.     getchar();
  443.     c=getchar();
  444.     while(c=='y')
  445.     {
  446.         back(p);
  447.         printf("继续退课(y/n)?");
  448.         getchar();
  449.         c=getchar();
  450.         (p->nelen)--;
  451.     }
  452.     end:;
  453. }
  454. void elective()//学生选课主函数
  455. {
  456.     int i;
  457.     printf("\t\t\t学生选课\n");
  458.     printf("1.查询可选课程\n");
  459.     printf("2.查询已选课程\n");
  460.     printf("3.返回主菜单\n");
  461.     printf("请输入(1~3):\n");
  462.     scanf("%d",&i);
  463.     switch(i)
  464.     {
  465.     case(1):cheak();break;
  466.     case(2):hcheak();break;
  467.     case(3):break;
  468.     }
  469. }
  470. void listc()//输出课程信息
  471. {
  472.     struct couse * p;
  473.     p=head1;
  474.     printf("课程编号  课程名称  学分  课程已选人数  课程人数上限\n");
  475.     while(p!=NULL)
  476.     {
  477.         printf("%-8d%10s%6d%8d%12d\n",p->num1,p->name1,p->score,p->nelepeo,p->Melepeo);
  478.         p=p->next;
  479.     }
  480. }
  481. void lists()//输出学生信息
  482. {
  483.     struct student * p;
  484.     p=head2;
  485.     printf("学生学号  学生姓名  已选课程数量\n");
  486.     while(p!=NULL)
  487.     {
  488.         printf("%-4d %10s %6d\n",p->num2,p->name2,p->nelen);
  489.         p=p->next;
  490.     }
  491. }
  492. void intoc()//存储课程信息
  493. {
  494.     FILE * fp;
  495.     struct couse * p;
  496.     char filepath[30];
  497.     printf("输入课程信息要保存的文件路径:");
  498.     getchar();   
  499.     gets(filepath);
  500.     if((fp=fopen(filepath,"w"))==NULL)
  501.     {
  502.         printf("\n保存失败!");
  503.         exit(0);
  504.     }
  505.     p=head1;
  506.     while(p!=NULL)
  507.     {
  508.         fprintf(fp,"%d %s %d %d %d\n",p->num1,p->name1,p->score,p->nelepeo,p->Melepeo);
  509.         p=p->next;
  510.     }
  511.     fclose(fp);
  512.     printf("课程信息已保存在%s中!\n",filepath);
  513. }
  514. void intos()//存储学生信息
  515. {
  516.     FILE * fp;
  517.     struct student * p;
  518.     char filepath[30];
  519.     printf("输入学生信息要保存的文件路径:");
  520.     getchar();   
  521.     gets(filepath);
  522.     if((fp=fopen(filepath,"w"))==NULL)
  523.     {
  524.         printf("\n保存失败!");
  525.         exit(0);
  526.     }
  527.     p=head2;
  528.     while(p!=NULL)
  529.     {
  530.         fwrite(p,sizeof(struct student),1,fp);
  531.         p=p->next;
  532.     }
  533.     fclose(fp);
  534.     printf("学生信息已保存在%s中!\n",filepath);
  535. }
  536. void into()//存储信息
  537. {
  538.     int i;
  539.     printf("1.存储课程信息\n");
  540.     printf("2.存储学生信息\n");
  541.     printf("3.返回主菜单\n");
  542.     printf("请输入(1~3)\n");
  543.     scanf("%d",&i);
  544.     switch(i)
  545.     {
  546.     case(1):intoc();break;
  547.     case(2):intos();break;
  548.     case(3):break;
  549.     }   
  550. }
  551. void store()//信息主函数
  552. {
  553.     int i;
  554.     printf("\t\t系统信息查看及存储\n");
  555.     printf("1.查看课程信息\n");
  556.     printf("2.查看学生信息\n");
  557.     printf("3.存储信息\n");
  558.     printf("4.返回主菜单\n");
  559.     printf("请输入(1~4):\n");
  560.     scanf("%d",&i);
  561.     switch(i)
  562.     {
  563.     case(1):listc();break;
  564.     case(2):lists();break;
  565.     case(3):into();break;
  566.     case(4):break;
  567.     }
  568. }
  569. int main()//主函数
  570. {
  571.     int i;
  572.     start:
  573.     printf("\n\t\t\t欢迎使用学生选课系统!\n");
  574.     printf("菜单:\n");
  575.     printf("1.录入课程信息\n");
  576.     printf("2.课程管理\n");
  577.     printf("3.录入学生信息\n");
  578.     printf("4.学生信息管理\n");
  579.     printf("5.学生选课\n");
  580.     printf("6.系统信息查看及存储\n");
  581.     printf("7.退出系统\n");
  582.     printf("\n请输入菜单选项(1~7):\n");
  583.     scanf("%d",&i);
  584.     if(i<1 || i>7)
  585.     {
  586.         printf("输入错误,请重输:\n");
  587.         goto start;
  588.     }
  589.     switch(i)
  590.     {
  591.     case(1):
  592.         {
  593.             system("cls");
  594.             inputc();
  595.             goto start;
  596.             break;
  597.         }
  598.     case(2):
  599.         {
  600.             system("cls");
  601.             managementc();
  602.             goto start;
  603.             break;
  604.         }
  605.     case(3):
  606.         {
  607.             system("cls");
  608.             inputs();
  609.             goto start;
  610.             break;
  611.         }
  612.     case(4):
  613.         {
  614.             system("cls");
  615.             managements();
  616.             goto start;
  617.             break;
  618.         }
  619.     case(5):
  620.         {
  621.             system("cls");
  622.             elective();
  623.             goto start;
  624.             break;
  625.         }
  626.     case(6):
  627.         {
  628.             system("cls");
  629.             store();
  630.             goto start;
  631.             break;
  632.         }
  633.     case(7):
  634.         {
  635.             system("cls");
  636.             printf("感谢使用本系统!\n\n再见!\n");
  637.         }
  638.     }
  639.     return(0);
  640. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表