c++习题.docx
- 文档编号:29699134
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:123
- 大小:57.29KB
c++习题.docx
《c++习题.docx》由会员分享,可在线阅读,更多相关《c++习题.docx(123页珍藏版)》请在冰豆网上搜索。
c++习题
C++习题与解析(类和对象-01)
题1.分析以下程序执行的结果
#include
#include
classSample
{
public:
intx,y;
Sample(){x=y=0;}
Sample(inta,intb){x=a;y=b;}
voiddisp()
{
cout<<"x="< } }; voidmain() { Samples1(2,3); s1.disp(); } 解: 本题说明了重载构造函数的定义方法。 首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员。 所以输出为: x=2,y=3。 注意: 构造函数是唯一不能被显式调用的成员函数,它在定义类的对象时自动调用,也称为隐式调用。 -------------------------------------------------------- 题2.分析以下程序的执行结果 #include classSample { intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} ~Sample() { if(x==y) cout<<"x=y"< else cout<<"x! =y"< } voiddisp() { cout<<"x="< } }; voidmain() { Samples1(2,3); s1.disp(); } 解: 本题说明了析构函数的定义方法。 首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员,最后在退出程序时自动调用析构函数。 所以输出为: x=2,y=3 x! =y 注意: 析构函数在对象的作用域结束时被自动隐式调用。 ---------------------------------------------------- 题3.分析以下程序的输出结果 #include classSample { intx; public: Sample(inta) { x=a; cout<<"constructingobject: x="< } }; voidfunc(intn) { staticSampleobj(n); } voidmain() { func (1); func(10); } 解: 本题说明静态对象构造函数的调用情况,由于在func()函数中定义的对象obj是静态对象,故只被构造一次,所以输出为: counstructingobject: x=1 注意: 静态对象和静态变量一样,只被构造一次。 块作用域的静态变量,在首次进入到定义该静态对象的函数时,构造该静态对象,以后进入该函数时不再构造静态对象。 ------------------------------------------------------ 题1.4分析以下程序的执行结果 #include classSample { intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} voiddisp() { cout<<"x="< } }; voidmain() { Samples(2,3),*p=&s; p->disp(); } 解: 本题说明了对象指针的使用方法。 这里通过指向对象的指针来调用对象的成员函数。 对象指针p指向对象s,p->disp()等价于s.disp()。 所以输出为: x=2,y=3. 题1.5分析以下程序的执行结果 #include classSample { public: intx; inty; voiddisp() { cout<<"x="< } }; voidmain() { intSample: : *pc; Samples; pc=&Sample: : x; s.*pc=10; pc=&Sample: : y; s.*pc=20; s.disp(); } 解: 本题说明了类数据成员指针的使用方法。 在main()中定义的pc是一个指向Sample类数据成员的指针。 执行pc=&Sample: : x时,pc指向数据成员x,语句s.*pc=10等价于s.x=10(为了保证该语句正确执行,Sample类中的x必须是公共成员);执行pc=&Sample: : y时,pc指向数据成员y,语句s.*pc=20等价于s.y=20(同样,Sample类中的y必须是公共成员)。 所以输出为: x=10,y=20。 ----------------------------------------------------- 题1.6下面是一个类的测试程序,设计出能使用如下测试程序的类。 voidmain() { Testa; a.init(68,55); a.print(); } 其执行结果为: 测试结果: 68-55=13 解: 本题是要设计Test类,其设计方法很多,这里给出一种解法。 Test类包含两个私有数据成员x、y,以及两个公共成员函数init()和print(),前者用于给数据成员赋值,后者用于x,y的减法运算和输出相应的结果。 #include classTest { intx,y; public: voidinit(int,int); voidprint(); }; voidTest: : init(inti,intj) { x=i;y=j; } voidTest: : print() { cout<<"测试结果: "< } 注意: 类是一个外壳,它包含了类实例化时数据和代码的使用方法,它是一种模板,只有在定义类的对象时,才为对象分配空间,而不会为类分配空间。 ------------------------------------------------------ 题1.7设计一个Bank类,实现银行某账号的资金往来账目管理,包括建账号、存入、取出等。 解: Bank类包括私有数据成员top(当前账指针),date(日期),money(金额),rest(余额)和sum(累计余额)。 另有一个构造函数和三个成员函数bankin()(处理存入账),bankout()处理取出账)和disp()(输出明细账)。 本题程序如下: #include #include #defineMax100 classBank { inttop; chardate[Max][10]; //日期 intmoney[Max]; //金额 intrest[Max]; //余额 staticintsum; //累计余额 public: Bank(){top=0;} voidbankin(chard[],intm) { strcpy(date[top],d); money[top]=m; sum=sum+m; rest[top]=sum; top++; } voidbankout(chard[],intm) { strcpy(date[top],d); money[top]=-m; sum=sum-m; rest[top]=sum; top++; } voiddisp(); }; intBank: : sum=0; voidBank: : disp() { inti; printf(" 日期存入 取出余额\n"); for(i=0;i { printf("%8s",date[i]); if(money[i]<0) printf(" %6d",-money[i]); else printf("%6d ",money[i]); printf("%6d\n",rest[i]); } } voidmain() { Bankobj; obj.bankin("2001.2.5",1000); obj.bankin("2001.3.2",2000); obj.bankout("2001.4.1",500); obj.bankout("2001.4.5",800); obj.disp(); } 本程序的执行结果如下: 日期 存入 取出 余额 2001.2.5 1000 1000 2001.3.2 2000 3000 2001.4.1 500 2500 2001.4.5 800 1700 题1.9编写一个程序,已有若干学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。 解: 设计一个学生类Stud,除了包括no(学号)、name(姓名)、和deg(成绩)数据成员外。 有两个静态变量sum和num,分别存放总分和人数,另有一个构造函数、一个普通成员函数disp()和一个静态成员函数avg(),它用于计算平均分。 本题程序如下: #include #include classStud { intno; charname[10]; intdeg; staticintsum; staticintnum; public: Stud(intn,charna[],intd) { no=n;deg=d; strcpy(name,na); sum+=d; num++; } staticdoubleavg() { returnsum/num; } voiddisp() { printf("%-5d%-8s%3d\n",no,name,deg); } }; intStud: : sum=0; intStud: : num=0; voidmain() { Studs1(1,"Li",89),s2(2,"Chen",78),s3(3,"Zheng",94); printf("\n学号 姓名 成绩\n"); s1.disp(); s2.disp(); s3.disp(); printf(" 平均分=%g\n\n",Stud: : avg()); } 本程序的执行结果如下: 学号 姓名 成绩 1 Li 89 2 Chen 78 3 Zheng 94 平均分=87 ---------------------------------------------------------- 题1.10有10个单词存放在一维指针数组words中,编写一个程序,根据用户的输入找出所有与之从前向后匹配的单词和个数。 解: 设计一个Word类,包含一个私有数据成员words、一个构造函数和一个公有成员函数lookup(),构造函数用于给words赋初值,lookup()用于找出所有与之从前向后匹配的单词和个数。 本题程序如下: #include #include classWord { charwords[10][12]; public: Word() //构造函数给words赋初值 { strcpy(words[0],"elapse"); strcpy(words[1],"elucidate"); strcpy(words[2],"elude"); strcpy(words[3],"embody"); strcpy(words[4],"embrace"); strcpy(words[5],"embroider"); strcpy(words[6],"emrtge"); strcpy(words[7],"emphasize"); strcpy(words[8],"empower"); strcpy(words[9],"emulate"); } voidlookup(chars[]); }; voidWord: : lookup(chars[]) { char*w; inti,j,n=0; //n用来记录相匹配的单词个数 printf("匹配的单词: \n"); for(i=0;i<10;i++) //一个单词一个单词的匹配 { for(w=words[i],j=0;s[j]! ='\0'&&*w! ='\0'&&*w==s[j];j++,w++); if(s[j]=='\0') //匹配成功 { n++; printf("\t%s\n",words[i]); } } printf(" 匹配的单词个数: %d\n\n",n); } voidmain() { Wordobj; charstr[20]; printf("输入单词: "); scanf("%s",str); obj.lookup(str); } 本程序的执行结果如下: 输入单词: em 回车 匹配的单词: embody embrace emembroider emrtge emphasize empower emulate 相匹配的单词个数: 7 题1分析以下程序的执行结果 #include classSample { intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} voiddisp() { cout<<"x="< } }; voidmain() { Samples1,s2(2,3); s1.disp(); s2.disp(); } 解: 本题说明了构造函数的调用顺序。 首先定义了一个类Sample,在main()中定义了它的两个对象,定义s1对象时调用其默认构造函数(x=0,y=0),定义s2对象时调用其重载构造函数(x=2,y=3),然后,调用各自的成员函数输出各自的数据成员。 所以输出为: x=0,y=0 x=2,y=3 ----------------------------------------------- 题2分析以下程序执行的结果 #include classSample { intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} ~Sample() { if(x==y) cout<<"x=y"< else cout<<"x! =y"< } voiddisp() { cout<<"x="< } }; voidmain() { Samples1(2,3); s1.disp(); s1.~Sample(); } 解: 本题说明了可以显式调用析构函数。 首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员,然后调用一次析构函数,最后在退出程序时又自动调用析构函数,所以输出为: x=2,y=3 x! =y x! =y 注意: 析构函数不同于构造函数,析构函数既能被显式调用,也能被隐式调用。 ---------------------------------------------------- 题3分析以下程序的执行结果 #include classSample { intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} ~Sample() { if(x==y) cout<<"x=y"< else cout<<"x! =y"< } voiddisp() { cout<<"x="< } }; voidmain() { Samples1,s2(2,3); s1.disp(); s2.disp(); } 解: 本题说明了析构函数的调用顺序,这里定义了两个对象,先顺序调用s1和s2对象的构造函数,再调用各自的成员函数disp(),最后顺序调用s2和s1的析构函数。 所以输出为: x=0,y=0 x=2,y=3 x! =y x=y 题4.分析以下程序的执行结果 #include #include classSample { public: intx,y; Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} voiddisp() { cout<<"x="< } ~Sample() { if(x==y) cout<<"x=y"< else cout<<"x! =y"< } }; voidmain() { Samples1(2,3); s1.disp(); if(s1.x==2) exit(0); } 解: 本题说明了非正常退出程序时析构函数调用的情况。 定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 习题
![提示](https://static.bdocx.com/images/bang_tan.gif)