2016-07-29 105 views
0

我有一個代碼可以打印出峯值的數量和它們的給定量值。輸入形式爲單行,其中包含由空格分隔的隨機整數。只有在之前和之後的的值較小時,峯才被定義爲如此。 例子:代碼沒有正確評估峯值

0 4 18 18 26 40 40 29 25 2 0   //has one peak of magnitude 40. 
20 10 20   /*has no peaks, because both 20's are either not 
        preceded or followed by a smaller number.*/ 

代碼無法正確表現當輸入數據,c,便從一組數字的下降。例如, 輸入:9 8 7 6 5 4返回一個「9」的峯值,當它不應該返回任何幅度。 行爲不正確的另一種情況是當我們有以下輸入:10 10 10 5 5 5 12 12 12 -1。它返回一個「10」的數量級,同樣,它不應該返回任何數量級,因爲它不符合峯值條件。

以下是代碼:

#include <stdio.h> 
int main(void) 
{ 

    int a = 0; 
    int b = 0; 
    int c = 0; 
    int counter = 0; 

    scanf("%d", &c); 
    printf("Number Magnitude\n"); 


    while (c >= 0){ 

     if ((b > a) && (b > c)) {  //to check if we have a peak  
      counter++; 
      printf("%4d%11d\n", counter, b); 
      a = b; 
      b = c; 
      scanf("%d", &c); 

     } 

     else if ((a < b) && (b == c)) { 
      b = c; 
      scanf("%d", &c); 
     } 
     else { 
      a = b; 
      b = c; 
      scanf("%d", &c); 
     }  
    } 

} 

我寧願保持編碼儘可能最小的水平,因爲我沒有做過比循環,如果在這個階段語句的。

+0

難道你不能在所有'if else'塊之後寫單個'scanf()'嗎? –

+0

你的第四個例子'10 10 10 5 5 12 12 12 -1'如果最後一個元素是小於'12'的正數,說'5'不應該是'12'? –

+0

它可以很容易地使用數組完成,但首先我必須清楚地瞭解問題描述。 –

回答

1

該問題是由於您將邊界值初始化爲最小可能值而導致的。與該邊界值相比,任何可能的峯值都會測試爲正值。

一個小小的改變修復它,無論是邊界值應設置相比,任何可能的峯值,測試負的值:

int a = INT_MAX; 
int b = INT_MAX; 

你不過來檢測新行,如果您重置價值希望能夠做到多行輸入,但我相信這是一個存在的問題

+0

謝謝。這個簡單的技巧解決了這一切。它工作得很好,因爲輸入將始終是單行。再次感謝。 –

0

在這種情況下,你應該試着讓程序模仿你想要的手法:你必須考慮3個值,所以在測試峯值之前,您必須讀取3個值。而且您應該始終控制從scanf返回的值,以便能夠處理和結束文件或輸入錯誤。

您的代碼將變成:

#include <stdio.h> 
int main(void) 
{ 

    int a = 0; 
    int b = 0; 
    int c = 0; 
    int counter = 0; 
    int cr; 

    cr = scanf("%d%d%d", &a,&b,&c); 
    if (cr != 3) { 
     printf("Incorrect input\n"); 
     return 1; 
    } 
    printf("Number Magnitude\n"); 


    while ((cr > 0) && (c >= 0)) { 

     if ((b > a) && (b > c)) {  //to check if we have a peak  
      counter++; 
      printf("%4d%11d\n", counter, b); 
      a = b; 
      b = c; 
     } 

     else if ((a >= b) || (b != c)) { 
      a = b; 
      b = c; 
     } // nothing to do if a<b and b==c 
     cr = scanf("%d", &c); // read once outside of the loop 
    } 
    return 0; 
} 

BTW,上面的代碼允許多行輸入。