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 = ' ')
spaces++;
else if (ch ='\n')
newlines++;
}
第二种格式比第一种格式好在哪里呢?
答:这两种方法结果一样,但第二种方法即 if else 方法效率更高;比如,当 ch 为空格时,版本1对spaces++,然后看它是否为换行符,这将浪费时间,因为程序已经知道 ch 为空格,因此它不会是换行符,在这种情况下,版本2不会再次查看该字符是否为换行符。
2,在程序清单6.2中,用ch+1替换++ch将发生什么情况呢?
答:应该是会将字母强行转换成数字吧(我看下我敲的代码),没有说错,但书面语言表达为:按类型运算规则,ch+1的类型是int型,因此输出的是数值而非字符
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!
则输出将是什么(还记得吗,输入被缓冲)?--------又忘记加时间了。
上面题,刚开始看的时候以为会输出:ct1 = 22, ct2 = 3,真是闭着眼睛看的题,最初理解为:
ch = cin.get()) != '$' // 读取输入不为$时进入循环
ct1++; // 读取输入的字符+1
if (ch = '$') // 如果输入的字符是 $
ct2++; // ct2+1
以上都是错了,看了第一眼才会认为这么认为。网上查了一下,代码if (ch = '$') ,这里 ch = '$',是把字符 $ 赋值给 ch ,并不是 ch == '$',一个等于号和两个等于号是完全两个不同的意思,记住了!!!最终输出结果为
还有一点,if (ch = '$'),在第二次打印前,每个字符都被转换为 $字符。另外,表达式 ch=$的值为 $字符的编码,因此它是非 0值,因而为 true;所以每次 ct2 将被加 1。这里并不是把所有字符都转换成$字符,然后打印出$字符的个数。
4. 创建表示下述条的轮回表达式:
a. weight大于或等于115,但小于125。(115 <= weight <= 125)能不能连着写?貌似没看到网上有这样的写法,正确的是(weight >= 115 || weight <= 125)
b. ch 为 q 或 Q。(ch == q || ch == Q ),
c. x 为偶数,但不是26。[(x = 2 * x && x != 26)这是错误的] (x % ==0 && x != 26)这才是正确的
d. x 为偶数,但不是26的倍数。[(x = 2 * n && x != 26 *n)那这个也应该这是错误的] (x % == 0 && x / 26 != 0)不知道这样写行不。
e. donation 为 1000-2000 或 guest 为 1。(1000 <=donation <= 2000 || guest == 1)既然第一个题不能连着写,那么这里应该也不对了,改用正确写法(donation >= 1000 || donation <= 2000 || guest == 1)
f. ch 是小写字母或大写字母(假设小写字母是依次编码的,大写字母也是依次编码的,但在大小写字母间编码不是连续的)。('z' >= ch >= 'a' || 'Z' >= ch >= 'A'),这个表达的意思没错,对了,可以去编译器里试下,会有这样的提示但可以继续编译,结果不对,老老实实的用规范写法(ch >= 'a' && ch <= 'z' || ch >='A' && ch <= 'Z')。
5. 在英语中,“I will not not speak(我不会不说)”的意思与“I will speak(我要说)”相同。在C++中,!!x是否与x相同呢?(这要分开回答,当x的值为5,即x非负,非负即为1,因此!x 就为0,而 !!x 应该为1很明显 x = 5 和 !!x = 0是不同的;当 x 的值为bool的true时,x = true,!x = false,那么!!x = true,前面x = true,后面x = true,是相同的)。
6. 创建一个条件表达式,其值为变量的绝对值。也就是说,如果变量 x 为正,则表达式的值为 x;但如果 x 为负,则表达式的值为 -x-------这是一个正值。(回顾一下条件表达式,条件表达式就是诸如:表达式1 ? 表达式 2: 表达式3。那么依题目的意思;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 语句
char ch;
cin >> ch;
while ( ch >= 'A' ch <= 'D')
{
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++;
}
}
8. 对于程序清单6.10,与使用数字相比,使用字符(如 a 和 c)表示菜单选项和 case 标签有何优点呢?(提示:想想用户输入 q 和输入 5 的情况)。(当使用数字时,如果用户输入 q,程序不能读取输入而挂起,直到终止程序,而当使用字符,用户输入 5 ,程序会将 5转换成字符,而会使用 dafault语句输出)。
9. 请看下面的代码片段,然后重写该代码片段,不要使用 break 和 continue 语句。
// using break and continue
int line = 0;
char ch;
while (cin.get(ch))
{
if (ch == 'Q')
break;
if (ch != '\n')
continue;
line++;
}
// change no break and continue for up code
int line = 0;
char ch;
while (cin.get(ch) && ch != 'Q')
{
if (ch == '\n')
line++;
}
试了上面方法可行,这是使用 break 和 contine 运行结果
下面是没有使用break 和 contine 运行结果