[C/C++] *Update* IF - Abfrage / Double-Werte falsch

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Calyx, 29. Oktober 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 29. Oktober 2009
    *Update* IF - Abfrage / Double-Werte falsch

    Nabend!

    Ich bin noch ziemlicher Noob in C und bastle hier gerade einen Kreditrechner.

    Wenn der eingegebene Betrag 0 ist, soll die Schleife abgebrochen werden.
    Wenn der Betrag < 500 ist, soll der Betrag = 500 sein.
    Wenn > 10.000, dann Betrag = 10.000.

    Kann mir jmd sagen, wieso er mir, egal was ich anfangs eingebe, am Ende immer 500 ausgibt?

    Hier der Code:

    Code:
     printf("Kreditbetrag...: "); scanf("%lf", &krb); gets(dummy);
     if (krb = 0) 
     {
     printf("\n");
     printf("Kreditbetrag zu niedrig, Programmabbruch. Return druecken... \n"); gets(dummy);
     break;
     }
     
     else if (krb < 500.00) krb = 500.00; 
     else if (krb > 10000.00) krb = 10000.00; 
     
  2. 29. Oktober 2009
    AW: IF - Abfrage

    if(krb = 0) <- zuweisung

    if(krb == 0) <- vergleich

    da du in der ersten if-anweisung der variablen "krb" den wert 0 gibst (und 0 gleich FALSE ist), greift die zweite if-anweisung und setzt "krb" auf 500
     
  3. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    Sry, ich muss hier nochmal aufmachen, komme einfach nicht weiter.

    Ich hab die Formel:
    Code:
    x = y*z^60*(z-1)/(z^60-1)
    
    und bekomme immer -0.00 raus.

    In meinem Beispiel haben die Variablen die Werte (double):
    y = 10000
    z = 1.01
    z^60 somit ~ 1.82

    Wenn ich das einsetze und in meinen Taschenrechner eingebe steht da:
    Code:
    10000 * 1.01^60 * (1.01 - 1) / (1.01^60 - 1) = 222.44
    
    Habe bereits versucht das in 2 Formeln aufzuspalten:
    Code:
    x1 = y * z^60 (= 10000 * 1.01^60 = 18166.97)
    x2 = (z - 1) / (z^60 - 1) (= (1.01 - 1) / (1.01^60 - 1) = 0.012)
    
    und dann x1*x2, ist allerdings wieder "-0.00", da schon x1 zu "-0.00" wird.

    Rechne ich das wiederrum mit dem Taschenrechner, kommt 218.00 raus, was mir an Genauigkeit schon reichen würde.

    Hatte die Vermutung das es evtl an zu kleinen Werten liegt, hab x1 * 1000 genommen und in integer umgewandelt, Ergebnis blieb aber das selbe... verzweifle hier langsam daran, kann mir jmd sagen was ich falsch mache?

    // btw das z^60 hab ich mit der funktion pow(z,60) gemacht.
     
  4. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    sind alle typen gleich oder vermischt du integer mit double-datentypen in der rechnung? poste ev. mal den gesamten sourcecode.
     
  5. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    du möchtest damit hoffentlich nicht z hoch 60 sagen oder? dafür musst du ne funktion aus math.h (glaub so hieß der header) benutzen. Die funktion müsste sowas wie pow heißen oder sowas, soweit ich mich erinner

    das ^ ist bei c ein bitoperator und entspricht dem logischen bitweisen XOR

    edit: ok, streich das, hab grad deinen letzten satz gelesen

    edit2: ok, denn versuch doch einfach mal dir vor deiner rechnung alle variablen einzeln nochmal auszugeben. zerleg die rechnung in noch kleinere stückchen und lass dir die zwischenergebnisse alle einzeln ausgeben, denn siehst du wo genau der fehler liegt

    also etwa:
    Code:
    printf("Y=%i", y);
    printf("Z=%i", z);
    double zhoch = pow(z,60)
    printf("Z^60=%d",zhoch);
    double x1 = y*zhoch;
    printf("(Z^60)*y=%d",x1);
    
    und so weiter (bin mir bei der syntax nicht 100% sicher, also bitte nicht hauen, c ist scho ein wenig her)

    dann siehste ja, was genau er macht und wo genau der fehler liegt in welchem schritt
     
  6. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    Code:
    // Kreditrechner.cpp: Hauptprojektdatei.
    
    //Bibliotheken
    
    #include "stdafx.h"
    #include "math.h"
    #include "vsconio.h"
    #include <stdio.h>
    
    
    int main(void)
    {
     double krb, zf, r, nz, rs, krbet, rmin, rmin1, rmin2;
     double zf60 = pow(zf,60);
     int i, krnd, rnr;
     char dummy[81];
    
     
     
     for (i=0; i<100; i++)
     {
     //Programmstart
     printf("Bankkaufhaus Kauf & Rausch -> Berechnung von Konsumentenkrediten T. Mueller\n");
     printf("*****************************************************************************\n");
     printf("\n");
     
     printf("Bitte geben sie folgene Daten ein: \n");
     printf("\n");
    
    
     //Eingabe Kreditbetrag
     printf("Kreditbetrag [500..10T Euro] : "); scanf("%lf", &krb); gets(dummy);
    
     if (krb == 0) 
     {
     printf("Kreditbetrag zu niedrig, Programmabbruch. Return druecken... \n"); 
     gets(dummy);
     break;
     }
     else if (krb < 500.00) krb = 500.00; 
     else if (krb > 10000.00) krb = 10000.00;
     else /* kommt nicht vor */ ;
    
     //auf ganze Hunderter runden
     krb = (int)krb/100*100.00;
     
    
     //Eingabe Nominalzinsen, Berechnung monatl. Zinsfaktor
     printf("Nominalzinsen [%%] : "); scanf("%lf", &nz); gets(dummy);
     if (nz < 0.00) nz = 0.00;
     else if (nz > 100.00) nz = 100.00;
     else /* kommt nicht vor */ ;
     zf = 1+zf/100/12;
     
     
    
     //Eingabe Abzahlungsrate 
     printf("monatl. Rate [Euro] : "); scanf("%lf", &r); gets(dummy);
     printf("\n");
     
     //rmin =krb*zf60*(zf-1)/(zf60-1);
     rmin1 = krb * zf60;
     rmin2 = (zf-1)/(zf60-1);
     rmin = rmin1*rmin2;
     
     if (r < rmin) r = rmin;
     else /*kommt nicht vor*/;
    
     // Test
     printf("Testweise Uebersicht der Werte: \n");
     printf("zf60 %5.2lf \n", zf60);
     printf("Nominalzinsen %5.2lf \n", nz);
     printf("minRate %5.2lf \n", rmin); 
     printf("Rate %5.2lf \n", r);
     printf("Zinsfaktor mo %5.2lf \n", zf);
     printf("Kreditbetrag %5.2lf \n", krb);
     printf("rmin1 %5.2lf \n",rmin1);
     printf("rmin2 %5.2lf \n",rmin2);
     gets(dummy);
    
    
     //Ausgabe - > Schleife
     clrscr();
    
     printf("Bankkaufhaus Kauf & Rausch -> Berechnung von Konsumentenkrediten T. Mueller\n");
     printf("*****************************************************************************\n");
     printf("\n");
    
     printf("Kreditbedarf [500..10T Euro] : %5.0lf \n", krb);
     printf("Kreditbetrag [Euro] : %5.0lf \n", krbet);
     printf("Nominalzinsen [%%] : %5.0lf \n", nz);
     printf("monatl. Rate [R > %5.2lf Euro] : % 4.2lf \n", rmin, r);
     printf("\n");
     printf("RatenNr Zinsen Tilgung Restschuld \n");
     printf("------------------------------------------ \n");
     
     rnr = 0;
     while ( rnr < 60 && rs !=0)
     {
     rnr++;
     printf(" %2d %3.2lf %3.2lf %5.2lf \n", rnr);
     }
    
     }
    
     return 0;
    }
    
    bin unten halt noch nicht fertig weils nix bringt ohne die richtigen werte..
     
  7. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    mir scheint das pow(z,60) das problem zu sein... aber selbst wenn ich 1000*zf60 mache, gibt er 0 aus, dabei müsste das 1816,irgendwas sein. verstehe das einfach nicht ^^
     
  8. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    was sagt er dir denn bei
    Code:
    printf("Z^60=%d",zhoch);
    ohne, dass dus mit irgendwas multiplizierst?

    edit:
    Code:
    double pow ( double base, int exponent );
    so hab ichs in der referenz gefunden, sollte also nichts dagegen sprechen, dass das funktioniert, hmm...

    edit: ok, ich würde dich gerne hauen
    Code:
    double krb, zf, r, nz, rs, krbet, rmin, rmin1, rmin2;
    double zf60 = pow(zf,60);
    was fällt auf? richtig! zf ist an dieser stelle noch garnicht initialisiert. hinterher benutzt du zf60 nur lesend und niemals schreibend. er setzt also zf60 auf irgendwas, da zf60 nur ne var ist und keine funktion

    edit: genauso wie hier
    Code:
    zf = 1+zf/100/12;
    hier setzt du die variable, benutzt aber sie selbst zur berechnung des wertes. da c++ zahlen (im vergleich zu java) nicht mit 0 initialisiert, kann da jedes mal was lustiges sinnfreies anderes rauskommen.

    mein tipp: schnapp dir nen c++ buch und komm wieder, wenn du die basics gelernt hast -.-

    edit:
    Code:
    else /* kommt nicht vor */ ;
    die zeile kannst du dir auch getrost sparen, wenns keinen else fall gibt

    edit: das soll bestimmt
    Code:
    zf = 1+[color=red]nz[/color]/100/12;
    heißen oder?, wenn ja, dann einfach danach zf60 berechnen, so wie dus oben tust, nur halt erst nach dieser zeile
     
    1 Person gefällt das.
  9. 30. Oktober 2009
    AW: *Update* IF - Abfrage / Double-Werte falsch

    Also erstmal thx für die ausführliche Hilfe!

    Das ganze ist eine Projektarbeit für mein Studium btw. Bin im 1. Semester und habe bis dato nur einfache Sachen in Visual Basic gemacht, was man nicht wirklich als Grundkenntnisse bezeichnen kann.

    Code:
    zf = 1+zf/100/12;
    war auch nz, ich hatte da beim rumprobieren die falsche variable eingetragen, ändert aber nix am eigentlich problem.

    Code:
    else /* kommt nicht vor */ ;
    sollen wir laut prof so machen, da es später im berufsleben einen tüv für codes gibt meint er, der bemängelt wenn so etwas fehlt.

    Zu deinem Tipp mit den Büchern, ich hab hier 3 Bücher stehen + hunderte pdf´s + 340 Seiten Skript vom Prof, es ist aber als kompletter Anfänger nicht leicht in der Fülle der Info´s die passenden zu finden. Habe mir hier die Finger wund gegooglet nach dieser Scheiß pow() Funktion und alles mögliche probiert, aber es klappte halt nix.

    Man muss eben auch Fehler machen um daraus zu lernen ^^ Zumindest den werd ich bestimmt nicht wieder machen

    So, pow() erst unten ausführen klappt wunderbar und ich danke dir nochmals für deine ausführliche Hilfe!

    ~closed~
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.