C Warum klappt der Code nicht?

Turuf

Well-known member
26 Dezember 2009
1.928
151
Hallo,
bin ein wirklicher C Neuling und bin schon seit gestern abend am Tüfteln, warum zum Verrecken bei mir folgender einfacherer Code nicht funktioniert? Ich find den Fehler einfach nicht und würde mich sehr über Hilfe freuen:

Code:
#include <stdio.h>

int anf, zins, laufz;

main()
{
    /* Einlesen der Daten */
    printf("Bitte Daten eingeben!\n\nStartkapital in Euro:"); //Startkapital
    scanf("%d",&anf);
    printf("Zinssatz in %%:"); // Zinssatz
    scanf("%d",&zins);
    printf("Laufzeit in Jahren:"); // Laufzeit
    scanf("%d",laufz);

    /* Berechnungen */

    printf("\nEndkapital: %d",anf);
}

Kurz zur Erklärung der Aufgabe: Soll am Ende ein Programm werden, womit ich Startkapital, Zinsen und Laufzeit eingeben kann und woraus mir dann das Endkapital + die erhaltenen Zinsen ausgerechnet werden sollen. Im Prinzip nichts schweres und das Programm ist auch noch nicht fertig, weil die komplette Berechnung noch fehlt, aber da ist ja jetzt schon irgendwo ein Fehler drin und ich weiß einfach nicht, wo und bräuchte Hilfe, denn wenns jetzt schon nicht klappt, dann wird es später auch nicht gehen.

Also die 3 Zahlen kann ich noch eingeben, aber danach stürzt es mir ab und die letzte Zeile, also "Endkapital:" wird mir gar nicht ausgegeben und ich weiß nicht, warum. Die Variable "anf" stimmt natürlich noch nicht und ich habe sie nur aus Testzwecken da reingeschrieben gehabt.

Danke wie gesagt schonmals
 
Danke.. das war's. :wall:
In der 13. Zeile vor dem "laufz" hat das & gefehlt und ich such mich dumm und dusselig.

Vielen Dank nochmals, dann werd ich mal weitermachen. ;)
 
scanf() liest immer in eine Speicheradresse.
Code:
scanf("%d",[COLOR="Red"][B]&[/B][/COLOR]laufz);
edit:
zu langsam
 
Nochmals eine Frage. Habe nun noch eine neue Variable eingefügt, die den Zinssatz bestimmen soll, damit ich damit rechnen kann.

Code:
 #include <stdio.h>

int anf, laufz;
double z, zins;

main()
{
    /* Einlesen der Daten */
    printf("Bitte Daten eingeben!\n\nStartkapital in Euro:"); //Startkapital
    scanf("%d",&anf);
    printf("Zinssatz in %%:"); // Zinssatz
    scanf("%[COLOR="Magenta"]lf[/COLOR]",&zins);
    printf("Laufzeit in Jahren:"); // Laufzeit
    scanf("%d",&laufz);

    /* Berechnungen */
   [COLOR="SandyBrown"] z = 1+(zins/100);[/COLOR]

    printf("\nEndkapital: %d",anf);
    [COLOR="SandyBrown"]printf("\nZinsen:%.3[COLOR="Magenta"]lf[/COLOR]\n", z)[/COLOR];
}

Also eingeben tu ich ja oben meinen Zinssatz (z.B. 3.5%) und z soll daraus nun eine 1.035 machen, sprich "1+ den Zinssatz durch 100" rechnen. Weil dort Kommazahlen rauskommen und der eingegebene Zinssatz auch nicht unbedingt gerade sein muss, hab ich z und zins als double oben noch definiert.

Problem diesmal: bei der Ausgabe unten klappt das mit meinem z nicht so, wie ich will. Es wird immer 1.000 ausgegeben und nicht wirklich das, was ich will und was eigentlich rauskommen müsste.

edit:
Fehler gefunden, wenn ich Double einlesen will, dann sollte ich auch an den beiden Stellen mit lf und nicht mit d arbeiten, damit klappt es. Prima. ;)
 
Zuletzt bearbeitet:
Ein kleiner Tipp: Ich würde die variablen anf, zins und laufz innerhalb von main() vereinbaren, also etwa so:

Code:
main()
{
    int anf;
    int zins;
    int laufz;

...
}

So, wie Du das geschrieben hast, funktioniert das alles wunderbar, aber die Variablen sind dann eben global sichtbar. Das kann manchmal gut sein, meist ist es aber die bessere Idee, die Variablen so lokal wie möglich zu halten (dann kann man nicht an anderer Stelle aus Versehen irgendwelchen Unfug reinschreiben und sich dann wundern, warum das alles nicht tut).

C zu lernen finde ich eine gute Idee, und das Codefragment sieht auch schon recht schön aus. Weiter so!
 
