C++ Primer 第一章答案

基于VS2013的代码练习

练习1.1

查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。


练习1.2

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

在这里插入图片描述


练习1.3

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

#include <iostream>

int main(){

	std::cout << "Hello, World!" << endl;
	return 0;
}


练习1.4

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

#include <iostream>
using namespace std;

int main(){

	std::cout << "Enter two numbers:" << endl;
	int v1 = 0, v2 = 0;
	cin >> v1 >> v2;
	cout << "the sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl;
	system("pause");
	return 0;
}

练习1.5

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

#include <iostream>
using namespace std;

int main(){

	std::cout << "Enter two numbers:" << endl;
	int v1 = 0, v2 = 0;
	cin >> v1 >> v2;
	cout << "The sum of ";
	cout << v1;
	cout << " and ";
	cout << v2;
	cout << " is ";
	cout << v1 + v2;
	cout << endl;
	system("pause");
	return 0;
}

练习1.6

解释下面程序片段是否合法。

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

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

不合理,报错如下:

  • 错误 1 error C2143: 语法错误 : 缺少“;”(在“<<”的前面)

修正:移除掉多余的分号。

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

练习1.7

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

/*
*   注释在这里嵌套
*	/* 这里的嵌套是错的 */
*
*/

int main()
{
	return 0;
}

由于注释错误,影响了之后的一系列代码,VS2013报错如下:

在这里插入图片描述


练习1.8

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

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

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

第三行编译出错,C++中的注释界定符,从/*开始到*/结束第三行出现了/* "*/ | " */可以分为|前面部分以及后面一部分,前面一部分是对"的注释,而后面一部分则是少了一个引号的字符串,因此改正方法是增加一个引号。

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

输出:

/**/ */ /*

练习1.9

编写程序,使用while循环将50到100的整数相加。

#include <iostream>
using namespace std;

int main(){
	int sum = 0, val = 1;
	while (val<=50){
		sum += val;
		++val;
	}
	cout << " Sum of 1 to 50 inclusive is " << sum << std::endl;
	return 0;
}

练习1.10

除了++运算符将运算对象的值增加1之外,还有一个递减运算符(–)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。

#include <iostream>
using namespace std;

int main(){
	int val1 = 0, val2 = 10;
	while (val1<=10){
		val1++;
		cout << val2 << endl;
		val2--;
	}	
	return 0;
}

练习1.11

编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。

#include <iostream>
using namespace std;

// 采用函数编程的思想
void print_range(int val1, int val2){
	int max = 0 , min = 0;
	if (val1>val2){
		max = val1;
		min = val2;
	}else{
		max = val2;
		min = val1;
	}

	int temp_val = max;

	while (min <= temp_val){
		min++;
		cout << max << endl;
		max--;
	}
}


int main(){
	int val1 = 0, val2 = 0;
	cout << "Please input two numbers!" << endl;
	std::cin >> val1 >> val2;
	print_range(val1, val2);
	return 0;
}

练习1.12

下面的for循环完成了什么功能?sum的终值是多少?

int sum = 0;
for (int i = -100; i < 100; ++i)
	sum += i;

从 -100 加到 100 ,sum 的终值为 0。


练习1.13

使用for循环重做1.4.1节中的所有练习(第11页)。

  • 练习1.9
#include <iostream>
using namespace std;

int main(){
	int sum = 0, val = 1;
	for (int i = 0; i <= 50; i++){
		sum += i;		
	}
	cout << " Sum of 1 to 50 inclusive is " << sum << std::endl;
	return 0;
}
  • 练习1.10
#include <iostream>
using namespace std;

int main(){
	int val1 = 0, val2 = 10;
	for(int i = 10; i >= 0; i--){		
		cout << i << endl;		
	}
	return 0;
}
  • 练习1.11
#include <iostream>
using namespace std;

// 采用函数编程的思想
void print_range(int val1, int val2){
	int max = 0, min = 0;
	if (val1>val2){
		max = val1;
		min = val2;
	}
	else{
		max = val2;
		min = val1;
	}

	int temp_val = max;

	for (int i = max; i >= min; i--)
	{
		cout << i << endl;
	}
}


int main(){
	int val1 = 0, val2 = 0;
	cout << "Please input two numbers!" << endl;
	std::cin >> val1 >> val2;
	print_range(val1, val2);
	return 0;
}

练习1.14

对比for循环和while循环,两种形式的优缺点各是什么?

在Stack Overflow上面有与这个相似的问题


练习1.15

编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。

常见的错误有语法错误、类型错误、声明错误,这些都是编译器可以检查出的错误。


练习1.16

编写程序,从cin读取一组数,输出其和。

#include <iostream>

int main()
{
	int sum = 0;
	for (int value = 0; std::cin >> value;)
		sum += value;
	std::cout << sum << std::endl;
	return 0;
}

练习1.17

如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

效果如下所示:

在这里插入图片描述

练习1.18

编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

代码如下:

#include <iostream>
using namespace std;

int main()
{
	int currVal = 0, val = 0;
	if (cin >> currVal)
	{
		int cnt = 1;
		while (cin >> val) 
		{
			if (val == currVal)
				++cnt;
			else{
				cout << currVal << " occurs " << cnt << " items " << endl;
				currVal = val;
				cnt = 1;
			}
		}
		cout << currVal << " occurs " << cnt << " items " << endl;
	}

	return 0;
}

练习1.19

修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。

练习1.11本身就对输入数据的大小进行了判断


练习1.20

在网站http://www.informit.com/title/032174113上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

#include <iostream>
#include "Sales_item.h"

using std::cin;
using std::cout;
using std::endl;

int main()
{
	for (Sales_item item; cin >> item; cout << item << endl);  //注意 这里不写分号;不会报错,但是会进入一个空白代码快循环,达不到实际想要的效果。
	return 0;
}

练习1.22

编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。

#include <iostream>
#include "Sales_item.h"

using std::cin;
using std::cout;
using std::endl;

int main()
{
	for (Sales_item item1, item2; cin >> item1 >> item2 ; cout << item1 + item2  << endl);
	return 0;
}

练习1.23

编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。

#include <iostream>
#include "Sales_item.h"

using std::cin;
using std::cout;
using std::endl;

int main()
{
	Sales_item currItem, valItem;
	if (cin>>currItem)
	{
		int count = 1;
		while (cin >> valItem)
		{
			if (currItem.isbn() == valItem.isbn())
			{
				++count;
			}
			else
			{
				cout << currItem << " occurs " << count << " times " << endl;
				currItem = valItem;
				count = 1;
			}
		}
		cout << currItem << " occurs " << count << " times " << endl;
	}
	return 0;
}

练习1.24

输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

  • data/books.txt是输入数据文件,在网站http://www.informit.com/title/032174113上下载
    在这里插入图片描述

练习1.25

接祖Sales_item.h头文件,编译并且运行1.6节给出的书店程序。

#include <iostream>
#include "Sales_item.h"

using std::cin;
using std::cout;
using std::endl;

int main()
{
	Sales_item total;
	if (cin >> total)
	{
		int count = 1;
		Sales_item trans;
		while (cin >> trans)
		{
			if (total.isbn() == trans.isbn())
			{
				total += trans;
			}
			else
			{
				cout << total << endl;
				total= trans;				
			}
		}
		cout << total << endl;
	}
	return 0;
}

效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值