sirco Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 Hallo zusammen, ich bin gerade dabei, C-Programmierung zu lernen. Nun habe ich ein Problem, bei dem ich hoffe, ihr könnt mir helfen: Ich möchte ein double array mit Benutzereingabe, also scanf befüllen, und zwar solange, bis der Benutzer 0 eingibt. Mein Code sieht bisher so aus. int main() { int i=0; double netto[i]; do { printf("Bitte Nettobetrag eingeben (0 fuer Abbruch)\n"); scanf("%lf",&netto[i]); i++; } while(netto[i]!=0); for(i=0;i<netto[i];i++) { printf("%lf",netto[i]); } return 0; } Ich hoffe, ihr könnt mir helfen Zitieren
Klotzkopp Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 Ich hoffe, ihr könnt mir helfen Klar, wenn du sagst, was das Problem ist Ein wichtiger Hinweis könnte aber schon sein, dass sich Arrays in C nicht auf magische Weise selbst vergrößern. Zitieren
sirco Geschrieben 19. Februar 2011 Autor Geschrieben 19. Februar 2011 Sorry, ich bin schon so verwirrt, ich hab die Frage vergessen ._. Also wenn ich das ubige Programm ausführe und 3 Werte eingebe, stürzt immer mein Programm ab. Eine Fehlermeldung beim Kompilieren bekomme ich aber nicht. Kann man es bei C nicht so machen, dass ich immer wieder einen Wert eingebe, solange bis ich eben 0 eingebe. Mein letzter Wert wäre dann laut meinem Programm oben i, da i in meiner Fußgesteuerten Schleife ja immer pro Eingabe eins hoch geht. Zitieren
Klotzkopp Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 Kann man es bei C nicht so machen, dass ich immer wieder einen Wert eingebe, solange bis ich eben 0 eingebe. Mein letzter Wert wäre dann laut meinem Programm oben i, da i in meiner Fußgesteuerten Schleife ja immer pro Eingabe eins hoch geht.Natürlich kann man das machen. Das Problem ist, dass dein Array netto Null Elemente groß ist und auch für immer so groß bleibt. Arrays können ihre Größe nicht ändern. Schon der erste Zugriff auf netto[0] ist undefiniert, weil netto gar nicht so groß ist. Das geht möglicherweise noch bis i=2 gut, weil dort nichts wichtiges im Speicher steht, aber dann fliegt es dir eben um die Ohren. Du musst den Speicher dynamisch reservieren und gegebenfalls vergrößern (malloc/realloc). Zitieren
sirco Geschrieben 19. Februar 2011 Autor Geschrieben 19. Februar 2011 Hmm ja ok, das leuchtet mir ein. Aber malloc/realloc habe ich bisher noch nie gehört Eine andere Möglichkeit gibts es nicht, das Array dynamisch werden zu lassen? Zitieren
habbeda Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 EDIT: zu langsam getippt und zwei Beiträge zu spät Natürlich kann man das. Diese Werte lassen sich aber nicht in einem Array der Größe 0 speichern. Wie Klotzkopp bereits schrieb: Arrays vergrößern sich nicht einfach selbst. Arrays verfügen immer über eine fest definierte Größe. Wird diese überschritten (schreibend oder lesend) kann es zufälligerweise gut gehen, führt aber früher oder später zum Absturz des Programms. Möchtest Du mehr Werte in ein Array speichern als Du ursprünglich definiert hast, so musst Du auch dafür sorgen, dass genügend Speicher zur Verfügung steht. Kleine Anmerkung auch zu Deiner for-Schleife: mir erscheint es wenig sinnvoll, in der Abbruchbedingung die Laufvariable mit dem Wert eines Array-Feldes zu vergleichen. Zitieren
habbeda Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 Eine andere Möglichkeit gibts es nicht, das Array dynamisch werden zu lassen? Nein - im Gegensatz zu manch anderen Programmiersprachen existieren in C keine dynamischen Datenstrukturen. Mit "malloc" reservierst Du einen gewissen Bereich im Speicher. Mit "realloc" wird im besten Fall der Speicher vergrößert. Ist dies nicht möglich, wird an anderer Stelle im Speicher ein vergrößerter Bereich reserviert und die Daten aus dem alten Bereich dort hinein kopiert. Somit lässt sich gewissermaßen ein dynamisches Array realisieren. Zitieren
sirco Geschrieben 19. Februar 2011 Autor Geschrieben 19. Februar 2011 Ohje, ich befürchte das ist doch komplizierter als ich dachte... Kann es sein, dass malloc bzw. realloc zusammen mit Pointern arbeitet? Das hatten wir bisher noch nicht im Unterricht. Dashabe ich zumindest eben über google herausgefunden. Wenn das so ist, werde ich die Aufgabe wohl nicht hinbekommen, denn ich habe keine Ahnung wie das mit den Pointern funktioniert. Bzgl. der for-Schleife: Ich habe gedacht, das netto in meinem Fall der höchste Wert des Arrays ist, und ich deshalb mit i solange hochgehe, bis halt der letzte Wert vom Array erreicht wird. Hmm, falsch gedacht... . Zitieren
cry88 Geschrieben 19. Februar 2011 Geschrieben 19. Februar 2011 Ohje, ich befürchte das ist doch komplizierter als ich dachte... falls es nich das ziel der aufgabe is nen dynamisches array zu erstellen und sowas nich im entferntesten im unterricht dran gekommen is würd ich einfach nen normales array ala "double array[50]" oder so verwenden. das sollt gehn. ich vermute mal euer lehrer wird das als übergang benutzen für dynamische arrays ("gute gelöst, aber wäre es nich viel besser wenn blablabla") die for-schleife solltest du allerdings noch gegen eine schleife tauschen die abbricht wenn der inhalt des arrays 0 is. so wie jetzt vergleichste ja nur den inhalt des arrays mit der "nummer" des arrays. bringt bei dir ja recht wenig^^ Zitieren
habbeda Geschrieben 20. Februar 2011 Geschrieben 20. Februar 2011 Bzgl. der for-Schleife: Ich habe gedacht, das netto in meinem Fall der höchste Wert des Arrays ist, und ich deshalb mit i solange hochgehe, bis halt der letzte Wert vom Array erreicht wird. Hmm, falsch gedacht... . Dein Anliegen mit der for-Schleife ist doch, alle Werte innerhalb des Arrays auszugeben, korrekt? for(i=0;i<netto[i];i++) { printf("%lf",netto[i]); } i ist hier die Laufvariable der Schleife. Mit netto greifst Du auf den Wert des Feldes mit Index i zu. Nehmen wir einfach mal an "netto" sei ein Integer-Array der Größe 10, welches mit den Werten 10 .. 1 befüllt ist. int netto[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; // statt netto[10] reicht hier auch netto[] int i; for (i = 0; i < netto[i]; i++) { printf("%d\n", netto[i]); } Überlege Dir einmal, wieviele Werte mit diesem Code ausgegeben werden und wie sinnvoll die Abbruchbedingung ist. Dann denke auch über cry88s Einwand nach: was passiert, wenn Du auf ein Feld des Arrays zugreifst, welches nicht explizit mit einem Wert befüllt wurde (weil beispielsweise die Eingabe vorher mit einer 0 abgebrochen wurde)? Zitieren
lilith2k3 Geschrieben 20. Februar 2011 Geschrieben 20. Februar 2011 #include <stdio.h> int main() { const int maximaleArrayLaenge=50; int arrayLaenge=0; double eingabe=0; double nettoWerte[maximaleArrayLaenge]; while(arrayLaenge<maximaleArrayLaenge) { printf("Bitte Wert eingeben: "); scanf("%lf", &eingabe); if (eingabe==0) break; nettoWerte[arrayLaenge]=eingabe; arrayLaenge++; } for (int i=0; i<arrayLaenge; i++) { printf("Wert an Pos %d:\t %lf\n", i, nettoWerte[i]); } }[/PHP] Zitieren
sirco Geschrieben 20. Februar 2011 Autor Geschrieben 20. Februar 2011 (bearbeitet) Vielen Dank für eure Hilfe Ich denke, die for-Schleife ist falsch weil netto nicht mein größtmögliches Array-Feld ist. Ich habe mein Programm nun noch einmal umgeschrieben, so klappt es nun: int main() { int i=0; double zahl; double netto[10]; for(;i<10;i++) { printf("Bitte Nettobetrag eingeben (0 fuer Abbruch)\n"); scanf("%lf",&zahl); if(zahl==0) { i=12; } else { netto[i]=zahl; } } for(i=0;i<10;i++) { printf("%lf\n",netto[i]); } return 0; } Mit der unteren for-Schleife wollte ich nur testen und auslesen, ob die Werte richtig ins Array geschrieben werden. Das klappt nun auch, nur das jetzt natürlich alle 50 Felder ausgegeben werden. Das ist ja klar, weil ich bis 50 hoch gehe (i<50). Ich bin froh das ich jetzt überhaupt erstmal was funktionierendes hinbekomme. Ich war schon kurz davor, alles hinzuschmeißen, weil das für mich so extrem kompliziert ist. Der nächste Schritt wäre nun, das mit den dynamischen Arrays hinzubekommen, aber ich glaube meine Motivation lässt mich dazu im Stich. Bearbeitet 20. Februar 2011 von sirco Zitieren
lilith2k3 Geschrieben 20. Februar 2011 Geschrieben 20. Februar 2011 Ich habe mein Programm nun noch einmal umgeschrieben, so klappt es nun: Was klappt denn nun so? Angenommen, jemand gibt als allererstes eine "0" ein, was tut Deine Schleife ?for(i=0;i<10;i++) { printf("%lf\n",netto[i]); } [/PHP] [code]if(zahl==0) { i=12; }[/code] Was ist das für eine Zuweisung? Ich meine, in diesem Falle ist es zwar offensichtlich, was Du mit dieser Zuweisung erreichen möchtest, dennoch würde ich Dir empfehlen, falls Du vorhaben solltest beruflich zu programmieren, von derartigen "Tricks" Abstand zu nehmen. Du machst es Dir nicht einfach, den Code zu warten und anderen schwer, zu verstehen, was Du eigentlich vorhast. for(;i<10;i++) Ebenfalls eine schlechte Angewohnheit. Zwar ist in dem Kontext klar, warum Du Dir die Initialisierung schenken willst. Aber bei komplexeren Projekten, kann einem sowas den Hals brechen. Woher soll jemand wissen, mit was Du genau [i]i[/i] initialisiert hast? Wenn [i]i[/i] Deine Laufvariable für die Schleife ist, dann wäre es doch eine gute Idee, [i]i[/i] auch erst in der Schleife zu initialisieren, oder? Das klappt nun auch, nur das jetzt natürlich alle 50 Felder ausgegeben werden. Wo werden 50 Felder ausgegeben? Ich bin froh das ich jetzt überhaupt erstmal was funktionierendes hinbekomme. Das ist ja auch gut so. Allerdings wäre jetzt der zweite Schritt, das Programm noch einmal zu überarbeiten, dass es auch sauber funktioniert. Ich war schon kurz davor, alles hinzuschmeißen, weil das für mich so extrem kompliziert ist. Was ist kompliziert? Wo können wir Dir helfen? Der nächste Schritt wäre nun, das mit den dynamischen Arrays hinzubekommen, aber ich glaube meine Motivation lässt mich dazu im Stich. Habt Ihr das schon in der Schule durchgenommen? Ansonsten solltest Du wie gesagt, Deine Energie darauf verwenden, das zu verinnerlichen, was Du bis dato gelernt hast :] Zitieren
sirco Geschrieben 21. Februar 2011 Autor Geschrieben 21. Februar 2011 Was klappt denn nun so? Es klappt, das wenn ich "0" eingebe, die Eingabe beendet wird. Bin gerne für andere Lösungen offen, aber ich habe bisher noch keine Ahnung von Pointern, ich weiß nur, das sie existieren Angenommen, jemand gibt als allererstes eine "0" ein, was tut Deine Schleife ?for(i=0;i<10;i++) { printf("%lf\n",netto[i]); } [/PHP] Ich habe keine Ahnung :/ Mein Problem ist, das ich vor ca. 1,5 Monaten mit C-Programmierung begonnen habe und bisher kein funktionierendes Programm gesehen habe, dass mein o.g. Problem zufriedenstellend löst. Ich weiß das mein Programmierstil nicht sehr sauber ist. [code]if(zahl==0) { i=12; } [/code] Ist so ein bisschen wie von hinten durch die Brust ins Auge. Allerdings habe ich leider bisher ein sehr eingeschränktes Verständnis was Programmierung betrifft. Wie würdest du denn diese Aufgabe lösen? Zitieren
Klotzkopp Geschrieben 21. Februar 2011 Geschrieben 21. Februar 2011 Ich habe keine Ahnung :/Dann überleg dir mal, welchen Wert i an dieser Stelle hat. Wieviele Werte hat der Benutzer eingegeben, und wieviele gibst du aus? Ist so ein bisschen wie von hinten durch die Brust ins Auge. Das Stichwort ist break. lilith2k3 hat es in seiner Komplettlösung benutzt. Wie würdest du denn diese Aufgabe lösen?Also ich würde C++ benutzen, da hat man den Ärger mit der manuellen dynamischen Speicherverwaltung nicht Zitieren
lilith2k3 Geschrieben 21. Februar 2011 Geschrieben 21. Februar 2011 aber ich habe bisher noch keine Ahnung von Pointern, ich weiß nur, das sie existieren Dann würde ich mir darum erst einmal keine Gedanken machen. Das Konzept von Pointern ist gerade für Anfänger nicht unbedingt direkt eingängig. Insofern können wir die an der Stelle erst einmal aussen vor lassen. Wichtig ist, dass Du das, was Du bisher gelernt hast / haben solltest, verinnerlichst. Mit kleinen Schritten kommst Du auch irgendwann zum Ziel. Ich habe keine Ahnung :/ Das ist schade. Aber Du verstehst schon, was Du geschrieben hast, sprich: wie eine for-Schleife prinzipiell funktioniert? Wenn nicht, können wir gerne weiterhelfen :] Mein Problem ist, das ich vor ca. 1,5 Monaten mit C-Programmierung begonnen habe und bisher kein funktionierendes Programm gesehen habe, dass mein o.g. Problem zufriedenstellend löst. Hast Du meins ausprobiert? Kleine Rückfrage: Hast Du vor 6 Monaten begonnen zu programmieren oder erst begonnen C zu programmieren und beherrscht schon eine andere Sprache? Ich weiß das mein Programmierstil nicht sehr sauber ist. Was hält Dich davon ab, sauber zu arbeiten? Unwissenheit ist es offensichtlich nicht. Ist so ein bisschen wie von hinten durch die Brust ins Auge. Allerdings habe ich leider bisher ein sehr eingeschränktes Verständnis was Programmierung betrifft. Äh, in etwa *G* Das macht ja nichts. Jeder fängt mal klein an :] Es wäre gut, wenn Du genau analysierst, worin Deine Probleme bestehen, und uns entsprechend befragst. Wir helfen Dir gerne weiter. Wie würdest du denn diese Aufgabe lösen? So #include <stdio.h> int main() { const int maximaleArrayLaenge=50; int arrayLaenge=0; double eingabe=0; double nettoWerte[maximaleArrayLaenge]; while(arrayLaenge<maximaleArrayLaenge) { printf("Bitte Wert eingeben: "); scanf("%lf", &eingabe); if (eingabe==0) break; nettoWerte[arrayLaenge]=eingabe; arrayLaenge++; } for (int i=0; i<arrayLaenge; i++) { printf("Wert an Pos %d:\t %lf\n", i, nettoWerte[i]); } } [/PHP] Also ich würde C++ benutzen, da hat man den Ärger mit der manuellen dynamischen Speicherverwaltung nicht Warum man den Umweg von C zu C++ in der Berufsschule geht versteht wahrscheinlich auch nur das jeweilige Kultusministerium des entsprechenden Bundeslandes. Wenn man schon Einsteigern eine derartige Sprache zumuten will, kann man besser gleich C++ nehmen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.