Brauche Hilfe bei größter/kleinster Wert und prüfen ob Eingabe Integer ist
-
Hallo!
Ich hab hier ein Problem
Und zwar habe ich ein Programm geschrieben, dass eine, über eine Abfrage, festgelegte Anzahl Werte einliest und davon das Maximum, Minimum und den Durchschnitt ausgibt.Das läuft auch.
#include <stdio.h> #include <stdlib.h> int main() { int anzahlMesswert; float Messwert; float groesterMesswert; float kleinsterMesswert; float Mittelwert; float Summe = 0; int i; int c; printf("Anzahl der Messwerte N:"); scanf("%i", &anzahlMesswert); for (i = 1; i<=anzahlMesswert; i++) { printf("\n\n\n"); printf("Messwert Nummer:%i",i); printf("\nMesswert:", i+1); scanf("%f", &Messwert); printf("\n"); if(i == 1) { groesterMesswert = Messwert; kleinsterMesswert = Messwert; } else { if(Messwert < kleinsterMesswert) { kleinsterMesswert=Messwert; } if(Messwert>groesterMesswert) { groesterMesswert=Messwert; } } Summe=Summe+Messwert; Mittelwert=Summe/i; printf("Groester Messwert: %f\n",groesterMesswert); printf("Kleinster Messwert: %f\n", kleinsterMesswert); printf("Aktueller Messwert: %f\n", Messwert); printf("Mittelwert: %f\n",Mittelwert); } return 0; }
Jetzt möchte ich aber die Ausnahmeregelung für den ersten Wert entfernen (bei Wert 1 -> kleinster/größter Wert = Wert) und Prüfen ob die Eingabe positiv und ganzzahlig ist.
Meine Ideen:
Ich lege sinnvolle Startwerte für das Maximum/Minimum fest, mit denen ich dann ab Eingabe 1 arbeite. Als Maximum würde ich 0 nehmen als Minimum 32767.
Damit sollte die erste positive Eingabe auf jeden Fall das Maximum und Minimum sein.
Für die Prüfung obs eine ganze Zahl ist hab ich mir überlegt die Eingabe zu runden um dann zu schauen ob die Eingabe und das gerundete Ergebnis übereinstimmen.Mein Problem ist jetzt schon, dass er mir beim Max/Min komische Sachen ausgibt obwohl ich ja eigentlich gar nichts groß geändert habe.
aktuell:
#include <stdio.h> #include <stdlib.h> int main() { int anzahlMesswert; float Messwert; int groesterMesswert = 1; int kleinsterMesswert = 32767; float Mittelwert; float Summe = 0; int i; int c; int positivcount; int negativcount; printf("Anzahl der Messwerte N:"); scanf("%i", &anzahlMesswert); for (i = 1; i<=anzahlMesswert; i++) { printf("\n\n\n"); printf("Messwert Nummer:%i",i); printf("\nMesswert:", i+1); scanf("%f", &Messwert); printf("\n"); if(Messwert < kleinsterMesswert) { kleinsterMesswert=Messwert; } if(Messwert > groesterMesswert) { groesterMesswert=Messwert; } Summe=Summe+Messwert; Mittelwert=Summe/i; printf("Groester Messwert: %f\n",groesterMesswert); printf("Kleinster Messwert: %f\n", kleinsterMesswert); printf("Aktueller Messwert: %f\n", Messwert); printf("Mittelwert: %f\n",Mittelwert); } return 0; }
Thx schon mal.
-
Ok, ich habe grade gemerkt, dass ich groesterMesswert/kleinsterMesswert als Float deklarieren muss.
Aber warum?
-
Du solltest dir nochmal den Unterschied zwischen float und int klar machen und ob es sinnvol ist einen float-Wert auf int abzubilden.
Du musst dir auch ansehen, wie man diese unterschiedlichen Typen mit printf ausgibt.
-
Gimmick schrieb:
Meine Ideen:
Ich lege sinnvolle Startwerte für das Maximum/Minimum festDas ist ganz schön wackelig. Es könnte nur ein Wert eingegeben werden, oder
zwei Werte 1 und 32767.
Und dann hast du den Salat.Gimmick schrieb:
Für die Prüfung obs eine ganze Zahl ist hab ich mir überlegt die Eingabe zu runden um dann zu schauen ob die Eingabe und das gerundete Ergebnis übereinstimmen.
Dafür kannst du die Funktion modf benutzen.
http://www.cplusplus.com/reference/cmath/modf/
-
DirkB schrieb:
Du solltest dir nochmal den Unterschied zwischen float und int klar machen und ob es sinnvol ist einen float-Wert auf int abzubilden.
Du musst dir auch ansehen, wie man diese unterschiedlichen Typen mit printf ausgibt.Kopf-Tisch. An die Ausgab hab ich gar nicht gedacht. Thx!
[quote="CJosef"]
Gimmick schrieb:
Meine Ideen:
Ich lege sinnvolle Startwerte für das Maximum/Minimum festDas ist ganz schön wackelig. Es könnte nur ein Wert eingegeben werden, oder
zwei Werte 1 und 32767.
Und dann hast du den Salat.
]/quote]Im Code war ein Fehler drin, statt 1 würde ich 0 nehmen.
Ansonsten hm, versteh ich nicht so ganz was du meinst glaub ich.
Wenn ich größer-gleich und kleiner-gleich nehme sollte das ja kein Problem sein.
Dann wird die kleine/größte Zahl halt auch ersetzt wenn die neue Zahl nur gleich ist. Aber da sie ja gleich ist, ist das ja egal.
Ansonsten hab ich keine Idee wie ich das löse ohne eine vordefinierte Grenze zu haben und ohne für den ersten Wert eine Ausnahme einzubauen.CJosef schrieb:
Gimmick schrieb:
Für die Prüfung obs eine ganze Zahl ist hab ich mir überlegt die Eingabe zu runden um dann zu schauen ob die Eingabe und das gerundete Ergebnis übereinstimmen.
Dafür kannst du die Funktion modf benutzen.
http://www.cplusplus.com/reference/cmath/modf/Danke, aber das erscheint mir zu kompliziert.
Ich hab das jetzt mit Messwert == floor(Messwert) gemacht.
Sollte doch gehen.Hier noch mal mein Code vielleicht fällt euch ja noch irgendein unschöner Dussel auf ^^
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int anzahlMesswert; float Messwert; int groesterMesswert = 0; int kleinsterMesswert = 32767; float Mittelwert; float Summe = 0; int i; int c; int positivcount = 0; int negativcount = 0; printf("Anzahl der Messwerte N:"); scanf("%i", &anzahlMesswert); for (i = 1; i<=anzahlMesswert; i++) { printf("\n\n\n"); printf("Messwert Nummer:%i",i); printf("\nMesswert:", i+1); scanf("%f", &Messwert); printf("\n"); if ((Messwert >= 0) && (Messwert == floor(Messwert))) { positivcount++; if(Messwert <= kleinsterMesswert) { kleinsterMesswert=Messwert; } if(Messwert >= groesterMesswert) { groesterMesswert=Messwert; } Summe=Summe+Messwert; Mittelwert=Summe/i; printf("Groester Messwert: %i\n",groesterMesswert); printf("Kleinster Messwert: %i\n", kleinsterMesswert); printf("Aktueller Messwert: %f\n", Messwert); printf("Mittelwert: %f\n",Mittelwert); printf("Anzahl positiver Zahlen: %i", positivcount); } else { if(Messwert < 0) { printf("Keine negativen Eingaben erlaubt!\n"); i--; negativcount++; printf("Anzahl negativer Zahlen: %i", negativcount); } if (Messwert != floor(Messwert)) { printf("Nur ganzzahlige Eingaben erlaubt!"); i--; } } } return 0; }
-
Gimmick schrieb:
Im Code war ein Fehler drin, statt 1 würde ich 0 nehmen.
Ansonsten hm, versteh ich nicht so ganz was du meinst glaub ich.
Wenn ich größer-gleich und kleiner-gleich nehme sollte das ja kein Problem sein.Wenn, hattest du ja nicht.
Btw. hast du mal aus Spaß einen Buchstaben eigegeben?
Oder eine Zahl wie z.B. 9999999999999999999999999999999999999999999999999999999 ?
-
CJosef schrieb:
Gimmick schrieb:
Im Code war ein Fehler drin, statt 1 würde ich 0 nehmen.
Ansonsten hm, versteh ich nicht so ganz was du meinst glaub ich.
Wenn ich größer-gleich und kleiner-gleich nehme sollte das ja kein Problem sein.Wenn, hattest du ja nicht.
Btw. hast du mal aus Spaß einen Buchstaben eigegeben?
Oder eine Zahl wie z.B. 9999999999999999999999999999999999999999999999999999999 ?Ja stimmt hatte ich nicht
Ne hatte ich im Bewusstsein, dass es nicht geht auch nicht gemacht
Für die Prüfung ob ein Buchstabe drin vorkommt muss ich, soweit ich mich erinnere, mit isdigit jede einzelne Ziffer der Eingabe testen oder?
Und naja, meine obere Grenze ist so ne Mischung aus schätzen und gucken was vorkommen kann ^^
Macht es denn Sinn als Grenze die maximale mit 32bit Float zulässige Zahl zu nehmen? Oder wie begrenzt man das sinnvoll?
-
Gimmick schrieb:
Ich hab das jetzt mit Messwert == floor(Messwert) gemacht.
Sollte doch gehen.An diese einfachere Variante hatte ich gar nicht gedacht.
Hmm ... es ginge aber auch ganz ohne float, float bräuchtest du dann lediglich
für den Mittelwert.Gimmick schrieb:
Für die Prüfung ob ein Buchstabe drin vorkommt muss ich, soweit ich mich erinnere, mit isdigit jede einzelne Ziffer der Eingabe testen oder?
Buchstaben bleiben im Eingabestrom, das könnte man mit getchar abfragen.
Liest getchar ein \n ein, so wurde kein Buchstabe eigegeben.
Das behebt aber immer noch nicht das Problem der Eingabe von zu großen Zahlen
wie 999999999999999999999999999999999999999999999999999999999999999999999,
weil scanf das nicht als Fehler wertet.
Da müsste man schon die Eingabe in ein char Array einlesen und dieses auf Herz und Nieren prüfen und daraus den Wert dann mit sscanf einlesen.Gimmick schrieb:
Macht es denn Sinn als Grenze die maximale mit 32bit Float zulässige Zahl zu nehmen? Oder wie begrenzt man das sinnvoll?
Du kannst außerhalb der Schleife max = min = erster Wert setzen.
-
Dafür gibt es die Standardwerte FLT_MIN bzw. FLT_MAX aus limits.h.