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++ cin 作为while条件

1.cin        cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostr...

C++中cin的详细用法

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

为什么可以用while(cin)?

转自:http://www.cnblogs.com/propheteia/archive/2012/07/24/2607091.html /** * @brief The quick-...
  • gtatcs
  • gtatcs
  • 2013-04-08 21:45
  • 5213

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

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

C++读取带空格字符串

关于在C++中字符串的输入整理笔记 1. cin cin是C++中最常用的输入语句,当遇到空格或者回车键即停止 如: #include #include using namespace std; ...

C/C++输入一行每隔一个空格一个数据

题设让先输入数据个数,再另起一行,每隔一个空格输入一个整数。单如果题设仅让输入一行数据,空格隔开,并不知道数据个数,那怎么编程呢?

【动态规划】三种基本背包问题

动态规划 是对解最优化问题的一种途径 它往往是针对一种最优化问题 根据问题的不同性质 确定不同的设计方法 因为这篇文章我想说点关于背包问题的事情 所以不再过多介绍动态规划 背包问题 是动态规划...

01背包问题和完全背包问题

在hihocoder上面两期的题目,一个01背包问题,一个完全背包问题。总结一下!

动态规划0—1背包问题

动态规划0-1背包问题 Ø    问题描述:    给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装 入背包中物品的总价值最大? Ø   对于...

用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如:   ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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