C++ Primer(第5版) 课后答案 第一章

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

头文件后缀一般是.h或.hpp等,源文件后缀一般是.c或.cpp等。

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

 ​​​

 在Windows操作系统下main函数没有报告运行失败,因此返回0或-1在运行效果没有什么区别。

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

#include<iostream>
int main()
{
	std::cout << "Hello , World。" << std::endl;
	return 0;
}

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

#include<iostream>
int main()
{
	std::cout << "请输入两个数" << std::endl;
	int v1 = 0, v2 = 0;
	std::cin >> v1 >> v2;
	std::cout << v1 << "和" << v2 << "的乘积为" << v1 * v2 << std::endl;
	return 0;
}

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

#include<iostream>
int main()
{
	std::cout << "请输入两个数" << std::endl;
	int v1 = 0, v2 = 0;
	std::cin >> v1 >> v2;
	std::cout << v1;
	std::cout << "和";
	std::cout << v2;
	std::cout << "的乘积为";
	std::cout << v1 * v2 << std::endl;

	return 0;
}

1.6:解释下面程序片段是否合法。如果程序是合法的,它将输出什么?如果程序不合法,原因何在?应该如何修正?

#include<iostream>
int main()
{
//错误代码
    int v1 = 10, v2 = 20;
    std::cout << "The sum of" << v1;
              << "and" << v2;
              << "is" << v1 + v2 << std::endl;
 //不合法
 //第5行和第6行代码最后分别有一个分号,表示语句结束。
 //而第6行和第7行<<操作符为二元操作符,两行第一个<<操作符没有左操作数,因此不合法

 //改正代码
    std::cout << "The sum of" << v1
              << "and" << v2
              << "is" << v1 + v2 << std::endl;
    return 0;
}

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

int main()
{
	/*
	* 注释对/* */不能嵌套/
	*"不能嵌套"几个字会被认为是源码;
	*像剩余程序一样处理
	*/
	return 0;
}

1.8:指出下列哪些输出语句是合法的(如果有的话):预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案,改正每个编译错误。

#include<iostream>
int main()
{
	std::cout << "/*";
	std::cout << "*/";
	//这两行语句合法,分别打印/*和*/

    //错误代码
	std::cout<< /* "*/" */;
	//左引号被注释界定符限定,缺少右引号

	//改正代码
	std::cout << /* "*/" */";

	std::cout <</* "*/" /* "/*" */;
	//79行语句合法,打印/*

    return 0;
}

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

#include<iostream>
int main()
{
	int sum = 0, val = 50;
	//当val的值在50-100之间,循环就会执行
	while (val <= 100)
	{
		sum += val;
		++val;
	}
	std::cout << "50-100的整数和为" << sum << std::endl;
	return 0;
}

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

#include<iostream>
int main()
{
	int val = 10;
	//当val的值大于等于0时,循环执行
	while (val >= 0)
	{
		std::cout << val << std::endl;
		--val;			//每次循环val的值减1
	}
	return 0;
}

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

#include<iostream>
int main()
{
	int v1 = 0, v2 = 0;
	std::cout << "请输入两个值:" << std::endl;
	std::cin >> v1 >> v2;
	//当v1值大于等于v2时,循环执行
	while (v1 >= v2)
	{
		std::cout << v1 << std::endl;
		--v1;   //每次循环v1减1
	}
	return 0;
}

此代码只能打印当v1大于等于v2时,所指定范围的数字,若v1小于v2则不能。

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

#include<iostream>
int main()
{
	int sum = 0;
	for (int i = -100; i <= 100; i++)
		sum += i;
	std::cout << sum << std::endl;
	return 0;
	//完成了从-100到100之间的数相加和,sum为0
}

1.13:使用for循环重做1.4.1中所有练习。

