练习3.1

#include <iostream>
using namespace std;
int main()
{
int sum = 0, val = 50;
while (val <= 100) {
sum += val;
++val;
}
cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int val = 10;
while (val >= 0) {
cout << val-- << std::endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter the two integers" << endl;
int start, end;
//我这里没有对传入格式进行判断,如果大家有需要可以添加这个功能
cin >> start >> end;
if (start > end) {
swap(start, end);
}
while (start <= end) {
cout << start++ << endl;
}
return 0;
}
#include<iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data;
double price;
while (cin >> data.bookNo >> data.units_sold >> price) {
data.revenue = data.units_sold * price;
cout << "Record:" << data.bookNo << " " << data.units_sold << " " << data.revenue << endl;
}
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
double price;
if (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data1.units_sold * price;
}
if (cin >> data2.bookNo >> data2.units_sold >> price) {
data2.revenue = data2.units_sold * price;
}
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
return 0;
}
else {
return -1;
}
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
unsigned totalCnt = 0;
double totalRevenue = 0.0;
double price;
while (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data1.units_sold * price;
totalCnt += data1.units_sold;
totalRevenue += data1.revenue;
}
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
return 0;
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
double price;
if (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data2.units_sold * price;
int cnt = 1;
while (cin >> data2.bookNo >> data2.units_sold >> price) {
data1.revenue = data2.units_sold * price;
if (data1.bookNo == data2.bookNo)
cnt++;
else {
cout << data1.bookNo << " " << cnt << endl;
cnt = 1;
data1 = data2;
}
}
cout << data1.bookNo << " " << cnt << endl;
}
return 0;
}

练习3.2

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str,line;
//一次读入一整行
while (getline(cin, line)) {
str = str + line;
}
cout << str;
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str,line;
//一次读入一个词
while (cin>>line) {
str = str + line;
}
cout << str;
return 0;
}

练习3.3

输入运算符会自动忽略开头的空白并从第一个真正的字符读起,直到遇见下一处空白为止

getline会从给定的输入流中读入内容,保留输入时的空白符,直到遇到换行符为止

练习3.4

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1 == str2)cout << "相等";
else {
cout << (str1 > str2 ? str1 : str2);
}
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1.size() == str2.size())cout << "相等";
else {
cout << (str1.size() > str2.size() ? str1 : str2);
}
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1.size() == str2.size())cout << "相等";
else {
cout << (str1.size() > str2.size() ? str1 : str2);
}
return 0;
}

练习3.5

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
while (cin >> str1) {
str2 += str1;
}
cout << str2;
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
while (cin >> str1) {
str1 += " ";
str2 += str1;
}
cout << str2;
return 0;
}

练习3.6

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (auto& c : str) {
c = 'X';
}
cout << str;
return 0;
}

练习3.7

没有变化

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (char& c : str) {
c = 'X';
}
cout << str;
return 0;
}

练习3.8

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
decltype(str.size()) i = 0;
while (i < str.size()) {
str[i++] = 'X';
}
cout << str;
return 0;
}
#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (auto i = 0; i < str.size();i++) {
str[i] = 'X';
}
cout << str;
return 0;
}

练习3.9

输出默认初始化字符串s的第一个元素。不合法,因为默认初始化的字符串是空串,所以s[0]越界了。

练习3.10

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="123()_+asad";
for (string::size_type i = 0; i < str.size(); i++) {
if (!ispunct(str[i]))
cout << str[i];
}
return 0;
}

练习3.11

for循环体不看后面花括号的内容,肯定是合法的,但是如果在for循环中花括号中给C赋值,修改C的值,那么此时的for语句肯定是不合法的。C的类型是const char&

练习3.12

知识点:vector的初始化:

1:引用不可以成为vector的元素,因为其不是对象。

2:可以用花括号初始化每一个值。

3:可以用括号指定元素个数或相同的元素值。

4:只能使用直接初始化,不可以使用拷贝初始化(vector之间的拷贝是可行的,但要保证类型相同)

答案:

(a)正确,创建了一个元素为vector的vector对象

(b)不正确,类型不一致

(c)正确,十个“null”对象

练习3.13

(a)空vector

(b)10个重复执行值初始化对象0

(c)10个重复的元素42

(d)1个元素初始值为10

