课后习题
1-1面向对象系统包含哪些要素?
答:面向对象系统包含的要素有3个:对象,类和继承。
1-2请判断以下各注释语句是否合法,并说明理由:
答:1)/*This is /*a explanation */ sentence.*/不合法。编译器在遇到第一个*/就认为注释语句结束。实际的注释被认为是/*This is /*a explanation */ sentence.*/(斜体部分).2)//This is a explanation sentence.//
合法。3)/* This is a explanation sentence.*/合法。4)/* This is a explanation sentence.//不合法。注释符号/* */与//不匹配。5)// This is a explanation sentence.*/不合法。不匹配的注释符号*/可能会产生注释提前结束错误,类似(1)。
1-3以下各词法符号中,哪些是合法的C++变量名?并说明为什么其他词法符号不合法。
答:不合法的变量名:3nd不能以数字开头。只能用26个字母或下划线作开头。@price不合法的开头。a*b*为非法变量名字符。π非法变量名字符。depth不合法的开头。via.num点号"."为非法变量名字符。
1-4请指出以下程序中存在的错误:
答:#include <iostream.h>
void main()
{
const: x=1; //const后不应该有冒号。
y=6; //y没有进行定义就被赋值。
x=x+y; //x是const常量,不能被重新赋值。
cout<<'X='<<x; //字符串应该用双引号写成″X=″。
}
1-5试分析以下4个表达式的值,判断它们的值是否相等?并比较C++中表达式的计算规则与数学中的运算规则有何异同,从而解释这4个表达式的求值过程及各个步骤的计算中间结果。
1) 2000*5/7 2)2000/7*5 3)5/7*2000 4)5/7.0*2000 5)1000*5/7 6)5/7*1000
答:1)2000*5/7=10000/7=1428 2)2000/7*5=285*5=1425 3)5/7*2000=0*2000=0 4)5/7.0*2000=0.714286*2000=1428.57 5)1000*5/7=714 6)5/7*1000=0
1-6除非进行强制类型转换,否则整数之间的四则运算结果仍为整数。而整数与小数运算结果按更高精度原则得到小数。 3.2.6请指出下列所说明的4个变量var1~var4的异同:
答:1)int var1=1999;var1为整型变量。2)const var2=1999;var2为整型常量。3)volatile int var3=1999;整数var3为内存变量,程序运行中将不放入寄存器保存。3)const volatile var4=1999;整数var4为内存常量。
1-7某一宿舍有4个成员A、B、C和D,它们符合以下条件:1)A从来不在宿舍唱歌;2)只有A在宿舍,B和D才唱歌;3)C在任何情况下都不唱歌。根据所给的条件,写出"宿舍里没有人唱歌"的C++逻辑表达式。
答:A表示A成员在宿舍,B、D表示B、D唱歌。只要B和D不在宿舍唱歌,宿舍就没人唱歌,不论A或C如何;只要A不在宿舍,B和D就不唱歌,宿舍里也就没有人唱歌;所以充分条件表达式可以写为:解法一:!A||(!B &&!D);(充要条件)解法二:!(B && D)
;解法三:!B && !D;(实际为解法二的逻辑变换)解法四:!A;
1-8在下面的4个if语句中,哪几个语句的功能相同?1)if(p1)if(p2)statement;2)if(p2)if(p1)statement;3)if(p1&&p2)statement;4)if(p1||p2)statement;
答:1)、2)、3)的功能相同,都是条件p1与p2同时满足时,statement被执行。
1-9某工厂对下列设备优先维修:生产能力大于1000件/小时,且过去维修次数少于5次的,或使用寿命大于10年的。请编制并上机调试判断该工厂的设备是否应当优先维修的C++程序。
答:问题的关键是写出优先维修的逻辑表达式:ability>1000&&( repair<5 | lifetime>10 ),方法一:
#include <iostream.h>
void main()
{
int ability, repair, lifetime;
cout<<"请输入设备的生产能力(件/小时),过去维修次数和使用寿命(年):";
cin >> ability >> repair >> lifetime;
if( ability>1000 && ( repair<5 || lifetime>10) )
cout<<"该设备应优先维修。";
else
cout<<"该设备不应优先维修。";
}
方法二:
if( ability > 1000 ) {
if( repair<5 || lifetime>10 )
cout<<"该设备应优先维修。";
}
else
cout<<"该设备不应优先维修。";
......
用第二种方法应当注意的是if-else语句配对的二义性问题:C++规定,else连接到上面第一个没有配对的且为可见的if上,本题中由于第二个if对else不可见,所以else与ablity前面的if配对。但对于程序的可读性要求来说,不提倡采用第二种编程方法,用第一种方法在可读性方面更好一些。
1-10试编制一个C++程序,模拟计算器进行四则运算。
答://源程序代码如下:
#include <iostream.h>
void main()
{
double DNumA, DNumB;
char CComput;
cout << "Input number and operator"
<<" ('p' to quit, 'c' to clean): "<< endl;
cin >> DNumA;
bool BComputer = true;
while(BComputer)
{
CComput = 'p';
cin >> CComput;
switch(CComput) {
case '+':
cin >> DNumB;
DNumA = DNumA + DNumB;
cout <<"\t= "<< DNumA << endl;
break;
case '*':
cin >> DNumB;
DNumA = DNumA * DNumB;
cout <<"\t= "<< DNumA << endl;
break;
case '-':
cin >> DNumB;
DNumA = DNumA - DNumB;
cout <<"\t= "<< DNumA << endl;
break;
case '/':
cin >> DNumB;
if(DNumB != 0.0)
{
DNumA = DNumA / DNumB;
cout <<"\t= "<< DNumA << endl;
}
else
cout << "Zero divisor.\n";
break;printf怎么加endl
case 'c':
cout << "Input number and operator"
<<" ('p' to quit, 'c' to clean): "<< endl;
cin>>DNumA;
break;
default:
BComputer = false;
cout << "Program quited.\n";
break;
}
}
}
//程序compute.cpp运行结果:
Input number and operator ('p' to quit, 'c' to clean):
6.7*5
= 33.5
-89.87
= -56.37
c
Input number and operator ('p' to quit, 'c' to clean):
5.4/7.908=0.682853
1-11编写一个课表打印程序,根据输入的是星期几(取值1~5)打印出该天的课程,且这个打印过程是可以循环进行的,并设置循环结束条件。
答:C++语言提供了三种
形式的循环结构:while语句、do_while语句和for语句。本题一般可以采用while或do_while两种循环控制方法完成。while语句首先判断表达式的求值结果,如果表达式结果为真则执行循环体,否则结束while语句;do_while语句更适用于循环体至少执行一次的情况,它的特点是先执行循环体,然后才判断表达式的求值结果,如果表达式结果为真则继续执行循环体,否则结束do_while语句,执行下一条语句。
方法一:
// 源程序代码如下:
# include "iostream.h"
void main()
{
int day=1;
while (day!=0){
cout<<"\nPlease input the day you want to quiry\n"
<<"(1 ~ 5 = day number; 0 = end quiry):\t";
cin>>day;
switch (day){
case 1: cout<<"Monday: ......"<<endl; break;
case 2: cout<<"Tuesday: ......"<<endl; break;
case 3: cout<<"Wednesday: ......"<<endl; break;
case 4: cout<<"Thursday: ......"<<endl; break;
case 5: cout<<"Friday: ......"<<endl; break;
case 0: cout<<"End quiry! "<<endl; break;
default: cout<<"Wrong day, please reinput. "<<endl;
}
}
}
方法二:
# include "iostream.h"
void main()
{
int day;
do{
cout<<"\nPlease input the day you want to quiry\n"
<<"(1 ~ 5 = day number; 0 = end quiry):\t";
cin>>day;
switch (day){
case 1: cout<<"Monday: ......"<<endl; break;
case 2: cout<<"Tuesday: ......"<<endl; break;
case 3: cout<<"Wednesday: ......"<<endl; break;
case 4: cout<<"Thursday: ......"<<endl; break;
case 5: cout<<"Friday: ......"<<endl; break;
case 0: cout<<"End quiry! "<<endl; break;
default: cout<<"Wrong day, please input. "<<endl;
}
}while(day!=0)
}
//程序提示输入1~5的数字查询星期一至星期五课程,输入0结束查询,输入其他数字则提//示输入错误并要求重新输入数字进行查询。
1-12有人用字母代替十进制数字进行计算,写出以下算式:EGAL×L----LAGE请用C++编制程序,出这些字母所代替的数字。
答://源程序代码如下:
#include <iostream.h>
void main()
{
int e,g,a,l,tempa1,tempa2,tempb,see;
for(e=0;e<=9;e++) {
for(g=0;g<=9;g++) {
for(a=0;a<=9;a++) {
for(l=0;l<=9;l++) {
tempa1=(e*1000+g*100+a*10+l);
tempa2=tempa1*l;
tempb=l*1000+a*100+g*10+e;
see=(e-g)*(e-a)*(e-l)*(g-a)*(g-l)*(a-l);
if(tempa2==tempb && see!=0)
cout<<"***********\n"<<tempa1<<endl
<<" * "<<l<<"\n-------\n="<<tempb<<endl;
}
}
}
}
}
//程序运行所得结果为:1089*9-------9801
1-13试编写一程序,输入二个正整数,求它们的最大公约数和最小公倍数。
答:求正整数a和b的最大公约数和最小公倍数问题关键是先求出最大公约数t,数学家欧几里德(Euclid)曾给出一个经典的解决方案:步骤一:如果a < b,则交换a和b。步骤二:令r是a / b的余数。步骤三:如果r=0,则令t=b并终止;否则令a=b,b=r并转向步骤二。求出最大公约数t后,最小公倍数可以用a * b / t求出。//源程序代码如下:
#include <iostream.h>
int gy(int ,int);
void main()
{
cout << "Input 2 numbers:" << endl;
int a, b, t;
cin >> a >> b;
t = gy(a,b);
cout << "max common divisor: " << t << endl;
cout << "min common multiple: " << (a*b/t) << endl;
}
int gy(int m,int n) //辗转相除法求最大公约数。
{
int m1,r;
if(m<n) { m1=m; m=n; n=m1;}
r=m%n;
while(r!=0) { m=n; n=r; r=m%n;}
return(n);
}
// 程序运行结果:
Input 2 numbers:
234 45
max common divisor: 9
min common multiple: 1170
Press any key to continue
1-14A B C D E F G H八人站成一排,按图1.10所示的方法从1开始报数。问谁先报到19431005?
答:#include <stdio.h>
void main()
{
long anum = 19431005;
const long num = 8;
switch(anum%num)
{
case 0:printf("H\n");break;
case 1:printf("A\n");break;
case 2:printf("B\n");break;
case 3:printf("C\n");break;
case 4:printf("D\n");break;
case 5:printf("E\n");break;
case 6:printf("F\n");break;
case 7:printf("G\n");break;
default:printf("wrong!\n");break;
}
}
1-15我国古代数学巨著《九章算数》卷第八第13题为“五家共井,家二绠(汲水用的井绳)不足,如(接
上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及.
问井深,缏长各几何。答日:井深七丈二尺一寸,甲绠长二丈六尺五寸,乙绠长一丈九尺一寸,丙绠长一丈四尺八寸,丁绠长一丈三尺九寸,戊绠长七尺六寸。”
答:设甲、乙、丙、丁、戌五根绳子分别常x、y、z、s、t,井深u,那么列出方程组:( 2x + y = u | 3y + z = u { 4z + s = u | 5s + t = u ( 6t + x = u 解方程组得x、y、z、s、t分别等于265/721m、191/721m、148/721m、129/721m、76/721m,而井深为1M。
1-16把一元人民币换成5分、2分、1分的硬币,有多少种换法
答:541种 #include<iomanip>
#include<iostream>
using namespace std;
main() {
int n = 0;
for(int i = 0 ; i <= 20; i++)
for(int j = 0; j <= 50; j++) {
int k = 100 - i * 5 - j * 2;
if(k >= 0)
cout<<setw(4)<<++n<<" : 1分"<<setw(3)<<k<<"张, 2分"<<setw(3)<<j<<"张, 5分"<<setw(3)<<i<<"张"<<endl;
if(!(n%200)) getchar();
}
}
1-17有一位科学家曾出了这样一道数学题:有有头母牛。它每年年初要生一头小母牛;每头小母牛从第4个年头起,每年年初也要生一头小母牛。按此规律,若无牛死亡,第20年共有多少头母牛?
答:这是一个递推问题。由题意可知,各年的母牛头数将组成如下数列:3  4  6  9  13 ……因为头一个
三年,只是原来的一头老母牛每年年初生的一头小母牛,所以钱三个数是:2    3    4
从第四年开始,三年前出生的母牛又要生一头小母牛,即新生的小母牛数恰为三年前有的母牛头数,也就是说,从第四年开始每年所具有的牛数为三年前有的母牛头数(新生的)
加上前一年的母牛头数(老),于是有如下递推关系:
cow_number1=2i=1
cow_number2=3i=2
cow_number3=4i=3
cow_number=cow_number1+cow_number3
cow_numbr1=cow_number2
cow_numbr2=cow_number3
cow_numbr3=cow_number
这就是计算第i年的母牛头数的递推公式。递推过程的条件为i<=20.
public class CowNumber
{public static void main(String args[])
{int year;//年数
int cow_number1=2;//第一年牛的数目
int cow_number2=3://第二年牛的数目
int cow_number3=4;//第三年牛的数目
int cow_number=0;//存放牛的总数目
year=20;
for(int i=4;i<=year;i++)
{cow_number=cow_number1+cow_number3;
cow_number1=cow_number2;
cow_number2=cow_number3;
cow_number3=cow_number;
System.out.println("第"+i+"年牛的总头数为:" +cow_number);
}
System.out.println("第"+year+"年牛的总头数为:" +cow_number);
}
}
1-18

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。