基础项目实战——学生管理系统(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.mzph.cn/news/894189.shtml

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

相关文章

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

matlab提取滚动轴承故障特征

为了精准、稳定地提取滚动轴承故障特征&#xff0c;提出了基于变分模态分解和奇异值分解的特征提取方法&#xff0c;采用标准模糊C均值聚类(fuzzy C means clustering, FCM)进行故障识 别。对同一负荷下的已知故障信号进行变分模态分解&#xff0c;利用 奇异值分解技术进一步提…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中&#xff0c;我们阐述了模拟-数字转换器&#xff08;ADC&#xff09;的分辨率和精度之间的区别。现在&#xff0c;我们可以深入探讨影响ADC总精度的因素&#xff0c;这通常被称为总未调整误差&#xff08;TUE&#xff09;。 你是否曾好奇ADC数据表…

记录一次Sqoop从MySQL导入数据到Hive问题的排查经过

个人博客地址:记录一次Sqoop从MySQL导入数据到Hive问题的排查经过 | 一张假钞的真实世界 问题描述 MySQL中原始数据有790W+的记录数,在Sqoop抽取作业成功的情况下在Hive中只有500W左右的记录数。 排查过程 数据导入脚本Log 通过Log可以发现以下信息: 该Sqoop任务被分解…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…

CF 764B.Timofey and cubes(Java实现)

题目分析 输入n个数字&#xff0c;首尾交换&#xff0c;奇数对换&#xff0c;偶数对不换 思路分析 存入数组&#xff0c;遍历时判断i%20时(数组下标0开始&#xff0c;所以题目分析没有错)&#xff0c;对换 代码 import java.util.*;public class Main {public static void ma…

Xposed-Hook

配置 Xposed 模块的 AndroidManifest.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"your.package.name"><applicationandr…

9【如何面对他人学习和生活中的刁难】

我们在学习的过程中&#xff0c;会遇到很多来自于他人的刁难与嘲讽&#xff0c;如果处理不好&#xff0c;这会大大影响我们的心情&#xff0c;从而影响学习的效率 我建议&#xff0c;如果你学习或生活中也遇到了类似的问题&#xff0c;不要去生气&#xff0c;更不要发生冲突&a…

Transformer+vit原理分析

目录 一、Transformer的核心思想 1. 自注意力机制&#xff08;Self-Attention&#xff09; 2. 多头注意力&#xff08;Multi-Head Attention&#xff09; 二、Transformer的架构 1. 整体结构 2. 编码器层&#xff08;Encoder Layer&#xff09; 3. 解码器层&#xff08;Decoder…

@Inject @Qualifier @Named

Inject Qualifier Named 在依赖注入&#xff08;DI&#xff09;中&#xff0c;Inject、Qualifier 和 Named 是用于管理对象创建和绑定的关键注解。以下是它们的用途、依赖配置和代码示例的详细说明&#xff1a; 1. 注解的作用 Inject&#xff1a;标记需要注入的构造函数、字段…

WPS mathtype间距太大、显示不全、公式一键改格式/大小

1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式&#xff1a; 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…

C# 添加、替换、提取、或删除Excel中的图片

在Excel中插入与数据相关的图片&#xff0c;能将关键数据或信息以更直观的方式呈现出来&#xff0c;使文档更加美观。此外&#xff0c;对于已有图片&#xff0c;你有事可能需要更新图片以确保信息的准确性&#xff0c;或者将Excel 中的图片单独保存&#xff0c;用于资料归档、备…

Python练习(2)

今日题单 吃鱼还是吃肉 PTA | 程序设计类实验辅助教学平台 降价提醒机器人PTA | 程序设计类实验辅助教学平台 幸运彩票 PTA | 程序设计类实验辅助教学平台 猜帽子游戏 PTA | 程序设计类实验辅助教学平台 谁管谁叫爹 PTA | 程序设计类实验辅助教学平台 就不告诉你 PTA | 程…

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…

Formality:黑盒(black box)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 简介 在使用Formality时&#xff0c;黑盒(black box)的概念很重要&#xff0c;指的是一个其功能未知的设计。黑盒通常用于设计中不可综合的组件&#xff0c;包括RAM…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要&#xff1a;随着互联网技术的快速发展和社交媒体的普及&#xff0c;用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理&#xff0c;通过开源21链动模式AI智能名片S2B2C商城小程序&#xff08;以下简称“小程序”&#xff09;促进用户分享行…

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…

Synology 群辉NAS安装(6)安装mssql

Synology 群辉NAS安装&#xff08;6&#xff09;安装mssql 写在前面mssql 2019:成功安装说明&#xff0c;这个最终成功了 mssql 2022没有成功1. pull image2.启动mssql docker container 远程连接 写在前面 mssq是一个重要节点。 这是因为我对mysql没有一丝好感。虽然接触了许…

mysql_init和mysql_real_connect的形象化认识

解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体&#xff0c;为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息&#xff0c;是 MySQL C API 的核心句柄。 示例&#xff1a; MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…

qt-QtQuick笔记之常见项目类简要介绍

qt-QtQuick笔记之常见项目类简要介绍 code review! 文章目录 qt-QtQuick笔记之常见项目类简要介绍1.QQuickItem2.QQuickRectangle3.QQuickImage4.QQuickText5.QQuickBorderImage6.QQuickTextInput7.QQuickButton8.QQuickSwitch9.QQuickListView10.QQuickGridView11.QQuickPopu…