当前位置: 首页 > news >正文

01学生管理系统(数组)

文章目录

    • 预处理
    • 学生结构体(根据实际需要)
    • 菜单
    • 自定义函数封装
      • 显示学生信息
    • 录入学生信息(一维数组)
    • 删除
    • 修改学生信息
    • 查询学生
    • 排序(冒泡)
    • 最大值
    • 分组统计
    • 清屏

预处理

#define _CRT_SECURE_NO_WARNINGS
#define STUDENT_NUMBER_MAX 50
#define STUDENT_NAME_SEX_MAX 20
#define STUDENT_SEX_MAX 5
#define SUBJECT_NUMBER 2
#define PRINT_STUDENT_INFO(index) \printf("学号: %d\n姓名: %s\n班级: %s\n性别: %s\n英语成绩: %.2f\nC语言成绩: %.2f\n总成绩: %.2f\n平均成绩: %.2f\n", \stu[index].num, stu[index].name, stu[index].clas, stu[index].sex, \stu[index].Eng_score, stu[index].C_score, stu[index].total, stu[index].aver)
#include <stdio.h>
#include<string.h>
#include <stdlib.h> 
#define LEN sizeof(struct student)

学生结构体(根据实际需要)

//学生信息结构体 
struct student
{int num;char name[STUDENT_NAME_SEX_MAX];char clas[STUDENT_NAME_SEX_MAX];char sex[STUDENT_SEX_MAX];float Eng_score;float C_score;float total;float aver;
};
struct student stu[STUDENT_NUMBER_MAX];

菜单

//目录 
void menu()
{printf("\n\n\n");printf("\t\t-------------------------------------------------\n");printf("\t\t||              ----------------               ||\n");printf("\t\t||**************学生信息管理系统***************||\n");printf("\t\t||              ----------------               ||\n");printf("\t\t||                                             ||\n");printf("\t\t||~~~~~~~~~~~~~~~1.录入学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~2.删除学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~3.修改学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~4.查询学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~5.显示学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~6.排序学生信息~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~7.显示最好成绩~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~8.分组统计成绩~~~~~~~~~~~~~~~~||\n");printf("\t\t||~~~~~~~~~~~~~~~9.清屏~~~~~~~~~~~~~~~~~~~~~~~~||\n");printf("\t\t||                                             ||\n");printf("\t\t||*********************************************||\n");
}

自定义函数封装

显示学生信息

void print()
{int i, m = 0;FILE* fp;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有内容\n");}printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");for (i = 0; i < m; i++){PRINT_STUDENT_INFO(i);//宏打印}
}

录入学生信息(一维数组)

//录入学生信息 
void in()
{void print();//封装的打印全部学生的函数声明,避免重复书写FILE* fp;int i, m = 0;char ch[2];//打开文本if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}//检查文件指针fp所指向的文件是否到达了文件末尾(EOF)while (!feof(fp)){//从文件中读取数据if (fread(&stu[m], LEN, 1, fp) == 1){m++;//记录人数}}fclose(fp);if (m == 0){printf("文件没有内容\n");}else{print();}//二进制追加模式if ((fp = fopen("stu.txt", "ab+")) == NULL){printf("文件打开失败\n");return;}printf("输入学生信息(y/n);\n");scanf("%s", ch);while (strcmp(ch, "y") == 0 || strcmp(ch, "Y") == 0){printf("number:\n");scanf("%3d", &stu[m].num);//编号合法性检查for (i = 0; i < m; i++){if (stu[i].num == stu[m].num){printf("您的信息已存在\n");fclose(fp);getchar();return;}}printf("name:\n");scanf("%s", stu[m].name);printf("class:\n");scanf("%s", stu[m].clas);printf("sex:\n");scanf("%s", stu[i].sex);printf("Eng_score:\n");scanf("%f", &stu[m].Eng_score);printf("C_score:\n");scanf("%f", &stu[m].C_score);stu[i].total = stu[i].C_score + stu[i].Eng_score;stu[i].aver = (stu[i].C_score + stu[i].Eng_score) / SUBJECT_NUMBER;if (fwrite(&stu[m], LEN, 1, fp) != 1){printf("不能保存\n");getchar();}else{printf("信息保存成功\n");m++;}printf("是否继续录入学生信息(y/n):");scanf("%s", ch);}fclose(fp);
}

