2016-10-22 1 views
3

erhalten Dieses Programm wurde entwickelt, um 3 ganze Zahlen und ordnen sie in aufsteigender Reihenfolge. Wenn ich eine Kombination wie "12 8 2" eingabe, bekomme ich eine Ausgabe von "1995099040 8 12". Irgendwelche Hilfe mit, warum ich diese Antwort bekomme?Ich frage mich, warum ich eine zufällige Ganzzahl als meine Ausgabe in diesem Programm

#include <stdio.h> 
#include <stdlib.h> 

int findBig(int d, int e, int f) { 
    if ((d >= e) && (d >= f)) { 
     return d; 
    } else 
    if ((e >= d) && (e >= f)) { 
     return e; 
    } else 
    if ((f >= e) && (f >= d)) { 
     return f; 
    } 
} 

int main(void) { 
    const int MAX_NUM = 3; 
    int userArray[MAX_NUM]; 
    int bigNum; 
    int midNum; 
    int smallNum; 
    int j = 0; 
    int a; 
    int b; 
    int c; 

    printf("Please enter three integers separated by spaces:\n"); 

    for (j = 0; j < MAX_NUM; ++j) { 
     scanf("%d", &userArray[j]); 
    } 
    a = userArray[0]; 
    b = userArray[1]; 
    c = userArray[2]; 

    bigNum = findBig(a, b, c); 

    if (bigNum == a) { 
     midNum = findBig(0, b, c); 
    } else 
    if (bigNum == b) { 
     midNum = findBig(a, 0, c); 
    } else 
    if (bigNum == c) { 
     midNum = findBig(a, b, 0); 
    } 
    if ((midNum == a) && (bigNum == b)) { 
     smallNum = c; 
    } else 
    if ((midNum == b) && (bigNum == c)) { 
     smallNum = a; 
    } else 
    if ((midNum == c) && (bigNum == a)) { 
     smallNum = b; 
    } 

    printf("%d %d %d\n", smallNum, midNum, bigNum); 

    return 0; 
} 
+2

Die Strategie der Lese Zahlen in ein Array ist gut, aber alles, was danach ist keine gute Art zu arbeiten. Sie sollten das Array wahrscheinlich nur sortieren, damit Sie die Werte in der erforderlichen Reihenfolge trivial auswählen können.Was Sie haben, ist mehr oder weniger in Ordnung als eine Übung beim Schreiben von "Wenn" -Aussagen, aber ansonsten lässt viel zu wünschen übrig. –

Antwort

7

smallNum Aufenthalte mit dem Junk-Wert wird es, wenn es erstellt wird, weil Sie nicht die Fälle, alle für die Werte deckten möglich bigNum und midNum, so dass es keinen Wert in bestimmten Fällen zugewiesen bekommen - wie der, mit dem Sie das Problem hatten - und bleibt uninitialisiert.

Sicherstellen, dass alle möglichen Fälle überprüfen:

if((midNum == a) && (bigNum == b)){ smallNum = c; } 
else if((midNum == b) && (bigNum == c)){ smallNum = a; } 
else if((midNum == c) && (bigNum == a)){ smallNum = b; } 
else if((midNum == b) && (bigNum == a)){ smallNum = c; } 
else if((midNum == c) && (bigNum == b)){ smallNum = a; } 
else if((midNum == a) && (bigNum == c)){ smallNum = b; } 

Bedenken Sie auch integrierte Funktionen verwenden, Zeit und Code zu speichern - Sie haben die max und min Funktion genau dort, Ihnen zu helfen .

Um die maximal drei Nummern finden Sie max(max(a, b), c) verwenden können - so können wir den Code zu

smallNum = min(min(a, b), c); 
bigNum = max(max(a, b), c); 
midNum = (a + b + c) - smallNum - bigNum; 

verkürzen

+0

Welche Sprache unterstützt 'max ({a, b, c})'? Außerdem kann 'midNum = min (max (a, b), c);' die korrekte Zahl für 'a = 1, b = 2, c = 0' nicht identifizieren. – chqrlie

+0

