Array Probelm --> Gelöst
-
_matze schrieb:
Nö, hier auch nicht. Auch er ganze C-Kram wird mit dem VS und damit mit C89 gemacht. Ich vermute, es geht vielen so.
nö, die meisten compiler, die ich benutze, können c99, zumindest teilweise.
naja, es wird aber auch viel code wiederverwendet, der noch aus der vor-c99-ära stammt.
-
_matze schrieb:
int x; int min; int Zahl[x];
Du legst hier eine Variable x an, weist ihr aber keinen Wert zu. Ihr Wert ist also nicht definiert (halt das, was da zufällig an der Stelle im Speicher steht). Und diese 'Zufallszahl' nimmst du dann als Größenangabe für dein Array. Das kann nicht gut gehen.
Außerdem sollte das einen Compiler-Error geben, weil x nicht const ist und als Größenangabe verwendet wird (oder kann C99 das? Wie war das noch gleich?).
Abgesehen davon steht die Größe des Arrays für dich erst später durch die Benutzereingabe fest. Also ist es Quatsch, das Array schon vorher anzulegen.
EDIT: Und mach aus dem unteren [code] mal [/code]. Oder nimm gleich besser [cpp].
okay, aber irgendwie muss ich doch angeben wie viele arrays verwendet werden sollen oder? und das hängt von der anzahl der eingaben des benutzers ab...
wie könnt ichs anders machen?
compiler error gabs nich, benutze dev c++
-
Hallo,
ZockerFloh7 schrieb:
okay, aber irgendwie muss ich doch angeben wie viele arrays verwendet werden sollen oder? und das hängt von der anzahl der eingaben des benutzers ab...
wie könnt ichs anders machen?Es geht anders, du benötigst tatsächlich kein Array, denn das Endergebnis soll nur die jeweils größte/kleinste aller eingegebenen Zahlen sein, die ganze Zahlenreihe, die der Benutzer sich ausgedacht hat, muss also nicht gespeichert werden. Du brauchst nur eine min-/max- und aktuelleZahl-Variable, das reicht schon. Denk mal darüber nach... (wenn die Aufgabe natürlich den Einsatz von Arrays verlangt, dann vergiss meine obigen Ausführungen, und hole dir dynamisch Speicher mit malloc, wenn du schon soweit bist, das einzusetzen).
Probe-Nutzer
-
Probe-Nutzer schrieb:
Hallo,
ZockerFloh7 schrieb:
okay, aber irgendwie muss ich doch angeben wie viele arrays verwendet werden sollen oder? und das hängt von der anzahl der eingaben des benutzers ab...
wie könnt ichs anders machen?Es geht anders, du benötigst tatsächlich kein Array, denn das Endergebnis soll nur die jeweils größte/kleinste aller eingegebenen Zahlen sein, die ganze Zahlenreihe, die der Benutzer sich ausgedacht hat, muss also nicht gespeichert werden. Du brauchst nur eine min-/max- und aktuelleZahl-Variable, das reicht schon. Denk mal darüber nach... (wenn die Aufgabe natürlich den Einsatz von Arrays verlangt, dann vergiss meine obigen Ausführungen, und hole dir dynamisch Speicher mit malloc, wenn du schon soweit bist, das einzusetzen).
Probe-Nutzer
ich bin absoluter anfänger, also wie mache ich min-/max- und aktuelleZahl-Variable? Meinst du sowas wie, dass jede eingegebene Zahl mit der nächsten eingegebenen verglichen wird und dann davon die größere bzw. kleinere wieder in die variable gespeichert wird?
-
ZockerFloh7 schrieb:
okay, aber irgendwie muss ich doch angeben wie viele arrays verwendet werden sollen oder? und das hängt von der anzahl der eingaben des benutzers ab...
wie könnt ichs anders machen?
compiler error gabs nich, benutze dev c++Richtig, die Anzahl der Elemente des Arrays (es ist ein Array, das mehrere Elemente beinhaltet, nicht mehrere Arrays) soll von der Benutzereingabe abhängen. Daher ist es ratsam, das Array nicht vorher mit einer fixen Größe zu deklarieren, sondern im Anschluss an die Eingabe. Denn erst danach steht ja fest, wieviele Elemente es werden sollen.
Vorausgesetzt, dein Compiler kann den Code, den zu gepostet hast, kompilieren, könntest du es doch so in etwa machen:
- du legst die Variable 'Anzahl' an
- Benutzer gibt die Anzahl ein, die wird in 'Anzahl' gespeichert (den Umweg über x brauchst du nicht)
- du legst das Array mit 'Anzahl Elementen an ("int Zahl[Anzahl]")Wenn dein Compiler das doch nicht schluckt, musst du dynamisch Speicher mit malloc reservieren, wie Probe-Nutzer gesagt hat (oder du nimmst seinen alternativen Vorschlag, der eleganter ist, sofern das deiner Aufgabenstellung nicht widerspricht).
-
genau das meinte er.
-
ZockerFloh7 schrieb:
ich bin absoluter anfänger, also wie mache ich min-/max- und aktuelleZahl-Variable? Meinst du sowas wie, dass jede eingegebene Zahl mit der nächsten eingegebenen verglichen wird und dann davon die größere bzw. kleinere wieder in die variable gespeichert wird?
Exakt!
Für min/max könntest du sowas hier notieren:
//ganz oben in deinem Code: #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) //Anwendung: int i=max(3,5); //i wird der größere Wert 5 zugewiesen i=min(3,5); //i wird der kleinere Wert 3 zugewiesen
-
_matze schrieb:
ZockerFloh7 schrieb:
ich bin absoluter anfänger, also wie mache ich min-/max- und aktuelleZahl-Variable? Meinst du sowas wie, dass jede eingegebene Zahl mit der nächsten eingegebenen verglichen wird und dann davon die größere bzw. kleinere wieder in die variable gespeichert wird?
Exakt!
Für min/max könntest du sowas hier notieren:
//ganz oben in deinem Code: #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) //Anwendung: int i=max(3,5); //i wird der größere Wert 5 zugewiesen i=min(3,5); //i wird der kleinere Wert 3 zugewiesen
Also das mit dem Array hab ich jetzt kapiert, danke.
kannst du des mit dem #define näher erklären? da blick ich noch nich so ganz durch...
-
Ein #define ist eine Präprozessoranweisung, die eigentlich nur eine simple Textersetzung bewirkt. Soll heißen, überall im Code, an dem z.B. "max(3,5)" vorkommt, wird an diese Stelle stattdessen "(((3) > (5)) ? (3) : (5))" gesetzt, und zwar vor dem Kompilieren. So kann man sich einfache 'Funktionen' zusammenbasteln. Sowas nennt man dann Makro. Bemängelt wird dabei oft die Typunsicherheit, aber in vielen Fällen finde ich das ok und einfach praktisch.
Du kannst stattdessen auch richtige Funktionen schreiben:
int min(int a,int b) { return a>b ? b : a; } int max(int a,int b) { return a>b ? a : b; }
Oder, falls du den ternären Operator (dieser ?:-Kram) noch nicht kennst, schön ausgeschrieben:
int min(int a,int b) { if(a>b) { return b; } return a; } int max(int a,int b) { if(a>b) { return a; } return b; }
-
_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.
-
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