C++ Primer 第三章
2016-04-13 22:51
387 查看
练习3.1
练习3.2、练习3.4、练习3.5
练习3.3
在执行读取操作时,string对象会自动忽略开头的空白(如空格符、换行符、制表符等)并从第一个真正的字符开始读起,知道遇见下一处空白为止;
getline会白柳输入时的空白符,从输入流中读入内容,知道遇到换行符为止,然后把所读的内容存入到那个string对象中去(不存换行符)。
练习3.6/3.8/3.10
练习3.7
没影响。
练习3.9
不合法。因为s是空的。
练习3.11
合法。c是对常量char的引用。反正没法用rangefor。
练习3.14/3.15
练习3.16
练习3.17
练习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)
b)
练习3.21
练习3.22
练习3.23
练习3.24
a)
b)
练习3.25
练习3.26
因为用(beg + end)的话,结果可能会超出总长度,指向未知的位置,VS2013报错。
#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报错。
相关文章推荐
- 用C语言画一个“爱心”
- C语言基础知识<6>
- 用c++实现的简单的日期类
- bzoj 3396 [Usaco2009 Jan]Total flow 水流
- 初识C++之多态
- c++第2次作业
- 【C++】迭代器的失效
- 第3周 C语言及程序设计初步例程-40 穷举法解题
- C语言strstr()函数:返回字符串中首次出现子串的地址
- C语言strchr()函数
- C++ Q&A(一)C++与C的区别
- C++作业3
- c++学习之赋值兼容规则
- 【第一帖】东南大学 无线通信专业 小硕一枚,希望能和各位共同学习
- C++用复合梯形法求积分
- 第3周 C语言及程序设计初步例程-39 求素数算法
- C++ primer 读书笔记 第七章 --函数
- 练习26 复杂链表拷贝
- C++混合编程之idlcpp教程Python篇(6)
- 重写、覆盖、重载、隐藏、多态几个概念的区别分析