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第五版 第五章习题答案(21~25)

21: 知识点1:continue语句:终止最近循环中的当前迭代并立即开始下一次迭代。 知识点2:它只能出现在for、while、do while的内部。 #include #include #...

C++Primer第五版 第五章习题答案(1~10)

1:空语句:最简单的语句,当程序中在语法上需要一条语句,但是逻辑上却不需要时,就可以用到空语句 while (cin >> a && a != s) //不断的读取输入流的内容,直到输入中遇到s。 ;...

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

类模版也是相当的重要,遇到过很多次,好好理解吧 11:知识点1:类模版的定义:与函数模版不同的是,编译器不会为类模版推断模版参数类型,所以我们在使用类模版时,需要显式地指出元素的类型,在其定义中,模版...

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

11:知识点:当我们使用decltype作用于某个函数时,它返回函数类型而非指针类型,因此我们需要显示的加上*已表明我们需要返回指针。作用:选择并返回操作数的类型,若为函数,则类型为函数的返回类型 u...

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

11:知识点:注意C++11新标准中vector初始化的方法(除了array以外的标准库容器皆适用) vector vec; // 0 vector vec(10); // 0 vecto...

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

11:知识点1:理解变量的销毁与其内存的释放之间的关系:内置类型的指针在离开作用域时,本身会被销毁,但是其指向的内存空间什么都不会发生,必须以显式的delete进行释放空间。智能指针在离开作用域时,本...

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

11:知识点1:当我们使用引用或者指针调用一个虚成员函数时才会执行动态绑定,因为我们知道在程序运行时才知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义 知识点2:引用和指针的静态类型与动态类...

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

11:知识点1:构造函数—特殊的成员函数,用来控制对象的初始化过程。无返回类型,可重载,不能被声明为const. 知识点2:若无,则有默认的构造函数,是编译器自己隐式的定义的。又称合成的默认构造函数。...

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

11:知识点1:枚举类型使得我们可以将一组整型常量组织在一起,但是每一个枚举类型都定义了一种新的类型 知识点2:C++11新标准引入了限定作用域的枚举类型,带有class或struct关键字的,就是限...

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

3.11 本身是合法的,但是如果下面的语句要改变c的值,那就错了,因为引用c是一个常量。 3.12...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++Primer第五版 第五章习题答案(11~20)
举报原因:
原因补充:

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