lab2 2021.9.30
使用参考书为学校配套使用上机指导书
一、鸡兔同笼
本次实验题目都比较简单,鸡兔同笼问题只需用公式计算出鸡兔数量输出即可。要注意的是我们需要用if语句来检查输入是否符合要求,若不符合则输出错误。
在验收时,发现许多同学都漏写了检测条件中的一部分。在以后的编程中,要考虑好所有的条件情况再使用if进行分支判断。
#include <iostream>
using namespace std;
int main()
{
//定义所需变量
int head, leg, rabbit, chi;
cout << "please input the number of head and leg:" << endl;
cin >> head >> leg;
//运用公式计算
rabbit = (leg - 2 * head)/2;
chi = (4 * head - leg)/2;
//判断输入是否符合要求
if (x > 0 && y > 0 && leg%2 == 0)
cout << "rabbit:" << rabbit << ",chicken:" << chi << endl;
else
cout << "input error!" << endl;
}
二、判断共线
本题解决逻辑也较简单,利用三个点计算出两个向量,看两个向量的方向是否一样即可。
验收时注意到两个问题:
判断条件很多同学使用的是
(y3-y1)/(x3-x1) == (y2-y1)/(x2-x1)
,这样可能会导致一个问题就是如果有两个点的横坐标相等,那会出现除0错误。除0错误会在程序中引起错误(有些编译器可能会优化掉,但我们不能依赖于编译器的好坏),在编程中要额外注意除法运算,在使用除法运算前,需要对输入数据进行分析,保证不会出现除数为0的情况(可以用if判断,也可以对输入数据进行限制)。在本题中还有一种避免出现除0错误的方法,就是利用数学知识转化等式,将上等式变换为
(y3-y1)*(x2-x1) == (y2-y1)*(x3-x1)
,将乘法变为除法。第二个问题是如何判断两个double型变量相等。在lab1中,我们发现double型变量在计算机中存储存在精度损失,比如
1.8
就可能存为1.79...98
。同样1.8
也可能存为1.80...01
。这时,计算机怎么判断两个这两个1.8是相等的呢?在编译器中,可能会对程序进行优化,让double型变量可以直接用
==
来判断相等。但与除0错误一样,我们不能寄希望于编译器,而需要在程序逻辑上进行优化处理。一般的方法是,定义一个足够小的量,如果两个double型变量之差小于这个值,那我们认为这两个变量是相等的。在示例代码判断共线条件中就用了这种方法即if (abs((y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)) <= 1e-6)
。我们希望大家能在以后对double变量进行相等判断时都使用这种方法,避免可能出现的逻辑错误(一旦出现这样的错误,可能会花费很长时间来发现是这里出问题)。
#include <iostream>
using namespace std;
int main()
{
double x1, y1, x2, y2, x3, y3; //定义三个点
cout << "x1,y1:";
cin >> x1 >> y1;
cout << "x2,y2:";
cin >> x2 >> y2;
cout << "x3,y3:";
cin >> x3 >> y3;
if (abs((y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)) <= 1e-6) //判断共线
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}