Danke dir, werd ich beherzigen und in Zukunft etwas näher halten mit den Variablen. C lernen wir im Rahmen des Studiums und da das Sommersemester noch nicht so wirklich lange geht, bin ich auch entsprechend noch ganz in den Anfängen und habe sonst auch nicht wirklich Erfahrung mit Programmieren (hatte mir mal vor paar Jahren bissl HTML Grundlagen beigebracht, aber das war es dann auch schon).
 
Schön, wenn Du C im Studium lernst (dann bist Du vermutlich angehender Kollege der Zunft). Bei mir war das etwas anders: wir lernten im Grundstudium zunächst Ansi-Pascal :sick:. Dann machte ich mal einen C-Kurs, der aber nicht von der Fakultät für Informatik, sondern vom Zentrum für Datenverarbeitung angeboten wurde. C++ hab' ich nie "offiziell" gelernt, aber im Haupstudium mußten wir die Übungsaufgaben zu "graphische Datenverarbeitung" in Java (das war damals brandneu) programmieren. Als einführung in Java hat uns der Tutor eine halbe Stunde Unterschiede zwischen Java und C++ erläutert...
Für die Diplomarbeit habe ich dann in C++ programmiert und mich dazu mit Hilfe des Buches "Thinking in C++" umgewöhnt. Beruflich codiere jetzt in C++ und für C muß ich mich schon sehr besinnen um nicht doch schon wieder C++-code zu schreiben :mrgreen:
 
Java kommt wohl in einem späterem Semester bei uns noch hinzu. ;)

Eine abschließende Frage aber noch zu meinem Problem. Wollte nun die Zinsrechnung mit einer for-Schleife lösen doch ich scheitere bis jetzt noch und hab langsam alles durch, inkl. googeln und keine Ideen mehr.
Meine ursprüngliche, und meiner Meinung nach auch eleganteste Idee, war es eigentlich die Zinsen einfach mit der Formel "Kapital nach x Jahren = Anfangskapital * Zinsen ^ x" zu lösen und dann x laufen zu lassen, doch irgendwie komm ich damit nicht weiter, weil ich das mit dem Potenzieren nicht hinbekomm.
Hab mich zwar schlau gemacht und Potenzieren kann man wohl mithilfe der pow Funktion, jedoch kommen bei mir int und double Werte gemischt vor und wenn ichs hiermit probiere: https://www.cplusplus.com/reference/clibrary/cmath/pow/ , dann klappt es nicht. Vermutlich deswegen, weil es nur mit c++, nicht aber mit c mit gemischten Werten klappt.

Andere Idee war es das ganze rekursiv zu lösen. Also zum Zeitpunkt 0 habe ich als Kapital = Grundkapital. Nach 1 Jahr dann Kapital (1) = Kapital (0) * Zins, im Jahr 2 dann Kapital (2) = Kapital (1) * Zins usw..
Nur leider kann ich das programmiertechnisch nicht wirklich umsetzen.

Weiß nicht, wie viele Stunden ich nun an dieser Aufgabe hänge, aber so langsam gehts in den zweistelligen Bereich und würds gerne doch noch irgendwie heute hinbekommen und bräuchte nochmals Hilfe. Dankeschön.
 
Umwandeln von Datentypen:
Code:
/* aus einem int ein double machen */
int i;
double d = (double)i;

/* aus einem double ein int machen */
i = (int) d;  /* schneidet nachkommastellen ab */
i = (int) (d + 0.5)  /* rundet kaufmännisch */

Damit solltest Du das leicht hinbekommen.

Eine for-Schleife hat den Vorteil, daß für jedes Jahr das Guthaben, den bislang erhaltenen Zins, und den Zins, der in diesem Jahr erwirtschaftet wurde ausgeben kann.
 
