仲恺农业技术学院
课程设计
论文题目学生选课系统
姓名林煜明
院(系)计算机科学与技术
专业班级计算机053
学号200510214303
指导教师陆谊
职称讲师
论文答辩日期2007年12月31日
仲恺农业技术学院教务处制
目录
一、需求与功能分析1
二、系统总体框架图1
三、模块设计与分析2
(一)前台学年选课端2
(二)后台老师管理端2
四、类的设计与分析3
五、类图及类的说明3
(一)Student类4
(二)Subject类5
六、特色算法分析7
七、功能测试9
八,心得和不足10
九,程序源代码12
(一)主函数部分:12
(二)Course.h部分14
(三)Student.h部分15
(四)Student.cpp部分15
(五)Studentdb.h部分18
(六)Subject.h部分18
(七)Subject.cpp部分19
(八)Subjectdb.h部分21
(九)Menu.h部分21
需求与功能分析
实现学生登录和老师的登录,学生可以进入学生的选修课系统学生端进行操作,老师可以在选修课系统管理端对学生的选课进行操作.
实现选修课系统学生端的选课功能,选课人数的查询,选课信息的查询,每个学生选课信息查询,课程被选的情况(最多不超30人).学生平均生绩的查询,选课后保存所有选课的数据功能,退出功能等.
实现选修课系统管理端登录()功能,老师可以增加学生,增加课程,删除学生和删除课程待操作,并且能填写课程成绩,更改课程学生等增加和修改功能,以及查看学生人数与每个学生的平均分,选课与每门课程平均分的功能和修改后对数据的保存,最后退出功能的实现.
此系统要有完整的数据查询,增加,修改和更新操作,并能方便学生的选课和老师的修改和查询,并有好的操作方法.
系统中的操作数据以流的方式流出到文件中进行保存和读取.
此系统在Windows平台下用C++语言进行开发和调试,并使系统能在Windows平台下运行并且工作.
系统总体框架图
模块设计与分析
根据选课系统的需求分析,可以将该系统划分为前台学生选课端模块和后台老师管理端模块这两大功能模块.
前台学年选课端
前台学生选课端模块实现学生选课选项,学生选课情况,课程选课情况,学生平均成绩,保存数据和退出系统等小模块.
学生选课选项
读取student.txt文件中的数据,判断是否有学生数据,如果有的话进行输出,输入学生姓名后,读取subject.txt文件中的数据,判断是否为空,如果有课程进行输出,并可以进行选课.
学生选课情况
读取student.txt文件和course.txt文件中的数据,显示学生始名和选课的情况(选了几门),最多可以选五门,每门都不能重选,输入学生姓名后可以查看学生选课的详细情况,比如平均成绩.
课程选课情况
读取subject.txt文件,显示课程名称和选此课程的人数.
学生平均分成绩
读取student.txt文件和course.txt文件中的数据,进行课程成绩计算,得出平均成绩并输出.
保存所有数据
把学生选课的内容还有学生的信息写到student.txt和course.txt和subject.txt件中去,把链表中的数据利用比较和循环的方法写到不同的文件中去.
退出系统
实行简单的退出.用exit(0)进行退出.
后台老师管理端
后台老师管理端模块实现老师的登录,增加学生和课程,删除学生和课程,填写某课程成绩,更改学分,查看学生人数与平均分,查看选课与平均分的情况等小模块.
增加学生选项
要求输入要增加学生的姓名,可以同名,把要增加的姓名写到student.txt文件里面去.
增加课程选项
要求输入要增加学生的姓名,可以同名,把要增加的姓名写到subject.txt文件里面去.
删除学生和课程
要求输入学生或课程号,这样可能进行判断是不是有这个同学或课程存在,如果没有就要说明一下,好里有就从student.txt或subject.txt文件中去删除这个同学或课程.
填写某课程成绩
输入某课程,然后判断些课程的存在性,然后在subject.txt中查找有没有这些课程的存在,如果有,在这个课程的同学都找出来,填写成绩后,把他输入到course.txt文件中.
更改程课的学分
从subjuect.txt中输出程课名,要求输入要更改的程课名,然后更改.
查看学生人数与平均分
从student.txt和course.txt中读出学生的姓名和总课程然后计算平均分成绩,然后进行输出.
查看选课与平均分
从subjuect.txt课程然后计算平均分成绩,然后进行输出.
类的设计与分析
为了进行真的能选课,我进了以下几个类进行设计,用student类来设计学生的属性和动作设计,用course.h和student.h和studentdb.h进行辅助设计,student类进行保存学生的姓名还有最多的课程等属性,还有动作操作,用subject类来设计学生可以选的课程,其中可以保存课程名,课程学分,课程的平程成绩,还有选课的最多人数,还有实际的学生数,其中还可以读出学生姓名,读出学分,读出课程名等操作.它用subject.h和subjectdb.h进行辅助设计,menu.h用来进行功能选项开发包括界面开发的功能.
类图及类的说明
Student类
classstudent
{
public:
student(),
student(course*cou,intfact,intmax),
voidreadname(charN[]),
voidgetname(charN[]),
voidwrecourse(charN[],floatscore),
floaterage(),
voidaddcourse(charN[],floatg),
intfindcourse(charN[]),
intretfactcourse(),
course*retroot(),
intretmaxcourse(),
voidclrroot(),
private:
charsname[20],
intmaxcourse,
intfactcourse,
course*root,
},
student类说明表
名称属性说明sname数据成员学生的姓名factcourse数据成员学生实际所学的课程数目maxcourse数据成员学生最多可以学五门课程root数据成员课程的根结点指针student()成员方法构造函数student(course*cou,intfact,intmax)成员方法重载voidreadname(charN[])成员方法读入学生的姓名voidgetname(charN[])成员方法得到学生的姓名voidwrecourse(charN[],floatscore)成员方法要据课程名写入学生课程的成绩floaterage()成员方法学生课程的平均成绩voidaddcourse(charN[],floatg)成员方法给学生增加一门课intfindcourse(charN[])成员方法查找是否已有此课程,如果有返回1,如果没有返回0intretfactcourse()成员方法得到所学的课程数目course*retroot()成员方法利用键表将所有的课程保存起来intretmaxcourse()成员方法得到所学的课程数目voidclrroot()成员方法清零Subject类
classsubject
{
public:
subject(),
floatreadcredit(),
voidgetcredit(floata),
floatgeterage(),
floatgetresult(charN[]),
voidgetkname(charN[]),
voidsetkname(charN[]),
voidfindstudent(studentdb*P),
studentname*retfirst(),
intretactivestudent(),
intretmaxstudent(),
voidclractivestud(),
private:
intmaxstudent,
intactivestud,
studentname*first,
floatcredit,
floateragerusult,
charkname[20],
},
subject类说明表
名称属性说明maxstudent数据成员最多学生数activestud数据成员实际学生数*first数据成员学生名单root数据成员该课程的学分credit数据成员该课程的平均成绩kname[20]数据成员该课程的名subject()成员方法构造函数floatreadcredit()成员方法得到课程的学分voidgetcredit(floata)成员方法设置学分floatgetresult(charN[])成员方法查找某个学生的成绩voidgetkname(charN[])成员方法读出课程的名称voidsetkname(charN[])成员方法读入课程的名称voidfindstudent(studentdb*P)成员方法根据该课程的名称,寻找选这课程的学生studentname*retfirst()成员方法返回根结点intretactivestudent()成员方法返回实际学生数intretmaxstudent()成员方法返回最多学生数30voidclractivestud()成员方法从文件中读出来后将实际学生数清零特色算法分析
在menu.h中的charmenu(chartemp)函数.
功能:实现可以用键盘来进行输入选择选项,用键盘的上下键进行选择然后按Enter键进行选择.
算法思路:在函数参数中把主函数的的键盘上下键和ENTER键的ASC码的值在函数中进行判断,然后用switch等case进行选择,返回字符'1''2''0'进行选择操作.
代码:
charmenu(chartemp)
{
intk等于0,
charc,
system("cls"),
cout<,<,endl<,<,endl,
cout<,<,"\t\t\t\tC++课程设计课题\n\n"<,<,endl,
cout<,<,"\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆c++选修课小系统☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆操作方式:☆\n",
if(temp等于等于72)
{
cout<,<,"\t\t☆→1.选修课系统学生端☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆2.选修课系统管理端☆\n",
}
if(temp等于等于80)
{
cout<,<,"\t\t☆1.选修课系统学生端☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆→2.选修课系统管理端☆\n",
}
cout<,<,"\t\t☆☆\n"
<,<,"\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"<,<,endl,
//上的asc码72下的asc码80
if(temp等于等于72)
returnc等于'1',
if(temp等于等于80)
returnc等于'2',
return0,
}
在menu.h中的password()函数.
功能:用来进行老师管理员进行输入和验证,如果输入三次不成绩就进行退出,在输入中错误可以进行修改后进行输入.
算法思路:用循环和条件语句进行判断.
代码:
voidpassword()
{
intk等于0,i,
charA[]等于"admin",//初始化
charB[10],
chara,
system("cls"),
for(i等于0,i<,8,i++)
cout<,<,endl,
while(k<,等于2)
{
printf("\t\t\t请输入管理员:"),
i等于0,
while(1)
{
a等于getch(),
if(a等于等于13)
break,
else
if(a等于等于8)
{
if(i>,0)
{
i--,
printf("\b\b"),
}
}
else
{
B[i]等于a,
i++,
printf("*"),
}
}
B[i]等于'\0',
if(strcmp(A,B)等于等于0)
return,
else
{
k++,
cerr<,<,"\n\n\t\t\t输入错误!请重新输入!\n"<,<,endl,
}
if(k>,等于3)
{
system("cls"),
cerr<,<,"\n\n\t\t\t输入错误超过三次!请按任意键退出.."<,<,endl,
getch(),
tuichu(),
}}}
功能测试
图6-1主界面测试图
图6-2学生端测试图
图6-3管理员登录测试图
图6-4管理端测试图
图6-5选课与平均分情况测试图
心得和不足
通过这次项目设计,我运用了这学期学习的全部知识,尽力完成这个任务.在做项目期间渐渐知道自已学习的知道不够,所以我在短短的时间里,通过网络,通过图书馆,学习更多我这个项目中要用到的新知识.大胆的通过自已学来的知识去实践,并不断地进步,项目也不断的在完善,在这期间我明白了:
所有的代码都有其适用范围.无论它们是如何正确,都只能在特定的场合发挥作用.
从简单开始,逐步求精,直至满足需求.
不能只准备一种解决手段应付关键性的工作.
如果某个方法无法奏效,则用有用的方法代替它.承认错识,从失败中总结经验教训,避免下次再犯同样的错误.
如果某个方法奏效,则在今后的工作中善用这个方法.
这些都是再简单不过的道理了,但对于一个编程者来说,却是当局者迷,常常犯这些错误.所以在这次项目设计中学习了这些道理,希望以后的编程道路中不再犯这样的错识.
还待完善的功能:
由于设计者水平有限及时间等方面的原因,该系统的功能比较简单,基本功能都可以完成,但是还有一些选课过程中要用到的功能可能还没有实现,同时在学生具有的详细数据,也没有进行深入的去探索.这些不足请老师多多谅解.今后设计者会更多的学习编程技巧,不断的提高程序设计水平.
程序源代码
主函数部分:
#include<,string.h>,
#include<,stdio.h>,
#include<,iostream.h>,
#include<,stdlib.h>,
#include<,iomanip.h>,
#include<,fstream.h>,
#include<,conio.h>,
#include"menu.h"
intmain()
{
subjectdb*P等于newsubjectdb,*Q等于P,
P->,Next等于NULL,
subjectM,
fstreamfile("subject.txt",ios::in),
while(1)//读入subjectdb
{
file.read((char*)&,M,sizeof(M)),
if(!file)break,
Q->,Next等于newsubjectdb,
Q->,Next->,Next等于NULL,
Q->,Next->,sub等于M,
Q等于Q->,Next,
}
file.close(),
studentdb*Y等于newstudentdb,*X等于Y,
Y->,Next等于NULL,
studentN,
courseO,
fstreamfile1("student.txt",ios::in),
fstreamfile2("course.txt",ios::in),
while(1)
{
file1.read((char*)&,N,sizeof(N)),
if(!file1)break,
Y->,Next等于newstudentdb,
Y->,Next->,Next等于NULL,
Y->,Next->,stu等于N,
inttime等于N.retfactcourse(),
Y->,Next->,stu.clrroot(),
while(time)
{
file2.read((char*)&,O,sizeof(course)),
if(!file2)break,
Y->,Next->,stu.addcourse(O.ame,O.grade),
time--,
}
Y等于Y->,Next,
}
file2.close(),
file1.close(),
Q等于P->,Next,
while(Q)
{
Q->,sub.clractivestud(),
Q->,sub.findstudent(X),
Q等于Q->,Next,
}
charc,b,temp等于72,temp1等于72,//temp和temp1用来保存上和下的标志
intbr等于1,
while(1)
{
b等于menu(temp1),
temp等于getch(),
if(temp等于等于72||temp等于等于80)
{
b等于menu(temp),
temp1等于temp,
}
if(temp等于等于13)
{
b等于menu(temp1),
break,
}
if(temp!等于72||temp!等于80)
continue,
}
if(b等于等于'1')
{
while(1)
{
c等于custom(),
switch(c)
{
case'1':br等于menu_1_1(X,P),getch(),break,//学生选课选项
case'2':br等于menu_1_2(X,P),getch(),break,//学生选课情况
case'3':br等于menu_1_3(P),getch(),break,//课程选课情况
case'4':br等于menu_2_7(X),getch(),break,//学生平均成绩
case'5':br等于menu_2_9(X,P),getch(),break,//保存数据
case'6':br等于menu_2_0(),break,//退出系统
}
if(br等于等于0)
break,
}
}
if(b等于等于'2')
{
password(),
while(1)
{
c等于server(),
switch(c)
{
case'1':br等于menu_2_1(X),getch(),break,//增加学生
case'2':br等于menu_2_2(P),getch(),break,//增加课程
case'4':br等于menu_2_4(P),getch(),break,//删除课程
case'3':br等于menu_2_3(X),getch(),break,//删除学生
case'5':br等于menu_2_5(X,P),getch(),break,//填写成绩
case'6':br等于menu_2_6(P),getch(),break,//更改学分
case'7':br等于menu_2_7(X),getch(),break,//学生情况
case'8':br等于menu_2_8(P),getch(),break,//选课情况
case'9':br等于menu_2_9(X,P),getch(),break,//保存数据
case'0':br等于menu_2_0(),break,//退出系统
}
if(br等于等于0)
break,
}
}
return0,
}Course.h部分
structcourse//某个学生所学的课程中的某一个
{
charame[20],//课程名称
floatgrade,//课程成绩
course*Next,//指向下一个课程的指针
},Student.h部分
#include<,string.h>,
#include"course.h"
classstudent
{
public:
student(),//构造体
student(course*cou,intfact,intmax),//重载
voidreadname(charN[]),//读入学生的姓名
voidgetname(charN[]),//得到学生的姓名
voidwrecourse(charN[],floatscore),//要据课程名写入学生课程的成绩
floaterage(),//学生课程的平均成绩
voidaddcourse(charN[],floatg),//给学生增加一门课
intfindcourse(charN[]),//查找是否已有此课程,如果有返回1,如果没有返回0
intretfactcourse(),//得到所学的课程数目
course*retroot(),//利用键表将所有的课程保存起来
intretmaxcourse(),//得到最多可学的课程数目
voidclrroot(),//清零
private:
charsname[20],//学生的姓名
intmaxcourse,//学生最多可以学五门课程
intfactcourse,//学生实际所学的课程数目
course*root,//课程的根结点指针
},Student.cpp部分
#include"student.h"
student::student()
{
root等于NULL,
constmaxcourse等于5,
factcourse等于0,
}
student::student(course*cou,intfact,intmax)
{
root等于cou,
constmaxcourse等于max,
factcourse等于fact,
}
voidstudent::readname(charN[])
{
strcpy(sname,N),
}
voidstudent::getname(charN[])
{
strcpy(N,sname),
}
voidstudent::wrecourse(charN[],floatscore)
{
course*p等于root,
if(p等于等于NULL)
return,
p等于p->,Next,
while(p)
{
if(strcmp(p->,ame,N)等于等于0)
p->,grade等于score,
p等于p->,Next,
}
}
floatstudent::erage()
{
floater等于0.0,
course*p等于root,
if(p等于等于NULL)
return0,
p等于p->,Next,
while(p)
{
er等于er+p->,grade,
p等于p->,Next,
}
er等于er/factcourse,
returner,
}
voidstudent::addcourse(charN[],floatg)
{
course*s等于newcourse,
s->,Next等于NULL,
if(root等于等于NULL)
root等于s,
course*p等于root,
course*newcourse等于newcourse,
newcourse->,Next等于p->,Next,
p->,Next等于newcourse,
strcpy(newcourse->,ame,N),
newcourse->,grade等于g,
factcourse++,
}
intstudent::findcourse(charN[])
{
course*p等于root,
if(root等于等于NULL)
return0,
p等于p->,Next,
while(p)
{
if(strcmp(p->,ame,N)等于等于0)
return1,
p等于p->,Next,
}
return0,
}
intstudent::retfactcourse()
{
returnfactcourse,
}
//得到所学的课程数目
course*student::retroot()
{
returnroot,//利用键表将所有的课程保存起来
}
intstudent::retmaxcourse()
{
return5,//得到最多可学的课程数目
}
voidstudent::clrroot()//清零
{
root等于NULL,
factcourse等于0,
}
Studentdb.h部分
#include"student.h"
structstudentdb
{
studentstu,
studentdb*Next,
},
structstudentname
{
chartname[20],//学生的名字
floatresult,//学生所得的该课程分数
studentname*Next,
},Subject.h部分
#include<,string.h>,
#include"studentdb.h"
classsubject
{
public:
subject()
{
first等于NULL,
maxstudent等于30,
activestud等于0,
}
floatreadcredit(),//得到课程的学分
voidgetcredit(floata),//设置学分
floatgeterage(),//得到学生的平均成绩
floatgetresult(charN[]),//查找某个学生的成绩
voidgetkname(charN[]),//读出课程的名称
voidsetkname(charN[]),//读入课程的名称
voidfindstudent(studentdb*P),//根据该课程的名称,寻找选这课程的学生
studentname*retfirst(),//返回根结点
intretactivestudent(),//返回实际学生数
intretmaxstudent(),//返回最多学生数30
voidclractivestud(),//从文件中读出来后将实际学生数清零
private:
intmaxstudent,//最多学生数
intactivestud,//实际学生数
有关论文范文主题研究: | 关于课程的论文范文文献 | 大学生适用: | 研究生毕业论文、学院论文 |
---|---|---|---|
相关参考文献下载数量: | 57 | 写作解决问题: | 本科论文怎么写 |
毕业论文开题报告: | 论文提纲、论文总结 | 职称论文适用: | 期刊发表、职称评初级 |
所属大学生专业类别: | 本科论文怎么写 | 论文题目推荐度: | 经典题目 |
studentname*first,//学生名单
floatcredit,//该课程的学分
floateragerusult,//该课程的平均成绩
charkname[20],//该课程的名称
},
Subject.cpp部分
#include"subject.h"
floatsubject::readcredit()
{
returncredit,
}
voidsubject::getcredit(floata)
{
credit等于a,
}
floatsubject::geterage()
{
floatk等于0.0,
studentname*p,
p等于first->,Next,
if(p等于等于NULL)
return0,
while(p)
{
k等于k+p->,result,
p等于p->,Next,
}
returnk/activestud,
}
floatsubject::getresult(charN[])
{
studentname*p,
p等于first,
while(p)
{
if(strcpy(p->,tname,N)等于等于0)
returnp->,result,
p等于p->,Next,
}
return-1,
}
voidsubject::getkname(charN[])
{
strcpy(N,kname),
}
voidsubject::setkname(charN[])
{
strcpy(kname,N),
}
voidsubject::findstudent(studentdb*P)
{
studentname*newcode等于newstudentname,
newcode->,Next等于NULL,
first等于newcode,
studentname*T等于first,
studentdb*K等于P->,Next,
while(K)
{
course*Y等于K->,stu.retroot(),
if(Y等于等于NULL)
{
K等于K->,Next,
continue,
}
if(Y!等于NULL)
Y等于Y->,Next,
while(Y)
{
if(strcmp(Y->,ame,kname)等于等于0)
{
studentname*Acode等于newstudentname,
charName[20],
K->,stu.getname(Name),
strcpy(Acode->,tname,Name),
Acode->,result等于Y->,grade,
Acode->,Next等于T->,Next,
T->,Next等于Acode,
activestud等于activestud+1,
break,
}
Y等于Y->,Next,
}
K等于K->,Next,
}
return,
}
studentname*subject::retfirst()
{
returnfirst,//返回根结点
}
intsubject::retactivestudent()
{
returnactivestud,//返回实际学生数
}
intsubject::retmaxstudent()
{
return30,//返回最多学生数30
}
voidsubject::clractivestud()
{
activestud等于0,//从文件中读出来后将实际学生数清零
}Subjectdb.h部分
#include"subject.h"
structsubjectdb
{
subjectsub,
subjectdb*Next,
},Menu.h部分
#include<,string.h>,
#include<,stdio.h>,
#include<,iostream.h>,
#include<,stdlib.h>,
#include<,iomanip.h>,
#include<,fstream.h>,
#include<,conio.h>,
#include"subjectdb.h"
///////////////////////////////////////////////////////////////////////////////////
voidtuichu()//退出
{
system("cls"),
cout<,<,"\n\n\t\t\t谢谢你使用c++选修课小系统\t再见!!\n\n"<,<,endl,
getch(),
exit(-1),
}
//////////////////////////////////////////////////////////////////////////////////
//总菜单
charmenu(chartemp)
{
intk等于0,
charc,
system("cls"),
cout<,<,endl<,<,endl,
cout<,<,"\t\t\t\tC++课程设计课题\n\n"<,<,endl,
cout<,<,"\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆c++选修课小系统☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆操作方式:☆\n",
if(temp等于等于72)
{
cout<,<,"\t\t☆→1.选修课系统学生端☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆2.选修课系统管理端☆\n",
}
if(temp等于等于80)
{
cout<,<,"\t\t☆1.选修课系统学生端☆\n"
<,<,"\t\t☆☆\n"
<,<,"\t\t☆→2.选修课系统管理端☆\n",
}
cout<,<,"\t\t☆☆\n"
<,<,"\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"<,<,endl,
//上的asc码72下的asc码80
if(temp等于等于72)
returnc等于'1',
if(temp等于等于80)
returnc等于'2',
return0,
}
///////////////////////////////////////////////////////////////////////////////////
//选修课系统端操作
charcustom()
{
charA[10],
charb,
chari,
intk等于0,
system("cls"),
cout<,<,"\n\n\n"
<,<,"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"
<,<,"☆☆\n"
<,<,"☆☆选修课系统学生端☆☆\n"
<,<,"☆☆\n"
<,<,"☆操作方式:☆\n"
<,<,"☆1.学生选课选项☆\n"
<,<,"☆2.学生选课情况☆\n"
<,<,"☆3.课程选课情况☆\n"
<,<,"☆4.学生平均成绩☆\n"
<,<,"☆5.保存所有数据☆\n"
<,<,"☆6.退出系统☆\n"
<,<,"☆☆\n"
<,<,"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"<,<,endl,
while(1)
{
cout<,<,"请选择操作方式:"<,<,endl,
cout<,<,"→",
cin>,>,A,
if(strlen(A)等于等于1)
{
for(i等于'1',i<,等于'6',i++)
{
b等于i,
if(b等于等于A[0])returnb,
}
}
cerr<,<,"\n\t\t\t\t输入有误!\n"<,<,endl,
k++,
if(k>,2)
{
system("cls"),
cerr<,<,"\n\n\t\t\t~~提示~~:错误输入超过三次!你将被强制退出!!\n"<,<,endl,
cout<,<,"\t\t按任意键继续"<,<,endl,
getch(),
tuichu(),
}
}
}
charserver()
{
charA[10],
charb,
chari,
intk等于0,
system("cls"),,
cout<,<,"\n\n\n"
<,<,"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"
<,<,"☆☆\n"
<,<,"☆☆选修课系统管理端☆☆\n"
<,<,"☆☆\n"
<,<,"☆操作方式:☆\n"
<,<,"☆1.增加某学生2.增加某课程☆\n"
<,<,"☆3.删除某学生4.删除某课程☆\n"
<,<,"☆5.填写某课程成绩6.更改课程学分☆\n"
<,<,"☆7.学生人数与平均分8.选课与平均分情况☆\n"
<,<,"☆9.保存数据0.退出系统☆\n"
<,<,"☆☆\n"
<,<,"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"<,<,endl,
while(1)
{
cout<,<,"请选择操作方式:"<,<,endl,
cout<,<,"→",
cin>,>,A,
if(strlen(A)等于等于1)
{
for(i等于'0',i<,等于'9',i++)
{
b等于(char)i,
if(b等于等于A[0])
returnb,
}
}
cerr<,<,"\n\t\t\t\t输入有误!\n"<,<,endl,,
k++,
if(k>,2)
{
cerr<,<,"错误输入超过三次!\n",
exit(-1),
}
}
}
//////////////////////////////////////////////////////////////////////////////////
//检查
voidpassword()
{
intk等于0,i,
charA[]等于"admin",//初始化
charB[10],
chara,
system("cls"),
for(i等于0,i<,8,i++)
cout<,<,endl,
while(k<,等于2)
{
printf("\t\t\t请输入管理员:"),
i等于0,
while(1)
{
a等于getch(),
if(a等于等于13)
break,
else
if(a等于等于8)
{
if(i>,0)
{
i--,
printf("\b\b"),
}
}
else
{
B[i]等于a,
i++,
printf("*"),
}
}
B[i]等于'\0',
if(strcmp(A,B)等于等于0)
return,
else
{
k++,
cerr<,<,"\n\n\t\t\t输入错误!请重新输入!\n"<,<,endl,
}
if(k>,等于3)
{
system("cls"),
cerr<,<,"\n\n\t\t\t输入错误超过三次!请按任意键退出.."<,<,endl,
getch(),
tuichu(),
}
}
}
intmenu_2_7(studentdb*P),//学生情况
intmenu_2_9(studentdb*Y,subjectdb*P),//保存数据
intmenu_2_8(subjectdb*P),//选课情况
//学生端功能函数
intmenu_1_1(studentdb*P,subjectdb*X)//学生选课
{
system("cls"),
cout<,<,"\n\n\t\t\t\t学生选课操作"<,<,endl,
studentdb*q等于P->,Next,
inti,count等于0,
charN[20],M[20],
if(q!等于NULL)
{
cout<,<,"\n\n\n所有学生名单如下:\n"<,<,endl,
}
else
{
cerr<,<,"\n\n\n对不起,暂时没有学生名单!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,stu.getname(N),
if(count%4等于等于0)
cout<,<,endl,
cout<,<,count+1<,<,"."<,<,N<,<,setw(10-strlen(N))<,<,"\t",
count++,
q等于q->,Next,
}
cout<,<,"\n\n总共"<,<,count<,<,"人!"<,<,endl,
q等于P->,Next,
if(q等于等于NULL)
return1,
cout<,<,"\n\n请输入学生姓名:",
cin>,>,N,
i等于0,
q等于P->,Next,
while(q)
{
q->,stu.getname(M),
if(strcmp(N,M)等于等于0)
i++,
q等于q->,Next,
}
intj等于0,k等于1,//k用来记录选取那一个学生姓名
if(i等于等于0)
{
cout<,<,"\n\n没有这个学生!!请按任意键返回.."<,<,endl,
return1,
}
elseif(i>,1)
{
cout<,<,"\n\n\t\t共找到"<,<,i<,<,"个姓名为"<,<,N<,<,"的学生"<,<,endl,
cout<,<,"\t\t选择第几个:",
cin>,>,k,
}
if(k>,i||k<,等于0)
{
cerr<,<,"\n\t输入有误!按任意键继续"<,<,endl,
return1,
}
q等于P->,Next,
j等于0,
while(q)
{
q->,stu.getname(M),
if(strcmp(N,M)等于等于0)
j++,
if(j等于等于k)
{
if(q->,stu.retfactcourse()>,等于q->,stu.retmaxcourse())
{
cout<,<,"\n\t\t所选课程已满!按任意键继续"<,<,endl,
return1,
}
else
{
subjectdb*t等于X->,Next,
charN1[20],
system("cls"),,
if(t!等于NULL)
{
cout<,<,"\n\n\n\t\t所有课程如下:"<,<,endl,
cout<,<,"\n\t\t\t\t课程名称\t\t学分"<,<,endl,
}
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有课程"<,<,endl,
return1,
}
while(t)
{
t->,sub.getkname(N1),
cout<,<,"\t\t\t\t"<,<,N1<,<,setw(26-strlen(N1))<,<,t->,sub.readcredit()<,<,endl,
t等于t->,Next,
}
charN2[20],
cout<,<,"\n\t输入你所要选的课程:",
cin>,>,N2,
t等于X->,Next,
while(t)
{
t->,sub.getkname(N1),
if(strcmp(N1,N2)等于等于0)
{
if(q->,stu.findcourse(N2)等于等于1)
{
cout<,<,"\n\t\t此课程你已选过了,不能再选.按任意键继续"<,<,endl,
return1,
}
if(t->,sub.retactivestudent()>,等于t->,sub.retmaxstudent())
{
cout<,<,"\n\t\t此课程已选满,不能选.按任意键继续"<,<,endl,
return1,
}
q->,stu.addcourse(N2,0.0),
cout<,<,"\n\n\t\t选课成功!按任意键继续"<,<,endl,
return1,
}
t等于t->,Next,
}
cerr<,<,"\n\t\t没有此课程!按任意键继续"<,<,endl,
}
return1,
}
q等于q->,Next,
}
return1,
}
intmenu_1_2(studentdb*P,subjectdb*X)//学生情况
{
studentdb*q等于P->,Next,
charN[20],
system("cls"),
cout<,<,"\n\n\t\t\t\t学生情况操作"<,<,endl,
inti,
if(q!等于NULL)
{
cout<,<,"\n\n\n\t\t所有学生选课信息如下:\n"<,<,endl<,<,endl,
cout<,<,"\t\t姓名\t\t\t选课情况\n"<,<,endl,
}
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有学生名单!!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,stu.getname(N),
cout<,<,"\t\t"<,<,N<,<,setw(25-strlen(N))<,<,"已选"<,<,q->,stu.retfactcourse()<,<,"门课"<,<,endl,
q等于q->,Next,
}
charM[20],
cout<,<,"\n\t\t输入要查看的学生姓名:",
cin>,>,M,
i等于0,
q等于P->,Next,
while(q)
{
q->,stu.getname(N),
if(strcmp(N,M)等于等于0)
i++,
q等于q->,Next,
}
intj等于0,k等于1,
if(i等于等于0)
{
cout<,<,"\n\t\t\t没找到这个学生!!请按任意键继续.."<,<,endl,
return1,
}
elseif(i>,1)
{
cout<,<,"\n\t\t共找到"<,<,i<,<,"个姓名为"<,<,M<,<,"的学生"<,<,endl,
cout<,<,"\t\t选择第几个:",
cin>,>,k,
}
if(k>,i||k<,等于0)
{
cerr<,<,"\n\t\t\t输入有误!按任意键继续.."<,<,endl,
return1,
}
q等于P->,Next,
j等于0,
q等于P->,Next,
while(q)
{
q->,stu.getname(N),
if(strcmp(N,M)等于等于0)
j++,
if(j等于等于k)
{
system("cls"),,
course*T等于q->,stu.retroot(),
if(T等于等于NULL)
{
cout<,<,"\n\n\n\t\t\t"<,<,N<,<,"同学你还未选课!请按任意键继续.."<,<,endl,
return1,
}
if(T!等于NULL)
T等于T->,Next,
cout<,<,"\n\n\n\t\t"<,<,N<,<,"同学你已选"<,<,q->,stu.retfactcourse()<,<,"门课,具体如下\n\n"<,<,endl,
cout<,<,"\t\t\t课程名称\t\t成绩\n"<,<,endl,
while(T)
{
cout<,<,"\t\t\t"<,<,T->,ame<,<,setw(25-strlen(T->,ame))<,<,T->,grade<,<,endl,
T等于T->,Next,
}
j等于0,
}
q等于q->,Next,
}
cout<,<,"\n\t\t请按任意键继续..."<,<,endl,
return1,
}
intmenu_1_3(subjectdb*P)//选课情况
{
subjectdb*q等于P->,Next,
charN[20],
system("cls"),
cout<,<,"\n\n\t\t\t\t选课情况操作"<,<,endl,
if(q!等于NULL)
{
cout<,<,"\n\n\n\t\t所有选课情况如下:\n"<,<,endl,
cout<,<,"\n\t\t\t课程名称\t\t选课人数\n"<,<,endl,
}
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有课程!!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,sub.getkname(N),
cout<,<,"\t\t\t"<,<,N<,<,setw(28-strlen(N))<,<,q->,sub.retactivestudent()<,<,endl,
q等于q->,Next,
}
cout<,<,"\n\t\t每门课程只能容纳30人,不能超过30个人!!"<,<,endl,
cout<,<,"\n\t\t请按任意键继续.."<,<,endl,
return1,
}
/////////////////////////////////////////////////////////////////////////////////////
//管理端功能函数
intmenu_2_1(studentdb*P)//增加学生
{
charN[20],
system("cls"),,
cout<,<,"\n\n\t\t\t\t增加学生操作\n"<,<,endl,
cout<,<,"\n\n\t\t请输入学生姓名:",
cin>,>,N,
cout<,<,endl<,<,"\t\t增加学生操作成功,按任意键继续"<,<,endl,
studentdb*newnode等于newstudentdb,
newnode->,Next等于P->,Next,
newnode->,stu.readname(N),
P->,Next等于newnode,
return1,
}
intmenu_2_2(subjectdb*P)//增加课程
{
floatk,
charN[20],M[20],
system("cls"),,
cout<,<,"\n\n\t\t\t\t增加课程操作\n"<,<,endl,
cout<,<,"\n\n\t\t请输入课程名称:",
cin>,>,N,
cout<,<,endl,
subjectdb*q等于P->,Next,
while(q)
{
q->,sub.getkname(M),
if(strcmp(N,M)等于等于0)
{
cout<,<,"\n\t\t此课程已经存在,按任意键继续"<,<,endl,
return1,
}
q等于q->,Next,
}
cout<,<,"\t\t输入此课程的学分:",
cin>,>,k,
cout<,<,"\n\t\t增加课程操作成功,按任意键继续"<,<,endl,
subjectdb*newnode等于newsubjectdb,
newnode->,Next等于P->,Next,
newnode->,sub.setkname(N),
newnode->,sub.getcredit(k),
P->,Next等于newnode,
return1,
}
intmenu_2_3(studentdb*P)//删除学生
{
system("cls"),
cout<,<,"\n\n\t\t\t\t删除学生操作"<,<,endl,
menu_2_7(P),
studentdb*q等于P->,Next,
if(q等于等于NULL)
return1,
inti,
charN[20],M[20],
cout<,<,"\n\t请输入要删除的学生姓名:",
cin>,>,N,
i等于0,
while(q)
{
q->,stu.getname(M),
if(strcmp(N,M)等于等于0)
i++,
q等于q->,Next,
}
intj等于0,k等于1,
if(i等于等于0)
{
cerr<,<,"\n\t\t没有这个学生!!请按任意键继续.."<,<,endl,
return1,
}
elseif(i>,1)
{
cout<,<,"\n\t\t共找到"<,<,i<,<,"个姓名为"<,<,N<,<,"的学生"<,<,endl,
cout<,<,"\n\t\t要删除第几个:",
cin>,>,k,
}
if(k>,i||k<,等于0)
return1,
q等于P->,Next,
studentdb*R等于P,
j等于0,
while(q)
{
q->,stu.getname(M),
if(strcmp(N,M)等于等于0)
j++,
if(j等于等于k)
{
R->,Next等于q->,Next,
free(q),
cout<,<,"\n\t\t删除学生操作成功,按任意键继续.."<,<,endl,
return1,
}
q等于q->,Next,
R等于R->,Next,
}
return1,
}
intmenu_2_4(subjectdb*P)//删除课程
{
subjectdb*q等于P->,Next,
charN[20],
system("cls"),,
cout<,<,"\n\n\t\t\t\t删除课程操作"<,<,endl,
if(q!等于NULL)
cout<,<,"\n\n\n\t\t所有课程如下:\n"<,<,endl,
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有课程!!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,sub.getkname(N),
cout<,<,"\t\t\t\t"<,<,N<,<,endl,
q等于q->,Next,
}
q等于P->,Next,
subjectdb*R等于P,
if(q等于等于NULL)
return1,
charM[20],
cout<,<,"\n\t请输入要删除的课程:",
cin>,>,M,
while(q)
{
q->,sub.getkname(N),
if(strcmp(N,M)等于等于0)
{
R->,Next等于q->,Next,
free(q),
cout<,<,"\n\t\t删除课程操作成功,按任意键继续"<,<,endl,
return1,
}
q等于q->,Next,
R等于R->,Next,
}
cerr<,<,"\n\t\t没有此课程!!\t请按任意键继续.."<,<,endl,
return1,
}
intmenu_2_5(studentdb*X,subjectdb*P)//填写成绩
{
subjectdb*q等于P->,Next,
charM[20],N[20],NA[20],
floatscore,
system("cls"),
cout<,<,"\n\n\t\t\t\t填写成绩操作\n"<,<,endl,
if(q!等于NULL)
cout<,<,"\n\t\t\t课程名称\t\t选课人数\n"<,<,endl,
else
{
cout<,<,"\n\n\n\t\t对不起,暂时没有任何选修课程.请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,sub.getkname(N),
cout<,<,"\t\t\t"<,<,N<,<,setw(28-strlen(N))<,<,q->,sub.retactivestudent()<,<,endl,
q等于q->,Next,
}
q等于P->,Next,
cout<,<,"\n\t请输入课程名称:",
cin>,>,M,
while(q)
{
q->,sub.getkname(N),
studentname*K等于q->,sub.retfirst(),
if(K!等于NULL)
K等于K->,Next,
if(strcmp(N,M)等于等于0)
{
system("cls"),,
if(K!等于NULL)
{
cout<,<,"\n\n\t\t请填写选修"<,<,M<,<,"的学生成绩\n"<,<,endl,
cout<,<,"\n\t\t\t姓名\t\t成绩"<,<,endl,
}
if(K等于等于NULL)
cerr<,<,"\n\t\t\t无任何信息!!请按任意键继续.."<,<,endl,
while(K)
{
cout<,<,"\n\t\t\t"<,<,K->,tname<,<,"\t\t",
cin>,>,score,
studentdb*XX等于X->,Next,
while(XX)
{
XX->,stu.getname(NA),
if(strcmp(NA,K->,tname)等于等于0)
XX->,stu.wrecourse(M,score),
XX等于XX->,Next,
}
K等于K->,Next,
}
if(K等于等于NULL)
cout<,<,"\n\t\t填写成绩完毕!!请按任意键继续.."<,<,endl,
return1,
}
q等于q->,Next,
}
cerr<,<,"\n\t\t没有此课程!!请按任意键继续.."<,<,endl,
return1,
}
intmenu_2_6(subjectdb*P)//更改学分
{
floatk,
system("cls"),
cout<,<,"\n\n\n\t\t\t\t更改学分操作\n"<,<,endl,
subjectdb*q等于P->,Next,
charN[20],M[20],
if(q!等于NULL)
cout<,<,"\n\n\n\t\t所有课程如下:\n"<,<,endl,
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有任何可选课程.请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,sub.getkname(N),
cout<,<,"\t\t\t\t"<,<,N<,<,endl,
q等于q->,Next,
}
q等于P->,Next,
cout<,<,"\n\n\n\t\t请输入要改的课程:",
cin>,>,M,
while(q)
{
q->,sub.getkname(N),
if(strcmp(N,M)等于等于0)
{
cout<,<,"\n\t\t\t原来学分为:"<,<,q->,sub.readcredit()<,<,endl,
cout<,<,"\n\t\t\t现要更改为:",
cin>,>,k,
q->,sub.getcredit(k),
cout<,<,"\n\t\t更改课程学分成功,按任意键继续"<,<,endl,
return1,
}
q等于q->,Next,
}
cerr<,<,"\n\t\t无此课程!!请按任意键继续.."<,<,endl,
return1,
}
intmenu_2_7(studentdb*P)//学生情况
{
studentdb*q等于P->,Next,
charN[20],
system("cls"),
intcount等于0,
cout<,<,"\n\n\t\t\t\t学生情况操作"<,<,endl,
if(q!等于NULL)
{
cout<,<,"\n\n\n\t\t所有学生平均成绩信息如下:\n"<,<,endl<,<,endl,
cout<,<,"\t\t姓名\t\t\t平均成绩\n"<,<,endl,
}
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有学生名单!!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,stu.getname(N),
cout<,<,"\t\t"<,<,N<,<,setw(25-strlen(N))<,<,""<,<,q->,stu.erage()<,<,"分"<,<,endl,
q等于q->,Next,
count++,
}
cout<,<,"\n\n总共"<,<,count<,<,"人!"<,<,endl,
cout<,<,"\n\t\t按任意键继续.."<,<,endl,
return1,
}
intmenu_2_8(subjectdb*P)//选课情况
{
subjectdb*q等于P->,Next,
charM[20],N[20],
system("cls"),
cout<,<,"\n\n\t\t\t\t选课情况操作"<,<,endl,
if(q!等于NULL)
{
cout<,<,"\n\n\n\t\t所有选课情况如下:\n"<,<,endl,
cout<,<,"\n\t\t\t课程名称\t\t选课人数\t平均分\n"<,<,endl,
}
else
{
cerr<,<,"\n\n\n\t\t对不起,暂时没有课程!!请按任意键继续.."<,<,endl,
return1,
}
while(q)
{
q->,sub.getkname(N),
cout<,<,"\t\t\t"<,<,N<,<,setw(28-strlen(N))<,<,q->,sub.retactivestudent()<,<,"\t\t"<,<,q->,sub.geterage()<,<,endl,
q等于q->,Next,
}
q等于P->,Next,
cout<,<,"\n\t请输入课程名称:",
cin>,>,M,
while(q)
{
q->,sub.getkname(N),
studentname*K等于q->,sub.retfirst(),
if(K!等于NULL)
K等于K->,Next,
if(strcmp(N,M)等于等于0)
{
system("cls"),,
if(K等于等于NULL)
{
cerr<,<,"\n\n\t无任何选课信息!!\t请按任意键继续.."<,<,endl,
return1,
}
cout<,<,"\n\n\n\t\t选修"<,<,M<,<,"课的学生名单如下:\n"<,<,endl,
cout<,<,"\n\t\t\t姓名\t\t成绩"<,<,endl,
while(K)
{
cout<,<,"\n\t\t\t"<,<,K->,tname<,<,setw(20-strlen(K->,tname))<,<,K->,result<,<,endl,
K等于K->,Next,
}
cout<,<,"\n\t\t请按任意键继续.."<,<,endl,
return1,
}
q等于q->,Next,
}
cerr<,<,"\n\t\t无此课程!!\t请按任意键继续.."<,<,endl,
return1,
}
intmenu_2_9(studentdb*Y,subjectdb*P)//保存数据
{
studentdb*Z等于Y->,Next,
subjectdb*X等于P->,Next,
system("cls"),,
fstreamfile("subject.txt",ios::out),
while(X)
{
file.write((char*)&,(X->,sub),sizeof(X->,sub)),
X等于X->,Next,
}
file.close(),
fstreamfile1("student.txt",ios::out),
fstreamfile2("course.txt",ios::out),
while(Z)
{
file1.write((char*)&,(Z->,stu),sizeof(Z->,stu)),
inttime等于Z->,stu.retfactcourse(),
course*co等于Z->,stu.retroot(),*co1,
if(co!等于NULL)
co1等于co->,Next,
while(time)
{
file2.write((char*)(co1),sizeof(*co1)),
co1等于co1->,Next,
time等于time-1,
}
Z等于Z->,Next,
}
file2.close(),
file1.close(),
cout<,<,"\n\n\n\t\t\t保存数据成功!按任意键继续.."<,<,endl,
return1,
}
intmenu_2_0()//退出系统
{
tuichu(),
return0,
}
2
23
选课与平均分情况
人数与平均分情况
更改课程学分
填写课程成绩
删除学生或课程
增加学生或课程
老师登录介面
退出系统
保存所有数据
学生平均成绩
课程选课情况
学生选课情况
学生选课选项
系统管理端
系统学生端
学生选课系统