删除

//删除学生信息 
void delet()
{void print();FILE* fp;int num, m = 0;int i, j;int flag = 0;char ch[2];if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有学生信息\n");}else{print();printf("请输入需要删除学生信息的学号:");scanf("%d", &num);}for (i = 0; i < m; i++){if (stu[i].num == num){printf("该学生已找到,是否删除(y/n):");scanf("%s", ch);if (strcmp(ch, "y") == 0 || strcmp(ch, "Y") == 0){//更新数组下标for (j = i; j < m; j++){stu[j] = stu[j + 1];}m--;flag = 1;//变更标志if ((fp = fopen("stu.txt", "wb")) == NULL){printf("文件打开失败\n");return;}//写入文件for (j = 0; j < m; j++){if (fwrite(&stu[j], LEN, 1, fp) != 1){printf("不能保存\n");getchar();}}fclose(fp);printf("删除成功!\n"); break;}else{printf("学生信息存在,不需要删除。");break;}}}if (m == i && flag == 0){printf("未找到该学生");}}

修改学生信息

//修改学生信息 
void updet()
{void print();int num;char name[STUDENT_NUMBER_MAX];char clas[STUDENT_NAME_SEX_MAX];char sex[STUDENT_SEX_MAX];float Eng_score;float C_score;FILE* fp;int m = 0, a;int i, j;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有学生信息\n");}else{print();printf("请输入需要修改学生信息的学号:");scanf("%d", &num);}for (i = 0; i < m; i++){if (num == stu[i].num){printf("1:学号,2:姓名,3:班级,4:性别,5:英语成绩,6:C语言成绩\n");printf("该学生已被找到,请选择需要修改的内容(1-5):");scanf("%d", &a);while (a){switch (a){case 1:printf("将%d学生的学号修改为:", num);scanf("%d", &num);stu[i].num = num;//修改唯一性判断for (j = i + 1; j < m; j++){if (stu[j].num == num){printf("您修改的学号已存在\n");getchar();return;}}break;case 2:printf("将%d学生的姓名修改为:", num);scanf("%s", name);strcpy(stu[i].name, name);break;case 3:printf("将%d学生的班级修改为:", num);scanf("%s", clas);strcpy(stu[i].clas, clas);break;case 4:printf("将%d学生的性别修改为:", num);scanf("%s", sex);strcpy(stu[i].sex, sex);break;case 5:printf("将%d学生的英语成绩修改为:", num);scanf("%f", &Eng_score);stu[i].Eng_score = Eng_score;stu[i].total = stu[i].C_score + stu[i].Eng_score;stu[i].aver = (stu[i].C_score + stu[i].Eng_score) / SUBJECT_NUMBER;break;case 6:printf("将%d学生的C语言成绩修改为:", num);scanf("%f", &C_score);stu[i].C_score = C_score;stu[i].total = stu[i].C_score + stu[i].Eng_score;stu[i].aver = (stu[i].C_score + stu[i].Eng_score) / SUBJICT_NUMBER;break;default:printf("选择错误,请重新选择需要修改的内容:");scanf("%d", &a);break;}printf("请选择需要修改的内容(如果已修改完成请按0):");scanf("%d", &a);}if ((fp = fopen("stu.txt", "wb")) == NULL){printf("文件打开失败\n");return;}for (j = 0; j < m; j++){if (fwrite(&stu[j], LEN, 1, fp) != 1){printf("不能保存\n");getchar();}}fclose(fp);printf("修改成功!\n");break;}}if (m == i){printf("未找到该学生\n");}
}

查询学生

//查询学生信息 
void select()
{int num, m = 0;int i;FILE* fp;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件没有内容\n");return;}printf("请输入学生学号进行查询:");scanf("%d", &num);for (i = 0; i < m; i++){if (num == stu[i].num){printf("\n");printf("该学生信息已被查到;\n");printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");PRINT_STUDENT_INFO(i);break;}}if (m == i){printf("该学生信息不存在\n");return;}
}

排序(冒泡)

//排序 
void sort()
{int i, j, m = 0;int ch;FILE* fp;struct student  temp;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有内容\n");}printf("1:学号升序,2:英语成绩升序,3:C语言升序,4:总成绩升序,5:平均成绩升序\n");printf("请选择显示形式:");scanf("%d", &ch);switch (ch){case 1:for (i = 0; i < m; i++){for (j = i + 1; j < m; j++){if (stu[i].num > stu[j].num){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}break;case 2:for (i = 0; i < m; i++){for (j = i + 1; j < m; j++){if (stu[i].Eng_score > stu[j].Eng_score){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}break;case 3:for (i = 0; i < m; i++){for (j = i + 1; j < m; j++){if (stu[i].C_score > stu[j].C_score){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}break;case 4:for (i = 0; i < m; i++){for (j = i + 1; j < m; j++){if (stu[i].total > stu[j].total){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}break;case 5:for (i = 0; i < m; i++){for (j = i + 1; j < m; j++){if (stu[i].aver > stu[j].aver){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}break;}printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");for (i = 0; i < m; i++){PRINT_STUDENT_INFO(i);}}

最大值

//最大值 
void _max()
{int i, j = 0;FILE* fp;int m = 0;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有内容\n");}for (i = 0; i < m; i++){if (stu[i].total > stu[j].total)j = i;}printf("总成绩成绩最高的同学是:\n");printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");PRINT_STUDENT_INFO(j)}

分组统计

//分组统计
void cut()
{int i, j;float n;FILE* fp;int m = 0;if ((fp = fopen("stu.txt", "rb")) == NULL){printf("文件打开失败\n");return;}while (!feof(fp)){if (fread(&stu[m], LEN, 1, fp) == 1){m++;}}fclose(fp);if (m == 0){printf("文件中没有内容\n");}printf("请输入按总成绩分组的值:");scanf("%f", &n);printf("总成绩大于%.2f的同学有:\n", n);printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");for (i = 0; i < m; i++){if (stu[i].total >= n)PRINT_STUDENT_INFO(i);}printf("总成绩小于%.2f的同学有:\n", n);printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");for (j = 0; j < m; j++){if (stu[j].total < n)PRINT_STUDENT_INFO(j);}

清屏

//清屏
void clea()
{system("cls");
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Spring Boot的健身房管理系统
  • Linux从0到1——进程池
  • 江协科技STM32学习笔记
  • HBase snapshot+replication 测试
  • 不依靠for循环,Python如何对列表进行去重并保留排列顺序
  • <Qt> 系统 - 事件
  • 计算机网络——HTTP协议详解(上)
  • 7万字详解Apache Shiro面试题、示例、参考答案
  • 文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)
  • 贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询)
  • 字符串函数!!!(续)(C语言)
  • Git 大文件存储 (LFS)
  • uniapp跳转携带参数
  • zigbee笔记:十、ZStack(2.3.0-1.4.0)的OSAL使用分析
  • Spark SQL Catalyst工作流程
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [译]CSS 居中(Center)方法大合集
  • 3.7、@ResponseBody 和 @RestController
  • Angular4 模板式表单用法以及验证
  • angular组件开发
  • ES6简单总结(搭配简单的讲解和小案例)
  • FastReport在线报表设计器工作原理
  • java2019面试题北京
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • JWT究竟是什么呢?
  • Mysql优化
  • PermissionScope Swift4 兼容问题
  • Python进阶细节
  • Vue小说阅读器(仿追书神器)
  • Webpack 4 学习01(基础配置)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 聚类分析——Kmeans
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端js -- this指向总结。
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 网页视频流m3u8/ts视频下载
  • - 转 Ext2.0 form使用实例
  • 第二十章:异步和文件I/O.(二十三)
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #单片机(TB6600驱动42步进电机)
  • $().each和$.each的区别
  • $.ajax()参数及用法
  • (007)XHTML文档之标题——h1~h6
  • (13)Hive调优——动态分区导致的小文件问题
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法)大数的进制转换
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题