2010-12-06 3 views
9

Gibt es eine einfachere und bessere Möglichkeit, dieses Problem zu lösen, weilEinfachere Weise drei Zahlen des Sortierens

  1. ich zu viele Variablen.
  2. habe ich so viele if else Aussagen
  3. Ich tat dies die Brute-Force-Methode unter Verwendung von

Schreiben Sie ein Programm, das drei ganze Zahlen als Eingabe und gibt die Zahlen, um zu erhöhen.
Verwenden Sie keine Schleife/Array.

#include <stdio.h> 
main(){ 
    int no1; 
    int no2; 
    int no3; 
    int sto; 
    int hi; 
    int lo; 

    printf("Enter No. 1: "); 
    scanf("%d", &no1); 
    printf("Enter No. 2: "); 
    scanf("%d", &no2);   
    printf("Enter No. 3: "); 
    scanf("%d", &no3); 

    if (no1>no2) { 
     sto=no1;  
     lo=no2; 
    } else { 
     sto=no2; 
     lo=no1; 
    } 
    if (sto>no3) { 
     hi=sto;  
     if(lo>no3){   
     sto=lo;     
     lo=no3; 
     }else { 
     sto=no3;  
     }   
    }else hi=no3; 

    printf("LOWEST %d\n", lo); 
    printf("MIDDLE %d\n", sto); 
    printf("HIGHEST %d\n", hi); 

    getch(); 
}  

Antwort

12
if (a > c) 
    swap(a, c) 

if (a > b) 
    swap(a, b) 

//Now the smallest element is the first one. Just check the 2-nd and 3-rd 

if (b > c) 
    swap(b, c); 

Hinweis: Swap ändert die Werte von zwei Variablen.

+5

Wenn Sie den halben Code hinter einer 'swap()' Funktion verstecken und so tun, als ob es nur 3 Zeilen Code wären; warum nicht alles in einer 'sort3()' Funktion verstecken und so tun, als wäre es nur eine Zeile? Wenn Sie die Funktion 'swap()' zeigen, hat das OP zumindest eine Chance, den ursprünglichen Code (ohne 'swap()') zu erkennen, der für die Performance überlegen ist. – Brendan

6

Rufen Sie die drei Variablen x, y und z, dann:

if (x > y) swap(x, y); 
if (y > z) swap(y, z) 
if (x > y) swap(x, y); 

Schreiben der swap Funktion wird für den Leser als Übung. Hinweis: Möglicherweise müssen Sie Zeiger verwenden.

2

Ja, es gibt einen viel besseren Weg, aber Sie müssen Schleifen und Arrays verwenden.

Wahrscheinlich, für eine einführende Klasse, ist Ihre Antwort die Antwort, die sie suchen.

Es gibt Möglichkeiten, Schleifen mit for/while (Rekursion, goto, etc) zu bekommen. Und Möglichkeiten, etwas wie ein Array ohne Indexierung zu erhalten (int *ptr = malloc (3 * sizeof(int)), und dann mit *(ptr+index) indexieren). Aber ich finde es schwer zu glauben, dass sie das wollen.

+0

danke. Ich werde auch versuchen, dies zu studieren – newbie

+1

Es ist wahrscheinlich nicht für dieses Problem wert - ich denke, Ihre Antwort mit einigen der von anderen vorgeschlagenen Änderungen (swap, zum Beispiel) ist, was Ihr Lehrer sucht. Meine Vorschläge sind, wie man Schleifen und Array-Verhalten ohne Schleifen oder Arrays bekommt, aber irgendwie nicht im Sinne der Frage, die dein Lehrer stellt (denke ich) –

4

Hinweis: Wenn Sie 3 Zahlen haben, a, b und c, ist min (a, min (b, c)) die kleinste, max (a, max (b, c)) ist die größte, und Angesichts der kleinsten und größten Zahlen sollte es leicht sein, die dritte zu finden.

5
#include <stdio.h> 
#define min(a,b) ((a)<(b)?(a):(b)) 
#define max(a,b) ((a)>(b)?(a):(b)) 
int main(){ 
    int a, b, c; 
    int hi; 
    int lo; 

    printf("Enter No. 1: "); 
    scanf("%d", &a); 
    printf("Enter No. 2: "); 
    scanf("%d", &b);   
    printf("Enter No. 3: "); 
    scanf("%d", &c); 

    lo = min(min(a, b), c); 
    hi = max(max(a, b), c); 
    printf("LOWEST %d\n", lo); 
    printf("MIDDLE %d\n", a+b+c-lo-hi); 
    printf("HIGHEST %d\n", hi); 

    getchar(); 
}  
-3

