中南大学
本科生课程设计(实践)任务书、设计报告
(C++程序设计)
计算机基础教学实验中心
20##年 7月 4日
目录
一. 任务描述
l 目的
l 意义
二. 系统设计思想
l 系统框架
l 系统功能
三. 设计过程
四. 运行情况
五. 心得体会
六. 参考文献
一.任务描述
1.1目的
本课程设计的目的是培养应用《面向对象程序设计》设计方法及思想解决实际问题的能力,掌握使用面向对象程序设计语言C++,熟悉面向对象开发平台Visual C++6.0,提高调查研究、查阅技术资料以及编写技术文献的能力。
1.2意义
C++是实践性很强的课程。课程设计是加强我们实践能力的一个强有力手段。课程设计要求我们在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于我们基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
二.系统设计思想
2.1系统框架
2.2系统功能
1、用C++语言实现系统;
2、对学生信息(包括学号、姓名、性别、英语、数学、c++、计算机基础、)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出。
3、要求设计的管理系统能够完成以下功能:
(1)、每一条记录包括一个学生的学号、姓名、(至少)4门课成绩。
(2)、成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录的输入。)
(3)、成绩信息显示浏览功能:完成全部学生记录的显示。
(4)、查询功能:完成按姓名或学号查找学生记录,并显示。
(5)、成绩信息的删除:按姓名或学号进行删除某学生的成绩.
(6)、排序功能:按学生学号或总成绩(从小到大)进行排序。
(7)、应提供一个界面来调用各个功能,调用界面和各个功能的
操作界面应尽可能清晰美观!
三.设计过程
1.主界面的设计:
在主界面中包括“输入学生成绩 显示统计数据 查找学生成绩 修改学生成绩 删除学生成绩 插入学生成绩 按平均分降序排列 显示全部学生成绩 退出本系统”等全部的功能,之所以设计这么一个主界面,一是因为能使用户对程序操作的流程更加清楚简明,二是保证了用户同时只能对一个文件进行操作的系统要求,保证了系统不会发生打开文件紊乱或者出现致命错误。每个函数的具体功能:
1)主函数main():定义学生结构体数组,调用录入、统计等函数对成绩表进行处理;
2)录入函数Input():输入班级各个课成绩;
3)统计函数Statistic():计算平均成绩;
4)查询函数Lookup():查询指定学号学生成绩记录;
5)修改函数Modify():修改指定学号学生成绩记录;
6)删除函数Delete():删除指定学号学生记录;
7)输出函数Output():输出班级所有学生成绩记录;
8) 排序函数Sort():按平均分对学生成绩记录项进行降序排序;
9)插入函数Insert():按平均分顺序插入新记录。
2.运行情况
1).主界面
2)输入学生信息
3.“基本界面”的命名
void DIALOG1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DIALOG1)
DDX_Text(pDX, IDC_EDIT1, m_e1);
DDX_Text(pDX, IDC_EDIT2, m_e2);
DDX_Text(pDX, IDC_EDIT3, m_e3);
DDX_Text(pDX, IDC_EDIT4, m_e4);
DDX_Text(pDX, IDC_EDIT7, m_e5);
DDX_Text(pDX, IDC_EDIT8, m_e6);
DDX_Text(pDX, IDC_EDIT9, m_e7);
DDX_Text(pDX, IDC_EDIT10, m_e8);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DIALOG1, CDialog)
//{{AFX_MSG_MAP(DIALOG1)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_Input, OnInput)
ON_BN_CLICKED(IDC_Lookup, OnLookup)
ON_BN_CLICKED(IDC_Delect, OnDelect)
ON_BN_CLICKED(IDC_Delete, OnDelete)
ON_BN_CLICKED(IDC_Modify, OnModify)
ON_BN_CLICKED(IDC_OK, OnOk)
ON_BN_CLICKED(IDC_Cancel, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4.各个部分的代码
1)“输入”命令按钮的代码.
void DIALOG1::OnInput()
{
// TODO: Add your control notification handler code here
system("cls"); /*运行前清屏*/
int i=0;
int flag;
char sign;
cout<<endl<<"====>> 请输入学生成绩 <<===="<<endl;
while(sign!='n'&&sign!='N') /*判断*/
{
loop:
cout<<" 学号:";
cin>>stud[i].num;
int c=0;
while(c<i)
{
c++;
if(stud[i].num==stud[i-c].num)
{
cout<<" 你输入的学号已经存在!请重新输入。"<<endl;
goto loop;
}
}
cout<<" 姓名:";
cin>>stud[i].name;
cout<<" 性别:";
cin>>stud[i].sex;
do{
flag=0;
cout<<" 英语成绩:";
cin>>stud[i].english;
if(stud[i].english>100 ||stud[i].english<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
flag=1;
}while(flag==0);
do{
flag=0;
cout<<" 数学成绩:";
cin>>stud[i].math;
if(stud[i].math>100 ||stud[i].math<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
flag=1;
}while(flag==0);
do{
flag=0;
cout<<" C++成绩:";
cin>>stud[i].c;
if(stud[i].c>100 ||stud[i].c<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
flag=1;
}while(flag==0);
do{
flag=0;
cout<<"计算机基础成绩:";
cin>>stud[i].computer;
if(stud[i].computer>100 ||stud[i].computer<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
flag=1;
}while(flag==0);
stud[i].average=(stud[i].english+stud[i].math+stud[i].c+stud[i].computer)/4;
cout<<" 平均分为:"<<stud[i].average<<endl;
cout<<"====>提示:是否继续写入学生成绩?(Y/N)";
cin>>sign; /*输入判断*/
i++;
}
Write(stud,i);
}
2)“查找”命令按钮代码
void DIALOG1::OnLookup()
{
// TODO: Add your control notification handler code here
system("cls"); /*运行前清屏*/
int n=Read(stud);
int s;
int i=0;
cout<<endl<<"====>> 查找学生成绩 <<===="<<endl;
cout<<"请输入需要查找学生的学号:"<<endl;
cin>>s;
while((stud[i].num-s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
cout<<"=====>提示:对不起,无法找到该学生的信息!"<<endl; /*输入失败信息*/
}
else
{
cout<<"---------------------------"<<endl;
cout<<"学号:"<<stud[i].num<<endl; /*输出该学生信息*/
cout<<"姓名:"<<stud[i].name<<endl;
cout<<"性别:"<<stud[i].sex<<endl;
cout<<"英语:"<<stud[i].english<<endl;
cout<<"数学:"<<stud[i].math<<endl;
cout<<"C++:"<<stud[i].c<<endl;
cout<<"计算机技术:"<<stud[i].computer<<endl;
cout<<"平均分:"<<stud[i].average<<endl;
}
}
3)“删除”命令按钮代码
void DIALOG1::OnDelete()
{
system("cls"); /*运行前清屏*/
int n=Read(stud);
int s;
int i=0,j;
cout<<endl<<"====>> 删除学生成绩 <<===="<<endl;
cout<<"请输入需要删除学生的学号:"<<endl; /*交互式问寻*/
cin>>s;
while((stud[i].num-s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
cout<<"====>提示:对不起,无法找到该学生……"<<endl; /*返回失败信息*/
}
else
{
for(j=i;j<n-1;j++) /*删除操作*/
{
stud[j].num=stud[j+1].num;
strcpy(stud[j].name,stud[j+1].name);
strcpy(stud[j].sex,stud[j+1].sex);
stud[j].english=stud[j+1].english;
stud[j].math=stud[j+1].math;
stud[j].c=stud[j+1].c;
stud[j].computer=stud[j+1].computer;
stud[j].average=stud[j+1].average;
}
cout<<"====>提示:已成功删除!"<<endl; /*返回成功信息*/
}
Write(stud,n-1); // TODO: Add your control notification handler code here
}
4)“修改”命令按钮代码
void DIALOG1::OnModify()
{
// TODO: Add your control notification handler code here
system("cls"); /*运行前清屏*/
int n=Read(stud);
int s;
int i=0;
cout<<endl<<"====>> 修改学生成绩 <<===="<<endl;
cout<<"请输入需要修改成绩学生的学号:"<<endl;
cin>>s;
while((stud[i].num-s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
cout<<"=====>提示:对不起,无该学生的成绩……"<<endl; /*输入失败信息*/
}
else
{
cout<<"----------该学生的信息----------"<<endl; /*格式头*/
cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"性别"<<"\t"<<"英语"<<"\t"<<" 数学"<<"\t"<<"C++"<<"\t"<<"计算机基础"<<"\t"<<"平均分"<<endl;
cout<<"---------------------------------"<<endl;
cout<<stud[i].num<<"\t"<<stud[i].name<<"\t"<<stud[i].sex<<"\t"<<stud[i].english<<"\t"<<stud[i].math<<"\t"<<stud[i].c<<"\t"<<stud[i].computer<<"\t"<<stud[i].average<<endl;
cout<<"请重新输入该学生的信息"<<endl;
cout<<"学号:"<<endl; /*交互输入*/
cin>>stud[i].num;
cout<<"姓名:"<<endl;
cin>>stud[i].name;
cout<<"性别:"<<endl;
cin>>stud[i].sex;
cout<<"英语成绩:"<<endl;
cin>>stud[i].english;
cout<<"数学成绩:"<<endl;
cin>>stud[i].math;
cout<<"C++成绩:"<<endl;
cin>>stud[i].c;
cout<<"计算机基础成绩:"<<endl;
cin>>stud[i].computer;
stud[i].average=(stud[i].english+stud[i].math+stud[i].c+stud[i].computer)/4;
cout<<"平均分为:"<<stud[i].average<<endl;
char c;
cout<<"是否保存数据?(y/n)"<<endl;
cin>>c;
if(c!='n'&&c!='N')
Write(stud,n);
}
}
5)“确定”命令按钮代码
void DIALOG1::OnOk()
{
// TODO: Add your control notification handler code here
if (FOUNCTION==Input)
{
Input();
}
else if(FOUNCTION==Modify)
{
Modify();
}
else if(FOUNCTION==Delete)
{
Delete();
}
else if(FOUNCTION==Lookup)
{
Lookup();
}
}
6)“删除”命令按钮代码
void DIALOG1::OnCancel()
{
// TODO: Add your control notification handler code here
_variriant_t var;
CString str;
FOUNCTION=NONE;
if(m_pRecordset->BOF)
{m_btnAdd.SetState(false);
return;
}
m_btnInput.EnableWindow(true);
m_btnAdd.EnableWindow(true);
m_btnDelete.EnableWindow(true);
m_btnModify.EnableWindow(true);
m_btnInput.SetState(false);
m_btnAdd.SetState(false);
m_btnDelete.SetState(false);
m_btnModify.SetState(false);
m_ctlSID.SetReadOnly(FALSE);
m_ctlCID.SetReadOnly(FALSE);
M_BTNoK.SetFocus();
if(m_pRecordset->adoEOF)
{
m_pRecordset->MoveLast();
}
try
{
var=m_pRecordset->GetCollect("CID");
if(var.vt !=VT_NULL)
m_CID=var.iVal;
var=m_pRecordset->GetCollect("SID");
if(var.vt !=VT_NULL)
m_CID=var.iVal;
var=m_pRecordset->GetCollect("IsPass");
if(var.vt !=VT_NULL)
m_IsPass=var.iVal;
var=m_pRecordset->GetCollect("Score");
m_Score=var.iVal;
UpdateData(false);
}
catch(_com_error *e)
{
AffxmessageBox(e->ErrorMessage());
}
}
7)主函数代码
class Stu //构建学生类
{
public:
friend void Input(Stu stud[]) ;
friend void Statistic(Stu stud[]);
friend void Lookup(Stu stud[]) ;
friend void Modify(Stu stud[]) ;
friend void Delete(Stu stud[]) ;
friend void Output(Stu stud[]) ;
friend void Sort(Stu stud[]) ;
friend void Insert(Stu stud[]) ;
friend void Write(Stu stud[],int n);
friend int Read(Stu stud[]);
private:
int num;
char name[8];
char sex[4];
float english;
float math;
float c;
float computer;
float average;
int order;
}stud[100];
void Write(Stu stud[],int n) //向文件中写入数据
{
fstream myFile;
myFile.open("student.dat",ios::out|ios::binary);
if(!myFile)
{
cout<<"student.dat can't open!"<<endl;
abort();
}
int count=n;
myFile<<count<<endl<<endl;
for(int i=0;i<=count;i++)
{
myFile<<" "<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].sex<<" "<<stud[i].english<<" "<<stud[i].math<<" "<<stud[i].c
<<" "<<stud[i].computer<<" "<<stud[i].average<<endl;
}
myFile.close();
}
int Read(Stu stud[]) //从文件中读数据
{
fstream myFile;
myFile.open("student.dat",ios::in|ios::binary);
if(!myFile)
{
cout<<"student.dat can't open!"<<endl;
abort();
}
int count;
myFile.seekg(0);
myFile>>count;
for(int i=0;i<=count;i++)
{
myFile>>stud[i].num>>stud[i].name>>stud[i].sex>>stud[i].english>>stud[i].math>>stud[i].c>>stud[i].computer>>stud[i].average;
}
myFile.close();
return count ;
}
五.课程设计心得
这是一个综合性较强,很实际的一个编程实例。刚学C++时候,感觉类和对象还挺有意思的,刚接触到这个题目时,觉得应该没什么大问题吧,因为,我自认为一些基本知识点都已经掌握了。可是,真的当我动手编程的时候,才发现并没有想象中的那么简单。单个知识点是弄清了,但是,将所有的知识点综合起来运用时,就碰到了各种各样的问题了。有时候,一个错误得找好久,才能发现。
本系统的重点就是要会建立两个类。一个是学生类student,用来存放一个学生的成绩记录,相当于一个结构体的功能吧。另一个类是学生成绩记录系统类stuscore,该类用来存放多个学生的成绩记录。难点就是stuscore类里的各个功能的实现。总的来说,添加,显示,查找,这三个功能比较容易,但是,删除,保存,加载这三个功能就需要花点心思了,可能是平时用的比较少吧,生疏了。可见只有通过平时多加练习,才能有助于自己巩固知识点。
最后想说的是,调试程序真的很关键。调试程序需要较大的耐心。可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解,也必须接受的事实。有好几次,几个错误让我很是头疼啊,很想删了,重新来过,可是最后发现,还是得有耐心去调试程序。
为了完成这个课题,在图书馆和网上找了些资料,自己开始研究探索。开始在网上找到相但是为关的课程设计资料,并对照这课本进行分析,然后自己开始着手进行自己的设计。当然一开始并不会很顺利,但是自己还是坚持一步步探索下来,终于完成了自己的小设计,虽然这个设计做的并不是很好,功能也不强大,但始终是自己一步一步一步设计,代码是自己一个一个键敲出来的,所以不管结果,我能说我确实学到些东西了!通过这个实验的练习,我也学到了很多东西,特别是加深了对类和对象理解和应用方面,也很谢谢老师给我的帮助。
学生信息管理系统的功能基本都可以实现,但因为是初学,所以还有很多地方可以改进和完善,如系统的整体界面风格,学生资料的详细管理等等。通过不断的学习,以后应该进一步的巩固系统,这样才能够使系统实现的更充实、更完善。
六.参考文献