C++ Primer
操作环境:
Windows操作系统
Microsoft Visual Stream(简称VS)
本文档致力于帮助基础差的朋友更简单的理解书文。
遇到理解不了的名词,可以查看章节末尾的术语表。
第一章 开始
1.1 编写一个简单的C++程序
前期准备:
打开vs→创建新项目→空项目→下一步→创建→文件→新建→文件→Visual C++→C++文件(.cpp)→打开。
创作流程:编写代码→编译代码(生成程序)。
编写代码:
int main() {
return 0;
}
C++语言定义一个函数包含四个部分:返回类型、函数名、行为参数、函数体。
“int”: 返回类型(”int”表示返回整数类型);
“main”: 函数名;
“( )”: 括号内为行为参数;
“{ return 0;}”: 函数体;
“;”: C++中语句结束必须书写分号;
1.1.1 编译、运行程序
建议跳过章节:从命令行运行编译器、运行程序。
VS中C++程序的源文件(存放源码的文件)命名后缀:.cpp、.cxx、.cc。
编译代码(生成程序):
VS中按F5(或者点击“本地Windows调试器”按钮)。
桌面弹出VS调试控制台,显示“…代码为0”。至此,一个C++程序创作完成。
练习1.1、1.2
1.1:略;
1.2:不会;不会;不会;不会;不会;不会;不会;不会;不会;不会;不会;不会;
1.2 初识输入输出
编写程序,要求输入两个数字,程序自动计算出两个数字的和:
步骤:打印“输入两个数字”(以提示用户输入)→输入两个数字并确定(按“Enter”键)→打印“这两个数的和为:”
int main() {
std::cout << "Enter two number:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The number of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
return 0;
}
C++用标准库来提供IO机制。
iostream库:
istream:输入流;
ostream:输出流;
流:指数据顺序进行;
引入iostream库:
#include <iostream>
打印“输入两个数字”(以提示用户输入):
std::cout << "Enter two number:" << std::endl;
该语句执行一个表达式。表达式由运算对象和运算符两部分组成。上语句运算对象包括std::cout
、Enter two number:
、std::endl
,运算符为<<
;
std
:命名空间(标准库所用的命名空间);
cout
:ostream对象,用来输出数据,被为“标准输出”;
<<
:用来将右侧数据输出到左侧对象。
"Enter two number:"
:字符串对象,我们用双引号(“”)包裹数据来表示这是字符串;
endl
:操纵符,结束当前行。
因为cout
遵循“流”,上面表达式从左至右运行,所以上面表达式等同于下面写法:
std::cout << "Enter two number:" ;
std::cout << std::endl;
输入两个数字并确定(输入结束按“Enter”键):
int v1 = 0, v2 = 0;
创建两个变量(v1、v2)并初始化;
std::cin >> v1 >> v2;
输入两个整数(cin
:标准输入。类似cout
,不做赘述);
打印“这两个数的和:”:
std::cout << "The number of " << v1 << " and " << v2 << " is: "<<v1 + v2 << std::endl;
练习1.3—1.6
1.3:
int main() {
std::cout << "Hello World!"<<std::endl;
return 0;
}
1.4:
int main() {
std::cout << "Enter two number:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The number of " << v1 << " prep " << v2 << " is " << v1 * v2 << std::endl;
return 0;
}
1.5:
int main() {
std::cout << "Hello World!";
std::cout << std::endl;
return 0;
}
1.6:
不合法。运算符左右必须为对象,“;”不是对象。修正就去掉前两行末尾的“;”。
1.3 注释
单行注释://……
;
多行注释:/*……*/
;多行注释不能嵌套;
调试代码注释方式:
// /*
//
//
// */
练习1.7—1.8
1.7:
/*
/*
int main() {
std::cout << "Hello World!"<< std::endl;
return 0;
}
*/
*/
错误列表会标显错误。
1.8:
int main() {
std::cout << "/*";//合法
std::cout << "*/";//合法
// std::cout<</*"*/"*/;//错误
std::cout <</*"*/"/*"/*"*/;//合法
return 0;
}
错误语句改正:
std::cout<</*"*/"*/";
1.4 控制流
1.4.1 while语句
练习1.11超纲(跳转练习1.19)
求1到10这十个数的和:
int main() {
int sum = 0, val = 1;
while (val <= 10) {
sum += val;
++val;.
}
std::cout << "The sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
while语句格式:
while(条件){
循环
}
当“()”中条件满足时,持续执行“{}”中语句,直至条件不满足时,跳过while语句。
while (val <= 10) {
sum += val;
++val;
}
翻译为:当val<=10
时,持续执行sum+=val
;,++val;
。
sum+=val;
等同sum=sum+val;
,翻译为将sum
与val
相加的和赋值给sum
;
++val;
等同val=val+1;
练习1.9—1.11
练习1.9:
int main() {
int sum = 0, num = 50;
while (num <= 100) {
sum += num;
++num;
}
std::cout << "The sum of 50 to 100 inclusive is " << sum << std::endl;
return 0;
}
练习1.10:
int main() {
int num = 10;
while (num >1) {
--num;
std::cout << num << std::endl;
}
return 0;
}
练习1.11超纲(跳转练习1.19)
1.4.2 for语句
从一加到十:
int main() {
int sum = 0;
for (int val = 1; val <= 10; ++val)
sum += val;
std::cout << "The number of 1 to 10 inclusive is "<<sum << std::endl;
return 0;
}
for语句格式:
for(初始化语句;循环条件;表达式)
循环体;
代码:
for (int val = 1; val <= 10; ++val)
sum += val;
int val = 1;
初始化语句(只执行一次);
val <= 10;
循环条件;
++val
;表达式;
sum += val;
循环体;
翻译为:定义变量val
,当val
小于等于10时,将sum
与val
的和赋值给sum
,然后val
加1,继续循环。
for循环的循环体先于表达式执行。执行顺序为:初始化语句(只执行一次)→循环条件→循环体→表达式→循环条件→循环体→表达式→…
练习1.12—1.15
1.12:
求-100到100的之间数的和。0。
int main() {
int sum = 0;
for (int i = -100; i <= 100; ++i)
sum += i;
std::cout << "Sum -100 to 100 inclusive is " << sum << std::endl;
return 0;
}
1.13:
int main() {
int sum = 0;
for (int num = 50; num <= 100; ++num)
sum += num;
std::cout << "The sum of 50 to 100 inclusive is " <<sum<<std::endl;
return 0;
}
int main() {
for (int num = 9; num >= 1; num--)
std::cout << num std::endl;
return 0;
}
超纲(跳转练习1.19)
1.14:
互为优缺。
for循环:代码简洁,循环初识变量放在循环语句头,不污染全局变量;适用于循环次数已知的情况。
While循环:适用循环次数未知的情况。
1.15:略;
1.4.3 读取数量不定的输入数据
有的时候我们不知道具体需要输入多少数据,如下:
int main() {
int sum = 0, value = 0;
while (std::cin >> value) {
sum += value;
}
std::cout << "sum is " << sum << std::endl;
return 0;
}
while (std::cin >> value)
:cin
是输入流对象,while
判断流是否有效。流遇到“文件结束符(Ctrl+z)”,或者无效输入时停止。所以输入完成时要按“Ctrl+z”;
练习1.16
见本节示例代码。
1.4.4 if语句
输入几个数,按输入顺序打印出每个数出现几次:
int main() {
int currval = 0, val = 0;
if (std::cin >> currval) {
int cnt = 1;
while (std::cin >> val) {
if (val == currval)
++cnt;
else {
std::cout << currval << " occurs " << cnt << " times" << std::endl;
currval = val;
cnt = 1;
}
}
std::cout << currval << " occurs " << cnt << " times" << std::endl;
}
return 0;
}
If语句格式:
If(条件){
条件满足执行语句
}else {
条件不满足执行
}
int currval = 0, val = 0;
:定义两个变量“已记录值”和“新输入值”并初识化;
std::cin >> currval
:输入有效数字启动;
int cnt = 1
:“已记录值”出现了一次;
while (std::cin >> val) {}
:输入数字就进行循环;
if (val == currval)
:==
用来判断“已记录值”和“新输入值”的值是否相等;
++cnt;
:相等则记录“已记录值”出现次数加1;
else {}:否则输出括号内内容;
std::cout << currval << " occurs " << cnt << " times" << std::endl;
:输出“已记录值”出现了cnt
次;
currval = val;
:把“新输入值”赋值给“已记录值”;
cnt = 1;
记录“已记录值”出现了一次;
std::cout << currval << " occurs " << cnt << " times" << std::endl;
:输出一下最后一个输入的值。我们模拟一下循环最后输入的那个值,如果和“已记录的值”相同,则记录出现次数加一,不会进行输出操作。如果不相同则输出原“已记录值”,最后输入的那个值只是转换为“已记录值”,同样不进行输出操作,所以我们需要在while循环结束后输出一下循环最后输入的那个值。
练习1.17—1.19
1.17:相等时输出“值”出现了几次。不重复时输出每个“值”出现了一次;
1.18:略;
1.19:
int main() {
std::cout << "Enter two number:" << std::endl;
int num1 = 0, num2 = 0;
std::cin >> num1 >> num2;
if(num1>num2){
int num3 = 0;
num3 = num1;
num1 = num2;
num2 = num3;
}
while (num1 < num2-1) {
std::cout << num1 + 1 << std::endl;
++num1;
}
return 0;
}
int main() {
std::cout << "Enter two number:" << std::endl;
int num1 = 0, num2 = 0;
std::cin >> num1 >> num2;
if (num1 > num2) {
int num3 = 0;
num3 = num1;
num1 = num2;
num2 = num3;
}
for(int i=num1;num1 < num2 - 1;++num1)
std::cout << num1 + 1 << std::endl;
return 0;
}
1.5 类简介
准备工作:下载头文件Sales_item.h。
步骤:https://www.informit.com/title/0321714113 →下拉Downloads→Download the source code files for MS Visual Studio 2012→解压→将Version_test.h和Sales_item.h两个文件复制到你项目的跟目录下(也就是在文件夹里打开你项目,复制进去)。
类:一个类定义了一个类型和它所关联的一组操作。
1.5.1 Sales_item类
新建book对象:
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item book;
std::cin >> book;
std::cout << book << std::endl;
return 0;
}
#include "Sales_item.h"
:调用头文件。头文件用双引号调用。
Sales_item book;
:定义一个book对象。
两个对象相加:
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2;
std::cout << item1 + item2 << std::endl;
return 0;
}
练习1.20—1.22
1.20:
int main() {
Sales_item item;
while (std::cin>>item) {
std::cout << item << std::endl;
}
return 0;
}
1.21:代码见“两个代码相加”
1.2.2:
int main() {
Sales_item total;
Sales_item trans;
if (std::cin >> trans) {
while (std::cin >> total) {
trans += total;
}
}
std::cout << trans << std::endl;
return 0;
}
1.5.2 初识成员函数
练习1.23—1.24(默认相同ISBN记录连续出现)
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2;
if (item1.isbn() == item2.isbn()) {
std::cout << item1 + item2 << std::endl;
return 0;
}
else {
std::cerr << "Data must refer to same ISBN" << std::endl;
return -1;
}
}
成员函数格式:对象.函数名(实参)。
成员函数也叫方法。
item1.isbn()
:翻译为调用item1的isbn方法。
练习1.23—1.24(默认相同ISBN记录连续出现)
1.23:
//该程序正确输出数据需要输入2次停止符,不知道为什么。
int main() {
Sales_item total;
if (std::cin >> total) {
Sales_item trans;
int cnt = 1;
while (std::cin >> trans) {
if (total.isbn() == trans.isbn()) {
++cnt;
}
else {
std::cout << total.isbn() << " occurs " << cnt << " times." << std::endl;
total = trans;
cnt = 1;
}
}
std::cout << total.isbn() << " occurs " << cnt << " times." << std::endl;
}
return 0;
}
1.24:略
1.6 书店程序
//两次停止符
int main() {
Sales_item total;
if (std::cin >> total) {
Sales_item trans;
while (std::cin >> trans) {
if (total.isbn() == trans.isbn()) {
total+=trans;
}
else {
std::cout << total << std::endl;
total = trans;
}
}
std::cout << total << std::endl;
}
else {
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}
练习1.25
略;