Wenn wir für eine minimale Anzahl von Vergleichen als effizienteste Lösung aussehen 3 Elemente sortiert werden, gehen Sie wie folgt Implementierung

public static void Sort3Elements(int a, int b, int c) 
    { 
     if (a <= b && a <= c)    //a is lowest here 
     { 
      if (b<=c)      //a <= b <= c 
       Console.WriteLine("{0}-{1}-{2}", a, b, c); 
      else       //a <= c <= b 
       Console.WriteLine("{0}-{1}-{2}", a, c, b); 
     } 
     else if (b<=a && b<=c)    //b is lowest here 
     { 
      if (a <= c)      //b <= a <= c 
       Console.WriteLine("{0}-{1}-{2}", b, a, c); 
      else       //b <= c <= a 
       Console.WriteLine("{0}-{1}-{2}", b, c, a); 
     } 
     else        //c is lowest 
     { 
      if (a <= b)      //c <= a <= b 
       Console.WriteLine("{0}-{1}-{2}", c, a, b); 
      else        //c <= b <= a 
       Console.WriteLine("{0}-{1}-{2}", c, b, a); 
     } 
    } 
+1

Diese Antwort stützt sich vollständig auf den Inhalt externer Links. Sollten sie jemals ungültig werden, wäre Ihre Antwort nutzlos. Also bitte [bearbeiten] Sie Ihre Antwort und fügen Sie mindestens eine Zusammenfassung dessen hinzu, was dort zu finden ist. Vielen Dank! –

+0

Sinn machen, werde ich bald die Antwort posten. –

+0

Nur eine Frage, ist 'Console.WriteLine' Teil von C? –

0

die min finden, Mitte und max von 3 Werte, können Sie den ternären Operator verwenden. Sie können entweder Ihre gesamte Arbeit innerhalb des Hauptteils Ihres Codes ausführen, oder Sie können die minof3, midof3 und maxof3 Berechnungen in wiederverwendbare Funktionen trennen.

Im Fall von min und max Sie einfach 2 von 3 möglichen Vergleiche machen, und dann einen Vergleich der Ergebnisse zurück.Im Falle von Mitte, tun Sie das gleiche, aber die min und max der 3 Werte berechnen und prüfen alle 3 gegen min und max, um den Wert zu finden, die weder die min oder max. (Sie können diesen Teil im Hauptteil Ihres Codes ohne eine zusätzliche Funktion ausführen, indem Sie die Min- und Max-Werte als Variablen deklarieren und dort eliminieren).

die Stücke Putting zusammen, könnten Sie etwas Ähnliches wie die folgenden tun, die die ersten drei Argumente als die Werte nimmt zu sortieren (oder verwendet Standardwerte von 99, 231, 8 wenn ein benötigtes Wert nicht angegeben ist)

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

/** direct ternary comparison of 3 values */ 
long minof3 (long a, long b, long c) { 
    long x = a < b ? a : b, 
     y = a < c ? a : c; 
    return x < y ? x : y; 
} 

long maxof3 (long a, long b, long c) { 
    long x = a > b ? a : b, 
     y = a > c ? a : c; 
    return x > y ? x : y; 
} 

long midof3 (long a, long b, long c) { 
    long x = minof3 (a, b, c), 
     z = maxof3 (a, b, c), 
     y = a == x ? b : a; 
    return y == z ? c : y; 
} 

int main (int argc, char **argv) { 

    long x = argc > 1 ? strtol (argv[1], NULL, 10) : 99, 
     y = argc > 2 ? strtol (argv[2], NULL, 10) : 231, 
     z = argc > 3 ? strtol (argv[3], NULL, 10) : 8; 

    printf ("\n sorted values : %ld, %ld, %ld\n", 
      minof3 (x, y, z), midof3 (x, y, z), maxof3 (x, y, z)); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/sort3 
sorted values : 8, 99, 231 

$ ./bin/sort3 -23 -281 1031 
sorted values : -281, -23, 1031 

(ja, ich weiß, das ist eine alte Post, aber die jüngsten Kommentare über Code hinter der swap Funktion, ein vollständiges Beispiel war versteckt gegeben in Auftrag).

0

Einfachster Weg ist vergleichen und swap.Order von wenn Bedingungen wichtig sind.

if(a>b) 
    swap(a,b); 
if(a>c) 
    swap(a,c); 
if(b>c) 
    swap(b,c); 
Verwandte Themen