C++ Primer 习题(第三章附答案)

本文详细解答了C++ Primer第三章的多项练习,涵盖了标准输入处理、string类、循环、迭代器、vector对象操作等内容,旨在加深对C++基本概念的理解和应用。
摘要由CSDN通过智能技术生成

练习3.1 略

练习 3. 2 编写一段程序从标准输入中一次读入一整行,然后修改程序使其一次读入一个词。

#include <iostream>
#include<string>
using namespace std;

//使用getline一次读入一整行,回车结束
int main()
{
   
	string line;
	
	cout << " please enter your line ,even space" << endl;
	while (getline(cin, line))   //循环读取,Ctrl+c结束
		cout << line << endl;

	return 0;
}
#include <iostream>
#include<string>
using namespace std;

//使用cin一次读入一单词,空白结束
int main()
{
   
	string word;
	
	cout << " please enter your word ,not space" << endl;
	while (cin>>word)   //循环读取,Ctrl+c结束
		cout << word<< endl;

	return 0;
}

练习3.3 请说明string类的输入运算符和getline函数是如何分别处理空白字符的

#include<iostream>
#include<string>
using namespace std;

int main()
{
   
	string word, line;
	cout << " please select the way to read the string " << endl;
	cout << " 1 means read string by word" << endl;
	cout << " 2 means read string by line" << endl;

	char ch;
	cin >> ch;

	if (ch == '1')
	{
   
		cout << "please enter string :    welcome to c++ family    " << endl;
		cin >> word;
		cout << " system read the string is : " << word << endl;
	}
	else if (ch == '2')
	{
   
		cout << "please enter string :    welcome to c++ family    " << endl;
		getline(cin, line);
		cout << " system read the string is : " << line << endl;
	}
	else
	{
   
		cout << "input error,please try again" << endl;
	}
	return 0;
}

练习3.4 编写一段程序读入两个字符窜,比较其是否相等并输出结果。结果不相等,输出较大的那个字符串。改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。

#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string word1, word2;
	cout << "please enter two strings " << endl;
	cin >> word1 >> word2;
	if (word1 == word2)
	{
   
		cout << word1 << endl;
	}
	else if (word1>word2)
	{
   
		cout << word1 << endl;
	}
	else
	{
   
		cout << word2 << endl;
	}
	return 0;
}
#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string word1, word2;
	cout << "please enter two strings " << endl;
	cin >> word1 >> word2;

	auto len1 = word1.size();
	auto len2 = word2.size();

	if (len1 == len2)
	{
   
		cout << word1 << endl;
	}
	else if (len1>len2)
	{
   
		cout << word1 << endl;
	}
	else
	{
   
		cout << word2 << endl;
	}
	return 0;
}

练习3.5 编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。

#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string word,result;
	cout << "please enter strings " << endl;
	cout << " Ctrl+z indicates that the input is complete" << endl;
	while (cin>>word)
	{
   
		result += word;
	}
	cout << result << endl;
	return 0;
}
#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string word,result;
	char space = ' ';
	cout << "please enter strings " << endl;
	cout << " Ctrl+z indicates that the input is complete" << endl;
	while (cin>>word)
	{
   
		word += space;
		result += word;
	}
	cout << result << endl;
	return 0;
}

练习3.6 编写一段程序,使用范围for语句将字符串内的所有X替换

#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string s;
	cout << "please enter strings ,even space" << endl;
	getline(cin, s);   //读取整行,回车结束

	//利用auto关键字推断字符串中的每一个元素的类型
	//c必须定义为引用类型,否则无法修改字符串内容
	for (auto& c : s)  
	{
   
		c = 'X';
	}

	cout << s << endl;

	return 0;
}

练习3.7 就上一题完成的程序而言,如果将循环控制变量的类型设为char将发生什么?先估计一下结果,然后实际编程进行验证。

#include<iostream>
#include<string>
using namespace std;

 //就本题而言,将循环控制变量类型设为char不会对结果造成影响
 //因为auto自动推断字符串s的元素类型,结果同样是char
