2012-10-08 82 views
1

因此,在我的程序中,我写了一个函数来查找一组数字的范围,但不幸的是它似乎没有正常工作。而不是给我的最小数和最大数之间的差异,它给我这个:查找C中的范围

(3) Range 
(4) Restart/Exit 
3 
7900455959466841600000000000000000.0 

我看了所有在互联网上,而我发现一对夫妇的如何做到这一点有用的例子,他们似乎没有解决这个问题。这是我的功能,如果有人需要查看整个代码,请告诉我。

float range(float numbers[], int amount) 
{ 
    int i; 
    float diff=0; 
    for (i=1;i<=amount;i++){ 

     diff=numbers[amount]-numbers[1]; 
    } 

     printf("%.1f",diff); 

     return diff; 
    } 

我用尽了一切我能想到的,有什么建议

+3

C数组是零索引的。假设您使用'amount'的普通语义来表示数字中元素的数量,那么您的代码会读取数组的末尾。除此之外,为什么还要打扰循环呢?您在每次循环中覆盖'diff'。 –

+0

有没有更好的方法去解决这个没有循环? – Jcmoney1010

+0

你似乎认为数字是按排序的:最大的指数会保持最大的数字等等(还要注意卡尔所说的)而应该用循环来'找到'最大的&&最小的数字,这两者都需要只是一个临时变量。 –

回答

1

你想是这样的:

float range(float numbers[], int amount) 
{ 
    int i; 
    float min, max, diff; 
    min = numbers[0]; 
    max = numbers[0]; 
    for (i=1; i < amount; i++) 
    { 
     if (numbers[i] < min) min = numbers[i]; 
     if (max < numbers[i]) max = numbers[i]; 
    } 

    diff = max - min; 

    printf("%.1f",diff); 

    return diff; 
} 
+0

修复它。我不确定哪里出了问题,因为在这个程序的早期版本中,我实际上工作过。调整了一些东西之后,它似乎变得疯狂了。我很感谢你的服务先生。你是一个绅士和学者。 – Jcmoney1010

+0

欢迎来到StackOverflow。请点击答案旁边的勾号,您认为这是对您问题的正确答案。 –

1

如果阵列是有序的,问题就简化为:

/* assuming ammount point to the last position of the array */ 
return numbers[ammount] - numbers[0] 

如果数组没有排序,则必须构建一个循环以获得最大和最小ele返回数组的差异。

0

你量变量命名为更好highestIndex

为了解决你的代码,我可以看到两件事情你可以做:

1)。了解你当前的代码在做什么。尝试“桌面检查”。在纸上(或者在你的脑海里)发明一些这个功能的输入。

numbers = [ 2, 17, 4, 10]; amount = 3; 

i = 1, is 1 <=3 ? yes, OK go into the body 

diff = numbers[3] - numbers[1] which is 10 - 17, so diff is now -7 

increment i, i = 2, is 2 <=3 ? yes, OK go into the body 

diff = numbers[3] - numbers[2] which is 10 - 4, so diff is now 6 

increment i, i = 3, is 3 <=3 ? yes, OK go into the body 

diff = numbers[3] - numbers[2] which is 10 - 10, so diff is now 0 

increment i, i = 4, is 3 <=3 ? no. so leave the loop 

print diff ... hmmm it's 0 at the moment 

这里的技巧是挑选一个小例子集,看看处理是否有意义。很明显,除非输入数组已经排序,否则无法找到范围,但在这种情况下,您需要循环,只需要减去数字[highestIndex]和数字[0]。 2)。现在你需要做什么?范围是列表中最大的数字和最小的数字之间的差异。因此,您的代码需要查看列表并找到最大和最小的数字。开始尝试这样

INITIALISE候选值,注意,这是正确的,如果你的列表只有一个成员,那么最大的和最小的是相同的,在列表中唯一的价值

float biggest = numbers[0]; 
    float smallest = numbers[0]; 

然后通过循环看看其他数字是否大于或小于当前的最大值和最小值。

for (int i = 1; i <= highestIndex; i++) { 

     is numbers[i] bigger than biggest 
       set new biggest value 

     do the same sort of thing for smallest 

    } 

    print biggest - smallest 

然后额外的信贷看,如果所有的数字为负,而会发生什么特殊情况,了解哪些值的浮动可容纳会发生什么。