17 C语言学生管理系统

学生管理系统

👍😂💯 项目代码

代码可能存在细节上的错误,希望大家可以指导意见。


#define _CRT_SECURE_NO_WARNINGS  1#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_STUDENTS 100typedef struct {int id;char name[50];float score1;float score2;float score3;float average;
} Student;Student students[MAX_STUDENTS];
int num_students = 0;void display_menu() {printf("**********************************************\n");printf("              学生管理系统\n");printf("**********************************************\n");printf("                                          \n");printf(" 1.增加一位学生信息  2.删除一位同学信息      \n");printf(" 3.按学号查询学生    4.按姓名查询学生       \n");printf(" 5.修改学生信息      6.按姓名排序           \n");printf(" 7.按平均分排序      8.装入学生信息         \n");printf(" 9.保存学生信息      0.显示全部同学的信息   \n");printf("                                          \n");printf("按q或者Q退出系统                    \n");printf("**********************************************\n");printf("请选择操作:");
}void add_student() {Student new_student;printf("输入学生的学号(-1 结束): ");scanf("%d", &new_student.id);if (new_student.id == -1) {return;}printf("输入学生的姓名: ");scanf("%s", new_student.name);printf("输入学生的高数成绩: ");scanf("%f", &new_student.score1);printf("输入学生的C语言成绩: ");scanf("%f", &new_student.score2);printf("输入学生的英语成绩: ");scanf("%f", &new_student.score3);new_student.average = (new_student.score1 + new_student.score2 + new_student.score3) / 3.0;students[num_students++] = new_student;printf("学生信息添加成功\n");
}void delete_student() {int student_id;int i;printf("输入学生的学号: ");scanf("%d", &student_id);int index = -1;for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}for (i = index; i < num_students - 1; i++) {students[i] = students[i + 1];}num_students--;printf("删除学生信息成功\n");
}void search_by_id() {int student_id;int i;printf("输入学生的学号: ");scanf("%d", &student_id);int index = -1;for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[index].id, students[index].name, students[index].score1,students[index].score2, students[index].score3, students[index].average);
}void search_by_name() {int found = 0;char student_name[50];int i;printf("输入学生的姓名: ");scanf("%s", student_name);printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {if (strcmp(students[i].name, student_name) == 0) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);found = 1;}}if (!found) { printf("学生不存在\n"); }
}void update_student() {int student_id;int index = -1;int i;printf("输入学生的学号: ");scanf("%d", &student_id);for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}printf("输入学生的姓名: ");scanf("%s", students[index].name);printf("输入学生的课程1成绩: ");scanf("%f", &students[index].score1);printf("输入学生的课程2成绩: ");scanf("%f", &students[index].score2);printf("输入学生的课程3成绩: ");scanf("%f", &students[index].score3);students[index].average = (students[index].score1 + students[index].score2 + students[index].score3) / 3.0;printf("学生信息更新成功\n");
}void sort_by_name() {int i, j;for (i = 0; i < num_students - 1; i++) {for (j = 0; j < num_students - 1 - i; j++) {if (strcmp(students[j].name, students[j + 1].name) > 0) {Student temp = students[j];students[j] = students[j + 1];students[j + 1] = temp;}}}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}void sort_by_average() {int i, j;for (i = 0; i < num_students - 1; i++) {for (j = 0; j < num_students - 1 - i; j++) {if (students[j].average < students[j + 1].average) {Student temp = students[j];students[j] = students[j + 1];students[j + 1] = temp;}}}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}void load_students() {FILE *file = fopen("student_info.bin", "rb");if (file == NULL) {printf("无法打开文件\n");return;}fread(&num_students, sizeof(int), 1, file);fread(students, sizeof(Student), num_students, file);fclose(file);
}void save_students() {FILE *file = fopen("student_info.bin", "wb");if (file == NULL) {return;}fwrite(&num_students, sizeof(int), 1, file);fwrite(students, sizeof(Student), num_students, file);fclose(file);printf("学生信息保存成功\n");
}void display_students() {int i;printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}int main() {load_students();while (1) {display_menu();char choice;scanf(" %c", &choice);switch (choice) {case '1':add_student();break;case '2':delete_student();break;case '3':search_by_id();break;case '4':search_by_name();break;case '5':update_student();break;case '6':sort_by_name();break;case '7':sort_by_average();break;case '8':load_students();break;case '9':save_students();break;case '0':display_students();break;case 'q':case 'Q':printf("再见!\n");exit(0);default:printf("输入错误,请重新输入!\n");break;}}return 0;
}

