实现学生健康情况管理的几个操作功能
(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有
学号、姓名、出生日期、性别、身体状况
num name birth sex body
目录
功能:
1------新建学生健康表
2------向学生健康表插入学生信息
3------在健康表删除学生信息
4------从文件中读取健康表信息
5------向文件写入学生健康表信息
6------在健康表中查询学生信息(按学生学号来进行查找)
7------在屏幕中输出全部学生信息
8---- - 退出
0)用到的头文件
#include<string>//string类型数据
#include<fstream>//文件读写
#include<vector>//读文件时存一下
1)声明顺序表类模板
template<class Type>
class SeqList {
public:
Type* data;//顺序表存储数组
int MaxSize;//最大长度
int last;//当前最后元素下标
SeqList(int Maxsize = defaultSize);//新建
~SeqList() { delete[]data; }
void setdata(Type& x);//插入表项
void deldata(Type& x);//删除表项
void Find(Type& x);//查表项
void show();//输出表中所有信息
};
2)类成员函数
构造函数:开辟数组,让记录当前数据的last变量指向-1
//新建
template<class Type>
SeqList <Type> ::SeqList(int sz) {
if (sz > 0) {
MaxSize = sz; last = -1;
data = new Type[MaxSize];//开辟数组
if (data == 0) {
MaxSize = 0; last = -1;
return;
}
}
}
向顺序表中插入数据的函数:插入前判断表是否满,没满则last变量+1,将数据加入数组
//插入
template<class Type>
void SeqList<Type>::setdata(Type& x) {
//判断表满
if (last == MaxSize - 1) {
cout << "表满!无法进行插入操作" << endl;
return;
}
last++;
data[last] = x;
cout << "插入成功" << endl;
return;
}
在顺序表中删除指定的数据:在删除前判断表是否空,不为空则寻找数据并且删除,找不到则输出数据不存在
template<class Type>
void SeqList<Type>::deldata(Type& x){
//判断表空
if (last == -1) {
cout << "表空!无法进行删除操作" << endl;
return;
}
int i = 0;
while (i <= last && data[i] != x) i++;
if (data[i] == x) {
for (int j = i; j < last; j++) data[j] = data[j + 1];
last--;
cout << "删除成功!" << endl;
}
else cout << "该数据不存在" << endl;
return;
}
在顺序表中查找指定数据并输出的函数
//查找
template<class Type>
void SeqList<Type>::Find(Type& x) {
// 搜索函数:在顺序表中从头查找结点值等于给定值x的结点
int i = 0;
while (i <= last && data[i] != x) i++;
if (i > last) cout << "该数据在表中无法找到!" << endl;
else cout << data[i];
return;
}
输出顺序表的函数:特殊情况判断表空
//输出
template<class Type>
void SeqList<Type>::show() {
//判断表空
if (last == -1) {
cout << "当前表中无数据!请先添加数据" << endl;
return;
}
for (int i = 0; i <= last; i++)
cout << data[i];
return;
}
3)创建学生结构体
设置健康表中学生的信息 :学号、姓名、出生日期、性别、身体状况
为了方便数据的打包输出以及相等的判断,编写输入输出以及判断相等及不相等的运算符重载函数
typedef struct student {
//学号、姓名、出生日期、性别、身体状况
int num;
char name[10];
string birth;
string sex;
string body;
friend istream& operator >> (istream& is, student& t){
is >> t.num >> t.name >> t.birth >> t.sex >> t.body;
return is;
}
friend ostream& operator << (ostream& os, student& t){
os << t.num << '\t' << t.name << '\t' << t.birth << '\t' << t.sex << '\t' << t.body << endl;
return os;
}
bool operator ==(const student& t){
return this->num == t.num;
}
bool operator !=(const student& t) {
return this->num != t.num;
}
}stutype;
4)一些操作函数
从文件中读取信息
//从文件中读取信息
void readfile() {
ifstream ifs("student.txt"); //读取文件
if (!ifs.good()){
cerr << "ifstream open file error!\n";
return;
}
string line;
vector<string> lines;
while (getline(ifs, line)){
lines.push_back(line); //将每一行依次存入到vector中
cout << line << endl; //顺便打印一下这一行
}
ifs.close();
return;
}
向文件中写入信息
//向文件写入信息
void infile() {
fstream fout("student.txt", ios::out | ios::app);
if (fout.fail()){
cout << "文件打开失败" << endl;
exit(0);
}
for (int i = 0; i <= stu.last; i++){
fout << stu.data[i].num << '\t' << stu.data[i].name << '\t' << stu.data[i].birth << '\t' << stu.data[i].sex << '\t' << stu.data[i].body << endl;
}
fout.close();
cout << "写入成功!" << endl;
return;
}
插入学生信息
//插入学生信息
void instu() {
student data;
cout << "请依次输入要插入的学生学号、姓名、出生日期、性别、身体状况:(使用空格间隔)" << endl;
cin >> data;
stu.setdata(data);
return;
}
删除学生信息
//删除学生信息
void delstu() {
student data;
cout << "请输入要删除的学生学号:";
cin >> data.num;
stu.deldata(data);
return;
}
查询学生信息
//查询学生信息
void findstu() {
student data;
cout << "请输入要查询的学生学号:";
cin >> data.num;
stu.Find(data);
return;
}
输出所有学生信息
//输出所有学生信息
void showstu() {
stu.show();
return;
}
5)完整的代码实现
/*
实现学生健康情况管理的几个操作功能
(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有
学号、姓名、出生日期、性别、身体状况
num name birth sex body
1------新建学生健康表
2------向学生健康表插入学生信息
3------在健康表删除学生信息
4------从文件中读取健康表信息
5------向文件写入学生健康表信息
6------在健康表中查询学生信息(按学生学号来进行查找)
7------在屏幕中输出全部学生信息
8---- - 退出
*/
#include<iostream>
using namespace std;
#include<string>
#include<fstream>
#include<vector>
template<class Type>
class SeqList {
public:
Type* data;//顺序表存储数组
int MaxSize;//最大长度
int last;//当前最后元素下标
SeqList(int Maxsize = defaultSize);//新建
~SeqList() { delete[]data; }
void setdata(Type& x);//插入表项
void deldata(Type& x);//删除表项
void Find(Type& x);//查表项
void show();//输出表中所有信息
};
//新建
template<class Type>
SeqList <Type> ::SeqList(int sz) {
if (sz > 0) {
MaxSize = sz; last = -1;
data = new Type[MaxSize];//开辟数组
if (data == 0) {
MaxSize = 0; last = -1;
return;
}
}
}
//插入
template<class Type>
void SeqList<Type>::setdata(Type& x) {
//判断表满
if (last == MaxSize - 1) {
cout << "表满!无法进行插入操作" << endl;
return;
}
last++;
data[last] = x;
cout << "插入成功" << endl;
return;
}
//删除
template<class Type>
void SeqList<Type>::deldata(Type& x){
//判断表空
if (last == -1) {
cout << "表空!无法进行删除操作" << endl;
return;
}
int i = 0;
while (i <= last && data[i] != x) i++;
if (data[i] == x) {
for (int j = i; j < last; j++) data[j] = data[j + 1];
last--;
cout << "删除成功!" << endl;
}
else cout << "该数据不存在" << endl;
return;
}
//查找
template<class Type>
void SeqList<Type>::Find(Type& x) {
// 搜索函数:在顺序表中从头查找结点值等于给定值x的结点
int i = 0;
while (i <= last && data[i] != x) i++;
if (i > last) cout << "该数据在表中无法找到!" << endl;
else cout << data[i];
return;
}
//输出
template<class Type>
void SeqList<Type>::show() {
//判断表空
if (last == -1) {
cout << "当前表中无数据!请先添加数据" << endl;
return;
}
for (int i = 0; i <= last; i++)
cout << data[i];
return;
}
typedef struct student {
//学号、姓名、出生日期、性别、身体状况
int num;
char name[10];
string birth;
string sex;
string body;
friend istream& operator >> (istream& is, student& t){
is >> t.num >> t.name >> t.birth >> t.sex >> t.body;
return is;
}
friend ostream& operator << (ostream& os, student& t){
os << t.num << '\t' << t.name << '\t' << t.birth << '\t' << t.sex << '\t' << t.body << endl;
return os;
}
bool operator ==(const student& t){
return this->num == t.num;
}
bool operator !=(const student& t) {
return this->num != t.num;
}
}stutype;
SeqList<stutype> stu(20);//新建
void meau() {
cout << "1------新建学生健康表" << endl
<< "2------向学生健康表插入学生信息" << endl
<< "3------在健康表删除学生信息" << endl
<< "4------从文件中读取健康表信息" << endl
<< "5------向文件写入学生健康表信息" << endl
<< "6------在健康表中查询学生信息(按学生学号来进行查找)" << endl
<< "7------在屏幕中输出全部学生信息" << endl
<< "8------退出" << endl
<< "请输入需要使用的功能:";
return;
}
//从文件中读取信息
void readfile() {
ifstream ifs("student.txt"); //读取文件
if (!ifs.good()){
cerr << "ifstream open file error!\n";
return;
}
string line;
vector<string> lines;
while (getline(ifs, line)){
lines.push_back(line); //将每一行依次存入到vector中
cout << line << endl; //顺便打印一下这一行
}
ifs.close();
return;
}
//向文件写入信息
void infile() {
fstream fout("student.txt", ios::out | ios::app);
if (fout.fail()){
cout << "文件打开失败" << endl;
exit(0);
}
for (int i = 0; i <= stu.last; i++){
fout << stu.data[i].num << '\t' << stu.data[i].name << '\t' << stu.data[i].birth << '\t' << stu.data[i].sex << '\t' << stu.data[i].body << endl;
}
fout.close();
cout << "写入成功!" << endl;
return;
}
//插入学生信息
void instu() {
student data;
cout << "请依次输入要插入的学生学号、姓名、出生日期、性别、身体状况:(使用空格间隔)" << endl;
cin >> data;
stu.setdata(data);
return;
}
//删除学生信息
void delstu() {
student data;
cout << "请输入要删除的学生学号:";
cin >> data.num;
stu.deldata(data);
return;
}
//查询学生信息
void findstu() {
student data;
cout << "请输入要查询的学生学号:";
cin >> data.num;
stu.Find(data);
return;
}
//输出所有学生信息
void showstu() {
stu.show();
return;
}
int main() {
int a;
while (true) {
meau();
cin >> a;
switch (a) {
case 1:
//新建学生表
cout << "学生表已建立,请返回菜单添加数据!" << endl;
break;
case 2:
//插入学生信息
instu();
break;
case 3:
//删除学生信息
delstu();
break;
case 4:
//文件中读取信息
readfile();
break;
case 5:
//文件中写入信息
infile();
break;
case 6:
//查询学生信息 学号查询
findstu();
break;
case 7:
//输出所有学生信息
showstu();
break;
case 8:
//退出
return 0;
default:
cout << "请重新输入:";
}
system("pause");
system("cls");
}
}
需要改进的:
1.类模板中的成员data MaxSize last 可以设为private,文件写入函数需要用到last,新增接口返回last即可
2.在新建学生表的时候没法插入数据,可以改成输入创建学生表的大小后输入数据直到遇到-1时停止或直接在程序里创建指定大小的学生表,在选择创建功能时输入学生数据创建,直到遇到-1时停止
3.查找函数可以返回下标,在删除函数中可以用到,如果新增排序或者指定插入功能时可以用到
4.对文件读写操作还不是很熟悉