我应该写一个程序来打印向量的最小值。这是我试过的。它只打印0。我试着用两种方法改变符号,但它不起作用。
#include <stdio.h>
int read(int v[], int size)
{
int i = 0;
do
{
scanf("%i", &v[i]);
i++;
} while (v[i-1] != 0 && i < size);
int n = i;
return n;
}
int minim(int v[], int n)
{
int m;
m = v[0];
int i;
for (i = 1; i <= n-1; i++)
{
if (v[i] < m)
{
m = v[i];
}
}
return m;
}
int main()
{
int arr[100];
int n = read(arr, 100);
int min = minim(arr, n);
printf("\nMinimum vrom vector is %i\n", min);
return 0;
}
3条答案
按热度按时间dkqlctbz1#
由于
scanf
循环(我建议不要使用像read
这样的函数名,它们是C标准的一部分,即使你没有包含unistd.h
)在输入0时结束,所以你需要在末尾包含一个检查,如果0是最后一个条目,则减少数组的大小。如果所有100个元素都是非零的,它将返回
i
,否则它将在返回之前从数组中删除0。没有必要为了立即return n
而声明int n=i
。编辑:我看到你的评论说它能很好地找到最大值。这是因为你几乎可以肯定地在数组中输入了一个大于0的数字,所以在末尾加0不会影响最大值。再次尝试找到最大值,但只输入负数。结果将是0。
iqjalb3h2#
read()
使用一个0
条目来终止阅读更多的输入。然而,0包含在数组中,并作为返回值的一部分计入数组长度。相反,仅当输入为数值且非零时才递增数组计数。
可以使用较短的代码,但可读性较低。最好编写清晰的代码。
vof42yt13#
试验条件
在
scanf
成功处理和转换0
后(但您从未检查返回值),检查读取的最后一个元素是否为0
。0
随后包含在数组中,并且始终为最小值,除非您输入非负数。下面是工作代码:
我对它做了一些小改动,虽然我对设计不满意。
样本I/O: