《C++语言程序设计》课程设计报告.doc
“信息与计算科学”专业C+语言程序设计课程设计 班级 姓名 学号 指导教师 设计日期 报告1一、 目的意义 C+语言程序设计是“信息与计算科学”专业的一门院级选修课,在学完计算机基础、C语言程序设计后开设,内容涉及类与对象、函数、继承与派生、多态、流类库与输入输出、模板等。虽然是选修课程,但关系到大部分同学的就业问题。在理论上讲解完面向对象的程序设计方法之后,另一个主要环节就是通过课程设计加以强化,以达到以下目的: 1、通过编写比课堂上机内容更加复杂、深度更广、更加实用的程序达到综合训练的目的,使学生加深理论知识的理解,培养学生采用面向对象的方法开发软件的能力。 2、通过设置一些需要查阅相关资料才能做的题目,提高学生的自学习能力和创新能力。 3、为后续课程数据结构、数据库原理、软件工程、信息安全与编码、数值计算方面专业课的学习和编程打下坚实的基础。二、 内容要求 1、设计题目有理数就是两个整数的比率,通常表示为,分母不能为0。本设计要求设计一个Rational(有理数)类,实现有理数的四则运算,该类型的对象使用起来要像使用基本类型的对象一样自然。2、设计要求具体要求如下:(1)抽象Ration类,包含两个数据成员(分子、分母),比如有理数可以用对象表示为。(2)如果分子分母有公约数,应该约分,例如应表示为。根据需要,有时要将表示为,或者将表示为(3)重载相应的运算符(输入、输出、加、减、乘、除)。比如,要计算,希望像普通加法一样操作,和相加得,算数表达式为。又如,想使用如下形式直接输入分子分母 cin << r ; /输入 cout >> r; /输出则需要重载这两个流运算符。三、设计思想 1、构造函数 构造函数的设计应能满足如下方式创建对象: rational r(5L); / 5/1 rational p; / 0/1 rational s(2,3); / 2/3 rational q(5,-6); /-5/6 rational q(.5); / 1/2 r(5L)和q(.5)调用不同的构造函数,所以需要使用L(1)来区分。前者表示参数是整型数组,.5为double型数据。 使用默认参数的原型如下所示: rational r1,r2(5L),r3(4,8),r4(.75); 不允许分母为零。调用Standardize()私有成员函数,使其对“-”号的表达统一。 如果输入的有理数有公约数,则进行化简。gcd()成员函数用来求公约数,它被Reduce()函数调用,完成化简任务。 2、重载“/”运算符 与构造函数同理,得到结果之后,调用Standardize()和Reduce()函数。 其他运算不需要调用Standardize()函数,根据计算公式很容易写出。 3、重载流运算符 输入输出就是按格式构造输出,很简单。 输入流需要保证正确的格式。首先保证分母不等于零;然后调用Standardize()和Reduce()函数调整格式。四、 程序代码/rational.h#ifndef RATIONAL_H#define RATIONAL_H#include<iostream>using namespace std;namespace stdclass rationalprivate:long num,den;/标准化void Standardize(void);/公约数long gcd(long m,long n)const;public:/用于整数>有理数,实数>有理数的构造函数rational(long p=0,long q=1);rational(double x);/重载流运算符friend istream& operator >>(istream& istr,rational& x);friend ostream& operator <<(ostream& ostr,const rational& x);/双目运算符rational operator+(rational& x)const;rational operator-(rational& x)const;rational operator*(rational& x)const;rational operator/(rational& x)const;/单目运算符rational operator-(void)const;/关系运算符int operator<(rational& x)const;int operator=(rational& x)const;int operator>(rational& x)const;/转换运算符,有理数->实数operator double(void)const;/例程int GetNumerator(void) constreturn num;int GetDenominator(void) constreturn den;/化简有理数void Reduce(void);/各成员函数实现rational:rational(long p,long q):num(p),den(q)if(den=0)cout<<"A Zero denominator is invalid"<<endl;exit(1);Standardize();Reduce();rational:rational(double x)double val1,val2;val1=100000000L*x;val2=10000000L*x;num=long(val1-val2);den=90000000L;Reduce();void rational:Standardize(void)if(den<0)num=-num;den=-den;long rational:gcd(long m,long n)conststatic long x;if(m>n)if(n=0)x=m;else gcd(n,m%n);else if(m=0)x=n;else gcd(m,n%m);return x;istream& operator >>(istream& istr,rational& x)char c;istr>>x.num>>c>>x.den;if(x.den=0)cout<<"A Zero denominator is invalid"<<endl;exit(1);x.Standardize();x.Reduce();return istr;ostream& operator <<(ostream& ostr,const rational& x)ostr<<x.num<<'/'<<x.den;return ostr;rational rational:operator +(rational& x)constrational temp=rational(num*x.den+den*x.num,den*x.den);temp.Reduce();return temp;rational rational:operator -(rational& x)constrational temp=rational(num*x.den-den*x.num,den*x.den);temp.Reduce();return temp;rational rational:operator*(rational& x)constrational temp=rational(num*x.num,den*x.den);temp.Reduce();return temp;rational rational:operator/(rational& x)constrational temp=rational(num*x.den,den*x.num);temp.Standardize(); temp.Reduce();return temp;rational rational:operator-(void)constreturn rational(-num,den);int rational:operator<(rational& x)constreturn(num*x.den<den*x.num);int rational:operator=(rational& x)constreturn(num*x.den=den*x.num);int rational:operator>(rational& x)constreturn(num*x.den>den*x.num);rational:operator double(void)constreturn double(num)/den;void rational:Reduce(void)long bigdivisor,tempnumerator; tempnumerator=(num<0)?-num:num;if(num=0)den=1;elsebigdivisor=gcd(tempnumerator,den);if(bigdivisor>1)num/=bigdivisor;den/=bigdivisor;void PrintMixedNumber(rational x)long wholepart=long(x.GetNumerator()/x.GetDenominator();rational fractionpart=x-rational(wholepart);if(fractionpart=rational(0L)cout<<wholepart<<" "elsefractionpart.Reduce();if(wholepart<0)fractionpart=-fractionpart;if(fractionpart!=0)cout<<wholepart<<" "<<fractionpart<<" "else cout<<fractionpart<<" "#endif/rational.cpp#include"rational.h"void main()cout<<"一、有理数的转换及四则运算"<<endl;rational r1,r2(5L),r3(4,8),r4(.75);cout<<"已知:"<<"r1="<<r1<<", r2="<<r2<<", r3="<<r3<<", r4="<<r4<<endl;cout<<"进行如下的简单四则运算:"<<endl;cout<<"1、r5=r1+r2-r3+r4="rational r5=r1+r2-r3+r4;cout<<r5<<endl;cout<<"2、-r5="<<-r5<<endl;cout<<"3、r6=r1+r2*r3-r4+r2/r4="<<r1+r2*r3-r4+r2/r4<<endl<<endl; cout<<"二、以带分数形式输出有理数"<<endl;cout<<"1、r5="PrintMixedNumber(r5);cout<<endl;cout<<"2、-r5=" PrintMixedNumber(-r5);cout<<endl<<endl;cout<<"三、动态分数与小数的转化运算"<<endl;float f;cout<<"已知r5="<<r5<<","<<"则r5+0.5="cout<<r5+.5<<endl;cout<<"请输入一个分数:"cin>>r1;f=float(r1);cout<<"等效的小形式数为:"<<f<<endl;cout<<"请输入一个浮点数:"cin>>f;r1=f;cout<<"转化为分数形式为:"<<r1<<endl<<endl; cout<<"四、有理分数的化简"<<endl;cout<<"请输入一个能够化简的分式:"cin>>r1; cout<<"化简后:"cout<<r1<<endl<<endl; cout<<"五、比较两个分数的大小"<<endl;rational r7,r8;cout<<"请输入两个分数:"<<endl;cin>>r7>>r8;cout<<"结果为:"if(r7>r8)cout<<r7<<">"<<r8<<endl;if(r7=r8)cout<<r7<<"="<<r8<<endl;if(r7<r8)cout<<r7<<"<"<<r8<<endl;五、 测试用例及测试结果 1、第一次测试得到: 2、第二次测试得到:六、 程序不足及升级方向 这个程序的设计涉及的知识较多,测试工作量也比较大。要求设计好测试用例,编写合适的测试程序进行测试,以上我编的测试程序可能也不是十分全面。需要进一步努力和更深入的考虑。 程序编写上有些地方还可以使用菜单程序,使得使程序的灵活性和可操作性更大、更广。 七、参考文献1 姚全珠.C+面向对象程序设计M.北京:电子工业出版社,2010.3 刘振安,刘燕君,孙枕.C+程序设计课程设计M.北京:机械工业出版社,2004.报告2一、目的意义 C+语言程序设计是“信息与计算科学”专业的一门院级选修课,在学完计算机基础、C语言程序设计后开设,内容涉及类与对象、函数、继承与派生、多态、流类库与输入输出、模板等。虽然是选修课程,但关系到大部分同学的就业问题。在理论上讲解完面向对象的程序设计方法之后,另一个主要环节就是通过课程设计加以强化,以达到以下目的: 1、通过编写比课堂上机内容更加复杂、深度更广、更加实用的程序达到综合训练的目的,使学生加深理论知识的理解,培养学生采用面向对象的方法开发软件的能力。 2、通过设置一些需要查阅相关资料才能做的题目,提高学生的自学习能力和创新能力。 3、为后续课程数据结构、数据库原理、软件工程、信息安全与编码、数值计算方面专业课的学习和编程打下坚实的基础。二、内容要求 1、设计题目使用继承的方法,编写最多能输入10个职工的信息表,再根据这个表产生一个职工信息简表,并利用多态性实现信息的输出。 2、设计要求设计要求实现如下功能: (1).建立职工信息数据,包括职工编号、姓名,性别和年龄。 (2)据职工信息表,建立只含姓名和年龄的职工信息简表。 (3)使用继承的方法构造2个类,使用相应的对象数组放置10个职工信息。 (4)编写同名display( )成员函数,用来输出数组的内容。(5)编写函数printer( ),用来根据实际对象输出它们的内容。三、设计思想 1、类的结构 这里把简表的内容作为基类worker,由它派生详表类workers。这样,简表可以由赋值兼容规则得到。例如workers的一个对象wks为: 编 号 姓 名 性 别 年 龄 1001 张三 男 25 则worker的对象wk可以通过以下赋值兼容规则得到: wk=wks;这时wk的信息为: 姓名 年龄 张三 25 2、多态性 将worker的display()成员函数设计为虚函数,printer()函数使用基类worker对象的引用作为参数,即可实现多态性。 void printer(worker&s) s.display(); 3、设计主函数 要求编写最多输入10个职工的信息表,这里的意思是可以少于10个职工。使用ch存放读入的字符,当输入0时退出输入,同时将输入个数作为输出语句的循环次数。例如使用整型变量number存放输入个数,则可使用如下方法实现: if(0=w_num)number=i;break; 使用const定义一个常量SIZE=10,这样可以增加程序的灵活性。四、程序代码#include<iostream>#include<string>using namespace std;const int SIZE=10;/职工简表类class Workerprivate:int age;public:char name100;void setname(char n100);char getname();void setage(int a);int getage(); virtual void display();class Workers:public Workerprivate: int num;char sex6;public:void setnum(int n);int getnum();void setsex(char sSIZE);char getsex();void display();void printer(Worker&);void Worker:setname(char n100)strcpy(name,n);char Worker:getname() cout<<name; return(1);void Worker:setage(int a)age=a;int Worker:getage()return age;void Worker:display()cout<<"t"<<name<<"t"<<age<<endl;void Workers:setnum(int n)num=n;int Workers:getnum()return num;void Workers:setsex(char sSIZE)strcpy(sex,s);char Workers:getsex()cout<<sex; return(1);void Workers:display()cout<<num<<"t"<<name<<"t" <<getage()<<"t"<<sex<<endl;/显示职工信息处理函数void printer(Worker&s)s.display();/主函数void main()Workers wksSIZE;Worker wkSIZE;int number;int w_num;char ch10;int w_age;cout<<endl<<endl<<"t"<<"职工信息表"<<endl<<endl;cout<<"请输入职工信息,以输入编号为0结束!"<<endl;for(int i=0;i<SIZE;i+)cout<<"编号:"cin>>w_num;if(0=w_num)number=i;break;wksi.setnum(w_num);cout<<"姓名:"cin>>ch;wksi.setname(ch);cout<<"性别:"cin>>ch;wksi.setsex(ch);cout<<"年龄:"cin>>w_age;wksi.setage(w_age);cout<<endl;cout<<endl;for(i=0;i<number;i+)wki=wksi;cout<<"t职工信息详表"<<endl;cout<<"编 号"<<"t姓 名"<<"t年 龄"<<"t性 别"<<endl;for(i=0;i<number;i+)printer(wksi);cout<<endl;cout<<"t职工信息简表"<<endl;cout<<"t姓 名"<<"t年 龄"<<endl;for(i=0;i<number;i+)printer(wki);五、 测试用例及测试结果 1、输入职工信息,以编号输入0结束,输出职工信息(简表和详表): 2、直接输入0,结束输入:六、程序不足及升级方向这个程序设计的目的主要是通过典型例子熟悉基本知识,程序设计比较简单。可以考虑使用菜单和其他功能,比如使用向量设计的方法,用添加对象的方法操作向量。七、参考文献1 姚全珠.C+面向对象程序设计M.北京:电子工业出版社,2010.2 郑莉.C+语言程序设计M.北京:清华大学出版社,2007.3 刘振安,刘燕君,孙枕.C+程序设计课程设计M.北京:机械工业出版社,2004. 报告3一、目的意义 C+语言程序设计是“信息与计算科学”专业的一门院级选修课,在学完计算机基础、C语言程序设计后开设,内容涉及类与对象、函数、继承与派生、多态、流类库与输入输出、模板等。虽然是选修课程,但关系到大部分同学的就业问题。在理论上讲解完面向对象的程序设计方法之后,另一个主要环节就是通过课程设计加以强化,以达到以下目的: 1、通过编写比课堂上机内容更加复杂、深度更广、更加实用的程序达到综合训练的目的,使学生加深理论知识的理解,培养学生采用面向对象的方法开发软件的能力。 2、通过设置一些需要查阅相关资料才能做的题目,提高学生的自学习能力和创新能力。 3、为后续课程数据结构、数据库原理、软件工程、信息安全与编码、数值计算方面专业课的学习和编程打下坚实的基础。二、 内容要求 1、设计题目菜单是应用程序的界面,通过控制语句改变程序执行的顺序,设计菜单是程序设计的基础。本设计分两步:2、设计要求第一步:设计一个菜单程序。 菜单内容:程序运行后,给出3个菜单项的内容和输入提示,如下: 1)利用克莱姆法则求解线性方程组。 2)统计一篇英文文章的单词数。 3)退出程序。第二步:为上述菜单项配上相应的功能。三、设计思想首先编写一个菜单驱动程序,输入13中的任意一个数字,即可进入相应的菜单选项。1、 实现循环和功能选择编写一个菜单函数menu(),用whlie循环控制菜单的重复选择,用switch语句对应用户的选择,并且实现相应的功能。实际使用时,只有选择3,程序才会运行结束。2、 设计各个选择功能对于选择一,运用克莱姆法则求解线性方程组,用了多个循环和if判断语句,其中两个函数调用,其主要功能是求解行列式的数值。选择二,统计一篇英语文章的单词数,设计了一个Word类,定义了一个构造函数,用于输入文章。定义了一个cacula()成员函数,用到了一个for循环,运用0控制上限,再运用空格间接实现单词数的统计。比较简单。3、 设计头文件和主函数这里选择一中用到的二维数组,再头文件中定义了全局变量,用到了math和字符串两个头文件。 主函数运用循环控制语句while和switch的组合进行的设计。简单明了。四、 程序代码#include<iostream>#include<math.h>using namespace std;const int N=20;static int aNN ,bN;int diN,cN;double xN;void menu();class Wordprivate:int s;char str100;public: Word();int cacula();Word:Word()cout<<"请输入一篇英语文章:"<<endl;gets(str);int Word:cacula()int num=0,word=0; char c; char str100; gets(str);for(int s=0;(c=strs)!='0's+) if(c=' ')word=0;else if(word=0)word=1;num+; return num;void menu()cout<<"t"<<"菜 单"<<endl;cout<<"选择一:利用克莱姆法则求解线性方程组;"<<endl;cout<<"选择二:统计一篇英文文章的单词数;"<<endl;cout<<"选择三:退出。"<<endl;cout<<endl<<"请选择:"int term (int n, int k) int p,q,t=1; for (p=1; p<n; p+) for(q=0; q<p; q+) if(kq>kp) t=-t; for (p=0;p<n; p+) t*=apkp; return (t); int det(int n) int j0,j1,j2,j3,j4,j5,j6,d,kN; d=0; for(j0=0;j0<n;j0+) if(a0j0=0) continue; k0=j0; for(j1=0;j1<n;j1+) if(j1=j0) continue; if(a1j1=0) continue; k1=j1; if(n=2) d+=term(n,k); for (j2=0;j2<n;j2+) if(j2=j0) continue; if(j2=j1) continue; if(a2j2=0) continue; k2=j2; if(n=3) d+=term(n,k); for (j3=0; j3<n; j3+) if(j3=j0) continue; if(j3=j1) continue; if(j3=j2) continue; if(a3j3=0) continue; k3=j3; if(n=4) d+=term(n,k); for(j4=0; j4<n; j4+) if(j4=j0) continue; if(j4=j1) continue; if(j4=j2) continue; if(j4=j3) continue; if(a4j4=0) continue; k4=j4; if(n=5) d+=term(n,k); for(j5=0;j5<n;j5+) if(j5=j0) continue; if(j5=j1) continue; if(j5=j2) continue; if(j5=j3) continue; if(j5=j4) continue; if(a5j5=0) continue; k5=j5; if(n=6) d+=term(n,k); for(j6=0;j6<n;j6+) if(j6=j0) continue; if(j6=j1) continue; if(j6=j2) continue; if(j6=j3) continue; if(j6=j4) continue; if(j6=j5) continue; if(a6j6=0) continue; k6=j6; d+=term(n,k); return (d);void main()int v,g=1;while(g)menu();cin>>v;cout<<endl;switch(v)case 1:int i,j,n,d; cout<<"请输入线性方程组的未知数个数n=" cin>>n;cout<<"请按要求输入线性方程组信息:"<<endl; for (i=0;i<n;i+) for(j=0;j<n;j+) cout<<"a"<<i+1<<""<<j+1<<"=" cin>>aij; cout<<"b"<<i+1<<"=" cin>>bi; cout<<"由输入情况,得到元素矩阵:"<<endl; for (i=0;i<n;i+) for (j=0;j<n;j+) cout<<aij<<" " cout<<bi<<" " cout<<endl; d=det(n); for (j=0;j<n;j+) for (i=0;i<n;i+) ci=aij; aij=bi; dij=det(n); for(i=0;i<n;i+) aij=ci; cout<<"最后求得线性方程组解的情况为:"<<endl; for (i=0;i<n;i+) xi=(0.0+dii)/d; cout<<"x("<<i+1<<")="<<xi<<endl; cout<<"计算结束,欢迎下次使用!"<<endl<<endl; break; case 2: Word w; int fz; fz=w.cacula(); cout<<"统计到这篇文章的单词数为:"<<fz<<endl; cout<<"统计结束,欢迎下次使用!"<<endl<<endl;