设计题目:成绩管理系统 专 业:计算机科学与技术
班 级:0314401 学 号:031440122 姓 名:贺超
日 期:2015年10月25日—2015年12月25日
成 绩:
目录 一、选题背景3 二、方案论证3
1。 系统主控平台3 2。 增加学生成绩信息3 3. 显示学生信息3 4。 查询学生信息3 5 修改学生信息4 6。 删除学生信息4
7。 学生信息按总分排序4
8. 保存数据到文件与将文件数据装入学生数组4
三、过程论述5
1。系统学生信息类设计:5 2。添加学生信息模块:7 3。删除信息模块:13 4。修改信息模块15 5。查找学生信息17 6。显示学生信息模块19 7。学生信息排序模块21 8。保存信息模块26 9.读取信息模块27
四、结果分析29
1.系统主函数29 2.添加学生信息29 3。删除学生信息30 4.修改学生信息30 5。查找学生信息31 6.显示学生信息31 7。学生信息排序32 8.学生信息排序32
五、课程设计总结33
参考文献33
一、选题背景
学生成绩管理系统是对学生信息及成绩的管理。开发工具Visual C++.主要用于对学生的学号、姓名等基本信息以及各个学科成绩进行增加、删除、修改、查询以及保存到文件等操作。系统给用户提供一个人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。
二、方案论证
本系统采用c++控制台程序来实现程序所需的所有要求,具体实现如下:
1. 系统主控平台
通过主菜单允许用户选择想要的操作。包括输入学生信息、显示学生信息、查询学生信息、修改学生信息、删除学生信息、显示所有学生信息、统计各个分数段学生信息、学生按总分排序输出。通过输入相应的序号选择相应的操作。
2. 增加学生成绩信息
用户根据提示输入学生的学号、姓名、性别、4门课程的成绩(课程名称自定)。输入完一条学生记录,保存在学生数组中,可选择继续输入下条学生记录还是退回到主菜单.
3. 显示学生信息
将保存在学生数组中的学生记录逐行显示出来。若数据很多,应该每显示若干行后暂停,按回车后继续显示后续内容。
4。 查询学生信息
先询问按学号、姓名、成绩做查询,若按学号查询,则输入要查找的学号,然后在学生数组中找到该学号的学生记录,显示出该学生的信息。若找不到该学号信息,则显示无此学号。若按姓名查询,则输入要查找的姓名,然后在学生数组中找到该姓名的学生记录,显示出该学生的信息。若找不到该姓名信息,则显示无此姓名。若按成绩查询,则输入要查找的科目及成绩范围,然后在学生数组中找到该成绩范围的学生记录(可以有多个学生),显示出相关学生的信息。若找不
到信息,则显示无此成绩。每次查询完,询问是否继续查询,是则继续下轮查询,否则退回主菜单。
5 修改学生信息
先提示输入要修改的学生的学号,在学生数组中找出该学生记录,若找到,则重新输入学生的姓名、性别、4门课程的成绩等。然后保存到学生数组的该学生记录中.若找不到,则显示无此学号。
6。 删除学生信息
先提示输入要删除的学生的学号,在学生数组中找出该学生记录,若找到,则在学生数组中删除该学生记录。若找不到,则显示无此学号。
7。 学生信息按总分排序
在本模块中,系统自动遍历信息链表并排序来对链表中所有的信息进行排序,并在排序后显示排序后的所有信息。
8。 保存数据到文件与将文件数据装入学生数组
在系统退出前,先将学生数组的学生信息保存的文件中.然后结束系统。每次进入系统时,先将文件中的学生数据装入学生链表中,然后才进入系统的主菜单.
本系统的数据存储利用类对象链表,定义学生信息类,将学生信息定义为类的成员变量,并定义初始化信息、修改信息、显示信息、计算总分、计算平均分这几个类成员函数,方便数据的增加与修改.
系统中录入学生数据前会在系统类对象链表中检测是否存在与输入的学号相同的信息,如果存在并继续输入了信息,则会出现信息的重复和搜索不到的情况,因此,设置数据检查环节可以避免数据的重复录入,当出现输入了重复的数据时,会有系统提示,提示输入的信息已存在并提供重新输入的机会;另在输入学号查找和删除部分,如果系统在检测类对象链表的时候未发现系统中包含输入的学号,则输出提示,输入的信息在系统中不存在;系统在学生信息查询部分,有根据学生成绩查询所有符合条件的学生信息,这部分存在输入分数的上下限问题,必须存在上限大于等于下限,并且上下限必须都在分数的范围内,因此每次输入一个分数都设置一个判断语句来判断是否符合条件,如果不符合提示重新输入。
本系统开发环境:VC++6.0
使用开发语言:C++
三、过程论述
详细设计:
读取成绩信息学生成绩管理系统添加学生信息删除学生信息修改学生信息查询学生信息显示学生信息成绩信息排序退出保存到文件中 图1 系统模块图
如图1,本系统分为添加学生信息模块、删除学生信息模块、修改学生信息模块、查找学生信息模块、显示学生信息模块、学生信息排序、统计学生信息七个主要实现功能的模块,每个模块分别有个主函数,用来实现这个模块的信息。
1。系统学生信息类设计:
class Menu { public: int TheMenu(); void Work(); void Save(); void Read();
int ReadOnePart(int nPass, char cOneLine[], int n, char cC[], int m); int nEnd; int nChoose; Menu(); ~Menu(); protected: void Insert(); void Revise(); void Delete(); void Search(); void Show(); };
Menu::Menu() { nEnd = 1; nChoose = 0; }
Menu::~Menu() { }
class Worker :public Menu { public: int TheMenu(); void Work(); protected: void Insert();
void Revise(); void Delete(); void Search(); void OrderInChinese(); void OrderInEnglish(); void OrderInMath(); void OrderInSum(); void Show(); };
class Information { //数据: public:
char cNum[12];//学号 char cName[12];//姓名 char cSex[12];//性别 int nChinese; int nMath; int nEnglish; int nSum;
Information *pSNext; };
2.添加学生信息模块:
输入学号比较是否存在不存在存在与否存在将添加的信息添加到链表输出学号已存在
图2 添加学生信息流程图
添加信息的时候会检测系统中是否含有同样学号的学生信息,如果不存在才可以添加,如果已经存在,需要输出提示。
添加学生信息函数: void Worker::Insert() {
int nCheck = 0;//用于判断是否存在 int nScore1; int nScore2; int nScore3; float nSum;
cout <〈 ”**************************************************************\" << endl;
cout 〈< ”*请输入学号: *\" <〈 endl;
cin >〉 cNum;
pSSearch = pSHead;//遍历指针指向头指针,开始遍历链表 while (pSSearch != NULL) {
if (strcmp(pSSearch-〉cNum, cNum) == 0)//如果等于0表示两边字符数组相等,即存在
{
cout << ”**************************************************************” << endl;
cout 〈< \"* 输入的学号已存在! *\" <〈 endl;
cout 〈〈 \"**************************************************************” 〈< endl;
nCheck = 1;//用此变量标记是否有相同的存在,有则为1,没有则为0 break; }
pSSearch = pSSearch->pSNext;//令遍历指针指向下一个节点 }
//查找不存在再插入信息,因此nCkeck 为0 if (nCheck == 0)//向链表中插入值 {
cout 〈< ”*请输入姓名: *” << endl;
cin >〉 cName;
cout 〈〈 \"*请输入性别: *” 〈< endl;
cin >〉 cSex;
cout 〈〈 ”*请输入语文成绩: *\" 〈〈 endl;
cin >〉 nChinese;
cout <〈 \"*请输入数学成绩: *” 〈〈 endl;
cin 〉> nMath;
cout 〈〈 ”*请输入英语成绩: *” <〈 endl;
cin 〉> nEnglish;
nSum = nChinese + nMath + nEnglish;
pSSearch = pSHead;//遍历指针指向头指针
pSFormer = pSHead;//最开始初始化为指向头指针
if (pSSearch == NULL)//如果头指针为空的话,直接把数据插入链表 {
pToThis = (Information *)malloc(nSize);//开辟一个节点大小的内存区
pSHead = pToThis;//令头指针指向第一个节点
pToThis->pSNext = NULL;//此时链表内只存在一个节点,因此该节点的指针不指向任何节点
for (int i = 0; i < 12; i++)//字符数组一位一位的赋值进去,不可以直接赋值
{
//缓存区数据存入节点中
pToThis—〉cNum[i] = cNum[i]; pToThis—〉cName[i] = cName[i]; pToThis—〉cSex[i] = cSex[i]; }
pToThis—>nChinese = nChinese; pToThis->nMath = nMath; pToThis-〉nEnglish = nEnglish; pToThis—>nSum = nSum; } else {
//当头指针不是空的时候,即链表内存在节点,需要遍历节点,我们插入默认按照学号由小到大排序
while (pSSearch != NULL) {
if (strcmp(pSSearch->cNum, cNum) > 0)//表示新节点的编号大于正遍历的节点,要插在这个节点之前
{
//插入条件符合,缓存信息小于正在搜索的信息,则插入消息 if (pSSearch == pSHead) {
//如果查找的指针等于头指针
pToThis = (Information*)malloc(nSize); pSHead = pToThis;
pToThis->pSNext = pSSearch;//令新节点的指针指向刚才正在遍历的节点,让新的节点连入链表
for (int i = 0; i < 12; i++)//字符数组一位一位的赋值进去,不可以直接赋值
{
//缓存区数据存入节点中
pToThis-〉cNum[i] = cNum[i]; pToThis—〉cName[i] = cName[i]; pToThis—〉cSex[i] = cSex[i]; }
pToThis-〉nChinese = nChinese; pToThis—〉nMath = nMath; pToThis—〉nEnglish = nEnglish; pToThis->nSum = nSum; break; } else {
//当搜索的节点并非首节点
pToThis = (Information*)malloc(nSize); pToThis-〉pSNext = pSSearch; pSFormer—〉pSNext = pToThis;
for (int i = 0; i 〈 12; i++)//字符数组一位一位的赋值进去,不可以直接赋值
{
//缓存区数据存入节点中
pToThis—〉cNum[i] = cNum[i]; pToThis->cName[i] = cName[i];
pToThis—〉cSex[i] = cSex[i]; }
pToThis—>nChinese = nChinese; pToThis—〉nMath = nMath; pToThis—>nEnglish = nEnglish; pToThis—〉nSum = nSum; break; } }
pSFormer = pSSearch;//指向前一个节点的指针指向当前节点 pSSearch = pSSearch—>pSNext; //当搜寻的尾节点仍然没有打到插入要求 if (pSSearch == NULL) {
pToThis = (Information*)malloc(nSize); pSFormer-〉pSNext = pToThis; pToThis->pSNext = NULL;
for (int i = 0; i < 12; i++)//字符数组一位一位的赋值进去,不可以直接赋值
{
//缓存区数据存入节点中
pToThis—>cNum[i] = cNum[i]; pToThis->cName[i] = cName[i]; pToThis—>cSex[i] = cSex[i]; }
pToThis->nChinese = nChinese; pToThis->nMath = nMath; pToThis-〉nEnglish = nEnglish; pToThis->nSum = nSum; break; } }
}
cout << ”**************************************************************” 〈< endl;
cout 〈< ”* 信息添加成功! *\" 〈< endl;
cout <〈 \"**************************************************************\" << endl;
}
cout <〈 ”**************************************************************” 〈< endl;
}
3。删除信息模块:
输入需要删除的学号比较是否存在存在存在与否不存在删除该节点数据输出该学号信息不存在结束
图3 删除信息流程图
在删除信息模块中,首先输入需要删除的学生学号,在信息链表中查询,如果存在,则删除需要删除的信息,如果不存在,则提示所需要删除的信息不存在。
删除信息函数代码: void Worker::Delete() {
cout 〈< \"**************************************************************\" <〈 endl;
cout << \"*请输入需要删除的学号:
*” << endl;
cin >> cNum;
pSSearch = pSHead; pSFormer = pSHead; while (pSSearch != NULL) {
if (strcmp(pSSearch—〉cNum, cNum) == 0) {
if (pSFormer == pSHead)//如果被查到的节点是第一个节点,pFormer是头指针
{
pSHead = pSSearch—>pSNext; } else {
pSFormer->pSNext = pSSearch—〉pSNext;//令前一个节点中指向下一个节点的指针直接指向被删除节点的下一个节点,以达到删除该节点的目的
}
free(pSSearch);
cout <〈 ”**************************************************************\" << endl;
cout <〈 ”* 该学号信息已删除! *” 〈< endl;
cout <〈 ”**************************************************************\" <〈 endl;
break; }
pSFormer = pSSearch;//让pFormer指针指向当前的节点,留着下一次用 pSSearch = pSSearch—>pSNext;//pSSearch指向下一个节点 }
if (pSSearch == NULL) { //输出
cout 〈< ”**************************************************************” 〈< endl;
cout <〈 ”* 输入的学号信息不存在! *” 〈< endl;
cout 〈〈 ”**************************************************************\" 〈< endl;
} }
4.修改信息模块
输入需要修改的学生信息比较是否存在存在存在与否不存在修改学生信息输出学生信息不存在结束
图4.修改学生信息流程图
在修改学生信息模块中,首先输入需要修改的学号,在信息链表中查找信息,如果查找不到则输出提示,输入的学号不存在,如果存在,则调用类对象成员函数对信息进行修改。
修改模块的代码如下: void Worker::Revise() {
float nSum;
//输入需要修改的信息
cout 〈〈 \"**************************************************************\" 〈〈 endl;
cout 〈< \"*请输入需要修改的学号:
*” << endl;
cin 〉〉 cNum;
pSSearch = pSHead; while (pSSearch != NULL) {
//如果匹配的话,则重新输入各个信息 if (strcmp(pSSearch—>cNum, cNum) == 0) { cout *\" 〈〈 endl;
cin >> cName; cout
<
〈
\"
*
请
输
入
性
别
*\" <〈 endl;
cin 〉〉 cSex; cout
<
〈
”
*
请
输
入
语
文
成
绩
*\" 〈< endl;
cin 〉> nChinese; cout
<
〈
\"*
请
输
入
数
学
成
绩
*” <〈 endl;
cin >〉 nMath; cout
〈
<
\"
*
请
输
入
英
语
成
绩
*” <〈 endl;
cin 〉〉 nEnglish;
nSum = nChinese + nMath + nEnglish;
//将修改的信息存入链表
for (int i = 0; i 〈 12; i++)//字符数组一位一位的赋值进去,不可以直接赋值
{
//缓存区数据存入节点中
pSSearch—〉cNum[i] = cNum[i];
〈
<
”
*
请
输
入
姓
名
:
:
:
:
:
pSSearch—〉cName[i] = cName[i]; pSSearch—〉cSex[i] = cSex[i]; }
pSSearch—〉nChinese = nChinese; pSSearch->nMath = nMath; pSSearch—>nEnglish = nEnglish; pSSearch—〉nSum = nSum;
cout 〈〈 ”**************************************************************” 〈< endl; *\" <〈 endl;
cout 〈〈 \"**************************************************************\" 〈〈 endl;
break; }
pSSearch = pSSearch—>pSNext;//遍历指针指向下一个节点,用于下一次比较
}
if (pSSearch == NULL) {
cout 〈< \"**************************************************************” 〈〈 endl; *\" <〈 endl;
cout 〈< ”**************************************************************” <〈 endl;
} }
cout <〈 \"* 信息已修改!
cout 〈〈 \"* 输入的学号信息不存在!
5.查找学生信息
输入学生学号比较是否存在存在存在与否不存在输出学生信息输出学生信息不存在结束
图5 查找学生信息流程图
在查找信息模块中,利用学号查询符合条件的学生信息均可输出,而且添加了对上下限的判断。
查找学生信息代码: void Worker::Search() {
int nKey = 0; //输入查询的信息
cout 〈< \"**************************************************************” <〈 endl;
cout
〈
<
”
请
输
入
学
号
*\" 〈〈 endl;
cin 〉〉 cNum;
pSSearch = pSHead;//从头开始遍历链表 while (pSSearch != NULL) {
if (strcmp(pSSearch—〉cNum, cNum) == 0) { nKey = 1;
cout 〈〈 \"**************************************************************” << endl;
:
cout << ”* 查询结果
*\" 〈< endl;
cout <〈 ”学号:\" 〈〈 pSSearch—〉cNum 〈〈 endl; cout 〈〈 \"姓名:\" 〈< pSSearch—〉cName << endl; cout <〈 ”性别:” << pSSearch-〉cSex << endl;
cout <〈 ”语文成绩: ” <〈 pSSearch—>nChinese 〈< endl; cout << \"数学成绩: ” << pSSearch->nMath 〈〈 endl; cout 〈< \"英语成绩: \" <〈 pSSearch->nEnglish << endl;
cout 〈< ”**************************************************************” 〈〈 endl;
break; }
pSSearch = pSSearch—〉pSNext; }
if (nKey == 0) {
cout 〈〈 \"**************************************************************” <〈 endl; *” << endl;
cout 〈< ”**************************************************************\" << endl;
} }
cout << ”* 系统不含该学号信息
6.显示学生信息模块
获得头指针判断指针是否为NULL否显示项目信息指针指向下一个节点 图6。显示学生信息流程图
在显示系统所有信息模块中,是一个遍历链表的过程,一边遍历链表一边显示链表中所有的信息.
显示所有信息代码: void Worker::Show() {
pSSearch = pSHead;//从头指针开始一个节点一个节点的显示各个节点的数据
cout 〈< ”**************************************************************” << endl; *” << endl;
cout。width(10);//定义显示距离 cout 〈〈 ”学号”; cout。width(10); cout 〈〈 ”姓名\"; cout.width(10); cout 〈〈 \"性别\"; cout.width(10); cout 〈< ”语文”; cout。width(10);
cout << \"* 学生信息如下
cout 〈〈 ”数学\"; cout。width(10); cout <〈 \"英语”; cout.width(10);
cout << ”总分\" 〈〈 endl; while (pSSearch != NULL) {
cout。width(10);//定义显示距离 cout 〈< pSSearch—〉cNum; cout.width(10);
cout << pSSearch-〉cName; cout.width(10); cout 〈〈 pSSearch->cSex; cout.width(10);
cout << pSSearch—〉nChinese; cout.width(10);
cout <〈 pSSearch—〉nMath; cout。width(10);
cout <〈 pSSearch-〉nEnglish; cout。width(10);
cout <〈 pSSearch-〉nSum 〈〈 endl; pSSearch = pSSearch—>pSNext; }
cout << ”**************************************************************\" <〈 endl;
}
7.学生信息排序模块
获取头指针是指针是否为NULL否新链表是否为空插入第一个节点结束是否小于新链表节点插入到小于的节点前新节点插入新链表尾指针指向下一个节点 图8 信息排序模块流程图
排序函数代码如下:
void Worker::OrderInChinese() {
pSSearch = pSHead;//开始遍历链表 //初始化新链表 pSNoHead = NULL; pSNoFormar = pSNoHead; while (pSSearch != NULL) {
pSNoSearch = pSNoHead; if (pSNoSearch == NULL) {
pSNOToThis = (Information *)malloc(nSize); pSNoHead = pSNOToThis;
pSNOToThis—>pSNext = NULL;
for (int i = 0; i < 12; i++) {
//缓存区数据存入节点中
pSNOToThis->cNum[i] = pSSearch-〉cNum[i]; pSNOToThis—〉cName[i] = pSSearch-〉cName[i]; pSNOToThis—>cSex[i] = pSSearch->cSex[i]; }
pSNOToThis-〉nChinese = pSSearch—>nChinese; pSNOToThis->nMath = pSSearch-〉nMath; pSNOToThis—〉nEnglish = pSSearch-〉nEnglish; pSNOToThis—〉nSum = pSSearch->nSum; } else {
while (pSNoSearch != NULL) {
if (pSNoSearch-〉nChinese> pSSearch—>nChinese) {
//插入条件符合,缓存信息小于正在搜索的信息,则插入消息 if (pSNoSearch == pSNoHead) {
//如果查找的指针等于头指针
pSNOToThis = (Information*)malloc(nSize); pSNoHead = pSNOToThis;
pSNOToThis—〉pSNext = pSNoSearch;
for (int i = 0; i 〈 12; i++) {
//缓存区数据存入节点中
pSNOToThis->cNum[i] = pSSearch-〉cNum[i]; pSNOToThis—〉cName[i] = pSSearch—〉cName[i]; pSNOToThis—>cSex[i] = pSSearch->cSex[i];
}
pSNOToThis—〉nChinese = pSSearch—〉nChinese; pSNOToThis—〉nMath = pSSearch—〉nMath; pSNOToThis-〉nEnglish = pSSearch—>nEnglish; pSNOToThis—>nSum = pSSearch—〉nSum; break; } else {
//当搜索的节点并非首节点
pSNOToThis = (Information*)malloc(nSize); pSNOToThis—>pSNext = pSNoSearch; pSNoFormar—>pSNext = pSNOToThis;
for (int i = 0; i < 12; i++) {
//缓存区数据存入节点中
pSNOToThis—>cNum[i] = pSSearch—>cNum[i]; pSNOToThis—〉cName[i] = pSSearch->cName[i]; pSNOToThis->cSex[i] = pSSearch->cSex[i]; }
pSNOToThis—〉nChinese = pSSearch—>nChinese; pSNOToThis—>nMath = pSSearch—〉nMath; pSNOToThis-〉nEnglish = pSSearch—〉nEnglish; pSNOToThis—〉nSum = pSSearch->nSum; break; } }
pSNoFormar = pSNoSearch; pSNoSearch = pSNoSearch-〉pSNext; }
if (pSNoSearch == NULL)
{
pSNOToThis = (Information*)malloc(nSize); pSNoFormar->pSNext = pSNOToThis; pSNOToThis—〉pSNext = NULL;
for (int i = 0; i < 12; i++) {
//缓存区数据存入节点中
pSNOToThis—>cNum[i] = pSSearch—>cNum[i]; pSNOToThis—〉cName[i] = pSSearch—〉cName[i]; pSNOToThis->cSex[i] = pSSearch—>cSex[i]; }
pSNOToThis—〉nChinese = pSSearch—>nChinese; pSNOToThis->nMath = pSSearch—〉nMath; pSNOToThis->nEnglish = pSSearch—〉nEnglish; pSNOToThis->nSum = pSSearch—>nSum; } }
pSSearch = pSSearch—〉pSNext; }
pSNoSearch = pSNoHead;//从头指针开始一个节点一个节点的显示各个节点的数据
cout << ”**************************************************************\" 〈〈 endl; *” << endl;
cout。width(10);//定义显示距离 cout << ”学号”; cout.width(10); cout <〈 \"姓名\"; cout.width(10); cout <〈 \"性别\"; cout。width(10);
cout 〈< \"* 按语文成绩排序后的信息如下
cout 〈〈 ”语文”; cout。width(10); cout 〈〈 ”数学\"; cout.width(10); cout 〈〈 \"英语”; cout。width(10); cout 〈〈 \"总分” <〈 endl; while (pSNoSearch != NULL) {
cout。width(10);//定义显示距离 cout 〈< pSNoSearch-〉cNum; cout。width(10);
cout <〈 pSNoSearch—〉cName; cout。width(10);
cout 〈〈 pSNoSearch->cSex; cout。width(10);
cout <〈 pSNoSearch->nChinese; cout。width(10);
cout <〈 pSNoSearch->nMath; cout。width(10);
cout 〈< pSNoSearch—>nEnglish; cout。width(10);
cout 〈< pSNoSearch—>nSum << endl; pSNoSearch = pSNoSearch—>pSNext; }
cout <〈 ”**************************************************************” <〈 endl;
}
8.保存信息模块
在保存信息模块中,遍历整个信息数组,把每一条信息写入到txt文件中。 保存信息模块代码如下: void Menu::Save() {
ofstream writefile;
writefile。open(”学生信息.txt\"); pSSearch = pSHead;
while (pSSearch != NULL) {
writefile 〈< pSSearch—〉cNum 〈< \";\" 〈〈 pSSearch—>cName 〈〈 ”;” << pSSearch->cSex << \";\" 〈〈 pSSearch-〉nChinese <〈 \";” <〈 pSSearch—〉nMath <〈 \";” << pSSearch-〉nEnglish
<〈 \";” << pSSearch->nSum << ”;” 〈< endl; pSSearch = pSSearch-〉pSNext; }
writefile.close(); cout 〈〈 \"**************************************************************” <〈 endl; cout 〈〈 ”* 信息保存成功! *” 〈〈 endl;
cout << \"**************************************************************” <〈 endl; }
9.读取信息模块
读取信息模块中,读取一行txt文件中的信息,就是原来数组中一个元素的信息,读取一行信息后,拆分开重新存进数组中,完成信息的读取。
读取信息代码: void Menu::Read() {
int nPass = 0;//用于跟踪读取一行数据读到哪一位 char cOneLine[1000];//用于存储读取的一行 string sOneline;
ifstream readfile(”学生信息。txt”); if (readfile.fail()) {
cout <〈 ”**************************************************************\" << endl; *\" << endl;
cout 〈< ”**************************************************************” 〈〈 endl;
cout 〈〈 \"* 暂无数据记录!
} else {
while (getline(readfile, sOneline)) {
strcpy(cOneLine, sOneline.c_str()); nPass = 0;
nPass = ReadOnePart(nPass, cOneLine, 1000, cNum, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cName, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cSex, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cChinese, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cMath, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cEnglish, 12); nPass = ReadOnePart(nPass, cOneLine, 1000, cSum, 12); //插入链表节点,无序插入
pToThis = (Information *)malloc(nSize); for (int i = 0; i 〈 12; i++) {
pToThis-〉cNum[i] = cNum[i]; pToThis->cName[i] = cName[i]; pToThis-〉cSex[i] = cSex[i]; }
pToThis—>nChinese = atoi(cChinese); pToThis->nEnglish = atoi(cEnglish); pToThis—〉nMath = atoi(cMath); pToThis-〉nSum = atoi(cSum);
if (pSHead == NULL)//当头指针为空时表示链表为空,放在第一个节点位置
{
pSHead = pToThis;
pToThis—〉pSNext = NULL; } else
{
pSFormer->pSNext = pToThis; pToThis-〉pSNext = NULL; }
pSFormer = pToThis; }
cout <〈 \"**************************************************************” 〈< endl; *” 〈< endl;
cout 〈< \"**************************************************************” 〈〈 endl;
readfile。close(); } }
cout <〈 ”* 数据装载成功!
四、结果分析
1.系统主函数
图9 系统主菜单
2。添加学生信息
当输入的学号在系统中已经存在了,系统则会给出提示,并可以重新输入
图10 系统学号重复显示
正确输入学生信息:
图11 添加学生信息成功
3。删除学生信息
当输入的学号不存在,则会提示不存在信息:
图12 删除学号不存在显示
而当输入正确的学号后,系统会删除信息:
图13 删除信息成功
4。修改学生信息
当输入的学号在系统中不存在,则给出提示:
图14 修改学号不存在显示
当输入的学号正确后,系统会提示修改学生信息:
图15 修改学生信息显示
5.查找学生信息
查找首先弹出菜单选择使用何种方式查找:菜单如下:
图16正确查询信息显示
6.显示学生信息
图17 显示学生信息
7.学生信息排序
图18 排序主菜单
8。学生信息排序
图19 按语文成绩排序
图19 按数学成绩排序
图19 按英语成绩排序
图19 按总分成绩排序
五、课程设计总结
经过了课程设计的学习,对C++程序设计又有了更深层次的理解,通过对课程设计的分析、编写、运行、调试,对C++程序的结构,运行效果和程序的编写都有了更深层次的理解。
尤其在本次课设中使用了类对象链表,并系统的学习了链表的操作,,并利用类对象链表存储信息。
参考文献
因篇幅问题不能全部显示,请点此查看更多更全内容