C语言 为什么这个程序打印0?

oipij1gg  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(200)

我应该写一个程序来打印向量的最小值。这是我试过的。它只打印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;
}
dkqlctbz

dkqlctbz1#

由于scanf循环(我建议不要使用像read这样的函数名,它们是C标准的一部分,即使你没有包含unistd.h)在输入0时结束,所以你需要在末尾包含一个检查,如果0是最后一个条目,则减少数组的大小。

if (v[i - 1]) {
    return i;
}
return --i;

如果所有100个元素都是非零的,它将返回i,否则它将在返回之前从数组中删除0。没有必要为了立即return n而声明int n=i
编辑:我看到你的评论说它能很好地找到最大值。这是因为你几乎可以肯定地在数组中输入了一个大于0的数字,所以在末尾加0不会影响最大值。再次尝试找到最大值,但只输入负数。结果将是0。

iqjalb3h

iqjalb3h2#

read()使用一个0条目来终止阅读更多的输入。然而,0包含在数组中,并作为返回值的一部分计入数组长度。
相反,仅当输入为数值且非零时才递增数组计数。

int read(int v[], int size) {
    int i = 0;
    while (i < size) {
        // Also test if valid numeric input was read.
        if (scanf("%i", &v[i]) != 1) {
            break;
        }
        // Stop if a 0 was read
        if (v[i] == 0) {
            break;
        }
        // Now increment
        i++;
    }
   
    return i;
}

可以使用较短的代码,但可读性较低。最好编写清晰的代码。

int read(int v[], int size) {
    int i = 0;
    while (i < size && scanf("%i", &v[i]) == 1 && v[i]) {
        i++;
    }
    return i;
}
vof42yt1

vof42yt13#

试验条件

while (v[i-1] != 0

scanf成功处理和转换0后(但您从未检查返回值),检查读取的最后一个元素是否为00随后包含在数组中,并且始终为最小值,除非您输入非负数。
下面是工作代码:

#include <stdio.h>
#include <stdlib.h> 
    
static size_t read (int v[], size_t size)
{
      size_t i = 0;
      do
      {
          /* Check if scanf was successful */ 
          if (scanf("%i",&v[i]) != 1) {
              fprintf(stderr, "Error: Invalid input.\n"); 
              return EXIT_FAILURE;
          }
       
      } while (v[i] != 0 && ++i < size);

      return i;
 }
       
static int minim (int v[],size_t n)
{
     int min;
     min = v[0];
           
     for(size_t i = 1; i < n; i++) {
            if (v[i] < min) {
                min = v[i]; 
            }        
     }
     return min;  
}

int main(void)
{
     int arr[100];
     size_t n = read(arr,100);
                
     int min = minim(arr,n);
     printf("\nMinimum vrom vector is %i\n", min);
     return EXIT_SUCCESS;
 }

我对它做了一些小改动,虽然我对设计不满意。

样本I/O:

20
8
18
60
39
56
0
Minimum vrom vector is 8

相关问题