#include<iostream>
int main()
{
	int sum = 0, val = 50;
	//当val的值在50-100之间,循环就会执行
	for(val=50;val<=100;++val)
	{
		sum += val;
	}
	std::cout << "50-100的整数和为" << sum << std::endl;
	return 0;
}
#include<iostream>
int main()
{
	int val = 10;
	//当val的值大于等于0时,循环执行
    for(val=10;val>=0;--val)
	{
		std::cout << val << std::endl;
	}
	return 0;
}
#include<iostream>
int main()
{
	int v1 = 0, v2 = 0;
	std::cout << "请输入两个值:" << std::endl;
	//当v1值大于等于v2时,循环执行
    for(std::cin>>v1>>v2 ; v1>=v2; --v1)
	{
		std::cout << v1 << std::endl;
	}
	return 0;
}
//此做法无法计算第一个数比第二个数小的情况

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

for循环形式上比较简洁,变量初始化,检测条件,修改变量都在语句头部,适用于循环次数已知的情况。

while循环形式上不如for简洁,适用于循环次数不易预知的情况。

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

#include<iostream>
int main()
{
	int sum = 0, val = 0;
	//当读取数据遇到文件尾,计算所有数值之和
	//输入文件结束符CTRL+Z再按ENTER
	while (std::cin >> val)
	{
		sum += val;
	}
	std::cout << "sum的值为" << sum << std::endl;
	return 0;
}

在Windows系统中,输入文件结束符的方法是Ctrl+Z,然后按Enter或Return。

在UNIX系统中,文件结束符输入是Ctrl+D。

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

#include<iostream>
int main()
{
	//currVal是正在统计的数,val是读入的新值
	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;
			}
		}//while循环在这里结束
	std::cout << currVal << "occurs" << cnt << "times" << std::endl;
	}//最外层的if语句在这里结束
return 0;
}

//输入

1 1 1 1 1

//输出 

1occurs5times

//输入

1 2 3 4 5

//输出 

1occurs1times
2occurs1times
3occurs1times
4occurs1times
5occurs1times

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

#include<iostream>
int main()
{
	int v1 = 0, v2 = 0;
	std::cout << "请输入两个值:" << std::endl;
	std::cin >> v1 >> v2;
	if (v1 > v2)//由大到小打印
	{
		while (v1 >= v2)
		{
			std::cout << v1 << " ";
			v1--;
		}
	}
	else //由小到大打印
		while (v1 <= v2) 
		{
			std::cout << v1 << " ";
			v1++;
		}
	std::cout << std::endl;
	return 0;
}

1.20-1.25需要拷贝网站中Sales_item.h头文件

1.20:将头文件拷贝到工作目录中,用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

#include<iostream>
#include"Sales_item.h"
int main()
{
	Sales_item book;
	while (std::cin >> book)
	{
		std::cout << book << std::endl;
	}
	return 0;
}

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的销售记录,输出所有记录的和。

#include<iostream>
#include"Sales_item.h"
int main()
{
	Sales_item item,sum;
	//先输入一条销售记录作为sum
	std::cin >> sum;
	//输入剩余销售记录
	while (std::cin >> item)
	{
		sum += item;
	}
	std::cout << sum << std::endl;
	return 0;
}

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

#include<iostream>
#include"Sales_item.h"
int main()
{
	Sales_item item1,item2;
	//读取第一个记录
	if (std::cin >> item1)
	{
		int cnt = 1;
		//读取剩余记录
		while (std::cin >> item2)
		{
			if (item1.isbn() == item2.isbn())
			{
				++cnt;
			}
			else
			{
				std::cout << item1.isbn() << "有 " << cnt << " 条销售记录" << std::endl;
				item1 = item2;
				cnt = 1;
			}
		}
		std::cout << item1.isbn() << "有 " << cnt << " 条销售记录" << std::endl;
	}
	return 0;
}

1.25:借助网站上的Sales_item.h头文件,编译并运行本节给出的书店程序。

#include<iostream>
#include"Sales_item.h"
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;  //total现在表示下一本书的销售额
			}
		}
		std::cout << total << std::endl;
	}
	else
	{
		//没有输入
		std::cerr << "No data!" << std::endl;
		return -1;
	}
	return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值