【问题标题】:Function that find the smallest int (C)找到最小 int 的函数 (C)
【发布时间】:2015-11-29 21:40:32
【问题描述】:

我是 C 编程的初学者,我正在尝试创建一个输入数字并找到其中最小的数字并显示它的函数。到目前为止,我这样做了,但它不起作用:

int smallest(){
  int tyy;
  for(tyy=0; tyy<11;tyy++){
    int small;
    int numbers;
    printf("input numbers");
    scanf("%d", &numbers);
    int blockloop;
    while ((blockloop=getchar()) != EOF && blockloop != '\n');
    if (numbers<small){
      numbers = small;
      printf("\n",numbers);
    }
  }
  return 0;
}

但是这不起作用,无论我输入哪个数字,它都会询问 11 次数字然后返回主功能。我不太确定我所做的是否正确。

编辑(但不打印正确的数字)

  int smallest(){
  int tyy;
  for(tyy=0; tyy<11;tyy++){
    int small;
    int numbers;
    printf("input numbers");
    scanf("%d", &numbers);
    int blockloop;
    while ((blockloop=getchar()) != EOF && blockloop != '\n');
    if (numbers<small){
      small=numbers;
      printf("%d\n",numbers);
    }
  }
  return 0;
}

使用的输入值是 1 到 11;打印结果为 11。 谢谢!

【问题讨论】:

  • 第一个提示 - small 的初始值是多少?第二个提示 - 如果numbers 小于smallsmallnew 值应该是多少?
  • printf("\n",numbers); 应该生成编译器警告。如果没有,请了解如何提高编译器的警告级别,或获得更好的编译器。
  • 那么它应该读取一个vlue,存储它,然后检查下一个是否更小,如果是则替换它? @JohnBode
  • 由于您开始使用 C 语言进行编程,如果您在编译时启用警告,您会省去很多麻烦。例如gcc -Wall -Wextra .... 或 Windows 上的等效编译器。当您收到警告时,查找它们,修复它们,然后继续。只有在非常有限和非常罕见的情况下,您可以依赖编译时带有警告的代码(您将在很长一段时间内不会遇到任何警告)。
  • 我使用的编译器是 Codeblocks,我的问题中最后编辑的代码编译时出现 0 个警告,0 个错误

标签: c function loops integer


【解决方案1】:

这段代码没有做任何我能看到的有成效的事情。它似乎只是循环,直到用户输入 EOF 或 \n。

while ((blockloop=getchar()) != EOF && blockloop != '\n');

在这段代码中

if (numbers<small){
  numbers = small;
  printf("\n",numbers);
}

作业应该是

  small = numbers;

还有

printf("\n",numbers);

实际上并没有输出您的号码。改成

printf("%d\n",numbers);

你需要将small初始化为最大的整数。

#include <limits.h>
...
int small = INT_MAX;

【讨论】:

  • 这是我刚试过的,最后还是没有打印出最小的
  • 编辑您的答案以将您的新代码添加到答案的末尾(不要覆盖您以前的代码)。显示你使用的输入值和你得到的输出。完成后在此处添加评论,以便我收到通知。
  • 你的循环是错误的。您将获得 11 次不同的输入,并且每次都分别检查最小的数字是多少。相反,您应该首先获取十一个数字(将它们放入数组中),然后然后循环遍历数组以找到最小的数字。
【解决方案2】:

好的!我设法修复了你的代码,它很简单,所以我希望你能理解你所犯的错误:
1。您在 for 循环中定义了 int small 和 int numbers,这意味着它们存在于 for 中并在每次 for 再次启动时死亡,这称为范围。您必须在范围之外声明变量。
2。您在 if 语句中打印,这意味着它将打印您刚刚输入的数字。
3。您没有初始化变量。您应该始终这样做,特别是在比较它们时。当你在做这种程序时,你应该将 small 初始化为最小整数,以便它尽可能地工作。
4。我还修改了while,如果你输入了一个char或者不是数字的东西,你只是跳过了一个数字,你不会再问这个数字了,所以我在里面添加了另一个scanf,这也可以用一个转到。


我想就是这样!代码如下:

#include <limits.h> 

