Funktion für Maximum
-
habe in der eile den negativbereich nicht berücksichtigt, muss natürlich und logischerweise berücksichtigt werden
-
-
DirkB schrieb:
max = values[0];
und du musst dir um den Wertebereich keine Gedanken mehr machen.
Allerdings ist die Funktion dann nicht mehr so "großzügig", falls man auf die Idee
kommen sollte, für die Parameter values/elemCount auch NULL/0 zuzulassen.
-
elemCount schrieb:
DirkB schrieb:
max = values[0];
und du musst dir um den Wertebereich keine Gedanken mehr machen.
Allerdings ist die Funktion dann nicht mehr so "großzügig", falls man auf die Idee
kommen sollte, für die Parameter values/elemCount auch NULL/0 zuzulassen.Dann ist das Maximum/Minimum sowieso undefiniert. Was ist das größte Element einer leeren Menge? Abstürzen sollte das Programm dadurch natürlich nicht, also sollte man das schon prüfen.
-
Danke für die tolle Hilfe! Da ist aber noch etwas was ich nicht verstehe.
Die Funktion gibt ja das Maximum an und eigentlich müsste dann ja bei der if-Anweisung durch vertauschen des von > in < das Minimum bestimmt werden. Dabei kommt aber 0 raus. Was habe ich beim Prinzip der Funktion falsch verstanden?int maximum(int values[], int elemCount) { int max = 0; for (int i = 0; i < elemCount; i++) { if (values[i] > max) /*Vertauschen von > in < gleich Minimum?*/ max = values[i]; } return max; } int myarr[5] = {5, 3, 9, 2, 10}; printf("%d\n", maximum(myarr, (int)(sizeof(myarr) / sizeof(int))));
-
stopopvic schrieb:
Was habe ich beim Prinzip der Funktion falsch verstanden?
int max = values[0]
-
stopopvic schrieb:
Was habe ich beim Prinzip der Funktion falsch verstanden?
Wer lesen kann und dies auch tut, ist klar im Vorteil.
Auch wenn es sowas altes ist wie Beiträge von Gestern.
-
Ich wollte das ganze jetzt mal ein wenig erweitern.
Ich habe da jetzt eine Endlosschleife eingefügt und das Programm soll nach jeder eingabe das gesamtmaximum ausgeben. Hier ein Beispiel:
Zahleneingabe: 123456
Max:6 Gesamtmax: 6
Zahleneingabe: 789012
Max:6(vorheriges Maximum) Gesamtmax: 9
.
.
usw.#include <stdio.h> int maximum(int values[], int elemCount) { int max = values[0]; for (int i = 0; i < elemCount; i++) { if (values[i] > max) max = values[i]; } return max; } int main () { int myarr[6]; int i; while (1){ for (i = 0; i <= 5; ++i) { printf("Zahl eingeben:"); scanf("%i",&myarr[i]); } printf("Maximum: %d\n", maximum(myarr, (int)(sizeof(myarr) / sizeof(int)))); printf("Minimum: %d\n", minimum(myarr, (int)(sizeof(myarr) / sizeof(int)))); } return 0; }
Muss da nur noch simpel umgestellt werden oder muss ich bei den arrays und der funktion noch etwas beachten?
-
EDIT: Das sollte aktuelles Maximum heißen im Beispiel und 9 statt 6 stehen.
-
Da du das Gesamtmaximum in main feststellst, brauchst du an der Funktion nichts ändern.
-
Wo wir bei dem Thema waren: Ich habe mal gehört, dass man das auch ohne Vergleichsoperatoren(!)& auch ohne Zeiger/Arrays programmieren kann. Dieser Ansatz hier scheint plausibel, aber ohne Arrays und Vergleichsoperatoren?
-
Wo wir gerade dabei sind... darf man Anwälte eigentlich als Vergleichsoperatoren bezeichnen?
-
Ja, man kann das Maximum/Minimum von zwei Zahlen auch durch geschickte Rechnung bestimmen:
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMaxOhne Arrays: Nun, Arrays sind nur ein Weg, Daten in einer Sequenz anzuordnen. Du brauchst hier ja nicht einmal eine Sequenz, es reicht ja sogar eine allgemeine Menge. Da gibt es haufenweise Mittel und Wege.
-
@Decimad: Tut mir leid, ich meine natürlich logische Operatoren.
@SeppJ: Das ist eine wirklich interessante Lösung. Das Problem besteht aber, wenn man anstatt integer Werte double oder float nimmt. Dann würden Bit-Operatoren nicht viel sinn machen. Eine wirkliche Lösung dafür habe ich bisher nicht gefnden.
-
Ok, jetzt bitte das Orginalproblem mit varaidic template Parametern! Sollte nicht allzu schwer sein. Auch wenn es die nicht in C++ gibt. Alternativ kann ja auch va_list benutzt werden.
-
Franzi42 schrieb:
@SeppJ: Das ist eine wirklich interessante Lösung. Das Problem besteht aber, wenn man anstatt integer Werte double oder float nimmt. Dann würden Bit-Operatoren nicht viel sinn machen. Eine wirkliche Lösung dafür habe ich bisher nicht gefnden.
Jetzt wird es wirklich clever: In IEEE 754 (das ist der Standard zur Darstellung von Fließkommazahlen, der praktisch universell benutzt wird) sind die Werte "lexikographisch" geordnet. Das heißt:
William Kahan (der hat's erfunden) schrieb:
if two floating-point numbers in the same format are ordered ( say x < y ), then they are ordered the same way when their bits are reinterpreted as Sign-Magnitude integers.
Zu deutsch: Du kannst die Werte als (signed) Integers (oder long, je nach Größe des Typs) auffassen und dann einen Integervergleich machen und erhältst das gleiche Ergebnis. Und den Integervergleich darfst du dann gerne auch mittels der Bittrickereien durchführen.
#include <limits.h> float float_max(float d1, float d2) { // Ohne C11 sollte man das anders prüfen: _Static_assert(sizeof(float)==sizeof(int), "Float und int müssen gleich groß sein"); int x = *(int*)(&d1); int y = *(int*)(&d2); int r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); return *(float*)(&r); } #include <stdio.h> void compare(float d1, float d2) { printf("Das Maximum von %f und %f ist %f\n", d1, d2, float_max(d1,d2)); } int main() { compare(1.4334, 2.33); compare(1.323, -2.23); compare(1./0., 9.423e16); }