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

如何在C中查找数组中的最大和最小元素?,c,pointers,max,min,dynamic-memory-allocation,C,Pointers,Max,Min,Dynamic Memory Allocation,我使用动态内存分配创建了一个数组 我输入数组的大小,然后输入元素。程序对元素求和,但找不到此数组的最大和最小元素 这是我的密码: #include <stdio.h> #include <stdlib.h> int main() { int size ,i ,a; double *element; printf("Dizinin Boyutunu Giriniz: "); scanf("%d",&size);

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

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

这是我的密码:

#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);
}

正如在注释部分中正确地告诉您的,您正在尝试将最大值存储到从未初始化过的指针。无论何时声明指针,都需要告诉编译器它指向的位置:现有变量的地址(通过一元运算符
&
-在您的情况下,它应该是
double*元素=&a\u有效的\u double\u变量;
)或动态分配的地址(使用
malloc
函数-在您的情况下
double*元素=malloc(sizeof double);

无论如何,由于您使用
scanf
填充阵列,我建议您使用另一种方法,即“动态”计算最小值和最大值:

输出:

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

正如在“注释”部分中正确地告诉您的那样,您正在尝试将最大值存储到从未初始化过的指针。无论何时声明指针,您都需要告诉编译器它指向的位置:现有变量的地址(通过一元运算符
&
-在您的情况下,它应该是
double*element=&a\u有效的\u double\u变量;
)或动态分配的地址(使用
malloc
函数-在您的情况下
double*element=malloc(sizeof double);

无论如何,由于您使用
scanf
填充阵列,我建议您使用另一种方法,即“动态”计算最小值和最大值:

输出:

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

<>而不是形成查找求和、max和min的代码,考虑一个辅助函数,只做这些函数中的一个。

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

<>而不是形成查找求和、max和min的代码,考虑一个辅助函数,只做这些函数中的一个。

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

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

double *element;
所以它在这个循环中使用

for(a=1;a<size;a++)  {
   if(*element<*(element+a)) 
       *element=*(element+a);
}
也没有什么意义

看来你是说

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 );
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

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

double *element;
所以它在这个循环中使用

for(a=1;a<size;a++)  {
   if(*element<*(element+a)) 
       *element=*(element+a);
}
也没有什么意义

看来你是说

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 );
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


你在哪里为
元素
预留空间?实际上我不知道。你能解释一下你的意思吗?你正在使用未初始化的
元素
,我不清楚你想做什么,也许如果你把
printf
文本放在英语中……你在哪里为
元素
预留空间?实际上我没有idea.你能解释一下你的意思吗?你使用的是未初始化的
元素
,我不清楚你想做什么,也许如果你把
printf
文本用英语写……我做了一些研究,我写了这个代码。所以我没有看到任何关于指针指向哪里的内容。你能解释一下我该怎么做。因为我用你的代码重新排列了我的代码,但没有任何变化。我认为这是因为我的代码缺少你所说的任何内容。@erensert缺少一个括号。基本上,你必须在求和计算后抛出所有代码,并将其替换为扫描数组元素的部分。这会起作用的(我也在最后添加了一个Primf)。BTW:你也可以在同一个循环中计算和。也许ErrSert你使用C++编译器。试试<代码>双*元素=(双*)Maloc(Sigeof(double));< /C> >,在C中不需要强制转换。但是(1)你不需要一个双变量,因为你有整数数组,(2)它不需要是指针:您只需要
int max;
(如我的示例所示),(3)您根本不需要添加变量:只需将我的代码包含到您的函数中,删除对*元素的所有引用。我按照您所说的做了。我添加了“if(size>0)”我写了这段代码,做了一些研究。所以我没有看到任何关于指针指向的地址。你能给我解释一下我该怎么做吗。因为我用你的代码重新排列了我的代码,但没有任何变化。我想这是因为我的代码没有你说的任何内容.@erensert缺少一个括号。基本上,在求和计算之后,您必须抛出所有代码,并将其替换为扫描数组元素的部分。这将起作用(最后我还添加了一个printf)顺便说一下,你可以在同一个循环中计算和。也许ErrSert可能是使用C++编译器。试试<代码>双*元素=(双*)Maloc(Sigeof(double));< /C> >,在C中不需要强制转换。但是(1)你不需要一个双变量来表示你的最大值,因为你有整数数组,(2)它不需要是指针:您只需要
int max;
(如我的示例所示),(3)您根本不需要添加变量:只需将我的代码包含到您的函数中,删除对*元素的所有引用。我按照您所说的做了。我添加了“if(size>0)”在我求和之后,第节到,但它仍然没有显示最大值和最小值。您的代码正在运行,但数组的元素不应该是随机的。我需要给出它们myself@Erensert问题出在哪里?!使用查找数组中最小值和最大值的代码段。这只是一个演示程序,演示了最小值和最大值是如何计算的可以找到。您的代码正在运行,但数组的元素不应该是随机的。我需要给出它们myself@Erensert问题出在哪里?!使用查找数组的最小值和最大值的代码段。它只是一个演示程序,演示了最小值和最大值是如何计算的