2016-03-23 37 views
0

這是我第一篇文章,所以請對我溫柔。我最近在我的大學開設了一門C語言課程,對此我非常感興趣。由於我正在處理音頻(混音/母帶音樂),我決定嘗試製作一個簡單的程序,以計算用戶定義的BPM(每分鐘節拍)的延遲時間(毫秒)。如果用戶沒有輸入正確的值,使C程序返回到開始並要求再次輸入

我現在堅持的是以下內容:我想要程序返回到開始並要求用戶再次輸入,如果他輸入了錯誤的BPM(在這種情況下爲0)。

我試過一個做while while循環然而它沒有正常工作,我的程序仍然會計算一切,就好像用戶剛輸入0一樣,如果我輸入了正確的值,它會循環不止。

如果我做了如果else語句它給用戶一個消息,但我想提示用戶再次輸入消息。

我知道這是一個非常簡單和基本的問題,但任何幫助將不勝感激。

這裏是我到目前爲止的代碼:

int main(){ 

    float BPM; 

    printf("Please input the BPM: "); 
    scanf(" %f", &BPM); 

    do{ 

    float HZ = 1000; 
    float HZ_Result; 
    float BPM_QuarterNote=(60/BPM)*1000; 

    float BPM_WholeNote=BPM_QuarterNote*4; 
    printf("\n\nDelay time for whole note is: %.2f ms or %.2f Hz", BPM_WholeNote, 1000/BPM_WholeNote); 

    float BPM_HalfNote=BPM_QuarterNote*2.0; 
    printf("\n\nDelay time for 1/2 note is: %.2f ms or %.2f Hz", BPM_HalfNote, 1000/BPM_HalfNote); 

     printf("\n\nDelay time for 1/4 note is: %.2f ms or %.2f Hz", BPM_QuarterNote, 1000/BPM_QuarterNote); 

    float BPM_EightNote=BPM_QuarterNote*0.5; 
    printf("\n\nDelay time for 1/8 note is: %.2f ms or %.2f Hz", BPM_EightNote, 1000/BPM_EightNote); 

    float BPM_SixteenthNote=BPM_QuarterNote*0.25; 
    printf("\n\nDelay time for 1/16 note is: %.2f ms or %.2f Hz", BPM_SixteenthNote, 1000/BPM_SixteenthNote); 

    float BPM_32ndNote=BPM_QuarterNote*0.125; 
    printf("\n\nDelay time for 1/32 note is: %.2f ms or %.2f Hz", BPM_32ndNote, 1000/BPM_32ndNote); 


    }while(BPM > 0); 

return 0; 
} 
+0

請出示你的企圖循環。 – kaylum

+1

請同時檢查'scanf'的返回值以及掃描的輸入值。如果'scanf'不返回'1',那麼您正在測試* unintialised變量*'BPM'。 –

+0

這聽起來像你想循環用戶輸入部分 - 第一個'printf()'和'scanf()'。 –

回答

0

將此代碼添加到BPM聲明的下方。

do{ 
    printf("Please input the BPM: "); 
    scanf(" %f", &BPM); 
    }while(BPM==0.00); 
+0

我建議避免在浮點平等測試,'while(BPM <1.0)' –

+0

我這樣做,但我鍵入while(BPM <1.0),它的工作原理就像我想要的。謝謝! – Bayaz

+0

根據用戶的要求,你可能是正確的......我不知道這個程序中的negetive值是否有效。 – denis

1

您可以使用while循環,而不是如來測試你的病情

/* while loop execution */ 
while(BPM == 0) { 
/* get my input values */ 
} 
+0

還需要初始化'BPM'。 – kaylum

+0

實際上''浮動'BPM == 0'可能是不可取的。爲什麼不選擇一個現實的值,比如'BPM <1.0',但是即使這樣也會是一個dirge;) –

+0

你的代碼永遠不會要求用戶輸入.. – denis

0

的一個簡單的例子用戶輸入循環僅在用戶滿意時退出:

int main(void) 
{ 
    float fNum= 5.2; 
    double dpNum= 5.2; 
    long double ldFloat; 

    char quit[]={" "}; 

    while(quit[0] != 'q') 
    { 
     printf("\n\nEnter a float number: "); 
     scanf("%f", &fNum); 
     printf("Enter a double precision number: "); 
     scanf("%Lf", &ldFloat); 
     ... other stuff as needed 
     printf("Enter any key to continue or 'q' to exit."); 
     scanf("%s", quit); 
    } 
    return 0; 
} 
+0

爲什麼'float fNum = 5.2;'?而不是double = >>'5.2' ...''dpNum'根本不使用。 – Michi

+0

@Michi - 大聲笑,只是從現有的代碼中剪切和粘貼。他們恰好在那裏。源代碼示例cpde實際上將'5.2'顯示爲64位二進制。簡短的回答,我很懶。 – ryyker

0
do { 
    printf("Please input the BPM: "); 
} while (scanf("%f", &bpm) == 0 || bpm < 0); 

這個循環打印,直到用戶的問題輸入一個有效的浮點數,且所述數量至少爲0

相關問題