【C语言】手写学生管理系统丨附源码+教程

最近感觉大家好多在忙C语言课设~

我来贡献一下,如果对你有帮助的话谢谢大家的点赞收藏喔!


1. 项目分析

小白的神级项目,99%的程序员,都做过这个项目!

掌握这个项目,就基本掌握 C 语言了!

跳过这个项目,永远是小白!

图片

2. 项目准备

VS 的任意版本(推荐 VS2010/VS2019)

任意版本的 C 语言开发环境、

3. 创建项目

1. 创建空项目。

2. 编写测试代码

#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("hello world\n");
system("pause");
return 0;
}

4. 编写功能菜单

初级版


int main(void) {
printf("
学生信息管理系统\n");
printf("1. 输入学生信息\n");
printf("3. 删除学生信息\n");
printf("3. 删除学生信息\n");
printf("4. 修改学生信息\n");
printf("5. 插入学生信息\n");
printf("6. 学生成绩排名\n");
printf("7. 统计学生总数\n");
printf("8. 显示所有信息\n");
printf("0. 退出系统\n");
system("pause");
return 0;
}

表格版

使用表格形式打印。

图片

导入第 3 行工具(Rock 开发,可以进一步完善)

公众号:奇牛编程

回复关键字:管理系统

初始化窗口大小


void init() {
char cmd[128];
sprintf(cmd, "mode con lines=%d cols=%d", WIN_HEIGHT, WIN_WIDTH);
system(cmd);
}
int main(void) {
init();
......
return 0;
}

创建菜单函数 menu


void menu() {
system("cls");
printTableHead(MENU_WIDTH);
printTableMidInfo(MENU_WIDTH, "学生信息管理系统");
printTableMidInfo(MENU_WIDTH, "");
const char* subMenus[] = {
"1. 输入学生信息",
"2. 查找学生信息",
"3. 删除学生信息",
"4. 修改学生信息",
"5. 插入学生信息",
"6. 学生成绩排名",
"7. 统计学生总数",
"8. 显示所有信息",
"0. 退出系统 "
};
int count = sizeof(subMenus) / sizeof(subMenus[0]);
for (int i = 0; i < count; i++) {
printTableMidInfo(MENU_WIDTH, subMenus[i]);
}
printTableMidInfo(MENU_WIDTH, "");
printTableTail(MENU_WIDTH);
printMidInfo("请选择(0-8): ");
}

调用 menu 函数


int main(void) {
init();
menu();
return 0;
}

上色

color -?

void init() {
char cmd[128];
sprintf(cmd, "mode con lines=%d cols=%d", WIN_HEIGHT, WIN_WIDTH);
system(cmd);
system("color 1f"); //system("color f0\n");
}

5. 菜单选择


int main(void) {
init();
menu();
int n;
scanf("%d", &n);
while (1) {
switch (n) {
case 1: input();break;
case 2: search();break;
case 3: del(); break;
case 4: modify(); break;
case 5: insert(); break;
case 6: order(); break;
case 7: total(); break;
case 8: show(); break;
default:break;
}
waitConfirm();
menu();
rewind(stdin); // fflush(stdin),在 VS2015 以上无效
scanf("%d", &n);
}
return 0;
}

添加的各功能接口:


void input() {
system("cls");
printf("输入...\n");
}
void search() {
system("cls");
printf("查询...\n");
}
void del() {
system("cls");
printf("删除...\n");
}
void modify() {
system("cls");
printf("修改...\n");
}
void insert() {
system("cls");
printf("插入...\n");
}
void order() {
system("cls");
printf("排序...\n");
}
void total() {
system("cls");
printf("统计...\n");
}
void show() {
system("cls");
printf("显示...\n");
}
void waitConfirm() {
rewind(stdin); //flush(stdin)在 VS2015 以上无效,使用 rewind,清空缓存
getch();
}

学生信息的表示


struct student {
int num; //学号
char name[16];
int cLang; //C 语言
int algo; //算法
int database; //数据库
int sum;
};

学生信息的存储

在内存中的存储


#define MAX_COUNT 100
struct student stu[MAX_COUNT];
int currentCount = 0;

在文件中的存储

data.txt

初始化学员信息


void init() {
char cmd[128];
sprintf(cmd, "mode con lines=%d cols=%d", WIN_HEIGHT, WIN_WIDTH);
system(cmd);
system("color 1f"); //system("color f0\n");
memset(stu, 0, sizeof(stu));
FILE* fp = fopen("data.txt", "rb");
if (fp == NULL) {
//printf("文件不存在!\n");
currentCount = 0;
return;
}
int i = 0;
while (!feof(fp)) {
int ret = fread(&stu[i], sizeof(struct student), 1, fp);
if (ret == 1) {
i++;
}
}
currentCount = i;
}

输入学生信息

实现输入功能


void input() {
char str[16];
struct student s;
while (1) {
system("cls");
printf("输入学生信息(y/n):");
rewind(stdin); //清空输入缓存区
scanf("%s", str);
if (strcmp(str, "Y") != 0 && strcmp(str, "y") != 0) {
break;
}
s = inputInfo();
if (searchStu(s.num) >= 0) {
printf("学号[%d] 已经存在!\n", s.num);
waitConfirm();
continue;
}
stu[currentCount++] = s;
if (!save()) {
printf("保存失败!\n");
}
else {
printf("保存成功!\n");
}
waitConfirm();
}
printf("\n 结束输入!\n");
}

inputInfo 函数


struct student inputInfo() { //可优化成使用指针参数
struct student s;
rewind(stdin); //清空输入缓存区
printf("学号:");
scanf("%d", &s.num);
printf("姓名:");
scanf("%s", s.name);
printf("C 语言:");
scanf("%d", &s.cLang);
printf("算法:");
scanf("%d", &s.algo);
printf("数据库:");
scanf("%d", &s.database);
s.sum = s.cLang + s.algo + s.database;
return s;
}

searchStu 函数


int searchStu(int snum) {
for (int i = 0; i < currentCount; i++) {
if (stu[i].num == snum) {
return i;
}
}
return -1;
}


save 函数


bool save() {
FILE *fp = fopen("data.txt", "wb");
if (fp == NULL) {
fclose(fp);
return false;
}
for (int i = 0; i < currentCount; i++) {
if (fwrite(&stu[i], sizeof(struct student), 1, fp) != 1) {
fclose(fp);
return false;
}
}
fclose(fp);
return true;
}

显示学生信息


#define RECORDER_PER_PAGE 10
void show() {
system("cls");
if (currentCount == 0) {
printf("还没有学生信息!\n");
return;
}
int pageCount = (currentCount + RECORDER_PER_PAGE - 1) / RECORDER_PER_PAGE;
char buff[64];
for (int i = 0; i < pageCount; i++) {
showPage(i * RECORDER_PER_PAGE, (i + 1) * RECORDER_PER_PAGE - 1);
sprintf(buff, "共%d 页 第[%d]页", pageCount, i + 1);
printMidInfo(buff);
if (i < pageCount - 1) {
waitConfirm();
}
}
}

showPage 函数


// 表头信息
char head[][COL_LEN_MAX] = { "学号", "姓名", "C 语言", "算法", "数据库", "总分" };
void showPage(int startIndex, int endIndex) {
if (endIndex >= currentCount) {
endIndex = currentCount - 1;
}
if (endIndex - startIndex + 1 > RECORDER_PER_PAGE) {
endIndex = startIndex + RECORDER_PER_PAGE - 1;
}
char row[6][COL_LEN_MAX];
system("cls");
printTableHead(TABLE_WIDTH, 6);
printTableRow(TABLE_WIDTH, head, sizeof(head) / sizeof(head[0]));
printTableMidLine(TABLE_WIDTH, 6);
for (int i = startIndex; i <= endIndex; i++) {
sprintf(row[0], "%d", stu[i].num);
sprintf(row[1], "%s", stu[i].name);
sprintf(row[2], "%d", stu[i].cLang);
sprintf(row[3], "%d", stu[i].algo);
sprintf(row[4], "%d", stu[i].database);
sprintf(row[5], "%d", stu[i].sum);
printTableRow(TABLE_WIDTH, row, 6);
if (i < endIndex) {
printTableMidLine(TABLE_WIDTH, 6);
}
else {
printTableTail(TABLE_WIDTH, 6);
}
}
}

查询学生信息


void search() {
int snum = 0;
system("cls");
printf("请输入学号:");
scanf("%d", &snum);
int i = searchStu(snum);
if (i < 0) {
printf("没有找到这名学生!\n");
return;
}
char row[6][COL_LEN_MAX];
char head[][COL_LEN_MAX] = { "学号", "姓名", "C 语言", "算法", "数据库", "总分" };
printTableHead(TABLE_WIDTH, 6);
printTableRow(TABLE_WIDTH, head, sizeof(head) / sizeof(head[0]));
printTableMidLine(TABLE_WIDTH, 6);
sprintf(row[0], "%d", stu[i].num);
sprintf(row[1], "%s", stu[i].name);
sprintf(row[2], "%d", stu[i].cLang);
sprintf(row[3], "%d", stu[i].algo);
sprintf(row[4], "%d", stu[i].database);
sprintf(row[5], "%d", stu[i].sum);
printTableRow(TABLE_WIDTH, row, 6);
printTableTail(TABLE_WIDTH, 6);
}

删除学生信息


void del() {
FILE* fp;
int snum = 0;
char str[16] = "";
system("cls");
printf("请输入学号:");
scanf("%d", &snum);
int i = searchStu(snum);
if (i<0) {
printf("没有找到这名学生!\n");
return;
}
printf("找到这条记录,是否删除?(y/n)");
scanf("%s", str);
if (strcmp(str, "Y") == 0 || strcmp(str, "y") == 0) {
for (int j = i; j < currentCount; j++) {
stu[j] = stu[j + 1];
}
currentCount--;
if (save()) {
printf("删除成功!\n");
}
else {
printf("保存文件失败!\n");
}
}
else {
printf("取消删除!\n");
}
}

修改学生信息


void modify() {
int snum;
system("cls");
printf("请输入要修改的学生的学号: ");
scanf("%d", &snum);
int i = searchStu(snum);
if (i < 0) {
printf("没有找到这名学生!\n");
return;
}
printf("找到了这名学生, 可以修改他的信息!\n");
printf("姓名:");
scanf("%s", stu[i].name);
printf("C 语言:");
scanf("%d", &stu[i].cLang);
printf("算法:");
scanf("%d", &stu[i].algo);
printf("数据库:");
scanf("%d", &stu[i].database);
stu[i].sum = stu[i].cLang + stu[i].algo + stu[i].database;
if (save()) {
printf("修改成功!\n");
}
else {
printf("保存文件失败!\n");
}
}

插入学员信息

在指定学生的后面插入


int snum;
system("cls");
printf("请输入要插入的位置(学号):");
scanf("%d", &snum);
int destIndex = searchStu(snum);
if (destIndex < 0) {
printf("没有这名学生,插入位置错误!\n");
return;
}
struct student t = inputInfo();
int i = searchStu(t.num);
if (i >= 0) {
printf("学号[%d]已经存在! \n", t.num);
return;
}
for (int j = currentCount-1; j > destIndex; j--) {
stu[j + 1] = stu[j];
}
stu[destIndex + 1] = t;
currentCount++;
if (save()) {
printf("插入成功!\n");
} else {
printf("保存文件失败!\n");
}

学生成绩排名

掌握最基础的排序算法-交换排序


void order() {
if (currentCount == 0) {
printf("还没有学生记录!\n");
return;
}
for (int i = 0; i < currentCount - 1; i++) {
for (int j = i + 1; j < currentCount; j++) {
if (stu[i].sum < stu[j].sum) {
struct student t = stu[i];
stu[i] = stu[j];
stu[j] = t;
}
}
}
if (!save()) {
printf("排序后,保存文件失败!\n");
}
else {
show();
}
}

统计学生总数

作业,自己实现哦~

更多项目提升

长按图片扫码进入小程序

图片

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

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

相关文章

idea http client GET 请求 报503错误

idea 提供的 http client 插件&#xff0c;在 GET 请求时总是 报503 的错误&#xff0c;但请求URL可以在浏览器中正常访问。 GET localhost:8080/student Response file saved. > 2024-06-20T160906.503.html 有一种原因跟本地配置的代理有关&#xff0c;如下图。如果在…

大模型应用场景在哪?探索人工智能的无限可能

随着人工智能技术的飞速发展&#xff0c;大模型在自然语言处理、计算机视觉、推荐系统等领域取得了显著成果。这些大模型&#xff0c;如OpenAI的GPT-3、谷歌的BERT、百度的ERNIE等&#xff0c;不仅在学术界引起了巨大反响&#xff0c;也在产业界得到了广泛应用。本文将以大模型…

sqlcoder实践

背景 Defog llama-3 意义 翻译自然语言到sql&#xff0c;类似脑机接口&#xff0c;大模型重要应用领域 sql是数据库查询标准;关系数据库&#xff0c;工具(datax,sqoop&#xff0c;logstash,hive)&#xff0c;非关系数据库&#xff08;MongoDB&#xff0c;图数据库&#xff…

上新:NFTScan 正式上线 Bitcoin-brc20 浏览器!

近日&#xff0c;NFTScan 团队正式对外发布了 Bitcoin-brc20 浏览器&#xff0c;将为 Bitcoin 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。作为比特币生态中最火热的标准之一&#xff0c;brc20 也吸引着广泛的关注。洞悉其巨大潜力&#xff0c;NFTScan 对 b…

协同编辑:只是在线协作这么简单吗?揭秘协同编辑的深层价值

经常很多朋友咨询&#xff0c;无忧企业文档是否支持协同编辑&#xff0c;首先肯定是支持的。但是&#xff0c;我发现很多人对于“协同编辑”的理解可能比较表面&#xff0c;仅仅停留在多人同时编辑一份文档的层面。实际上&#xff0c;协同编辑的功能远不止于此&#xff0c;它更…

两个方法,批量替换PPT中的字体

经常制作ppt的朋友可能会遇到需要批量替换字体的情况&#xff0c;如果我们想要更换ppt中的字体&#xff0c;今天分享PPT批量替换字体的两个方法。 方法一&#xff1a; 找到功能栏中的编辑选项卡&#xff0c;点击替换 – 替换字体&#xff0c;在里面选择我们想要替换的字体就可…

通过MindSpore API实现深度学习模型

快速入门 将相应的包逐一导入到项目中&#xff0c;这是制作项目的第一步。 import mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset 处理数据集 先从网上下载对应的数据集文件,MindSpor…

《C++ Primer》导学系列:第 6 章 - 函数

6.1 函数基础 6.1.1 基本概念 函数是C程序的基本组成单元&#xff0c;用于将代码组织成可以复用的模块。函数通过函数名进行调用&#xff0c;并且可以接受参数和返回值。函数的定义包括函数头和函数体&#xff0c;其中函数头描述了函数的接口&#xff0c;函数体包含了具体的实…

最新OPPO 真我手机 一加手机 使用adb命令永久关闭系统更新教程

使用adb命令永久关闭系统更新 一、先了解手机系统二、Android 11 以下使用adb 命令永久关闭系统更新1、adb 官方下载2、小白开启 USB 调试模式教程&#xff08;熟手跳过&#xff09;三、Android 12 以上使用adb 命令永久关闭系统更新什么您还是不会弄&#xff01;赞赏我&#x…

MYSQL 四、mysql进阶 3(存储引擎)

mysql中表使用了不同的存储引擎也就决定了我们底层文件系统中文件的相关物理结构。 为了管理方便&#xff0c;人们把连接管理、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 Mysql Server的功能&#xff0c;把真实存取数据的功能划分为存储引擎的功能&…

systemd的实现原理

systemd是现代Linux系统中的初始化系统和服务器管理器&#xff0c;而systemctl是用于与systemd交互的命令行工具。 systemd是一个守护进程&#xff0c;systemctl是命令行管理工具&#xff1a;systemd是用于管理Linux系统的初始化过程和后台服务的初始化系统&#xff0c;而syst…

Windows10 + fydeOS双系统!简单几步完成

前言 最近发现小伙伴对于fydeOS热情是真的不减&#xff0c;啧啧啧……今天闲来无事&#xff0c;就来讲讲双系统Windows10 fydeOS的安装方法吧&#xff01; Windows10 FydeOS双系统安装过程其实很简单&#xff0c;不过要建议先安装好Windows10系统。 虽然先安装好fydeOS之后…

SpringBootWeb 篇-入门了解 Vue 前端工程的创建与基本使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 基于脚手架创建前端工程 1.1 基于 Vue 开发前端项目的环境要求 1.2 前端工程创建的方式 1.2.1 基于命令的方式来创建前端工程 1.2.2 使用图形化来创建前端工程 1.…

如何建立私域流量?私域流量怎么运营,一文读懂

当全网都在讨论私域流量&#xff0c;你是不是也有很多问号呢&#xff1f; 互联网高速发达&#xff0c;消费形式日新月异&#xff0c;跟不上时代就会被时代淘汰&#xff0c;接下来&#xff0c;我们就从3个层面深度讨论下私域流量究竟是什么&#xff1f;为什么要玩转私域流量&am…

【保姆级教程】Linux 基于 Docker 部署 MySQL 和 Nacos 并配置两者连接

一、Linux 部署 Docker 1.1 卸载旧版本&#xff08;如有&#xff09; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine1.2 安装 yum-utils 包 sudo yum install -y…

微信多开器

由于微信的限制&#xff0c;我们平时只能登录一个微信&#xff0c;要登录多个微信一般需要多台手机&#xff0c;很显然这种方法很费手机&#xff01;&#xff01;一个微信多开神器可以给你省下好几台手机钱&#xff0c;抓紧拉下来放手机里落灰http://www.xbydon.online/?p132 …

NetSuite 审批工作流与事务处理类型的限制关系

在最近的实践中&#xff0c;用户提出可否对Credit Memo与Vendor Prepayment Application两种事务处理类型进行审批参与&#xff0c;当提出来的时候我们并没有直接在系统中进行测试&#xff0c;而是以常规事务处理的角度认为可以满足客户的需求&#xff1b; 但在沙盒环境中讨论…

RocketMQ快速入门:如何保证消息不丢失|保证消息可靠性(九)

0. 引言 在金融、电商等对数据完整性要求极高的行业&#xff0c;消息的丢失可能会导致数据不一致&#xff0c;严重影响业务逻辑和数据统计&#xff0c;也影响客户体验&#xff0c;所以在很多业务场景下&#xff0c;我们都要求数据不能丢失。而rocketmq中&#xff0c;如何对消息…

当游戏遭遇安全问题,我们应该怎么做?

在游戏安全领域&#xff0c;专业性最差、但最常见的案例类型是DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;。出于它的特性&#xff0c;中小厂商、独立开发者较容易遭受这类攻击。 例如&#xff0c;今年2月29日上线的手游《雷索纳斯》就遭受了名为ACCN组织发起的DDoS攻…

【内含优惠码】重磅发售!《2023年度中国量化投资白皮书》(纸质版)

这是可以公开了解量化行业图景的&#xff0c;为数不多资料。 简介 《2023年度中国量化投资白皮书》由宽邦科技、华泰证券、金融阶、华锐技术、AMD、阿里云、英迈中国等多家机构联合发起编写&#xff0c;并于2024年6月15日正式发布&#xff0c;全书公17万字6大章节勾勒最新量化…