// * 算法描述:
// * 程序主要用于学生成绩管理,包括录入、添加、删除、修改、排序、输出等。
// * 程序源代码主要由二个类和一个界面控制模块组成。类StudentResult用于保存单
// * 个成绩记录的内容;类ResutlList用于维护整个成绩表,主要操作一条保存有各个
// * 学生成绩记录对象(StudentResult)的链表,可对其进行上述提到的各种操作,
// * 是程序的主体;另外还有一个界面控制的模块,界面主要仿命令行方式,这样可以
// * 使程序的流量控制交由用户控制,而且更加灵活。
// ****************************************************************************
#include <iostream>
#include <stdlib.h>
#include "main.h"
using std::cout;
using std::cin;
using std::endl;
void ShowWelcome();
void WaitCmd(char szCmdLine[MAX_CMDLINE_LENGTH]);
bool RunCmd(char szCmdLine[MAX_CMDLINE_LENGTH]);
void cmd_add();
void cmd_close();
void cmd_del();
void cmd_help();
void cmd_list();
void cmd_mb();
void cmd_mf();
void cmd_ml();
void cmd_mn();
void cmd_new();
void cmd_open();
void cmd_rcr();
void cmd_save();
void cmd_sbavg();
void cmd_sbchs();
void cmd_sbcls();
void cmd_sbeng();
void cmd_sbmth();
void cmd_sbnam();
void cmd_sbnum();
void cmd_sbttl();
void cmd_vcr();
ResultList m_rl;
int main(int argc, char *argv[])
{
char szCmdLine[MAX_CMDLINE_LENGTH] = {'/0'};
ShowWelcome();
do
{
WaitCmd(szCmdLine);
}while (RunCmd(szCmdLine));
return 0;
}
//显示欢迎使用界面
void ShowWelcome()
{
int i = 0;
system("CLS");
for (i=0; i<10; i++) cout << endl;
cout << " +-------------------------------------------------+" << endl;
cout << " | 欢迎使用Student Result Manage学生成绩管理系统 |" << endl;
cout << " +-------------------------------------------------+" << endl;
for (i=0; i<10; i++) cout << endl;
cout << "输入help命令查看帮助。" << endl;
}
//等待命令输入
void WaitCmd(char szCmdLine[MAX_CMDLINE_LENGTH])
{
do
{
cout << "CMD> ";
gets(szCmdLine);
}while (0 == strlen(szCmdLine));
}
//执行命令,如果用户输入了退出命令,则返回false,否则返回true
bool RunCmd(char szCmdLine[MAX_CMDLINE_LENGTH])
{
if (0 == strcmp(szCmdLine, "exit"))
return false;
else if (0 == strcmp(szCmdLine, "add"))
cmd_add();
else if (0 == strcmp(szCmdLine, "clear"))
system("CLS");
else if (0 == strcmp(szCmdLine, "close"))
cmd_close();
else if (0 == strcmp(szCmdLine, "del"))
cmd_del();
else if (0 == strcmp(szCmdLine, "help"))
cmd_help();
else if (0 == strcmp(szCmdLine, "list"))
cmd_list();
else if (0 == strcmp(szCmdLine, "mb"))
cmd_mb();
else if (0 == strcmp(szCmdLine, "mf"))
cmd_mf();
else if (0 == strcmp(szCmdLine, "ml"))
cmd_ml();
else if (0 == strcmp(szCmdLine, "mn"))
cmd_mn();
else if (0 == strcmp(szCmdLine, "new"))
cmd_new();
else if (0 == strcmp(szCmdLine, "open"))
cmd_open();
else if (0 == strcmp(szCmdLine, "rcr"))
cmd_rcr();
else if (0 == strcmp(szCmdLine, "save"))
cmd_save();
else if (0 == strcmp(szCmdLine, "sbavg"))
cmd_sbavg();
else if (0 == strcmp(szCmdLine, "sbchs"))
cmd_sbchs();
else if (0 == strcmp(szCmdLine, "sbcls"))
cmd_sbcls();
else if (0 == strcmp(szCmdLine, "sbeng"))
cmd_sbeng();
else if (0 == strcmp(szCmdLine, "sbmth"))
cmd_sbmth();
else if (0 == strcmp(szCmdLine, "sbnam"))
cmd_sbnam();
else if (0 == strcmp(szCmdLine, "sbnum"))
cmd_sbnum();
else if (0 == strcmp(szCmdLine, "sbttl"))
cmd_sbttl();
else if (0 == strcmp(szCmdLine, "vcr"))
cmd_vcr();
else
cout << "未知命令,请使用help命令查看帮助。" << endl;
return true;
}
//==============================================================================
// 命令处理
//==============================================================================
void cmd_add()
{
StudentResult *lpsr = NULL;
SRRecord srrTemp = {0, {'/0'}, {'/0'}, 0.0f, 0.0f, 0.0f};
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
cout << "学号: ";
cin >> srrTemp.uiNumber;
cout << "班别: ";
cin >> srrTemp.szClass;
cout << "姓名: ";
cin >> srrTemp.szName;
cout << "语文: ";
cin >> srrTemp.fChinese;
cout << "英语: ";
cin >> srrTemp.fEnglish;
cout << "数学: ";
cin >> srrTemp.fMath;
getchar();
lpsr = new StudentResult(srrTemp);
m_rl.Add(*lpsr);
cout << "添加成功。" << endl;
}
void cmd_close()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.Close();
cout << "关闭成绩表成功。" << endl;
}
void cmd_del()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.Delete(*(m_rl.GetCurrentSR()));
cout << "当前记录已成功删除。" << endl;
}
void cmd_help()
{
cout << "Student Result Manage Ver 1.00 beta" << endl;
cout << "Copyright(C) Science Valley Studio 2006 , All Rights Reserved." << endl;
cout << "Design by Ke QiongPan (goyejin)." << endl;
cout << endl;
cout << " add/t添加学生成绩记录" << endl;
cout << " clear/t清除屏幕" << endl;
cout << " close/t关闭打开的成绩表" << endl;
cout << " del/t删除当前记录" << endl;
cout << " exit/t退出程序" << endl;
cout << " help/t显示帮助信息" << endl;
cout << " list/t列出成绩表内容" << endl;
cout << " mb/t将当前记录指针移到上一个记录" << endl;
cout << " mf/t将当前记录指针移到第一个记录" << endl;
cout << " ml/t将当前记录指针移到最后一个记录" << endl;
cout << " mn/t将当前记录指针移到下一下记录" << endl;
cout << " new/t新建一张成绩表" << endl;
cout << " open/t打开一个成绩表文件" << endl;
cout << " rcr/t修改当前记录内容" << endl;
cout << " save/t保存成绩表到一个文件" << endl;
cout << " sbavg/t按平均分从大到小排序" << endl;
cout << " sbchs/t按语文成绩从大到小排序" << endl;
cout << " sbcls/t按班别从小到大排序" << endl;
cout << " sbeng/t按英语成绩从大到小排序" << endl;
cout << " sbmth/t按数学成绩从大到小排序" << endl;
cout << " sbnam/t按姓名从小到大排序" << endl;
cout << " sbnum/t按学号从小到大排序" << endl;
cout << " sbttl/t按总分从大到小排序" << endl;
cout << " vcr/t显示当前记录内容" << endl;
cout << endl;
}
void cmd_list()
{
StudentResult *lpsr = NULL;
StudentResult *lpsrCurrentSR = m_rl.GetCurrentSR();
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
cout << "/t序号/t学号/t班别/t姓名/t语文/t英语/t数学/t平均分/t总分" << endl;
cout << "/t----/t----/t----/t----/t----/t----/t----/t------/t----" << endl;
if (NULL == lpsrCurrentSR) return;
lpsr = m_rl.MoveFirst();
while (NULL != lpsr)
{
if (lpsr == lpsrCurrentSR)
{
cout << " *";
}
cout << '/t';
cout << m_rl.GetSRPos(*lpsr);
cout << '/t';
cout << lpsr->GetNumber();
cout << '/t';
cout << lpsr->GetClass();
cout << '/t';
cout << lpsr->GetName();
cout << '/t';
cout << lpsr->GetChinese();
cout << '/t';
cout << lpsr->GetEnglish();
cout << '/t';
cout << lpsr->GetMath();
cout << '/t';
cout << lpsr->GetAverage();
cout << '/t';
cout << lpsr->GetTotal();
cout << endl;
if (lpsr == m_rl.MoveNext())
lpsr = NULL;
else
lpsr = m_rl.GetCurrentSR();
}
m_rl.MoveToSR(*lpsrCurrentSR);
}
void cmd_mb()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.MoveBack();
cout << "前移记录指针成功。" << endl;
}
void cmd_mf()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.MoveFirst();
cout << "记录指针已成功移到第一个记录。" << endl;
}
void cmd_ml()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.MoveLast();
cout << "记录指针已成功移到最后一个记录。" << endl;
}
void cmd_mn()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.MoveNext();
cout << "后移记录指针成功。" << endl;
}
void cmd_new()
{
if (m_rl.IsLoad())
{
cout << "已有文件打开,请使用close命令关闭之后再新建一张成绩表。" << endl;
return;
}
if (m_rl.New())
cout << "已新建了一张成绩表。" << endl;
else
cout << "在新建成绩表时发生错误。" << endl;
}
void cmd_open()
{
char szFilePath[MAX_FILEPATH_LENGTH] = {'/0'};
if (m_rl.IsLoad())
{
cout << "已有文件打开,请使用close命令关闭之后再打开新的文件。" << endl;
return;
}
cout << "文件路径: " ;
gets(szFilePath);
if (m_rl.Open(szFilePath))
cout << "文件打开成功。" << endl;
else
cout << "文件打开错误。" << endl;
}
void cmd_rcr()
{
StudentResult *lpsr = m_rl.GetCurrentSR();
SRRecord srrTemp = {0, {'/0'}, {'/0'}, 0.0f, 0.0f, 0.0f};
if (!m_rl.IsLoad())
{
cout << "没有成绩表可供保存。" << endl;
return;
}
cout << "学号[" << lpsr->GetNumber() << "]: ";
cin >> srrTemp.uiNumber;
cout << "班别[" << lpsr->GetClass() << "]: ";
cin >> srrTemp.szClass;
cout << "姓名[" << lpsr->GetName() << "]: ";
cin >> srrTemp.szName;
cout << "语文[" << lpsr->GetChinese() << "]: ";
cin >> srrTemp.fChinese;
cout << "英语[" << lpsr->GetEnglish() << "]: ";
cin >> srrTemp.fEnglish;
cout << "数学[" << lpsr->GetMath() << "]: ";
cin >> srrTemp.fMath;
getchar();
lpsr->SetRecord(srrTemp);
cout << "记录修改成功。" << endl;
}
void cmd_save()
{
char szFilePath[MAX_FILEPATH_LENGTH] = {'/0'};
char cTemp = 'n';
if (!m_rl.IsLoad())
{
cout << "没有成绩表可供保存。" << endl;
return;
}
if (0 != strlen(m_rl.GetFilePath()))
{
cout << '[' << m_rl.GetFilePath() << ']' << endl;
cout << "是否以这个路径保存?(y/n) ";
do
{
cTemp = getchar();
}while (('y' != cTemp) && ('n' != cTemp));
getchar();
}
if ('y' == cTemp)
{
strcpy(szFilePath, m_rl.GetFilePath());
}
else
{
cout << "文件路径: " ;
gets(szFilePath);
}
if (m_rl.Save(szFilePath))
cout << "文件保存成功。" << endl;
else
cout << "文件保存失败。" << endl;
}
void cmd_sbavg()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByAverage();
cout << "已成功按平均分从大到小排序。" << endl;
}
void cmd_sbchs()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByChinese();
cout << "已成功按语文成绩从大到小排序。" << endl;
}
void cmd_sbcls()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByClass();
cout << "已成功按班别从小到大排序。" << endl;
}
void cmd_sbeng()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByEnglish();
cout << "已成功按英语成绩从大到小排序。" << endl;
}
void cmd_sbmth()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByMath();
cout << "已成功按数学成绩从大到小排序。" << endl;
}
void cmd_sbnam()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByName();
cout << "已成功按姓名从小到大排序。" << endl;
}
void cmd_sbnum()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByNumber();
cout << "已成功按学号从小到大排序。" << endl;
}
void cmd_sbttl()
{
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
m_rl.SortByTotal();
cout << "已成功按总分从大到小排序。" << endl;
}
void cmd_vcr()
{
StudentResult *lpsr = m_rl.GetCurrentSR();
if (!m_rl.IsLoad())
{
cout << "没有成绩表被打开。" << endl;
return;
}
cout << "/t序号/t学号/t班别/t姓名/t语文/t英语/t数学/t平均分/t总分" << endl;
cout << "/t----/t----/t----/t----/t----/t----/t----/t------/t----" << endl;
cout << '/t';
cout << m_rl.GetSRPos(*lpsr);
cout << '/t';
cout << lpsr->GetNumber();
cout << '/t';
cout << lpsr->GetClass();
cout << '/t';
cout << lpsr->GetName();
cout << '/t';
cout << lpsr->GetChinese();
cout << '/t';
cout << lpsr->GetEnglish();
cout << '/t';
cout << lpsr->GetMath();
cout << '/t';
cout << lpsr->GetAverage();
cout << '/t';
cout << lpsr->GetTotal();
cout << endl;
}