项目运行展示





这段代码是一个简单的学生管理系统,它使用 C 语言编写,主要用于存储、管理和展示学生的基本信息及成绩。下面是对项目结构、逻辑结构和项目背景的详细描述:

项目结构

  1. 头文件和宏定义

    • #define _CRT_SECURE_NO_WARNINGS 1:这是为了防止在 Visual Studio 等编译器中出现关于不安全函数的警告。
    • #include 指令用于引入标准库,如 stdio.hstdlib.hstring.h,这些库提供了输入输出、内存操作和字符串处理等功能。
  2. 数据结构定义

    • Student 结构体定义了学生的信息,包括学号、姓名、三门课程的成绩和平均分。
  3. 全局变量

    • students 数组用于存储所有学生的信息。
    • num_students 变量用于跟踪当前存储的学生数量。
  4. 功能函数

    • display_menu():显示系统菜单。
    • add_student():添加学生信息。
    • delete_student():删除学生信息。
    • search_by_id()search_by_name():分别通过学号和姓名查询学生信息。
    • update_student():更新学生信息。
    • sort_by_name()sort_by_average():分别按姓名和平均分对学生进行排序。
    • load_students()save_students():从文件加载和保存学生信息。
    • display_students():显示所有学生信息。
  5. 主函数 main()

    • 初始化学生信息数组。
    • 进入一个无限循环,显示菜单并根据用户输入执行相应的操作。
    • 提供退出选项。

逻辑结构

  1. 初始化

    • main() 函数开始时,调用 load_students() 从文件加载已有的学生信息。
  2. 用户交互

    • 通过 display_menu() 函数显示操作选项。
    • 用户输入选择后,通过 switch 语句执行相应的功能函数。
  3. 数据处理

    • 每个功能函数都对 students 数组和 num_students 变量进行操作,以实现增加、删除、查询、更新、排序和显示学生信息的功能。
  4. 数据持久化

    • load_students()save_students() 函数通过二进制文件 student_info.bin 实现数据的持久化存储。

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

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

相关文章

conda修改环境名称后,无法安装包,显示no such file

1问题描述 原本创建环境时设置的名字不太合适&#xff0c;但是因为重新创建环境很麻烦&#xff0c;安装很多包。。所以想直接对包名进行修改&#xff0c;本人采用的方式是直接找到conda环境的文件目录&#xff0c;然后修改文件名&#xff0c;简单粗暴。确实修改成功了&#xf…

模拟集成电路(5)----单级放大器(共栅级)

模拟集成电路(5)----单级放大器&#xff08;共栅级&#xff09; 有一些场合需要一些小的输入电阻&#xff08;电流放大器&#xff09; 大信号分析 − W h e n V i n ≥ V B − V T H ∙ M 1 i s o f f , V o u t V D D − F o r L o w e r V i n I d 1 2 μ n C o x W L ( V…

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

xcode依赖包package已经安装,但是提示No such module ‘Alamofire‘解决办法

明明已经通过xcode自带的swift包管理器安装好了依赖包&#xff0c;但是却还是提示&#xff1a;No such module&#xff0c;这个坑爹的xcode&#xff0c;我也只能说服气&#xff0c;但是无奈&#xff0c;没办法攻打苹果总部&#xff0c;只能自己想解决办法了 No such module Ala…

香港优才计划找中介是否是智商税,靠谱中介又该如何找?

关于香港优才计划的申请&#xff0c;找中介帮助还是自己DIY&#xff0c;网络上充斥的声音太多&#xff0c;对不了解的人来说&#xff0c;难以抉择的同时还怕上当受骗。 这其中很容易误导人的关键在于——信息差&#xff01; 今天这篇文章的目的就是想让大家看清一些中介和DIY…

MoE模型大火,源2.0-M32诠释“三个臭皮匠,顶个诸葛亮”!

文 | 智能相对论 作者 | 陈泊丞 近半年来&#xff0c;MoE混合专家大模型彻底是火了。 在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。而在国内&#xff0c;浪潮信息也刚刚发布了基于MoE架构的“源2.0-M3…

C++【缺省参数|函数重载|引用】

