2017-04-05 80 views
-1

所以基本上我在C中有这个分配,我必须输入数字,直到输入0,然后输入0,我必须打印所有数字的第一个和第二个最小数字,我不能使用数组。我得到,我必须使用do-while循环输入,但我无法弄清楚如何从所有这些中找到两个最小的。我认为这件事可以用if循环完成,但不知道如何制作,因为我只有一个变量可以输入数字(int a)。并且在输入时,我输入0时出错,在程序退出前我可以再输入一个数字。我必须找到没有数组的两个最小数字

#include <stdio.h> 

    int main() { 

     int a; 

     do { 
      printf("Enter numbers: "); 
      scanf("%d\n", &a); 
     //what to do here 
     }while(a != 0); 
+1

除非允许添加更多变量,否则无法完成 –

+2

您需要其他2个变量来执行所需操作。 – LPs

+0

_if loops _....没有任何意义... – LPs

回答

3

您需要添加2个变量才能保持到目前为止检测到的最小值。像

int smallest = INT_MAX; 
int second_smallest = INT_MAX; 

然后在循环中,您需要测试新输入值是否小于迄今存储的值。喜欢的东西:

if (a <= smallest) 
{ 
    second_smallest = smallest; 
    smallest = a; 
} 
else if (a < second_smallest) 
{ 
    second_smallest = a; 
} 
+1

这个INT_MAX意味着什么,就像是一个固定值? –

+0

完全相同的解决方案;)顺便说一句,为什么'<='? ?我t hink OP想要整个集合中的最小值,我想可以忽略重复的数字。 – LPs

+0

我相信它必须是'<',因为如果你输入2次相同的数字,它会变得最小,second_smallest这是错误的,我猜。 – tilz0R

0

可以使用两个变量做你需要什么

#include <stdio.h> 
#include <limits.h> 

int main(void) 
{ 

    int a = INT_MAX; 
    int min_1 = INT_MAX; 
    int min_2 = INT_MAX; 

    int valid; 

    do 
    { 
     if (a < min_1) 
     { 
      min_2 = min_1; 
      min_1 = a; 

     } 
     else if (a < min_2) 
     { 
      min_2 = a; 
     } 

     printf("Enter numbers: "); 
     valid = scanf("%d", &a); 
    } 
    while ((a != 0) && (valid == 1)); 

    if (valid == 1) 
    { 
     printf("Minimum numbers entered are: %d %d\n", min_1, min_2); 
    } 
    else 
    { 
     fprintf(stderr, "Error in data input\n"); 
    } 
} 

所以:

  1. 使用limits.h定义了初始化分钟变量的最高值INT_MAXint类型。
  2. 对于每个循环,您必须测试是否输入数字是最小值
  3. 您必须检查用户输入是否有效:检查scanf返回值。
  4. 删除\n的格式字符串为scanf
+1

是的,相当相同的解决方案;)我也会+1你包括像'limits.h'和改进的'scanf'处理 – 4386427

相关问题