如何在 C 中查找数组中的最大和最小元素?

How to find max and min elements in array in C?

我使用动态内存分配创建了一个数组。

我正在输入数组的大小,然后是元素。程序对元素求和,但没有找到此数组的最大和最小元素。

这是我的代码:

#include <stdio.h>   
#include <stdlib.h>    
int main()
{    
    int size ,i ,a;
    double *element;
    printf("Dizinin Boyutunu Giriniz: ");
    scanf("%d",&size);

    int *ptr = (int *)malloc(sizeof(int) * size);
    if (size == NULL) {
        printf("Hata! Hafiza verilemedi.");
       exit(0);
    }

    printf("Dizinin Elemanlarini Giriniz: ");

    for(int i = 0 ; i < size ; i++)    
        scanf(" %d", &ptr[i]); 

    int sum = 0;

    for(int i = 0 ; i < size ; i++)    
        sum = sum + ptr[i];

    printf("Dizinin Elemanlarinin Toplami: = %d \n",sum);

    for(a=1;a<size;a++)  {
       if(*element<*(element+a)) 
           *element=*(element+a);
    }
    printf(" The Largest element is :  %.2f \n\n",*element);        

    free(ptr);
}

它正确显示了元素的总和,但没有显示最大值和最小值。我知道代码中没有关于 min 的内容,但我无法弄清楚。我也在请求你的帮助。我该如何解决这个问题?

这是输出:

Dizinin Boyutunu Giriniz: 3
Dizinin Elemanlarini Giriniz: 3
5
7
Dizinin Elemanlarinin Toplami: = 15

--------------------------------
Process exited after 19.5 seconds with return value 3221225477
Press any key to continue . . .

正如评论部分正确告知您的那样,您正在尝试将最大值存储到从未初始化的指针中。每当你声明一个指针时,你需要告诉编译器它指向哪里:现有变量的地址(通过一元运算符& - 在你的情况下它会是 double *element = &a_valid_double_variable;) 或动态分配的地址(使用 malloc 函数 - 在您的情况下 double *element = malloc(sizeof double);).

无论如何,既然你用 scanf 填充你的数组,我建议你使用不同的方法,通过计算最小值和最大值 "on the fly":

if(size > 0)
{
    int max, min;

    for(int i = 0 ; i < size ; i++)
    {
        scanf(" %d", &ptr[i]);

        if(i == 0)
        {
            max = min = ptr[i];
        }
        else
        {
            if(ptr[i] > max)
                max = ptr[i];

            if(ptr[i] < min)
                min = ptr[i];
        }
    }
    printf("Max: %d - Min: %d\n", max, min);
}

基本上,您将新值与当前 minmax 进行比较(除了将用于初始化它们的第一个元素)。在输入阶段结束时,已经计算出最小值和最大值。

注意:当然只有size是正整数才有意义。


因此,去掉无用的变量,在循环内移动总和并将消息翻译成英文,您的程序将变为:

#include <stdio.h>   
#include <stdlib.h>

int main()
{    
    int size;

    printf("Insert the number of integers (size of array): ");
    scanf("%d",&size);

    if(size > 0)
    {
        int *ptr = (int *)malloc(sizeof(int) * size);
        int max, min, sum = 0;

        printf("Insert %d integers: ", size);

        for(int i = 0 ; i < size ; i++)
        {
            scanf(" %d", &ptr[i]);

            if(i == 0)
            {
                max = min = sum = ptr[i];
            }
            else
            {
                if(ptr[i] > max)
                    max = ptr[i];

                if(ptr[i] < min)
                    min = ptr[i];

                sum += ptr[i];
            }
        }
        printf("Sum: %d - Max: %d - Min: %d\n", sum, max, min);

        free(ptr);
    }
    else
    {
        printf("Invalid size!\n");
    }
}

输出:

Insert the number of integers (size of array): 5
Insert 5 integers: 34 32 11 -5 7
Sum: 79 - Max: 34 - Min: -5

与其使用查找总和、最大值和最小值的表单代码,不如考虑只执行这些功能之一的辅助函数。

// Returned pointer to min value
int *int_min(const char *ptr, size_t n) {
  int *min_ptr = NULL;
  if (n > 0) {
    *min_ptr = &ptr[0];  // Save address of first element
    for (size_t i = 1; i<n; i++) {
      if (*min_ptr < ptr[i]) {
        min_ptr = &ptr[i];    // Save address of ith element
      }
    }
  }
  return min_ptr;
}

用法

int *min = int_min(ptr, size);
if (min) {
  printf(" The minimum element is :  %d\n", *min);
} else {
  printf(" The minimum element does not exist\n");
} 

您声明了类型为 double * 的未初始化指针。

double *element;

所以它在这个循环中使用

for(a=1;a<size;a++)  {
   if(*element<*(element+a)) 
       *element=*(element+a);
}

没有意义并导致未定义的行为。

删除指针声明。

这个if语句

if (size == NULL) {
    printf("Hata! Hafiza verilemedi.");
   exit(0);
}

也没有什么意义。

你的意思好像是

if ( ptr == NULL) {
    printf("Hata! Hafiza verilemedi.");
   exit(0);
}

如果你需要使用指针找到动态分配的整数数组的最大和最小元素,那么相应的代码可以像这样

const int *min = ptr;
const int *max = ptr;

for ( const int *p = ptr + 1; p != ptr + size; ++p )
{
    if ( *p < *min ) 
    {
        min = p;
    }
    else if ( *max < *p )
    {
        max = p;
    }
}

printf(" The Smallest element is :  %d\n", *min );
printf(" The Largest  element is :  %d\n", *max );

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) 
{
    size_t n = 1; // by defaul let;s the size of the array will be equal to 1

    printf( "Dizinin Boyutunu Giriniz: " );
    scanf( "%zu", &n );

    int *ptr = malloc( n * sizeof( int ) );

    if ( ptr == NULL ) 
    {
        printf( "Hata! Hafiza verilemedi.\n" );
        exit(0);
    }

    printf( "Dizinin Elemanlarini Giriniz: " );

    for ( int *p = ptr; p != ptr + n; ++p )
    {
        *p = rand() % ( int )n;
    }

    for ( const int *p = ptr; p != ptr + n; ++p )
    {
        printf( "%d ", *p );
    }

    putchar( '\n' );

    const int *min = ptr;
    const int *max = ptr;

    for ( const int *p = ptr + 1; p != ptr + n; ++p )
    {
        if ( *p < *min ) 
        {
            min = p;
        }
        else if ( *max < *p )
        {
            max = p;
        }
    }

    printf( "The Smallest element is :  %d\n", *min );
    printf( "The Largest  element is :  %d\n", *max );

    free( ptr );

    return 0;
}

它的输出可能看起来像

Dizinin Boyutunu Giriniz: 10
Dizinin Elemanlarini Giriniz: 3 6 7 5 3 5 6 2 9 1 
The Smallest element is :  1
The Largest  element is :  9