学生学籍管理系统c++课程设计.docx
《学生学籍管理系统c++课程设计.docx》由会员分享,可在线阅读,更多相关《学生学籍管理系统c++课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
![学生学籍管理系统c++课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/9/dac14591-4cd9-4649-bf96-a070656fe359/dac14591-4cd9-4649-bf96-a070656fe3591.gif)
学生学籍管理系统c++课程设计
《学生学籍管理系统》
程序设计基础课程设计报告
专业:
班级:
学号:
姓名:
指导教师:
二OO八年六月二十六日
C++课程设计—-学籍管理系统实验报告
1、对C++设计的《学生学籍管理系统》总体说明
我这次做的课程设计是《学生学籍管理系统》,本程序采用C++程序语言编写,运用了基于对象和面向对象的程序设计。
它主要是完成对学生的基本信息和成绩进行录入、查询和删除功能。
实施起来简单快捷,虽然程序简单,但可以作为老师的辅助软件对学生的基本信息和各科成绩进行管理.
2、总体设计
本程序的流程图如下:
3、对《学生学籍管理系统》的介绍
(1)具体功能:
a)数据录入功能:
对B。
TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据.综合成绩、学分由程序根据条件自动运算
(2)查询功能:
分为学生基本情况查询和成绩查询两种:
A:
学生基本情况查询:
A1-—--输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
A2-—-输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
B:
成绩查询:
B1:
输入一个学号时,查询出此生的所有课程情况,格式如下:
学号:
xx姓名:
xxxxx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
………………………
共修:
xx科,实得总学分为:
xxx
b)删除功能:
当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息.
c)排序功能:
能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
(2)源程序说明:
源程序清单及注释如下:
#include
#include
#include〈iomanip>
usingnamespacestd;
classBasic
{
public:
virtualintinput(ifstream&its)=0;
virtualvoidinput()=0;
virtualvoiddisplay(ofstream&its)=0;
virtualvoiddisplay()=0;
virtualvoiddisplay_1(){}
friendclassCollege;
protected:
//把这些数放在这,方便调用
Basic*next;//指针
intnumber;//学号
charname[40];//姓名
intdom_number;//宿舍号
doublemark;//综合成绩
intcredit;//实得学分
};
classStudent:
virtualpublicBasic
{
public:
intinput(ifstream&its)//输入流
{
its〉>number;
if(number==-1)
return0;
else
{
its>>name>〉sex〉〉dom_number〉〉phone_number;
return1;
}
}
voidinput()//输入
{
cout<〈"学号:
";
cin〉>number;
cout〈<"姓名:
”;
cin〉〉name;
cout<<”性别:
";
cin>>sex;
cout〈<"宿舍号码:
”;
cin>〉dom_number;
cout<<”电话号码:
";
cin>>phone_number;
}
voiddisplay(ofstream&its)//输出流
{
its〈}
voiddisplay()//输出
{
cout〈}
private:
charsex[5];//性别
charphone_number[20];//电话号码
};
classCourse:
virtualpublicBasic
{
public:
intinput(ifstream&its)//输入流函数
{
its〉>number;
if(number==-1)
return0;
else
{
its>〉chass_number>〉chass_name〉>
chass_mark〉>peacetime_mark>〉experiment_mark〉〉txt_mark;
account();
return1;
}
}
voidinput()//输入函数
{
cout〈〈”学号=";
cin〉>number;
cout〈〈"课程编号=”;
cin>〉chass_number;
cout〈〈"课程名称=”;
cin>〉chass_name;
cout<〈”学分=";
cin>>chass_mark;
cout<<”平时成绩=”;
cin>〉peacetime_mark;
cout<<"实验成绩=";
cin〉〉experiment_mark;
cout〈<”卷面成绩=”;
cin〉〉txt_mark;
account();
}
voidaccount()//计算综合成绩和实得学分
{
inti;
if(experiment_mark==-1)
mark=peacetime_mark*0.15+experiment_mark*0。
15+txt_mark*0.7;
elsemark=peacetime_mark=peacetime_mark*0.3+txt_mark*0。
7;
i=mark/10;
switch(i)
{
case10:
credit=chass_mark;break;
case9:
credit=chass_mark;break;
case8:
credit=chass_mark*0。
8;break;
case7:
credit=chass_mark*0.7;break;
case6:
credit=chass_mark*0.6;break;
default:
credit=0;break;
}
}
voiddisplay(ofstream&its)//输出流函数
{
its〈〈number<〈"”<peacetime_mark〈〈""〈}
voiddisplay()//输出函数
{
cout〈〈number〈peacetime_mark〈}
voiddisplay_1()
{
cout〈<"课程编号:
"<"<<<"”〈<"综合成绩:
”〈〈mark<<"”〈〈”实得学分:
"〈}
private:
charchass_number[30];//课程编号
charchass_name[30];//课程名称
intchass_mark;//学分
intpeacetime_mark;//平时成绩
intexperiment_mark;//实验成绩
inttxt_mark;//卷面成绩
};
classCollege//链表类
{
public:
College(inti)//构造函数建立初链,i=0建立Student链表,i=1建立Course链表
{
ji=0;
Basic*p;
intt;
PL=i;
if(PL==0)//根据PL,打开相应的文件
{
f。
open("A。
txt”,ios:
:
in);
head=newStudent;
p=newStudent;
}
else
{
f.open("B。
txt”,ios:
:
in);
head=newCourse;
p=newCourse;
}
if(!
f)//判断f是否打开文件
{
cout<〈”错误"〈abort();
}
t=head—〉input(f);
head-〉next=p;
p-〉next=NULL;
for(;;)//读入文件数据,并将数据插入链表中
{
if(i==0)
p=newStudent;
elsep=newCourse;
t=p->input(f);
if(t==0)
break;
head=Build(p);
}
f.close();//关闭文件
}
~College()
{
save();
}
Basic*Build(Basic*p)//插入函数,将p有序的插入链表中
{
Basic*p1=head,*p2=head;
inti;
for(i=0;p1->next!
=NULL;i++)
{
if(i==0&&p—〉numbernumber)//处理头链
{
p—〉next=p1;
head=p;
ji++;
break;
}
elseif(p—>number{
p2—>next=p;
p->next=p1;
ji++;
break;
}
elseif(i==ji)//处理尾
{
p2=p1;
p1=p1—>next;
p2—>next=p;
p->next=p1;
ji++;
break;
}
p2=p1;
p1=p1—〉next;
}
returnhead;
}
voiddisplay()//输出链表信息
{
Basic*a=head;
for(;a—〉next!
=NULL;a=a->next)
a->display();
}
voidfind_number()//查找学号(student)
{
inti;
Basic*h=head;
cout〈〈"请输入你想找的学号:
”;
cin〉>i;
for(;h-〉next!
=NULL;h=h-〉next)
{
if(h—>number==i)
{
h—〉display();
break;
}
}
}
voidfind_name()//查找姓名(student)
{
chari[40];
Basic*h=head;
cout〈<"请输入你想找的姓名:
";
cin>>i;
for(;h—>next!
=NULL;h=h->next)
{
if(strcmp(h—〉name,i)==0)
{
h-〉display();
break;
}
}
}
voidfind_dom_number()//查找宿舍号码(student)
{
inti;
Basic*h=head;
cout〈〈"请输入你想找的宿舍号码:
";
cin>〉i;
for(;h-〉next!
=NULL;h=h—〉next)
if(h-〉dom_number==i)
h->display();
}
Basic*get_head()
{
returnhead;
}
voidfind(Basic*a)//输入一个学号时,查询出此生的所有课程情况(Course)
{
inti;
Basic*h=head;
cout〈〈"请输入你想查的学号:
”;
cin>〉i;
for(;a-〉next!
=NULL;a=a->next)
{
if(a-〉number==i)
{
cout<<”学号:
”〈
cout<<”姓名:
”<break;
}
}
for(;h-〉next!
=NULL;h=h-〉next)
if(h—〉number==i)
h—>display_1();
}
voidDelete(intj)//删除,j表示学号
{
Basic*p1=head,*p2=head;
inti=0;
for(;p1—>next!
=NULL;)
{
if(i==0&&p1—>number==j)//处理头
{
head=p1->next;
i=-1;//保证下次还可以删除头链
}
elseif(p1—〉number==j)//处理尾
{
p2-〉next=p1->next;
}
p2=p1;
p1=p1-〉next;
i++;
}
}
voiddelete_student(College&b)//当在A.TXT中删除一个学生时,自动地在B。
TXT中删除此人所有信息(student)
{
inti;
cout〈〈”请输入你想删除的学生的学号:
”;
cin>〉i;
Delete(i);
b。
Delete(i);
}
voidtaxis_mark()//综合成绩排序(Course)
{
Basic*a=head;
Basic*m[90],*t;
inti,j,k,b;
cout〈<”升序-1降序-2”<cin〉〉b;
if(b==1)//升序
{
for(i=0;a->next!
=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j〈i;j++)
for(k=j;k〈i;k++)
{
if(m[j]->mark〉m[k]—〉mark)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout〈〈”按综合成绩升序排序为”<〈endl;
for(j=0;j
m[j]—>display();
}
elseif(b==2)//降序
{
for(i=0;a—>next!
=NULL;i++)
{
m[i]=a;
a=a-〉next;
}
for(j=0;j〈i;j++)
for(k=j;k〈i;k++)
{
if(m[j]—>mark〈m[k]->mark)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout〈<"按综合成绩降序排序为”〈for(j=0;j〈i;j++)
m[j]—〉display();
}
}
voidtaxis_credit()//学分排序(Course)
{
Basic*a=head;
Basic*m[90],*t;
inti,j,k,b;
cout〈〈"升序-1降序—2"〈〈endl;
cin>〉b;
if(b==1)//升序
{
for(i=0;a—〉next!
=NULL;i++)
{
m[i]=a;
a=a—〉next;
}
for(j=0;j
for(k=j;k〈i;k++)
{
if(m[j]—>credit〉m[k]—〉credit)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout<<”按学分升序排序为"〈for(j=0;j〈i;j++)
m[j]-〉display();
}
elseif(b==2)//降序
{
for(i=0;a—>next!
=NULL;i++)
{
m[i]=a;
a=a->next;
}
for(j=0;j〈i;j++)
for(k=j;k
{
if(m[j]—〉credit〈m[k]-〉credit)
{
t=m[j];
m[j]=m[k];
m[k]=t;
}
}
cout〈〈”按学分降序排序为"<〈endl;
for(j=0;j〈i;j++)
m[j]-〉display();
}
}
voidsave()//保存函数
{
Basic*h=head;
inti=-1;
if(PL==0)
s。
open(”A.txt",ios:
:
out);
elseif(PL==1)
s。
open("B。
txt",ios:
:
out);
for(;h-〉next!
=NULL;h=h-〉next)
h—〉display(s);
s<〈i<s。
close();
}
private:
ifstreamf;
ofstreams;
Basic*head;//链表的头指针
intji;//计算插入的数
intPL;//判断建立怎样的链表
};
intmain()
{
inti,k[10];
Course*c;
Collegea(0),b
(1);
cout〈〈"*************************欢迎进入!
**********************”<cout<<”*************************学籍管理系统**********************"<cout〈〈"****************"〈〈endl;
cout<<"****************”<〈endl;
to:
cout〈<”********<1>录入〈2〉查询〈3〉删除********"<cout〈<"****************”<cout〈〈"********〈4>排序<5>全部输出<其他〉结束********"<〈endl;
cout<〈"****************”〈cout<〈" ****************"<cout〈<” ***********************************************************"〈〈endl;
cin>>i;
if(i==1)
{
c=newCourse;
c—〉input();
b.Build(c);
gototo;
}
elseif(i==2)
{
cout<〈”1—学生基本情况查询2-成绩查询”〈cin>>k[0];
if(k[0]==1)
{
cout<<"1—学号查询2-姓名查询3—宿舍号码查询"〈cin〉〉k[1];
if(k[1]==1)
a.find_number();
elseif(k[1]==2)
a.find_name();
elseif(k[1]==3)
a。
find_dom_number();
gototo;
}
elseif(k[0]==2)
b。
find(a。
get_head());
gototo;
}
elseif(i==3)
{
a。
delete_student(b);
gototo;
}
elseif(i==4)
{
cout<<”1—综合成绩排序2-实得学分排序"〈〈endl;
cin>〉k[2];
if(k[2]==2)
b.taxis_credit();
elseif(k[2]==1)
b。
taxis_mark();
gototo;
}
elseif(i==5)
{
cout〈〈”学号姓名性别宿舍号码电话号码"<a。
display();
cout〈cout<<"学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分”<〈endl;
b。
display();
gototo;
}
return0;
}
4、遇到问题及解决方案
本程序是运用类编写但与平时作业不同的是难度较大,涉及内容较广。
特别是要用到动态链表和对文件进行操作.而链表老师只是平