相关的c++课程听了不少,但听课不能代替看书,书籍系统的总结对于形成体系,查漏补缺还是有很大作用的。
市面上c++书籍多如牛毛,公认好评的无非《c++ primer》,《The c++ programming language》等全面介绍语言特性的书籍和 《effective c++》 《more effective c++》等专家建议类书籍。为了对应自己正在进行的c++系列课程的学习,需要短时间内对c++有一个系统的梳理,即采用2-8原则,以较短的时间,掌握最为常用的那部分。显然上述最上所述两个大部头,不是当下的首选。所以另一本市面已不多见,但也曾公认好评的入门书,《accelerated c++》可能就是最好的选择(像书中所说,如果你想使用c++编程,就需要掌握这本书中的所有知识,尽管它没有告诉你想知道的一切)。在接下来假期这段时间内,自己需要仔细阅读并尽量多地完成书中的习题,在此开始总结帖,希望能把收获进行梳理沉淀。
然而,正如侯捷老师所说,“作为一个好的学习者,重要的事你的学习态度,起步固然可以从轻松小品开始,但如果碰上大部头就退避三舍,逃之夭夭,面对任何技术只求快餐速成,学语言而从来不写程序,那就永远没有成为高手的一天。” 与自己共勉,开学后开读《c++ primer》...
第0章 入门
对hello world程序的讲解梳理,自然不会有什么新的东西,相关概念的复习吧。
第一章 使用字符串
本章程序:
// ask for a person‘s name, and generate a framed greeting #include <iostream> #include <string> int main() { std::cout << "Please enter your first name: "; std::string name; std::cin >> name; // build the message that we intend to write const std::string greeting = "Hello, " + name + "!"; // build the second and fourth lines of the output const std::string spaces(greeting.size(), ‘ ‘); const std::string second = "* " + spaces + " *"; // build the first and fifth lines of the output const std::string first(second.size(), ‘*‘); // write it all std::cout << std::endl; std::cout << first << std::endl; std::cout << second << std::endl; std::cout << "* " << greeting << " *" << std::endl; std::cout << second << std::endl; std::cout << first << std::endl; return 0; }
1. wchar_t 用来存放“宽字符”的内置类型,宽字符是一种足够大的类型,可以为多种语言保存字符。
2. string 类 有一种
string z(n,c)的操作,即定义string类型变量z,并且用字符c的n份复制来初始化z。 注意: c必须为char类型,不能使string类型或字符串常量
3. string类加号 s+t 中, s或者t中任意一个都可以是(但不可以两个都是)字符串直接量或者char类型
所以
std::string exclaim = "!";
std::string s = "Hello" + ", World" + exclaim; //错误,+左结合,出现了两个字符串常量相加
第二章 循环和计数
本章介绍了while,if,for等语句的用法,设计while语句时的循环不变式的概念,以及算数,逻辑操作符和他们的优先级,新东西不多,看程序和注释吧
#include <iostream> #include <string> // say what standard-library names we use using std::cin; using std::endl; using std::cout; using std::string; int main() { // ask for the person‘s name cout << "Please enter your first name: "; // read the name string name; cin >> name; // build the message that we intend to write const string greeting = "Hello, " + name + "!"; // the number of blanks surrounding the greeting const int pad = 0; // the number of rows and columns to write const int rows = pad * 2 + 3; const string::size_type cols = greeting.size() + pad * 2 + 2; //当定义一个变量来保存特定数据结构的大小时, //养成使用标准库定义的相应类型的好习惯 . //size_t 无符号整数类型(来自头文件<cstddef>),可包含任意对象长度 //string::size_type 无符号整数类型,包含任意string对象长度 // write a blank line to separate the output from the input cout << endl; // write `rows‘ rows of output // invariant: we have written `r‘ rows so far for (int r = 0; r != rows; ++r) { string::size_type c = 0; // invariant: we have written `c‘ characters so far in the current row while (c != cols) { // is it time to write the greeting? if (r == pad + 1 && c == pad + 1) { cout << greeting; c += greeting.size(); } else { // are we on the border? if (r == 0 || r == rows - 1 || c == 0 || c == cols - 1) cout << "*"; else cout << " "; ++c; } } cout << endl; } return 0; }
第三章 使用批量数据
主要是vector的定义和相关操作,以及流输出控制符的介绍。
1 头文件<ios>定义了streamsize 类型,这是输入输出库用来表示长度的类型;
头文件<iomanip>定义了控制符setprecision,用来说明希望输出中包含多少位有效数字
2 vector
size_type 无符号类型,足够存储最大的vector大小;
v.begin(), v.end(), v.push_back, v.size(),
3 其他库函数
sort(b,e), max(e1,e2), while(cin>>x),
s.precision(n) 设置流s以后的输出精度为n,(省略n保持原有的输出精度)返回原有的输出精度
setprecision(n)
#include <algorithm> #include <iomanip> #ifndef __GNUC__ #include <ios> #endif #include <iostream> #include <string> #include <vector> using std::cin; using std::sort; using std::cout; using std::streamsize; using std::endl; using std::string; using std::setprecision; using std::vector; int main() { // ask for and read the student‘s name cout << "Please enter your first name: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; // ask for and read the midterm and final grades cout << "Please enter your midterm and final exam grades: "; double midterm, final; cin >> midterm >> final; // ask for and read the homework grades cout << "Enter all your homework grades, " "followed by end-of-file: "; vector<double> homework; double x; // invariant: `homework‘ contains all the homework grades read so far while (cin >> x) homework.push_back(x); // check that the student entered some homework grades #ifdef _MSC_VER typedef std::vector<double>::size_type vec_sz; #else typedef vector<double>::size_type vec_sz; #endif vec_sz size = homework.size(); if (size == 0) { cout << endl << "You must enter your grades. " "Please try again." << endl; return 1; } // sort the grades sort(homework.begin(), homework.end()); // compute the median homework grade vec_sz mid = size/2; double median; median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2 : homework[mid]; // compute and write the final grade streamsize prec = cout.precision(); cout << "Your final grade is " << setprecision(3) << 0.2 * midterm + 0.4 * final + 0.4 * median << setprecision(prec) << endl; return 0; }