簡體   English   中英

scanf不起作用(整數)

[英]scanf doesn't work (integer)

當我執行代碼時, scanf("%d", &n); 不要掃描任何內容,我的意思是,如果我輸入任何數字,無論我輸入多少數字,它都不會做任何事情。

void testEsPrimo() {
    int n; 

    printf("Comprobando si un número es o no primo\n");
    printf("Teclee un número entero: ");
    fflush(stdout);

    scanf("%d", &n);  //<---- The problem ?

    if(esPrimo(n) == cierto){
        printf("%d es primo\n", n);
    }else{
        printf("%d NO es primo\n", n);
    }

    fflush(stdout);
}


Logico esPrimo(int n){
int divisor;
int esPrimox;
for(divisor = 2; sqrt(n); divisor++) {
    if(n <= 0) {
        return falso;
    } else {
        if(n%divisor == 0) {
            esPrimox = 0;
        } else {
            esPrimox =1;
        }
    }

}
if(esPrimox == 1) {
    return cierto;
}

return falso;

}

這是我的esPrimo代碼,用於確定數字是否為質數。

typedef enum {falso, cierto} Logico;

這是Logico,在.h文件中定義

PD:這是我使用C語言的第一步,因此我的代碼可能很糟糕。 PD2:對不起,我的英語不好,我不是母語,我的英語不是很好。

您的scanf非常完美。

我認為您的錯誤是esPrimo的循環。 實際上,您有一個無限循環,因為sqrt(n)始終具有相同的值,並且它不是布爾表達式。

更改循環:

for(divisor = 2; sqrt(n); divisor++) {
        if(n <= 0) {
            return falso;
        } else {
            if(n%divisor == 0) {
                esPrimox = 0;
            } else {
                esPrimox =1;
            }
        }

    }

為了這:

 for(divisor = 2; divisor < sqrt(n); divisor++) {
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                }
            }

        }

但是,當您知道自己的號碼不是素數時,就會遇到問題:您必須完成循環。 你可以這樣做:

for(divisor = 2; divisor < sqrt(n); divisor++) {
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                    break;
                }
            }

        }

但是,如果可以避免在循環內使用break ,請不要使用它。 對於復雜的算法,您會得到一個清晰的代碼,但是當您閱讀一個循環時,通常您會理解該循環執行了准確的迭代次數。 如果還有另一個標志要結束循環,請使用while

While (divisor < sqrt(n) && esPrimox == 0){
            if(n <= 0) {
                return falso;
            } else {
                if(n%divisor == 0) {
                    esPrimox = 0;
                } else {
                    esPrimox =1;
                }
            }

        }

esPrimo中有2個主要問題。

首先,for循環不會終止:

for(divisor = 2; sqrt(n); divisor++) {

將條件更改為:

for(divisor = 2; divisor <= sqrt(n); divisor++) {

第二是邏輯。 如果發現n不是素數,則需要中斷循環,否則函數將始終返回true 您可以使用break語句或通過在循環條件下檢查esPrimox的值來esPrimox此操作。

這是使用break

for(divisor = 2; divisor <= sqrt(n); divisor++) {  /* fixed loop condition */
    if(n <= 0) {
        return falso;
    } else {
        if(n%divisor == 0) {
            esPrimox = 0;
            break;        /* break the loop */ 
        } else {
            esPrimox =1;
        }
    }
}

暫無
暫無

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

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