您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 第三章

2016-04-13 22:51 387 查看
练习3.1

#include <iostream>
#include <string>
#include "Sales_data.h"
//using声明
using std::cin;
using std::cout;
using std::endl;
using std::cerr;

int main()
{
//计算50—100连加
int a = 50;
int sum = 0;
while (a <= 100)
{
sum += a;
++a;
}
cout << sum << endl;
//  return 0;

//计算两个Sale_item对象的和

//读入Sale_data1和Sales_data2

Sales_data data1,data2;
cin >> data1.ISBN >> data1.price >> data1.units_sold;//ISBN号、单价、销量
data1.revenue = data1.price * data1.units_sold;//销售额

cin >> data2.ISBN >> data2.price >> data2.units_sold;
data2.revenue = data2.price * data2.units_sold;

//判断ISBN号是否相同,如果相同,求和
double average = 0;

if (data1.ISBN == data2.ISBN)
{
int totalCnt = data1.units_sold + data2.units_sold;//销售总量
double totalRevenue = data1.revenue + data2.revenue;//销售总额
//平均价格
if (totalCnt != 0)
{
average = totalRevenue/totalCnt;
}
else
cout << "No sales" << endl;
cout << data2.ISBN << " " << totalCnt << " " << totalRevenue << " " << average ;
return 0;
}
else {
cerr << "Data must refer to the same ISBN" << endl;
return -1;
}
}


练习3.2、练习3.4、练习3.5

#include <iostream>
#include <string>

using std::string;
using std::cin;
using std::cout;
using std::endl;

int main()
{
/******************练习3.2********************/
string s;
//一次读入一整行
while (getline(cin, s))
{
cout << s << endl;
}
//一次读入一个词
//while (cin << s)
//{
//  cout << s << endl;
//}

/*********************练习3.4**********************/
string s1, s2;
cin >> s1 >> s2;
if (s1 == s2)
{
cout << "s1 = s2" << endl;
}
else
{
if (s1 > s2)
{
cout << s1 << endl;
}
else if (s1 < s2)
{
cout << s2 << endl;
}
}
//判断是否等长
if (s1.size() == s2.size())
{
cout << "s1.size = s2.size" << endl;
}
else
{
if (s1.size() < s2.size())
{
cout << s2 << endl;
}
else
{
cout << s1 << endl;
}
}

/**************练习3.5*******************/
string s3, s4;
if (cin >> s3)
{
while (cin >> s4)
{
//s3 += s4;
s
10f39
3 = s3 + ' ' + s4;
}
cout << s3 << endl;
}
/********************************************ctrl+z to stop*****************************/

return 0;
}


练习3.3

在执行读取操作时,string对象会自动忽略开头的空白(如空格符、换行符、制表符等)并从第一个真正的字符开始读起,知道遇见下一处空白为止;

getline会白柳输入时的空白符,从输入流中读入内容,知道遇到换行符为止,然后把所读的内容存入到那个string对象中去(不存换行符)。

练习3.6/3.8/3.10

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::string;
using std::endl;

int main()
{
/**********************range for********************/
string s1;
cin >> s1;
decltype(s1.begin()) i;
for (i = s1.begin(); i < s1.end(); ++i)//for(auto c : s1)
{
*i = 'X';//c = 'X';
}
cout << s1 << endl;

/************************for*************************/
string s2;
cin >> s2;
string::size_type j;
for (j = 0; j < s2.size(); ++j)
{
s2[j] = 'X';
}
cout << s2 << endl;

/***********************while*************************/
string s3;
cin >> s3;
string::size_type k = 0;
while( k < s3.size() )
{
s3[k] = 'X';
++k;
}
cout << s3 << endl;

/*********************del punctuation**********************/
string s4;
cin >> s4;

string::size_type m = 0;

string res;/*************************非符号存放在新的string**************************/

while( m < s4.size())
{
if (!ispunct(s4[m]))
{
res += s4[m];
++m;
}
else
++m;

}

cout << res << endl;

return 0;

}


练习3.7

没影响。

