Integer vergleichen und drei größte anzeigen
-
Moin zusammen =J
Ich habe ein Vorhaben, das ich gern umsetzen möchte, aber ich weiß nicht so recht, wie ich das bewerkstelligen kann... Kann mir jemand von euch dabei helfen?
Ich habe ein struct mit 10 int-Einträgen. Nun würde ich gern wissen, welche drei Int-Zahlen die größten sind, nachdem das Hauptprogramm mit dem Erhöhen der Zahlen fertig ist.
Muss ich nun verschiedene "if (a > b)"-Verschachtelungen schreiben, oder gibt es eine einfachere Möglichkeit? Da das Programm noch wachsen wird, gehe ich davon aus, dass es auch noch mehr als diese zehn struct-Einträge geben wird...Ich würde mich sehr über eine Antwort freuen =J
-
Zeig mal ein wenig Code, insbesondere wie deine struct aussieht. Vielleicht wäre für dich auch ein Array mit den ints der bessere Weg.
-
Den kleinsten Wert eines Arrays findest du z. B. so:
double min(double* data, int size) { double minimum = data[0]; for(int i = 1; i < size; ++i) if(data[i] < minimum ) minimum = data[i]; return minimum; }
-
struct innere_werte{ int intelligenz; int sportlichkeit; int magie; }
So sieht zur Zeit mein struct aus. (ich hab hier auf 3 Einträge verkürzt, der Übersicht halber)
Im Main steht die Abfrage, was gemacht werden soll:
printf("Es ist 8 Uhr. Was soll ich machen? \n"); printf("[1] Sport treiben | [2] Magie lernen | [3] Buch lesen\n"); scanf("%i",&auswahl); printf("%s", tagesplanung(auswahl));
und eine weitere Funktion "tagesplanung" ließt aus, was der Spieler möchte:
int tagesplanung (int auswahl) { switch (auswahl) { case 1: werte.sportlichkeit++; return ("Yay, Sport!\n"); break; case 2: werte.magie++; return ("Cool, Magie!\n"); break; case 3: werte.intelligenz++; return ("Ich mag Bücher!\n"); break; default: return printf("Falsche Eingabe\n"); return ("Falsche Eingabe"); }
Das Hochzählen funktioniert auch erstaunlich gut, so wie es ist. Die Abfragen, was gemacht werden soll, werden insgesamt 10x gemacht, am Ende habe ich also max die Zahl "10" in einem der Integer gespeichert.
Wie könnte ich es denn per Array verändern? Mit denen habe ich noch nicht allzuviele Erfahrungen gemacht und wenn, dann eher im char-Bereich
-
Meinen Funktion zum Bestimmen des kleinsten Wertes kannst du dann bestimmt auch zur Bestimmung des größten Wertes umändern
Die Abstraktion zum Bestimmen der 3 größten Werte solltes du auch schaffen.
struct innere_werte{ int attribute[3]; } int tagesplanung (int auswahl) { switch (auswahl) { case 1: werte.attribute[auswahl - 1]++; return ("Yay, Sport!\n"); break; case 2: werte.attribute[auswahl - 1]++; return ("Cool, Magie!\n"); break; case 3: werte.attribute[auswahl - 1]++; return ("Ich mag Bücher!\n"); break; default: return printf("Falsche Eingabe\n"); return ("Falsche Eingabe"); }
-
Die Struktur benötigst du gar nicht, wenn du dort nur Werte vom gleichen Typ ablegst. Mach dir ein enum mit allen Eigenschaften und greif mit den Werten auf dein Array zu.
enum { intelligenz, sportlichkeit, magie }; int werte [magie+1] = {0}; /* Wichtig ist es den letzten enum-Wert+1 zu nehmen, warum kannst du dir sicher denken. */ int tagesplanung (int auswahl) { switch (auswahl) { case 1: werte[sportlichkeit]++; return ("Yay, Sport!\n"); break; case 2: werte[magie]++; return ("Cool, Magie!\n"); break; case 3: werte[intelligenz]++; return ("Ich mag Bücher!\n"); break; default: return printf("Falsche Eingabe\n"); return ("Falsche Eingabe"); }
-
Ah, dankeschön...
Und nur des Verständnisses halber, verstehe ich das richtig, dass:
Das Enum festlegt, welche "Zustände" der Int-Wert haben kann und bei dem "int wert [magie+1] = {0} der Array ist?
Also müsste ich für sportlichkeit ein
int wert [sportlichkeit+1] = {0}
eintragen, oder? Ich denke mir mal, dass das +1 dafür da ist, da "0" auch als Wert möglich ist, oder?@Highligerbimbam: Tut mir Leid, aber ich verstehe deine Variante nicht so richtig
Woher weiß das obere int werte [3] denn, welcher Wert am Ende von 10 Runden z.B. zu "Sportlichkeit" gehört?
-
Aus dem selben Grund wie bei hav a break. Mit den Enums würde man es auch machen, ich wollte dir nur auf die Schnelle näherbringen wie man es in einem Array schreiben kann. Wenn bei meiner Variante Auswahl = 3 ist, dann wird das 3 te Elemente (also attribute[2]/attribute[auswahl - 1] da Index mit 0 beginnt muss eins abgezogen werden) angesprochen. Bei anderer Auswahl hält sich das Ähnlich.
Und mir scheint du hast das mit den Enums komplett falsch verstanden. Ein Enum ist nur ein Wert standardmäßig wenn nichts anderes angegeben bei 0 aufzählend. Das +1 kommt wegen dem Unterschied von Größe und Index. Bei der Deklarierung musst du die Größe angeben. Bei z.B. 3 würde das Array aber ur die Elemente 0,1,2 haben. Da durch das Enum die Attribute
intelligenz = 0 sportlichkeit = 1 magie = 2
erhälst du ohne die Addition ein Array mit zu wenig Elementen. Wenn dann noch darauf zugegriffen wird knallt es.
-
Ich habe es mal überflogen, und verstehe nicht genau was er vorhat.
Aber wenn du die drei größten elemente in einem Int-Array ausgeben möchtest, sortier es einfach, und gib die ersten drei aus...