实验六:学生成绩管理系统
实验内容:1)选课登记
2)动态输入学生成绩。
3)查询学生成绩。
4)修改成绩
运行效果:《学生成绩管理系统》
[0]新生注册
[1]选课登记
[2]学生成绩输入
[3]成绩查询
[4]修改成绩
[5]退出
命令?0
学号姓名
2001李1
2002李2
2003李3
-1
学生数据库共有3个个记录
继续新的注册? n (注:清屏返回主采单)
命令?1
课程号:1001
输入选择该课程的学生学号:
2001 2002-1
共有2个学生选此课程
继续新的选课输入? y
课程号:1002
输入选择该课程的学生学号:
2002 2003-1
共有2个学生选此课程
继续新的选课输入? n(注:清屏返回主采单)
命令?2
课程号:1001
学号:2001姓名:李1成绩:80
学号:2002姓名:李2成绩:90
1001课程成绩已输入完成
继续其他课程成绩输入? y
课程号:1002
学号:2003姓名:李3成绩:70
学号:2002姓名:李2成绩:60
1002课程成绩已输入完成
继续其他课程成绩输入? n(注:清屏返回主采单)
命令?3
学号: 2002
姓名:李2成绩:
课程号:1001 成绩:90
课程号:1002 成绩:60
继续查询?n (注:清屏并返回主采单)
命令?4
学号:2002 课程号:1001
原成绩: 90 成绩修改为:70
继续修改? n
命令:5(注:清屏并返回主采单)
实验提示:1)清屏方法:包含头文件#include <stdlib.h> 调用函数system("cls");
2)附录中有参考源代码
目的要求:本实验是较综合的实习,要求掌握结构体、指针、函数等基本知识,理解链表的实现技术,理解模块化程序设计方法。进行基本的综合的真实意义软件开发训练。可参考后面附录中的代码。
附:实验六部分参考源代码(//{ 。。。 //} 中间的代码要求自己完成)
#include "stdafx.h"
#include <iostream.h>
#include <stdlib.h>
using namespace std;
// 循环链表结构 head->[,->next]...[data0,->next][data1,->next]...[datan,->head]
struct SCORE
{
int courseId;
int score;
SCORE *pnext;
};
struct STU_SCORE
{
char name[16];
int stuId;
SCORE *scoreHead;//学生课程成绩列表
struct STU_SCORE *pnext;
};
int mainMenu();
int stuReg(STU_SCORE *pHead);
int selCourse(STU_SCORE *pHead);
int inputData(STU_SCORE *pHead);
int scoreSort(STU_SCORE *pHead);
int scoreQuery(STU_SCORE *pHead);
int modify(STU_SCORE *pHead);
enum MAIN_CMD{REG,SEL=1,INPUT,QUERY,MODI,EXIT};
int main(int argc, char* argv[])
{
STU_SCORE *head=( STU_SCORE *)malloc(sizeof(STU_SCORE));
head->stuId=-1;
head->pnext=head;
while(1)
{
int cmd=mainMenu();
switch(cmd)
{
case REG:
stuReg(head);
break;
case SEL:
selCourse(head);
break;
case INPUT:
inputData(head);
break;
case QUERY:
scoreQuery(head);
break;
case MODI:
modify(head);
break;
case EXIT:
return 0;
}
}
return 0;
}
int mainMenu()
{
system("cls");
cout<<"\t\t《学生成绩管理系统》\n";
cout<<" \t\t[0]新生注册\n";
cout<<" \t\t[1]选课登记\n";
cout<<" \t\t[2]学生成绩输入\n";
cout<<" \t\t[3]成绩查询\n";
cout<<" \t\t[4]修改成绩\n";
cout<<" \t\t[5]退出\n";
cout<<"命令? ";
int cmd;
cin>>cmd;
return cmd;
}
//新生注册:建立学生信息链表,从键盘输入学生姓名学号,插入到链表中。
int stuReg(STU_SCORE *pHead)
{
cout<<"注意:新生注册学号不能重复!\n";
start:
//{
//。。。。。。
//}
cout<<"继续新的注册?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//学生选课
int selCourse(STU_SCORE *pHead)
{
start:
int cid;
cout<<"课程号:";
cin>>cid;
cout<<"输入选择该课程的学生学号\n";
int stuId;
cin>>stuId;
while(stuId>0)
{
STU_SCORE *pStu=pHead->pnext;
while(pStu!=pHead)//链表已有记录
{
if(pStu->stuId==stuId)//有该学号
{
bool be=false;
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)//已有选课
{
if(pcourse->courseId==cid)
{
be=true;////已有该选课
break;
}
pcourse=pcourse->pnext;
}
if(!be)
{ //还没有选此课程
SCORE *pNewcourse=(SCORE *)malloc(sizeof(SCORE));
//{
// 。。。。。。插入到选课链的头节点后
//}
}
}
pStu=pStu->pnext;
}
cin>>stuId;
}
int count=0;
STU_SCORE *pStu=pHead->pnext;
while(pStu!=pHead)//链表已有记录
{
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)
{
if(pcourse->courseId==cid)
{
count++;
}
pcourse=pcourse->pnext;
}
pStu=pStu->pnext;
}
cout<<"共有"<<count<<"个学生选此课程\n";
cout<<"继续新的选课输入?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//学生成绩输入
int inputData(STU_SCORE *pStuHead)
{
int count;
start:
count=0;
cout<<"课程号:";
int cid;
cin>>cid;
STU_SCORE *pStu=pStuHead->pnext;
while(pStu!=pStuHead)//if链表已有学生记录
{
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)
{
if(pcourse->courseId==cid)
{
cout<<"学号:"<<pStu->stuId<<" 姓名:"<<pStu->name;
cout<<" 成绩:";
if(pcourse->score>=0)
cout<<"已输入";
else
{
cin>>pcourse->score;
count++;
}
break;
}
pcourse=pcourse->pnext;
}
pStu=pStu->pnext;
}
if(count==0)
cout<<"该课程无学生选!\n";
else
cout<<cid<<"课程成绩已输入完成!"<<"\n";
cout<<"继续其他课程成绩输入?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//课程成绩查询
int scoreQuery(STU_SCORE *pStuHead)
{
//{
//。。。。。。
//}
return 0;
}
//课程成绩修改
int modify(STU_SCORE *pStuHead)
{
//{
//。。。。。。
//}
return 0;
}
实验内容:1)选课登记
2)动态输入学生成绩。
3)查询学生成绩。
4)修改成绩
运行效果:《学生成绩管理系统》
[0]新生注册
[1]选课登记
[2]学生成绩输入
[3]成绩查询
[4]修改成绩
[5]退出
命令?0
学号姓名
2001李1
2002李2
2003李3
-1
学生数据库共有3个个记录
继续新的注册? n (注:清屏返回主采单)
命令?1
课程号:1001
输入选择该课程的学生学号:
2001 2002-1
共有2个学生选此课程
继续新的选课输入? y
课程号:1002
输入选择该课程的学生学号:
2002 2003-1
共有2个学生选此课程
继续新的选课输入? n(注:清屏返回主采单)
命令?2
课程号:1001
学号:2001姓名:李1成绩:80
学号:2002姓名:李2成绩:90
1001课程成绩已输入完成
继续其他课程成绩输入? y
课程号:1002
学号:2003姓名:李3成绩:70
学号:2002姓名:李2成绩:60
1002课程成绩已输入完成
继续其他课程成绩输入? n(注:清屏返回主采单)
命令?3
学号: 2002
姓名:李2成绩:
课程号:1001 成绩:90
课程号:1002 成绩:60
继续查询?n (注:清屏并返回主采单)
命令?4
学号:2002 课程号:1001
原成绩: 90 成绩修改为:70
继续修改? n
命令:5(注:清屏并返回主采单)
实验提示:1)清屏方法:包含头文件#include <stdlib.h> 调用函数system("cls");
2)附录中有参考源代码
目的要求:本实验是较综合的实习,要求掌握结构体、指针、函数等基本知识,理解链表的实现技术,理解模块化程序设计方法。进行基本的综合的真实意义软件开发训练。可参考后面附录中的代码。
附:实验六部分参考源代码(//{ 。。。 //} 中间的代码要求自己完成)
#include "stdafx.h"
#include <iostream.h>
#include <stdlib.h>
using namespace std;
// 循环链表结构 head->[,->next]...[data0,->next][data1,->next]...[datan,->head]
struct SCORE
{
int courseId;
int score;
SCORE *pnext;
};
struct STU_SCORE
{
char name[16];
int stuId;
SCORE *scoreHead;//学生课程成绩列表
struct STU_SCORE *pnext;
};
int mainMenu();
int stuReg(STU_SCORE *pHead);
int selCourse(STU_SCORE *pHead);
int inputData(STU_SCORE *pHead);
int scoreSort(STU_SCORE *pHead);
int scoreQuery(STU_SCORE *pHead);
int modify(STU_SCORE *pHead);
enum MAIN_CMD{REG,SEL=1,INPUT,QUERY,MODI,EXIT};
int main(int argc, char* argv[])
{
STU_SCORE *head=( STU_SCORE *)malloc(sizeof(STU_SCORE));
head->stuId=-1;
head->pnext=head;
while(1)
{
int cmd=mainMenu();
switch(cmd)
{
case REG:
stuReg(head);
break;
case SEL:
selCourse(head);
break;
case INPUT:
inputData(head);
break;
case QUERY:
scoreQuery(head);
break;
case MODI:
modify(head);
break;
case EXIT:
return 0;
}
}
return 0;
}
int mainMenu()
{
system("cls");
cout<<"\t\t《学生成绩管理系统》\n";
cout<<" \t\t[0]新生注册\n";
cout<<" \t\t[1]选课登记\n";
cout<<" \t\t[2]学生成绩输入\n";
cout<<" \t\t[3]成绩查询\n";
cout<<" \t\t[4]修改成绩\n";
cout<<" \t\t[5]退出\n";
cout<<"命令? ";
int cmd;
cin>>cmd;
return cmd;
}
//新生注册:建立学生信息链表,从键盘输入学生姓名学号,插入到链表中。
int stuReg(STU_SCORE *pHead)
{
cout<<"注意:新生注册学号不能重复!\n";
start:
//{
//。。。。。。
//}
cout<<"继续新的注册?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//学生选课
int selCourse(STU_SCORE *pHead)
{
start:
int cid;
cout<<"课程号:";
cin>>cid;
cout<<"输入选择该课程的学生学号\n";
int stuId;
cin>>stuId;
while(stuId>0)
{
STU_SCORE *pStu=pHead->pnext;
while(pStu!=pHead)//链表已有记录
{
if(pStu->stuId==stuId)//有该学号
{
bool be=false;
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)//已有选课
{
if(pcourse->courseId==cid)
{
be=true;////已有该选课
break;
}
pcourse=pcourse->pnext;
}
if(!be)
{ //还没有选此课程
SCORE *pNewcourse=(SCORE *)malloc(sizeof(SCORE));
//{
// 。。。。。。插入到选课链的头节点后
//}
}
}
pStu=pStu->pnext;
}
cin>>stuId;
}
int count=0;
STU_SCORE *pStu=pHead->pnext;
while(pStu!=pHead)//链表已有记录
{
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)
{
if(pcourse->courseId==cid)
{
count++;
}
pcourse=pcourse->pnext;
}
pStu=pStu->pnext;
}
cout<<"共有"<<count<<"个学生选此课程\n";
cout<<"继续新的选课输入?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//学生成绩输入
int inputData(STU_SCORE *pStuHead)
{
int count;
start:
count=0;
cout<<"课程号:";
int cid;
cin>>cid;
STU_SCORE *pStu=pStuHead->pnext;
while(pStu!=pStuHead)//if链表已有学生记录
{
SCORE *pcourse=pStu->scoreHead->pnext;
while(pcourse!=pStu->scoreHead)
{
if(pcourse->courseId==cid)
{
cout<<"学号:"<<pStu->stuId<<" 姓名:"<<pStu->name;
cout<<" 成绩:";
if(pcourse->score>=0)
cout<<"已输入";
else
{
cin>>pcourse->score;
count++;
}
break;
}
pcourse=pcourse->pnext;
}
pStu=pStu->pnext;
}
if(count==0)
cout<<"该课程无学生选!\n";
else
cout<<cid<<"课程成绩已输入完成!"<<"\n";
cout<<"继续其他课程成绩输入?";
char c;
cin>>c;
if(c=='y'||c=='Y')goto start;
return 0;
}
//课程成绩查询
int scoreQuery(STU_SCORE *pStuHead)
{
//{
//。。。。。。
//}
return 0;
}
//课程成绩修改
int modify(STU_SCORE *pStuHead)
{
//{
//。。。。。。
//}
return 0;
}