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;
}