知识点
函数定义
-
一个程序包含一个或多个函数(有且只有一个main函数);一个函数定义包含四部分:返回类型、函数名、形参列表、函数体。如下代码为一个最简单的main函数,int为其返回类型,main为函数名,括号()括起来的为形参列表(可为空),花括号{}括起来的内容为函数体。
int main() { return 0; }
输入输出
- C++使用标准库来提供IO机制,通常用到iostream库,需要在程序首部引入头文件
#include <iostream>
, - endl为操纵符,效果:结束当行,将与设备关联的缓冲区中内容刷到设备中,保证目前程序所产生的输出都真正写入到输出流中。
Tips:需要通过命名空间才可使用标准库中的一个名字,即必须显式说明我们想使用来自命名空间std中的名字。有两种实现方式:
1 使用作用域运算符:::如std::cin、std::cout;
2 在程序首部声明命名空间using namespace std;
,使用后即可不用作用域运算符进行前缀,直接写cin、cout即可。
注释
- 单行注释://
- 多行注释:/ /
Tips:多行注释不可嵌套,在调试时尽量使用单行注释注释整个代码段的每一行。
VS 2017中多行注释方法:1 选定代码段;2 按下CTRL+K;3 按下CTRL+C。
取消多行注释方法:1 选定代码段;2 按下CTRL+K;3 按下CTRL+U。
while和for控制流
-
while
while语句形式:
while (condition) statement
while语句持续交替检测condition和执行statement,直到condition为假为止。
while可用来读取数量不定的输入数据,代码如下:int val=0; while(std::cin>>val) //一直输入,直到遇到无效输入就退出循环
-
for
for(init-statement;condition;expression) example:for(int i=0;i<10;++i)
例子中总体执行过程如下:
1 创建变量i,初始化为0;
2 检测i是否小于10,如果满足条件,则进入for循环体,如果不满足条件,则推出循环体;
3 将i的值加1;
4 重复步骤2,若满足条件这继续执行剩余步骤直到步骤2不满足条件退出循环。
类(看完后续补充)
· C++中,通过一个类来定义自己的数据结构。
· 类的作者定义了类对象可以执行的所有动作。
练习题
1.1节练习
- 练习1.1:查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第二页的main程序。
运行结果如下: - 练习1.2:改写程序,让他返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。
运行结果如下:
总结:在大多数系统中,main的返回值被用来指示状态。返回0表明成功,非0的返回值通常用来指出错误类型。
1.2节练习
-
练习1.3:编写程序,在标准输出上打印Hello,World。
int main() { std::cout << "Hello, world!" << endl; return 0; }
-
练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。
int main() { int a, b; std::cout << "输入两个整数:" ; std::cin >> a >> b; int sum = a * b; std::cout << "它们的乘积为:"<< sum << std::endl; return 0; }
-
练习1.5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。
std::cout<<"abc"<<"xyz"<<std::endl; 等价于如下代码段: std::cout<<"abc"; std::cout<<"xyz"; std::cout<<endl;
-
练习1.6:解释下面程序片段是否合法。
std::cout << "The sum of "<< v1; << " and " << v2; << " is " << v1 + v2 << std::endl;
不合法,输出运算符<< 必须接受两个运算对象 ,左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。题中第2/3行代码的输出运算符左侧为空,故不合法。
1.3节练习
-
练习1.7:编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
int main() { std::cout <</* /* */*/<<endl; return 0; }
运行结果:
-
练习1.8:指出下列哪些输出语句是合法的(如果有的话):
std::cout << " /* "; std::cout << " */ "; std::cout << /* "*/" */; std::cout << /* "*/" /* "/*" */;
1、2合法,3、4不合法。
3、4发生了多行注释的嵌套使用。
1.4节练习
1.4.1节练习
-
练习1.9:编写程序,使用while循环将50到100的整数相加。
int main() { int i = 50, sum = 0; while (i <= 100) { sum += i; ++i; } std::cout << "50到100依次相加的值为:" << sum << endl; return 0; }
-
练习1.10:除了++运算符将运算对象的值增加1之外,还有一个递减运算符(--)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。
int main() { int i = 10; std::cout << "从10到0依次为:"; while (i >= 0) { std::cout <<i <<" "; --i; } return 0;
-
练习1.11:编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
int main() { int a, b; std::cout << "请输入两个数:"; std::cin >> a >> b; std::cout << "这两个整数范围内的数为:"; if (a <= b) { while (a <= b) { std::cout << a << " "; ++a; } } else { while (a >= b) { std::cout << a << " "; --a; } } return 0; }
1.4.2节练习
-
练习1.12:下面的for循环完成了什么功能?sum的终值是多少?
int sum=0; for(int i=-100; i<=100; ++i) sum += i;
for循环实现了从-100到100的累加功能,sum的终值为0。
-
练习1.13:使用for循环重做1.4.1节中的所有练习。
//累加50到100的整数 int main() { int sum = 0; for (int i = 50; i <= 100; i++) sum += i; std::cout <<"50到100的累加和为:"<< sum; return 0; }
//递减打印10到0之间整数 int main() { std::cout << "递减输出依次为:"; for (int i = 10; i >= 0; --i) std::cout<<i << " "; return 0; }
//输入两个整数,打印出这两个整数所指定的范围内的所有整数 int main() { std::cout << "请输入两个整数:" ; int a=0, b=0; std::cin >> a >> b; std::cout << "这两个整数范围内的数为:"; if (a <=b) { for (int i = a; i <= b; ++i) std::cout << i << " "; } else { for (int i = a; i >= b; --i) std::cout << i << " "; } return 0; }
-
练习1.14:对比for循环和while循环,两种形式的优缺点各是什么?
while循环 for循环 需求未明确循环次数 需求明确循环次数 使用循环后还想访问循环语句去控制该变量 局部变量在栈内存中存在,当for循环结束变量会及时释放,不浪费空间
- 练习1.15:编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。
自己看书,略。
1.4.3节练习
-
练习1.16:编写程序,从cin读取一组数,输出其和。
int main() { int sum = 0, val = 0; std::cout << "请输入一组数:"; while (std::cin >> val) sum += val; std::cout <<"输入的数和为:"<< sum << endl; return 0; }
1.4.4节练习
-
1.17-1.18代码:
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" << endl; currVal = val; cnt = 1; } } std::cout << currVal << " occurs " << cnt << " times" << endl; } return 0; }
- 练习1.17:如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
所有值都相等的情况,程序输出该值出现次数;没有重复值的情况,输出每一个值及各出现一次。
- 练习1.18:编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。
所有值相等,输出结果:
42 42 42 42 endl
42 occurs 4 times
没有重复值,输出结果:
```
40 41 42 43 endl
40 occurs 1 times
41 occurs 1 times
42 occurs 1 times
43 occurs 1 times
```
- 练习1.19:修改你为1.4.1节练习1.10所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。
之前代码已经考虑过这个情况,见上。
1.5节练习
1.5.1节练习
- 练习1.20:在网站http://www.informit.com/title/0321714113上,第1章的代码目录中包含了头文件Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
//需先下载头文件,并在项目中导入
int main()
{
Sales_item book;
cout << "请输入一条书籍销售记录:";
std::cin >> book;
std::cout <<"记录如下:"<< book << endl;
return 0;
}
- 练习1.21:编写程序,读取两个ISBN相同的Sales_item对象,输出他们的和。
int main()
{
Sales_item item1, item2;
cout << "请输入两条ISBN相同的记录:";
std::cin >> item1 >> item2;
std::cout <<"这两条记录的和为:"<< item1 + item2 << endl;
return 0;
}
- 练习1.22:编写程序,读取多个具有相同ISBN的销售记录,输出所有记录的和。
//要先输入一个值,再循环输入
int main()
{
Sales_item item, sum;
if (std::cin >> sum) {
while (std::cin >> item)
sum += item;
}
std::cout << sum << endl;
return 0;
}
1.5.2节练习
- 练习1.23:编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。
//与练习1.17-1.18类似,要先输入一个值,再循环输入
int main()
{
Sales_item currVal, val;
int num = 1;
std::cout << "请输入多条相同ISBN的销售记录:";
if (cin >> val) {
while (cin >> currVal) {
if (val.isbn() == currVal.isbn()) {
++num;
}
else {
cout << val.isbn() << "共有" << num << "条销售记录" << endl;
num = 1;
val = currVal;
}
}
cout << val.isbn() << "共有" << num << "条销售记录" << endl;
}
return 0;
}
- 练习1.24:输入表示多个ISBN的多条销售记录来测试上一个程序,每个ISBN的记录应该聚在一起。
用练习1.23代码测试即可。
1.6节练习
- 练习1.25:借助网站上的Sales_item.h头文件,编译并运行本节所给出的书店程序。
(还未做)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。