《计算机专业学期三课程设计(共17页).doc》由会员分享,可在线阅读,更多相关《计算机专业学期三课程设计(共17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上面向对象程序设计课程设计报告姓 名 小精灵 学 号 指导教师 徐嘉斌 专心-专注-专业目录任务一一、 任务内容:完成内容:按照要求设计类(根据输出设计类)设计类就是根据数据封装的要求,抽象出适合的类。有如下测试程序和测试程序的输出结果,要求设计类Welcome。(1)测试程序如下:void main()Welcome we;Welcome you(we);you.Display();you.Set(“Thank you.”);coutyou.Get()endl;you.talk();you.Display();(2)测试程序的输出结果如下:Welcome!Thank
2、you.输入:How about you?输出:How about you?输入:Fine,thank you.输出:Fine,thank you.输入:OKAll rightGoodbye!OKGoodbye!Goodbye!注:后面5行为倒数第6行输出后接下去的输出内容。(3)设计类Welcome 的原则:1)在头文件welcome.h 中声明类2)在welcome.cpp中实现类3)使用内联函数定义Display()函数4)演示文件名用学号作主名。二、 设计思路由给出的代码来构造此程序。开头部分,由Display输出Welcome,再用Get输出被Set存进的Thank you。利用循环
3、函数While建立主体部分,输入OK时跳出循环。结尾部分,因为给出的代码中建立了两个对象,所以调用析构函数时可直接输出两个Goodbye。N开始输入OK输出输出“All rightGoodbye”结束Y三、 实现代码/Welcome.h#include #include using namespace std;class Welcomeprivate:char d100;public:inline void Display()coutdendl;void Set(char a)strcpy(d,a);char *Get()return d;void talk();Welcome();Welco
4、me(const Welcome &a);Welcome()coutGoodbye!endl;Welcomedinline void Display()void Set(char a)char *Get()void talk()Welcome()Welcome(const Welcome &w)Welcome()/121-2.cpp#include #include #includeWelcome.husing namespace std;void main()Welcome we;Welcome you(we);you.Display();you.Set(Thank you.);coutyo
5、u.Get()endl;you.talk();you.Display();/121-1.cpp#include #include #includeWelcome.hvoid Welcome:talk()cout输入:;cin.getline(d,100);while(strcmp(d,OK)!=0)cout输出:dendl;cout输入:;cin.getline(d,100);strcpy(d,OK);coutAll rightendl;coutGoodbye!和输出运算符,分数以1/2、-15/29这样的形式来输入和输出,注意分子、分母可能包含负号。在分数类中,还应重载+、-、*、/运算符。
6、应有一个函数,对分数进行约分与规格化,在规格化之后,分母一定是正的,并且分子分母的最大分约数为1,如对4/-8正规化之后表示成-1/2。仿照计算器的运算过程,采用计算器方式进行有关分数运算。二、 设计思路(1)约分的关键是求分子分母的最大公约数,用Gcm(m,n)表示求m与n的最大公约数:当n=0时,Gcm(m,n)=m当n0时,Gcm(m,n)= Gcm(n,m%n)可用递归编程实现Gcm(m,n)。(2)分数的四则运算可按如下方式进行:(3)利用Reduction函数将负号全都归到分子身上。(4)Operation函数来实现当运算符输入错误时的提示。(5)当除数为0时,main函数中有实现
7、显示除数不能为0的设置。NY开始输入除数、被除数和除号分母为0输出输出“不能为除数,请重新输入。结束分数计算器分数加法运算分数减法运算分数除法运算分数乘法运算异常处理报告自行约分负号转到分子为负数加括号三、 实现代码#include#includevoid Operation(char &index);using namespace std;class Fractionprivate:int fz;int fm;int Gcm(int m,int n);public:Fraction(int n=1,int d=1);Fraction();void Reduction();int GetFz(
8、)return fz;int GetFm()return fm;void SetFz(int n);void SetFm(int d);Fraction operator+(Fraction &a);Fraction operator-(Fraction &a);Fraction operator*(Fraction &a);Fraction operator/(Fraction &a);friend ostream &operator(istream &is,Fraction &s);int Fraction:Gcm(int m,int n)if(n=0)return m;else retu
9、rn Gcm(n,m%n);void Fraction:Reduction()if(fm0)fz=-fz;fm=-fm;int f=Gcm(abs(fz),fm);fz=fz/f;fm=fm/f;void Operation(char &index)for(;)coutindex;if(index=+|index=-|index=*|index=/)break;else cout(istream &is,Fraction &s)char ch;int m,n;for(;)coutmchn;s.SetFz(m);s.SetFm(n);if(ch=/&n!=0)break;else tryif(c
10、h!=/) throw 1;if(n=0) throw 2;catch(int i) if(i=1)cout输入格式错误,请重新输入!iendl;else if(i=2)cout分母为0,请重新输入!endl;s.Reduction();return is;ostream &operator(ostream &os,Fraction &s)if(s.fz0)if(abs(s.fz)%s.fm=0)os(s.fz/s.fms.fm)os(s.fz/s.fm又s.fz%s.fm/s.GetFm();else os(s.GetFz()/s.GetFm();elseif(s.fz%s.fm=0)oss
11、.fz/s.fm;else if(s.fz=0)oss.fm)oss.fz/s.fm又s.fz%s.fm/s.GetFm();else oss.GetFz()/obj1;Operation(index);cinobj2;if(index=+)r=obj1+obj2;else if(index=-)r=obj1-obj2;else if(index=*)r=obj1*obj2;else if(index=/)for(;)i=obj2.GetFz();if(i=0)cout不能为除数,请重新输入。obj2;else break;r=obj1/obj2;coutobj1indexobj2=rendl
12、;couto;else break;return 0;四、 运行结果及分析图 2分析:第一个加法运算体现了约分的功能,第二个减法运算体现了假分数的自行转换功能,第三个乘法运算体现了给负数加括号的功能,第四个除法运算体现了自行将分母的负号提给分子的功能,以及最后五行体现了运算符错误的提示和分母为0的提示。任务三一、 任务内容:要求:能够对文件进行存储和读取。要求用一个结构记载学生属性,编写一个学生类以完成各种操作。具体要求如下:(1) 有10个小学生,每个学生有数学、语文两门课,从键盘输入学生的学号、姓名及成绩,计算每个学生的平均成绩,将数据存入stud.dat中。(2) 学生的所有属性用一个结
13、构进行描述。(3) 要求对“”进行重载。(4) 选作要求:可将两门课都不及格的学生信息从链表或数组中删除,并另存入bad.dat中;将学生姓名和平均成绩抽取出来。(5) 以下程序测试结果供参考(此处不列举)二、 设计思路建立两个类,并建立一个for循环来实现菜单的选择功能。使用链表储存输入的信息,当选择查找与删除数据时,通过链表来寻找用户要寻找的数据。开始输入学生信息结束功能选择Y输入0?N菜单菜单功能选择增加原始记录保存原始文件显示各种文件查找学生成绩删除原始记录修改学生信息结束程序运行三、 实现代码# include # include # include #include using n
14、amespace std; class Student public: char name20; char Id20; int Cnum; int Mnum; int sum; Student * Next;void Input() coutname; coutId; coutCnum; coutMnum; sum=(Cnum+Mnum)/2; void ReadFile(istream & in) innameIdCnumMnumsum; void Show() coutnametIdtCnumt Mnumtsumtendl; ; class Studentmassage public: S
15、tudentmassage(); Studentmassage(); void ShowMenu(); void Find();void Save(); void ModifyItem(); void RemoveItem(); void Swap(Student *,Student *); void Sort(); int ListCount(); void Display() cout姓名t学号t语文t数学t平均Next;p!=End;p=p-Next) p-Show(); coutInput(); End-Next=new Student; End=End-Next; cout添加成功!
16、endl; coutNext!=End;p=p-Next) if(!strcmp(p-Next-name,name)return p; return NULL; Student *FindID(char * Id) for(Student * p=Head;p-Next!=End;p=p-Next) if(!strcmp(p-Next-Id,Id)return p; return NULL; ; Studentmassage:Studentmassage() Head=new Student; Head-Next=new Student; End=Head-Next; in.open(sort
17、.txt); if(!in) coutReadFile(in); if(End-name0=0)break; End-Next=new Student; End=End-Next; in.close(); Studentmassage:Studentmassage() Save(); for(Student * temp;Head-Next!=End;) temp=Head-Next; Head-Next=Head-Next-Next; delete temp; delete Head,End; void Studentmassage:ShowMenu() cout1.增加原始记录endl;
18、cout2.显示各种文件endl; cout3.保存原始文件endl; cout4.查找学生成绩endl; cout5.删除原始记录endl; cout6.修改学生信息endl; cout0.结束程序运行endl; coutntt请选择:; void Studentmassage:Find() char name20 ,Id10; int x; Student * p=NULL; coutx; switch(x) case 1:coutname; if(p=FindItem(name) p-Next-Show(); cout请按任意键; getch(); else couttt没有该姓名的学生
19、!nendl; cout请按任意键; getch(); break; case 2: coutId; if(p=FindID(Id) p-Next-Show(); cout请按任意键; getch(); else couttt没有该学号的学生!nendl; cout请按任意键; getch(); break; void Studentmassage:ModifyItem() char name20; Student * p=NULL; coutname; if(p=FindItem(name) couttt已找到学生的信息,请输入新的信息!Next-Input(); cout成功!endl;
20、cout请按任意键; getch(); else couttt没有!endl; cout请按任意键; getch(); void Studentmassage:RemoveItem() char name20; Student * p=NULL,*temp=NULL; couttt输入要删除的学生姓名:name; if(p=FindItem(name) temp=p-Next; p-Next=p-Next-Next; delete temp; couttt删除成功!endl; cout请按任意键; getch(); else couttt没有!endl; coutname,p1-name);
21、strcpy(temp-Id,p1-Id); temp-Cnum=p1-Cnum; temp-Mnum=p1-Mnum; temp-sum=p1-sum; strcpy(p1-name,p2-name); strcpy(p1-Id,p2-Id); p1-Cnum=p2-Cnum; p1-Mnum=p2-Mnum; p1-sum=p2-sum; strcpy(p2-name,temp-name); strcpy(p2-Id,temp-Id); p2-Cnum=temp-Cnum; p2-Mnum=temp-Mnum; p2-sum=temp-sum; int Studentmassage:Lis
22、tCount() if(! Head) return 0; int n=0; for(Student * p=Head-Next;p!=End;p=p-Next) n+; return n; void Studentmassage:Sort() cout Sorting.endl; Student *p=NULL,*p1=NULL,*k=NULL; int n=Studentmassage:ListCount(); if(nNext;p!=End;p=p-Next) for(k=p-Next;k!=End;k=k-Next) if(p-sumk-sum) Studentmassage:Swap
23、(p,k); cout is ok !Next;p!=End;p=p-Next) outnametIdtCnumt Mnumtsumn; out.close(); int main() int x,i=0; bool quit=false; couttt- 欢迎进入学生成绩管理系统 -endl; Studentmassage Grade; coutx; switch(x) case 0:quit=true;break; case 1:Grade.AddItem();break; case 2:Grade.Display();break; case 3:Grade.Sort();break; c
24、ase 4:Grade.Find();break; case 5:Grade.RemoveItem();break; case 6:Grade.ModifyItem();break; return 0; 四、 运行结果及分析图 3-1 功能选择图 3-2 增加成绩图 3-3 保存文件图 3-4 修改信息图 3-5 信息显示图 3-6 查找信息图 3-6 删除信息分析:进入菜单界面后,可以选择1-6六个功能。任意功能进行后都能通过任意键来进行循环。通过1、4、5、6来增加、查找、删除和更改学生信息。相应文件夹里会自动保存相应信息。总结或感悟本次课程设计耗时10天,过程中我颇有感悟。在设计任务一时
25、,我颇有信心,也花了很快的时间利用拷贝构造函数和析构函数完成了该任务,但在遇到任务二的时候,遭遇了很多挫折。任务二的计算器设计中需要实现相当多的功能,起初,在实现公约数和负号加到分子上的功能时,还算顺利,而后来,越来越多的代码扰乱了思维,导致心烦意乱,失去耐心。而也经过一天一天的更改和尝试,我也逐渐完成一段又一段复杂的代码,实现一个又一个功能,而到最后,我也发现,原来任务二并没有想象中那么繁琐,当所有代码展现在眼前时,完全弄得清楚哪段是用来实现哪个功能,以及各个函数的作用与应用。最费时的是任务三。对于任务三,功能更为繁琐不说,其知识点我也是不怎么牢固。我尝试了很久,却并没有播种,更不用说开花结果了。我在网上不断地探索思路,而后来,我发现了该段代码其实也没有想象中那么天马行空,其实静下心来看看别人完成后的完整代码,我也发现原来大概我也能懂。但最终,本次课程设计任务三我并没有很原创地完成,希望在接下来的时间里我能努力补回这些知识点。课程设计需要大量的耐心和动脑能力,也需要很多的知识基础,我想,我最缺乏的是知识基础这块,所以我得在课余时间努力补回自己的知识点,让自己以后进行课程设计时能更为顺畅,也不会再被繁琐所懊恼。