C++Primer第五版 第五章习题答案(11~20)

来源:互联网 发布:江西在线网安全知让 编辑:程序博客网 时间:2024/06/05 08:41

11:知识点:

在Windows中:

'\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
'\n' 换行,换到当前位置的下一行,而不会回到行首;

在Unix系统里:

每行结尾只有“<换行>”,即"\n";Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;


Mac系统里:

每行结尾是“<回车>”,即"\r";。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

#include <iostream>#include <string>#include <vector>using namespace std;void main(){char cval;int char_a = 0,char_e = 0,char_i = 0,char_o = 0,char_u = 0,sum_space = 0,sum_table = 0,sum_newline = 0;while (cin >> std::noskipws >> cval) // 此处的std::noskipws表示的是不忽略任何地方的空白(包括制表符和空格等){switch (cval){case 'a':            case 'A':++char_a;break;case 'e':case 'E':++char_e;break;case 'i':case 'I':++char_i;break;case 'o':case 'O':++char_o;break;case 'u':case 'U':++char_u;break;case ' ':++sum_space;break;case '\t':++sum_table;break;case '\n':++sum_newline;break;}}cout<<"元音字母a的个数为:"<<char_a<<endl;cout<<"元音字母e的个数为:"<<char_e<<endl;cout<<"元音字母i的个数为:"<<char_i<<endl;cout<<"元音字母o的个数为:"<<char_o<<endl;cout<<"元音字母u的个数为:"<<char_u<<endl;cout<<"空格的个数为:"<<sum_space<<endl;cout<<"制表符的个数为:"<<sum_table<<endl;cout<<"换行符的个数为:"<<sum_newline<<endl;}

12:小知识点:

    ‘\0’和‘0’的区别。有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节。请翻开你的ASCII字符集表吧,一般在你的C语言教材的附录上,没有的话网上查查哦。请看第一个ASCII码,对是0,对应的字符是(Null),其实就是‘\0’,即空字符。判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。而字符‘0’对应的ASCII码是48,48对应的十六进制数就是0x30,通常我们在编程的时候,用字符转化为数字的时候经常要用到,比如要将‘8’转换为数字8,在语句中这样写就可以了,“ 8+‘0’”。这里的8就是数字。字符‘0’和数字0的区别:前者是字符常量,后者是整形常量,它们的含义和在计算机中的存储方式截然不同。但是字符常量可以像整数一样在程序中参与相关运算。
      “0”和‘0’的区别。首先“0”是字符串常量,字符串常量是由一对双引号括起的字符序列。‘0’是字符常量,字符串常量和字符常量是不同的量。1:字符常量由单引号括起来;字符串常量由双引号括起来。2:字符常量只能是单个字符;字符串常量则可以含一个或多个字符。

#include <iostream>#include <string>#include <vector>using namespace std;void main(){char cval, char_before = '\0'; //计算机中的0值表示的为'\0',可防止它的初始值(随机的)碰巧是某个字符的值.int char_a = 0, char_e = 0, char_i = 0, char_o = 0, char_u = 0, sum_space = 0, sum_table = 0, sum_newline = 0,sum_ff = 0, sum_fl = 0, sum_fi = 0;while (cin >> std::noskipws >> cval) // 此处的std::noskipws表示的是不忽略任何地方的空白(包括制表符和空格等){switch (cval){case 'a':            case 'A':++char_a;break;case 'e':case 'E':++char_e;break;case 'i':if (char_before == 'f'){++sum_fi;}case 'I':++char_i;break;case 'o':case 'O':++char_o;break;case 'u':case 'U':++char_u;break;case ' ':++sum_space;break;case '\t':++sum_table;break;case '\n':++sum_newline;break;case 'f':if (char_before == 'f'){++sum_ff;}break;case 'l':if (char_before == 'f'){++sum_fl;}break;}char_before = cval;//将当前的字符赋给char_before,作为下次判断的依据//如果下次判断中char_before为f字符,那么只要再判断当前字符是否为f、l、i即可}cout<<"元音字母a的个数为:"<<char_a<<endl;cout<<"元音字母e的个数为:"<<char_e<<endl;cout<<"元音字母i的个数为:"<<char_i<<endl;cout<<"元音字母o的个数为:"<<char_o<<endl;cout<<"元音字母u的个数为:"<<char_u<<endl;cout<<"空格的个数为:"<<sum_space<<endl;cout<<"制表符的个数为:"<<sum_table<<endl;cout<<"换行符的个数为:"<<sum_newline<<endl;cout<<"字符序列ff的个数为:"<<sum_ff<<endl;cout<<"字符序列fl的个数为:"<<sum_fl<<endl;cout<<"字符序列fi的个数为:"<<sum_fi<<endl;}

