面向对象程序设计第3章练习与思考题参考解答
- 格式:doc
- 大小:42.50 KB
- 文档页数:5
面向对象程序设计课后题答案第二章C++概述【2.6】D【2.7】D【2.8】A【2.9】A【2.10】B【2.11】A【2.12】C【2.13】B【2.14】D【2.15】C【2.16】D【2.17】C【2.18】程序的运行结果:101【2.19】程序的运行结果:10 10【2.20】程序的运行结果:1020【2.22】编写一个C++风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。
#include <iostream.h>int main(){int *p,i;p[0]=1;p[1]=1;for(i=2;i<20;i++){p[i]=p[i-1]+p[i-2];}for(i=0;i<20;i++){cout<<p[i]<<endl;}return 0;}【2.23】编写一个C++风格的程序,建立一个被称为sroot()的函数,返回其参数的二次方根。
重载sroot()3次,让它返回整数、长整数与双精度数的二次方根。
#include <iostream.h>#include<math.h>double sroot(int m){return sqrt(m);}double sroot(long m){return sqrt(m);}double sroot(double m){return sqrt(m);}int main()cout<<"sroot(145)="<<sroot(145)<<endl;cout<<"sroot(123456)="<<sroot(123456)<<endl;cout<<"sroot(1.44)="<<sroot(1.44)<<endl;return 0;}【2.24】编写一个C++风格的程序,解决百钱问题:将一元人民币兑换成1、2、5分的硬币,有多少种换法?#include <iostream.h>int main(){int k=0;for(int i=0;i<=20;i++){for(int j=0;j<=50;j++){if(100-5*i-2*j>=0){k++;}}}cout<<"将一元人民币兑换成1、2、5分的硬币,共有"<<k<<"种换法"<<endl;return 0;}【2.25】编写一个C++风格的程序,输入两个整数,将它们按由小到大的顺序输出。
C++⾯向对象程序设计第三章习题答案解析整理⼀下⾃⼰写的作业,供考试前复习⽤,哈哈进⼊正题题⽬:2.分析下⾯的程序,写出其运⾏时的输出结果这⾥就不展⽰课本源代码,直接给出修改后的代码,错误部分代码已给出具体的注释1 #include<iostream>2//原题的#include<iostream.h>写法错误3 #include<stdlib.h>4//⽤于解决闪屏的头⽂件5using namespace std;6//原题缺少该⾏代码,⽤于输⼊cin和输出cout7class Date{8public:9 Date(int,int,int);10 Date(int,int);11 Date(int);12 Date();1314void display();15private:16int month;17int day;18int year;1920 };2122 Date::Date(int m,int d,int y):month(m),day(d),year(y){}2324 Date::Date(int m,int d):month(m),day(d)25 {year=2005;}2627 Date::Date(int m):month(m)28 {day=1;year=2005;}2930 Date::Date()31 {month=1;day=1;year=2005;}3233void Date::display()34 {35 cout<<month<<"/"<<day<<"/"<<year<<endl;36 }3738int main()39 {40 Date d1(10,13,2005);41 Date d2(12,30);42 Date d3(10);43 Date d4;44 d1.display();45 d2.display();46 d3.display();47 d4.display();48 system("pause");49//解决闪屏的代码50return0;51 }运⾏结果:3.如果将第2题中程序的第四⾏改为⽤默认参数,即Date(int =1,int =1,int =2005);分析程序有⽆问题。
第一章:面向对象程序设计概述[1_1]什么是面向对象程序设计?面向对彖程序设计是一种新型的程序设计范型。
这种范型的主要特征是:程序=对象+消息。
面向对彖程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对彖并规定它们之间传递消息的规律。
第二: 程序中的一切操作都是通过向对彖发送消息来实现的,对彖接受到消息后,启动有关方法完成相应的操作。
面向对彖程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。
这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面临困难的最有希塑、最有前途的方法之一。
[1_2]什么是类?什么是对象?对象与类的关系是什么?在面向对彖程序设计中,对彖是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
对象可以认为是:数据+操作在面向对彖程序设计中,类就是具有相同的数据和相同的操作的一组对彖的集合,也就是说, 类是对具有相同数据结构和相同操作的一类对彖的描述。
类和对彖之间的关系是抽象和具体的关系。
类是多个对彖进行综合抽象的结果,一个对象是类的一个实例。
在面向对彖程序设计中,总是先声明类,再由类生成对象。
类是建立对彖的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。
[1_3]现实世界中的对象有哪些特征?请举例说明。
对彖是现实世界中的一个实体,其具有以下一些特征:(1)每一个对彖必须有一个名字以区别于其他对彖。
(2)需要用属性来描述它的某些特性。
(3)有一组操作,每一个操作决定了对象的一种行为。
(4)对彖的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。
例如:雇员刘名是一个对象对象名:刘名对象的属性:年龄:36生口:1966.10.1工资:2000部门:人爭部对象的操作:吃饭开车[1_4]什么是消息?消息具有什么性质?在面向对彖程序设计中,一个对象向另一个对象发出的请求被称为“消息”。
java⾯向对象第三章课后习题 1、输⼊⼀批整数,输出其中的最⼤值与最⼩值,输⼊为0时结束循环。
代码如下:package com.bd22;import java.util.Scanner;public class Integer {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int min =0;int max =0;do {System.out.println("");System.out.println("请输⼊⼀个整数(输⼊0结束):");int a = sc.nextInt();if(a==0) {break;}min=min<a?min:a;max=max>a?max:a;}while(true);System.out.println("最⼩值为:"+min);System.out.println("最⼤值为:"+max);}}运⾏结果: 2、⽤键盘输⼊⼀位整数,当输⼊1~7时,显⽰对应的英⽂星期名称的缩写,输⼊其他数字时提⽰⽤户重新输⼊,输⼊0时结束程序。
程序代码:package com.bd22;import java.util.Scanner;public class Week {public static void main(String[] args) {Scanner input = new Scanner(System.in);while(true){System.out.print("请输⼊数字1-7(输⼊0时结束):");int num = input.nextInt();//如果输⼊0则程序结束退出if(num==0) {System.out.println("程序结束!");break;}//按照输⼊的数不同选择输出的星期switch(num) {case 1:System.out.println("今天是 MON");break;case 2:System.out.println("今天是 TUE");break;case 3:System.out.println("今天是 WED");break;case 4:System.out.println("今天是 THU");break;case 5:System.out.println("今天是 FRI");break;case 6:System.out.println("今天是 SAT");break;case 7:System.out.println("今天是 SUN");break;default:System.out.println("请重新输⼊");break;}}}}运⾏结果: 3、假如机票原价为5000元,4-10⽉份为旺季,旺季头等舱打9折,经济舱打6折,其他⽉份为淡季,淡季头等舱打5折,经济舱打4折。
面向对象C++程序设计各章习题参考答案第1章面向对象技术概论一.选择题1. A2. C3. D4. B5. C二.填空题1. 封装、继承、多态性2. 面向对象分析(OOA)、面向对象设计(OOD)、面向对象实现(OOI)、面向对象测试(OOT)和面向对象系统维护(OOSM)。
3. 实例实例4. 多态性5. 消息消息传递第2章 C++简单程序设计一.选择题:1. B2. B3. B4. C5. C6. D7. D8. C9. D 10. C11. A 12. A二.填空题:1.4;2;2;8;12. 103. 04. 87;79;115. (1)x值为6,表达式的值为6(2)x值为6,但表达式的值为5(3)x值为4,表达式的值为4(4)x值为5,表达式的值为5(5)x变为6,y的值为5(6)x变为4,y的值为4(7)x变为6,y的值为25(8)x的值为6,y的值为366. const7. c+i*sizeof (c[i])8. x<=3||x>=109. a<=b&&b!=510. 30 30三.程序分析题:1.s=552.a,b99,96,194100.2,94.8,1963.i,s=15,564.13 15 22 14 645.14 25四.编程题(参考答案):1. 假设数组中含8个元素,参考答案如下:#include<iostream.h>void main(){int c=0,i,a[8],k;cout<<"input a[i]:"<<endl;for(i=0;i<8;i++)cin>>a[i];cout<<"input k:"<<endl;cin>>k;for (i=0;i<8;i++)if (a[i]>=k) c++;cout<<c;cout<<endl;}2. 参考答案:#include<iostream.h>void main(){const int n=50,m=10;int i,j,k;int index[n]; //存放学号float s,score[n],sum; //存放成绩for(i=0;i<n;i++)cin>>index[i]>>score[i]; //从键盘输入数据sum+=score[i];cout.precision(2); //设置输出宽度cout<<endl<<"A verage score:"<<sum/n; //输出平均分数cout.width(28); //设置输出宽度cout<<endl<<"Student ID:"; //输出学号for(i=0;i<10;i++) //选取前m名分数最高的学生,输出其学号及成绩{s=score[i];k=i;for(j=i+1;j<n;j++)if(s<score[j]){s=score[j];k=j;}if(k>i){score[k]=score[i];score[i]=s;j=index[k];index[k]=index[i];index[i]=j;}cout.width(4); //输出序号,学号和分数cout<<endl<<i+1;cout.width(11);cout<<index[i];cout.width(12);cout.precision(2);cout<<score[i];}cout<<endl;}3.#include<iostream.h>void main(){double x,y;cout<<”Input x:”;cin>>x;if(x<3.0)y=(x-2)*x;elseif(x>=-3.0&&x<=3.0) y=x;else y=x-2;cout<<”x=”<<x<<”,”<<”y=”<<y<<endl;}执行该程序后,显示如下信息:(分别输入3.2,2,-5) Input x:3.2↙输出结果如下:x=3.2,y=1.2Input x:2↙输出结果如下:x=2,y=2Input x:-5↙输出结果如下:x=-5,y=35该程序中使用了if-else if-else语句,用来实现三路分支。
public class San_4 {// 编写一个应用程序求1!+2!+ (20)/*** @param args//本题考查对循环的运用和对算法的编写*/public static void main(String[] args) {// TODO Auto-generated method stubint a;double b = 1, sum = 0;// 定义变量for (a = 1; a <= 20; a++) {// for循环实现该功能b = b * a;// 当a=1时,b=b*a=1,依此类推sum = sum + b;// 当a=1时,sum=sum+b=1,依次类推}for (int w = 1; w <= 19; w++) {// for循环打印出阶乘之和的形式来System.out.print(w + "!" + "+");}System.out.println("20!" + "=" + sum);// 最终输出阶乘之和double sum1 = 0, a1 = 1;int i = 1;while (i <= 20)// 用while循环实现该功能{sum1 = sum1 + a1;i++;a1 = a1 * i;}System.out.println("sum1=" + sum1);}}输出结果:1!+2!+3!+4!+5!+6!+7!+8!+9!+10!+11!+12!+13!+14!+15!+16!+17!+18!+19!+20!=2.18203E18sum1=2.18203E18习题3_5public class San_5 {// 求100以内的素数/*** @param args//本题考查对for循环、break语句、if语句的运用*/public static void main(String[] args) {// TODO Auto-generated method stubint i, j;for (i = 2; i <= 100; i++) {// for循环从2开始,逐渐增1for (j = 2; j <= i / 2; j++) {// for循环从2开始,逐步增1if (i % j == 0) {// 如果i除以j的余数为0,则终止本次for循环break;}}if (j > i / 2) {// 如果j>i/2,输出iSystem.out.print(" " + i);}}}}2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 8389 97习题3_6public class San_6 {// 分别用while和for循环计算1+1/2!+1/3!+1/4!...的前20项和/*** @param args//本题考查同学们对while循环、for循环以及对输出字符串格式的运用 */public static void main(String[] args) {// TODO Auto-generated method stubint i = 1, k;double j = 1, m = 1, sum1 = 0, sum2 = 0;while (i <= 20) {// 用while循环实现sum1 = sum1 + j;i++;j = j * (1.0 / i);}System.out.print("1+");for (int r = 2; r <= 19; r++) {System.out.print("1/" + r + "!" + "+");}System.out.print("1/20!" + "=" + sum1);System.out.println();System.out.print("1+");for (int r = 2; r <= 19; r++) {System.out.print("1/" + r + "!" + "+");}for (k = 1; k <= 20; k++) {// 用for循环实现m *= (1.0 / k);sum2 += m;}System.out.println("1/20!" + "=" + sum2);}}计算结果:1+1/2!+1/3!+1/4!+1/5!+1/6!+1/7!+1/8!+1/9!+1/10!+1/11!+1/12!+1/13!+1/14!+1/15!+1/16!+1/17!+1/18!+1/19!+1/20!=1.904551+1/2!+1/3!+1/4!+1/5!+1/6!+1/7!+1/8!+1/9!+1/10!+1/11!+1/12!+1/13!+1/14!+1/15!+1/16!+1/17!+1/18!+1/19!+1/20!=1.90455习题3_7public class San_7 {// 一个数如果恰好等于它的因子之和,这个数就成为”完数“。
第3章习题解答1.如何定义方法?在面向对象程序设计中方法有什么作用?答:方法的定义包括方法名、方法形参、方法的返回值类型和方法体四部分,方法只能在类中定义。
方法是对象的动态特征的描述,对象通过方法操作属性,进而改变对象的状态,完成程序所预期的功能。
2.定义一个Dog类,有名字、颜色、年龄等属性,定义构造方法用来初始化类的这些属性,定义方法输出Dog的信息。
编写应用程序使用Dog。
答:public class Dog{private String name;private String color;private String age;Dog(String n,String c,String a){name = n; color = c; age = a;}public String toString() {return name + "," + color + "," + age;}public static void main(String args[]) {Dog dog = new Dog("小白", "白色", "2岁");System.out.println(dog.toString());}}3.什么是访问控制修饰符?修饰符有哪些种类?它们各有何作用?答:访问控制修饰符是对类、属性和方法的访问权限的一种限制,不同的修饰符决定了不同的访问权限。
访问控制修饰符有3个:private、protected、public,另外还有一种默认访问权限。
各个修饰符的作用如下表所示:B:包中的类C:所有子类D:本类A:所有类:所有类4.阅读程序,写出程序的输出结果class A{private int privateVar;A(int _privateVar){privateVar=_privateVar;}boolean isEqualTo(A anotherA){if(this.privateVar == anotherA.privateVar)return true;elsereturn false;}}public class B{public static void main(String args[]){A a = new A(1);A b = new A(2);System.out.println(a.isEqualTo(b));}}程序的输出结果为:false5.阅读程序,写出程序的输出结果public class Test {public static void main(String[] args) {int x;int a[] = { 0, 0, 0, 0, 0, 0 };calculate(a, a[5]);System.out.println("the value of a[0] is " + a[0]);System.out.println("the value is a[5] is " + a[5]);}static int calculate(int x[], int y) {for (int i = 1; i < x.length; i++)if (y < x.length)x[i] = x[i - 1] + 1;return x[0];}}程序的输出结果为:the value of a[0] is 0the value is a[5] is 56.阅读程序,写出程序的输出结果public class Test {public static void main(String[] args) {String str1 = new String("Java");String str2 = new String("Java");System.out.println(str1 == str2);}}程序的输出结果为:false7.阅读下列程序,程序中已经指明错误位置,请说出错误原因。
《⾯向对象程序设计》习题三答案《⾯向对象程序设计》习题三答案⼀、单项选择题(本⼤题共25⼩题,每⼩题2分,共50分)1、⽤“>>”运算符从键盘输⼊多于⼀个数据时,各数据之间应使⽤( D )符号作为分隔符。
A、空格或逗号B、逗号或回车 C、逗号或分号D、空格或回车2、C++中声明常量得关键字就是( A )。
A、constB、externC、publicD、enum3、以下叙述中正确得就是( B )A、使⽤#define可以为常量定义⼀个名字,该名字在程序中可以再赋另外得值?B、使⽤const定义得常量名有类型之分,其值在程序运⾏时就是不可改变得?C、在程序中使⽤内置函数使程序得可读性变差D、在定义函数时可以在形参表得任何位置给出缺省形参值4、下列得符号常变量定义中,错误得定义就是( C )。
A、constM=10;B、constint M=20;C、const char ch; D、const bool mark=true;5、函数原型语句正确得就是( B )。
A、int Function(void a)B、voidFunction (int);C、int Function(a);D、void int(double a);6、在关键字private后⾯定义得成员为类得( A )成员。
A、私有B、公⽤C、保护 D、任何7、在⼀个类得定义中,包含有( C)成员得定义。
?A、数据B、函数 C、数据与函数D、数据或函数8、在类作⽤域中能够通过直接使⽤该类得( D )成员名进⾏访问、?A、私有 B、公⽤ C、保护D、任何9、在关键字public后⾯定义得成员为类得( B )成员。
A、私有B、公⽤C、保护D、任何10、类中定义得成员默认为( B )访问属性、A、public B、private C、protected D、friend 11、每个类( C )构造函数。
A、只能有⼀个B、可以有公⽤得C、可以有多个D、只可有缺省得12、对类对象成员得初始化就是通过构造函数中给出得( B )实现得。
第三章练习与思考3-1C++ 语言if语句后面没有then,所以(1)、(4)、(5)、(6)不正确。
(3)不正确,因为if 后面的表达式必须有括号。
语句(2)正确,3-2(1) 存在语法错误,正确的写法应为:if(days>31) cout<<”Error”;else cout<<days;(2) 存在语法错误,语句后缺少分号和break语句,正确的写法应为:switch(items) {case 0: cout<<”Radio”; break;c ase 1: cout<<”Television”; break;case 2: cout<<”Radio”; break;// 修改值1.5}switch括号中的表达式只能是整型、字符型或枚举型表达式,case后面的常量表达式之类型必须与之匹配,所以“case : 1.5”将会引起编译错误。
(3) 存在语法错误,缺少break语句,且括号后面后有多余的分号,并且不能将值用逗号隔开来实现多个状态执行一个操作,正确的写法应为:x=3; y=4;switch(choice) {case 0:case 1:case 2: cout<<”Small”; break;case 4: cout<<”Middle”; break; // x必须改成常量case 5: cout<<”Large”; break;// y必须改成常量}case 后面必须为常量表达式,否则将引起编译错误(4) 存在语法错误,正确的写法应为:for(k=1;k<=n;k++){f=f+(f*1.5)%k;cout<<f<<”\n”;}(5) 存在语法错误,while(p!=0)后面加分号,f=f+p*p后面加分号(且存在逻辑错误,因为p不会等于0,循环不会跳出)3-3(1) 循环次数为6 ,执行完后x=192 ,y=100(2) 循环次数为6 ,执行完后x=192 ,y=100(3) 无限循环,x=3(4) 循环次数为14 ,执行完后x=17 ,y=100(5) 循环次数为1,执行完后x=33 ,y=67(6) 循环次数为2,执行完后x=3 ,y=03-4(1) if(a<=b&&a<=c) min=a;else if(b<=c&&b<=a) min=b;else min=c;(2) min=a;if(min>=b) min=b;if(min>=c) min=c;3-5#include "iostream.h"void main(){int year;cout<<"Please input the year number :"<<endl;cin>>year;if((year%400==0&&year%100!=0)||(year%400==0)) //判断条件是否为真cout<<year<<" is a leap year!"<<endl;elsecout<<year<<" is not a leap year!"<<endl;}3-6#include "iostream.h"void main() {int bike_fee=0;int motorcycle_fee=2;int car_fee=5;int bus_fee=8;int truck_fee=8;int conTruck_fee=12; // conTruck_fee表示货柜车过桥应收费用int flag=1; // 用来表示车辆型号int total_fee=0; // 收取的总费用cout<<" the type of those transportation tools are as follows: "<<endl;cout<<" bike: 1"<<endl;cout<<" motorcycle: 2"<<endl;cout<<" car: 3"<<endl;cout<<" bus: 4"<<endl;cout<<" truck: 5"<<endl;cout<<" container truck: 6"<<endl;cout<<" Please input the type to calculate the fee, 0 to exit : "<<endl;while(flag){cin>>flag;switch(flag) {case 1 : break;case 2 : total_fee+=motorcycle_fee; break;case 3 : total_fee+=car_fee; break;case 4 : total_fee+=bus_fee; break;case 5 : total_fee+=truck_fee; break;case 6 : total_fee+=conTruck_fee; break;}}cout<<"\nthe total fee should be"<<total_fee<<endl;}3-7#include "iostream.h"void main() {int NatuNum,count=0;cout<<"Please input the natural number:\n"<<endl;cin>>NatuNum;cout<<endl;while(1){if(NatuNum%2==0){NatuNum/=2;count++; //count用来计数}else break;}cout<<" The number of factors is : "<<count<<endl;}3-8#include "iostream"using namespace std;void main(){for(int steps=7;steps<10000;steps+=7)if(steps%2==1&&steps%3= =2&&steps%4==3&&steps%5==4&&steps%6==5&&steps%7= =0) cout<<steps<<" ";}理论上台阶可以有无穷级,给定范围7-10000 台阶的数目为119,539, (9779)3-9#include "iostream"using namespace std;void main(){int num1,num2,min; //min是最小公倍数cout<<"please input two integers:\n";cin>>num1>>num2;min=(num1>num2)?num1:num2;while((min%num1)!=0||(min%num2)!=0) //当min不能被其中之一整除时,循环继续min++;cout<<"The minimum common multiple is:"<<min<<endl; //输出最小公倍数}3-10#include "iostream "using namespace std;void main(){int n,i=2,count=0;cout<<" 请输入一个正整数:"<<endl;cin>>n;cout<<endl;while(i<=n){i*=2; count++;}cout<<"不超过正整数n的2的最大幂值是: "<<count;cout<<endl;}3-11#include "iostream"using namespace std;void main(){int fishNum=8000,years=0;double decPercentage=0.035;while(fishNum>4000){fishNum-=fishNum*decPercentage;years++; }cout<<years<<" 年后变为原来的一半"<<endl;fishNum=8000,years=0; //重置鱼的数目和初始年份while(fishNum>800){fishNum-=fishNum*decPercentage;years++; }cout<<years<<" 年后变为原来的十分之一"<<endl;}输出结果为:20 年后变为目前的一半65 年后变为目前的十分之一3-12方法(一):苍蝇持续飞速度恒定为30km/h,时间是人到家的时间1/30h, 那么苍蝇临死前飞行总距离是30*(1/30)=1km方法(二):经过分析,可知苍蝇飞行的距离表达式可表示为Dist=S+2*(1/2)*S+2*(1/2)2*S+2*(1/2)3*S+……其中S为人距离家的距离1/3km. 程序代码如下:#include "iostream "using namespace std;void main(){double s,a;s=1/3.0;a=1/2.0;while(a>1e-10) // 循环直到a近似为零{s+=2*a*1/3.0;a=a*1/2.0;}cout<<s;}程序输出为1。