C++ primer plus课后复习题(第六章)

1.请看下面两个计算空格和换行符数目的代码片段:
//version 1
while(cin.get(ch))   //quit on eof
{  
    if(ch==' ')
         spaces++;
    if(ch=='\n')
         newlines++;
}

//version 2
while(cin.get(ch))   //quit on eof
{
    if(ch==' ')
         spacees++;
    else if(ch=='\n')    
         newlines++;
}

 第二种格式比第一种格式好在哪里?

答: 第二种比第一种运行效率更高,在第二种中,对于每一个字符当判断出空格符时不会再判断是否是换行符,而第一种对每一个字符都要进行两次判断。

2.在程序清单6.2中,用ch+1替换++ch将发生什么情况?
//6.2
#include <iostream>
using namespace std;
int main() {
	char ch;
	cout << "Type, and I shall repeat.\n";
	cin.get(ch);
	while (ch != '.') {
		if (ch == '\n')
			cout << ch;
		else
			cout << ++ch;
		cin.get(ch);
	}
	cout << "\nPlease excuse the slight confusion.\n";
	return 0;
}

答:原本会输出chat型字符,替换后会转而输出数字。

3.请认真考虑下面的程序:
#include<iostream>
using namespace std;
int main()
{
    char ch;
    int ct1,ct2;
    ct1=ct2=0;
    while((ch=cin.get())!='$')
    {
        cout<<ch;
        ct1++;
        if(ch='$')
           ct2++;
        cout<<ch;
    }
    cout<<"ct1="<<ct1<<",ct2="<<ct2<<"\n";
    return 0;
}

假设输入如下(请在每行末尾按回车键): 

Hi!
Send $10 or $20 now!

 则输出将是什么(还记得吗,输入被缓冲)?

Hi!
H$i$!$
Send $10 or $20 now!
S$e$n$d$ $ct1=9,ct2=9

if(ch='$')
           ct2++;
        cout<<ch;    这个判断每次必执行

4.创建表示下述条件的逻辑表达式:
a.weight大于或等于115,但小于125。
b.ch为q或Q。
c.x为偶数,但不是26.
d.x为偶数,但不是26的倍数。
e.donation为1000-2000或guest为1。
f.ch是小写字母或大写字母(假设小写字母是依次编码的,大写字母也是依次编码的,但在大小写字母间编码是不连续的)。

a.weight >= 115 && weight < 125

b.ch == 'q' || ch == 'Q'

c.x%2 == 0 && x != 26

d.x%2 == 0 && x%26 !=0

e.donation >= 1000 && donation <= 2000 || guest == 1

f.(ch >= 'a '&& ch <= 'z')||(ch >= 'A ' && ch <= 'Z') 

 5.在英语中,"I will not not speak(我不会不说) "的意思与"I will speak(我要说)"相同。在c++中,!!x是否与x相同呢?

 答:如果是bool类型变量,则结果相同;如果是int类型或其他类型则不相同。

6.创建一个条件表达式,其值为变量的绝对值。也就是说,如果变量x为正,则表达式的值为x;但如果x为负,则表达式的值为-x--这是一个正值。

x>=0?  x: -x;

 7.用switch改写下面的代码片段:

if(ch=='A')
    a_grade++;
else if(ch=='B')
    b_grade++;
else if(ch=='C')
    c_grade++;
else if(ch=='D')
    d_grade++;
else
    f_grade++;

switch(ch)
{
    case 'A' : 
       a_grade++;
       break;
    case 'B' : 
       b_grade++;
       break;
    case 'C' : 
       c_grade++;
       break;
    case 'D' : 
       d_grade++;
       break;
    default :   
       f_grade++;
       break;
}
8.对于程序清单6.10,与使用数字相比,使用字符(如a和c)表示菜单选项和case标签有何优点呢?(提示:想想用户输入q和输入5的情况)
//程序清单6.10
#include <iostream>
using namespace std;
void showmenu();
void report();
void comfort();
int main() {
	showmenu();
	int choice;
	cin >> choice;
	while (choice != 5) {
		switch (choice) {
		case 1: cout << "\a\n";
			break;
		case 2: report();
			break;
		case 3: cout << "The boss was in all day.\n";
			break;
		case 4: comfort();
			break;
		default: cout << "That's not a choice.\n";
		}
		showmenu();
		cin >> choice;
	}
	cout << "Bye!\n";
	return 0;
}
void showmenu() {
	cout << "Please enter 1, 2, 3, 4, or 5:\n"
		"1) alarm       2)report\n"
		"3) alibi       4)comfort\n"
		"5)quit\n";
}
void report() {
	cout << "It's been an excellent week for business.\n"
		"Salea are up 120%. Expenses are down 35%.\n";
}
void comfort() {
	cout << "Your employees think you are the finest CEO\n"
		"in the industry. The board of directors think\n";
}

答:在使用字符,输入数字时,系统可以通过default提醒重新输入,而使用数字,输入字符会使程序陷入死循环。

9.请看下面的代码片段:

int line = 0;
char ch;
while(cin.get(ch))
{
    if(ch=='Q')
        break;
    if(ch!='\n')
        continue;
    line++;
}

请重写该代码片段,不要使用break和continue语句。

int line = 0;
char ch;
while(cin.get(ch) && ch!='Q'){
    if(ch == '\n')
        line++;
}
  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值