目录 1 缺省参数 1.1 全缺省 1.2 半缺省 注意 1.3 应用 2 函数重载 函数重载的概念 1、参数类型不同 2、参数个数不同 3、参数类型顺序不同 3 引用 3.1 引用概念 3.2 引用特性 3.3 常引用 3.4 使用场景 3.5 传值、传引用效率比较 3.6 引用和指针的区别 1 缺…

基于51单片机的温度+烟雾报警系统设计

一.硬件方案 本设计采用51单片机为核心控制器&#xff0c;利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片&#xff0c;当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号&#xff0c;以此来…

【C++课程学习】:二叉树的基本函数实现

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f349;二叉树的结构类型&#xff1a; &#x1f349;1.创建二叉树函数&#xff08;根据数组&am…

30【Aseprite 作图】桌子——拆解

1 桌子只要画左上方&#xff0c;竖着5&#xff0c;斜着3个1&#xff0c;斜着两个2&#xff0c;斜着2个3&#xff0c;斜着一个5&#xff0c;斜着一个很长的 然后左右翻转 再上下翻转 在桌子腿部分&#xff0c;竖着三个直线&#xff0c;左右都是斜线&#xff1b;这是横着水平线不…

Python os.path.isfile() 和 os.path.isdir() 函数

Python os.path.isfile 和 os.path.isdir 函数 正文 正文 在网上看到很多人对这两个函数的用法有过说明&#xff0c;然而感觉都没有说到它们的本质&#xff0c;这里特来记录一下。os.path.isfile() 用来判断所给参数是否一个文件。os.path.isdir() 用来判断所给的参数是否是一…

Mybatis多表查询

MyBatis-多表查询-一对一查询(方式一) 一个菜品对应一个分类 直接菜品记录category对象 菜品id写入Dish,后面的分类直接写入 Category类 封装,如果sql不能封装上,那么直接使用resultmap封装 使用resultType只能封装基本属性 所以要定义一个resultmap手动封装 使用标签 要…

Python数据处理,使用 tkinter 模块点击获取文件目录

Python数据处理&#xff0c;使用 tkinter 模块点击获取文件目录 正文 正文 当我们进行数据处理读取文件内数据的时候&#xff0c;通常&#xff0c;我们需要设定好一个存放当前文件所在目录的变量。比如如下目录&#xff1a; file_path rC:\Users\xxx\Desktop\DataSet\Data.c…

【车载开发系列】Vector工具链的安装

【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装一. VectorDriver二. DaVinci_Developer三. DaVinci Configurator 一. VectorDriver Vector Driver Setup是Vector产品链中重要的驱动软件,所有的硬件设备进行连接…

mvc的常见注解

问文心一言的&#xff0c;记录一下。 PathVariable 路径变量注解 PathVariable 是 Spring MVC 提供的一个注解&#xff0c;它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 RequestMapping、GetMapping、PostMapping、PutMapping、DeleteMapping 等注解的 URL 路…

写Python时不用import,你会遭遇什么

from *** import *** 想必你已经再熟悉不过这样的python语法。 当你的 python 代码需要获取外部的一些功能&#xff08;一些已经造好的轮子&#xff09;&#xff0c;你就需要使用到 import 这个声明关键字。import可以协助导入其他 module 。&#xff08;类似 C 预约的 inclu…

信号处理中简单实用的方法

最小二乘法拟合消除趋势项 消除趋势项函数 在MATLAB的工具箱中已有消除线性趋势项的detrend函数&#xff1b;再介绍以最小二乘法拟合消除趋势项的polydetrend 函数。 函数:detrend功能:消除线性趋势项 调用格式:ydetrend(x) 说明:输入参数x是带有线性趋势项的信号序列,输出…

【408真题】2009-28

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

遇到软件测试职业瓶颈,如何突破

作为职场人&#xff0c;遇到发展瓶颈是在所难免的&#xff0c;无论是晋升受限、技能升级缓慢&#xff0c;还是工作激情的丢失&#xff0c;这些挑战都可能让人感到挫败。但是&#xff0c;积极应对&#xff0c;你就可能找到那扇通向新机遇的窗。 1. 自我评估 识别问题 是缺乏技能…

2024年四川省三支一扶报名流程图解✅

2024年四川省三支一扶报名流程图解✅ &#x1f534;时间安排 1、报名时间&#xff1a;5月31日—6月4日17:00 2、资格初审时间&#xff1a;5月31日—6月5日17:00 3、准考证打印时间&#xff1a;6月25日—6月29日 4、笔试时间&#xff1a;6月30日 5、笔试成绩&#xff1a;7…