我使用动态内存分配创建了一个数组。
我输入了数组的大小,然后输入了元素。程序对元素进行求和,但没有找到这个数组的最大和最小元素。
这是我的代码。
#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
我建议你换一种方法,通过计算最小& 最大 "飞 "来:
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