如何在 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);
}
基本上,您将新值与当前 min
和 max
进行比较(除了将用于初始化它们的第一个元素)。在输入阶段结束时,已经计算出最小值和最大值。
注意:当然只有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
我使用动态内存分配创建了一个数组。
我正在输入数组的大小,然后是元素。程序对元素求和,但没有找到此数组的最大和最小元素。
这是我的代码:
#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);
}
基本上,您将新值与当前 min
和 max
进行比较(除了将用于初始化它们的第一个元素)。在输入阶段结束时,已经计算出最小值和最大值。
注意:当然只有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