13:

(a):缺少break;

(b):ix应在外部声明定义

(c):不能用逗号加以表示包括case 1 : case 2: case : 3....

(d):case 后面需要加的是常量表达式,可以加const修饰符,将ival、jval、kval变成”常量“


14:

#include <iostream>#include <string>#include <vector>using namespace std;void main(){string My_string, before_string, max_repeatstring;int repeat_number = 0, flag = 0;while (cin >> My_string){if (My_string == before_string){++repeat_number;}else{repeat_number = 1;before_string = My_string;}if (flag < repeat_number) {flag = repeat_number;max_repeatstring = before_string;}//设置flag,max_repeatstring用来保存当前比较完字符串后的最大重复次数和对应字符串}if (flag == 1){cout<<"没有重复的字符串出现"<<endl;}else{cout<<"单词"<<max_repeatstring<<"出现了"<<flag<<"次"<<endl;}}

这里感谢@Ohmylina的提醒,在评论区指出了我程序的不足之处,在此进行感谢!想法很周全

下面是改进的程序,经测试完全符合任何输入情况。

#include <iostream>  #include <string>  #include <vector>  using namespace std;  void main()  {     string My_string, before_string, max_repeatstring;  vector<string> vec1;//存放每个连续输入的单词vector<int> vec2;//存放每个连续输入的次数int repeat_number = 0, flag = 0,m = 0;  while (cin >> My_string)  {  if (My_string == before_string)  {  ++repeat_number;  m++;//此变量是因为最后输入的单词不会在调用else,所以需要记录下本单词的出现次数}  else  {   vec2.push_back(repeat_number);//记录下上一个单词的重复次数repeat_number = 1;  before_string = My_string;  vec1.push_back(My_string);//此次输入了与上次不同的单词,记录下来m = 0;}  }vec2.push_back(m+1);int a = 0;vector<int>::iterator it1 = vec2.begin();for (it1; it1 != vec2.end(); ++it1){if (*it1 >a){a = *it1;//找到最大元素} }for (int i = 0; i< vec2.size(); i++){if (vec2[i] == a){cout<<"单词"<<vec1[i-1]<<"出现的次数为:"<<vec2[i]<<"次"<<endl;}}}


15:

(a):ix应该在循环外定义

(b):缺少一个;号

(c):++sz,永远也结束不了了~


16:本题目就道出了while循环和for循环的主要区别,选用的话看具体情况和个人习惯吧。


17:

#include <iostream>#include <string>#include <vector>using namespace std;int main(){int a[5] = {0,1,2,3,4};int b[6] = {0,1,2,3,4,5};vector<int> My_vec1(a, a+4);vector<int> My_vec2(b, b+5);//因为用的VS2010所以不支持列表初始化,用的是构造函数的初始化方法int small_size = My_vec1.size()>My_vec2.size() ? My_vec2.size() : My_vec1.size();//挑出较小者for (int i = 0;i<=small_size;i++){if (My_vec1[i] != My_vec2[i]){cout<<"False"<<endl;return 0;//如有不匹配的元素即输出False结束}}cout<<"True"<<endl;return 0;//如果用void main(),可以用一个flag来表示是否每个元素都相等}


18:

(a):do后面那么多条语句,需要使用花括号

(b):因为do循环体中肯定还需要使用到ival这个变量,所以应该将其定义在循环体外部

(c):同上


19:

#include <iostream>#include <string>#include <vector>using namespace std;void main(){do {string My_string1, My_string2;cout<<"请输入两个字符串"<<endl;cin>>My_string1>>My_string2;if (My_string1.size() > My_string2.size()){cout<<My_string2<<endl;}else{cout<<My_string1<<endl;}} while (cin);//第18题中就有的很好的例子}

20:

#include <iostream>#include <string>#include <vector>using namespace std;void main(){string My_string1, My_string2;//此时需要将这两个变量定义出来!!!do {cout<<"请输入字符串"<<endl;cin>>My_string1;if (My_string1 == My_string2)//出现连续相同的情况,则输出,退出循环{cout<<"没有任何单词是重复的"<<endl;break;}elseMy_string2 = My_string1;} while (cin);}



2 0
原创粉丝点击