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;
      
}

二、判断共线

本题解决逻辑也较简单,利用三个点计算出两个向量,看两个向量的方向是否一样即可。

验收时注意到两个问题:

  1. 判断条件很多同学使用的是(y3-y1)/(x3-x1) == (y2-y1)/(x2-x1),这样可能会导致一个问题就是如果有两个点的横坐标相等,那会出现除0错误。除0错误会在程序中引起错误(有些编译器可能会优化掉,但我们不能依赖于编译器的好坏),在编程中要额外注意除法运算,在使用除法运算前,需要对输入数据进行分析,保证不会出现除数为0的情况(可以用if判断,也可以对输入数据进行限制)。

    在本题中还有一种避免出现除0错误的方法,就是利用数学知识转化等式,将上等式变换为(y3-y1)*(x2-x1) == (y2-y1)*(x3-x1),将乘法变为除法。

  2. 第二个问题是如何判断两个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;
}