基础项目实战——学生管理系统(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;
}

结语

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenEuler学习笔记(十七):OpenEuler搭建Redis高可用生产环境

在OpenEuler上搭建Redis高可用生产环境&#xff0c;通常可以采用Redis Sentinel或Redis Cluster两种方式&#xff0c;以下分别介绍两种方式的搭建步骤&#xff1a; 基于Redis Sentinel的高可用环境搭建 安装Redis 配置软件源&#xff1a;可以使用OpenEuler的默认软件源&#…

Python的那些事第六篇:从定义到应用,Python函数的奥秘

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 目录 一、函数的定义与调用 二、函数的参数 三、返回值&#xff08;return语句&#xff09; 四、作用域 五、匿名函数&#xff08;lambda表达式&#xff09; 六、总结 Python函数的奥秘&#xff1a;从定义到应用 编程…

vue3的路由配置

先找到Layout布局文件&#xff0c;从中找到左侧边栏&#xff0c;找到下述代码 <SidebarItem v-for"route in noHiddenRoutes" :key"route.path" :item"route" :base-path"route.path" />/** *菜单项 <SidebarItem>: *使用…

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…

Blazor-@bind

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

H264原始码流格式分析

1.H264码流结构组成 H.264裸码流&#xff08;Raw Bitstream&#xff09;数据主要由一系列的NALU&#xff08;网络抽象层单元&#xff09;组成。每个NALU包含一个NAL头和一个RBSP&#xff08;原始字节序列载荷&#xff09;。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…

Qt中QVariant的使用

1.使用QVariant实现不同类型数据的相加 方法&#xff1a;通过type函数返回数值的类型&#xff0c;然后通过setValue来构造一个QVariant类型的返回值。 函数&#xff1a; QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

C++,STL 简介:历史、组成、优势

文章目录 引言一、STL 的历史STL 的核心组成三、STL 的核心优势四、结语进一步学习资源&#xff1a; 引言 C 是一门强大且灵活的编程语言&#xff0c;但其真正的魅力之一在于其标准库——尤其是标准模板库&#xff08;Standard Template Library, STL&#xff09;。STL 提供了…

每日一题——序列化二叉树

序列化二叉树 BM39 序列化二叉树题目描述序列化反序列化 示例示例1示例2 解题思路序列化过程反序列化过程 代码实现代码说明复杂度分析总结 BM39 序列化二叉树 题目描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。二叉树的序列化是将二叉树按照某种遍历方式…

关于安卓greendao打包时报错问题修复

背景 项目在使用greendao的时候&#xff0c;debug安装没有问题&#xff0c;一到打包签名就报了。 环境 win10 jdk17 gradle8 项目依赖情况 博主的greendao是一个独立的module项目&#xff0c;项目目前只适配了java&#xff0c;不支持Kotlin。然后被外部集成。greendao版本…

Java实现.env文件读取敏感数据

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行&#xff0c;提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…

【AutoSar】汽车诊断标准协议UDS详解

目录 一、基本概念二、UDS诊断协议2.1 诊断服务的概念2.2常用的诊断服务2.2.1 诊断会话控制服务&#xff08;10服务&#xff09;2.2.2 会话访问0x27服务2.2.3 用于读写的DID的0x22/0x2E服务 一、基本概念 车辆的诊断需要有Tester端和ECU段通过应答的方式进行通信&#xff0c;他…

Java线程认识和Object的一些方法

本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchronized和锁的认识。利用Synchronized wait/notify 完成一道经典的多线程题目&#xff1a;实现ABC…

【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途

希腊字母&#xff08;Greek Letters&#xff09; 希腊字母在数学、科学、工程学和编程中广泛使用&#xff0c;常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称&#xff08;英文&#xff09;名称&#xff08;…

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…

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

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

hive:基本数据类型,关于表和列语法

基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…

Elasticsearch的开发工具(Dev Tools)

目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具&#xff08;Dev Tools&#xff09;在Kibana中提供了多种功能强大的工具&#xff0c;用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期&#xff1a;2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题&#xff1a;请看上图&#xff0c;我们想要实现的效果是控件黄色的Widge&#xff08;m_infobarWidget&#xff09;t随着可视化窗口&#xff08;m_glWidge…

【Unity3D】实现横版2D游戏——攀爬绳索(简易版)

目录 GeneRope.cs 场景绳索生成类 HeroColliderController.cs 控制角色与单向平台是否忽略碰撞 HeroClampController.cs 控制角色攀爬 OnTriggerEnter2D方法 OnTriggerStay2D方法 OnTriggerExit2D方法 Update方法 开始攀爬 结束攀爬 Sensor_HeroKnight.cs 角色触发器…