C++程序设计习题.doc
《C++程序设计习题.doc》由会员分享,可在线阅读,更多相关《C++程序设计习题.doc(37页珍藏版)》请在咨信网上搜索。
C++程序设计 练习题 学院: 计算机学院 专业班级: 物联网1002 学号:0121010340705 姓名: 徐 远 志 第八章 1.下面是一个类的测试程序,试设计出能是用如下测试程序的类. Int main() { Test x; x.initx(30,20); x.printx(); return 0; } 解: #include <iostream> using namespace std; class Test //类的开始 { public: void initx(int i,int j); void printx(); private: int x,y; }; void Test::initx(int i,int j) { x=i; y=j; } void Test::printx() { cout<<x<<"*"<<y<<"="<<x*y<<endl; } //类的结束 int main() //测试函数 { Test x; x.initx(30,20); x.printx(); return 0; } 得到的测试结果: 4.定义并实现一个矩形类Crectangle。该类包含了下列成员函数。 Crectangle(): 累的构造函数,根据需要可以定义多个构造函数 SetTop(),SetLeft(): 设置矩形的左上角坐标 SetLength(),SetWidth(): 设置矩形的长和宽 Perimeter(): 求矩形的周长 Area(): 求矩形的面积 GetWidth(): 返回矩形的宽度 Getlength(): 返回矩形的长度 IsSquare(): 判断矩形是否为正方形 Move(): 将矩形从一个位置移动到另一个位置 Size(): 改变矩形的大小 Where(): 返回矩形的左上角的坐标 PrintRectangle(): 输出矩形的四个顶点的坐标 数据成员 int top,left; int length,width; 解: #include <iostream> using namespace std; class Crectangle //类的开始 { int top,left; int length,width; public: Crectangle(int t=0,int l=0,int len=1,int w=1) { top=t;left=l; if (len>0) length=len; else length=0; if (w>0) width=w; else width=0; } void SetTop(int t) { top=t; } void SetLeft(int l) { left=l; } void SetLength(int len) { length=len; } void SetWidth(int w) { width=w; } int Perimeter() { return 2*(width+length); } int Area() { return width*length; } int GetWidth() { return width; } int GetLength() { return length; } int IsSquare() { if(width==length) { cout<<"该矩形是正方形"<<endl; return 1; } else { cout<<"该矩形不是正方形"<<endl; return 0; } } void Move(int x,int y) { left+=x; top+=y; } void Size(int l,int w) { length=l; width=w; } void PrintRectangle() { cout<<"左上方的点为:("<<left<<","<<top<<")"<<endl; cout<<"右上方的点为:("<<left+length<<","<<top<<")"<<endl; cout<<"左下方的点为:("<<left<<","<<top+width<<")"<<endl; cout<<"右下方的点为:("<<left+length<<","<<top+width<<")"<<endl; } }; //类的结束 int main() { Crectangle a(1,1,5,5); a.PrintRectangle(); a.SetTop(2); a.SetLeft(3); a.SetLength(4); a.SetWidth(5); a.IsSquare(); cout<<"周长为:"<<a.Perimeter()<<endl; cout<<"面积为:"<<a.Area()<<endl; a.PrintRectangle(); cout<<"用getwidth等函数得到的值为:"<<endl; cout<<" 长为:"<<a.GetLength<<endl; cout<<" 宽为:"<<a.GetWidth<<endl; return 0; } 得到的测试结果: 6.某次歌手大赛中,有JudgeNum个评委给选手打分,参加比赛的选手有PlayerNum 名,现为比赛积分编写一个CompetitionResult类,类的定义如下: (定义略) (1) 写出所有的成员函数和实现代码。 (2) 编写main()函数对该类进行测试。在函数体中,定义了一个competitionResult类的对象数组r[PlauerNum],他的每个元素记录了每个选手的所有信息,个评委的打分通过键盘的输入,在屏幕上应有提示信息进行交互式操作,比赛结果按选手得分从高到底排列输出。 解: (1)CompetitionResult::CompetitionResult() { num=0; strcpy(name,""); for(int i=0;i<JudgeNum;i++) score[i]=0.0; average=0; } CompetitionResult::CompetitionResult(short n,char*ps) { num=n;strcpy(name,ps); for(int i=0;i<JudgeNum;i++) score[i]=0.0; average=0; } float CompetitionResult::MaxScore() { int max=score[0]; for(int i=0;i<JudgeNum;i++) if(max<score[i]) max=score[i]; return max; } float CompetitionResult::MinScore() { int min=score[0]; for(int i=0;i<JudgeNum;i++) if(min>score[i]) min=score[i]; return min; } void CompetitionResult::SetAvg() { int i;float sum=0.0; for(i=0;i<JudgeNum;i++) sum+=score[i]; sum=sum-MaxScore()-MinScore(); average=sum/(JudgeNum-2); } float CompetitionResult::GetAvg() { return average; } short CompetitionResult::GetNo(int i) {return num;} void CompetitionResult::SetNo(int i) {num=i;} char CompetitionResult::* GetName() {return name ;} float CompetitionResult::GetScore(int j) {return score[j];} void CompetitionResult::Setscore(int k,float av) { score[k]=av; } void Sort(CompetitionResult *pr,int n) { int i,j ,k; CompetitionResult temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if((pr[j].average)>(pr[k].average)) k=j; if(k!=j) { temp=pr[i]; pr[i]=pr[k]; pr[k]=temp; } } } (2) int main() { CompetitionResult player[PlayerNum]={CompetitionResult(1,"one"), CompetitionResult(2,"two"),CompetitionResult(3,"there"), CompetitionResult(4,"four"),CompetitionResult(5,"five"), CompetitionResult(6,"six"),CompetitionResult(7,"seven"), CompetitionResult(8,"eight"),CompetitionResult(9,"nine"), CompetitionResult(10,"ten")}; float a; for(int i=0;i<PlayerNum;i++) { cout<<"请评委给第"<<i+1<<"个选手打分:"<<endl; for(int j=0;j<JudgeNum;j++) { cin>>a; player[i].Setscore(j,a); } player[i].SetAvg(); cout<<endl; } Sort(player,PlayerNum); cout<<" 最后的得分情况为: "<<endl; for (int j=0;j<PlayerNum;j++) {cout<<j+1<<" "; cout<<setw(6)<<player[j].GetAvg(); cout<<" "<<player[j].GetName()<<endl; } return 0; } 程序运行的结果为: 第九章 1. 在下面的程序中,派生类Derived 的成员函数sets()能否访问基类base中得变量a和b?为什么?如果在基类base中将数据成员a和b定义为私有成员,下面的程序能否通过编译?为什么? #include <iostream> using namespace std; class Base { public: void set(int i,int j) {a=i;b=j;} void show() {cout<<"a="<<a<<",b="<<b<<endl;} protected: int a,b; }; class Derived:public Base { public: void sets() {s=a*b;} void shows() {cout<<"s="<<s<<endl;} private: int s; }; int main() { Derived obj; obj.set(2,3); obj.show(); obj.sets(); obj.shows(); return 0; } 解:可以访问a和b;因为a,b为保护成员,经公有继承,成为派生类中得保护成员,所以派生类Derived 的成员函数sets()能访问基类base中得变量a和b。 如果定义为私有,则不能通过编译。因为派生类中的成员函数不能访问基类中得私有成员 2.声明一个图形基类Shape,在它的基础上派生出矩形类Rectangle和圆形类Circle,它们都有计算面积的和周长、输出图形信息的成员函数,再在Rectangle类的基础上派生方形类Square。编写程序和各类的定义和实现,以及类的使用。 解: #include <iostream> using namespace std; class Shape { public: double getArea(){} double getPerimeter() {} }; class Rectangle:public Shape { protected: double height; double width; public: Rectangle() {} Rectangle(double a,double b) { height=a; width=b; } double getArea() { return height*width; } double getPerimeter() { return 2*(height+width); } }; class Circle:public Shape{ public: Circle(double x):r(x){} double getPerimeter() { return 2*3.1416*r; } double getArea() { return r*r*3.1416; } private: double r; }; class Square:public Rectangle { public: Square(double x) { height=x; width=x; } }; int main() { Rectangle a1(2.2,3.2); Circle a2(4.2); Square a3(5.3); cout<<"Area="<<a1.getArea()<<endl; cout<<"Perimeter="<<a1.getPerimeter()<<endl; cout<<"Area="<<a2.getArea()<<endl; cout<<"Perimeter="<<a2.getPerimeter()<<endl; cout<<"Area="<<a3.getArea()<<endl; cout<<"Perimeter="<<a3.getPerimeter()<<endl; return 0; } 5.某销售公司有销售经理和销售员工,月工资的计算办法为:销售激励的底薪为4000元,并将销售额的2/1000做提成,销售员工无底薪,只提取5/1000为工资。 编写程序: (1) 定义一个积累Employee,它包含三个数据成员number,name和salary,以及编号和姓名的构造函数。 (2) 有Employee类派生Salesman类。Salesman类包含两个新数据成员commrate和sales,还包括了用于输入销售额并计算销售员工工资的成员函数pay()和用于输出打印的print()。 (3) 由Salesman派生Salemanager,Salesmmanage类包含新数据成员monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay()和用于输出的print()。 (4) 编写main()函数中测试所设计的类结构。 解: (1)class Employee { public: Employee(long num,char *n) { number=num; strcpy(name,n); } protected: long number; char name[20]; double salary; }; (2)class Salesman:public Employee { public: Salesman(long num,char *n,float c=0.005):Employee(num,n) { commrate=c;} void pay() { cout<<"ÇëÊäÈë"<<name<<"±¾ÔÂÍê³ÉµÄÏúÊÛ¶î:"; cin>>sales; salary=commrate*sales; } void print(){ cout<<name<<"µÄ¹¤×ÊΪ£º"<<salary<<endl; } protected: float commrate; double sales; }; (3) class Salesmanager:public Salesman { public: Salesmanager(long num,char *n,float c=0.002,double m=4000):Salesman(num,n,c){ monthlypay=m;} void pay(){ cout<<"ÇëÊäÈë"<<name<<"±¾ÔÂÍê³ÉµÄÏúÊ۶"; cin>>sales; salary=monthlypay+commrate*sales; } void print(){ cout<<name<<"µÄ¹¤×ÊΪ£º"<<salary<<endl; } private: double monthlypay; }; (4) int main() { Salesman s1(1234,"ÀîÈð"); Salesmanager s2(1357,"ÎÄÇ¿"); s1.pay(); s1.print(); s2.pay(); s2.print(); return 0; } 第十章 1.定义一个辅助类Complex,重载运算符+、-、*、/使之能用于复数的加减乘除运算。运算符重载函数为Complex类的成员函数。编写程序,分别求出两个复数之和、差、积、商。 解: #include <iostream> using namespace std; class Complex { public: Complex(double r=0.0,double i=0.0) {real=r;imag=i;} Complex operator + (Complex); friend Complex operator - (Complex,Complex); Complex operator * (Complex); friend Complex operator / (Complex,Complex); void display(); private: double real,imag; }; Complex Complex::operator + (Complex c) { return Complex(real+c.real,imag+c.imag); } Complex operator - (Complex c1,Complex c2) { return Complex(c1.real-c2.real,c1.imag-c2.imag); } Complex Complex::operator * (Complex c) { return Complex(real*c.real-imag+c.imag,imag*c.imag+real*c.real); } Complex operator / (Complex c1,Complex c2) { double r,i; r=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); i=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return(r,i); } void Complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; } int main() { Complex c1(7.1,8.4),c2(1.4,5),c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1+c2; cout<<"c1+c2=";c3.display(); c3=c1-c2; cout<<"c1-c2=";c3.display(); c3=c1*c2; cout<<"c1*c2=";c3.display(); c3=c1/c2; cout<<"c1/c2=";c3.display(); return 0; } 2.定义一个日期类Date,包括年,月,日等私有数据成员。要求为所定义的Date类设计如下重载运算符函数: Date operator+(int days); 返回一日起加天数days后得到的日期 Date operator-(int days); 返回一日起减天数days后得到的日期 Int operator-(Date &b); 返回两日期相差的天数 解: #include <iostream> using namespace std; int day_tab[12]={31,28,31,30,31,30,31,31,30,31,30,31}; class Date { public: Date() {} Date(int y,int m,int d) {year=y;mon=m;day=d;} void setday(int d) {day=d;} void setmon(int m) {mon=m;} void setyear(int y) {year=y;} int getday() {return day;} int getmon() {return mon;} int getyear() {return year;} Date operator + (int days) { static Date date; int number=dton(*this); number-=days; date=ntod(number); return date; } Date operator - (int days) { static Date date; int number=dton(*this); number-=days; date=ntod(number); return date; } int operator - (Date &b) { int days=dton(*this)-dton(b)-1; return days; } void disp() {cout<<year<<"."<<mon<<"."<<day<<endl; } private: int year,mon,day; int leap(int); int dton(Date &); Date ntod(int); }; int Date::leap(int year) { if(year%4==0&&year&100!=0||year%400==0) return 1; else return 0; } int Date::dton(Date &d) { int y,m,days=0; for(y=1;y<=d.year;y++) if(leap(y)) days+=366; else days+=365; day_tab[1]=leap(d.year)?29:28; for(m=0;m<d.mon-1;m++) days+=day_tab[m]; days+=d.day; return days; } Date Date::ntod(int n) { int y=1,m=1,d,rest=n,days_year; while(1) { days_year=leap(y)?366:365; if(rest<days_year) break; else rest-=days_year; y++; } y--; day_tab[1]=leap(y)?29:28; while(1) { if(rest>day_tab[m-1]) rest-=day_tab[m-1]; else break; m++; } d=rest; return Date(y,m,d); } int main() { Date now(2011,12,22),Nationday(1949,10,1); cout<<"now:";now.disp(); cout<<"Nationday:";Nationday.disp(); cout<<"Ïà²îÌìÊý:"<<(now-Nationday)<<endl; Date d1=now+365,d2=now-365; cout<<"now+365:";d1.disp(); cout<<"now-365:";d2.disp(); return 0; } 3.编写一个程序尖酸正方体圆柱体的表面积和体积。要求抽象出一个公共的基类Body,吧他当做抽象类,在该类中定义表面积和体积的纯虚函数。抽象类中定义一个数据成员data,他可以作为求的半径,正方形的边长,或者圆柱体的地面半径。在三个类中都有计算白面积和体积的函数的具体实现。 解: #include <iostream> using namespace std; class Body { protected: double data; public: Body(double data) { Body::data=data; } virtual double s()=0; virtual double v()=0; }; class Cube:public Body { public: Cube(double data):Body(data){}; double s() {return data*data*6; } double v() {return data*data*data; } }; class Sphere:public Body { public: Sphere(double r):Body(r){}; double s() { return data*data*3.1416*4; } double v() { return 4*data*data*data/3; } }; class Cylinder:public Body { double height; public: Cylinder(double r,double height): Body(r){Cylinder::height=height;} double s() { return (2*3.1416*data*data+2*data*3.1416*height); } double v() { return data*data*3.1416*height; } }; int main() { Body *p; Cube obj1(5); Sphere obj2(5); Cylinder obj3(5,5); p=&obj1; cout<<"正方体的表面积:"<<p->s()<<endl; cout<<"正方体的体积:"<<p->v()<<endl; p=&obj2; cout<<"球的表面积:"<<p->s()<<endl; cout<<"球的体积:"<<p->v()<<endl; p=&obj3; cout<<"球的表面积:"<<p->s()<<endl; cout<<"球的体积:"<<p->v()<<endl; return 0; } 第十一章 1. 已知 Void Sort(int a[],int size); Void Sort(double a[],int size); 是一个函数模板的两个例子,起功能是将数组a中得前size个元素按从小到大的顺序依次排列。是设计函数模板。 解:#include <iostream> using namespace std; template<class T> void Sort(T set[],int n) { int i,j; T temp; for (i=1;i<n;i++) for(j=n-1;j>i;j--) if(set[j-1]>set[j]) { temp=set[j-1]; set[j-1]=set[j]; set[j]=temp; } } int main() { int a[]={4,5,8,9,3}; double b[]={3,5,6.7,2,5.2,9.2,10.3}; Sort(a,6); Sort(b,6); for(int i=0;i<6;i++) cout<<a[i]<<" "; cout<<endl; for(i=0;i<6;i++) cout<<b[i]<<" "; cout<<endl; return 0; } 2. 设有如下声明 class Test {public: Void SetData1(int val) {data1=val;} Void SetData2(doule val) {data2=val;} int GetData1(){ return data1;} double GetData2() {return data2;} private: int data1; double data2; } 试将此类声明为类模板的声明,使得数据成员data1和data2可以使任何类型 #include <iostream> #include <string> using namespace std; template <class T1,class T2> class Test { public: void SetData1(T1 val) {data1=val;} void SetData2(T2 val) {data2=val;} T1 GetData1() { return data1;} T2 GetData2() {return data2;} private: int data1; double data2; }; int main() { Test<int,double> t1; t1.SetData1(10); t1.SetData2(5.4); cout<<t1.GetData1()<<" "<<t1.GetData2()<<endl; Test<char ,string> t2; t2.SetData1('a'); t2.SetData2("China"); cout<<t2.GetData1()<<" "<<t2.GetData2()<<endl; return 0; } 3栈是一种重要的数据结构,它是一种只允许在彪的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的令一端称为栈底。下面是一个整形栈类的定义: Const int MaxSize=100; Class Istack { Public: Istack(); void Push(int &n); void pop(); int GetTop(); bool Empty(); int size(); boid ClearStack(); ~Istack(); Private: Int elem[MaxSize]; Int top; } 编写一个栈的类模板,以便为任何类型的对象提供栈结构的数据操作。 解: #include <iostream> #include <string> using namespace std; const int- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 习题
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文