int main() 
{
   
	string s;
	cout << "please enter strings ,even space" << endl;
	getline(cin, s);   //读取整行,回车结束

	//c必须定义为引用类型,否则无法修改字符串内容
	for (char& c : s)  
	{
   
		c = 'X';
	}

	cout << s << endl;

	return 0;
}

练习3.8 分别用while循环和传统的for循环重写练习3.6的程序,你觉得哪种形式更好?为什么?

#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string s;
	cout << "please enter strings ,even space" << endl;
	getline(cin, s); 
	int i = 0;

	while (s[i]!='\0')
	{
   
		s[i] = 'X';
		i++;
	}

	cout << s << endl;
	return 0;
}
#include<iostream>
#include<string>
using namespace std;

int main() 
{
   
	string s;
	cout << "please enter strings ,even space" << endl;
	getline(cin, s); 
	

	for(int i = 0;i<s.size();i++)
	{
   
		s[i] = 'X';
	}

	cout << s << endl;
	return 0;
}

练习3.9 下面的程序有何作用?它合法吗?如果不合法,为什么?

#include<iostream>
#include<string>
using namespace std;

//程序愿意是输出字符串s的首字符,但程序是错误的
//因为初始状态下没有给s赋任何初值,所以s的内容为空,当然也就不存在首字符,下标0是非法的
//但在visual studio编译并不会发生编译错误
int main() 
{
   
	string s;
	cout <<s[0] << endl;
	return 0;
}

练习3.10 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分

#include<iostream>
#include<string>
#include<cctype>

using namespace std;
int main()
{
   
	string s;
	cout << "Please enter a string ,the best contain certain punctuation" << endl;
	getline(cin, s);

	for (auto& c : s)
	{
   
		if (!ispunct(c))
			cout << c;
	}
	cout << endl;
	return 0;
}

#include<iostream>
#include<string>
#include<cctype>

using namespace std;
int main()
{
   
	string s,result;
	cout << "Please enter a string ,the best contain certain punctuation" << endl;
	getline(cin, s);

	for (decltype(s.size())i = 0; i < s.size(); i++)
	{
   
		if (!ispunct(s[i]))
			result += s[i];
	}
	cout << result<<endl;
	return 0;
}

练习3.11 下面的范围for语句合法吗?如果合法,c的类型是什么?

#include<iostream>
#include<string>

//s是一个常量字符串,则c的推断类型是常量引用,即c所绑定的对象值不能改变
using namespace std;
int main()
{
   
	const string s = "keep out!";
	
	for (auto&c:s)
	{
   
		{
   /*...*/}
	}
	return 0;
}

练习3.12 下列vector对象的定义有不正确的吗?如果有,请指出来。对于正确的,描述其执行结果;对于不正确的,说明其错误的原因。

#include<iostream>
#include<string>
#include<vector>

using namespace std;
int main()
{
   
	//定义了一个名为ivec的vector对象,其中的每个元素都是vector<int>对象
	vector<vector<int>> ivec;

	//错误,svec的元素类型是string,而ivec的元素类型是int,因此不能使用ivec初始化sevc。
	vector<string> svec = ivec;

	//定义了一个名为svec的vector对象,其中含有10个元素,每个元素都是字符串null
	vector<string> svec(10, "null");
}

练习3.13 下列的vector对象包含多少个元素?这些元素的值分别是多少?

#include<iostream>
#include<string>
#include<vector>

using namespace std;
int main()
{
   
	// 元素数量为0
	vector<int> v1;

	//元素数量为10,每一个元素都被初始化为0
	vector<int> v2(10);

	//元素数量为10,每一个元素都被初始化为42
	vector<int> v3(10, 42);

	//元素数量为1,元素的值为10
	vector<int> v4{
    10 };

	//元素数量为2,两个元素值为10,42
	vector<int> v5{
    10, 42 };

	//元素数量为10,每一个元素都被初始化为空串
	vector<string> v6{
    10 };

	//元素数量为10,每一个元素都被初始化为hi
	vector<string> v7{
    10 ,"hi" };

	return 0;
}

练习3.14 编写一段程序,用cin读入一组整数并把它们存入一个vector对象

#include<iostream>
#include<vector>

using namespace std;

int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值