Zuletzt bearbeitet:
Danke für die Hilfe, aber leider klappts immer noch nicht. :(
So schaut mein Code inzwischen aus:

Code:
#include <stdio.h>
#include <math.h>

int laufz;
int i;

[COLOR="RoyalBlue"]double laufz2 = (double)laufz;[/COLOR]
[COLOR="Orange"]double i2 = (double)i[/COLOR];
double anf;
double z;
double zins;
double kap;
double endkap;
double zinsend;

main()
{
    /* Einlesen der Daten */
    printf("Bitte Daten eingeben!\n\nStartkapital in Euro:"); //Startkapital
    scanf("%lf",&anf);
    printf("Zinssatz in %%:"); // Zinssatz
    scanf("%lf",&zins);
    printf("Laufzeit in Jahren:"); // Laufzeit
    scanf("%d",&laufz);

    /* Berechnungen */

    z = (1+(zins/100));

    /* Schleife */
    
    for(i=0;i <= laufz; i++)
    {
        [COLOR="Orange"]kap = anf*z^i2, pow(z,i2)[/COLOR];
        printf("\nJahr %d:%.2lf",i,kap);

    } // Schleife fertig
    
    [COLOR="RoyalBlue"]endkap = anf*z^laufz, pow(z,laufz);[/COLOR] //Endkapital
    zinsend = endkap-anf; // Erhaltene Zinsen
    
    printf("\n\nEndkapital: %.2lf",endkap);
    printf("\nZinsen:%.2lf\n", zinsend);
}

Probleme macht halt nachwievor das Potenzieren. Also brauchs ja doppelt, jeweils das Orangene und das Dunkelblaue gehört halt zusammen und klappt so nicht, obwohl nun eigentlich beides in double vorliegen sollte. *hmpf*
 
Andere Idee war es das ganze rekursiv zu lösen. Also zum Zeitpunkt 0 habe ich als Kapital = Grundkapital. Nach 1 Jahr dann Kapital (1) = Kapital (0) * Zins, im Jahr 2 dann Kapital (2) = Kapital (1) * Zins usw..
Nur leider kann ich das programmiertechnisch nicht wirklich umsetzen.
Keine doofe Idee, aber bei Rekursion immer bedenken, dass du Stackspeicher brauchst. Wenn es iterativ geht, immer die iterative Variante vorziehen. Der Prozeduraufruf is teuer.

Hier mal die Rekursion am Beispiel der Fakultät:
PHP:
unsigned long fak(unsigned long n) {
  // Rekursionsabbruch: 0! = 1, 1! = 1
  if(n == 0 || n == 1)
    return 1;

  // Rekursionsschritt: n! = n * (n-1)!
  return n * fak(n - 1);
}

Zu deinem Code: :hö:
Nix mit Komma schreiben. Auch "^" vergessen, das is in C/C++ das bitweise XOR.
 
Zu deinem Code: :hö:
Nix mit Komma schreiben. Auch "^" vergessen, das is in C/C++ das bitweise XOR.

Danke, habs nun abgeändert und Programm läuft zwar nun, aber Werte stimmen noch nicht und explodieren förmlich von Jahr zu Jahr. Code habe ich nun so abgeändert und die beiden i2, laufz2 wieder entfernt.

PHP:
    /* Schleife */

    for(i=0;i <= laufz; i++)
    {
        b=anf*z;
        kap = pow(b,i);
        printf("\nJahr %d:%.2lf",i,kap);

    } // Schleife fertig
 
Die Rechnung is ja auch komisch bzw. falsch, wenn ich deinen Code richtig versteh.

Wenn ich z.B. 500€ für 8 Jahre anlege und jedes Jahr 5% Zinsen krieg, dann hab ich
im 1. Jahr: 500€*(1+5%) = 500€*1,05
im 2. Jahr: 500€*(1+5%)[sup]2[/sup] = 500€*(1,05^2)
im 3. Jahr: 500€*(1+5%)[sup]3[/sup] = 500€*(1,05^3)
...
im n. Jahr: 500€*(1+5%)[sup]n[/sup] = 500€*(1,05^n)
...
im 8. Jahr: 500€*(1+5%)[sup]8[/sup] = 500€*(1,05^8) ~ 738,73€
 
Klar, stimmt, kein Wunder, hatte zufällig den ganze Ausdruck hoch genommen statt nur die Zinsen. Habs nun hinbekommen und es klappt. :biggrin: Würde zwar bestimmt schöner und eleganter gehen, aber bin froh, dass es nun klappt.

Ich poste mal nochmals den kompletten Code nun rein, falls sich mal jemand über Google hierher verirrt und ähnliche Probleme hat (zumindest hatte mir das beim Googeln immer geholfen, wenn ich paar Codes gefunden habe):

PHP:
#include <stdio.h>
#include <math.h>

int laufz;
int i;

double anf;
double z;
double zins;
double kap;
double endkap;
double zinsend;
double b;

main()
{
    /* Einlesen der Daten */
    printf("Bitte Daten eingeben!\n\nStartkapital in Euro:"); //Startkapital
    scanf("%lf",&anf);
    printf("Zinssatz in %%:"); // Zinssatz
    scanf("%lf",&zins);
    printf("Laufzeit in Jahren:"); // Laufzeit
    scanf("%d",&laufz);

    /* Berechnungen */

    z = (1+(zins/100));

    /* Schleife */

    for(i=0;i <= laufz; i++)
    {
        b=pow(z,i);
        kap = anf*b;
        printf("\nJahr %d:%.2lf",i,kap);

    } // Schleife fertig

    endkap = anf*pow(z,laufz); //Endkapital
    zinsend = endkap-anf; // Erhaltene Zinsen

    printf("\n\nEndkapital in Euro: %.2lf",endkap);
    printf("\nInsgesamt erhaltene Zinsen in Euro:%.2lf\n", zinsend);
}