Ausgabe in while - Schleife mit Funktion
-
Hallo liebes Forum!
Der folgende Code soll mir die Summe der Zahlen von 1-n ausgeben und außerdem die relevanten Zahlen, die zum zählen verwendet wurden.
Beides in einer Funktion zu realisieren. Der zweite Teil mit While-Schleife.
So...
Es funktioniert zwar, aber ich bekomme bei der Ausgabe immer die richtigen Zahlen und am Ende noch eine 0.Wenn ich jetzt n als 10 wähle bekomme ich:
X:10
Ergebnis: 55
Zahlen: 1 2 3 4 5 6 7 8 9 10 0Code:
#include <stdio.h> #include <stdlib.h> int summe(int a); int ausgabe(int a); int main(int argc, char* argv[]) { int a,ergebnis; printf("Die Summe der Zahlen von 1 bis X soll ausgegeben werden!\nX:"); scanf("%d",&a); ergebnis=summe(a); printf("Ergebnis: %d\n",ergebnis); printf("Zahlen: "); printf("%d",ausgabe(a)); getch(); return 0; } int summe(int a) { int ergebnis=0; int i; int speicher[a]; for (i=0;i<=a;i++) { speicher[i]=ergebnis; ergebnis=i+speicher[i]; } return ergebnis; } int ausgabe(int a) { int j=1; int ar[a]; while(j<=a) { ar[j]=j; printf("%d ",j); j++; } return 0; }
Warum passiert das?
lg
Michael
-
Die endende 0 kommt durch dein printf("%d",ausgabe(a)); zustande.
int ausgabe(int a) { int j=1; int ar[a]; while(j<=a) { ar[j]=j;
Diesen unsäglichen VLA-Müll gewöhne dir mal ganz schnell wieder ab, gerade weil du Anfänger bist.
Außerdem UB, weil du auf undefinierten Speicher außerhalb der Arrays zugreifst.
-
Danke, aber wie gesagt ich bin Anfänger.
Wie kann ich das jetzt verstehen?
Was würdest du am Code ändern?
-
printf("%d",ausgabe(a));
Was macht diese Zeile?
Nun, wir sehen ein printf mit "%d" als Formatstring. Es soll also eine Ganzzahl im Dezimalformat ausgegeben werden. Welche Zahl? Das sagt uns das zweite Argument. Da steht
ausgabe(a)
. Das ist ein Funktionsaufruf. Es wird also diese Funktion aufgerufen, deren Rückgabewert wird von dem printf ausgegeben.Was macht der Funktionsaufruf
ausgabe(a)
? Er gibt selber die Zahlen 1-10 aus, gibt dann 0 zurück (Zeile 43). Diese 0 wird also durch das printf ausgegeben.Dies erklärt das Verhalten des Programms. Schwieriger ist die Erklärung, wie du zu so einem Fehler kommst. Du sagst zwar selber, du bist Anfänger, aber der Fehler ist schon übel. Ebenso der andere angesprochene Fehler mit den VLAs (das heißt deine Zeilen 24,27,36 und 39). Die machen allesamt nichts für die Funktion des Programms, sind aber Schrott.
Wie lernst du C? Der Code wirkt, als wäre er nach drei Prinzipien programmiert worden:
- Zufällige Variation des Codes, bis etwas compilierendes herauskam (zum Beispiel der Rückgabewert der ausgabe-Funktion).
- Grobe Assoziationen von Ursache und Wirkung, ohne diese wirklich verstanden zu haben (deine "Ausgabe" in Zeile 15).
- Abschreiben von Codeteilen anderer Leute, ohne diese zu verstehen (die VLAs, die Benutzung der while-Schleife).Trifft es das ungefähr, wie der Code entstanden ist? Schon jeder einzelne dieser Punkte wäre ein gravierender Mangel. Das ist einfach die falsche Herangehensweise beim Programmieren und wird niemals zu Erfolgen führen. Du musst verstehen, was du tust. Ganz genau verstehen, jedes einzelne Zeichen! Anscheinend ist deine Lernmethode nicht gut. Auch mit geringen Kenntnissen (Eingabe, Ausgabe, Schleifen) kann man tolle Programme schreiben (wenn auch vielleicht umständlicher als mit fortgeschrittenen Kenntnissen), wenn man nur versteht, was man macht.
-
int main(int argc, char* argv[]) { int a,ergebnis; printf("Die Summe der Zahlen von 1 bis X soll ausgegeben werden!\nX:"); scanf("%d",&a); ergebnis=summe(a); printf("Ergebnis: %d\n",ergebnis); printf("Zahlen: "); ausgabe(a); getch(); return 0; } int summe(int a) { int ergebnis=0; int i; for (i=0;i<=a;i++) { ergebnis=ergebnis + a; } return ergebnis; } int ausgabe(int a) { int j=1; while(j<=a) { printf("%d ",j); j++; } return 0; }
-
Mach aus
int ausgabe
doch bitte nochvoid ausgabe
und aus der while-Schleife eine for-schleife. Beides sollte der TE auf seinem Stand kennen.
-
Vielen Dank!
Das ich eine Funktion einfach so aufrufen kann, wusste ich nicht.
( ausgabe(a); )Der Code ist wirklich durch Denken entstanden, nicht durch probieren, aber ich hatte zu Beginn keinen Array. Nur weil schlussendlich immer 0 am Ende war, habe ich es mit Array probiert. Wenn ich gewusst hätte, dass man die Funktion einfach aufrufen kann, dann hätte es bestimmt geklappt.
Danke vielmals für die Hilfestellung!
Da ich erst seit kurzer Zeit mit Programmieren etwas zu tun habe, hoffe ich, dass ich bald weitere Fortschritte mache.
-
Der Code ist deutlich effizienter mit deinen Tipps, aber du meinst bestimmt:
ergebnis=ergebnis + i oder?
Außerdem muss ich zugeben, dass ich einfach die "frisch gelernten" Arrays ausprobieren wollte. War anscheinend nicht die beste Idee.
-
MichaelMAS schrieb:
ergebnis=ergebnis + i oder?
Ja.
Außerdem muss ich zugeben, dass ich einfach die "frisch gelernten" Arrays ausprobieren wollte. War anscheinend nicht die beste Idee.
Die Frage ist: Was sollen die Arrays erreichen? Ein Array ist eine Sammlung vieler Speicherstellen für gleichartige Objekte. Zum Aufsummieren von Zahlen brauchst du aber bloß zwei Speicherstellen, den Summand und die Summe. Zum Ausgeben von Zahlen nur eine, nämlich die Zahl selber. Die Arrays sind also komplett unnötig.
Außerdem hast du Arrays bestimmt nicht so gelernt, wie du sie hier benutzt (als VLA, das heißt mit variabler Länge). Ich folgere mal, dass du GCC als Compiler benutzt. Gib dem mal beim compilieren die Schalter
-std=c89 -Wall -pedantic
mit. VLAs (aus dem Standard C99) benutzt du erst, wenn du in der Sprache sicherer bist.
-
MichaelMAS schrieb:
Das ich eine Funktion einfach so aufrufen kann, wusste ich nicht.
( ausgabe(a); )Nun, printf ist eine Funktion, scanf ist eine Funktion und getch auch.
Erkennbar an den runden Klammern nach dem Namen.
-
Ich habe leider noch gar nicht C gelernt.
Zwar sind die Unterlagen zum lernen bereits online auf dem Server, wird jedoch erst in etwa einem halben Jahr begonnen.
Ich wollte jedoch auf eigene Faust etwas Grundwissen aneignen.Danke euch allen, ich werde mich einfach noch intensiver damit beschäftigen.
Aber wie sagt man so schön "Learning by doing" und "durch Fehler wird man schlau".
-
MichaelMAS schrieb:
Aber wie sagt man so schön "Learning by doing" und "durch Fehler wird man schlau".
Der Erfahrung nach, funktioniert das beim Programmieren nicht so gut. Denn vieles was schlecht oder falsch ist, funktioniert manchmal doch. Und dann gewöhnt man es sich falsch an. Aber wenn's drauf ankommt, geht's plötzlich wieder nicht, weil es einfach falsch ist. Und dann ist man ratlos.
Sogar viele Bücher sind falsch/schlecht, wenn der Autor sich bloß kurz mit der Sprache beschäftigt hat, ohne sie wirklich zu verstehen. Denn dann weiß er gar nicht, worauf es ankommt. Alarmzeichen sind Autoren, die viele Bücher zu vielen Themen schreiben oder Bücher, die schnellen (in X Tagen) und/oder vollständigen (komplett, von A bis Z) Erfolg versprechen.
Internettutorials sind auch eher mit Vorsicht zu genießen. Denn wer weiß, dass er wirklich Ahnung hat, schreibt oft ein Buch. Wer bloß glaubt, dass er Ahnung hat (meistens nach dem Lesen des ersten Anfängerbuchs), der schreibt ein Tutorial.