2013-09-23 244 views
-3

在数组中查找最大值和最小值的情况。我们初始化max =0max=temp[0]; 但是在最小值的情况下,我们不需要初始化min =0min=temp[0] ...为什么?C查找最大值和最小值?

+0

初始化'min = 0'可能不是很有帮助... –

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ – SJuan76

回答

1

首先,你不应该在任何情况下初始化max0(例如,寻找最大的数组,如果你初始化max0包含所有负值时,结果总是0)。由于为了找到最大值(和最小值),需要将变量max(或min)与其他值进行比较,无论如何您都需要初始化为temp[0],以避免将数组元素与未初始化的变量进行比较。

我发现了另一个评论你的代码的一部分:

#include<stdio.h> 

int main() { 
    int arr[3]; 
    int i,max,min; max=min=0; 

    printf("Enter the value in Array \n"); 

    for(i=1;i<=3;i++) { 
    scanf("%d",&arr[i]); 
    } 

    printf("\n Value of array \n"); 
    for(i=1;i<=3;i++) { printf("%d \n",arr[i]); } 

    printf("\n Finding Maximum and minimum value \n"); 

    for(i=1;i<=3;i++) { 
    if(arr[i]>max) max=arr[i]; 
    if(arr[i]<min) min=arr[i]; 
    } 
    printf("Max = %d \n Min = %d \n ",max,min); 
    getch(); 
} 

有不工作几件事情:

for(i=1;i<=3;i++) 

在C,索引从0开始的,所以有效数组元素是arr[0]arr[1]arr[2],使得对于回路应

for(i = 0; i < 3; i++) 

好了,现在想象你在你的数组元素10,5和7

你最小值设置为0:

max=min=0; 

现在你迭代这个循环:

for(i=0;i<3;i++) { 
    //... 
    if(arr[i]<min) min=arr[i]; 
    } 

10 < 0?不,这不对。

5 < 0?不,这不对。

7 < 0?不,这不对。

所以你看,min永远不会改变。

为了避免这种情况,只需将其设置为第一要素后读取数组:

for(i= 0;i < 3;i++) { 
     scanf("%d",&arr[i]); 
    } 
    min = max = arr[0]; 

现在,让我们重申我们的循环:

for(i=0;i<3;i++) { 
    //... 
    if(arr[i]<min) min=arr[i]; 
    } 

10 < 10?不,这不对。

5 < 10?是的!将分钟设置为5

7 < 5?不,这不对。

现在min是你在与最大的现有代码有5

同样的问题。想象一下,你输入-4,-55-20元素 - max将始终保持0

+0

“我做到了。最大= 0和最大[0]都工作正常.. 但我做同样的事情,它不工作.... –

+0

@Manojrawat然后请告诉我们你是如何做到了 - 包括在问题中的代码示例。 –

+0

@Manojrawat好的,在评论中找到了代码,请参阅更新后的帖子 –

1

在访问它们之前,您总是需要在C中初始化变量;它的未定义行为不是。要做的最好的事情是,检查数组长度不为零,是将min/max初始化为第零个元素。然后从第一个元素开始循环。

+4

*访问*未初始化变量的值只是未定义行为 –

+0

@Ol Charlesworth;好点 - +1 - 我已经修改我的回答。 – Bathsheba

1

max = temp[0]作为参考点。您将开始比较每个元素,如果有任何元素大于此值,max值将更新为该值。类似min = temp[0]也是有效的,但现在算法将被改变,并且如果有人比这更小,则需要比较每个元素,如果是,则min将被更新为那个。

+0

#include void main() { int arr [3]; int i,max,min; max = min = 0; clrscr(); printf(“在Array中输入值\ n”); (i = 1; i <= 3; i ++) scanf(“%d”,&arr [i])的 ; } printf(“\ n数组值\ n”);对于(i = 1; i <= 3; i ++) { printf(“%d \ n”,arr [i]); } printf(“\ n查找最大值和最小值\ n”); (i = 1; i <= 3; i ++) if(arr [i]> max) max = arr [i]; if(arr [i]

+0

@Manojrawat问题列表(1)没有什么像标准中的'void main'它是'int main '。 (2)你正在访问出界。一个由三个元素组成的数组只会在第一个和第二个位置处有值。所有循环都从1到3意味着一个[3]实际上是第四个位置。 (3)用数组的第一个元素而不是零初始化'max'和'min'。应该有一些小于零的值来处理你的if条件。 –