(e)两个元素,初始分别为10,42

(f)10个字符串,初始化为“ ”(空)

(g)10个字符串,初始化为“hi ”

练习3.14

#include  <iostream>
#include<string>
#include <vector>
using std::cin;
using std::cout;
using std::vector;
int main()
{
int num;
vector<int> v;
while (cin >> num) {
v.push_back(num);
}
return 0;
}

练习3.15

#include  <iostream>
#include<string>
#include <vector>
using std::cin;
using std::cout;
using std::vector;
using std::string;
int main()
{
string str;
vector<string> v;
while (cin >> str) {
v.push_back(str);
}
return 0;
}

练习3.16

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10,42 };
vector<string> v6{ 10 };
vector<string> v7(10, "hi");
cout << v1.size()<<" ";
for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
cout << *v1_item << " "; cout << endl << v2.size() << " ";
for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
cout << *v2_item << " "; cout << endl << v1.size() << " ";
for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
cout << *v3_item << " "; cout << endl << v1.size() << " ";
for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
cout << *v4_item << " "; cout << endl << v5.size() << " ";
for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
cout << *v5_item << " "; cout << endl << v6.size() << " ";
for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
cout << *v6_item << " "; cout << endl << v7.size() << " ";
for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
cout << *v7_item << " ";
return 0;
}

0
10 0 0 0 0 0 0 0 0 0 0
0 42 42 42 42 42 42 42 42 42 42
0 10
2 10 42
10
10 hi hi hi hi hi hi hi hi hi hi

练习3.17

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<string> v;
string str;
while (cin >> str) {
v.push_back(str);
}
for (auto i = v.begin(); i != v.end(); i++) {
str = *i;
for (auto&c:str) {
if (islower(c))
c = toupper(c);
}
*i = str;
}
for (auto v_item : v) {
cout << v_item << endl;
}
return 0;
}

练习3.18

不合法。

    vector<int> ivec;
ivec.push_back(42);

练习3.19

    vector<int> v1(10, 42);
vector<int> v2{ 42, 42,42, 42,42, 42,42, 42, 42, 42 };
vector<int> v3 = v2;

第一种最好,比较简洁

练习3.20

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
for (decltype(v.size()) i = 0; i < v.size() - 1; i++) {
cout << (v[i] + v[i + 1]) << " ";
}
return 0;
}
#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
decltype(v.size()) j = v.size() - 1;
for (decltype(v.size()) i = 0; i < v.size(); i++) {
if (i < j - i)
cout << (v[i] + v[j - i]) << " ";
}
return 0;
}

练习3.21

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10,42 };
vector<string> v6{ 10 };
vector<string> v7(10, "hi");
cout << v1.size()<<" ";
for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
cout << *v1_item << " "; cout << endl << v2.size() << " ";
for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
cout << *v2_item << " "; cout << endl << v1.size() << " ";
for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
cout << *v3_item << " "; cout << endl << v1.size() << " ";
for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
cout << *v4_item << " "; cout << endl << v5.size() << " ";
for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
cout << *v5_item << " "; cout << endl << v6.size() << " ";
for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
cout << *v6_item << " "; cout << endl << v7.size() << " ";
for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
cout << *v7_item << " ";
return 0;
}

练习3.22

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector;int main()
{
vector<string> v;
string str;
if (getline(cin,str)) {
v.push_back(str);
}
for (auto i = v.begin(); i != v.end(); i++) {
str = *i;
for (auto& c : str) {
if (islower(c))
c = toupper(c);
}
*i = str;
}
for (auto v_item : v) {
cout << v_item << endl;
}
return 0;
}

练习3.23

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
for (unsigned i = 0; i < 10; i++) {
cin >> num;
v.push_back(num);
}
for (auto& v_item : v) {
v_item *= 2;
}
for (auto v_item : v) {
cout << v_item << " ";
}
return 0;
}

练习3.24

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
for (auto i = v.begin(), j = v.end() - 1; i < j; i++,j--) {
cout << (*i + *j) << " ";
}
return 0;
}

练习3.25

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<unsigned> scores(11,0);
unsigned grade;
while (cin >> grade) {
if (grade <= 100) {
auto it = (scores.begin() + grade / 10);
(*it)++;
}
}
return 0;
}