练习3.9

不合法。因为s是空的。

练习3.11

合法。c是对常量char的引用。反正没法用rangefor。

练习3.14/3.15

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

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
//int i;
string i;
//vector<int> v;
vector<string> v;
while(cin >> i)
{
v.push_back(i);
}
return 0;
}


练习3.16

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

using std::cin;
using std::cout;
using std::string;
using std::vector;
using std::endl;

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

int s1 = v1.size();
int s2 = v2.size();
int s3 = v3.size();

int i = 0;

while (i < v2.size())
{
cout << v2[i] << " ";
++i;
}
cout << endl;

int j = 0;
while (j < v3.size())
{
cout << v3[j] << " ";
++j;
}

cout << endl << s1 << " " << s2 << " " << s3 <<endl;
}


练习3.17

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

using std::cin;
using std::cout;
using std::vector;
using std::string;
using std::endl;

int main()
{
string word;
vector<string> v;//v中保存string对象 初始v为空
while (cin >> word)//当有string对象word输入时
{
v.push_back(word);//把word push到对象尾端
}

decltype(v.size()) i = 0;//计数器
vector<string> v2;//v2中保存string对象,用来存toupper后的v
while (i < v.size())//对于容器v中的每一个string对象
{
decltype(v[i].size()) j = 0;
while (j < v[i].size())//对于该string对象的每一个字符
{
v[i][j] = toupper(v[i][j]);//大写
++j;//计数
}
cout << v[i] << endl;
++i;//计数
}

return 0;
}


练习3.18

不合法。ivec是一个空vector,根本不包含任何元素,不能通过下标去访问任何元素,正确的方法是用push_back。

练习3.19

1.vector ivec(10, 42);

2.vector ivec{42,42,42,42,42,42,42,42,42,42};

3.vector ivec;

for(int i = 0; i != 10; ++i)

ivec.push_back(42);

练习3.20

a)

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

using std::cin;
using std::cout;
using std::string;
using std::vector;
using std::endl;

int main()
{
int num;
vector<int> v;
while (cin >> num)//读入一组整数
{
v.push_back(num);
}
decltype(v.size()) i = 0;
decltype(v.size()) vs = v.size();
vector<int> res;
//相邻数相加
while (i < v.size() - 1)
{
int m = v[i] + v[i + 1];
res.push_back(m);
i = i + 2;
}
if (vs / 2 != 0)//如果有奇数个数
{
res.push_back(v[vs - 1]);
}
//输出容器res中存放的结果
decltype(res.size()) k = 0;
while (k < res.size())
{
cout << res[k];
++k;
}
return 0;
}


b)

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

using std::cin;
using std::cout;
using std::string;
using std::vector;
using std::endl;

int main()
{
int num;
vector<int> v;
while (cin >> num)//读入一组整数
{
v.push_back(num);
}
decltype(v.size()) i = 0;
decltype(v.size()) vs = v.size();
vector<int> res;
//相邻数相加
//while (i < v.size() - 1)
//{
//  int m = v[i] + v[i + 1];
//  res.push_back(m);
//  i = i + 2;
//}

//首尾相加
while (i < vs/2 )
{
int m = v[i] + v[vs - 1 - i];
res.push_back(m);
++i;
}

//如果是奇数个
if (vs %2 != 0)
{
res.push_back(v[vs / 2]);
}

//if (vs % 2 != 0)//如果有奇数个数
//{
//  res.push_back(v[vs - 1]);
//}
//输出容器res中存放的结果
decltype(res.size()) k = 0;
while (k < res.size())
{
cout << res[k];
++k;
}
return 0;
}


练习3.21

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

using std::cin;
using std::cout;

using std::string;
using std::vector;

using std::endl;

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

//v2
int cnt = 0;

for (auto it = v2.begin(); it != v2.end();++it)
{
cout << (*it) << " ";
++cnt;
}
cout << endl << cnt << endl;

//v3
int c3 = 0;

for (auto it = v3.begin(); it != v3.end();++it)
{
cout << (*it) << " ";
++c3;
}
cout << endl << c3 << endl;

