*
@tbird sagte in Bestimmen der größten und kleinsten Zahl mit möglichst wenig if verknüpfungen:
@john-0 und nun erkläre mir bitte, was dieser Code macht.
Verstehe mich nicht falsch, ich bin selbst seit 15 Jahren in der Programmierung - aber dein code ist nicht lesbar - zumindest nicht einfach.
Das sollte er aber sein, da es wirklich nur ein paar Codezeilen sind. Die Aufgabe war von vier Zahlen die größte herauszufinden. Wenn man zwei Zahlen in C t1 = a[1] < a[2] vergleicht, dann ist das Ergebnis auch als int interpretierbar und der Vergleich liefert immer 0 oder 1 zurück. Macht man auch noch der Vergleich andersherum t2 = a[1] > a[2] weiß man ob eine Zahl größer als die andere ist oder ob sie gleich sind.
Damit das keinen Unfug zurückliefert (das fehlte hier im Code), schreiben wir zuerst eine der beiden Zahlen in das Arrayelement a[0].
int greatest (int a[5]) {
a[0] = a[1]; // Das brauchen wir nur im Fall, dass beide Zahlen gleich sind.
// Es ist somit egal, ob a[1] oder a[2] genommen wird.
int t1 = a[1] > a[2];
int t2 = a[2] > a[1];
Es gibt nun drei mögliche Zustände, (t1 == 1, t2 == 0); (t1 == 0, t2 == 1); (t1 == 0, t2 == 0). Der Fall t1 und t2 sind null ist einfach, dann sind beide Zahlen gleich. Ist t1 eins, dann ist a[1] größer als a[2]. Man könnte jetzt einfach t1 + t2 rechnen, das würde für die beiden betrachteten Fälle gerade den Index des Feldes ergeben. Allerdings wenn t2 == 1, dann passt das noch nicht. Multipliziert man t2 noch mit dem Feldindex stimmt es.
int s1 = t1 + (2 * t2);
D.h. in s1steht nun der Index des Feldelements. Analog verfährt man mit den anderen Zahlen im Array.
Verwende doch bitte aussagekräftige Variablennamen - das macht die Sache einfacher. Stichwort Clean Code.
Ich denke nicht, dass das hier etwas ändern würde. Doku wäre in diesem Fall eher angesagt, aber weil hier der OP selbst nachdenken sollte, habe ich das weggelassen.
Nachfolgend korrekt funktionierenden Code. Das sieht etwas grausig aus, wegen der Syntax für Zeiger auf Feld mit konstanter Größe. Das muss in C leider so sein.
#include <stdio.h>
#include <stdlib.h>
void assign (int (* const p)[5], const int a, const int b, const int c, const int d) {
(*p)[1] = a;
(*p)[2] = b;
(*p)[3] = c;
(*p)[4] = d;
}
void print_array(int (* const p)[5]) {
printf ("\n[%3i,%3i,%3i,%3i]\n", (*p)[1], (*p)[2], (*p)[3], (*p)[4]);
}
int greatest (int (* const a)[5]) {
int t1, t2, s1, s2;
(*a)[0] = (*a)[1];
t1 = (*a)[1] > (*a)[2];
t2 = (*a)[2] > (*a)[1];
s1 = t1+(2*t2);
t1 = (*a)[s1] > (*a)[3];
t2 = (*a)[3] > (*a)[s1];
s2 = (s1*t1) + (3*t2);
(*a)[0] = (*a)[s2];
t1 = (*a)[s2] > (*a)[4];
t2 = (*a)[4] > (*a)[s2];
s1 = (s2*t1) + (4*t2);
return s1;
}
int smallest (int (* const a)[5]) {
int t1, t2, s1, s2;
(*a)[0] = (*a)[1];
t1 = (*a)[1] < (*a)[2];
t2 = (*a)[2] < (*a)[1];
s1 = t1+(2*t2);
t1 = (*a)[s1] < (*a)[3];
t2 = (*a)[3] < (*a)[s1];
s2 = (s1*t1) + (3*t2);
(*a)[0] = (*a)[s2];
t1 = (*a)[s2] < (*a)[4];
t2 = (*a)[4] < (*a)[s2];
s1 = (s2*t1) + (4*t2);
return s1;
}
int main () {
int arr[5];
int r;
assign (&arr, -10, -10, -5, -1);
print_array(&arr);
r = greatest(&arr);
printf(" Größter Wert: arr[%i]=%3i\n", r, arr[r]);
r = smallest(&arr);
printf("Kleinster Wert: arr[%i]=%3i\n", r, arr[r]);
assign (&arr, 10, 10, 5, 5);
print_array(&arr);
r = greatest(&arr);
printf(" Größter Wert: arr[%i]=%3i\n", r, arr[r]);
r = smallest(&arr);
printf("Kleinster Wert: arr[%i]=%3i\n", r, arr[r]);
assign (&arr, 4, 3, 2, 1);
print_array(&arr);
r = greatest(&arr);
printf(" Größter Wert: arr[%i]=%3i\n", r, arr[r]);
r = smallest(&arr);
printf("Kleinster Wert: arr[%i]=%3i\n", r, arr[r]);
assign (&arr, 1, 2, 3, 3);
print_array(&arr);
r = greatest(&arr);
printf(" Größter Wert: arr[%i]=%3i\n", r, arr[r]);
r = smallest(&arr);
printf("Kleinster Wert: arr[%i]=%3i\n", r, arr[r]);
return EXIT_SUCCESS;
}