计算机专业第三学期的课程设计.docx
面向对象程序设计课程设计报告姓名小精灵学号20230808指导教师徐嘉斌目录任务一错误!未定义书签。一、 任务内容:错误!未定义书签。二、 设计思绪错误!未定义书签。三、 实现代码错误!未定义书签。四、 运行成果及分析错误!未定义书签。任务二错误!未定义书签。一、 任务内容:错误!未定义书签。二、 设计思绪错误!未定义书签。三、 实现代码错误!未定义书签。四、 运行成果及分析错误!未定义书签。任务三错误!未定义书签。一、 任务内容:错误!未定义书签。二、 设计思绪错误!未定义书签。三、 实现代码错误!未定义书签。四、 运行成果及分析错误!未定义书签。任务一一、任务内容:完毕内容:按照规定设计类(根据输出设计类)设计类就是根据数据封装的规定,抽象出适合的类。有如下测试程序和测试程序的输出成果,规定设计类Welcomeo(1)测试程序如下:voidmain()Welcomewe;Welcomeyou(we);you.DisplayO;you.Set("Thankyou.,);cout<<you.Get()<<endl;you.talk();you.DisplayO;(2)测试程序时输出成果如下:Welcome!Thankyou.输入:HOWaboutyou?输出:Howaboutyou?输入:Fine,thankyou.输出:Fine,thankyou.输入:OKAllrightGoodbye!OKGoodbye!Goodbye!注:背面5行为倒数第6行输出后接下去B¾输出内容。(3)设计类WeIComeB¾原则:1)在头文献WelCome.h中申明类2)在welcome,cpp中实现类3)使用内联函数定义DiSPlay()函数4)演示文献名用学号作主名。二、设计思绪由给出B¾代码来构造此程序。开头部分,由Display输出Welcome,再用Get输出被Set存进1向Thankyou。运用循环函数While建立主体部分,输入OK时跳出循环。结尾部分,由于给出的J代码中建立了两个对象,因此调用析构函数时可直接输出两个Goodbye0三、实现代码/Welcome.h#include <iostream>include <string>using namespace std;voidtalk();Welcome();Welcome(constWelcome&a);-Welcome()cout<<"Goodbye!"<<endl;);WelcomedinlinevoidDisplayOvoidSet(chara)char*Get()voidtalk()classWelcomeprivate:/121-2.cppChardllOO;#include<iostream>public:#include<string>inlinevoidDisplayOcout<<d<<endl;);#include"Welcome.hMvoidSet(chara)strcpy(d,a););usingnamespacestd;char*Get()returnd;);void main()Welcome we;Welcome you(we);you.Display();you.Set("Thank you.");cout<<you.Get()<<endl;you.talk();you.Display();)/121-l.cpp#include <iostream>#include <string>#include"Welcome.h"void Welcome: :talk()(CoUt<<"输入:"cin.getline(d,100);while(strcmp(d,"OK")!=0)(COUt<v"输出:"<<d<<endl;CoUt<v"输入:”;cin.getline(d,100););strcpy(d,"OK,');cout<<',A11right',<<endl;cout<<,'Goodbye!"<<endl;1Welcome:Welcome(constWelcome&a)(strcpy(d,a.d);strcpy(d,"Welcome!");)四、运行成果及分析c'.C:DocuertsandSettingsAdinis:Tator桌面Debug121一1exe”Weleone!Ihankyou.输入:Howareyou?施(出:Howareyou?施入:Fine,thankyou.瑜出:Fine,thankyou.输入:OKAllrightGoodbye?OKGoodbye,Goodbye?Pressanykeytocontinue分析:前面先自动输出WeICome!和Thankyou.,然后运用循环While函数反复顾客的输入。采用了多文献构造,运用构造函数、析构函数和拷贝构造函数将成果输出。最终调用析构函数输出“Goodbye!”任务二一、任务内容:规定:为分数定义一种类。分数定义为两个整数之比。将分数表达为int类型的两个值:一种表达分子,一种表达分母。重载输入和输出运算符分数以12-1529这样的I形式来输入和输出,注意分子、分母也许包括负号。在分数类中,还应重载+、-、*、/运算符。应有一种函数,对分数进行约分与规格化,在规格化之后,分母一定是正0,并且分子分母B¾最大分约数为1,如对4/-8正规化之后表达成-1/2。仿照计算器B¾运算过程,采用计算器方式进行有关分数运算。二、设计思绪(1)约分的关键是求分子分母的最大公约数,用Gcm(m,n)表达求In与n时最大公约数:当n=0时,Gcm(m,n)=m当n0时,Gcm(m,n)=Gcm(n,m%n)可用递归编程实现GCm(m,n)0(2)分数的四则运算可按如下方式进行:acad+bcacadbCajCacacadbdbdbdbdbdbdbdbe(3)运用RedUCtion函数将负号全都归到分子身上。(4)Operation函数来实现当运算符输入错误时的提醒。(5)当除数为O时,IIIain函数中有实现显示除数不能为O的设置。三、实现代码include<iostream>#include<cmath>voidOperation(char&index);usingnamespacestd;classFraction(private:intfz;intfm;intGcm(intm,intn);Fraction(intn=Lintd=1);-Fraction();voidReduction();intGetFz()returnfz;);intGetFm()returnfm;voidSetFz(intn);voidSetFm(intd);Fractionoperator+(Fraction&a);Fractionoperator-(Fraction&a);Fractionoperator*(Fraction&a);Fractionoperator(Fraction&a);public:friendostream&operator«(ostreamcin>>index;&os,FraCtiOn&s);friendi stream&operator»(istream&is,Fraction &s);;int Fraction:Gcm(int m,int n)(if(n=O)return m;else retum Gcm(n,m%n);)void Fraction:Reduction()(if(fm<O)fz=-fz;fm=-fm;)int f=Gcm(abs(fz),fm);fz=fzf;fm=fmf;)void Operation(char &index)for(;)if(index=,+'index='-'index=-*,index=7,)break;elsecout<< ”请输入对时H勺运算符:“;)Fraction:Fraction(int n,int d):fz(n),fm(d) Reduction();)void Fraction:SetFz(int n)fz=n;)void Fraction:SetFm(int d)fm=d;)istream &operator»(istream &is,Fraction &s)(char ch;int m,n;for(;)(CoUt<< ”请输入一种分数:"is>>m>>ch>>n;s.SetFz(m);cout<v”请输入运算符:"s.SetFm(n);if(ch='/'&&n!=O)break;else tryif(ch!=V') throw 1;if(n=0) throw 2;1catch(int i) if(i=l)COUt<<"输入格式错误,请重新 输入!"VViVVendl;else if(i=2)CoUI分母为0,请重新输 入!"<<endl;)1)s.Reduction();return is;ostream &operator«(ostream &os,Fraction &s)(if(s.fz<O)(if(abs(s.fz)%s.fm=O)os<<,("<<s.fzs.fm<<)"else if(abs(s.fz)>s.fm)os<<<,("<<s.fzs.fm<<" 又 "<<s.fz%s.fm<<,7"<<s.GetFm()<<")" else os<<"("<<s.GetFz()<<7"<<s.GetFm()<<")')elseif(s.fz%s.fm=O) os<<s.fzs.fm;else if(s.fz=O)os<<0;else if(s.fz>s.fm)os<<s.fzs.fm<<"又"vvs.fz%s.fm<v""vvs.GetFm();elseFractionFraet沁n:OPeratOr"(Fraction&a)os<<s.GetFz()<<7<<s.GetFm();1return os;)Fraction Fraction:operator+(Fraction &a) (Fraction r;r.fz=fz*a.fm+fm*a.fz;r.fm=fm*a.fm;r.Reduction();return r;)Fraction Fraction:operator-(Fraction &a)(Fraction r;r.f=fz*a.fm-fm*a.fz;r.fm=fm*a.fm;r.Reduction();retum r;Fraction r;r.fz=fz*a.fz;r.fm=fm*a.fm;r.Rcduction();return r;)Fraction Fraction: :operator/(Fraction &a)(Fraction r;r.fz=fz*a.fm;r.fm=fm*a.fz;r.Reduction();return r;)int main()Fraction obj I ,obj2,r;charindex='+1;int i;if(i=O)char o='y'for(;)(if(o='y")(cin>>objl;Operation(index);cin>>obj2;if(index=,+r)r=objl+obj2;else if(index='-')r=obj 1 -obj2;else if(index=*')r=objl*obj2;else if(index='Z')(for(;)(i=obj2.GetFz();CoUIVV"不能为除数 请重新输入。"<vendl;cin>>obj2;(else break;)r=objlobj2;)cout<<obj 1 <<index<<obj2<<"="<<r<<e ndl;COUt<<"与否继续(yn)"cin>>o;)else break;return 0;四、运行成果及分析cC:Docu>entsand$6十七111854&1111.51门上0工桌面口61)118121-26*6'/8/34 1数:+数l 1 5 333120>z-1*8重Z0入y 5 Izy- Ilyl - y4W旧 4俞久-:xl篡:*期-1/必:/蜘>=1篡枷鹦“八R<刀=I%R2<刀=<*R9g刀重分 个算个5/1 个算个/31个算个/21 个算个个笔席 一运一 W续一运二续一运二续一运一"续一式一心一 入入入Iz继入入入Z3继入入入5>继入入入5>继入欠为人 2+否否Iz否Iz否则输就 请请请1/是请请请IJ是请请请<-是请请请<-是请施用分请分析:第一种加法运算体现了约分B¾功能,第二个减法运算体现了假分数的自行转换功能,第三个乘法运算体现了给负数加括号B¾功能,第四个除法运算体现了自行将分母的负号提给分子的功能,以及最终五行体现了运算符错误的提醒和分母为OaJ提醒。任务三一、任务内容:规定:可以对文献进行存储和读取。规定用一种构造记载学生属性,编写一种学生类以完毕多种操作。详细规定如下:(1)有10个小学生,每个学生有数学、语文两门课,从键盘输入学生的学号、姓名及成绩,计算每个学生的平均成绩,将数据存入StUd.dat中。(2)学生的所有属性用一种构造进行描述。(3)规定对“"、”>>”进行重载。(4)选作规定:可将两门课都不及格的学生信息从链表或数组中删除,并另存入bad.dat中;将学生姓名和平均成绩抽取出来。(5)如下程序测试成果供参照(此处不列举)二、设计思绪建立两个类,并建立一种for循环来实现菜单B选择功能。使用链表储存输入B¾信息,当选择查找与删除数据时,通过链表来寻找顾客要寻找的数据。三、实现代码charname20;# include<iostream>charId20;# include<fstream>intCnum;# include<string.h>intMnum;#include<conio.h>intsum;usingnamespacesld;Student*Next;voidInput()classStudentcout<<',tt名字:";cin>>name;public:cout<<,tt学号:";cin>>Id;void Save();CoUtVV”添力口 成功!"<<endl;cout<<,'tt数学:“;cin>>Cnum;CoUI<v''ll语文:";cin>>Mnum;sum=(Cnum+Mnum)2;)voidReadFile(istream&in)in»name»Id»Cnum»Mnum»sum;voidShow()cout<<name<<,'t"<<Id<<',t"<<Cnum<<,t,r<<Mnum<<"t"<<sum<<"t"<<endl;);classStudentmassage(public:StudentmassageO;-StudentmassageO;voidShowMenu();voidFind();voidModifyltem();voidRemoveItemO;voidSwap(Studenl*,Student*);voidSort();intListCount();voidDisplayO(COUl<<"姓名学号t语文V数学平均,<<endl;for(Student*p=Head->Next;p!=End;p=p->Next)p->Show();CoUt<<”请按任意键”;getch();)voidAddltem()(End->Input();End->Next=newStudent;End=End->Next;CoUt<<“请按任意键”;getch();)private:Student*Head,*End;ifstreamin;ofstreamout;Student*FindItem(char*name)fbr(Studentp=Head;p->Next!=End;p=p->Next)if(!strcmp(p->Next->name,name)retumP;returnNULL;1Student*FindID(char*Id)(fbr(Studentp=Head;p->Next!=End;p=p->Next)if(!strcmp(p->Next->Id,Id)returnp;);StudentmassageiiStudentmassageO(Head=newStudent;Head->Next=newStudent;End=Head->Next;in.open(,sort.txt,');if(!in)cout<<endl;else(while(!in.eof()(End->ReadFile(in);if(End->nameO=,O')break;End->Next=newStudent;return NULL;in.close();End=End->Next;Studentmassageii-StudentmassageO(Save();for(Student*temp;Head->Next!=End;)(temp=Head->Next;Head->Next=Head->Next->Next;deletetemp;1deleteHead,End;)voidStudentmassageiiShowMenuO(CoUt<v"L增长原始记录"<<endl;COUt<<"2.显示多种文献"<<endl;CoUt<<”3.保留原始文献”<<endl;COUt<<"5.删除原始记录"<<endl;COUtVV"6.修改学生信息"<<endl;COUt<<"0.结束程序运行"vvendl;COUtVV"ntt请选择:";)voidStudentmassageiiFindO(charname201,IdIO;intx;Student*p=NULL;COUt<<"tt1.按姓名查找ntt2.按学号查找”;cin>>x;switch(x)(caseLcout<<"tt请输入要查找的!学生姓名:,jcin>>name;if(p=Findltem(name)COUtVV"4.查找学生成绩"v<endl;p->Next->Show();COUt<<”请按任意键”;elsegetch();1cout<<tt没有该学号的学生!else,<<<n'<<endl;(CoUtVV”请按任意键”;cout<<"tt没有该姓名的学生!getch();<,<<<n'<<endl;COUtVV”请按任意键”;(break;getch();)(break;case2:voidStudentmassage:ModifyItemOcoul<<"tt输入要查找的学生学号:charname201;"cin»Id;Student*p=NULL;if(p=FindID(Id)(cout<<"tt请输入要修改口勺人的姓名广;cin»name;p->Next->Show();if(p=Findltem(name)COUt<<”请按任意键”;(getch();cout<<tt已找到学生的J信息,请输入)新口勺信息!”v<endl;temp=p->Next;p->Next->Input();CoUl<v”成功! ,'<<endl;COUl<< ”请按任意键”;getch();)else(coul<<<,tt 没有!"<<endl;COUt«”请按任意键”;getch();)1void Studenlmassage: RemoveItemO(char name20;Student * p=NULL,*temp=NULL;cout<<"tt输入要删除的学生姓 名:"«endl;cin»name;p->Next=p->Next->Next;delete temp;cout<<,tt 删除成功!"v<endl;CoUt<< ”请按任意键”;getch();)else(cout<<,tt 没有!,V<endl;COUtVV ”请按任意键”;getch();void Stuclcntmassage: :Swap( Student *pl,Student *p2)(Student *temp=new Student;if(p=FindItem(name)strcpy(temp->name,p1->name);strcpy(temp->Id,pl->Id);intn=O;temp->Cnum=p1->Cnum;for(Student*temp->Mnum=p1->Mnum;p=Head->Next;p!=End;p=p->Next)temp->sum=p1->sum;n+;Istrcpy(pl->name,p2->name);returnn;strcpy(pl->Id,p2->Id);p1->Cnurn=p2->Cnum;p1->Mnum=p2->Mnum;p1->sum=p2->sum;voidStudentmassage:Sort()strcpy(p2->name,temp->name);strcpy(p2->Id,temp->Id);cout<<,Sorting.',<<endl;p2->Cnum=temp->Cnum;Studentp2->Mnum=temp->Mnum;*p=NULL,*p1=NULL,*k=NULL;p2->sum=temp->sum;intn=Studentmassage:ListCount();)if(n<2)return;for(p=Head->Next;p!=End;p=p->Next)intStudentmassage:ListCount()(for(k=p->Next;k!=End;k=k->Next)/Iif(!Head)if(p->sum>k->sum)return O;StUdemmaSSage:SWaP(P,k);cout <<"is ok ! "<<endl;getch();return;)void Studentmassage: Save()(out.open(,sort.txt");for(Student*p=Head->Next ;p!=End ;p=p->Next)out<<p->name<<"t"<<p->Id<<',t',<<p->Cnu m<<"t,'<<p->Mnum<<',t',<<p->sum<<'n'out.close();)bool quit=false;cout<<',tt 欢迎进入学生成绩管理系统>,<<endl;Studentmassage Grade;cout<<,nntttt 请按任意键”;getch();while(!quit)(system("cls'r);Grade. ShowMenu();cin>>x;switch(x)(case O:quit=true;break;case 1 :Grade. Addltem();break;case 2:Grade.Display();break;case 3:Grade.Sort();break;case4:Grade.Find();break;intmain()case5:Grade.RemoveItem();break;(case6:Grade.ModifyItem();break;intx,i=0;returnO;四、运行成果及分析录善心行记文文成记信运始.生始生序原各量加一除改束增显保查删修结请选择:图3-1功能选择,*C:Docu三entsandSettingsAdBinistrator桌面Debu匕121-3exe'录行 记文文成记信运 始加寨生序 原各愿于 a除改束 增显保高修结添加成功, 请按任意键图3-2增长成绩r',-C:Doc>entsandSettingSAdsinisatrator臬面Debug121-3.exe-录e番心仃il原各聚加一除改束增显保查耨结Sorting.isokI请选择:3原各ii到: 选建字 富己名:6号修改的人的姓名Z平生的信息,请输入新的信息,图3-4修改信息*CDocu三entsandSettingS'Adainistrator桌面Debug121-3.exe'原各季加一除改束增显保高修结姓名学号qXbei01UXb0102BXb0103rXbaL04tXbM05yXb01061.iXb0107iXbgl08DXb0109请按任意键Xbll0学88873¾549¾2娄858844457揖86673654967577363355均&I372281099648588374356图3-5信息显示*C:Docu>entsandSottingsAd*uistratorDcbug121-3.cxc*“ Xbel01请按任意犍l请始人要查找的学生姓名788883C:DocuBentsandSeattingSAdain返trator桌面Debug121-3exe飞显保查删修结原各愿于聚程 加一除改束录誉心行 记文文忠记信运 始物墨序请选择:5输入要删除的学生姓名:“删除成功,请按任意键图3-6删除信息分析:进入菜单界面后,可以选择1-6六个功能。任意功能进行后都能通过任意键来进行循环。通过1、4、5、6来增长、查找、删除和更改学生信息。对应文献夹里会自动保留对应信息。总结或感悟本次课程设计耗时10天,过程中我颇有感悟。在设计任务一时,我颇有信心,也花了很快的时间运用拷贝构造函数和析构函数完毕了该任务,但在碰到任务二0时候,遭遇了诸多挫折。任务二的计算器设计中需要实现相称多0¾功能,起初,在实现公约数和负号加到分子上的功能时,还算顺利,而后来,越来越多的代码扰乱了思维,导致心烦意乱,失去耐心。而也通过一天一天的更改和尝试,我也逐渐完毕一段又一段复杂的代码,实现一种又一种功能,而到最终,我也发现,本来任务二并没有想象中那么繁琐,当所有代码展目前眼前时,完全弄得清晰哪段是用来实现哪个功能,以及各个函数0作用与应用。最费时B¾是任务三。对于任务三,功能更为繁琐不说,其知识点我也是不怎么牢固。我尝试了很久,却并没有播种,更不用说开花成果了。我在网上不停地探索思绪,而后来,我发现了该段代码其实也没有想象中那么天马行空,其实静下心来看看他人完毕后的完整代码,我也发现本来大概我也能懂。但最终,本次课程设计任务三我并没有很原创地完毕,但愿在接下来的时间里我能努力补回这些知识点。课程设计需要大量的耐心和动脑能力,也需要诸多的J知识基础,我想,我最缺乏的是知识基础这块,因此我得在课余时间努力补回自己0知识点,让自己后来进行课程设计时能更为顺畅,也不会再被繁琐所懊恼。