?? stuinfomanager.cpp
字號:
//StuInfoManager.cpp
#include<stdlib.h>
#include<fstream>
#include"stuinfomanager.h"
#include<iomanip>
using namespace std;
//定義靜態程序數據
char* StuInfoManager::subject_[] = {"語文","數學","英語","物理","化學"};
StuInfoManager::StuInfoManager(void)
{
isModified = false;
toRemvNodes = 0;
start();
}
StuInfoManager::~StuInfoManager(void)
{
}
/*************************************
* 功能: 顯示歡迎界面,并開始進行用戶交互處理
*************************************/
void StuInfoManager::start()
{
cout << "\n"
<< "\t*****************************\n"
<< "\t* 這是一個 *\n"
<< "\t* 學生成績管理程序 *\n"
<< "\t* 可以對學生成績進行管理 *\n"
<< "\t* 歡迎使用管理程序 *\n"
<< "\t*****************************\n"
<< "\n" ;
handleMenu();
}
/****************************************
*功能:顯示程序管理菜單,返回用戶選擇的選項
*返回:用戶選擇的選項,是0-9之間的一個字符
****************************************/
char StuInfoManager::menuSelect()
{
cout << "\n"
<< "0.顯示記錄\n"
<< "1.查詢記錄\n"
<< "2.增加記錄\n"
<< "3.刪除記錄\n"
<< "4.修改記錄\n"
<< "5.記錄排序\n"
<< "6.保存記錄\n"
<< "7.讀取記錄\n"
<< "8.新建學生信息文件\n"
<< "9.結束運行\n"
<< "\n左邊數字對應功能選擇,請選0-9: ";
string str;
char choice;
while (true)
{
cin >> str;
cin.ignore(); //從 cin中將回車符提取出來
choice = str[0];
if(choice<'0' || choice>'9' )
cout << "\n輸入錯誤,重新選0-9: ";
else
break;
}
return choice;
}
/*************************************************
* 功能:根據用戶選擇的項目調用相應的處理函數
**************************************************/
void StuInfoManager::handleMenu()
{
while(true)
{
switch(menuSelect())
{
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 << "學號 姓名 性別";
for (int j=0;j<NUM_SUBJECT;j++)
cout << '\t'<< subject_[j];
cout << " 總分 平均分 名次 刪除標志\n";
}
/********************************************
*功能:顯示指定記錄的信息
********************************************/
void StuInfoManager::dispRecord(Record* rec)
{
//打印學生信息
cout<<setw(4) << rec->number << setw(4) << rec->name << setw(4)<< rec->gender;
for (int j=0;j<NUM_SUBJECT;j++)
cout<<'\t'<<rec->score[j];
cout.precision(3);
cout<<setw(6)<<rec->sum<<setw(6)<<rec->average<<setw(6)<<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]);
//打印滿20個記錄后停下來
if (i%20==0 && i!=0)
{
cout << "輸入任一個字符后繼續.......\n";
cin.get();
cout << endl;
dispTable();
}
}
cout << "一共有" << size() << "條記錄\n" << endl;
}
/**************************************************
*功能:首先檢查記錄是否已經保存,然后清空當前所有記錄
*注意:這函數覆蓋了基類中的函數
**************************************************/
void StuInfoManager::clear()
{
char choi[5];
if (toRemvNodes !=0)
{
cout << "現在還有被做了刪除標記但還沒有執行的記錄,是否執行刪除? (Y/N)";
cin.getline(choi,5);
if (choi[0]!='n' && choi[0]!='N' )
{
int num = removePerform();
toRemvNodes = 0;
cout << "一共刪除了" << num << "條記錄\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 << "記錄是空表,退出查詢操作!" << endl;
return;
}
char choi[5];
int type;
char pattern[20];
while(true)
{
//選擇獲取所需要查詢的記錄方式
cout << "請輸入查詢的方式; (直接輸入回車則結束查詢) \n"
<< "1.按學號\n"
<< "2.按姓名\n"
<< "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;
}
}
/***********************************************
*找出總分為sum在當前所有記錄中按升序排序的位置
*參數:sum, 欲找位置的總分
*返回:sum在當前所有記錄中按升序排序的位置
*結果:原有記錄中"名次"項也會依需要相應改變
**************************************************/
int StuInfoManager::getIndex(float sum)
{
int ncount = 0; //總分大于sum的人數
Iterator it;
Iterator it_end = pastEnd();
for (it = first(); it!=it_end; it++)
{
if ((*it)->sum < sum)
{
(*it)->index++;//總分小于sum的記錄名次增1
} else if ((*it)->sum >sum)
{
ncount++;
}
}
return ncount+1;
}
/*****************************************
*功能:向當前學生信息追加新的記錄
*注意:該函數重載了基類中的函數
******************************************/
void StuInfoManager::addRecord()
{
if (empty())
cout << "原來沒有記錄,現在建立新表" << endl;
else
cout << "下面在當前表的末尾增加新的信息" << endl;
char choi[5];
char name[20];
Record* rec;
float sum;
int j;
int ncount = 0; //記錄增加了的記錄數
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;
printf("請輸入性別 (0為女,1為男): ");
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"
<< "現在一共有" << size() << "條記錄" << endl;
if (ncount != 0)
isModified = true; //記錄已經改動,未保存
}
/********************************************************
*功能:進入"刪除記錄"子菜單,選擇執行相應的功能
*注意:該函數重載了基類中的函數
********************************************************/
void StuInfoManager::removeRecord()
{
if(empty())
{
cout << "記錄已經空,退出刪除操作!" << endl;
return;
}
cout << "1.標記待刪除的記錄\n"
<< "2.執行標記\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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -