[英]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.