C++ Primer 第五版:第1 章

*****C++ Primer 第五版第1章学习笔记*****

*****实验代码在Red Hat 6.6或VS 2013中调试*****

*****文章内容依据当前知识撰写,存在认识的局限性*****

 

1.1 编写一个简单的C++程序

函数:依据我个人理解,C/C++的函数是一个能够完成一个功能的模块。

完整函数的组成:

①返回类型:不一定有返回值,故不一定有返回类型

②函数名:根据名字标识完成特定功能的模块,必须存在

③形参列表:可能没有参数传入,不一定存在

④函数体:一个完整的函数应该是有函数体的,里面包含要实现的功能。

下面为一个完整函数的例子:

int main()
{
	return 0;
}

  

1.1.1 编译、运行程序

 正如书上所说,先将精力集中于C++语言本身,而后再来学习IDE,此处略过。

 

1.1节练习

练习 1.2:改写程序,让它返回-1。返回值-1 通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main 返回的错误标识。

解答:在Red Hat下没办法成功编译,一直报这样的错误:

 

 

在VS 2013中可以编译成功,但是与return 0是一模一样的,没有观察到效果。

 

1.2 初识输入输出

输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。

C++标准输入输出定义了4个IO,分别为:CIN(标准输入)、COUT(标准输出)、CERR(标准错误)、CLOG,这四个是自动与当前程序打开关联的。

标准输入输出存在缓冲和非缓冲的概念,但印象中标准错误是非缓冲的,一旦出现错误,就立马输出错误。

 

练习 1.3:编写程序,在标准输出上打印Hello, World。

解答:

int main()
{
	std::cout << "Hello,World." << std::endl;
	return 0;
}

 

练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

 解答:

int main()
{
	int v1 = 0, v2 = 0;
	std::cout << "input two numbers:" << std::endl;
	std::cin >> v1 >> v2;
	std::cout << "the product of " << v1 << " and " << v2 << " is " << v1*v2 << std::endl;
	return 0;
}

 

练习 1.5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。

 解答:

#include<iostream>
int main()
{
	int v1 = 0, v2 = 0;
	std::cout << "input two numbers:" << std::endl;
	std::cin >> v1 >> v2;
	std::cout << "the product of ";
	std::cout << v1;
	std::cout << " and ";
	std::cout << v2;
	std::cout << " is ";
	std::cout << v1*v2;
	std::cout << std::endl;
	return 0;
}


练习 1.6:解释下面程序片段是否合法。

std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;

如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?

 解答:

std::cout << "The sum of " << v1;    //合法,假定v1=1,则输出The sum of 1
<< " and " << v2;	//不合法,因为没有标准输出IO,应修正为std::cout << " and " << v2;
<< " is " << v1 + v2 << std::endl;    ////不合法,原因同第二个语句,没有标准输出IO,应修正为 std::cout << " is " << v1 + v2 << std::endl;

  

1.3 注释简介

C++有2种注释风格,一种单行双斜杠注释,如 //这是一个注释

另外一直是多行界定符注释,如/*注释内容*/,这种注释不能相互嵌套,比如注释/* 第一层注释  /* 第二层注释   */ 第一层这是   */,这种情况下从第一个界定符到第三个界定符视为注释,最后一个*/则视为不能识别的代码。

 

1.3节练习

练习1.7:编译一个包含 不正确的嵌套注释的程序,观察编译器返回的错误信息。

int main()
{
	std::cout << "test of comments!";	/*  /* test */  */
	return 0;
}
VS 2013报错:

1>------ Build started: Project: return, Configuration: Debug Win32 ------
1>  return.cpp
1>c:\users\pluse\documents\visual studio 2013\projects\return\return\return.cpp(4): warning C4138: ‘*/‘ found outside of comment
1>c:\users\pluse\documents\visual studio 2013\projects\return\return\return.cpp(4): error C2059: syntax error : ‘/‘
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Red Hat报错:

1.7.cpp: In function ‘int main()’:
1.7.cpp:4: error: expected primary-expression before ‘/’ token
1.7.cpp:5: error: expected primary-expression before ‘return’
1.7.cpp:5: error: expected ‘;’ before ‘return’

  

练习1.8:指出下列哪些输出语句是合法的(如果有的话):

std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。

解答:

双引号里面包含的内容是直接输出的,不做注释用,因此前3个语法都是正确的,除了最后一个错误。应该修改为:

std::cout << /* "*/" /* /*";

 

1.4 控制流
1.4.1 While语句
While循环的格式为:
while(condition)  //注意括号
statement

 

练习 1.9:编写程序,使用while 循环将50 到100 的整数相加。
解答:
#include<iostream>
int main()
{
	int val = 50, sum = 0;
	while (val <= 100)
	{
		sum += val;
		val++;
	}
	std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;
	return 0;
}

 

