顺序表实现学生健康管理

实现学生健康情况管理的几个操作功能
(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有
学号、姓名、出生日期、性别、身体状况
num name birth sex body

目录

0)用到的头文件

1)声明顺序表类模板

2)类成员函数

3)创建学生结构体

4)一些操作函数

5)完整的代码实现

需要改进的:


功能:
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.对文件读写操作还不是很熟悉

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值