练习3.26

迭代器不支持除法运算

练习3.27

(a)非法,buf_size不是常量表达式

(c)非法,txt_size返回值是int而不是constexpr

练习3.28

在函数体外初始化

sa数组为空。

ia数组含有10个整数,皆为0。

在函数体内初始化

sa2数组为空。

ia2数组含有10个整数,值不确定。

练习3.29

数组的大小确定不变,不能随意向数组中增加元素,因此损失了一些灵活性

练习3.30

第三行"ix<=array_size"数组下标越界

练习3.31

#include  <iostream>

int main()
{
int array_int[10];
for (size_t i = 0; i < 10; i++) {
array_int[i] = i;
}
return 0;
}

练习3.32

#include  <iostream>
using std::cout; int main()
{
int array_int[10];
for (size_t i = 0; i < 10; i++) {
array_int[i] = i;
}
int array_int2[10];
for (size_t i = 0; i < 10; i++) {
array_int2[i] = array_int[i];
}
return 0;
}
#include  <iostream>

#include<vector>
using std::vector; int main()
{
vector<int> array_int(10);
auto array_int_item = array_int.begin();
for (size_t i = 0; i < 10; i++) {
*(array_int_item+i) = i;
}
vector<int> array_int2(array_int);
return 0;
}

练习3.33

在函数体内不初始化值就是未知的。

练习3.34

将p1指向的元素修改为p2指向的元素,由于p1和p2指向同一个数组中的元素,所以没有改变。当p1或p2其中一个越界时该程序是非法的

练习3.35

#include  <iostream>

#include<iterator>
using std::begin;
using std::end; int main()
{
int array_int[10];
auto* pend = end(array_int);
for (auto pben = begin(array_int); pben != pend; pben++) {
*pben = 0;
}
return 0;
}

练习3.36

template <typename _Container,unsigned N,unsigned M>
bool comptr(_Container(&ptr1)[N], _Container(&ptr2)[M]) {
if (N == M) {//比较数组长度
auto pend = end(ptr1);
for (auto ptr1_item = ptr1, ptr2_item = ptr2; ptr1_item != pend; ptr1_item++, ptr2_item++) {
if (*ptr1_item != *ptr2_item)return false;
}
return true;
}
return false;
}
template <typename _Container>
bool comptr(_Container(&ptr1), _Container(&ptr2)) {
if (ptr1.size()==ptr2.size()) {
for (auto ptr1_item = ptr1.begin(), ptr2_item = ptr2.begin(); ptr1_item != ptr1.end(); ptr1_item++, ptr2_item++) {
if (*ptr1_item != *ptr2_item)return false;
}
return true;
}
return false;
}

练习3.37

h
e
l
l
o

练习3.38

指针指代的是对象的地址,相加是地址相加,难以区分到底什么意义。

练习3.39

C++风格的字符串比较是字符串本身的比较

C风格的字符串比较是字符串首地址的比较

练习3.40

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{
char a[100] = "Hello World";
char b[100] = "I want an apple";
char c[200];
strcpy(c,a);
strcat(c," ");
strcat(c,b);
cout<<c;
}

练习3.41

#include  <iostream>
using std::cout;
using std::endl; #include<iterator>
using std::begin;
using std::end; #include <vector>
using std::vector; int main()
{
int array_int[] = { 0,1,2,3,4 };
vector<int> v(begin(array_int), end(array_int));
}

练习3.42

void vector_to_array(vector<int>::iterator it, size_t& size) {
int* array_int = new int[size];
for (auto i = 0; i < size; i++) {
array_int[i] = *(it + i);
cout << array_int[i]<<" ";
}
}

------------恢复内容开始------------

练习3.1

