如何在 while 循环中找到最大值和最小值 - c
How to find max&min in while loop - c
我知道这道题对你来说很简单,但对我这个初学者来说很难。开始做事。我必须创建一个程序,它可以获取任意数量的数字,然后从中写入最大值和最小值。数字可以有小数,所以这就是为什么加倍。就我的故障排除而言,一切都很顺利,直到循环开始。我总是在最小值和最大值的输出上得到 0。任何人都知道为什么?
代码:
main() {
int a = 0, b = 0, min = 1000, max = 0;
printf("How many numbers do you want to enter\n");
scanf("%d", & a);
b = a;
double n[b];
printf("Write those numbers\n");
for (b = 0; a > b; b++) {
scanf("%lf", & n[b]);
}
b = 0;
while (1) {
if (n[b] < n[b + 1])
max = n[b + 1];
if (min > n[b])
n[b] = min;
b++;
if (b == a)
break;
}
printf("Minimum: %lf\nMaximum: %lf", min, max);
}
存在多个问题:
- 您将
min
定义为 1000,如果输入的所有数字都大于该数字怎么办?
min
和 max
也应该是双打
- 通过在
b == a
时使用 n[b + 1]
你正在追求数组边界
解决这个问题的最佳方法是在一个循环中计算 min/max,如下所示:
main() {
int i, len;
double tmp, min = NAN, max = NAN; // its better to initialize values to NAN to cover case when len is 0
printf("How many numbers do you want to enter\n");
scanf("%d", & len);
for (i = 0; i < len; ++i) {
scanf("%lf", & tmp);
if ((i == 0) || (tmp < min)) min = tmp;
if ((i == 0) || (tmp > max)) max = tmp;
}
printf("Minimum: %lf\nMaximum: %lf\n", min, max);
}
使用 double
的转换说明符打印 int
不是一个好主意,但会调用臭名昭著的未定义行为。
编译器可能已经注意到您了。如果没有,则提高其警告级别。对于 GCC 使用 -Wall -Wextra -pedantic
.
因此要解决此问题,请将 min
和 max
设为 double
int a = 0, b = 0;
double min = 1000., max = 0.; /* Such initialisations limit your input. */
或让它们成为 int
(降低准确性),并按原样打印它们,即 int
printf("Minimum: %d\nMaximum: %d\n", min, max);
我知道我迟到了,但我认为这是完成此计划的最佳方式
#include <stdio.h>
int main() {
int a = 0;
int counter = 0;
double min;
double max;
int counter = 1;
printf("How many numbers do you want to enter\n");
scanf("%d", & a);
double val;
printf("Write those numbers\n");
scanf("%lf", & val);
min = val;
max = val;
while(counter < a)
{
scanf("%lf", & val);
if(val < min)
{
min = val;
}
if(val > max)
{
max = val;
}
counter++;
}
printf("Minimum: %lf\nMaximum: %lf\n", min, max);
return 0;
}
这将通过首先将最小值和最大值设置为第一个值的任何值来连续读取值。
我是 C++ 程序员而不是 C 程序员,但这看起来像更好的主意。
我知道这道题对你来说很简单,但对我这个初学者来说很难。开始做事。我必须创建一个程序,它可以获取任意数量的数字,然后从中写入最大值和最小值。数字可以有小数,所以这就是为什么加倍。就我的故障排除而言,一切都很顺利,直到循环开始。我总是在最小值和最大值的输出上得到 0。任何人都知道为什么? 代码:
main() {
int a = 0, b = 0, min = 1000, max = 0;
printf("How many numbers do you want to enter\n");
scanf("%d", & a);
b = a;
double n[b];
printf("Write those numbers\n");
for (b = 0; a > b; b++) {
scanf("%lf", & n[b]);
}
b = 0;
while (1) {
if (n[b] < n[b + 1])
max = n[b + 1];
if (min > n[b])
n[b] = min;
b++;
if (b == a)
break;
}
printf("Minimum: %lf\nMaximum: %lf", min, max);
}
存在多个问题:
- 您将
min
定义为 1000,如果输入的所有数字都大于该数字怎么办? min
和max
也应该是双打- 通过在
b == a
时使用n[b + 1]
你正在追求数组边界
解决这个问题的最佳方法是在一个循环中计算 min/max,如下所示:
main() {
int i, len;
double tmp, min = NAN, max = NAN; // its better to initialize values to NAN to cover case when len is 0
printf("How many numbers do you want to enter\n");
scanf("%d", & len);
for (i = 0; i < len; ++i) {
scanf("%lf", & tmp);
if ((i == 0) || (tmp < min)) min = tmp;
if ((i == 0) || (tmp > max)) max = tmp;
}
printf("Minimum: %lf\nMaximum: %lf\n", min, max);
}
使用 double
的转换说明符打印 int
不是一个好主意,但会调用臭名昭著的未定义行为。
编译器可能已经注意到您了。如果没有,则提高其警告级别。对于 GCC 使用 -Wall -Wextra -pedantic
.
因此要解决此问题,请将 min
和 max
设为 double
int a = 0, b = 0;
double min = 1000., max = 0.; /* Such initialisations limit your input. */
或让它们成为 int
(降低准确性),并按原样打印它们,即 int
printf("Minimum: %d\nMaximum: %d\n", min, max);
我知道我迟到了,但我认为这是完成此计划的最佳方式
#include <stdio.h>
int main() {
int a = 0;
int counter = 0;
double min;
double max;
int counter = 1;
printf("How many numbers do you want to enter\n");
scanf("%d", & a);
double val;
printf("Write those numbers\n");
scanf("%lf", & val);
min = val;
max = val;
while(counter < a)
{
scanf("%lf", & val);
if(val < min)
{
min = val;
}
if(val > max)
{
max = val;
}
counter++;
}
printf("Minimum: %lf\nMaximum: %lf\n", min, max);
return 0;
}
这将通过首先将最小值和最大值设置为第一个值的任何值来连续读取值。
我是 C++ 程序员而不是 C 程序员,但这看起来像更好的主意。