C++ Primer 第一章 学习笔记及习题答案

C++ Primer 第一章 学习笔记及习题答案

  • 知识点
    • 函数定义
    • 输入输出
    • 注释
    • while和for控制流
      • while
      • for
    • 类(看完后续补充)
  • 练习题
    • 1.1节练习
    • 1.2节练习
    • 1.3节练习
    • 1.4节练习
      • 1.4.1节练习
      • 1.4.2节练习
      • 1.4.3节练习
      • 1.4.4节练习
    • 1.5节练习
      • 1.5.1节练习
      • 1.5.2节练习
    • 1.6节练习

知识点

函数定义

  • 一个程序包含一个或多个函数(有且只有一个main函数);一个函数定义包含四部分:返回类型、函数名、形参列表、函数体。如下代码为一个最简单的main函数,int为其返回类型,main为函数名,括号()括起来的为形参列表(可为空),花括号{}括起来的内容为函数体。
    int main()
    {
    	return 0;
    }
    

输入输出

  • C++使用标准库来提供IO机制,通常用到iostream库,需要在程序首部引入头文件#include
  • 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"<
  • 练习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 <
    运行结果:
    在这里插入图片描述
  • 练习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 <
  • 练习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<
    //输入两个整数,打印出这两个整数所指定的范围内的所有整数
    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头文件,编译并运行本节所给出的书店程序。
    (还未做)

你可能感兴趣的:(C++,PRIMER)