[H]If else und while funktionieren nicht?



  • Hallo, ich habe folgendes Problem.
    Ich habe ein Programm geschrieben das die Berechnung eines Sparvertrages übernimmt.

    Hier der Quelltext:

    // ========================================================================================================================
    
    // praktikumsaufgabe1.cpp: Hauptprojektdatei.
    
    // praktikumsaufgabe1.c	: Berechnung eines Sparvertrages
    // Projekt				: Praktikumsaufgabe 1 
    // Autoren				: 
    // Version				: 1.0
    // Datum				: 09.11.2009 letzte Änderung 12.11.2009
    // Beschreibung			: Programm zur Berechnung eines Sparvetrages mit jährlichem zuwachs des Zinsatzes, 
    //						  unter Angabe von monatlichen Sparrate in Euro, dem anfänglichem Zinsatz, 
    //                        die jährliche Zinserhöhung in Prozent und der Laufzeit die 3.5 Jahre oder 10 Jahre beträgt.
    //						  Ausgabe in tabellarischer Form, wie festgelegt.
    
    // ========================================================================================================================
    
    #include "stdafx.h"
    #include "vsconio.h"
    
    double sparrate;								// monatliche Sparrate
    double zinssatz;								// anfangs Zinsatz 
    double zinszuwachs;								// jährlicher Zinssatz
    double frist;									// Kündigungsfrist
    double zins;									// Jahreszins
    double gesamtKapital;							// Gesamtkapital
    double deckungsKapital;							// Deckungskapital
    double zinsKapital;								// Zinskapital
    double zuWachs;									// Zuwachs
    double jahre;									// Jahr
    double moKf;									// Kündigungsfrist in Monaten
    double monate;									// Laufzeitvariable für Monate
    int exit;										// Variable für das beenden des Programms
    int laufzeit;									// Laufzeit des Vetrages
    int zinszu;										// Laufzeitvariable für den Zins
    char dummy [81];								// Array für Programmpause 
    
    int main(int argo, char *argv[])
    {	
     do
    {
     printf("Berechnung eines Sparvetrages\n");
     printf("-----------------------------\n\n");
     printf("Geben Sie bitte folgende Daten ein\n\n");
     printf("monatliche	Sparrate	in EURO	:");
     scanf("%lf", &sparrate);
     gets(dummy);
      if(sparrate>0)												//Sparrate=0  bedeutet Programmende
    
      {
    		printf("anfaeglicher	Zinsatz		in %%	:");
    		scanf("%lf", &zinssatz);
    		gets(dummy);
    
    		printf("jaehrlicher	Zinszuwachs	in %%	:");
    		scanf("%lf", &zinszuwachs);	
    		gets(dummy);
    
    		printf("Laufzeit	in Jahren [3, 5, 10]	:");
    		scanf("%lf", &laufzeit);
    		gets(dummy);
    
    		printf("\n\n");
    		clrscr();
    
    		if (laufzeit == 3 || laufzeit == 10) ;                         //* Laufzeit 3 oder 10 ?
    		else { laufzeit = 5; } 									   //* Wenn nein dann laufzeit = 5 */			
    
      }
    
    	printf("Kapitalentwicklung ueber %d Jahre\n", laufzeit);
    	printf("-------------------------\n");
    	printf("monatliche Sparrate	:    %9.2f Euro\n", sparrate);
    	printf("anfaenglcihe Zinssatz	:	%6.2f%% \n", zinssatz);
    	printf("jaehrlicher Zinszuwachs	:	%6.2f%% \n", zinszuwachs);
    		if(laufzeit==3)			jahre=0.25, frist=0.25;				//Jahrespalte
    		else if(laufzeit==5)	jahre=0.5, frist=0.5;
    		else if(laufzeit==10)	jahre=1, frist=1;
    		else;
    		printf("|-------|------|----------|-----------|-----------|---------|\n");
    		printf("| Jahre | Zins |  Ges Kap |  Deck Kap | Zins Kap  |  Zuwachs|\n");
    		printf("|       |  %%   |   Euro   |    Euro   |  EURO     |   %%     |\n");
    
    	jahre=0;														// Ergebnisse der Rechnungen auf Null setzten
    	zins=0;
    	gesamtKapital=0;
    	deckungsKapital=0;
    	zuWachs=0;
    	zinsKapital=0;
    	moKf=0;
    		while(jahre<laufzeit)
    			{														// Whileschleife der Laufvariable des Zins "auf"
    				jahre=(jahre+frist);
    				zinszu=0;
    				if(jahre<=1) zinszu=0;							// Laufzeitvariable für den Zins erhöhen
    				else if(jahre<=2) zinszu=1;
    				else if(jahre<=3) zinszu=2;
    				else if(jahre<=4) zinszu=3;
    				else if(jahre<=5) zinszu=4;
    				else if(jahre<=6) zinszu=5;
    				else if(jahre<=7) zinszu=6;
    				else if(jahre<=8) zinszu=7;
    				else if(jahre<=9) zinszu=8;
    				else if(jahre<=10)zinszu=9;
    				zins=zinssatz+(zinszuwachs*zinszu);					// Zins in Abhängigkeit der Jahre
    				deckungsKapital=jahre*12*sparrate;					// Berechnung des Deckungskapital
    				moKf=12*frist;										// Monate der Kündigungsfrist umgerechnet
    				monate=0;
    				while(monate<moKf)
    					{
    						gesamtKapital=(sparrate+gesamtKapital)*(1+((zins/12)/100));	// Gesamtkapital errechnet
    						monate=monate+1;											// Monate erhöhen
    					}
    				zinsKapital=gesamtKapital-deckungsKapital;						// Berechnung des Zinskapitals
    				zuWachs=zinsKapital/(deckungsKapital/100);							// Berechnung des Zuwachses
    
    		printf("| %5.2f |%6.2f| %9.2f| %9.2f | %9.2f |  %6.2f | \n", 
    		jahre, zins, gesamtKapital, deckungsKapital, zinsKapital, zuWachs);	// Ausagbe der Größen
    		}																	// while-Schleife der Laufzeitvariable des Zins "zu"
    		printf("|-------|------|----------|-----------|-----------|---------|\n");
    		printf("\n");
    		printf("Return-Taste:	");
    		gets(dummy);														// Programm hält und wartet auf Enter
    		clrscr();															// Bildschirm wird gelöscht 
    		 }
    
    		while(sparrate=0);													// while-Schleife beendet das Programm
    		printf       ("\n RETURN-Taste druecken um das Programm zu Beenden");
    		gets(dummy);														//* Eingabepuffer leeren*/
    		gets(dummy);														//* Programm anhalten bis RETURN gedrückt wird */
    		return 0;															//* Rückgabewert an das Betriebssystem */
    
    		 }
    

    Die if else schleife die wenn man für die laufzeit 3 jahre eingibt es mit drei laufen lassen soll will nicht funktionieren egal was man eingibt mach der das immer für 5 jahre.

    und wenn man sparrate =0 eingibt soll das programm beenden, will aber auch nicht richtig.

    Also wenn mir jemand dringend einen rat geben könnte, würde ich sehr dankbar sein!



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • RedScorPion schrieb:

    Also wenn mir jemand dringend einen rat geben könnte, würde ich sehr dankbar sein!

    wo der fehler ist weiss ich auch nicht, aber einen rat hab' ich doch: rechne bei finanzkram nicht mit doubles, wegen der fiesen rundungsfehler.
    🙂



  • danke für dein Rat... werde beim nächsten mal berücksichtigen



  • if (laufzeit == 3 || laufzeit == 10) ;                         //* Laufzeit 3 oder 10 ? 
            else { laufzeit = 5; }                                        //* Wenn nein dann laufzeit = 5 */
    

    was es tut, versteh ich ja - aber wieso tust du das?

    "Laufzeit die 3.5 Jahre oder 10 Jahre"
    oder sollte es heißen "die 3, 5 oder 10 Jahre"?

    und weil das da so komisch aussieht, würde ich das auch so hier tun:

    if(laufzeit != 3 && laufzeit != 10)
      laufzeit = 5;
    
    //oder
    
    switch(laufzeit)
    {
     case  3:
     case  5:
     case 10:
       break; //gar nichts tun
    
     default:
      //fehlerbehandlung - wie auch immer die aussehen mag (vll ja wirklich laufzeit = 5)
    }
    

    anfaenglcihe Zinssatz ;o)

    if(laufzeit==3)            jahre=0.25, frist=0.25;                //Jahrespalte
            else if(laufzeit==5)    jahre=0.5, frist=0.5;
            else if(laufzeit==10)    jahre=1, frist=1;
            else;
    

    das else; würd ich weglassen^^

    jahre=(jahre+frist);
                    zinszu=0;
                    if(jahre<=1) zinszu=0;                            // Laufzeitvariable für den Zins erhöhen
    

    1. klammern unnötig
    3. ?

    else if(jahre<=2) zinszu=1;
                    else if(jahre<=3) zinszu=2;
                    else if(jahre<=4) zinszu=3;
                    else if(jahre<=5) zinszu=4;
                    else if(jahre<=6) zinszu=5;
                    else if(jahre<=7) zinszu=6;
                    else if(jahre<=8) zinszu=7;
                    else if(jahre<=9) zinszu=8;
                    else if(jahre<=10)zinszu=9;
    

    fällt dir hier nix auf? Oo

    zins=zinssatz+(zinszuwachs*zinszu); klammern sind sinnlos.

    }
    
            while(sparrate=0);                                                    // while-Schleife beendet das Programm
    

    willst du vll noch mehr leerzeilen lassen?
    btw: = != == (zuweisung ungleich gleichheit ^^)
    sollte zu gleich der fehler sein ;o)

    ach so: nimm doch bitte nächstes mal die C/C++ Tags und nicht die Code tags
    dann wird wenigsten bissl was gehighlightet^^

    die vielen globalen variablen sind doch alle unnötig!?
    pack die doch wenigsten in die main-fkt(zu mal die doch nicht alle benötigt werden können!?)...
    kennst du funktionen? falls ja, solltest du deinen code vll ein wenig aufsplitten - vll wirds dann übersichtlicher...

    bb



  • Der Fehler passiert wohl beim Einlesen der Variable laufzeit. Falscher Format-Specifier für eine int-Variable würde ich sagen. 😉

    int laufzeit; 
    //...
    scanf("%lf", &laufzeit);//!!!!!
    


  • Erstmal Dankeschön das du dir die mühe gemacht hast und alles angeguckt hast und für die vielen tipps.

    Ich lerne das alles erst neu und bin noch nicht ganz in der Materie wie man das sicherlich bemerkt.

    Also nochmals danke und werde alles beherzigen was du gesagt hast.



  • np^^
    die ganzen printf/scanf aufrufe hab ich aber nicht angeguckt - ich kann kein C^^
    aber ich denke mal, dass du hier auch noch mehr tips bekommst, wenn du deinen code - nachdem du ihn überarbeitet hast - (in diesem thread nochmal) zeigst. wenn du konkrete fragen dazu hast, dann bekommst du so gar mit ziemlicher sicherheit ne antwort
    ich verzieh mich ma wieder ins c++ forum - hf gl ^^



  • Ups, hab auch nur die Hälfte der Fragen beantwortet. 🙂

    Nochmal deutlich:

    1. Du kannst eine int-Variable nicht so einlesen, das führt zu Murks

    int laufzeit;
    //...
    scanf("%lf", &laufzeit);//!!!!!
    

    Für Ganzzahlen gibt es %d, also:

    scanf("%d", &laufzeit);
    

    2. Die Zeile

    // ...
    while(sparrate=0);
    

    ist eine Zuweisung. Ein Prüfung der Variable auf 0 oder ungleich 0 wäre

    while(sparrate == 0.0)
    

    bzw.

    while(sparrate != 0.0)
    

    Das waren sozusagen die augenscheinlichen Dinge. Inwieweit noch irgendwelche Denkfehler in deinem Programm sind ist schwer zu sagen, aber denen kommst du sicher auch selbst auf die Spur. 😉



  • So ich habe einige Sachen geändert. Bis auf kosmetischen Fehler sollte alles gehen so die Theorie, aber leider will es immer noch nicht ganz gehen.

    // ========================================================================================================================
    
    // praktikumsaufgabe1.cpp: Hauptprojektdatei.
    
    // praktikumsaufgabe1.c	: Berechnung eines Sparvertrages
    // Projekt				: Praktikumsaufgabe 1 
    // Autoren				: Yunus Eren, Serkan Tüfekci
    // Version				: 1.0
    // Datum				: 09.11.2009 letzte Änderung 12.11.2009
    // Beschreibung			: Programm zur Berechnung eines Sparvetrages mit jährlichem zuwachs des Zinsatzes, 
    //						  unter Angabe von monatlichen Sparrate in Euro, dem anfänglichem Zinsatz, 
    //                        die jährliche Zinserhöhung in Prozent und der Laufzeit die 3.5 Jahre oder 10 Jahre beträgt.
    //						  Ausgabe in tabellarischer Form, wie festgelegt.
    
    // ========================================================================================================================
    
    #include "stdafx.h"
    #include "vsconio.h"
    
    double sparrate;								// monatliche Sparrate
    double zinssatz;								// anfangs Zinsatz 
    double zinszuwachs;								// jährlicher Zinssatz
    double frist;									// Kündigungsfrist
    double zins;									// Jahreszins
    double gesamtKapital;							// Gesamtkapital
    double deckungsKapital;							// Deckungskapital
    double zinsKapital;								// Zinskapital
    double zuWachs;									// Zuwachs
    double jahre;									// Jahr
    double moKf;									// Kündigungsfrist in Monaten
    double monate;									// Laufzeitvariable für Monate
    int exit;										// Variable für das beenden des Programms
    int laufzeit;									// Laufzeit des Vetrages
    int zinszu;										// Laufzeitvariable für den Zins
    char dummy [81];								// Array für Programmpause 
    
    int main(int argo, char *argv[])
    {	
     do
    {
     printf("Berechnung eines Sparvetrages\n");
     printf("-----------------------------\n\n");
     printf("Geben Sie bitte folgende Daten ein\n\n");
     printf("monatliche	Sparrate	in EURO	:");
     scanf("%lf", &sparrate);
     gets(dummy);
      if(sparrate>0)												//Sparrate=0  bedeutet Programmende
    
      {
    		printf("anfaeglicher	Zinsatz		in %%	:");
    		scanf("%lf", &zinssatz);
    		gets(dummy);
    
    		printf("jaehrlicher	Zinszuwachs	in %%	:");
    		scanf("%lf", &zinszuwachs);	
    		gets(dummy);
    
    		printf("Laufzeit	in Jahren [3, 5, 10]	:");
    		scanf("%d", &laufzeit);
    		gets(dummy);
    
    		printf("\n\n");
    		clrscr();
    
    		switch(laufzeit)
    		{
    			case 3: laufzeit=3;
    			case 5: laufzeit=5;
    			case 10: laufzeit=10;
    			default: laufzeit=5;
    		}
      }
    
    	printf("Kapitalentwicklung ueber %d Jahre\n", laufzeit);
    	printf("-------------------------\n");
    	printf("monatliche Sparrate	:    %9.2f Euro\n", sparrate);
    	printf("anfaenglcihe Zinssatz	:	%6.2f%% \n", zinssatz);
    	printf("jaehrlicher Zinszuwachs	:	%6.2f%% \n", zinszuwachs);
    		if(laufzeit==3)			jahre=0.25, frist=0.25;				//Jahrespalte
    		else if(laufzeit==5)	jahre=0.5, frist=0.5;
    		else if(laufzeit==10)	jahre=1, frist=1;
    
    		printf("|-------|------|----------|-----------|-----------|---------|\n");
    		printf("| Jahre | Zins |  Ges Kap |  Deck Kap | Zins Kap  |  Zuwachs|\n");
    		printf("|       |  %%   |   Euro   |    Euro   |  EURO     |   %%     |\n");
    
    	jahre=0;														// Ergebnisse der Rechnungen auf Null setzten
    	zins=0;
    	gesamtKapital=0;
    	deckungsKapital=0;
    	zuWachs=0;
    	zinsKapital=0;
    	moKf=0;
    		while(jahre<laufzeit)
    			{														// Whileschleife der Laufvariable des Zins "auf"
    				jahre=jahre+frist;
    				zinszu=0;
    				if(jahre<=1) zinszu=0;							// Laufzeitvariable für den Zins erhöhen
    				else if(jahre<=2) zinszu=1;
    				else if(jahre<=3) zinszu=2;
    				else if(jahre<=4) zinszu=3;
    				else if(jahre<=5) zinszu=4;
    				else if(jahre<=6) zinszu=5;
    				else if(jahre<=7) zinszu=6;
    				else if(jahre<=8) zinszu=7;
    				else if(jahre<=9) zinszu=8;
    				else if(jahre<=10)zinszu=9;
    				zins=zinssatz+zinszuwachs*zinszu;					// Zins in Abhängigkeit der Jahre
    				deckungsKapital=jahre*12*sparrate;					// Berechnung des Deckungskapital
    				moKf=12*frist;										// Monate der Kündigungsfrist umgerechnet
    				monate=0;
    				while(monate<moKf)
    					{
    						gesamtKapital=(sparrate+gesamtKapital)*(1+((zins/12)/100));	// Gesamtkapital errechnet
    						monate=monate+1;											// Monate erhöhen
    					}
    				zinsKapital=gesamtKapital-deckungsKapital;						// Berechnung des Zinskapitals
    				zuWachs=zinsKapital/(deckungsKapital/100);							// Berechnung des Zuwachses
    
    		printf("| %5.2f |%6.2f| %9.2f| %9.2f | %9.2f |  %6.2f | \n", 
    		jahre, zins, gesamtKapital, deckungsKapital, zinsKapital, zuWachs);	// Ausagbe der Größen
    		}																	// while-Schleife der Laufzeitvariable des Zins "zu"
    		printf("|-------|------|----------|-----------|-----------|---------|\n");
    		printf("\n");
    		printf("Return-Taste:	");
    		gets(dummy);														// Programm hält und wartet auf Enter
    		clrscr();															// Bildschirm wird gelöscht 
    		 }
    
    		while(sparrate==0);													// while-Schleife beendet das Programm
    		return 0;															// Rückgabewert an das Betriebssystem 
    
    		 }
    

    Das ist das Ganze Programm. Folgendes will nicht wie ich will.

    Wenn ich als laufzeit 3 eingebe müsste das Programm eine Kapitalentwicklung über 3 Jahre anzeigen. Es wird aber immer nur 5 Jahre angezeigt.

    switch(laufzeit)
    		{
    			case 3: laufzeit=3;
    			case 5: laufzeit=5;
    			case 10: laufzeit=10;
    			default: laufzeit=5;
    		}
      }
    
    	printf("Kapitalentwicklung ueber %d Jahre\n", laufzeit);
    	printf("-------------------------\n");
    	printf("monatliche Sparrate	:    %9.2f Euro\n", sparrate);
    	printf("anfaenglcihe Zinssatz	:	%6.2f%% \n", zinssatz);
    	printf("jaehrlicher Zinszuwachs	:	%6.2f%% \n", zinszuwachs);
    		if(laufzeit==3)			jahre=0.25, frist=0.25;				//Jahrespalte
    		else if(laufzeit==5)	jahre=0.5, frist=0.5;
    		else if(laufzeit==10)	jahre=1, frist=1;
    

    Vom der Logik müsste das wenn case 3 ist auch die Kapitalentwicklung über 3 Jahre gezeigt werden und das gleiche für 5 Jahre und 10 Jahre. Wenn die eingabe etwas anderes ist als die, sollte 5 Jahre angewendet werden.



  • Switch ist nur so eine Art goto, deshalb muss bei jeder Sprungmarke ein break eingefügt werden, sonst werden auch die Anweisungen dahinter ausgeführt.

    switch(laufzeit)
            {
                case 3: laufzeit=3; break;
                case 5: laufzeit=5; break;
                case 10: laufzeit=10; break;
                default: laufzeit=5;
            }
    

    Und bist du sicher, dass du

    while(sparrate==0);
    

    gemeint hast und nicht

    while(sparrate!=0);
    

    bzw.

    while(sparrate>0);
    

    ?



  • OK ich habe die ganze Nacht durchgemacht, aber habe es geschafft es funktioniert jetzt perfekt 😃 , musste es komplett neu schreiben, Übung macht den Meister ;).

    Ich habe diesmal switch außen vor gelassen und es mit if gemacht. Trotzdem danke für die erklärung für switch.


Anmelden zum Antworten