#include <iostream>
using namespace std;
int main()
{
int sum = 0, val = 50;
while (val <= 100) {
sum += val;
++val;
}
cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int val = 10;
while (val >= 0) {
cout << val-- << std::endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter the two integers" << endl;
int start, end;
//我这里没有对传入格式进行判断,如果大家有需要可以添加这个功能
cin >> start >> end;
if (start > end) {
swap(start, end);
}
while (start <= end) {
cout << start++ << endl;
}
return 0;
}
#include<iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data;
double price;
while (cin >> data.bookNo >> data.units_sold >> price) {
data.revenue = data.units_sold * price;
cout << "Record:" << data.bookNo << " " << data.units_sold << " " << data.revenue << endl;
}
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
double price;
if (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data1.units_sold * price;
}
if (cin >> data2.bookNo >> data2.units_sold >> price) {
data2.revenue = data2.units_sold * price;
}
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
return 0;
}
else {
return -1;
}
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
unsigned totalCnt = 0;
double totalRevenue = 0.0;
double price;
while (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data1.units_sold * price;
totalCnt += data1.units_sold;
totalRevenue += data1.revenue;
}
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
return 0;
}
#include  <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = { 0 };
double revenue = { 0.0 };
};
int main()
{
Sales_data data1, data2;
double price;
if (cin >> data1.bookNo >> data1.units_sold >> price) {
data1.revenue = data2.units_sold * price;
int cnt = 1;
while (cin >> data2.bookNo >> data2.units_sold >> price) {
data1.revenue = data2.units_sold * price;
if (data1.bookNo == data2.bookNo)
cnt++;
else {
cout << data1.bookNo << " " << cnt << endl;
cnt = 1;
data1 = data2;
}
}
cout << data1.bookNo << " " << cnt << endl;
}
return 0;
}

练习3.2

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str,line;
//一次读入一整行
while (getline(cin, line)) {
str = str + line;
}
cout << str;
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str,line;
//一次读入一个词
while (cin>>line) {
str = str + line;
}
cout << str;
return 0;
}

练习3.3

输入运算符会自动忽略开头的空白并从第一个真正的字符读起,直到遇见下一处空白为止

getline会从给定的输入流中读入内容,保留输入时的空白符,直到遇到换行符为止

练习3.4

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1 == str2)cout << "相等";
else {
cout << (str1 > str2 ? str1 : str2);
}
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1.size() == str2.size())cout << "相等";
else {
cout << (str1.size() > str2.size() ? str1 : str2);
}
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
//一次读入一整行
cin >> str1 >> str2;
if (str1.size() == str2.size())cout << "相等";
else {
cout << (str1.size() > str2.size() ? str1 : str2);
}
return 0;
}

练习3.5

#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
while (cin >> str1) {
str2 += str1;
}
cout << str2;
return 0;
}
#include  <iostream>
#include<string>
using std::cin;
using std::cout;
using std::string;
int main()
{
string str1,str2;
while (cin >> str1) {
str1 += " ";
str2 += str1;
}
cout << str2;
return 0;
}

练习3.6

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (auto& c : str) {
c = 'X';
}
cout << str;
return 0;
}

练习3.7

没有变化

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (char& c : str) {
c = 'X';
}
cout << str;
return 0;
}

练习3.8

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
decltype(str.size()) i = 0;
while (i < str.size()) {
str[i++] = 'X';
}
cout << str;
return 0;
}
#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="0123456789ABCDEF";
for (auto i = 0; i < str.size();i++) {
str[i] = 'X';
}
cout << str;
return 0;
}

练习3.9

输出默认初始化字符串s的第一个元素。不合法,因为默认初始化的字符串是空串,所以s[0]越界了。

练习3.10

#include  <iostream>
#include<string>
using std::cout;
using std::string;
int main()
{
string str="123()_+asad";
for (string::size_type i = 0; i < str.size(); i++) {
if (!ispunct(str[i]))
cout << str[i];
}
return 0;
}

练习3.11

for循环体不看后面花括号的内容,肯定是合法的,但是如果在for循环中花括号中给C赋值,修改C的值,那么此时的for语句肯定是不合法的。C的类型是const char&

练习3.12

知识点:vector的初始化:

1:引用不可以成为vector的元素,因为其不是对象。

2:可以用花括号初始化每一个值。

3:可以用括号指定元素个数或相同的元素值。

4:只能使用直接初始化,不可以使用拷贝初始化(vector之间的拷贝是可行的,但要保证类型相同)

答案:

(a)正确,创建了一个元素为vector的vector对象

(b)不正确,类型不一致

(c)正确,十个“null”对象

练习3.13

(a)空vector

(b)10个重复执行值初始化对象0

(c)10个重复的元素42

(d)1个元素初始值为10

(e)两个元素,初始分别为10,42

