2016-03-02 119 views
0

我必須編寫一個do while循環來讀取整數並計算它們的總和。它繼續添加整數,直到用戶輸入-1,但不應將-1添加到總和中。在do-while語句中添加整數

do 
{ 
    printf("Enter a number. Enter -1 to stop\n"); 
    scanf(" %d", &n); 
    sum = sum + n; 
    printf("The sum is %d\n", sum); 
} 

while (n >= 0); 
{ 
    return 0; 
    printf("Have a nice day!\n"); 
} 

我在哪裏出錯了?我如何獲得-1以避免被添加到總和中?

+4

如果您不想添加'-1',則不必添加它。問題是什麼? – Olaf

+1

您對程序進行格式化的方式會使底部花括號中的代碼與while循環相關聯。情況並非如此。另請注意,返回0後出現的printf;永遠不會被執行。 – bruceg

+0

將它全部包裝在一個醜陋的'while'條件下。 printf(「輸入一個數字,輸入-1停止\ n」); (sum =%d \ n「,sum + = n));' – chux

回答

2

使用前需要聲明n,i。檢測輸入-1時需要break

int sum = 0, n = 0; 
do 
{ 
    printf("Enter a number. Enter -1 to stop\n"); 
    scanf("%d", &n); 
    if(-1 == n) 
     break; // <-- break here to get out the loop 
    sum = sum + n; 
    printf("The sum is %d\n", sum); 
} while (1); // <-- note while(1) should be used instead of while(n >= 0), this makes sure your loop only exits when detecting input -1 

也沒有點添加printf後您return - 即該代碼可以被刪除:

{ 
    return 0; 
    printf("Have a nice day!\n"); // <-- any code after `return` is meaningless 
} 
+0

@AnT同意。我提到'while(n> 0)'可以被'while(1)'替代。現在我認爲它應該是,不是可以..謝謝 – artm

-1

你覆蓋n的值,它會檢查條件再次運行循環之前。

進行這些更改,現在應該可以使用。

int input = 0; // Change 
    int n = 0; // Change 
    do 
    { 
     printf("Enter a number. Enter -1 to stop\n"); 
     scanf(" %d", &input); // Change 
     if(input >=0) // Change 
     { 
     n = input; // Change 
     sum = sum + n; 
     printf("The sum is %d\n", sum); 
     } 
    } 

    while (input != -1); // Change 
    { 
     return 0; 
     printf("Have a nice day!\n"); 
    } 
+0

如果你指的是我的回答,我並不是說實際上使用了goto - 我只是將do {}的語法糖替換爲while() ;其編輯輸出用於說明。 – Crashworks

+0

@Crashworks啊,我的壞。 – MrPickles

0

您的行爲做,而如果你在GOTO語句的角度來考慮它的循環會更清楚編譯器將其視爲:

// prior code before here... 
START_OF_DO: 
printf("Enter a number. Enter -1 to stop\n"); 
scanf(" %d", &n); 
sum = sum + n; 
printf("The sum is %d\n", sum); 

if (n >= 0) { 
    goto START_OF_DO; // this is what "while (n >= 0);" does 
} 

return 0; 
printf("Have a nice day!\n"); // <-- note that this will never print, because you have already returned 

這種方式形成的,你可以看到你sum = sum + n發生在您檢查if (n >= 0)之前。

(注意,我並不是說你曾經使用goto!但有時它是有益的,看看在機器指令編譯器發出的術語這些東西。)

1

有一對夫婦的方式,以避免-1添加到總和中。讓我們先來看看你的代碼:

do 
{ 
    printf("Enter a number. Enter -1 to stop\n"); 
    scanf(" %d", &n); 
    sum = sum + n; 
    printf("The sum is %d\n", sum); 
} 
while (n >= 0); 

如果n小於零,那麼do/while循環將會退出。這是將-1作爲前哨值的一種方法,因此在那裏沒有問題。

不幸的是,您的代碼讀取數字,將其添加到總數,然後檢查是否應該停止。按照這個順序,你總是在檢查前添加。

最明顯的,暴力的方式來避免增加的數量是增加一個明確的檢查:

do { 
    printf ... scanf ... ; 
    if (n != -1) 
     sum = sum + n; 
} while (n >= 0); 

另一種方式是作弊。鑑於-1總是在列表的末尾,只是撤消底:

do { 
    printf... scanf...; 
    sum = sum + n; 
} while (n >= 0); 

sum = sum - n; // CHEAT - just subtract out the last number 
printf("The sum is %d\n", sum); 

最後,還有你可以用一招。有時在這種情況下,你可以「轉移」循環,以便你實際上做的事情有點不合時宜。在這種情況下,您想在添加之前進行測試。因此,把附加在循環的頂部,只是一些事情,從而使第一個添加對人體無害:

n = 0; // X + 0 is X, so adding 0 is harmless. 
do { 
    sum = sum + n; 
    printf ... scanf ...; 
} while (n >= 0); 

這可能會讓你不舒服的一分鐘,但它是你會看到一個成語許多。循環代碼已在循環內部「扭曲」,因此「自然」循環的頂部不會從實際循環體的頂部開始。這是一個很好的竅門。