鱼C论坛

 找回密码
 立即注册
查看: 5278|回复: 25

[作品展示] C语言学生成绩管理系统

[复制链接]
发表于 2021-1-6 08:37:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一世轻尘 于 2021-1-6 08:41 编辑

自己写的,很菜
  1. //学生成绩管理系统
  2. //需要自己建一个名为Information的txt文件来存储数据
  3. //txt文件与cpp文件路径相同
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. #include<conio.h>
  8. #define LEN sizeof(struct student)

  9. //学生信息结构体
  10. struct student
  11. {
  12.         char name[10];//学生姓名
  13.         char id[15];//学生学号
  14.         int score[3];//学生三科成绩
  15.         struct student *next;
  16. };

  17. typedef struct student stu;

  18. //声明函数
  19. stu* enter(stu *h);//成绩录入函数
  20. stu* initialize();//初始化链表头函数
  21. void menu();//菜单
  22. void print(stu *h);//成绩打印函数
  23. void modify(stu *h);//成绩修改函数
  24. void statistics(stu *h);//查找统计信息
  25. void del(stu *h);//删除函数
  26. void quit(stu *h);//退出函数
  27. void save(stu *h);//保存文件函数
  28. void open(stu *h);//打开文件读取信息建立链表函数


  29. //主函数
  30. int main()
  31. {
  32.         stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
  33.         int function;//功能选项
  34.         char flag;//判断变量
  35.         int t=0;
  36.         data=initialize();//初始化头结点
  37.         open(data);//读取文件内的数据,并建立链表
  38.         while(1)
  39.         {
  40.                 menu();//打开菜单
  41.                 printf("请选择操作:");
  42.                 scanf("%d",&function);//输入你想要实现的功能
  43.                 switch(function)//构建多个功能分支
  44.                 {
  45.                         case 1:while(1)
  46.                         {
  47.                                 enter(data);//输入一个数据并连接在链表的后面
  48.                                 printf("是否继续输入(y/n)");
  49.                                 scanf("%s",&flag);
  50.                                 if(flag=='N'||flag=='n')break;
  51.                         }system("cls");break;
  52.                         case 2:print(data);_getch();system("cls");break;
  53.                         case 3:modify(data);system("cls");break;
  54.                         case 4:statistics(data);_getch();system("cls");break;
  55.                         case 5:del(data);_getch();system("cls");break;
  56.                         case 6:quit(data);break;
  57.                         default:printf("error!!!请重新输入:");
  58.                         break;
  59.                 }//switch结束
  60.         }
  61.         return 0;
  62. }

  63. //系统界面显示
  64. void menu()
  65. {
  66.         printf("          ***********************************************             \n");
  67.         printf("            **********学生成绩管理系统*****************               \n");
  68.         printf("          ***********************************************             \n");
  69.         printf("                       1.录入和添加成绩                               \n");
  70.         printf("                       2.输出成绩                                     \n");
  71.         printf("                       3.修改成绩                                     \n");
  72.         printf("                       4.查找学生信息                                 \n");
  73.         printf("                       5.删除学生信息                                 \n");
  74.         printf("                       6.退出系统并保存                               \n");
  75.         printf("          ***********************************************             \n");
  76. }

  77. //初始化头节点函数
  78. stu* initialize()
  79. {
  80.         stu *head;
  81.         head=(stu*)malloc(LEN);
  82.         if(head==NULL)
  83.         {
  84.                 printf("error!");
  85.                 exit(1);
  86.         }
  87.         head->next=NULL;//使头结点指针域为空
  88.         return head;
  89. }



  90. //成绩录入
  91. stu* enter(stu *h)
  92. {
  93.         stu *p,*q=h;
  94.         char name[10],id[15];
  95.         int math, English,computer;
  96.         p=(stu*)malloc(LEN);//为学生信息申请节点
  97.         printf("请依次输入学生信息:\n");
  98.         printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
  99.         scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
  100.        
  101.         for(;q->next!=NULL;q=q->next){;}//移动到尾结点

  102. //将输入的内容赋值给链表中的相应位置
  103.         strcpy(p->name,name);
  104.         strcpy(p->id,id);
  105.         p->score[0]=math;
  106.         p->score[1]=English;
  107.         p->score[2]=computer;//赋值完毕
  108.         //移动指针
  109.         p->next=NULL;
  110.         q->next=p;
  111.         q=p;
  112.         return h;
  113. }


  114. //成绩打印
  115. void print(stu *h)
  116. {
  117.         stu *p=h->next;//从头结点之后的结点开始输出
  118.         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出
  119.         while(p!=NULL)//输出链表的全部内容
  120.         {
  121.                 printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  122.                 p=p->next;
  123.         }
  124. }



  125. //成绩修改
  126. void modify(stu *h)
  127. {
  128.         stu *p=h->next;
  129.         char name[10],id[15];
  130.         int math,English,computer;
  131.         printf("请输入学生姓名:");
  132.         scanf("%s",name);
  133.         printf("请输入学生学号:");
  134.         scanf("%s",id);
  135.        
  136.         while(p)
  137.         {
  138.                 if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
  139.                 {
  140.                         printf("当前学生信息:\n");
  141.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  142.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  143.                         printf("请输入更正后的数学成绩:");
  144.                         scanf("%d",&math);
  145.                         printf("请输入更正后的英语成绩:");
  146.                         scanf("%d",&English);
  147.                         printf("请输入更正后的计算机导论与程序设计成绩:");
  148.                         scanf("%d",&computer);
  149.                         p->score[0]=math;
  150.                         p->score[1]=English;
  151.                         p->score[2]=computer;
  152.                         printf("更改完成!\n");
  153.                         system("pause");
  154.                         break;
  155.                 }
  156.                 else
  157.                 {
  158.                         p=p->next;
  159.                 }
  160.         }//while循环结束
  161. }


  162. //查询统计
  163. void statistics(stu *h)
  164. {
  165.         while(1)
  166.         {
  167.         int z;//选项变量
  168.         system("cls");//清屏
  169.         printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
  170.         scanf("%d",&z);
  171.         system("cls");
  172.         switch(z)
  173.         {
  174.                 case 7:{
  175.                         stu *p=h->next;
  176.                 char name[10],id[15];
  177.                 printf("请输入学生姓名:");
  178.                 scanf("%s",name);
  179.                 printf("请输入学生学号:");
  180.                 scanf("%s",id);
  181.                 while (p)
  182.             {
  183.                      if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号
  184.                     {
  185.                         printf("当前学生信息:\n");
  186.                         printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  187.                         printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
  188.                         break;
  189.                     }
  190.                     else
  191.                     {
  192.                         p=p->next;
  193.                     }
  194.                 }//while循环结束
  195.                 }system("pause");system("cls");break;
  196.                 case 8:{
  197.                     while(1){
  198.                         int x;//选项变量
  199.                         int num=0;//初始化满足条件的人数
  200.                         printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
  201.                         scanf("%d",&x);
  202.                         switch(x)
  203.                         {
  204.                                 case 10:{
  205.                             stu *p1=h->next;
  206.                                 int M1,M2;
  207.                                 printf("请依次输入所要查找的数学成绩的下界与上界:\n");
  208.                                 scanf("%d %d",&M1,&M2);
  209.                                 printf("学生信息:\n");
  210.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  211.                                
  212.                                 while(p1){       
  213.                                         if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
  214.                                         {
  215.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
  216.                                     num++;
  217.                                     p1=p1->next;
  218.                                         }
  219.                                         else
  220.                                         {
  221.                                                 p1=p1->next;
  222.                                         }
  223.                                     }//while循环结束
  224.                                     printf("人数为%d\n",num);//输出人数
  225.                                     system("pause");
  226.                                     system("cls");
  227.                                 }break;
  228.                                 case 11:{
  229.                 stu *p2=h->next;
  230.                                 int E1,E2;
  231.                                 printf("请依次输入所要查找的英语成绩的下界与上界:\n");
  232.                                 scanf("%d %d",&E1,&E2);
  233.                                 printf("学生信息:\n");
  234.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  235.                                 while(p2){
  236.                                         if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
  237.                                         {
  238.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
  239.                                     num++;
  240.                                     p2=p2->next;
  241.                                         }
  242.                                         else
  243.                                         {
  244.                                                 p2=p2->next;
  245.                                         }
  246.                                 }//while循环结束
  247.                                 printf("人数为%d\n",num);
  248.                                 system("pause");
  249.                                 system("cls");
  250.                             }
  251.                                 break;
  252.                                 case 12:{
  253.                                 stu *p3=h->next;
  254.                                 int C1,C2;
  255.                                 printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
  256.                                 scanf("%d %d",&C1,&C2);
  257.                                 printf("学生信息:\n");
  258.                                 printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
  259.                                 while(p3){
  260.                                         if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
  261.                                         {
  262.                                     printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
  263.                                     num++;
  264.                                     p3=p3->next;
  265.                                         }
  266.                                         else
  267.                                         {
  268.                                                 p3=p3->next;
  269.                                         }
  270.                                 }//while循环结束
  271.                                 printf("人数为%d\n",num);
  272.                                 system("pause");
  273.                                 system("cls");
  274.                             }
  275.                                 break;
  276.                                 case 13:goto label2;//跳出双重循环
  277.                                 default:break;
  278.                         }
  279.                 }
  280.                 label2:printf("已退出");
  281.                 }system("pause");system("cls");break;
  282.                 case 9:goto label1;//跳出双重循环
  283.                 default:break;
  284.         }
  285.     }
  286.     label1:printf("已退出\n");
  287. }



  288. //删除函数
  289. void del(stu *h)
  290. {
  291.         stu *p=h,*q;
  292.         q=p->next;
  293.         char name[10],id[15];
  294.         printf("请输入学生姓名:");
  295.         scanf("%s",name);
  296.         printf("请输入学生学号:");
  297.         scanf("%s",id);
  298.         while(q)
  299.         {
  300.                 if(strcmp(q->name,name)==0&&strcmp(q->id,id)==0)
  301.                 {
  302.                         p->next=q->next;
  303.                         free(q);//删除p结点
  304.                         printf("删除成功\n");
  305.                         break;
  306.                 }
  307.                 else
  308.                 {
  309.                         p=p->next;
  310.                         q=q->next;
  311.                 }
  312.          }//while循环结束
  313. }



  314. //退出系统
  315. void quit(stu *h)
  316. {
  317.         save(h);//退出时保存信息
  318.         exit(0);
  319. }



  320. //打开文件
  321. void open(stu *h)
  322. {
  323.         stu *p=h;
  324.         stu *q;//临时变量,用于保存从文件中提取的信息
  325.         FILE*file=fopen("./Information.txt","rb");
  326.         if(!file)
  327.         {
  328.                 printf("文件打开失败!");
  329.                 return ;
  330.         }
  331.        
  332.        
  333.         q=(stu*)malloc(LEN);//开辟内存
  334.         fread(q,LEN,1,file);//进入循环前先读取一个结点
  335.         while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
  336.         //否则,就绕过或结束循环
  337.         {
  338.                 //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
  339.                 p->next=q;//更新链表数据,把新的节点纳入链表
  340.                 p=q;//更新链表数据,把新的节点纳入链表
  341.                 q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
  342.                 fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
  343.         }//while循环结束
  344.          
  345.         p->next=NULL;//使尾结点指向空,结束链表
  346.         fclose(file);
  347. }


  348. //保存信息到文件中
  349. void save(stu *h)
  350. {
  351.         stu *p=h->next;
  352.         int flag;
  353.         FILE *file=fopen("./information.txt","wb");
  354.         if(!file)
  355.         {
  356.                 printf("文件打开失败!");
  357.                 return ;
  358.         }
  359.         while (p!=NULL)
  360.         {
  361.                 flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
  362.                 if(flag!=1)
  363.                 {
  364.                         break;
  365.                 }
  366.                 p=p->next;
  367.         }
  368.         fclose(file);
  369. }
复制代码

评分

参与人数 2荣誉 +2 鱼币 +7 收起 理由
ncx0331 + 5 感谢楼主无私奉献!
小伤口 + 2 + 2 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 10:57:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-10 12:22:41 | 显示全部楼层
wow~厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 18:49:18 | 显示全部楼层
这么厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 09:35:48 | 显示全部楼层
好厉害啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 13:00:38 | 显示全部楼层
厉害了,学习。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 14:36:48 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-4 14:40:40 | 显示全部楼层
自己写的话已经很厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 19:35:32 | 显示全部楼层
厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 11:07:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 12:17:32 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 12:18:25 | 显示全部楼层
感谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 12:18:58 | 显示全部楼层
想要鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 16:12:58 | 显示全部楼层
这就是大佬吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 01:38:40 | 显示全部楼层
鱼币!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-7 09:42:41 | 显示全部楼层
真不错,可以送给老师!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 17:14:31 | 显示全部楼层
中间概率这么小,我不可能那么走运......
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 17:15:44 | 显示全部楼层
这代码我都看不懂......
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-9 19:35:31 | 显示全部楼层

回帖奖励 +40 鱼币

厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-9 19:36:02 | 显示全部楼层
40!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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