(f)10个字符串,初始化为“ ”(空)

(g)10个字符串,初始化为“hi ”

练习3.14

#include  <iostream>
#include<string>
#include <vector>
using std::cin;
using std::cout;
using std::vector;
int main()
{
int num;
vector<int> v;
while (cin >> num) {
v.push_back(num);
}
return 0;
}

练习3.15

#include  <iostream>
#include<string>
#include <vector>
using std::cin;
using std::cout;
using std::vector;
using std::string;
int main()
{
string str;
vector<string> v;
while (cin >> str) {
v.push_back(str);
}
return 0;
}

练习3.16

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10,42 };
vector<string> v6{ 10 };
vector<string> v7(10, "hi");
cout << v1.size()<<" ";
for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
cout << *v1_item << " "; cout << endl << v2.size() << " ";
for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
cout << *v2_item << " "; cout << endl << v1.size() << " ";
for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
cout << *v3_item << " "; cout << endl << v1.size() << " ";
for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
cout << *v4_item << " "; cout << endl << v5.size() << " ";
for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
cout << *v5_item << " "; cout << endl << v6.size() << " ";
for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
cout << *v6_item << " "; cout << endl << v7.size() << " ";
for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
cout << *v7_item << " ";
return 0;
}

0
10 0 0 0 0 0 0 0 0 0 0
0 42 42 42 42 42 42 42 42 42 42
0 10
2 10 42
10
10 hi hi hi hi hi hi hi hi hi hi

练习3.17

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<string> v;
string str;
while (cin >> str) {
v.push_back(str);
}
for (auto i = v.begin(); i != v.end(); i++) {
str = *i;
for (auto&c:str) {
if (islower(c))
c = toupper(c);
}
*i = str;
}
for (auto v_item : v) {
cout << v_item << endl;
}
return 0;
}

练习3.18

不合法。

    vector<int> ivec;
ivec.push_back(42);

练习3.19

    vector<int> v1(10, 42);
vector<int> v2{ 42, 42,42, 42,42, 42,42, 42, 42, 42 };
vector<int> v3 = v2;

第一种最好,比较简洁

练习3.20

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
for (decltype(v.size()) i = 0; i < v.size() - 1; i++) {
cout << (v[i] + v[i + 1]) << " ";
}
return 0;
}
#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
decltype(v.size()) j = v.size() - 1;
for (decltype(v.size()) i = 0; i < v.size(); i++) {
if (i < j - i)
cout << (v[i] + v[j - i]) << " ";
}
return 0;
}

练习3.21

#include  <iostream>
using std::cin;
using std::cout;
using std::endl; #include <vector>
using std::vector; #include<string>
using std::string; int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10,42 };
vector<string> v6{ 10 };
vector<string> v7(10, "hi");
cout << v1.size()<<" ";
for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
cout << *v1_item << " "; cout << endl << v2.size() << " ";
for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
cout << *v2_item << " "; cout << endl << v1.size() << " ";
for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
cout << *v3_item << " "; cout << endl << v1.size() << " ";
for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
cout << *v4_item << " "; cout << endl << v5.size() << " ";
for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
cout << *v5_item << " "; cout << endl << v6.size() << " ";
for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
cout << *v6_item << " "; cout << endl << v7.size() << " ";
for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
cout << *v7_item << " ";
return 0;
}

练习3.22

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector;int main()
{
vector<string> v;
string str;
if (getline(cin,str)) {
v.push_back(str);
}
for (auto i = v.begin(); i != v.end(); i++) {
str = *i;
for (auto& c : str) {
if (islower(c))
c = toupper(c);
}
*i = str;
}
for (auto v_item : v) {
cout << v_item << endl;
}
return 0;
}

练习3.23

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
for (unsigned i = 0; i < 10; i++) {
cin >> num;
v.push_back(num);
}
for (auto& v_item : v) {
v_item *= 2;
}
for (auto v_item : v) {
cout << v_item << " ";
}
return 0;
}

练习3.24

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<int> v;
int num;
while (cin >> num) {
v.push_back(num);
}
for (auto i = v.begin(), j = v.end() - 1; i < j; i++,j--) {
cout << (*i + *j) << " ";
}
return 0;
}

练习3.25

#include  <iostream>
using std::cin;
using std::cout; #include <vector>
using std::vector; int main()
{
vector<unsigned> scores(11,0);
unsigned grade;
while (cin >> grade) {
if (grade <= 100) {
auto it = (scores.begin() + grade / 10);
(*it)++;
}
}
return 0;
}

练习3.26

迭代器不支持除法运算

练习3.27

(a)非法,buf_size不是常量表达式

(c)非法,txt_size返回值是int而不是constexpr

练习3.28

在函数体外初始化

sa数组为空。

ia数组含有10个整数,皆为0。

在函数体内初始化

sa2数组为空。

ia2数组含有10个整数,值不确定。

练习3.29

数组的大小确定不变,不能随意向数组中增加元素,因此损失了一些灵活性

练习3.30

第三行"ix<=array_size"数组下标越界

练习3.31

#include  <iostream>

int main()
{
int array_int[10];
for (size_t i = 0; i < 10; i++) {
array_int[i] = i;
}
return 0;
}

练习3.32

#include  <iostream>
using std::cout; int main()
{
int array_int[10];
for (size_t i = 0; i < 10; i++) {
array_int[i] = i;
}
int array_int2[10];
for (size_t i = 0; i < 10; i++) {
array_int2[i] = array_int[i];
}
return 0;
}
#include  <iostream>

#include<vector>
using std::vector; int main()
{
vector<int> array_int(10);
auto array_int_item = array_int.begin();
for (size_t i = 0; i < 10; i++) {
*(array_int_item+i) = i;
}
vector<int> array_int2(array_int);
return 0;
}

练习3.33

在函数体内不初始化值就是未知的。

练习3.34

将p1指向的元素修改为p2指向的元素,由于p1和p2指向同一个数组中的元素,所以没有改变。当p1或p2其中一个越界时该程序是非法的

练习3.35

#include  <iostream>

#include<iterator>
using std::begin;
using std::end; int main()
{
int array_int[10];
auto* pend = end(array_int);
for (auto pben = begin(array_int); pben != pend; pben++) {
*pben = 0;
}
return 0;
}

练习3.36

template <typename _Container,unsigned N,unsigned M>
bool comptr(_Container(&ptr1)[N], _Container(&ptr2)[M]) {
if (N == M) {//比较数组长度
auto pend = end(ptr1);
for (auto ptr1_item = ptr1, ptr2_item = ptr2; ptr1_item != pend; ptr1_item++, ptr2_item++) {
if (*ptr1_item != *ptr2_item)return false;
}
return true;
}
return false;
}
template <typename _Container>
bool comptr(_Container(&ptr1), _Container(&ptr2)) {
if (ptr1.size()==ptr2.size()) {
for (auto ptr1_item = ptr1.begin(), ptr2_item = ptr2.begin(); ptr1_item != ptr1.end(); ptr1_item++, ptr2_item++) {
if (*ptr1_item != *ptr2_item)return false;
}
return true;
}
return false;
}

练习3.37

h
e
l
l
o

练习3.38

指针指代的是对象的地址,相加是地址相加,难以区分到底什么意义。

练习3.39

C++风格的字符串比较是字符串本身的比较

C风格的字符串比较是字符串首地址的比较

练习3.40

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{
char a[100] = "Hello World";
char b[100] = "I want an apple";
char c[200];
strcpy(c,a);
strcat(c," ");
strcat(c,b);
cout<<c;
}

练习3.41

#include  <iostream>
using std::cout;
using std::endl; #include<iterator>
using std::begin;
using std::end; #include <vector>
using std::vector; int main()
{
int array_int[] = { 0,1,2,3,4 };
vector<int> v(begin(array_int), end(array_int));
}

练习3.42

void vector_to_array(vector<int>::iterator it, size_t& size) {
int* array_int = new int[size];
for (auto i = 0; i < size; i++) {
array_int[i] = *(it + i);
cout << array_int[i]<<" ";
}
}

------------恢复内容结束------------

