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

问题描述 投票:0回答:1

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

我输入了数组的大小,然后输入了元素。程序对元素进行求和,但没有找到这个数组的最大和最小元素。

这是我的代码。

#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 . . .
c dynamic-memory-allocation
1个回答
1
投票

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

总之,由于你在数组中填充了 scanf 我建议你换一种方法,通过计算最小& 最大 "飞 "来:

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

1
投票

与其用代码来求和、最大和最小值 不如考虑用一个辅助函数来完成其中的一个函数。

// 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");
} 

0
投票

你声明了一个未初始化的指针,类型为 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
© www.soinside.com 2019 - 2024. All rights reserved.