簡體   English   中英

下面的代碼有什么錯誤?

[英]What is the mistake in the following code?

在運行時,max 從數字列表中給出了所需的最大數字,但 min 沒有給出它應該給出的最小數字。? 例如:

如果輸入是:

5
45 7 2 1 4

以下代碼的輸出是:

最大數量為 45

最小數量為 0

為什么 ?

#include <stdio.h>
#include <limits.h>
#define MX 1000000

int max=INT_MIN;
int min=INT_MAX;

int findmax(int a[],int n)
{
    if(n<0)
        return max;
    if(a[n]>max)
    {
        max=a[n];
    }
    return findmax(a,n-1);
}

int findmin(int a[],int n)
{
    if(n<0)
        return min;
    if(a[n]<min)
    {
        min=a[n];
    }
    return findmin(a,n-1);
}

int main(void) {
    int a[MX],n,i;
    printf("Enter the number of elements:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Maximum number is %d\n",findmax(a,n));
    printf("Minimum number is %d\n",findmin(a,n));
    return 0;
}

在您的代碼中,您將索引 0 的值初始化n-1 ,但在findmax()findmin() ,您使用的是索引n 該值未初始化為任何內容( a是自動局部變量,還記得嗎?),並且該索引(內容)處的值不確定。

因此,使用該索引進行訪問實際上是嘗試讀取調用未定義行為的未初始化變量。

使用n-1作為第二個參數調用findmax()findmin()

您需要從 n-1 而不是從 n 迭代數組元素。 所以以這種方式進行函數調用findmax(a,n-1) findmin(a,n-1)

使用全局變量不被認為是一個好的設計。 如果您不痴迷於遞歸函數,則可以將代碼簡化為

int findmax(int a[], int n) {
    int i = 0, max = INT_MIN;
    for (; i < n; ++i)
        if (max < a[i])
            max = a[i];
    return max;
}

對於findmin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM