练习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. Java多线程1:进程与线程

    进程和线程 讲线程和进程前,先讲下同步(Synchronous).异步(Asynchronous).并发(Concurrency).并行(Parallelism). 同步(Synchronous)和异 ...

  2. 1.8HDFS细节

  3. 深入了解Redis(5)-内存回收

    了解redis内存回收之前,需要先了解过期键删除策略. 过期键删除策略 1.定时删除 在设置键的过期时间的同时,创建一个timer,在定时器在键的过期时间到达时,立即执行对键的删除操作.内存友好型策略 ...

  4. Spring学习(九)Spring 和数据库编程【了解】

    一.传统 JDBC 回顾 用一个大佬的demo来简单看一下 /** * 使用jdbc,根据id查询单个Student的信息 */ public class JdbcManage { public St ...

  5. gcc g++ 安装与配置 入门详解 - 精简归纳

    gcc g++ 安装与配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 gcc g++ 安装与配置 入门详解 - 精简归纳 一.下载MinGW ...

  6. NLP常见任务

    借助BERT论文, 梳理下自然语言处理当前常见的任务. NLP任务 根据判断主题的级别, 将所有的NLP任务分为两种类型: token-level task: token级别的任务. 如完形填空(Cl ...

  7. Python新手入门基础

    认识 Python 人生苦短,我用 Python -- Life is short, you need Python 目标 Python 的起源 为什么要用 Python? Python 的特点 Py ...

  8. 正则表达式(代码java版)

    目录 元字符 检测工具 普通字符 字符类 预定义字符类 数量词 默认数量词 自定义量词 预定义量词 边界标识符 正则组 简单应用 复杂组序 捕获组 看了好些天的正则表达式,终于有时间来写一篇关于它的博 ...

  9. Gitlab集成Sonarqube自动检测代码并发送报告给提交者

    使用gitlab-ci.sonarqube.sonar-scanner 实现如下功能 1.一旦提交代码就进行代码质量检测 2. 发送检测报告邮件给提交者 先来看下最终结果,邮件中有检测报告,具体bug ...

  10. 使用redis来调用iptables,封禁恶意IP

    话不多说,通常大多数站点都会有被薅羊毛的情况,防护无非也就是业务层做处理,短时内不再响应恶意请求啦.虽然不响应了,可还是会消耗资源的,比如我要从数据库(当然也可能是内存数据库)去查询下,你是不是恶意的 ...