?? stuinfomanager.cpp
字號:
#include <stdlib.h>
#include <fstream>
#include "StuInfoManager.h"
using namespace std ;
char* StuInfoManager::subject_[] = {"A","B","C", "D", "E"};
StuInfoManager::StuInfoManager(void)
{
isModified = false;
toRemvNodes = 0;
start();
}
StuInfoManager::~StuInfoManager(void){}
void StuInfoManager::start(){
cout << endl
<< "\t*************************************************" << endl
<< "\t* *" << endl
<< "\t* 這是一個 *" << endl
<< "\t* 學生成績管理程序 *" << endl
<< "\t* 可以對學生成績進行管理 *" << endl
<< "\t* *" << endl
<< "\t* *" << endl
<< "\t* 歡迎使用管理程序! *" << endl
<< "\t*************************************************"<<endl
<< endl;
handleMenu();
}
char StuInfoManager::menuSelect()
{
cout<<"0"<<"顯示記錄"<<endl
<<"1"<<"查詢記錄"<<endl
<<"2"<<"添加記錄"<<endl
<<"3"<<"刪除記錄"<<endl
<<"4"<<"修改記錄"<<endl
<<"5"<<"記錄排序"<<endl
<<"6"<<"保存記錄"<<endl
<<"7"<<"讀取記錄"<<endl
<<"8"<<"新建學生信息"<<endl
<<"9"<<"結(jié)束運行"
<<endl;
string str;
char choice;
while(true)
{
cin>>str;
cin.ignore();
choice =str[0];
if(choice<'0'||choice>'9')
cout<< endl <<"輸入錯誤,重新輸入0到9之間的數(shù)字";
else
break;
}
return choice;
}
void StuInfoManager::handleMenu(){
while (true)
{char c;
c= menuSelect();
switch(c){
case '0': displayRecords() ;break;
case '1': queryRecord(); break;
case '2': addRecord(); break;
case '3': removeRecord();break;
case '4': modifyRecord();break;
case '5': sortRecords(); break;
case '6': saveRecords();break;
case '7': loadRecords();break;
case '8': clear();
addRecord();
break;
case '9': quit();
}
}
}
void StuInfoManager::dispTable(){
cout<<"學號\t姓名\t性別" ;
for(int j=0 ;j<NUM_SUBJECT;j++)
cout<<'\t'<<subject_[j];
cout<<"\t總分\t平均分\t名次\t刪除標記\n";
}
void StuInfoManager::dispRecord( Record* rec)
{//打印學生信息
cout<<rec->number<<'\t'<<rec->name<<'\t'<<rec->gender;
for(int j=0;j<NUM_SUBJECT;j++)
cout<<'\t'<<rec->score[j];
cout.precision(3);
cout<<'\t'<<rec->sum<<'\t'<<rec->average<<'\t'<<rec->index;
if(rec->toBeDeleted)
cout<<"\t*\n";
else
cout<<'\n';
}
void StuInfoManager::displayRecords()
{ if(empty())
{cout<<"沒有文件"<<endl;
return;
}
dispTable();
int num = size();
for(int i=0;i<num;i++)
{dispRecord(recVec[i]);
if(i%20==0&&i!=0)
{cout<<"請輸入字符繼續(xù)"<<endl;
cin.get();
cout<<endl;
dispTable();
}
}
cout<<"共有"<<size()<< " 條記錄 " << endl;
}
void StuInfoManager::clear(){
char choi[5];
if(toRemvNodes !=0)
{ cout<<"現(xiàn)在還有被做了標記但沒執(zhí)行的記錄,是否執(zhí)行?(Y/n)";
cin.getline(choi,5);
if(choi[0]!='n'&& choi[0]=='N')
{int num= removePerform();
toRemvNodes = 0;
cout<<"一共刪除了"<<num<<"條記錄"<<endl
<<"現(xiàn)在還剩下"<<size()<<"條記錄"<<endl;
if(num!=0)
isModified = true;
}
}
if (isModified)//已啟動
{ cout<<"學生信息已啟動,是否保存?(y/n)";
cin.getline(choi,5);
if(choi[0]!='n'&& choi[0]!='N')
saveRecords();
}
StuInfoVec::clear();
isModified = false;
}
void StuInfoManager::queryRecord(){
if (empty())
{ cout<<"記錄是空數(shù)。退出查詢操作!"<<endl;
return;
}
char choi[5];
int type;
char pattern[20];
while (true){
cout<<"請輸入查詢的方式\n"<<endl
<<"1.按學號\n"<<endl
<<"2.按姓名\n"<<endl
<<"3.按名次\n";
cin.getline(choi,5);
if (choi[0] == '\0') break;
if(choi[0] == '1')
{cout<< "請輸入查詢學生的學號:";
type = 0;
}else if (choi[0] =='2')
{cout<<"請輸入查詢的學生的姓名:";
type=1;
}else
{cout<<"請輸入查詢學生的名次:";
type=2;}
cin.getline(pattern,20);
int findCount = 0;
//找到匹配的記錄
Iterator it = findRecord(pattern,type,first());
Iterator it_end = pastEnd();
dispTable();
while (it != it_end)
{findCount++;
dispRecord(*it) ;
it = findRecord(pattern,type,++it);
}
cout<<"一共找到"<< findCount<<"條記錄\n"<<endl;
}
}
int StuInfoManager::getIndex(float sum){
int ncount =0;
Iterator it;
Iterator it_end = pastEnd();
for(it=first(); it!=it_end;it++)
{ if((*it)->sum<sum)
{
(*it)->index++;
}else if ((*it)->sum > sum)
{ ncount++;
}
}
return ncount+1;
}
void StuInfoManager::addRecord()
{ if(empty())
cout<<"原來沒有記錄,現(xiàn)在建立新表"<<endl;
else
cout<<"現(xiàn)在在當前表的末尾增加新的信息"<<endl;
char choi[5];
char name[20];
Record* rec;
float sum;
int j;
int ncount = 0;//記錄增加的記錄數(shù)
while(true)
{ cout<<"你將要添加一組信息,確定嗎?(y/n)";
cin.getline(choi,5);
if(choi[0]=='n' || choi[0]=='N')
break;
rec = new Record;
cout<<"請輸入學號:"<< flush;
cin >> rec->number;
cin.ignore();
printf("請輸入姓名:");
cin.getline(name,20);
rec->name=name;
cout << "請輸入性別(1.男0.女):"<<endl;
cin.getline(choi,5);
if(choi[0]=='0')
rec->gender = "女" ;
else
rec->gender ="男";
sum=0;
for (j=0;j<NUM_SUBJECT;j++)
{ cout<<"請輸入" <<subject_[j]<<"成績:";
cin>>rec->score[j];
sum += rec->score[j];
}
cin.ignore();
rec->sum = sum;
rec->average = sum/NUM_SUBJECT;
rec->index = getIndex(sum);
StuInfoVec::addRecord(rec);
ncount++;
}
cout<<" 一共新增了"<<ncount<<"條記錄\n"<<endl
<<"現(xiàn)在共有"<<size()<<"條記錄"<<endl;
if(ncount !=0)
isModified = true;
}
void StuInfoManager::removeRecord(){
if(empty())
{
cout<<"記錄已空,退出刪除操作!"<<endl;
return;
}
cout<<"1.標記待刪除的記錄\n"
<<"2.執(zhí)行標記\n"
<<"3.取消指定記錄的刪除標記\n"
<<"4. 取消全部刪除標記"<<endl;
string str;
do
{ cout<<"請選擇你要進行的操左(1-4):";
cin>>str;
}
while (str[0]<'1'||str[0]>'4');
cin.ignore();
switch (str[0])
{
case '1':
removeNote(true);
break;
case '2':
{int num = removePerform();
toRemvNodes ='0';
cout<<"一共刪除了"<<num<<"條記錄\n"
<<"現(xiàn)載還剩下"<<size()<<"條記錄"<<endl;
if(num != 0)
isModified =true;
}
break;
case'3':
removeNote(false);
break;
case'4':
{
Iterator it;
Iterator it_end = pastEnd();
for(it=first();it!=it_end;it++)
(*it)->toBeDeleted = false;
toRemvNodes = 0;
cout<<"所有刪除的標記已被取消"<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -