如何在c中找到数组中最大和最小的数字

时间:2010-09-26 07:15:42

标签: c arrays max min

我必须找到一种方法来显示数组中的最大值和最小值,数组的大小是100并且不会超过该值,并且不需要输入验证。程序将一直询问输入,直到遇到0并且它也将被添加到数组中。

除了如何保持跟踪哪个是最大和最小值之外,我已经弄明白了。如果有人可以修改我的代码或给我看,我会很感激。我遇到的另一个问题是当输入等于0时,循环终止并在while循环中进行最大/最小计算。

/*
 ============================================================================
 Name        : test.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#define n  100
int main(void){


 int numbers[n];
 int i = 1;
 int j;
        int input;
 int maxvalue;
 int minvalue;

   printf("Enter the next array element>");

input = scanf("%d", &numbers[100]);



while (input != 0){

  numbers[i] = input;
  i++;
  printf("Enter the next array element, while loop>");
  input = scanf("%d", &numbers[n]);
  if (input == 0){
printf("Enter the next array element, if loop");
   numbers[i] = 0;

   for (j =2;j <= i; j++){
    minvalue = numbers[1];

    j++;
    if (numbers[j] > minvalue){
     maxvalue = numbers[j] ;
    }
    else{
     minvalue = numbers[j] ;
    }

   }


  }
 }


printf("%f\t", maxvalue);

printf("%f\n", minvalue); 
 }

编辑:我把你的所有建议全部删掉并编辑了我的代码。这是我的代码。但是,它的输出并不是我所期待的。

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void){


    int numbers[N];
    int i = 0;
    int j;
        int input;
    int maxvalue;
    int minvalue;

            printf("Enter the next array element>");

scanf("%d", &input);



while (input != 0){

        numbers[i] = input;
        i++;

        if (input == 0){
                   i++;
            numbers[i] = 0;
                        minvalue = numbers[0];
                        maxvalue = numbers[0];
                        for (j=0;j<=i-1;j++){

                            if (minvalue >= numbers[j]){
                                minvalue = numbers[j];
                            }else if (maxvalue <= numbers[j]){
                                maxvalue = numbers[j];
                            }


                        }

/* min = value of first array element
max = value of first array element

begin loop for each array element, index = 0 to (n-1)

--- if array element value is less than min, set min to this value
--- if array element value is more than max, set max to this value

increment index and repeat loop til last index is completed

average = sum / number of elements (n).
max and min will hold their correct values.*/




        }
                printf("Enter the next array element, while loop>");
    scanf("%d", &input);
    }


printf("%d\t", maxvalue);
printf("%d", minvalue);
    }

这是输出,我收到了!有人可以帮我解决这个问题。

Enter the next array element>1
Enter the next array element, while loop>2
Enter the next array element, while loop>3
Enter the next array element, while loop>0
12190144 l6Press [Enter] to close the terminal

最终编辑:我自己解决了这个问题。我将最小/最大检查放在主WHILE循环之外,这允许在数组中输入0的输入。

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void){


    int numbers[N];
    int i = 0;
    int j;
        int input;
    int maxvalue =1;
    int minvalue = 1;
            printf("Enter the next array element>");

scanf("%d", &input);
minvalue = input;
maxvalue = input;



while (input != 0){
    numbers[i] = input;

    ++i;
                printf("Enter the next array element>");
    scanf("%d", &input);

if (input == 0){
numbers[i] = 0;
  ++i;

  }

}
for (j =0;j<i;j++){
 if (numbers[j] >= maxvalue){
                                maxvalue = numbers[j];
                            }
                            if(numbers[j] < minvalue){
                                minvalue = numbers[j];
                            }

}

printf("%d\t", maxvalue);
printf("%d\n", minvalue);

    }

5 个答案:

答案 0 :(得分:2)

首先,您要将input分配给scanf()的返回值。这是呼叫分配的项目数,由于您说输入始终是正确的,因此该值始终为1

其次,您使用以下行写出numbers[]数组的末尾:

input = scanf("%d", &numbers[100]);

(您应该改为scanf("%d, &input),并将numbers[i]分配给循环中的输入。

最后,您不需要通过在循环的每次迭代中迭代maxvalue来重新计算minvaluenumbers[]。相反,只需将它们与input进行比较并相应地分配它们。

希望这能让你走上正轨。

答案 1 :(得分:2)

看起来您的核心问题是您只能将每个数字与minvalue进行比较。这对于决定是否替换当前minvalue很好,但显然它并没有告诉你关于每个元素与maxvalue之间关系的任何信息。

另一个问题:从第一个元素初始化minvalue是有意义的,但是如果你在循环中执行它则不行。这只会使您以前的所有工作无效。

您还需要使用maxvalue进行相同的初始化。您应该将该数字初始化为第一个值。

在累积数据或完成数据传递时,您还应该决定计算最小值和最大值。但是,您不想做的是使用每个新元素循环过去的元素。这为您的程序提供了二次时间复杂度,没有任何好处。

最后,不要容忍糟糕的格式。调试总是涉及到对代码的研究,你会希望它总是被完美地格式化,既要专业又要便于阅读你自己的工作。

答案 2 :(得分:2)

您提出两个问题,关于最小/最大计算和循环的策略。不要那样做(对自己),但一次解决一个问题。所以首先提出像

这样的东西
signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];

一开始就忘记了scanf个问题。

然后将最小/最大检测包装在适当的循环指令中。

然后编译代码并在-Wall上为gcc添加警告,但这可能因编译器而异。

我告诉我一些事情:

  

test-numbers.c:21:警告:'maxvalue'   可以在这里使用未初始化的   function test-numbers.c:22:警告:   'minvalue'可以未初始化使用   在这个功能

这告诉你在不考虑算法起点的情况下你做错了什么。

答案 3 :(得分:0)

我已经重新缩进你的代码并用`/ *替换了很多代码... PLACEHOLDER ... * /

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void) {
    int numbers[N];
    int i = 0;
    int input;
    int maxvalue;
    int minvalue;

    printf("Enter the next array element>");
    scanf("%d", &input);

    while (input != 0) {
        numbers[i] = input;
        i++;

        if (input == 0) {
            /* ...PLACEHOLDER... */
        }
        printf("Enter the next array element, while loop>");
        scanf("%d", &input);
    }
    printf("%d\t", maxvalue);
    printf("%d", minvalue);
}

希望您能看到当您输入1,或2或3时以及当您输入0时会发生什么。

提示:maxvalueminvalue值永远不会更改。

另一个提示:while()行执行了多少次?


使用示例运行

编辑

对于此示例运行,代码位于左侧,发生的情况位于左侧

        printf("Enter the next array element>"); |
        scanf("%d", &input);                     | Enter 42
                                                 |
        while (input != 0) {                     | input is 42, so you do the loop
            numbers[i] = input;                  | numbers[0] = 42
            i++;                                 | i = 1
                                                 |
            if (input == 0) {                    | input != 0; skip placeholder
                /* ...PLACEHOLDER... */          |
            }                                    |
            printf("Enter the next ...>");       |
            scanf("%d", &input);                 | enter 3
        }                                        | 
        while (input != 0) {                     | input is 3
            numbers[i] = input;                  | numbers[1] = 3
            i++;                                 | i = 2
                                                 |
            if (input == 0) {                    | input != 0; skip placeholder
                /* ...PLACEHOLDER... */          |
            }                                    |
            printf("Enter the next ...>");       |
            scanf("%d", &input);                 | enter 0
        }                                        | 
        while (input != 0) {                     | input is 0, skip while body
            /* ...PLACEHOLDER... */              |
        }                                        |
        printf("%d\t", maxvalue);                | maxvalue hasn't been initialized
        printf("%d", minvalue);                  | minvalue hasn't been changed

答案 4 :(得分:-3)

int cmp(const void *a,const void *b)
{
  return *(const int*)a-*(const int*)b;
}
...
qsort( numbers, 100, sizeof(numbers[0]), cmp );
printf("\nmin: %d\nmax: %d",numbers[0],numbers[99]);