Array Probelm --> Gelöst
-
Basher schrieb:
_matze schrieb:
Bemängelt wird dabei oft die Typunsicherheit, aber in vielen Fällen finde ich das ok und einfach praktisch.
ist ja auch praktisch. und das mit fehlender typsicherheit ist doch quark. so'n makro mit falschen typen gefüttert gibt auch 'nen compile-fehler.
Erstens das, und zweitens kann ein Makro ja auch Vorteile gegenüber einer Funktion haben. Das max()-Makro funktioniert auch mit float. Und performance-technisch ist es wohl das mögliche Maximum.
-
#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b))
also wenn ich des etzt richtig verstehe, dann kommt dieser teil ganz oben hin, vor int main()
aber was genau macht der teil?
sorry wenn ich mich so blöd anstelle aber ich hab keine ahnung
mit dfine max wird max gesetzt oder?
(a,b) sin bloß beliebige variablen??des dahinter müsste dann beschreiben in welchem fall max welchen wert annimmt, oder auch nicht
ich hab jetzt mal des mit dem array gemacht wie matze gesagt hat un des schau bei mir dann so aus:
# include <stdlib.h> # include <stdio.h> int main() { int Durchgang; int min; int Anzahl; int Zahl[Anzahl]; printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n"); scanf( "%d", &Anzahl); printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl); for( Durchgang = 1; Durchgang <= Anzahl; Durchgang = Durchgang + 1) { scanf( "%d", &Zahl[Anzahl]); } if( Zahl[0] < Zahl[1]) { min = Zahl[0]; printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", min); system ("pause"); } else { min = Zahl[1]; printf( "Die kleinste eingegebene Zahl war %d.\n", min); system ("pause"); } }
leider gibts für die kleinste zahl immer noch 16384 aus...
-
das problem ist die deklaration von
int Zahl[Anzahl];
du hast für
anzahl
keinen Wert definiert. wie auch, du weißt ihn ja beim starten des Programms noch nicht. Der benutzer soll es ja eingeben.Also wird das als "wert" genommen, was an der Stelle im Arbeitsspeicher steht, der nun für "Anzahl" reserviert ist. Das ist aber kein Wert, den du gebrauchen kannst. Da könnte auch "-14204753774" stehen.
Dein computer erzeugt also ein Array von der größe "egalWelcherSchrottAuchDaStehenMag"
also unsinniges zeug.
Eine Möglichkeit für dich wäre, erst den Benutzer die Größe angeben zu lassen:
int anzahl; printf("bitte anzahl eingeben"); scanf("%d",&anzahl); int zahl[anzahl];
das sollte funktionieren.
wurde aber schon erwähnt...
Lg Jann
-
Also da liegt noch einiges im Argen...
Hier mal ein kleines Beispiel, wie die von Probe-Nutzer vorgeschlagene Lösung aussehen könnte. Da siehst du auch mal, wie man die Makros verwendet und verstehst vielleicht eher, was es damit auf sich hat.
Vielleicht ist dieser Ansatz für dich auch erstmal leichter, da es mit den Arrays ja noch ein wenig hapert:#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #include <stdio.h> int main() { int Anzahl=0; int Zahl; int AktuellesMinimum=(int)((unsigned int)~0>>1); //ignoriere diese Zeile erstmal... ;) int AktuellesMaximum=0; printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n"); scanf( "%d", &Anzahl); if(Anzahl>0) { printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl); for( int Durchgang = 0; Durchgang < Anzahl; Durchgang++ ) { scanf( "%d", &Zahl); AktuellesMinimum=min(Zahl,AktuellesMinimum); AktuellesMaximum=max(Zahl,AktuellesMaximum); } printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", AktuellesMinimum); printf( "Die größte eingegebene Zahl war %d.\n", AktuellesMaximum); }else { printf("Sie müssen schon mehr als 0 Zahlen eingeben wollen..."); } { char c; while((c=getchar())!='\n'); //den Eingabepuffer leeren... } getchar(); //Schließen der Konsole verhindern return 0; }
Ansonsten kannst du für die Array-Variante diesen Thread noch mal ganz genau durchlesen (denn des Rätsels Lösung wurde schon mehrfach erwähnt).
Und bitte arbeite an deiner Einrückung!
http://de.wikipedia.org/wiki/Einrückungsstil
-
Keithy schrieb:
das problem ist die deklaration von
int Zahl[Anzahl];
Eine Möglichkeit für dich wäre, erst den Benutzer die Größe angeben zu lassen:
int anzahl; printf("bitte anzahl eingeben"); scanf("%d",&anzahl); int zahl[anzahl];
das sollte funktionieren.
wurde aber schon erwähnt...
Lg Jann
achso, das heißt ich setzte einfach int zahl[anzahl];
nach dem scanf
ich wusste garnich dass man z.b. int zahl au mitten rein setzen kann, dachte des geht nur am anfang...
trozdem kommt bei mir dann am ende nie des richtige raus
-
_matze schrieb:
Also da liegt noch einiges im Argen...
Hier mal ein kleines Beispiel, wie die von Probe-Nutzer vorgeschlagene Lösung aussehen könnte. Da siehst du auch mal, wie man die Makros verwendet und verstehst vielleicht eher, was es damit auf sich hat.
Vielleicht ist dieser Ansatz für dich auch erstmal leichter, da es mit den Arrays ja noch ein wenig hapert:#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #include <stdio.h> int main() { int Anzahl; int Zahl; int AktuellesMinimum=(int)((unsigned int)~0>>1); //ignoriere diese Zeile erstmal... ;) int AktuellesMaximum=0; printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n"); scanf( "%d", &Anzahl); if(Anzahl>0) { printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl); for( int Durchgang = 0; Durchgang < Anzahl; Durchgang++ ) { scanf( "%d", &Zahl); AktuellesMinimum=min(Zahl,AktuellesMinimum); AktuellesMaximum=max(Zahl,AktuellesMaximum); } printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", AktuellesMinimum); printf( "Die größte eingegebene Zahl war %d.\n", AktuellesMaximum); }else { printf("Sie müssen schon mehr als 0 Zahlen eingeben wollen..."); } { char c; while((c=getchar())!='\n'); //den Eingabepuffer leeren... } getchar(); //Schließen der Konsole verhindern return 0; }
Ansonsten kannst du für die Array-Variante diesen Thread noch mal ganz genau durchlesen (denn des Rätsels Lösung wurde schon mehrfach erwähnt).
Und bitte arbeite an deiner Einrückung!
http://de.wikipedia.org/wiki/Einrückungsstilwow, danke
ich schaus mir mal genauer an
-
ZockerFloh7 schrieb:
ich wusste garnich dass man z.b. int zahl au mitten rein setzen kann, dachte des geht nur am anfang...
In C89 geht's auch nicht, C99 kann das (und C++ sowieso). Ist ja auch meist praktischer und übersichtlicher, Variablen erst dann zu deklarieren, wenn man sie braucht.
-
etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen
eine frage hätt ich noch
was macht die zeile:int AktuellesMinimum=(int)((unsigned int)~0>>1);
-
ZockerFloh7 schrieb:
etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen
Das ist nur das, was Probe-Nutzer auf Seite 1 vorgeschlagen hatte.
ZockerFloh7 schrieb:
eine frage hätt ich noch
was macht die zeile:int AktuellesMinimum=(int)((unsigned int)~0>>1);
Ey, ich hab doch gesagt: ignorieren!
Na ja, die Zeile macht nix anderes als die Variable auf den maximalen (vorzeichenbehafteten) Wert zu setzen. Das sorgt dafür, dass der erste Vergleich mit einem eingelesenen Wert garantiert so ausfällt, dass dieser Wert zugewiesen wird. Würdest du diese Variable z.B. auf 0 setzen,würdest du logischerweise als Endergebnis immer 0 als Minimumwert bekommen (sofern kein negativer Wert eingegeben wurde). So sparen wir uns eine Spezialbehandlung der ersten Eingabe.
Wenn dich interessiert, wie genau das hier funktioniert, google mal nach "Bitshift" oder "Bitoperationen"...
-
_matze schrieb:
ZockerFloh7 schrieb:
etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen
Das ist nur das, was Probe-Nutzer auf Seite 1 vorgeschlagen hatte.
ZockerFloh7 schrieb:
eine frage hätt ich noch
was macht die zeile:int AktuellesMinimum=(int)((unsigned int)~0>>1);
Ey, ich hab doch gesagt: ignorieren!
Na ja, die Zeile macht nix anderes als die Variable auf den maximalen (vorzeichenbehafteten) Wert zu setzen. Das sorgt dafür, dass der erste Vergleich mit einem eingelesenen Wert garantiert so ausfällt, dass dieser Wert zugewiesen wird. Würdest du diese Variable z.B. auf 0 setzen,würdest du logischerweise als Endergebnis immer 0 als Minimumwert bekommen (sofern kein negativer Wert eingegeben wurde).
Wenn dich interessiert, wie genau das hier funktioniert, google mal nach "Bitshift" oder "Bitoperationen"...
jo, hab grad 0 eingegeben, stimmt
Danke