基础项目实战——学生管理系统(c++)
目录
- 前言
- 一、功能菜单界面
- 二、类与结构体的实现
- 三、录入学生信息
- 四、删除学生信息
- 五、更改学生信息
- 六、查找学生信息
- 七、统计学生人数
- 八、保存学生信息
- 九、读取学生信息
- 十、打印所有学生信息
- 十一、退出系统
- 十二、文件拆分
- 结语
前言
这一期我们来一起学习我们在大学做过的课程设计——学生管理系统,这是一个非常简单且非常值得像我这样的新手独立完成的一个基础项目,用到基础数据结构里的链表来实现,所以指针和链表不太理解的同学先去理解,这样做这个项目会比较顺畅。

一、功能菜单界面
进入到该系统我们就可以选择我们想要的操作,为了方便我们能准确的知道哪个数字是实现什么操作,我们将其一直显示在运行窗口。
int menu() {cout << "***********************************************" << endl;cout << "* Welcome to Student Management System *" << endl;cout << "***********************************************" << endl;cout << " Please select an option: " << endl;cout << " 1.录入学生信息 " << endl;cout << " 2.删除学生信息 " << endl;cout << " 3.修改学生信息 " << endl;cout << " 4.查询学生信息 " << endl;cout << " 5.读取学生信息 " << endl;cout << " 6.保存学生信息 " << endl;cout << " 7.显示学生信息 " << endl;cout << " 8.统计学生信息 " << endl;cout << " 0.退出系统 " << endl;cout << "select an option(0-8):";int option;cin >> option;return option;
}
调试的结果

然后就是我们输入想要操作的数字就执行相应的操作,我们可以用enum来表示不同操作的数字。我们每次进行不同操作时为了让我们的运行界面看起来简洁美观,我们可以调用这个函数system(“cls”),它表示清空运行界面的所有内容,但是为了不让每次操作完之后就马上清空,所以我们在这个函数之前加入一个暂停的函数system(“pause”);
enum MenuOption {Entry=1,Delete=2,Update=3,Find=4,Read=5,Save=6,Display=7,Statistics=8,Exit=0
};
int main() {List list;bool isRunning=true;while (isRunning) {switch (menu()) {case Entry:list.addStudent();break;case Delete:list.deleteStudent();break;case Update:list.updateStudent();break;case Find:list.find();break;case Read:list.read();break;case Save:list.save();break;case Display:list.print();break;case Statistics:list.statistics();break;case Exit:isRunning=false;break;}system("pause");system("cls");}return 0;
}
二、类与结构体的实现
如果你学了链表这个是非常容易理解的,我就不过多解释了
struct Student {unsigned long long number;string name;int age;float score;
};struct node {Student data;node* next;
};class List {
private:node* head;int size;
public:List() :head(NULL), size(0) {}~List() {}void addStudent();void deleteStudent();void updateStudent();void find();void read();void save();void print();void statistics();
};
三、录入学生信息
void List::addStudent() {node* newNode = new node;cout << "请输入学号:";cin >> newNode->data.number;cout << "请输入姓名:";cin >> newNode->data.name;cout << "请输入年龄:";cin >> newNode->data.age;cout << "请输入成绩:";cin >> newNode->data.score;newNode->next = head;head = newNode;size++;
}
四、删除学生信息
void List::deleteStudent() {cout << "请输入要删除的学生学号:";int number;cin >> number;node* curr = head;node* prev = NULL;while (curr) {if (curr->data.number == number) {if (prev) {prev->next = curr->next;}else {head = curr->next;}delete curr;size--;return;}prev = curr;curr = curr->next;}cout << "学生信息不存在!" << endl;
}
五、更改学生信息
void List::updateStudent() {cout << "请输入要修改的学生学号:";int number;cin >> number;node* curr = head;while (curr) {if (curr->data.number == number) {cout << "请输入新的姓名:";cin >> curr->data.name;cout << "请输入新的年龄:";cin >> curr->data.age;cout << "请输入新的成绩:";cin >> curr->data.score;return;}curr = curr->next;}cout << "学生信息不存在!" << endl;
}
六、查找学生信息
void List::find(){cout << "请输入要查询的学生学号:";int number;cin >> number;node* curr = head;while (curr) {if (curr->data.number == number) {cout << "学号:" << curr->data.number << endl;cout << "姓名:" << curr->data.name << endl;cout << "年龄:" << curr->data.age << endl;cout << "成绩:" << curr->data.score << endl;return;}curr = curr->next;}cout << "学生信息不存在!" << endl;
}
七、统计学生人数
void List::statistics() {int cnt = 0;node* curr = head;while (curr) {cnt++;curr = curr->next;}cout << "学生数量:" << cnt << endl;
}
八、保存学生信息
将所以学生的信息全部保存在新创建的文件内如student.txt文件