C++ anscheinend. Fest, danke. – Uriel

+0

interessante Alternative zu 'midNum' zu bestimmen, aber nicht vollständig OK: es ruft undefiniertes Verhalten auf, wenn' a + b + c' unter anderen Möglichkeiten arithmetischen Überlauf verursacht. – chqrlie

0

Sie Müll Ausgabe (Das wird den Code und machen findBig unnötig halbieren) bekommen, weil Ihr Code ruft undefiniertes Verhalten auf: für die Eingabe 12 8 2, der Fall (midNum == b) && (bigNum == a) wird nicht im Code behandelt und smallNum bleibt nicht initialisiert.

#include <stdio.h> 

int main(void) { 
    const int MAX_NUM = 3; 
    int userArray[MAX_NUM]; 
    int x; 

    printf("Please enter three integers separated by spaces:\n"); 

    for (int j = 0; j < MAX_NUM; ++j) { 
     if (scanf("%d", &userArray[j]) != 1) 
      exit(1); 
    } 
    if (userArray[0] > userArray[1]) { 
     x = userArray[0]; userArray[0] = userArray[1]; userArray[1] = x; 
    } 
    if (userArray[1] > userArray[2]) { 
     x = userArray[1]; userArray[1] = userArray[2]; userArray[2] = x; 
    } 
    if (userArray[0] > userArray[1]) { 
     x = userArray[0]; userArray[0] = userArray[1]; userArray[1] = x; 
    } 

    printf("%d %d %d\n", userArray[0], userArray[1], userArray[2]); 

    return 0; 
} 
1

Es gibt 6 Fälle zu prüfen, um zu bestimmen, smallNum:

Sie können den Code durch Neuanordnung des Arrays mit 3 Tests und Swaps vereinfachen.

if((midNum == a) && (bigNum == b) || ((midNum == b) && (bigNum == a))){ 
smallNum = c; 
} 
else if((midNum == b) && (bigNum == c) || ((midNum == c) && (bigNum == b))){ 
smallNum = a; 
} 
else if((midNum == c) && (bigNum == a) || ((midNum == a) && (bigNum == c))){ 
smallNum = b; 
} 

Der Müll ist wegen der fehlenden Fälle.

0

Ich stimme den anderen Antworten zu - Ihr Code berücksichtigt nicht alle 6 Möglichkeiten, in denen die Werte bestellt werden könnten.

Eine Möglichkeit, dieses Problem zu beheben: Erstens, Ihre Funktion „Maximum finden“ ändern, so dass es einen Index anstelle eines Wertes zurückgibt:

int findBig(int d, int e, int f) { 
    if ((d >= e) && (d >= f)) { 
     return 0; // index of largest element is 0 
    } else 
    if ((e >= d) && (e >= f)) { 
     return 1; // index of largest element is 1 
    } else 
    if ((f >= e) && (f >= d)) { 
     return 2; // index of largest element is 2 
    } 
} 

Dann finden die Zahl groß, klein und Median:

bigIndex = findBig(a, b, c); 
smallIndex = findBig(-a, -b, -c); // a hack to find the minimum instead of maximum 
if (bigIndex == smallIndex) 
{ 
    // Edge case - all numbers are equal 
    // Doesn't matter which index is which; just choose 3 different ones 
    bigIndex = 0; 
    midIndex = 1; 
    smallIndex = 2; 
} 
else 
{ 
    // Choose the index that is neither big nor small 
    midIndex = 3 - bigIndex - smallIndex; 
} 

sie dann drucken:

printf("%d %d %d\n", userArray[smallIndex], userArray[midIndex], userArray[bigIndex]); 

Hier hilft es, dass Sie ein Array haben. Andernfalls wäre es immer noch möglich sein, einen Index auf einen Wert etwas zu konvertieren es hässlich sein würde:

printf("%d %d %d\n", 
    smallIndex == 0 ? a : smallIndex == 1 ? b : c, 
    midIndex == 0 ? a : midIndex == 1 ? b : c, 
    bigIndex == 0 ? a : bigIndex == 1 ? b : c); 
Verwandte Themen