2016-07-29 9 views
0

Ich habe einen Code, der die Anzahl der Peaks und ihre gegebenen Größen ausgibt. Die Eingabe hat die Form einer einzelnen Zeile, die zufällige Ganzzahlen enthält, die durch Leerzeichen voneinander getrennt sind. Ein Peak ist nur dann definiert, wenn er direkt vorangeht und um einen kleineren Wert folgt. Beispiele:Code misst Peaks nicht korrekt

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.*/ 

der Code nicht richtig verhalten, wenn die Eingangsdaten, c, mit einem rückläufigen Menge von Zahlen beginnen. zum Beispiel gibt die Eingabe: 9 8 7 6 5 4 eine Spitze von "9" zurück, wenn sie keine Größe zurückgeben sollte. eine andere Situation, in der es sich falsch verhält, ist, wenn wir die folgende Eingabe haben: 10 10 10 5 5 5 12 12 12 -1. es gibt eine Größe von "10" zurück, während es wiederum keine Größe zurückgeben sollte, weil es die Bedingungen eines Peaks nicht erfüllt.

Folgendes ist der Code:

#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); 
     }  
    } 

} 

i bevorzugen das Niveau der Codierung so minimal wie möglich zu halten, da ich nicht mehr als Schleifen und wenn Aussagen in dieser Phase getan haben.

+0

konnte man nicht '' scanf() 'nach all dem' if else' Block ?? –

+0

für Ihr 4. Beispiel '10 10 10 5 5 5 12 12 12 -1 'wenn das letzte Element eine positive Zahl kleiner als' 12 'ist, sagen Sie' 5 'sollte die Spitze nicht' 12 'sein? –

+0

Es kann leicht mit einem Array getan werden, aber zuerst muss ich die Problembeschreibung klar verstehen. –

Antwort

1

Das Problem wird verursacht, weil Sie Ihre Grenzwerte auf den minimal möglichen Wert initialisiert haben. Jeder mögliche Spitzenwert wird im Vergleich zu diesem Grenzwert positiv getestet.

Eine kleine Änderung behebt es, beiden Grenzwerte auf einen Wert eingestellt werden, die negativen Tests im Vergleich zu einem möglichen Spitzenwert:

int a = INT_MAX; 
int b = INT_MAX; 

Sie werden jedoch neue Linien erkennen und Ihre Werte zurücksetzen, wenn Sie möchte mehrere Eingabezeilen machen, aber ich glaube, das ist ein bestehendes Problem

+0

Danke. Dieser einfache Trick löste alles. Es funktioniert gut, da die Eingabe immer eine einzelne Zeile ist. Noch einmal vielen Dank. –

0

In diesem Fall sollten Sie versuchen, das Programm zu bitten, nachzuahmen, was Sie mit der Hand würden: Sie müssen 3 Wert, also betrachten Sie müssen 3 Werte lesen, bevor Sie nach einem Peak suchen. Und Sie sollten immer den Rückgabewert von scanf steuern, um das Dateiende oder eine falsche Eingabe verarbeiten zu können.

Ihr Code könnte geworden:

#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, über Code mehrzeiliges Eingabe ermöglicht.