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

原创 2017年01月04日 16:16:26

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+5);
	vector<int> My_vec2(b, b+6);//因为用的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;
		}
		else
			My_string2 = My_string1;
	} while (cin);
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

C++Primer 中文版 第五版 第五章课后习题答案

前言:自己做的,如果有错误,要提出来哟... //5.1 空语句只包含一个; //5.2 块是有花括号括起来的部分 很多地方都用,while,for等等 //5.3 While(in...
  • Little_boy_z
  • Little_boy_z
  • 2016年06月03日 18:25
  • 1439

C++Primer第五版——习题答案+详解(完整版)

C++Primer第五版——习题答案详解       看的也比较快,但是有很多东西确实用不上,所以很多都没有深入的探讨,但是知识点覆盖的很全面,每一道题涉及的知识点我都写上简单的解释了。      ...
  • misayaaaaa
  • misayaaaaa
  • 2016年12月21日 16:11
  • 49496

C++Primer 中文版 第五版 第四章课后习题答案

前言:自己做的,如果有错误,要提出来哟... //4.1 105 //4.2 *(vec.begin()); *(vec.begin())+1; //4.3 可以接受..利大于弊嘛....
  • Little_boy_z
  • Little_boy_z
  • 2016年06月03日 18:24
  • 873

c++ primer第五版(中文)习题答案 第一章-开始

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。 写完第十章习题,开始从头开始,把前面的习题全部完成,书也顺序看下去。习题解答 1.1 查阅你使用的编译器的文档,确定它所使用的文件命...
  • xhxwd
  • xhxwd
  • 2015年10月22日 22:12
  • 7149

C++Primer 中文版 第五版 第三章课后习题答案

前言:自己做的,如果有错误,要提出来哟... //3.1 略 //3.2 /* #include using namespace std; int main() {   ...
  • Little_boy_z
  • Little_boy_z
  • 2016年06月03日 18:23
  • 1363

c++primer(第五版) 第十一章 关联容器习题答案

纯原创    转载请注明出处:http://blog.csdn.net/axuan_k 11.1    11.2     11.4 #include #include #inc...
  • AXuan_K
  • AXuan_K
  • 2016年03月07日 12:57
  • 1208

C++Primer 中文版 第五版 第七章课后习题答案

//7.1 #include #include using namespace std; struct Sales_data { string bookNo; unsigned unit...
  • Little_boy_z
  • Little_boy_z
  • 2016年06月08日 20:07
  • 1710

C++ Primer 中文版(第五版)课后题答案 事前说明

老师一直让我在csdn上做一个东西,具体什么东西都可以。我左思右想,决定先从身边的开始入手。那就是C++Primer这本书,刚开学学习的时候,从网上搜答案,怎么都搜不到,现在就服务人民,自己发一份答案...
  • Little_boy_z
  • Little_boy_z
  • 2016年06月01日 14:59
  • 583

C++Primer第五版 第十六章习题答案(51~60)

51:知识点1:可变函数模版就是指一个接受可变数目参数的模版函数或者模版类,可变数目的参数被称为参数包,分为两种:模版参数包,表示零个或多个模版参数,函数参数包,表示零个或多个函数参数 知识点2:C+...
  • misayaaaaa
  • misayaaaaa
  • 2017年03月18日 09:29
  • 1502

C++Primer中文(第五版)习题答案(英文)

----------------------- Page 1-----------------------       Answers For Programming Exercises in C...
  • u012432785
  • u012432785
  • 2016年08月01日 10:57
  • 792
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++Primer第五版 第五章习题答案(11~20)
举报原因:
原因补充:

(最多只允许输入30个字)