学生管理系统代码

学生管理系统代码

好好看,好好学,知识点的部分看不懂就多查。
内容很多,仔细看。

#include <stdio.h>
#include <stdlib.h>
#define M 100
#define N 10//定义学生相关信息结构体
typedef struct stu
{char sn[13];char name[9];char sex;float corse[N];
} stu;//知识点:函数声明的使用情况:自主创建(定义)的函数在主函数后面的时候,需要在主函数前面声明;如果是在主函数前面的话,不需要声明。了解一下C语言的是如何扫描和编译代码的
//数据初略分析函数
int   maxs(stu a[], int n, int ii);
int   mins(stu a[], int n, int ii);
float ave(stu a[], int n, int ii);
int   sum(stu a[], int n, int ii);
void  sorts(stu a[], int n, int ii); //从小到大排序,采用的是选择排序//学生数据分析(新增)
void total_scores(stu a[], int n, float* total);
float max_student_score(float total[], int n);
float min_student_score(float total[], int n);
float average_student_score(float total[], int n);//整体的插入与删除
void  outdata(stu a[], int n);
stu   indata(stu a[], int n);
int   inalldata(stu a[]);//数据的插入,删除,统计,查找
void  counts(stu a[], int n, int m[], int ii);
int   ins(stu a[], int n, int pos, stu x);
int   del(stu a[], int n, int pos);
int   lookfor(stu a[], int n, int x, int ii);//文件的打开与修改
int   opendata(stu a[]);
int   writedata(stu a[], int n);int dataflag;	//是否有数据
int fileflag;	//数据改动过int main()
{//知识点:stu是结构体的变量名,类似于int的使用方式,注意有typeof和没有的区别,顺便理解一下typeof的作用stu a[M];int n;//代码规范:赋值等号左右留空格n = interface(a); //进入46行//代码规范:逗号后面加空格seebye(a, n);return 0;
}//主要的功能区,所有的功能实现都是靠这个函数调用
int interface(stu a[])
{stu s;                      //s是studentint m[5], n, ii;            //m数组用来统计班级优良情况,n是总人数,ii是科目int sel, pos, sn;           //sel是select,sn是按科目分数查找的学生的序号,pos是用于删除数据和插入数据时指明位置的变量int x, t;                   //x是对应的查找函数时,输入的科目分数,t是排序是承接学生信息的暂时变量int maxdata, mindata, sumdata;float avedata;float total[M] = { 0 };char ch;//代码规范:赋值等号左右留空格dataflag = 0;//代码规范:赋值等号左右留空格fileflag = 0;do{//代码规范:赋值等号左右留空格sel = menu();  //进入menu函数,输出菜单if (sel == 1 || sel == 2 || sel == 3 || sel == 4 || sel == 5 || sel == 8 || sel == 11){ls:printf("\n请选择一门课程\n");printf("-------------\n");printf("   1: 数学\n   2:物理\n   3: 英语\n   4: 思政\n   5: 编程\n");printf("-------------");printf("\n选择哪一门课程:");scanf("%d", &ii);if (ii < 1 || ii>5){printf("课程号错误,请重新输入!\n");goto ls;}printf("\n");}//知识点:用过C语言代码做到对文件的修改if (sel == 0){//代码技巧:通过这种变量传承的方式,判断是否执行(这个地方的传参往往就是代表true,false,用变量来承接的话,更加可控if (fileflag){printf("文件改动过,还没保存,需要保存吗?\n回答Y或者y: ");fflush(stdin);scanf("%c", &ch);//知识点:writedata()修改文件内容,和python里面的write函数,但是在C语言里面的自己写函数才能达到更好的效果if (ch == 'Y' || ch == 'y') writedata(a, n);//跳转到291行}break;}else if (sel == 1){maxdata = maxs(a, n, ii - 1); //跳转到maxs函数,输出该科目的最大值printf("最大数:%d\n", maxdata);}else if (sel == 2){mindata = mins(a, n, ii - 1); //跳转到mins函数,输出该科目的最小值printf("最小数:%d\n", mindata);}else if (sel == 3){avedata = ave(a, n, ii - 1); //跳转到ave函数,输出该科目的平均值printf("平均数:%.2f\n", avedata);}else if (sel == 4){sumdata = sum(a, n, ii - 1); //跳转到sum函数,输出该科目的总共分数printf("总和:%d\n", sumdata);}else if (sel == 5)  //对数据排序{sorts(a, n, ii - 1);       //跳转到sorts函数,从小到大排序该科目的分数outdata(a, n);}else if (sel == 6){outdata(a, n);      //输出数据}else if (sel == 7){n = inalldata(a);   //创建班级数据outdata(a, n);}else if (sel == 8){counts(a, n, m, ii - 1);    //返回一个数组,统计学习情况,跳转到479行printf("-----------------\n");printf("   优秀人数: %d\n   良好人数: %d\n   一般人数: %d\n   及格人数: %d\n   不及格数: %d\n", m[0], m[1], m[2], m[3], m[4]);printf("-----------------\n");}else if (sel == 9) //插入数据{l2:if (n >= M)printf("\n成绩表已满,不能再插入了!");else{printf("请输入要插入的位置:");scanf("%d", &pos);if (pos < 1 || pos > n){printf("位置输入有错,请重新输入!");goto l2;}l5:printf("请输入要插入的值:");s = indata(a, n);   //通过indata函数创建要插入的数据n = ins(a, n, pos, s);  //插入数据,跳转到printf("插入结果:");outdata(a, n);}}else if (sel == 10){l3:printf("请输入要删除的位置:");scanf("%d", &pos);if (pos < 1 || pos > n){printf("位置输入有错,请重新输入!");goto l3;}n = del(a, n, pos);  //删除元素,返回删除后班级人数的长度if (n == 0){printf("\n成绩表被清空!");dataflag = 0;}else{printf("删除结果:");outdata(a, n);}}else if (sel == 11){l4:printf("请输入要查找的值:");scanf("%d", &x);if (x < 0 || x > 100){printf("输入值有错,请重新输入!\n");goto l4;}sn = lookfor(a, n, x, ii - 1);  //查找逻辑是按照课程的分数来找到对应的人的序号if (sn == 0) printf("要查找的数据不存在!\n");else printf("该数据序号为%d\n", sn);}else if (sel == 12){l6:n = opendata(a);if (n == 0){printf("文件不存在,请创建数据!\n");goto l6;}elseoutdata(a, n);dataflag = 1;}else if (sel == 13){writedata(a, n);printf("数据保存成功!\n");}else if (sel == 14){total_scores(a, n, total);float max_score = max_student_score(total, n);float min_score = min_student_score(total, n);float avg_score = average_student_score(total, n);printf("最高分数:%.2f\n", max_score);printf("最低分数:%.2f\n", min_score);printf("平均分数:%.2f\n", avg_score);}printf("\n按任意键继续!");fflush(stdin);getchar();} while (1);return n;
}//页面显示的菜单栏部分
int menu()
{int dd;  //用于承接 输入选择菜单栏的数字printf("\n\n 班级成绩管理系统");while (1){ll2:system("cls");printf("\n     功能选择\n");printf("  ---------------\n");printf(" |  1  求最大数  |\n");printf(" |  2  求最小数  |\n");printf(" |  3  求平均数  |\n");printf(" |  4  数据求和  |\n");printf(" |  5  数据排序  |\n");printf(" |  6  输出数据  |\n");printf(" |  7  创建数据  |\n");printf(" |  8  统计数据  |\n");printf(" |  9  插入数据  |\n");printf(" |  10 删除数据  |\n");printf(" |  11 查找数据  |\n");printf(" |  12 获取数据  |\n");printf(" |  13 保存数据  |\n");printf(" |  14 学生数据  |\n");printf(" |  0  退出系统  |\n");printf("  ---------------\n");printf(" 请选择一个功能:");scanf("%d", &dd);//代码规范:在if条件语句里面,每个符号中间都要留空格if (dd < 0 || dd > 15){printf("\n选择有错,请重新选择!\n");printf("\n按任意键继续!");//代码解释:清楚缓冲区(缓冲区称为stdin),也就是所谓的清缓存fflush(stdin);//代码技巧:这里用的getchar()会自动给到dd变量,至于为什么可以百度(核心在于getchar函数返回的是int型变量),然后继续做while循环getchar();}else if (dd == 0 || dd == 7 || dd == 12 || dataflag == 1) break;else{printf("\n无数据,请选择创建数据!");printf("\n按任意键继续!");fflush(stdin);getchar();}}return dd;
}// 打开文件
int opendata(stu a[])
{FILE* fp;int n = 0;fp = fopen("score.dat", "rb");if (!fp) return 0;fseek(fp, 0, SEEK_END);n = ftell(fp) / sizeof(struct stu);fseek(fp, 0, SEEK_SET);fread(a, sizeof(stu), n, fp);fclose(fp);dataflag = 1;return n;
}// 纯纯的对文件的操作,看不懂就百度吧,我也没怎么学过
int writedata(stu a[], int n)
{FILE* fp;fp = fopen("score.dat", "wb+");if (!fp) return 0;fwrite(a, sizeof(stu), n, fp);fclose(fp);fileflag = 0;return 1;
}//求最大值函数,就是遍历数组,然后去最大值就好了,没什么技术含量
int maxs(stu a[], int n, int ii)
{int i;int max;//注意代码规范max = a[0].corse[ii];for (i = 1; i < n; i++)if (a[i].corse[ii] > max)max = a[i].corse[ii];return max;
}//求最小值函数
int mins(stu a[], int n, int ii)
{int i;//注意代码规范和命名,直接语义化命名是最好的int min;min = a[0].corse[ii];for (i = 1; i < n; i++)if (a[i].corse[ii] < min)min = a[i].corse[ii];return min;
}//求平均值函数
float ave(stu a[], int n, int ii)
{int i;int aveg;aveg = 0;for (i = 1; i < n; i++)aveg = aveg + a[i].corse[ii];return aveg / (float)n;
}//求和函数
int sum(stu a[], int n, int ii)
{int i;int sum;sum = 0;for (i = 1; i < n; i++)sum = sum + a[i].corse[ii];return sum;
}//排序函数,采用的是选择排序,还有很多排序方法,你们搞数据的,排序的算法估计得了如指掌
void sorts(stu a[], int n, int ii)
{int i, j, k;int m;stu t;for (i = 0; i < n; i++){k = i;m = a[i].corse[ii];for (j = i + 1; j < n; j++){if (m < a[j].corse[ii]){k = j;m = a[j].corse[ii];}}t = a[i];a[i] = a[k];a[k] = t;}fileflag = 1;
}//输出修改的数据
void outdata(stu a[], int n)
{int i;printf("\n                            数据显示!\n");printf("%10s%10s%6s%6s%6s%6s%6s%6s\n", "姓名", "学号", "性别", "数学", "物理", "英语", "思政", "编程");for (i = 0; i < 30; i++) printf("—");printf("\n");for (i = 0; i < n; i++)if (a[i].sex == '1')printf("%10s%10s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n", a[i].name, a[i].sn, "男 ", a[i].corse[0], a[i].corse[1], a[i].corse[2], a[i].corse[3], a[i].corse[4]);elseprintf("%10s%10s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n", a[i].name, a[i].sn, "女 ", a[i].corse[0], a[i].corse[1], a[i].corse[2], a[i].corse[3], a[i].corse[4]);for (i = 0; i < 30; i++) printf("—");printf("\n");
}// 个人信息的输入,包括姓名,学号,性别,学科成绩
stu indata(stu a[], int n)
{stu s;printf("\n姓名:");fflush(stdin);scanf("%s", s.name);printf("学号:");fflush(stdin);scanf("%s", s.sn);
le1:printf("性别:(1:男,2:女)");fflush(stdin);scanf("%c", &s.sex);if (s.sex != '1' && s.sex != '2'){printf("输入有错,请输入1或者2\n");//知识点:goto语句是为了方便编译器执行的跳转,是一种避免异常的一种有效方式,避免运用大量的循环造成代码运行时间的增多(你明年学了数据结构就会懂)类似python里面的try语句goto le1;}
le2:printf("数学:");fflush(stdin);scanf("%f", &s.corse[0]);if (s.corse[0] < 0 || s.corse[0] > 100){printf("输入有错!重新输入!\n");goto le2;}
le3:printf("物理:");fflush(stdin);scanf("%f", &s.corse[1]);if (s.corse[1] < 0 || s.corse[1] > 100){printf("输入有错!重新输入!\n");goto le3;}
le4:printf("英语:");fflush(stdin);scanf("%f", &s.corse[2]);if (s.corse[2] < 0 || s.corse[2] > 100){printf("输入有错!重新输入!\n");goto le4;}
le5:printf("思政:");fflush(stdin);scanf("%f", &s.corse[3]);if (s.corse[3] < 0 || s.corse[3] > 100){printf("输入有错!重新输入!\n");goto le5;}
le6:printf("编程:");fflush(stdin);scanf("%f", &s.corse[4]);if (s.corse[4] < 0 || s.corse[4] > 100){printf("输入有错!重新输入!\n");goto le6;}fileflag = 1;dataflag = 1;return s;
}//班级整体人数的输入
int inalldata(stu a[])
{int n, i;stu s;printf("班级数据输入!\n");
l1:printf("请输入班级人数:");scanf("%d", &n);
//在做项目的时候,学会加入这种输入值的判断,这样会提升代码的复用性(也就是你的代码别人可以轻松使用)if (n < 2 || n > M){printf("输入有错,请重新输入!");goto l1;}for (i = 0; i < n; i++){printf("\n学生%d数据输入!", i + 1);s = indata(a, n);//进行对每个学生的具体信息输入a[i] = s;}fileflag = 1;dataflag = 1;return n;
}//班级分数优良差统计
void counts(stu a[], int n, int m[], int ii)
{int i;//初始化数组列表,让其元素为0,这里不使用m[n] = {0},是因为这个方法必须是在定义 m 数组的时候使用,而不是后期赋值的时候使用。for (i = 0; i < 5; i++)m[i] = 0;//遍历班级学生分数情况,统计for (i = 0; i < n; i++){if (a[i].corse[ii] >= 90 && a[i].corse[ii] <= 100)    m[0]++;else if (a[i].corse[ii] >= 80 && a[i].corse[ii] < 90) m[1]++;else if (a[i].corse[ii] >= 70 && a[i].corse[ii] < 80) m[2]++;else if (a[i].corse[ii] >= 60 && a[i].corse[ii] < 70) m[3]++;else if (a[i].corse[ii] >= 0 && a[i].corse[ii] < 60)  m[4]++;}
}//指定位置插入元素数据。这个地方好好想想,以后在数据机构里面很常见
int ins(stu a[], int n, int pos, stu x)
{int i;//代码解释:将pos后面的元素全部后移一个单位,此时pos位为空for (i = n - 1; i >= pos; i--)a[i + 1] = a[i];//将x(新建立的数据)插入pos位置a[pos] = x;fileflag = 1;//细节:插入元素后,数组长度会增 1return n + 1;}//删除元素,和上面的插入一样,只不过是反的而已,好好想一下,数据结构里面经常见到这两种操作
int del(stu a[], int n, int pos)
{int i;for (i = pos - 1; i < n; i++)a[i] = a[i + 1];fileflag = 1;return n - 1;}//根据学科分数查找学生的序号
int lookfor(stu a[], int n, int x, int ii)
{int i, flag;flag = 0;for (i = 0; i < n; i++){if (a[i].corse[ii] == x){flag = 1;break;}}if (flag) return i + 1;else return 0;
}//退出程序
void seebye(stu a[], int n)
{if (n == 0)printf("\n无数据!\n");elseoutdata(a, n);printf("\n\n\n谢谢使用,再见!\n\n\n\n");fflush(stdin);getchar();
}// 实现新函数//统计一个学生的所有分数
void total_scores(stu a[], int n, float* total)
{for (int i = 0; i < n; i++){float sum = 0;for (int j = 0; j < N; j++){sum += a[i].corse[j];}total[i] = sum;}
}
//下面的三个函数,都是通过循环遍历得到的,也称为迭代//找寻所有学生当中分最高的
float max_student_score(float total[], int n)
{float max = total[0];for (int i = 1; i < n; i++){if (total[i] > max){max = total[i];}}return max;
}//找寻所有学生当中分最低的
float min_student_score(float total[], int n)
{float min = total[0];for (int i = 1; i < n; i++){if (total[i] < min){min = total[i];}}return min;
}//求整体学生的平均分
float average_student_score(float total[], int n)
{float sum = 0;for (int i = 0; i < n; i++){sum += total[i];}return sum / n;
}//学会代码规范
//  像“< > ? / \ || && ”这种符号之间,两边放入变量的时候,打空格;
//  对于定义变量的时候,逗号和变量之间打空格,int i, j, k;
//  变量的命名最好采用语义化命名,比如 学生——stu 这种的;
//  不要写成代码shi山,读起来很痛苦

看完了之后是不是不那么的凯凯心心了😂😂😂
学代码是这样的,努力看吧❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT】ROS2 Humble联合使用QT教程

【QT】ROS2 Humble联合使用QT教程 文章目录 【QT】ROS2 Humble联合使用QT教程1. 安装ROSProjectManager插件2. 创建ROS项目3.一个快速体验的demoReference 环境的具体信息如下&#xff1a; ubunt 22.04ros2 humbleQt Creator 13.0.0ROS ProjectManager 13.0.0 本文建立在已经…

3D头模加载

目录 psbody加载 psbody示例 trimesh加载 openmesh psbody加载 codetalker from psbody.mesh import Meshif cfg.dataset "BIWI":template_file os.path.join(cfg.data_root, "BIWI.ply")elif cfg.dataset "vocaset":template_file os…

git bash上传本地文件报错debug

报错信息 remote: error: Trace: 9621c90b124fcb8e353c79fc4011b62f684d0850872e2a5a9ee4bdf1e8092198 remote: error: See https://gh.io/lfs for more information. remote: error: File res_checkpoint/3_17_heart.pth is 357.69 MB; this exceeds GitHubs file size limit…

MT3030 天梯赛

跟MT3029战神小码哥类似&#xff0c;都是贪心堆。注意开long long 这里的堆顶为战斗力最小的&#xff0c;便于贪心的反悔操作。先按容忍度从大到小排序&#xff08;q中总容忍度取决于最小的容忍度&#xff09;&#xff0c;再向q中存数&#xff0c;存到不能容忍之后再把堆顶踢出…

深度学习-线性回归+基础优化算法

目录 线性模型衡量预估质量训练数据参数学习训练损失最小化损失来学习参数显式解 总结基础优化梯度下降选择学习率 小批量随机梯度下降选择批量大小 总结线性回归的从零开始实现实现一个函数读取小批量效果展示这里可视化看一下 线性回归从零开始实现线性回归的简洁实现效果展示…

MATLAB初学者入门(12)—— 模拟退火算法

模拟退火&#xff08;Simulated Annealing, SA&#xff09;是一种概率性搜索技术&#xff0c;用于寻找给定函数的全局最优解。该算法受到物理学中固体退火过程的启发&#xff0c;通过模拟物质冷却过程中粒子的随机运动&#xff0c;来逐步寻找优化解。它允许在搜索过程中偶尔接受…

【Java那些事】@TableField对字段的自动填充

问题&#xff1a;当你有个对象User时&#xff0c;这个User对象的属性还有类似createTime &#xff0c;updateTime的属性&#xff0c;每次创建这个对象都要设置createTime &#xff0c;updateTime&#xff0c;对这个对象User进行操作又要来更新它的updateTime&#xff0c;是不是…

静态住宅IP代理VS动态住宅IP代理,该如何选择?

在网络安全和数据采集领域&#xff0c;代理服务已经成为一个必不可少的工具。在IP代理服务中&#xff0c;静态住宅代理和动态住宅代理是两种常见的代理类型。今天就为大家详细介绍静态住宅代理与动态住宅代理的差异。 首先我们来看什么是静态住宅IP&#xff0c;这种IP地址可以被…

硅酸盐玻璃反应离子刻蚀在光学微系统的应用前景

引言 微光学元件和复杂光学微系统需要超精密制造工艺。最大容许粗糙度由所用波长λ的分数定义&#xff0c;例如λ或更好&#xff0c;而元件的整体尺寸和形状可以容易地达到毫米或厘米范围。在RIE过程中&#xff0c;材料传输是通过离子和反应气体与等离子体反应器表面的物理和化…

Spring Boot项目中的ASCII艺术字

佛祖保佑&#xff1a; ${spring-boot.formatted-version} ———————————————————————————————————————————————————————————————————— // _ooOoo_ …

贪心算法-活动选择问题背包问题

目录 活动选择问题 无重叠区间-Leetcode 435 分数背包问题--贪心解法 贪心法 0-1 背包问题 贪心法 贪心算法的局限 Set cover problem 活动选择问题 分析: /* 要在一个会议室举办n个活动 - 每个活动有它们各自的起始和结束时间 - 找出在时间上互不冲突的活动组合,能…

分享爱,分享精彩瞬间,分享5款实用软件

分享爱&#xff0c;分享时光&#xff0c;分享精彩瞬间&#xff0c;大家好&#xff0c;我是互联网的搬运工&#xff0c;今天继续给大家带来几款好用的软件。 1. 数据分析——Chartistic ​ Chartistic是一款功能强大的数据分析可视化工具&#xff0c;它提供了丰富的图表类型和…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof&#xff08;类型&#xff09;强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

Vue入门到关门之指令系统

一、引入 在 Vue.js 中&#xff0c;指令&#xff08;Directives&#xff09;是一种特殊的标记&#xff0c;用于向 Vue 实例提供特殊的行为。指令以 v- 开头&#xff0c;例如 v-if、v-for 等。 指令的本质就是语法糖&#xff0c;标志位。在编译阶段 render 函数里&#xff0c;…

R-Tree原理及实现代码

目录 一.引言 二.R-Tree的基本原理 插入操作 查询操作 删除操作 平衡操作 三. 节点分裂 线性分裂 二次分裂 增量分裂 四.查询 范围查询 最近邻查询 五.最新研究进展 六.C语言实现示例 七. 实际案例分析 八.总结 一.引言 在计算机科学领域&#xff0c;R-Tree是…

基于 Spring Boot 博客系统开发(一)

基于 Spring Boot 博客系统开发&#xff08;一&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。&#x1f913;&#x1f913;&#x1f913; 基于 Spring Boot 博客系统开发&#xff08;二&#xff09;&#x1f4…

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter&#xff08;异常处理&#xff09;&#xff0c;使用中间件异常处理&#xff0c;使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度&#xff0c;以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…

Spring Cloud学习笔记(Feigh):简介,实战简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Netflix Feign简介2、Open Feign的简单样例2.1、dependency2.2、代码样例 1、Netflix Feign简介 Netfilx Feign是用来帮助发送远程服务的&#xff0c;它让开发者觉得调用远程服务就像是调用本地方法一样&…

数字化转型之路:企业信息化建设的关键步骤

随着科技的不断发展和应用&#xff0c;企业数字化转型热已过&#xff0c;浪正汹&#xff0c;不得不成为当今商业领域的必由之路。然而&#xff0c;数字化转型不仅仅是简单地引入一些新技术或软件&#xff0c;而是一场全面的变革&#xff0c;涉及到组织文化、业务流程、技术基础…

mysql数据库开发军规

MySQL数据库开发军规是一系列最佳实践和原则&#xff0c;旨在帮助开发者在MySQL数据库设计和开发过程中提升性能、确保数据安全、减少错误&#xff0c;并提高可维护性。以下是一些关键的MySQL开发军规&#xff1a; 核心军规&#xff1a; 避免在数据库中进行复杂运算&#xff…