C+±-----利用顺序存储结构实现学生健康管理系统
问题描述:
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文本读取、写入文件和查询、屏幕输出等功能)。健康表中学生的信息有学号、姓名、出生日期、性别、身体状况。
实验内容
头文件
#pragma once
#include<iostream>
#include<string.h>
#include<fstream>>
using namespace std;
#define MAXSIZE 100
struct Student {
string number; //学号
string name; //姓名
string birthDay; //出生日期
string sex; //性别
string PC; //身体状况
};
template<class T>
class SeqList {
public:
T* elem; //顺序表的数据
int length; //顺序表的长度
SeqList(int sz); //构造函数
int Length()const; //计算表的长度
int ListInser_Sq(int i, T& x); // 实现向学生健康表中插入学生信息 的功能
int ListDelete_Sq(int i); //在健康表中删除学生信息
void CreateTable(int x); //实现新建学生健康表
int SearchElem(string na, int x); //在健康表中查询学生信息
void DisplayInfo(int x); //实现在屏幕中输出全部学生信息
void save_to_file(int x); //实现向文本中写入学生健康表信息
void get_from_file(int x); //实现向文本中读入学生健康表信息
};
void menu()
{
cout << "-----------------------欢迎进入学生健康管理系统----------------" << 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 << "---------------------------------------------------------------" << endl;
}
//构造函数
template<class T>
SeqList<T>::SeqList(int sz)
{
if (sz > 0)
{
length = sz;
elem = new T[MAXSIZE];
if (elem == NULL)
{
cerr << "存储分配失败!" << endl;
exit(1);
}
}
}
template<class T>
int SeqList<T>::Length()const {
return length;
}
// 实现向学生健康表中插入学生信息 的功能
template<class T>
int SeqList<T>::ListInser_Sq(int i, T& e)
{
if (i<1 || i>length + 1) return 0;
if (length == MAXSIZE) return 0;
for (int j = length - 1; j >= i - 1; j--)
{
elem[j + 1] = elem[j]; //位置i之后的每个元素都往后移动一位
}
elem[i - 1] = e;
length++; //插入后顺序表的长度要增加一位
return 1;
}
//实现新建学生健康表
template<class T>
void SeqList<T>::CreateTable(int x)
{
cout << "请输入相关的信息" << endl;
for (int i = 0; i < x; i++)
{
cout << "学号:";
cin >> elem[i].number;
cout << "姓名:";
cin >> elem[i].name;
cout << "出生日期:";
cin >> elem[i].birthDay;
cout << "性别:";
cin >> elem[i].sex;
cout << "身体状况:";
cin >> elem[i].PC;
cout << "--------------" << endl;
}
return;
}
//在健康表中删除学生信息
template<class T>
int SeqList<T>::ListDelete_Sq(int i)
{
if (i<1 || i>length) return 0;
for (int j = i; j <= length - 1; j++)
{
elem[j - 1] = elem[j]; //删除位置i的元素后,要将i位置后的元素通通向前移动一位
}
length--;
return 1;
}
//在健康表中查询学生信息
template<class T>
int SeqList<T>::SearchElem(string num, int x)
{
int ans;
for (int i = 0; i < x; i++)
{
if (elem[i].number == num)
{
//flag=1;
ans = i;
break;
}
}
return ans;
}
//实现在屏幕中输出全部学生信息
template<class T>
void SeqList<T>::DisplayInfo(int x)
{
for (int i = 0; i < x; i++) {
cout << "学号:" << elem[i].number << endl;
cout << "姓名:" << elem[i].name << endl;
cout << "出生日期:" << elem[i].birthDay << endl;
cout << "性别:" << elem[i].sex << endl;
cout << "身体状况:" << elem[i].PC << endl;
cout << "--------------------------" << endl;
}
}
//实现向文本中写入学生健康表信息
template<class T>
void SeqList<T>::save_to_file(int x)
{
ofstream ofs;
ofs.open("f1.dat");
if (!ofs)
{
cout << "open f1.dat error!" << endl;
exit(1);
}
for (int i = 0; i < x; i++)
{
ofs << "学号:" << elem[i].number << endl;;
ofs << "姓名:" << elem[i].name << endl;;
ofs << "出生日期:" << elem[i].birthDay << endl;
ofs << "性别:" << elem[i].sex << endl;
ofs << "身体状况:" << elem[i].PC << endl;
ofs << "--------------------" << endl;
}
ofs.close();
}
//实现向文本中读入学生健康表信息
template<class T>
void SeqList<T>::get_from_file(int x)
{
ifstream ifs;
ifs.open("f1.dat");
if (!ifs)
{
cerr << "open f1.dat error!" << endl;
exit(1);
}
ofstream ofs("f1.dat");
if (!ofs)
{
cerr << "open f1.dat error!" << endl;
exit(1);
}
for (int i = 0; i < x; i++)
{
ifs >> elem[i].number;
cout << "学号:" << elem[i].number << endl;
ifs >> elem[i].name;
cout << "姓名:" << elem[i].name << endl;
ifs >> elem[i].birthDay;
cout << "出生日期:" << elem[i].birthDay << endl;
ifs >> elem[i].sex;
cout << "性别:" << elem[i].sex << endl;
ifs >> elem[i].PC;
cout << "身体状况:" << elem[i].PC << endl;
cout << "--------------------" << endl;
}
ofs.close();
ifs.close();
}
主函数
#include"Student.h"
#include<iostream>
using namespace std;
int main()
{
SeqList<Student>stu(20); //创建一个存储学生健康信息的顺序表,长度为20
Student e, s;
//SqList L;
int select; //select表示用户选择的操作
int x = 0;//x表示顺序表中已存在的学生人数
int temp; //用于记录将要查询的学生在顺序表中的位置
int num; //在顺序表中插入、删除的位置
while (1)
{
menu();
cout << "请输入您的选择:" << endl;
cin >> select;
switch (select)
{
case 1:
cout << "请输入你要新建的学生数量" << endl;
cin >> x;
cout << "--------------" << endl;
cout << endl;
stu.CreateTable(x);
/*for(int i=0;i<x;i++)
{
CreateTable(&L);
}*/
break;
case 2:
cout << "请输入要插入的学生的插入位置" << endl;
cin >> num;
cout << "请输入学号:";
cin >> s.number;
cout << "请输入姓名:";
cin >> s.name;
cout << "请输入出生日期:";
cin >> s.birthDay;
cout << "请输入性别:";
cin >> s.sex;
cout << "请输入身体状况:";
cin >> s.PC;
if (stu.ListInser_Sq(num, s))
{
x++;
//L.length++;
cout << "操作成功" << endl;
}
else
{
cout << "操作失败" << endl;
}
break;
case 3:
cout << "请输入您想要删除的学生的位置" << endl;
cin >> num;
if (stu.ListDelete_Sq(num))
{
x--;
cout << "操作成功" << endl;
}
else
{
cout << "操作失败" << endl;
}
//L.length--;
break;
case 4:
stu.get_from_file(x);
break;
case 5:
stu.save_to_file(x);
break;
case 6:
cout << "请输入你要查询的学生的学号:" << endl;
cin >> e.number;
temp = stu.SearchElem(e.number, x);
cout << "学号:" << stu.elem[temp].number << endl;;
cout << "姓名:" << stu.elem[temp].name << endl;
cout << "出生日期:" << stu.elem[temp].birthDay << endl;
cout << "性别:" << stu.elem[temp].sex << endl;
cout << "身体状况:" << stu.elem[temp].PC << endl;
break;
case 7:
stu.DisplayInfo(x);
break;
case 8:
exit(1);
system("cls");
}
}
return 0;
}