C++Prime第三章

本文详细解析了C++ Primer第三章的习题,涵盖了字符串操作、向量使用、数组处理、指针应用等多个核心主题,通过具体代码示例深入浅出地讲解了C++编程的基本技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++Prime第三章

练习3.1

using namespace std; 和 using std::cin; 和 std::cout<<""<<std::endl; 三种形式选择就行。

练习3.2

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string line;
	while (getline(cin, line))
		cout << line << endl;
	//修改版本,一次读入一词
	//string word;
	//while (cin>>word)
	//	cout << line << endl;
	return 0;
}

练习3.3

cin>>  :跳过空白    getline:遇\n停止,读入换行,不保留换行。其他空白字符保留。

练习3.4

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1, s2;
	cin >> s1 >> s2;
	cout << (s1 > s2 ? s1 : s2) << endl;
	//问题2
	//if(s1.size() != s2.size())
	//	cout << (s1 > s2 ? s1 : s2) << endl;
	return 0;
}

练习3.5

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s,ans;
//问题1
//	while (cin >> s)
//		ans += s;
//	cout << ans << endl;
	while (cin >> s)
		ans += s + " ";
	cout << ans << endl;

	return 0;
}

练习3.6

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string word;
	cin >> word;
	for (auto& c : word)
		c = 'X';
	cout << word << endl;
	return 0;
}

练习3.7

无影响。全部元素都是char类型

练习3.8

略。基于范围的for循环好,无需定义任何新的变量,无需担心下标越界问题。

练习3.9

输出s首字符。s是空串,不合法,其它情况才合法。

练习3.10

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string word;
	cin >> word;
	string ans;
	for (auto c : word)
	{
		if (!ispunct(c))
			ans += c;
	}
	cout << ans << endl;
	return 0;
}

练习3.11

不一定合法。取决于对C的操作。

练习3.12

(b)不合法,把int类型的vector赋值给string类型。

练习3.13

(a)vector<int> v1;//空                              (b) vector<int> v2(10);  //10个0

(c)vector<int> v3(10,42);//10个42          (d) vector<int> v4{10}; //1个10

(e)vector<int> v5{10,42};  //两个值,10,42   (f)vector<string> v6{10};   //10个空串

(g)vector<string> v7{10,"hi"};//10个hi

练习3.14

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> vi;
	int num;
	while (cin >> num)
		vi.push_back(num);
	for (auto x : vi)
		cout << x << " ";
	return 0;
}

练习3.15 

把上题int换成string即可。

 

练习3.16

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

template<typename T>
void print(vector<T> v)
{
	cout << v.size() << endl;
	for (auto x : v)
		cout << x << " ";
	cout << endl << endl;;
}

int main()
{
	vector<int> v1;					  print(v1);
	vector<int> v2(10);				  print(v2);
	vector<int> v3(10, 42);		  print(v3);
	vector<int> v4{ 10 };			  print(v4);
	vector<int> v5{ 10,42 };		  print(v5);
	vector<string>v6{ 10 };		  print(v6);
	vector<string>v7{ 10,"hi" };  print(v7);
	return 0;
}

练习3.17

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

int main()
{
	vector<string>  data;
	string tmp;
	while (cin >> tmp)
		data.push_back(tmp);
	for (auto& x : data)
		for (auto& i : x)
			i = toupper(i);
	for (auto x : data)
		cout << x << endl;
	return 0;
}

练习3.18

不合法。vector<int> ivec(1);即可。或者ivec.push_back(42);

练习3.19

vector<int> a = {42,42,42,42,42,42,42,42,42,42};

vector<int> a(10,42);

int i = 0;

while(i++ < 10)

    a.push_back(42);

练习3.20  练习3.21 练习3.24

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

int main()
{
	vector<int>  data;
	int num;
	while (cin >> num)
		data.push_back(num);
	for (auto it = data.begin(); it != data.end(); ++it)
	{
		if (it + 1 != data.end())
			cout << *it + *(it + 1)<<" ";
	}
	cout << endl;
	return 0;
}

练习3.22 3.25略

练习3.23

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

int main()
{
	vector<int>  data(10,20);
	for (auto it = data.begin(); it != data.end(); ++it)
		*it = *it * 2;
	for (auto x : data)
		cout << x << " ";
	return 0;
}

练习3.26

 

练习3.27

(a) int ia[buf_size]; 非法,buf_size不是常量                      (b)合法

(c) 非法。                                                                        (d)  非法。没地给'\0'了

练习3.28

练习3.29

1  数组大小固定,显然不方便。

2   数组存放在栈中,vector存放在堆中,由STL程序负责回收。

3  数组不可赋值。

4  对于中括号下标的使用不同。数组允许为负,vector必须为正。如:int a[] = {1,2,3}; int *p = a + 2; cout<<p[-2];是允许的.

练习3.30

下标到不了10.

练习3.31 3.32

练习3.33

数组不被初始化,在栈上,则其存储的是随机值。不报错,却不一定得到预期结果。(本题即是此情况)

练习3.34

p1不变。

练习3.35

#include <iostream>
using namespace std;
int main()
{
	int a[] = { 1,2,3 };
	int* p = begin(a);
	int* e = end(a);
	for (auto i = p; i != e; ++i)
		*i = 0;
	for (auto x : a) cout << x << " ";
	return 0;
}

练习3.36

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int a1[] = { 1,2,3 };
	int a2[] = { 1,2,4 };
	int i;
	for (i = 0; i < 3; ++i)
		if (a1[i] != a2[i])
		{
			cout << "Array not equal!" << endl;
			break;
		}
	if (i == 3) cout << "Array equal\n";

	vector<int> v1, v2;
	v1 = { 1,2,3 };
	v2 = { 1,3,4 };
	if (v1 == v2)
		cout << "Vector equals\n";
	else
		cout << "Not equals\n";

	return 0;
}

练习3.37
 

输出hello,然后内存方向继续增长,直到遇到\0

练习3.38

指针表示地址,地址相加无意义。

练习3.39

练习3.40

#include <iostream>
using namespace std;
int main()
{
	char s1[] = "hello ";
	char s2[] = "world!";
	char ans[15];
	strcpy(ans, s1);
	strcat(ans, s2);
	return 0;
}

练习3.41

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int a[] = { 1,2,3,4,5 };
	vector<int> vi(begin(a), end(a));
	for (auto x : vi) cout << x << " ";
	return 0;
}

练习3.42

练习3.43,3.44,3.45

#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
	int ia[3][4] = {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};
	cout << "version1:" << endl;
	for (auto& x : ia) {
		for (auto y : x)
			cout << setw(3) << y << " ";
		cout << endl;
	}
	cout << "\nversion2:" << endl;
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 4; ++j)
			cout << setw(3) << ia[i][j] << " ";
		cout << endl;
	}
	cout << "\nversion3:" << endl;
	for (int (*p)[4] = ia; p != ia + 3; ++p)
	{
		for (int* q = *p; q != *p + 4; ++q)
			cout << setw(3)<<*q << " ";
		cout << endl;
	}

	cout << "\nversion4:" << endl;
	typedef int int_array[4];
	for(int_array *p = ia; p != ia +3; ++p)
	{
		for (int* q = *p; q != *p + 4; ++q)
			cout << setw(3) << *q << " ";
		cout << endl;
	}



	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值