练习 1.10:除了++运算符将运算对象的值增加1 之外,还有一个递减运算符实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10 到0 之间的整数。
解答:
#include<iostream>
int main()
{
	int val = 10;
	while (val >=0)
	{
		std::cout << val<<" ";
		val--;
	}
	std::cout << std::endl;
	return 0;
}
 
练习 1.11:编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
解答:
#include<iostream>  //目前还未学习其他的循环和判定,因此仅使用while来实现
int main()
{
	int a,b;
	std::cout << "input two numbers:";
	std::cin >> a >> b;
	while (a<=b)
	{
		std::cout << a << " ";
		a++;
	}
	while (a > b)
	{
		std::cout << b << " ";
		b++;
	}
	std::cout << std::endl;
	return 0;
}

 

1.4.2 for 语句
for语句的形式需要注意
for(INITIALIZATION;CONDITION;INCREMENT) //注意分号!
statement;

 

练习 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 节中的所有练习(第13 页)。
解答:

练习 1.14:对比for 循环和while 循环,两种形式的优缺点各是什么?
解答:
在我看来是2种不同形式的循环,没有太大差别,引用搜索出来的答案:
“在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况。在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。两种形式各有优点,但它们在功能上是等价的,可以相互转换。”

练习 1.15:编写程序,包含第16 页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。
解答:
 
1.4.3 读取数量不定的输入数据
在这一部分学习到while循环可以使用这种格式:while (std::cin >> value),这个在C语言中没有见过,但是有类似的。
 
练习 1.16:编写程序,从cin 读取一组数,输出其和。
#include<iostream>  //书上的程序并不能很好的工作,没有提供结束的方法
int main()
{
	int sum = 0, value = 0;
	std::cout << "enter q to quit:";  //输入字母q来退出,实际上,任何字母都能退出,这是因为value是一个int类型,输入的q属于char类型,
	while (std::cin >> value)	  //因此std::cin >> value会返回false从而结束循环
		sum += value;
	std::cout << "Sum is: " << sum << std::endl; 
	return 0;
}

1.4.4 if语句
if语句形式:
if(expression)	</span>//注意if后面的括号!!
statement;

 

练习1.17:如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
解答:
如果输入的所有值都是相等的,程序会输出输入的值连续出现了多少次。如果没有重复值,输出会输出之前的值连续出现了1次。
 
练习1.18:编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。
解答:
 
练习1.19:修改你为1.4.1节练习1.10(第13页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。
解答:
推测题目要求修改的程序应该是1.4.1节练习1.11,1.11的答案已能实现。
 
1.5类简介
终于来到“类”的学习了!
看到课本中类的介绍,我第一时间想到的就是刚刚学完的C里面的结构,类和结构很像,是自定义的一直类型,但是差别很大。再看类的介绍,又想起了C语言里面的ADT,ADT与类很像,但是也有很大的差别。第一,在非面向对象环境(如C与Fortran)中只能使用ADT,处理多个数据实例的时候,需要手动设置,要为ADT添加一些用来创建和删除实例的服务操作,还需要重新设计ADT的其他服务操作以能够支持多个实例。 类就不必了。
 
对类的初步理解是类是为C++定义的一种外置数据类型,一种数据类型确定的时候也就相应的确定了类型的一个属性集和一个操作集。比如,int类型的属性是它表示一个整数值,因此它拥有整数的属性。它允许的算术操作是改变一个int数的符号、两个int数相加、两个int数相减、两个int数相乘、两个int数相除,以及一个int数对另一个取模。在声明一个变量为int型时,您的意思是这些操作并且只有这些操作可以对其起作用。【这段话来自C Primer Plus】
 
练习 1.20:在网站http://www.informit.com/title/0321714113 上,第1 章的代码目录中包含了头文件Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
解答:
该小节的实验需要使用作者的类头文件,该书代码目录下载地址是:http://ptgmedia.pearsoncmg.com/images/9780321714114/downloads/GCC_4_7_0.zip,下载后解压后可以在里面找到一个“Version_test.h”头文件和1文件夹下“Sales_item.h”头文件,将这2个文件包含在当前程序源码文件的目录下,注意2个文件都需要,否则编译时会报:Cannot open include file: ‘Version_test.h‘: No such file or directory,导致无法完成编译。
此处采用输入重定向来完成,过程如下:
1.编译代码,生成可执行.exe文件
2.开始--运行--Cmd:将生成的.exe文件拖入命令行窗口中,再将准备好的一组书籍销售记录文本文件拖入命令行窗口中,然后回车执行。
形式如下图所示,具体路径依据个人目录环境,下图仅举例说明。
技术分享
 
练习 1.21:编写程序,读取两个ISBN 相同的Sales_item 对象,输出它们的和。
解答:
#include <iostream>
#include "Sales_item.h"
int main()
{
	Sales_item item1, item2;
	std::cin >> item1 >> item2;
	std::cout << item1 + item2 << std::endl; 
	return 0;
}
 
练习 1.22:编写程序,读取多个具有相同ISBN 的销售记录,输出所有记录的和。
解答:
答案同练习 1.20
 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。