int smallest(void) {
  int tty, small = INT_MAX, numbers, blockloop;
  for(tty = 0; tty < 11; ++tty) {    
    printf("Input numbers:\n");
    scanf("%d", &numbers);

    while ((blockloop=getchar()) != EOF && blockloop != '\n') {
        scanf("%d", &numbers);
    }

    if(numbers < small) {
      small = numbers;
    }
  }
  printf("Smallest: %d\n", small);
  return 0;
}

如果您有任何问题,请告诉我!

编辑:注意风格,整洁的代码是简单的代码,如果代码组织良好,您可以更快地发现错误。另一个,你应该在 for 循环中为变量使用名称“i”,它只是常规的。也习惯于在不清楚的时候评论你的代码。最后,当您发现错误时,请尝试在脑海中运行代码,这样您就可以很快发现一些简单的错误。

【讨论】:

    【解决方案3】:

    您应该在使用 int 变量之前对其进行初始化。

    small 具有不确定的值,因为它未初始化,因此您的程序无法在 if 语句中判断 numbers 是否小于 small

     if (numbers < small)
    

    small 需要初始化为一个较大的值(已知大于预期的输入数字),或者初始化为第一个输入值。

    【讨论】:

      【解决方案4】:

      需要将最小设置为 INT_MAX。也使用limits.h

      #include <limits.h>
      
      int smallest(){
        int tyy;
        for(tyy=0; tyy<11;tyy++){
          int small = INT_MAX;
          int numbers;
          printf("input numbers");
          scanf("%d", &numbers);
          int blockloop;
        while ((blockloop=getchar()) != EOF && blockloop != '\n');
          if (numbers<small){
            small = numbers;
          printf("\n",numbers);
          }
        }
        return 0;
      }
      

      【讨论】:

      • while 循环需要scanf("%d", &amp;numbers);
      • 我的函数最后似乎没有显示任何东西(打印最小的)
      【解决方案5】:

      这只是对您的代码的快速修复。我希望它有助于了解问题所在。

      请考虑一下其他人迄今为止所写的内容:有很多有用的提示和评论可以帮助您提高代码质量。

      int smallest(){
        int tyy;
        int small=INT_MAX;                // (1)
        for(tyy=0; tyy<11;tyy++){
      //     int small;                   // Moved outside the loop and initialized - See (1)
          int numbers;
          printf("input numbers");
          scanf("%d", &numbers);
          int blockloop;
          while ((blockloop=getchar()) != EOF && blockloop != '\n');
          if (numbers<small){
            small=numbers;
      //       printf("%d\n",numbers);    // Removed
          }
        }
        printf("%d\n",small);             // Added - Print the smallest
        return 0;
      }
      

      为了能够使用 INT_MAX,您必须包含正确的标题。

      #include <limits.h>                 // Provides the INT_MAX symbolic constant
      

      下面是一个示例,说明如何根据一些基本原则编写程序,例如

      • 功能分解 - 每个功能都执行一个定义明确的任务
      • 变量初始化 - 每个变量在使用前都被正确初始化
      • 代码可读性 - 每个实体都有一个适当的、希望有意义的名称;符号常量用于代替幻数;添加空格以突出显示代码结构

      这是代码。

      #include <stdio.h>
      #include <limits.h>
      
      #define NUM_TO_BE_READ   11
      
      // Find and return the smallest number in the given array of ints
      int FindSmallest( int numbers[], unsigned int size ){
          int   smallest   =   numbers[ 0 ];
          int   i          =   1;
      
          for ( i = 1; i < size; i++ ){
              if ( numbers[ i ] < smallest ){
              smallest   =   numbers[ i ];
              }
          }
      
          return smallest;
      }
      
      // The main function - program entry point
      int main(){
          // Define and initialize a few variables
          int   numbers[ NUM_TO_BE_READ ];
          int   smallest   =   INT_MAX;
          int   i          =   0;
      
          for ( i = 0; i < NUM_TO_BE_READ; i++ )
          {
          numbers[ i ]   =   INT_MAX;
          }
      
          // Read numbers
          for ( i = 0; i < NUM_TO_BE_READ; i++ )
          {
          printf( "number: " );
          scanf( "%d", &numbers[ i ] );
          }
      
          // Find the smallest number
          smallest   =   FindSmallest( numbers, NUM_TO_BE_READ );
      
          // Print the smallest number and exit
          printf("The smallest number is: %d\n", smallest );
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 2013-10-13
        • 2015-02-03
        相关资源
        最近更新 更多