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++;
}