第一章系统概述
宿舍管理查询软件是一个教育单位不可缺少的部分它的内容对于学校的决策者和管理者来说都至关重要所以宿舍管理查询软件应该能够为用户提供充足的信息和快捷的查询手段。以前各个学校的学生宿舍管理基本上都是靠手工进行,但随着各个学校的规模增大,有关学生宿舍管理工作所涉及的数据量也越来越大,有的学校不得不靠增加人力、物力来进行学生宿舍管理。这种管理方式存在着许多缺点,如:效率低、保密性差等,另外其所用时间长,产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。如今学校的学生越来越多,宿舍管理的工作量越来越大,手工管理宿舍信息的弊端也越来越明显。作为计算机应用的一部分,使用计算机对学生档案信息进行管理具有手工管理所无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等,能够极大地提高学生档案管理的效率。所以我想借本次课程设计之际,设计一个简易的宿舍管理查询软件。
第二章 宿舍管理系统需求分析
2.1系统的功能需求
在管理系统中最重要的是其功能部分。它之所以被设计出来,是为了满足特定人群的需要,是该项目完成实现的重要前提。该项目是针对宿舍信息管理的需求设计的,下面是本文设计系统的主要功能需求。
首先进去系统,会有一个输入系统口令的判定环节,用户在输入正确口令之后才可以进入系统执行系统中的基本操作,输入口令错误5次之后会报错并退出系统。系统包含的操作有新建宿舍名单,排序宿舍信息,查询宿舍信息,插入宿舍信息,删除宿舍信息(根据学号)以及退出。
系统总体框架
各个模板的功能需求如下:
输入学生信息:输入学生的学号、姓名、房间号等各项基本信息,并能录入文件中存档。
查询学生信息:采用二分查找方法对学生信息进行查找,能按学号、姓名,房间号等各项信息分别查找学生的完整记录信息。
插入学生信息:能根据学号的信息,将学生信息插入。
删除学生信息:能删除指定学号的学生信息。
打印学生信息:能够打印存储在数据库中的所有学生宿舍信息。
排序学生信息:采用冒泡、选择和折半插入排序对学生信息进行排序。
2.2 系统可行性分析
系统的的可行性分析就是在系统开始实现之前,对系统进行相关资料的调查,比如说该系统的发展前景是怎样的,该系统在国内外的研究状况等等。通过分析这些资料,从而来判断该系统是否具有研究和开发的意义。如果经过分析判断该应用系统是必须的,有很大的使用价值;那么我们接下了就要考虑开发时需要注意地方,比如开发的成本如何,开发的支持技术的选择等等方面来对系统进行一个全面的剖析和洞察。这样做的目的是为了,减少开发风险,避免大量的资源浪费。项目开发的主要目的是为了再满足各项需求的情况下用最少的资源来获得利益的最大化。
2.2.1技术可行性分析
该项目在编写过程中在vs的应用平台上使用c++进行编写,通过调用<iostream>,<string>,<stdlib.h>,<fstream>,<windows.h>,<vector>,<limits>等头文件来实现功能,功能操作依赖于通过定义结构体再通过容器vector来存放学生信息表的基础上完成,,同时项目还写入了文件作为数据库,来保证项目的运行可能性
2.2.2经济可行性分析
宿舍管理系统实现的经济可行性主要体现在系统的开发京付费和使用系统所带来的经济效益两方面。传统的宿舍管理主要依靠人力,儿如果同时来登记或者查询的人数过多的话,就会需要大量的人力,不然就容易造成拥挤,而如果宿舍利用宿舍管理系统怎可以大大降低对人力的需求,而且在一定程度上可以提升工作效率,所以本文设计的宿舍管理系统在经济方面是可行的
2.2.3操作可行性分析
本文设计的宿舍管理系统不仅在信息的管理方面能提供了很大的帮助,而且对用户也非常友好,运行界面对于相关的操作都有着相应的解释,便于使用,因此,该系统的操作是可行的。
第三章 系统分析设计
3.1系统的数据设计
User类
3.2系统逻辑设计
3.3各功能模块的算法处理流程图及相关说明
排序宿舍信息
查询宿舍信息
插入宿舍信息
删除宿舍信息
3.4详细代码
输入学生信息
排序宿舍信息
查询宿舍信息
插入宿舍信息
第四章系统测试与演示部分
初始信息界面
输入正确口令后会进入选择菜单,否则则会报“密码错误”,在五次密码输入错误之后会退出界面
成功进入界面后可进行具体的操作
选择1 可进行录入信息
选择2 可进行排序信息
可选择按名字 按学号 按房间号这三种方式进行排序
选择3 查询宿舍信息
可选择按名字 按学号 按房间号这三种方式进行查询
选择4 插入宿舍信息
按学号进行插入
通过插入数据后再次排序之后再次输出
选择5 删除宿舍信息
本功能为按学号进行删除
选择0 退出程序
读入文件
检验文件是否存在
写入文件
在以上所有功能中对于输入错误的数值时都进行了相应的debug,使得在运行时输入错误的数值时会报出相应的提示,并可对其进行重新输入与读值,以此来确保程序的平稳进行,而不是直接的报错
第五章源代码
#include<iostream>
#include<string>
#include<stdlib.h>
#include<fstream>
#define NOMINMAX//限定头文件#include<Window.h>中的宏定义min 和 max
#include"windows.h"
#include<vector>
#include<limits>
using namespace std;
int choice;
typedef struct student {
int id;
string name;
int room;
};
vector<student>student_list;//运用vector容器存储学生信息表
void Hello() {
cout << "**************************" << endl;
cout << "** 欢迎进入宿舍管理系统 **" << endl;
cout << "* 1、新建宿舍名单 *" << endl;
cout << "* 2、排序宿舍信息 *" << endl;
cout << "* 3、查询宿舍信息 *" << endl;
cout << "* 4、插入宿舍信息 *" << endl;
cout << "* 5、删除宿舍信息 *" << endl;
cout << "* 0、退出系统 *" << endl;
cout << "**************************" << endl;
cout << "请输入菜单(0-5):";
while (true) {
cin >> choice;
if (choice < 0 || choice>5 || cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入数字不对,请重新输入!" << endl;
}
else
break;
}
}
void Menu() {
int n = 5;
const char* b = "lzrlxx";
cout << "**************************" << endl;
cout << "** 宿舍管理系统 **" << endl;
cout << "* 设计者:xxx *" << endl;
cout << "* 指导老师:xxx *" << endl;
cout << "* 专业:xxxx *" << endl;
cout << "* 20xx年x月x日 *" << endl;
cout << "请输入系统口令(lzrlxx):";
string c;
for (int i = 0; i <= 5 && strcmp(b, c.c_str()) != 0; ++i) {
if (i ==0) {
cin >> c;
}
else if(i<n){
cout << "密码错误!您已经输入了" << i << "剩余" << n - i << "次" << endl;
cout << "请重新输入:";
cin >> c;
}
else {
cout << "密码已经错误了" << i << "次,自动退出程序";
choice = 0;
exit(0);
}
}
system("cls");
Hello();
}
void create() {
student stud;
char ch = 'y';
cout << "*******开始创建学生信息*******" << endl;
while (ch == 'y') {
// 输入姓名
while (true) {
cout << "请输入姓名:";
cin >> stud.name;
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "输入错误,请重新输入姓名" << endl;
}
else {
cin.ignore(); // 忽略剩余输入
break;
}
}
// 输入学号
while (true) {
cout << "请输入学号:";
cin >> stud.id;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入学号" << endl;
}
else {
cin.ignore(); // 忽略剩余输入
break;
}
}
// 输入房号
while (true) {
cout << "请输入房号:";
cin >> stud.room;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入房号" << endl;
}
else {
cin.ignore(); // 忽略剩余输入
break;
}
}
student_list.push_back(stud);
cout << "是否继续输入?<y/n>:";
cin >> ch;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
cout << endl;
}
}
void ret() {
string d;
cout << "请填写任意字符进入主界面:";
cin >> d;
system("cls");
}
void display() {
cout<< "姓名 学号 房号" << endl;
for (const auto& student : student_list) {
cout << student.name << " " << student.id << " " << student.room << endl;
}
}
//冒泡排序(按姓名排序)按字母序号从小到大排
void sort1() {
for (int i = 0; i < student_list.size() - 1; i++) {
for (int j = 0; j < student_list.size() - 1-i; j++) {
if (strcmp(student_list[j].name.c_str(), student_list[j + 1].name.c_str()) > 0) {
swap(student_list[j], student_list[j + 1]);
}
}
}
}
//折半插入排序(按学号排序)从小到大
void sort2() {
int j, mid, low, high;
student temp;
for (int i = 1; i < student_list.size(); i++) {
temp = student_list[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (temp.id < student_list[mid].id)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >=low; j--)
student_list[j + 1] = student_list[j];
student_list[low] = temp;
}
}
//按房间号排序(简单选择排序)
void sort3() {
int k;
student stud;
for (int i = 0; i < student_list.size() - 1; i++) {
k = i;
for (int j = i + 1; j < student_list.size(); j++) {
if (student_list[j].room < student_list[k].room)
k = j;
if (k != i) {
swap(stud, student_list[i]);
swap(student_list[i], student_list[k]);
swap(student_list[k], stud);
}
}
}
}
void sort() {
int c, d;
cout << "请输入排序的方式(1:按名字排序 2:按学号排序 3:按房间号排序):";
if (student_list.empty()) {
system("cls");
cout << "无学生记录,请先创建数据" << endl;
cout << "继续存入数据请输入1,退出程序请输入0:";
cin >> d;
if (cin.fail() || (d != 0 && d != 1)) { // 检查输入是否有效
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "输入错误,请重新输入" << endl;
return;
}
if (d == 1) {
create();
}
else if (d == 0) {
exit(0);
}
}
system("cls");
cout << "请输入排序方式(1、按名字排序 2、按学号排序 3、按房间号排序):";
cin >> c;
if (cin.fail() || c < 1 || c > 3) { // 检查输入是否有效
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "输入错误,请重新输入" << endl;
sort(); // 递归调用
return;
}
switch (c) {
case 1:
sort1();
cout << "按名字排序:" << endl;
break;
case 2:
sort2();
cout << "按学号排序:" << endl;
break;
case 3:
sort3();
cout << "按房间号排序:" << endl;
break;
}
display();
ret();
Hello();
}
int select() {
char ch;
while (true) {
cout << "是否继续查找?<y/n>:";
cin >> ch;
if (ch == 'y' || ch == 'Y') {
return 1;
}
else if (ch == 'n' || ch == 'N') {
return 0;
}
else {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "输入错误,请重新输入" << endl;
}
}
}
void search1(){
if (student_list.empty()) {
cout << "无学生记录" << endl;
ret();
Hello();
}
else {
int low = 0, high = student_list.size(), mid, flag = 0;
cout << "按姓名查找-->请输入要查找的姓名:";
string x;
cin >> x;
while (low <= high) {
mid = (low + high) / 2;
if (strcmp(x.c_str(), student_list[mid].name.c_str()) == 0) {
flag = 1;
break;
}
else if (strcmp(x.c_str(), student_list[mid].name.c_str()) > 0) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
if (flag == 1) {
cout << "查找成功-->该学生信息为:" << endl;
cout<< "姓名 学号 房号" << endl;
cout << "姓名:" << student_list[mid].name << endl;
cout << "学号:" << student_list[mid].id << endl;
cout << "房间号:" << student_list[mid].room << endl;
if (select())
search1();
else {
system("cls");
Hello();
}
}
else if (flag == 0) {
cout << "该学生不存在!" << endl;
if (select())
search1();
else {
system("cls");
Hello();
}
}
}
}
void search2() {
if (student_list.empty()) {
cout << "无学生记录" << endl;
ret();
Hello();
}
else {
int low = 0, high = student_list.size()-1, mid, flag = 0;
cout << "按学号查找-->请输入要查找的学号:";
int x;
cin >> x;
while (low <= high) {
mid = (low + high) / 2;
if (x==student_list[mid].id) {
flag = 1;
break;
}
else if (x>student_list[mid].id) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
if (flag == 1) {
cout << "查找成功-->该学生信息为:" << endl;
cout << "姓名 学号 房号" << endl;
cout << "姓名:" << student_list[mid].name << endl;
cout << "学号:" << student_list[mid].id << endl;
cout << "房间号:" << student_list[mid].room << endl;
if (select())
search2();
else {
system("cls");
Hello();
}
}
else if (flag == 0) {
cout << "该学生不存在!" << endl;
if (select())
search2();
else {
system("cls");
Hello();
}
}
}
}
void search3() {
if (student_list.empty()) {
cout << "无学生记录" << endl;
ret();
Hello();
}
else {
int low = 0, high = student_list.size(), mid, flag = 0;
cout << "按房间号查找-->请输入要查找的房间号:";
int x;
cin >> x;
while (low <= high) {
mid = (low + high) / 2;
if (x == student_list[mid].room) {
flag = 1;
break;
}
else if (x > student_list[mid].room) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
if (flag == 1) {
cout << "查找成功-->该学生信息为:" << endl;
cout << "姓名 学号 房号" << endl;
cout << "姓名:" << student_list[mid].name << endl;
cout << "学号:" << student_list[mid].id << endl;
cout << "房间号:" << student_list[mid].room << endl;
if (select())
search3();
else {
system("cls");
Hello();
}
}
else if (flag == 0) {
cout << "该学生不存在!" << endl;
if (select())
search3();
else {
system("cls");
Hello();
}
}
}
}
//查找函数
void search() {
int c;
cout<<"请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):";
cin >> c;
if (cin.fail() || c < 1 || c > 3) { // 检查输入是否有效
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
system("cls");
cout << "输入错误,请重新输入" << endl;
search(); // 递归调用
return;
}
switch (c) {
case 1:
sort1();
search1();
break;//先进行二分查找排序
case 2:
sort2();
search2();
break;
case 3:
sort3();
search3();
break;
default:
break;
}
}
//按学号插入
void Insert() {
student stud;
int i, j, k;
char ch;
cout << "插入学生信息为:" << endl;
while (true) {
cout << "姓名:";
cin >> stud.name;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入姓名" << endl;
}
else {
break;
}
}
while (true) {
cout << "学号:";
cin >> stud.id;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入学号" << endl;
}
else {
break;
}
}
while (true) {
cout << "房号:";
cin >> stud.room;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入房号" << endl;
}
else {
break;
}
}
if (student_list.empty()) {
student_list.push_back(stud);
}
for (i = 0; i < student_list.size(); i++) {
if (stud.id < student_list[i].id) {
student_list.insert(student_list.begin() + i, stud);
break;
}
else
student_list.push_back(stud);
break;
}
cout << endl;
while (true) {
cout << "是否继续插入?<y/n>:";
cin >> ch;
if (ch == 'y') {
Insert();
}
else if(ch == 'n') {
break;
}
else {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
cout << "输入错误,请重新输入" << endl;
}
}
}
void Delete() {
student stud;
int i;
char ch;
cout << ("请输入要删除的学生的学号:");
while (true) {
cin >> stud.id;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入" << endl;
}
else
break;
}
for (i = 0; i < student_list.size(); i++) {
if (stud.id == student_list[i].id) {
cout << ("该学生的信息为:") << endl;
cout << "姓名:" << student_list[i].name << endl;
cout << "学号:" << student_list[i].id << endl;
cout << "房号:" << student_list[i].room << endl;
student_list.erase(student_list.begin() + i);
cout << "已成功删除" << endl;
break;
}
}
if (i >= student_list.size())
cout << "该学生不存在" << endl;
while (true) {
cout << "是否继续删除?<y/n>:";
cin >> ch;
if (ch == 'y') {
Delete();
}
else if(ch == 'n') {
break;
}
else {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
cout << "输入错误,请重新输入" << endl;
}
}
}
bool isFileExists_ifstream(string& name) {
ifstream f(name.c_str());
return f.good();
}
void ReadFile() {
student stud;
string filename = "student.txt";
if (isFileExists_ifstream(filename)){
fstream ffs1("student.txt", ofstream::in);
string name;
int id, room;
while (ffs1 >> id && ffs1 >> name && ffs1 >> room) {
stud.id = id;
stud.name = name;
stud.room = room;
student_list.push_back(stud);
}
ffs1.close();
Menu();
}
else {
ofstream ffs1(filename);
if (ffs1.is_open()) {
cout << "文件创建成功" << filename << endl;
ffs1.close();
Menu();
}
else {
cout << "文件创建失败" << filename << endl;
exit(0);
}
}
}
void SaveFile() {
fstream ffs1("student.txt", ofstream::out);
if (ffs1.is_open()) {
for (int i = 0; i < student_list.size(); ++i) {
ffs1 << student_list[i].id << " " << student_list[i].name << " " << student_list [i] .room << std::endl;
}
ffs1.close();
}
}
int main() {
ReadFile();
while (choice != 0) {
system("cls");
switch (choice) {
case 1:
create();//调用线性表创建函数
system("cls");
Hello();
break;
case 2:
sort();
break;
case 3:
search();
break;
case 4:
Insert();
sort2;
cout << "插入后学生信息:" << endl;
display();
ret();
Hello();
break;
case 5:
Delete();
if (student_list.empty()) {
cout << endl;
cout << "学生记录已被删除完!" << endl;
ret();
Hello();
}
else {
cout << "显示删除后的学生信息" << endl;
display();
ret();
Hello();
}
break;
}
SaveFile();
}
}
标签:课程设计,cout,list,cin,信息,宿舍,源码,student,详细分析
From: https://blog.csdn.net/m0_72116042/article/details/142261718