//v4
int c4 = 0;

for (auto it = v4.begin(); it != v4.end(); ++it)
{
cout << (*it) << " ";
++c4;
}
cout << endl << c4 << endl;

//v5
int c5 = 0;

for (auto it = v5.begin(); it != v5.end(); ++it)
{
cout << (*it) << " ";
++c5;
}
cout << endl << c5 << endl;

//v6
int c6 = 0;

for (auto it = v6.begin(); it != v6.end(); ++it)
{
cout << (*it) << " ";
++c6;
}
cout << endl << c6 << endl;

//v7
int c7 = 0;

for (auto it = v7.begin(); it != v7.end(); ++it)
{
cout << (*it) << " ";
++c7;
}
cout << endl << c7 << endl;

return 0;
}




练习3.22

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

using std::cin;
using std::cout;

using std::string;
using std::vector;

using std::endl;

int main()
{
vector<string> text;
string word;
while (cin >> word)//向text里面push_back字符串word
{
text.push_back(word);
}

for (auto it = text.begin(); it != text.end() && !it ->empty(); ++it)//对于vector容器text里的每一个string成员
{
decltype(it->size()) i;
for (i = 0; i != it->size(); ++i)//对于每一个string成员的每个字符
{
(*it)[i] = toupper((*it)[i]);//大写
}
cout << *it << endl;//输出
}

return 0;

}


练习3.23

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

using std::cin;
using std::cout;

using std::vector;
using std::string;

using std::endl;

int main()
{
vector<int> v;//不能用v(10),否则前十个数都是0
int dig;
while (cin >> dig)
{
v.push_back(dig);//向vetor容器v中push_back数字
}

for (auto i = v.begin(); i != v.end(); ++i)
{
*i = 2 * (*i);
cout << *i << " ";
}
return 0;
}


练习3.24

a)

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

using std::cin;
using std::cout;

using std::string;
using std::vector;

using std::endl;

int main()
{
vector<int> v;
vector<int> res;
int dig;
while (cin >> dig)
{
v.push_back(dig);
}

int sum = 0;
int size = v.size();
if (size %2 == 0)//输入偶数个整数
{
for (auto it = v.begin(); it != v.end(); ++it)
{
sum = *it;
it += 1;
sum += *it;
res.push_back(sum);
cout << sum << " ";
}
cout << endl;
}
else
{
for (auto it = v.begin(); it != v.end() - 1; ++it)
{
sum = *it;
it += 1;
sum += *it;
res.push_back(sum);
cout << sum << " ";
}
auto i = v.end();
cout << *(i - 1) << endl;
}

return 0;
}


b)

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

using std::cin;
using std::cout;

using std::string;
using std::vector;

using std::endl;

int main()
{
vector<int> v;
vector<int> res;
int dig;
while (cin >> dig)
{
v.push_back(dig);
}

int sum = 0;
int size = v.size();
auto mid = v.begin() + (v.end() - v.begin()) / 2;
auto i2 = v.end() - 1;

if (size % 2 == 0)//输入偶数个整数
{
for (auto it = v.begin(); it != mid; ++it)
{
sum = *it + *i2;
--i2;
cout << sum << " ";
}
cout << endl;
}
else
{
for (auto it = v.begin(); it != mid; ++it)
{
sum = *it + *i2;
--i2;
cout << sum << " ";
}
cout << *(mid) << endl;
}

return 0;
}


练习3.25

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

using std::cin;
using std::cout;
using std::string;
using std::vector;
using std::endl;

int main()
{
vector<int> scores(11, 0);//11个人数段
unsigned grade;
auto it = scores.begin();

while (cin >> grade)//有成绩输入
{
if (grade <= 100)
{
int n = grade / 10;
*(it + n ) += 1;
}
}

for (auto i = scores.begin(); i != scores.end(); ++i)
{
cout << *i << " ";
}
return 0;

}


练习3.26

因为用(beg + end)的话,结果可能会超出总长度,指向未知的位置,VS2013报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: