用順序表實現學生健康系統
阿新 • • 發佈:2019-01-09
【問題描述】
實現學生健康情況管理的幾個操作功能(新建、插入、刪除、從檔案讀取、寫入檔案和查詢、螢幕輸出等功能)。健康表中學生的資訊有學號、姓名、出生日期、性別、身體狀況等。
系統的選單功能項如下:
1——新建學生健康表
2——向學生健康表插入學生資訊
3——在健康表刪除學生資訊
4——從檔案中讀取健康表資訊
5——向檔案寫入學生健康表資訊
6——在健康表中查詢學生資訊(按學生學號來進行查詢)
7——在螢幕中輸出全部學生資訊
8—–退出
#include <iostream>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
const int defaultSize = 100;
int length;
//學生結構體
struct student {
string num;
string name;
string sex;
string birth;
string exam;
};
template<class T>
class SeqList //順序表類
{
protected:
T *data;
int maxSize;
int last;
public :
//建構函式
SeqList(int sz) {
if (sz>0) {
maxSize = defaultSize;
last = sz - 1;
data = new T[maxSize];
if (data == NULL) {
cerr << "儲存分配錯誤!" << endl;
exit(1);
}
}
}
void copy(SeqList<T>&L);
~SeqList() { delete[] data; };
bool Insert(int i, T &x);
bool Remove(int i);
void output();
int Search(string x);
void read();
void write();
};
//複製函式
template<class T>
void SeqList<T>::copy(SeqList<T>&L){
last = L.last-length+1;
T value;
data = new T[maxSize];
for (int i = 0; i <= last; i++){
data[i]=L.data[i];
}
}
template <class T>
bool SeqList<T>::Insert(int i, T&x) {
if (last == maxSize - 1) return false;
if (i<0 || i>last + 1) return false;
for (int j = last; j >= i; j--){
data[j + 1] = data[j];
}
data[i] = x;
last++;
return true;
}
//刪除
template <class T>
bool SeqList<T>::Remove(int i) {
if (last == maxSize - 1) return false;
if (i<0 || i>last + 1) return false;
for (int j = i; j <= last; j++)
data[j - 1] = data[j];
last--;
return true;
}
//輸出
template <class T>
void SeqList<T>::output(){
cout << "the last:" << last << endl;
for (int i = 0; i < last; i++)
cout << i + 1 << ":" << "學號: " << data[i].num << " " << "姓名:" << data[i].name << " " << "性別:" << data[i].sex << " "
<< "生日:" << data[i].birth << " " << "健康狀況:" << data[i].exam << endl;
}
//查詢
template <class T>
int SeqList<T>::Search(string x){
for (int i = 0; i <= last; i++)
if (data[i].num== x)
return i+1;
return 0;
}
//讀檔案,首先確保自己有檔案
template<class T>
void SeqList<T>::read(){
int i = 0;
ifstream ifile("data.txt");
while (!ifile.eof())
{
ifile >> data[i].num >> data[i].name >> data[i].sex >>data[i].birth>> data[i].exam;
cout << i + 1 << ":" << "學號: " << data[i].num << " " << "姓名:" << data[i].name << " " << "性別:" << data[i].sex << " "
<< "生日:" << data[i].birth << " " <<"健康狀況:"<< data[i].exam << endl;
i++;
}
ifile.close();
}
//寫入檔案
template<class T>
void SeqList<T>::write(){
ofstream ofile("data.txt");
for (int i = 0; i < last; i++)
{
if (i == last - 1)
{
ofile << data[i].num << " " << data[i].name << " " << data[i].sex << " " << data[i].birth << " " << data[i].exam;
break;
}
ofile << data[i].num << " " << data[i].name << " " << data[i].sex << " " << data[i].birth << " " << data[i].exam<<" ";
}
cout << "寫入成功!\n";
ofile.close();
}
//選單函式
void set() {
cout << "1.新建學生健康表\n";
cout << "2.插入學生資訊\n";
cout << "3.刪除學生資訊\n";
cout << "4.從檔案中讀取健康表資訊\n";
cout << "5.向檔案寫入學生健康表資訊\n";
cout << "6.在健康表中查詢學生資訊(按學生學號來進行查詢)" << endl;
cout << "7.在螢幕中輸出全部學生資訊" << endl;
cout << "8.退出" << endl;
cout << "輸入數字:\n";
}
int main(){
int n;
int i;
SeqList<student>stu(20);
string x;
student s = { "110","Li","f","1998.12","良好" };
set();
while (cin >> n&&n<8) {
if (n == 1){
cout << "請輸入表的長度:\n"; cin >> length;
SeqList <student> stu1(length);
student stu2[100];
cout << "輸入表的資訊:\n";
for (int i = 0; i < length; i++){
cout << "學號:"; cin >> stu2[i].num;
cout << "姓名:"; cin >> stu2[i].name;
cout << "性別:"; cin >> stu2[i].sex;
cout << "生日:"; cin >> stu2[i].birth;
cout << "健康狀況:"; cin >> stu2[i].exam;
stu1.Insert(i, stu2[i]);
}
stu.copy(stu1);
}
switch (n){
case 2: cout << "請輸入插入的位置:"; cin >> i; cout << "輸入插入的資訊:\n";
cout << "學號:"; cin >> s.num;
cout << "姓名:"; cin >> s.name;
cout << "性別:"; cin >> s.sex;
cout << "生日:"; cin >> s.birth;
cout << "健康狀況:"; cin >> s.exam;
stu.Insert(i - 1, s); break;
case 3:cout << "請輸入刪除的位置:"; cin >> i; stu.Remove(i); break;
case 4:stu.read(); break;
case 5:stu.write(); break;
case 6: cout << "請輸入學生學號:"; cin >> x; i = stu.Search(x); cout << i; break;//返回學生所在順序表的位置
case 7:stu.output(); break;
default:
break;
}
system("pause");
system("cls");
set();
}
return 0;
}