C++ Primer第5版 第三章课后练习的更多相关文章

  1. C++第三章课后作业答案及解析---指针的使用

    今天继续完成上周没有完成的习题---C++第三章课后作业,本章题涉及指针的使用,有指向对象的指针做函数参数,对象的引用以及友元类的使用方法等 它们具体的使用方法在下面的题目中会有具体的解析(解析标注在 ...

  2. CSAPP深入理解计算机系统(第二版)第三章家庭作业答案

    <深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...

  3. C++ Primer Plus学习:第三章

    C++入门第三章:处理数据 面向对象编程(OOP)的本质是设计并扩展自己的数据类型. 内置的C++数据类型分为基本类型和复合类型. 基本类型分为整数和浮点数. 复合类型分为数组.字符串.指针和结构. ...

  4. Hand on Machine Learning第三章课后作业(1):垃圾邮件分类

    import os import email import email.policy 1. 读取邮件数据 SPAM_PATH = os.path.join( "E:\\3.Study\\机器 ...

  5. C#高级编程第11版 - 第三章 索引

    [1]3.1 创建及使用类 1.构造函数:构造函数的名字与类名相同: 使用 new 表达式创建类的对象或者结构(例如int)时,会调用其构造函数.并且通常初始化新对象的数据成员. 除非类是静态的,否则 ...

  6. C primer plus 读书笔记第三章

    本章的标题是数据和C,主要内容是介绍数据类型中的整数类型和浮点数类型. 本章的第一段代码 #include <stdio.h> int main(void) { float weight; ...

  7. Java 螺纹第三版 第三章数据同步 读书笔记

    多线程间共享数据问题 一.Synchronizedkeyword      atomic一词与"原子"无关,它以前被觉得是物质的最小的单元,不能再被拆解成更小的部分.      当 ...

  8. 《C++ Primer》读书笔记 第三章

    1.注意:头文件不应包含using声明.因为头文件的内容会拷贝到所有引用他的文件中去,对于某些程序来说,由于不经意间包含了一些名字,可能会产生名字冲突.2.string类型的读入:用cin读入stri ...

  9. c++ primer plus 第三章 课后题答案

    #include<iostream> using namespace std; int main() { ; int shen_gao; cout <<"Please ...

随机推荐

  1. oracle之三闪回flashback

    闪回 flashback 5.1 flashback 的功能:1)利用undo data回溯或撤销提交的数据,2)flashback log 使database 可以恢复到过去某个时间点,可以作为不完 ...

  2. oracle之事务和锁

    Oracle的事务和锁(PPT-I-283-293) 10.1 什么是事务 必须具备以下四个属性,简称ACID 属性:原子性(Atomicity):  事务是一个完整的操作.事务的各步操作是不可分的( ...

  3. Linux rndis_host 驱动的一个BUG与解决方案

    关键字 rndis_host, linux, kernel, modem 综述 rndis 是微软定义的一套通讯方案.类似的协议还有 qmi/mbim/ecm/ncm. rndis 协议足够简单,可靠 ...

  4. [LeetCode]15. 三数之和(数组)(双指针)

    题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  5. js中的鼠标滚轮事件

    ## 事件对象 event 1 event事件对象,表示用来获取事件的详细信息,比如得到鼠标的横坐标:事件对象.clientX(clientX是可视区坐标) window.onclick = func ...

  6. hystrix(3) 熔断器

    讲完metrics我们就来了解一下熔断器的执行情况,熔断器的判断取决metrics数据. hystrix在执行命令前需要经过熔断器判断,如果服务被熔断,则执行fallback流程,熔断判断逻辑如下: ...

  7. 刷题[CISCN2019 华东南赛区]Web4

    解题思路 打开有一个链接,那先点击一下 发现url处,很像命令执行,试一试.发现无论是什么都是no response,又是各种尝试 发现直接传?url=/etc/passwwd可以爆出回显,难道不是命 ...

  8. Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析

    上一篇博客(https://www.cnblogs.com/yangxiaohui227/p/12614343.html)分享了ribbon如何实现对http://product/info/这个链接重 ...

  9. (转载)IO模型

    本文转载自网络. 如有侵权,请联系处理! 简介 参考<UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] ...

  10. 交互式甘特图组件VARCHART XGantt 如何在活动中标注非工作间隔

    甘特图从1998年的第一个商用版本开始就致力于计划编制和项目管理方面控件的研究和开发,经过20多年的积累和沉淀,目前可为软件开发商和最终用户提供最顶级的计划编制和项目管理的控件产品,帮助用户快速的整合 ...