文章目录
- 0. Getting started
-
- 知识点
- 第一个C++程序
- 习题:
- 1. 使用字符串
-
- 知识点
- 1.1 输入
- 1.2 为姓名装框
- 小结
-
- 习题
- 2. 循环和计数
-
- 知识点
- while 语句
- if 语句
- 程序简化
- 计数
- 小结
- 习题
- 使用批量数据
- 组织程序和数据
-
- 知识点
- 使用顺序容器并分析字符串
- 使用库算法
- 使用关联容器
- 使用泛型函数
- 定义新类型
- 管理内存和低级数据结构
- 定义抽象数据类型
- 使类对象像一个数值一样工作
- 使用继承与动态绑定
- 近乎自动地管理内存
- 再探字符图形
Learn C++ by Accelerated C++
0. Getting started
知识点
- 标准库、核心语言
- 程序结构:自由风格
- 类型
- 命名空间
- 定义和头文件
- 主函数
- 花括号和分号
第一个C++程序
#include<iostream> // 标准库头文件,输入/输出流(Input/Output Stream)
int main(){
// 调用主函数响应程序需求(返回0或者其它)std::cout << "Hello, World!" << std::endl;// 使用标准库中的输出运算符 << 将 'Hello, World!'写到标准输出中,并显示在cout所在窗口,std::endl为当前输出语句行的结束,并实现换行(本质上是用两个<<实现了连续的输出)return 0; // 返回0(表示成功)}
#include
指令是一种是调取头文件的工具,用来明确指定程序所需的那部分头文件iostream
是Standard library header 即标准库头文件<<
是一种运算符(operator)std::cout
和std::endl
是操作数(operand),其中后者是控制器cout
是标准库中的对象;endl
是一个函数模板:
是作用域运算符,std:cout
表示的是在(名字空间)作用域std
中的名称cout
"Hello, World!"
是表达式(expression)
一些问题:
什么是定义,什么是头文件?
头文件和标准库的区别?
什么是核心语言?什么是标准库?
习题:
- 0-0
#include <iostream>int main() {
std::cout << "Hello, world!" << std::endl;return 0;
}
- 0-2
#include <iostream>int main() {
std::cout << "This (\") is a quote, and this (\\) is a backslash."<< std::endl;return 0;
}
- 0-4
# include <iostream>int main(){
std::cout<<"#include <iostream>\n""\n""int main(){\n""\tstd::cout<<\"Hello,world\"<<std::endl;\n""\treturn 0;\n""}\n"<<std::endl;return 0;
}#include <iostream>int main(){
std::cout<<"Hello,world"<<std::endl;return 0;
}Program ended with exit code: 0
- 0-9
int main(){
}
- 0-10
#include<iostream>int
main
(
)
{
std
::
cout
<<
"Hello, world!"
<<
std
::
endl
;
return
0
;
}
1. 使用字符串
知识点
- 声明
- 变量
- 初始化
- 输入
- string 库
1.1 输入
#include<iostream>
#include<string>int main(){
// 请某人输入姓名std::cout << "Please enter your first name: ";// 读姓名std::string name; // 定义变量 namestd::cin >> name; // 把姓名读进 name// 输出对这个人的问候语std::cout << "Hello, " << name << "!" << std::endl;return 0;}
从现在开始,以后的代码不再由Xcode完成,而是转向使用jupyter notebook ,环境配置可查看之前的文章:Mac上配置环境并运行第一个C++程序
1.2 为姓名装框
std::cout << "Please enter your first name: ";
std::string name;
std::cin >> name;
const std::string greeting = "Hello, " + name + "!";
const std::string spaces(greeting.size(), ' ');
const std::string second = "* " + spaces + " *";
const std::string first(second.size(), '*');
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;
Please enter your first name: Robin_pi********************1. *2. Hello, Robin_pi! *3. *
********************4. List item
std::cout << "xxxx"
输出(write)std::string name
定义变量name,类型为std::string
std::cin >> name
输入(read)-
运算符是左结合的
-
运算符是右结合的
- = 实现变量赋值(同时完成初始化)
- const 为常量关键字,可以确保常量变量的值不会改变
一些问题:
是什么是变量?作用是什么?和对象的区别是什么?
存放数据的地方,是一个具有名称的对象,而对象是计算机中的一段具有类型的内存空间。
什么是类型?有哪些类型?
表达式包含操作数和运算符,每一个操作数都具有一个类型,比如核心语言定义了int
代表的是整数类型,库定义了std::ostream
作为提供了基于流的输出的类型。
小结
注意:在一对花括号内定义的变量是局部变量。
习题
暂略~
2. 循环和计数
知识点
- 循环
- 条件分支
- 循环不变式
while 语句
while(condition)statement // <font color =red>若statement为语句,则其本身包含了分号;,若为块语句,则它本身也会有{},所以没有分号;
或者
while(condition) statement
- 设计循环语句
略
if 语句
if (condition)statement // 同 while,这里面要么是语句(分号;结尾)要么是语句块(用花括号{}包起来)
或者
if (condition)statement1
elsestatement2
略~
程序简化
- using 声明
- for 语句
for(init-statement condition;expression) // 注意,初始化语句本身包含了分号;statement
例如:
#include<iostream>
#include<string>int main(){
for (int r = 0; r <= 3; ++r) // `++r` 特指 `r = r + 1`,即返回相加后的值(若是`++r`则是返回r的原始值)std::cout << "*";
}
一般而言,for语句的意义相当于:
{
init-statement
while (condition) {
statement expression; }
}
即:
#include<iostream>
#include<string>int main(){
int r=0;while (r<=3){
std::cout << "*";++r;}}
- 压缩检测
计数
- 从0开始计数
for (string::size_type r = 0; r != rows; ++r) {
// <输出一行>
}
- 从1开始计数
for (string::size_type r = 1; r <= rows; ++r) {
// <输出一行>
}
两种方式循环的次数一样,但是一般都选择从0开始计数:可以使用不对称区间来表示间隔。原因如下:
不对称区间的一个重要性质:在一个形式为[m,n)的区间包含 n-m 个元素,而形式[m,n]的区间中则有 m-n+1 个元素。(即可以很快地看出区间中所包含的元素个数)
从零计数使得循环不变式更易于表达:(对于[0,rows])到目前为止,我们已经输出了r 行。
用 != 比 <=使我们更能了解程序的状态:前者表示已经输出了r行,而后者表示至少输出了r行(可能更多!)
小结
(1)操作数(operators)
(2)类型
本章的一些问题:
- 为什么不直接使用
int
而是使用const int
?const
的作用是什么?
一,减少出错的几率;二,明确地向读代码的人传递信息:不能修改这个变量 - (定义字符串的长度变量时)为什么不直接使用
const int cols
而是使用const std::string::size_type cols
?size_type
和int
的用法区别?
size_type为无符号类型,int为有符号类型(可能为负数)。一般我们都会用std::string::size_type
来当做储存字符串长度的变量的变量类型。
…
习题
暂时决定:习题与理论分开(加快速度)
使用批量数据
一些数据类型
- int:整型
- double :双精度浮点类型
- float :单精度浮点类型
一些操作:
? :
运算符:条件运算符,是if-else-then
的缩写,即if xxx (?) else (:)xxx
类型定义:
- typedef type name;
组织程序和数据
知识点
- 函数(子程序)
- 数据结构
- 程序结构
变量引用:
vector<double>& hw = homework; //hw是homework的一个替代名
count vector<double>& chwl = chw; // 注意chwl是只读的
使用顺序容器并分析字符串
使用库算法
- 泛型算法
- 增量算法
使用关联容器
使用泛型函数
定义新类型
管理内存和低级数据结构
- 指针与数组
定义抽象数据类型
使类对象像一个数值一样工作
使用继承与动态绑定
近乎自动地管理内存
再探字符图形
参考:
- 代码部分的参考答案(已下载至本地:github-Accelerated C++)
- 全部的答案(已下载本地:github-Accelerated-cpp-master)
- C++ reference——要多多查看官方文档!