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

结语

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

在这里插入图片描述

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

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

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

相关文章

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

[Linux]从零开始的STM32MP157 U-Boot移植

一、前言 在上一次教程中&#xff0c;我们了解了STM32MP157的启动流程与安全启动机制。我们还将FSBL的相关代码移植成功了。大家还记得FSBL的下一个步骤是什么吗&#xff1f;没错&#xff0c;就是SSBL&#xff0c;而且常见的我们将SSBL作为存放U-Boot的地方。所以本次教程&…

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

高速稳定,功能强大的免费下载工具!!

今天&#xff0c;我向你们介绍一款超强的下载器——破姐版本&#xff0c;它完全免费&#xff0c;支持高速下载&#xff0c;将彻底解决你的下载难题。 01 软件介绍 P2P下载器免费下载工具&#xff0c;它以高速稳定、功能强大、无广告的特点&#xff0c;为你提供卓越的下载体验…

C++:虚函数与多态性习题2

题目内容&#xff1a; 编写程序&#xff0c;声明抽象基类Shape&#xff0c;由它派生出3个派生类&#xff1a;Circle、Rectangle、Triangle&#xff0c;用虚函数分别计算图形面积&#xff0c;并求它们的和。要求用基类指针数组&#xff0c;使它每一个元素指向一个派生类对象。 …

C#,入门教程(10)——常量、变量与命名规则的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素&#xff0c;称为“变量”。 其中一般不改变初值的变量&#xff0c;称为常变量&#xff0c;简称“常量”。 无论…

list的使用,及部分功能的模拟实现(C++)

目录&#xff08;文章中"节点"和"结点"是同一个意思&#xff09; 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…

MySQL 索引

MySQL 索引 文章目录 MySQL 索引1. 索引概念2. 索引结构3. 索引分类4. 索引使用4.1 单列索引和联合索引4.2 覆盖索引4.3 前缀索引 5. SQL提示6. 索引失效情况 1. 索引概念 索引可以理解为MySQL中用来高效检索数据的数据结构&#xff0c;它是有序的&#xff0c;因为它底层使用的…

JVM方法区

一、栈、堆、方法区的交互关系 二、方法区的理解: 尽管所有的方法区在逻辑上属于堆的一部分&#xff0c;但是一些简单的实现可能不会去进行垃圾收集或者进行压缩&#xff0c;方法区可以看作是一块独立于Java堆的内存空间。 方法区(Method Area)与Java堆一样&#xff0c;是各个…

STM32 TIM定时器配置

TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff…

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 数据准备 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…

< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对

信息来源&#xff1a; 文件&#xff1a;/var/log/auth.log 因为在 sshd_config 配置文件中&#xff0c;已经定义 LogLevel INFO 部分内容&#xff1a; 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […

[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)

目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…

Python 梯度下降法(二):RMSProp Optimize

文章目录 Python 梯度下降法&#xff08;二&#xff09;&#xff1a;RMSProp Optimize一、数学原理1.1 介绍1.2 公式 二、代码实现2.1 函数代码2.2 总代码 三、代码优化3.1 存在问题3.2 收敛判断3.3 函数代码3.4 总代码 四、优缺点4.1 优点4.2 缺点 五、相关链接 Python 梯度下…

【2025年更新】1000个大数据/人工智能毕设选题推荐

文章目录 前言大数据/人工智能毕设选题&#xff1a;后记 前言 正值毕业季我看到很多同学都在为自己的毕业设计发愁 Maynor在网上搜集了1000个大数据的毕设选题&#xff0c;希望对大家有帮助&#xff5e; 适合大数据毕业设计的项目&#xff0c;完全可以作为本科生当前较新的毕…

three.js+WebGL踩坑经验合集(6.2):负缩放,负定矩阵和行列式的关系(3D版本)

本篇将紧接上篇的2D版本对3D版的负缩放矩阵进行解读。 (6.1):负缩放&#xff0c;负定矩阵和行列式的关系&#xff08;2D版本&#xff09; 既然three.js对3D版的负缩放也使用行列式进行判断&#xff0c;那么&#xff0c;2D版的结论用到3D上其实是没毛病的&#xff0c;THREE.Li…

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当…

软件工程经济学-日常作业+大作业

目录 一、作业1 作业内容 解答 二、作业2 作业内容 解答 三、作业3 作业内容 解答 四、大作业 作业内容 解答 1.建立层次结构模型 (1)目标层 (2)准则层 (3)方案层 2.构造判断矩阵 (1)准则层判断矩阵 (2)方案层判断矩阵 3.层次单排序及其一致性检验 代码 …

【回溯】目标和 字母大小全排列

文章目录 494. 目标和解题思路&#xff1a;回溯784. 字母大小写全排列解题思路&#xff1a;回溯 494. 目标和 494. 目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式…