4

程序设计,我们的第一个家庭作业是取 4 个整数值,将最高的 2 加在一起,减去最低的 2,然后将结果平方。最后,比较这两个值,看看它们是否相等。

例如,如果您要输入:20 10 60 40

你会得到

60 + 40 = 100

20 - 10 = 10 --> 10^2 = 100

所以,100 == 100

我编写了我的程序并测试了各种值,这些值都返回了正确的结果。我的教授告诉我,我的程序在所有 10 个测试输入中都失败了,他把他得到的结果发给了我。他得到的结果和我的不一样,我也不知道是怎么回事。我给他发了电子邮件,他告诉我我的一个 for 循环的边界不正确。他是对的,但我仍然得到正确的结果,所以......?

这是代码,任何帮助将不胜感激!

/*
 // Author: Jesse W
 // Assignment 1

 // Desciption:
 // This program inputs four integer numbers a, b, c and d and
 // determines if the sum of the two largest numbers is the same
 // as the squared difference of the two smallest numbers
 */

#include <stdio.h>

/* Complete the code for this program below */

int main()
{
    int a, b, c, d, f, k, swap;
    int array_size = 4;
    int return_val;
    int sum, difference, square;
    int small_1, small_2, large_1, large_2;
    int array[array_size];

    //Gather input
    //printf("Enter integer values for a, b, c and d.\n");
    return_val = scanf("%d %d %d %d", &a, &b, &c, &d);

    //Validate input
    if (return_val != 4)
    {
        printf("INVALID INPUT\n");
    }
    else
    {
        //Assign values to array
        array[0] = a;
        array[1] = b;
        array[2] = c;
        array[3] = d;

        //Sort array
        for (k = 0 ; k < ( array_size - 1 ); k++)
        {
            for (f = 0 ; f < array_size ; f++)
            {
                if (array[f] > array[f+1]) /* For decreasing order use < */
                {
                    swap       = array[f];
                    array[f]   = array[f+1];
                    array[f+1] = swap;
                }
            }
        }

        //Assign sorted values to new variables
        small_1 = array[0];
        small_2 = array[1];
        large_1 = array[2];
        large_2 = array[3];

        //Compute math
        sum = large_1 + large_2;
        difference = small_1 - small_2;
        square = difference * difference;

        //Compute logic
        if(sum == square)
        {
            printf("%d equals %d.\n", sum, square);
        }
        else
        {
            printf("%d does not equal %d.\n", sum, square);
        }

        return 0;
    }
}
4

5 回答 5

7

f范围高达array_size - 1

        for (f = 0 ; f < array_size ; f++)

但在这种情况下,您访问array[ f + 1 ]的是array[ array_size ]

                array[f]   = array[f+1];
                array[f+1] = swap;

这会导致未定义的行为。由于末尾的值被有效地排序为数组的一部分,因此程序是否工作取决于未初始化的值是否大于所有输入值。

于 2013-05-26T03:21:50.643 回答
4

for问题确实是您内部循环的上限;它会导致您读取数组的末尾,这会导致未定义的行为

生成的程序完全有可能在您的机器上打印正确的结果,但不能保证它可以在其他任何人的机器上运行。因此未定义。

于 2013-05-26T03:22:10.130 回答
2

您的内部循环将最终访问array[4],这会触发未定义的行为。一旦您触发未定义的行为,您就无法保证在那之后程序的任何内容。

但是,实际上可能发生的是,在您的计算机上,array[4] 恰好大于array[3]并且您将它们保持在相同的顺序。在教授的计算机上,您交换它们(可能会破坏其他一些变量),使其array[3]成为未定义的值。

于 2013-05-26T03:23:56.923 回答
1

由于您的程序的输出完全取决于 的值array[4],其中array是一个长度为 4 的数组,它的行为是完全不可预测的:从源头上,无法猜测内存中 location 的值会发生什么array + 4

(事实上​​,更糟糕的是——你的程序调用了未定义的行为,这意味着它可以做任何事情,包括给你的教授发送一封看起来像是来自你的粗俗和侮辱性的电子邮件。但是在实践中,它可能会打印其预期输出之一,实在无法猜测是哪一个。)

于 2013-05-26T03:22:53.083 回答
0

将您的排序循环更改为此

    for (k = 0 ; k < array_size ; k++)
    {
        for (f = 0 ; f < (array_size -1) ; f++)
        {
            if (array[f] > array[f+1]) /* For decreasing order use < */
            {
                swap       = array[f];
                array[f]   = array[f+1];
                array[f+1] = swap;
            }
        }
    }
于 2013-05-26T03:25:45.440 回答