基础项目实战——学生管理系统(c++)

news2025/2/1 3:00:52

目录

  • 前言
  • 一、功能菜单界面
  • 二、类与结构体的实现
  • 三、录入学生信息
  • 四、删除学生信息
  • 五、更改学生信息
  • 六、查找学生信息
  • 七、统计学生人数
  • 八、保存学生信息
  • 九、读取学生信息
  • 十、打印所有学生信息
  • 十一、退出系统
  • 十二、文件拆分
  • 结语

前言

这一期我们来一起学习我们在大学做过的课程设计——学生管理系统,这是一个非常简单且非常值得像我这样的新手独立完成的一个基础项目,用到基础数据结构里的链表来实现,所以指针和链表不太理解的同学先去理解,这样做这个项目会比较顺畅。
在这里插入图片描述

一、功能菜单界面

进入到该系统我们就可以选择我们想要的操作,为了方便我们能准确的知道哪个数字是实现什么操作,我们将其一直显示在运行窗口。

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;
}

结语

大家看完之后一定动手做一做,这个项目很容易的做的快的话其实半个几十分钟可以搞定的。

在这里插入图片描述

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

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

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

相关文章

春节期间,景区和酒店如何合理用工?

春节期间&#xff0c;景区和酒店如何合理用工&#xff1f; 春节期间&#xff0c;旅游市场将迎来高峰期。景区与酒店&#xff0c;作为旅游产业链中的两大核心环节&#xff0c;承载着无数游客的欢乐与期待。然而&#xff0c;也隐藏着用工管理的巨大挑战。如何合理安排人力资源&a…

Linux Samba 低版本漏洞(远程控制)复现与剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 漏洞影响 防御措施 复现过程 结语 前言 在网络安全的复杂生态中&#xff0c;系统漏洞的探索与防范始终是保障数字世界安全稳定运行的关键所在。Linux Samba 作为一款在网络共享服务领域应用极为广泛的软件&#xff0c;其低版本中…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国&#xff1a;矩阵分解实战指南 #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…

初二回娘家

昨天下午在相亲相爱一家人群里聊天&#xff0c;今天来娘家拜年。 聊天结束后&#xff0c;开始准备今天的菜肴&#xff0c;梳理了一下&#xff0c;凉菜&#xff0c;热菜&#xff0c;碗菜。 上次做菜&#xff0c;粉丝感觉泡的不透&#xff0c;有的硬&#xff0c;这次使用开水浸泡…

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用

论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接&#xff1a;https://arxiv.org/pdf/2403.06258 代码链接&#xff1a;https://github.com/NUST-Mac…

Blazor-@bind

数据绑定 带有 value属性的标记都可以使用bind 绑定&#xff0c;<div>、<span>等非输入标记&#xff0c;无法使用bind 指令的&#xff0c;默认绑定了 onchange 事件&#xff0c;onchange 事件是指在输入框中输入内容之后&#xff0c;当失去焦点时执行。 page &qu…

架构技能(六):软件设计(下)

我们知道&#xff0c;软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章&#xff08;见 《架构技能&#xff08;五&#xff09;&#xff1a;软件设计&#xff08;上&#xff09;》&#xff09;谈了软件的整体架构设计&#xff0c;今天聊一下模块的详细设计。 模…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

MySQL 容器已经停止(但仍然存在),但希望重新启动它,并使它的 3306 端口映射到宿主机的 3306 端口是不可行的

重新启动容器并映射端口是不行的 由于你已经有一个名为 mysql-container 的 MySQL 容器&#xff0c;你可以使用 docker start 启动它。想要让3306 端口映射到宿主机是不行的&#xff0c;实际上&#xff0c;端口映射是在容器启动时指定的。你无法在容器已经创建的情况下直接修改…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…

将pandas.core.series.Series类型的小数转化成百分数

大年初二&#xff0c;大家过年好&#xff0c;蛇年行大运&#xff01; 今天在编写一个代码的时候&#xff0c;使用 import pandas as pd产生了pandas.core.series.Series类型的数据&#xff0c;里面有小数&#xff0c;样式如下&#xff1a; 目的&#xff1a;将这些小数转化为百…

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享&#xff0c;这是其中的第一部分&#xff0c;用红色字体标注出重点&#xff0c;以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…

代码随想录_栈与队列

栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…

【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅

1.论文链接&#xff1a;Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要&#xff1a; 本章对概率图模型&#xff08;PGMs&#xff09;的最新进展进行了深入的回顾&…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址&#xff0c;在IDEA中查找 这里是getInfo函数的声明&#xff0c;我们要找到这个函数的使用&#xff0c;所以点getInfo() Override public JSONObject getInfo() {JSO…

Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…