void List::save() {ofstream fout;fout.open("student.txt");node* curr = head;while(curr) {fout << curr->data.number << " " << curr->data.name << " " << curr->data.age << " " << curr->data.score << endl;curr = curr->next;}fout.close();
}
九、读取学生信息
void List::read() {ifstream fin;fin.open("student.txt");string line;while (getline(fin, line)) {cout<<line<<endl;}fin.close();
}
十、打印所有学生信息
void List::print(){node* curr = head;cout << "***********************************************" << endl;cout << "* Student Information *" << endl;cout << "* 学号 * 姓名 * 年龄 * 成绩 *" << endl;while (curr) {cout << curr->data.number << " " << curr->data.name << " " << curr->data.age << " " << curr->data.score << endl;curr = curr->next;}delete curr;
}
十一、退出系统
我们定义一个布尔变量isRunning,如果它为true系统就继续运行,否则退出系统。
十二、文件拆分
新创建studenManager.cpp和studenManager.h两个文件。
studenManager.cpp文件内容如下:
#include "StudentManager.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;int menu() {cout << "***********************************************" << endl;cout << "* Welcome to Student Management System *" << endl;cout << "***********************************************" << endl;cout << " Please select an option: " << endl;cout << " 1.录入学生信息 " << endl;cout << " 2.删除学生信息 " << endl;cout << " 3.修改学生信息 " << endl;cout << " 4.查询学生信息 " << endl;cout << " 5.读取学生信息 " << endl;cout << " 6.保存学生信息 " << endl;cout << " 7.显示学生信息 " << endl;cout << " 8.统计学生信息 " << endl;cout << " 0.退出系统 " << endl;cout << "select an option(0-8):";int option;cin >> option;return option;
}void List::addStudent() {node* newNode = new node;cout << "请输入学号:";cin >> newNode->data.number;cout << "请输入姓名:";cin >> newNode->data.name;cout << "请输入年龄:";cin >> newNode->data.age;cout << "请输入成绩:";cin >> newNode->data.score;newNode->next = head;head = newNode;size++;
}void List::deleteStudent() {cout << "请输入要删除的学生学号:";int number;cin >> number;node* curr = head;node* prev = NULL;while (curr) {if (curr->data.number == number) {if (prev) {prev->next = curr->next;}else {head = curr->next;}delete curr;size--;return;}prev = curr;curr = curr->next;}cout << "学生信息不存在!" << endl;
}void List::updateStudent() {cout << "请输入要修改的学生学号:";int number;cin >> number;node* curr = head;while (curr) {if (curr->data.number == number) {cout << "请输入新的姓名:";cin >> curr->data.name;cout << "请输入新的年龄:";cin >> curr->data.age;cout << "请输入新的成绩:";cin >> curr->data.score;return;}curr = curr->next;}cout << "学生信息不存在!" << endl;
}void List::find(){cout << "请输入要查询的学生学号:";int number;cin >> number;node* curr = head;while (curr) {if (curr->data.number == number) {cout << "学号:" << curr->data.number << endl;cout << "姓名:" << curr->data.name << endl;cout << "年龄:" << curr->data.age << endl;cout << "成绩:" << curr->data.score << endl;return;}curr = curr->next;}cout << "学生信息不存在!" << endl;
}void List::statistics() {int cnt = 0;node* curr = head;while (curr) {cnt++;curr = curr->next;}cout << "学生数量:" << cnt << endl;
}void List::save() {ofstream fout;fout.open("student.txt");node* curr = head;while(curr) {fout << curr->data.number << " " << curr->data.name << " " << curr->data.age << " " << curr->data.score << endl;curr = curr->next;}fout.close();
}void List::read() {ifstream fin;fin.open("student.txt");string line;while (getline(fin, line)) {cout<<line<<endl;}fin.close();
}void List::print(){node* curr = head;cout << "***********************************************" << endl;cout << "* Student Information *" << endl;cout << "* 学号 * 姓名 * 年龄 * 成绩 *" << endl;while (curr) {cout << curr->data.number << " " << curr->data.name << " " << curr->data.age << " " << curr->data.score << endl;curr = curr->next;}delete curr;
}studenManager.h文件内容如下:```cpp
#pragma once
#include <iostream>
using namespace std;struct Student {unsigned long long number;string name;int age;float score;
};struct node {Student data;node* next;
};class List {
private:node* head;int size;
public:List() :head(NULL), size(0) {}~List() {}void addStudent();void deleteStudent();void updateStudent();void find();void read();void save();void print();void statistics();
};int menu();
enum MenuOption {Entry=1,Delete=2,Update=3,Find=4,Read=5,Save=6,Display=7,Statistics=8,Exit=0
};
main.cpp内容如下:
#include<iostream>
#include"StudentManager.h"
using namespace std;int main() {List list;bool isRunning=true;while (isRunning) {switch (menu()) {case Entry:list.addStudent();break;case Delete:list.deleteStudent();break;case Update:list.updateStudent();break;case Find:list.find();break;case Read:list.read();break;case Save:list.save();break;case Display:list.print();break;case Statistics:list.statistics();break;case Exit:isRunning=false;break;}system("pause");system("cls");}return 0;
}
结语
大家看完之后一定动手做一做,这个项目很容易的做的快的话其实半个几十分钟可以搞定的。

想看更多内容可以关注我,看我作品,关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家。

相关文章:
基础项目实战——学生管理系统(c++)
目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…...
春节期间,景区和酒店如何合理用工?
春节期间,景区和酒店如何合理用工? 春节期间,旅游市场将迎来高峰期。景区与酒店,作为旅游产业链中的两大核心环节,承载着无数游客的欢乐与期待。然而,也隐藏着用工管理的巨大挑战。如何合理安排人力资源&a…...
信息学奥赛一本通 1606:【 例 1】任务安排 1 | 洛谷 P2365 任务安排
【题目链接】 ybt 1606:【 例 1】任务安排 1 洛谷 P2365 任务安排 【题目考点】 1. 动态规划:线性动规 【解题思路】 可以先了解法1,虽然不是正解,但该解法只使用了动规的基本思路,易于理解,有助于理解…...
Linux Samba 低版本漏洞(远程控制)复现与剖析
目录 前言 漏洞介绍 漏洞原理 产生条件 漏洞影响 防御措施 复现过程 结语 前言 在网络安全的复杂生态中,系统漏洞的探索与防范始终是保障数字世界安全稳定运行的关键所在。Linux Samba 作为一款在网络共享服务领域应用极为广泛的软件,其低版本中…...
讯飞智作 AI 配音技术浅析(一)
一、核心技术 讯飞智作 AI 配音技术作为科大讯飞在人工智能领域的重要成果,融合了多项前沿技术,为用户提供了高质量的语音合成服务。其核心技术主要涵盖以下几个方面: 1. 深度学习与神经网络 讯飞智作 AI 配音技术以深度学习为核心驱动力&…...
Autogen_core 测试代码:test_types.py
目录 第一段代码:test_get_types第二段代码:test_handler第三段代码:test_nested_data_model总结 代码段是针对 autogen_core 的库的单元测试,主要关注类型检查和消息处理。让我们逐个解释每个代码段的功能: 第一段代…...
PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
以SQLite数据库为例,学习数据库的基本操作,使用QSql模块查询、编辑数据并在前端展示。 SQLite数据库的基础知识: https://blog.csdn.net/xulibo5828/category_12785993.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId1278…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南
1.27 线性代数王国:矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…...
初二回娘家
昨天下午在相亲相爱一家人群里聊天,今天来娘家拜年。 聊天结束后,开始准备今天的菜肴,梳理了一下,凉菜,热菜,碗菜。 上次做菜,粉丝感觉泡的不透,有的硬,这次使用开水浸泡…...
【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用
论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接:https://arxiv.org/pdf/2403.06258 代码链接:https://github.com/NUST-Mac…...
日志2025.1.30
日志2025.1.30 1.简略地做了一下交互系统 public class Interactable : MonoBehaviour { private MeshRenderer renderer; private Material defaultMaterial; public Material highlightMaterial; private void Awake() { renderer GetComponentInChildren<Me…...
PHP中的获取器和修改器:探索数据访问的新维度
在PHP开发中,操作数据是开发人员最常见的任务之一。为了使数据的访问和修改更加便捷和安全,PHP提供了获取器和修改器这两个强大的特性。本文将探索获取器和修改器的作用和用法,并且通过具体的代码示例来帮助读者更好地理解和应用这两个特性。…...
Blazor-@bind
数据绑定 带有 value属性的标记都可以使用bind 绑定,<div>、<span>等非输入标记,无法使用bind 指令的,默认绑定了 onchange 事件,onchange 事件是指在输入框中输入内容之后,当失去焦点时执行。 page &qu…...
Github 2025-01-29 C开源项目日报 Top10
根据Github Trendings的统计,今日(2025-01-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目1Assembly项目1Go项目1我的电视 - 安卓电视直播软件 创建周期:40 天开发语言:CStar数量:649 个Fork数量:124 次关注人数:64…...
01-时间与管理
时间与效率 一丶番茄时钟步骤好处 二丶86400s的财富利用时间的方法每天坚持写下一天计划 自我管理体系计划-行动-评价-回顾 一丶番茄时钟 一个计时器 一份任务清单,任务 步骤 每一个25分钟是一个番茄时钟 将工作时间划分为若干个25分钟的工作单元期间只专注于当前任务,遇到…...
架构技能(六):软件设计(下)
我们知道,软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章(见 《架构技能(五):软件设计(上)》)谈了软件的整体架构设计,今天聊一下模块的详细设计。 模…...
C++并发编程指南07
文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct,展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…...
MySQL 容器已经停止(但仍然存在),但希望重新启动它,并使它的 3306 端口映射到宿主机的 3306 端口是不可行的
重新启动容器并映射端口是不行的 由于你已经有一个名为 mysql-container 的 MySQL 容器,你可以使用 docker start 启动它。想要让3306 端口映射到宿主机是不行的,实际上,端口映射是在容器启动时指定的。你无法在容器已经创建的情况下直接修改…...
AI大模型开发原理篇-6:Seq2Seq编码器-解码器架构
基本概念 Seq2Seq架构的全名是“Sequence-to-Sequence”,简称S2S,意为将一个序列映射到另一个序列。q2Seq编码器-解码器架构,这也是Transformer的基础架构。Seq2Seq架构是一个用于处理输入序列和生成输出序列的神经网络模型,由一…...
春晚舞台上的人形机器人:科技与文化的奇妙融合
文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望:科技与文化的更多可能结语 2025 年央视春晚的舞台,无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上,一场名为《秧BOT》的创意融合…...
【Leetcode刷题记录】166. 分数到小数
166. 分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。 如果小数部分为循环小数,则将循环的部分括在括号内。 如果存在多个答案,只需返回 任意一个 。 对于所有给定的输入&…...
使用 Go 和 gqlgen 实现 GraphQL API:实战指南
使用 Go 和 gqlgen 实现 GraphQL API:实战指南 在本文中,我将分享如何使用 Go 语言和 gqlgen 框架实现一个完整的 GraphQL API。我们将构建一个包含用户、文章和评论功能的博客系统 API。 技术栈 Gogqlgen (GraphQL 框架)MySQL (数据存储)Redis (缓存…...
《程序人生》工作2年感悟
一些杂七杂八的感悟: 1.把事做好比什么都重要, 先树立量良好的形象,再横向发展。 2.职场就是人情世故,但也不要被人情世故绑架。 3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力…...
将pandas.core.series.Series类型的小数转化成百分数
大年初二,大家过年好,蛇年行大运! 今天在编写一个代码的时候,使用 import pandas as pd产生了pandas.core.series.Series类型的数据,里面有小数,样式如下: 目的:将这些小数转化为百…...
详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)
会将java当中的所有的知识点以及相关的题目进行分享,这是其中的第一部分,用红色字体标注出重点,以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(动态菜单组件实现)
目录 面对对象C的程序设计(范例) 面对对象C的程序设计(应用) 进一步谈论我上面给出的代码——继承 实现一个面对对象的文本编辑器 所以,什么是继承 重申我们对菜单的抽象 抽象菜单项目 抽象菜单动画 实现菜单功…...
Java的StackWalker类
Java的StackWalker类怎么使用 Java 中的 StackWalker 类(自 Java 9 引入)提供了一种高效且灵活的方式来访问堆栈跟踪信息。以下是其使用方法的逐步说明: 1. 基本使用:获取当前堆栈跟踪 import java.lang.StackWalker;public cla…...
农产品价格报告爬虫使用说明
农产品价格报告爬虫使用说明 # ************************************************************************** # * * # * 农产品价格报告爬虫 …...
Pwn 入门核心工具和命令大全
一、调试工具(GDB 及其插件) GDB 启动调试:gdb ./binary 运行程序:run 或 r 设置断点:break *0x地址 或 b 函数名 查看寄存器:info registers 查看内存:x/10wx 0x地址 (查看 10 个 …...
字节iOS面试经验分享:HTTP与网络编程
字节iOS面试经验分享:HTTP与网络编程 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 字节iOS面试经验分享:HTT…...
