C程序设计分析报告精修订.docx
《C程序设计分析报告精修订.docx》由会员分享,可在线阅读,更多相关《C程序设计分析报告精修订.docx(15页珍藏版)》请在冰豆网上搜索。
C程序设计分析报告精修订
SANY标准化小组#QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#
C程序设计分析报告
中国地质大学(北京)
C++
程
序
设
计
结
课
报
告
课程班别名:
0401042任课教师:
陈春丽(主讲教师)
学院:
信息工程学院专业:
电气工程及其自动化
学生姓名:
xxxxxxxx学号:
xxxxxxxxxxxx
C++程序设计结课报告
内容摘要:
C++语言是从C语言的基础上发展而来的功能齐全、移植性较好、面向对象的中级程序设计语言。
运用以掌握的C++方面的知识,如类、类的继承、类的组合等。
编写一个简单的学校人员信息管理程序,实现一些简单的浏览、增加、查询输出到文件和其他一些功能。
关键字:
C++语言学校人员信息类纯虚函数调试
正文:
一.需求分析与概要设计:
A).问题简述:
学校人员信息管理程序,管理学生和教师的基本信息。
程序完成功能:
(1)分类浏览
(2)增加(3)查询?
(4)输出到文件(5)其他
要求:
1、定义一个学生类Student。
需要存储每个学生的姓名、学号、性别等信息。
定义教师类Teacher,存储每个教师的编号、姓名、性别、职称等信息。
定义抽象类Person,保存人员的基本信息,如姓名、性别等。
定义一个班级类Class,每个学生在一个班级中学习,每个教师负责多个班级的教学辅导。
2、定义各类的成员函数:
分别实现获取、修改信息等相关操作。
3、通过在基类Person建立纯虚函数,实现按姓名输出教师或学生的信息。
4、重载流提取运算符,使能对Student类的对象进行输出操作。
5、根据需要,适当添加其他必要的数据成员和成员函数,如构造函数、拷贝构造函数、析构函数、运算符重载,按学号或姓名排序等。
B).问题分析:
由要求可知,设计一个C++程序,可以实现学校信息的分类浏览、增加、查询、传输和其他一些功能。
为此,可以将程序依据要求划分为为五个功能模块。
分别对应实现教师和学生信息的浏览、增加、查询、输出到文件和其他功能。
为此,可以通过按功能编写代码来实现。
二.程序类的说明与实现:
由于信息分为学生、教师和班级,所以分别建立Student、Teacher两个基本类,来实现信息的输入,处理和调用,由于学生和教师同处于一个班级,所以再建立一个Class类,由Student类和Teacher类组合而成。
另外,由于可以从学生学生和教师中抽象出身份证号、姓名、年龄、性别、地址等共同的特性,为此可以在建立一个Person类,作为基类,让Student、Teacher、Class三个类作为派生类,继承于此基类。
在Person类中,需要定义纯虚拟函数Accept实现信息输入,并定义其他一些信息输出函数,如用于实现输出姓名、性别、地址、年龄等等基本信息的函数。
而在Student和Teacher中则主要定义一些输出学生和教师特有的信息的函数。
由于Class类是由学生类和教师类组合而成的,因此,要多定义一个Postgraduate类,实现班级信息的输入输出等功能。
三.模块分析(带核心源代码):
A).功能一:
增加:
intmain(){ofstreamoutObj("SchoolInforSystem.txt");
Person*ptr;//定义基类指针ptr.
while
(1){Found:
cout<<"你想往系统写入信息吗(
Y/N)"<charc;
cin>>c;
if(c=='N'||c=='n'){
cout<<"输入系统退出"<break;//终止程序。
}
elseif(c=='Y'||c=='y'){}
else{cout<<"输入有误,请重新输入。
"<B).功能二:
分类浏览:
Found1:
cout<<"输入Student的信息请输入'1';"<cout<<"输入Teacher的信息请输入'2';"<cout<<"输入Class的信息请输入'3';"<charcc;cin>>cc;
if(cc=='1'){//注意这里的'1'是字符型数据,而不是整型数据1.
ptr=newStudent;//指向学生类,用new指针。
ptr->Accept();ptr->Display();
outObj.write((char*)ptr,sizeof(Student));
deleteptr;}
elseif(cc=='2')
{ptr=newTeacher;//指向教师类。
ptr->Accept();ptr->Display();
outObj.write((char*)ptr,sizeof(Teacher));
deleteptr;}
elseif(cc=='3'){
ptr=newPostgraduate;
ptr->Accept();ptr->Display();
outObj.write((char*)ptr,sizeof(Postgraduate));
deleteptr;}//释放资源。
else{cout<<"输入有误,请重新输入."<}
outObj.close();
cout<<"*********++++输入结束++++***********"<四.重点与难点:
A).基类Person类代码:
classPerson{//定义基类Person类。
private:
intid;charname[20];charsex[10];charaddress[30];intage;
public:
virtualvoidAccept(){//纯虚拟函数Accept,在不同的派生类,有不同的实现!
cin>>id;cout<<"id="<cout<<"请输入他(她)的姓名:
"<cin>>name;cout<<"name="<cout<<"请输入他(她)的性别(请输入nan或nv):
"<cin>>sex;cout<<"sex="<cout<<"请输入他(她)的地址:
"<cin>>address;cout<<"address="<
found2:
cout<<"请输入他(她)的年龄(0到200之间):
"<cin>>age;
if(age<0||age>200){cout<<"输入有误,请重新输入"<cout<<"age="<}
virtualvoidDisplay(){
cout<<"身份证号:
"<<"\t"<"<<"\t"<cout<<"性别:
"<<"\t"<"<<"\t"<
cout<<"年龄:
"<<"\t"<}
intgetId(){returnid;}//输出身份证号的函数,下面各函数相似。
voidsetId(int_id){id=_id;}
char*getName(){returnname;}
voidsetName(char*_name){strcpy(name,_name);}
char*getSex(){returnsex;}
voidsetSex(char*_sex){strcpy(sex,_sex);}
char*getAddress(){returnaddress;}
voidsetAddress(char*_address){strcpy(address,_address);}
intgetAge(){returnage;}
voidsetAge(int_age){age=_age;}};
B).Class类:
classPostgraduate:
publicPerson{//定义Class类的输入类,其继承与基类。
private:
TeacherdaoTeacher;
public:
voidAccept(){Person:
:
Accept();
cout<<"请输入他(她)的导师的信息:
"<daoTeacher.Accept();}
voidDisplay(){Person:
:
Display();cout<<"导师的信息如下:
"<daoTeacher.Display();//调用Person类中的Display()函数,以实现信息的输出。
}};
classClass{//定义一个Class类,由Syudent和Teacher类组合而成。
private:
Studentstudent[50];
Teacherteacher;
intclassCount;
public:
intgetClassCount(){returnclassCount;}};
五.调试报告:
部分调试结果:
学生信息的输入输出:
教师信息的输入输出:
分类增加和浏览调试结果:
程序调试过程中遇到的问题:
问题一:
voidsetName(char?
Name[30]){
name=Name;
}
/*
这里编译时出错,改成voidsetName(char*Name){name=Name}也不对,
改成voidsetName(stringName){name=Name}更不对?
解决方案:
voidsetName(char*_name){strcpy(name,_name);
}//字符数组拷贝,用strcpy文件,不过要在头文件上加:
#include这个头文件。
name[i]=_name[i];
问题二:
public:
virtualvoidAccept(){//纯虚拟函数Accept,在不同的派生类,有不同的实现!
cout<<"请输入他(她)的身份证号:
"<cin>>id;//
解决方案:
public:
virtualvoidAccept(){//纯虚拟函数Accept,在不同的派生类,有不同的实现!
cout<<"请输入他(她)的身份证号"<cin>>id;//这里只要在提示输入时,限制输入数的数据类型和大小即可。
六.总结与体会:
C++语言是在C语言的基础上发展而来的,是带类的C语言。
类的增加改变了C语言的局限性的同时,也使得C++语言相对于C语言,更加的难懂。
虽然我刚开始接触必修课计算机语言的就是C++语言,选修课又选了这门语言,但是仍然不能很熟练的运用它,编写一些稍微复杂的程序解决实际问题。
学了经一年的C++语言了,说到学习C++语言的体会,我是感触良多啊!
三分天注定,七分靠打拼:
一年的C++求学之旅,让我深切的感受到要学精这样一门功能齐全的面向对象化的中级程序设计语言并非一件容易的事。
在所有的编程语言中,都要用到算法,所谓算法简单而言就是解决问题的方法。
由于我的数学功底比较好,所以一般情况下,寻找分析和解决问题的方法对我来说并不难。
但是问题就在于我理解不了一些C++语言的复杂语法,因此在写程序时,容易出现很多的语法错误!
对算法的天生的敏锐感和比较好的数学功底是我学习C++语言的优势所在,但是对一些固定语法的不熟练和粗心却让我在编写C++程序时吃尽了苦头,常常是因为少加了一个分号或是大括号,而错误百出!
正如一首歌唱的那样,三分天注定,七分靠打拼!
我没能尽量多写一些程序熟悉C++语言的语法规则,所以现在才会觉得C++是如此的难!
三种境界:
王国维《人间词话》有评:
古今之成大事业、大学问者,必经过三种之境界:
"昨夜西风凋碧树。
独上高楼,望尽天涯路。
"此第一境也。
"衣带渐宽终不悔,为伊消得人憔悴。
"此第二境也。
"众里寻他千XX,蓦然回首,那人却在灯火阑珊处。
"此第三境也。
此等语皆非大词人不能道。
然遽以此意解释诸词,恐为晏欧诸公所不许也。
"。
这是王国维评价写词和人生的三大境界。
我看来,学习C++语言也有三种境界。
第一种境界为:
黑发不知读书早。
就是我现在的这种境界,当时必修课上,没认认真真听过C++课,待到选修课时,虽然听课了,却由于是选修课,学时有限,老师说的比较笼统,所以还无法真正完完全全掌握这门计算机语言。
第二种境界为:
熟读唐诗三百首,不会吟诗也会诵。
我想这种境界,应该是那些C++高手所达到境界,写得多了,看得多了,自然就无师自通了!
所以我要想达到这种境界,还需要以后多写C++程序,多看一些关于C++的书。
真正能熟练掌握这门语言,将来无论是考研还是找工作,都会有比较大的优势。
第三种境界为:
文章本天成,妙手偶得之。
我想达到这种境界的人应该是一些大学的C++方面的教授讲师或是专门从事C++程序开发和软件开发的人。
在他们见到一些问题时,只要提到用C++语言编程解决,就会有无与伦比的反射神经刺激大脑,然后给出答案,如同别人早已经把程序写好存在它们的大脑中,他们只是像查文件一样,在大脑中核对信息,找出答案。
这是我的终极目标,因为我从小就特别佩服比尔盖茨。
总的来说,以我现在的水平,不能说是掌握了C++这门语言,只能说是初步了解了它,所以我会再接再厉,一方面为了明年的C++二级考试,另一方面也为了将来做准备。
参考文献:
[1]管建和《C++语言程序设计》北京:
机械工业出版社2007版
[2]钱能《C++程序设计教程》北京:
清华大学出版社2001版
[3]王国维《人间词话》江苏文艺出版社2007版
附表:
C++程序代码:
#include
#include
#include
usingnamespacestd;
classPerson{//定义基类Person类。
private:
intid;charname[20];charsex[10];
charaddress[30];intage;
public:
virtualvoidAccept(){//纯虚拟函数Accept,在不同的派生类,有不同的实现!
cin>>id;
cout<<"id="<cout<<"请输入他(她)的姓名:
"<cin>>name;
cout<<"name="<cout<<"请输入他(她)的性别(请输入nan或nv):
"<cin>>sex;
cout<<"sex="<cout<<"请输入他(她)的地址:
"<cin>>address;
cout<<"address="<
found2:
cout<<"请输入他(她)的年龄(0到200之间):
"<cin>>age;
if(age<0||age>200){cout<<"输入有误,请重新输入"<cout<<"age="<}
virtualvoidDisplay(){
cout<<"身份证号:
"<<"\t"<cout<<"姓名:
"<<"\t"<cout<<"性别:
"<<"\t"<cout<<"地址:
"<<"\t"<
cout<<"年龄:
"<<"\t"<}
intgetId()
{returnid;}
voidsetId(int_id)
{id=_id;}
char*getName()
{returnname;}
voidsetName(char*_name){strcpy(name,_name);}
char*getSex()
{returnsex;}
voidsetSex(char*_sex)
{strcpy(sex,_sex);}
char*getAddress()
{returnaddress;}
voidsetAddress(char*_address)
{strcpy(address,_address);}
intgetAge()
{returnage;}
voidsetAge(int_age){
age=_age;
}
};
classStudent:
publicPerson{//在Person类的基础上定义一个派生类Student类。
private:
intstudyNum;
intgrade;
intmark;
public:
voidAccept(){
Person:
:
Accept();
cout<<"请输入他(她)的学号:
"<cin>>studyNum;
cout<<"studyNum="<found3:
cout<<"请输入他(她)的年级(1,2,3,4,5,6,7):
"<cin>>grade;
if(grade<1||grade>7){cout<<"输入错误,重新输入。
"<cout<<"grade="<cout<<"请输入他(她)的分数:
"<cin>>mark;
cout<<"mark="<}
voidDisplay(){
Person:
:
Display();
cout<<"学号:
"<<"\t"<cout<<"年级:
"<<"\t"<cout<<"成绩:
"<<"\t"<}
intgetStudyNum(){
returnstudyNum;
}
voidsetStudyNum(int_studyNum){
studyNum=_studyNum;
}
intgetGrade(){
returngrade;
}
voidsetGrade(int_grade){
grade=_grade;
}
intgetMark(){
returnmark;
}
voidsetMark(int_mark){
mark=_mark;
}
};
classTeacher:
publicPerson{
private:
intsalary;
charsubject[20];
public:
voidAccept(){
Person:
:
Accept();
cout<<"请输入他(她)的工资:
"<cin>>salary;
cout<<"salary="<cout<<"请输入他(她)的科目:
"<cin>>subject;
cout<<"subject="<}
voiddisplay(){
Person:
:
Display();
cout<<"工资:
"<<"\t"<cout<<"科目:
"<<"\t"<}
intgetSalary(){
returnsalary;
}
voidsetSalary(int_salary){
salary=_salary;
}
char*getSubject(){
returnsubject;
}
voidsetSubject(char*_subject){
strcpy(subject,_subject);
}
};
classPostgraduate:
publicPerson{
private:
TeacherdaoTeacher;
public:
voidAccept(){
Person:
:
Accept();
cout<<"请输入他(她)的导师的信息:
"<daoTeacher.Accept();
}
voidDisplay(){
Person:
:
Display();
cout<<"导师的信息如下:
"<daoTeacher.Display();
}
};
classClass{
private:
Studentstudent[50];
Teacherteacher;
intclassCount;
public:
intgetClassCount(){
returnclassCount;
}
};
intmain(){
ofstreamoutObj("SchoolInforSystem.txt");
Person*ptr;
while
(1){
Found:
cout<<"你想往系统写入信息吗(Y/N)"<charc;
cin>>c;
if(c=='N'||c=='n'){
cout<<"输入系统退出"<break;}
elseif(c=='Y'||c=='y'){}
else{cout<<"输入有误,请重新输入。
"<Found1:
cout<<"输入Student的信息请输入'1';"<cout<<"输入Teacher的信息请输入'2';"<cout<<"输入Class的信息请输入'3';"<charcc;
cin>>cc;//g[j]=cc-48;
if(cc=='1'){
ptr=newStudent;
ptr->Accept();
ptr->Display();
outObj.write((char*)ptr,sizeof(Student));
deleteptr;
}
elseif(cc=='2'){
ptr=newTeacher;
ptr->Accept();
ptr->Display();
outObj.write((char*)ptr,sizeof(Teacher));
deleteptr;
}
elseif(cc=='3'){
ptr=newPostgraduate;
ptr->Accept();
ptr->Display();
outObj.write((char*)ptr,sizeof(Postgraduate));
deletep