Römische Zahlen Programm -



  • Hallo zusammen,
    ich muss im Rahmen meines Studiums ein Programm zur Umwandlung von Dezimalzahlen in Römische Zahlen schreiben.

    Im Moment hänge ich aber an einer Fehlermeldung, wodurch ich auch meine Programm leider nicht testen kann.

    Nach dem Eingeben einer RömZahl z.B.: X kommt diese Fehlermeldung:

    "Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in Roemische Zahlen.exe aufgetreten.

    Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

    Da ich nur wenig Ahnung von C++ habe (erst 3 Monate) komme ich da alleine nicht weiter.

    Hier mein Programm-Code

    //Dez2Roem
    	if (d==2)
    	{
    		//Variablen deklarieren
    			double dz;
    
    		//Eingabe Dezimalzahl
    			printf("*****************************\n");
    			printf("Dezimalzahl in roemische Zahl\n");
    			printf("*****************************\n");
    			printf("Dezimalzahl eingeben:");
    			fflush(stdout);
    			scanf("%lf", dz);
    		//Deklaration string
    			std::string roem("a");
    
    				while(dz >= 1000)
    					{
    					roem+="M";
    					dz = dz - 1000;
    					}
    
    				while(dz >= 500)
    					{
    						if(dz >= 900)
    						{
    						roem+="CM";
    						dz = dz - 900;
    						}
    					roem+="D";
    					dz= dz - 500;
    					}
    
    				while(dz >= 100)
    				{
    						if(dz >= 400)
    						{
    							roem+="CD";
    							dz = dz - 400;};
    						if(dz > 100)
    						{
    							roem+="C";
    							dz = dz - 100;
    						}
    				}
    
    				while(dz >= 50)
    				{
    						if(dz == 90)
    						{
    						roem+="XC";
    						dz = dz - 90;
    						}
    						if(dz >= 50)
    						{
    						roem+="L";
    						dz = dz - 50;
    						}
    				}
    
    				while(dz >= 10)
    				{
    						if(dz == 40)
    						{
    						roem+="XL";
    						dz= dz - 40;
    						}
    						if(dz >= 10)
    						{
    						roem+="X";
    						dz = dz - 10;
    						}
    				}
    
    				while(dz >= 5)
    				{
    				if(dz == 9)
    				{
    						roem+="IX";
    						dz = dz - 9;
    						}
    						if(dz >= 5)
    						{
    						roem+="V";
    						dz= dz - 5;
    						}
    				}
    
    				while(dz >= 1)
    				{
    						if(dz == 4)
    						{
    						roem+="IV";
    						dz = dz - 4;
    						}
    					roem+="I";
    					dz = dz - 1;
    				}
    
    	//Ausgabe Römische Zahl
    	printf("Roemische Zahl: %s", roem);
    
    	fflush(stdin);
    	getchar();
    	goto anfang;
    	}
    

    Danke schonmal für eure Hilfe!!

    Gruß
    Dominik



  • also was du da programmierst ist c nicht c++ abgesehen von std::string. dann ist fflush(stdin) ganz böse, weil es nicht das macht, was du denkst. und goto ist auch nicht gut, aber wenn dein programm irgendwann größer wird, hast du keine ahnung wo welches goto hin geht.
    zu deinem fehler, ich würde mal sagen, das passiert in zeile 101, denn du kannst, so weit ich weiß, keine std::string ohne weiteres mit printf ausgeben.


  • Mod

    printf("Dezimalzahl eingeben:");
    

    Schlechtes C.

    fflush(stdout);
    

    C. Undefiniertes Verhalten.

    scanf("%lf", dz);
    

    Falsches C.

    printf("Roemische Zahl: %s", roem);
    

    Mischung von C- und C++-Standardbibliothek, undefiniertes Verhalten.

    goto anfang;
    

    Considered harmful.

    Das dritte und das vierte verursachen deinen Absturz, aber der eigentliche Schuldige ist der Stil deines Programms. Kam in der Uni echt printf, scanf, fflush(stdin) und goto? Oder ist das eventuell ein C-Kurs und du hast dir den String woanders angeguckt? Auf jeden Fall wird dein Code gleich noch viel mehr zerrissen werden, das ist wirklich eine der übelsten Sprachpanschereien die hier jemals vorgekommen sind und das will was heißen! Da passieren Abstürze natürlich dauernd.



  • Dominik 2 schrieb:

    "Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in Roemische Zahlen.exe aufgetreten.

    Und mal abgesehen von dem von SeppJ gesagten hast du keine C++ Anwendung sondern eine C++/CLI Anwendung erstellt.



  • SeppJ schrieb:

    printf("Dezimalzahl eingeben:");
    

    Schlechtes C.

    fflush(stdout);
    

    C. Undefiniertes Verhalten.

    scanf("%lf", dz);
    

    Falsches C.

    printf("Roemische Zahl: %s", roem);
    

    Mischung von C- und C++-Standardbibliothek, undefiniertes Verhalten.

    goto anfang;
    

    Considered harmful.

    Das dritte und das vierte verursachen deinen Absturz, aber der eigentliche Schuldige ist der Stil deines Programms. Kam in der Uni echt printf, scanf, fflush(stdin) und goto? Oder ist das eventuell ein C-Kurs und du hast dir den String woanders angeguckt? Auf jeden Fall wird dein Code gleich noch viel mehr zerrissen werden, das ist wirklich eine der übelsten Sprachpanschereien die hier jemals vorgekommen sind und das will was heißen! Da passieren Abstürze natürlich dauernd.

    Danke schonmal für eure Beiträge.

    Die Befehle printf .... haben wir so in der Vorlesung gelernt, da wüsste ich nicht wie ich das anders lösen soll.

    Goto wurde gesagt, dass es nicht gern gesehen wird, aber da ich nur einmal ein goto verwende dacht ich mir das wird schon nicht so schlimm sein 😉

    Da wir die Vorlesung erst seit diesem Semester haben und das auch nur mit wenig Wochenstunden, habe ich viele Inhalte in meinem Programm aus einem Buch, sowie Google und Co. zusammengesucht.

    Von diesem Projekt wird keine perfekte Lösung erwartet, sondern viel mehr das man sich mit dem Thema auseinander setzt.

    Wie kann ich den Fehler möglichst einfach in den Griff bekommen?


  • Mod

    Dominik 2 schrieb:

    Wie kann ich den Fehler möglichst einfach in den Griff bekommen?

    C oder C++ lernen. Betonung auf 'oder', weil du derzeit nicht unterscheidest (es sieht so aus, als würdest du in der Uni C lernen, aber du hast dir bei Google C++ gefunden). Mischung kommt ganz ganz schlecht und verursacht hier die Abstürze. Und auf 'lernen', denn selbst die Sachen die du benutzt, benutzt du falsch, wie dein scanf (ganz falsch, es braucht eine Adresse) oder das fflush (funktioniert in einer bestimmten Implementierung eines bestimmten Compilers so wie du denkst, bei allen anderen nicht).

    Das geht aber nicht "möglichst einfach". Du wirst dich schon etwas anstrengen müssen. Und vermutlich auch noch nebenher Lernen. Denn wenn in der Uni wirklich string neben printf kam oder wenn dort wirklich fllush(stdin) als legitim dargestellt wurde, dann kannst du den Kurs sowieso vergessen. Wenn dort aber nur printf und scanf kamen und vor goto gewarnt wurde und du den C++-Kram dir selbst aus dem Internet gesucht hast, dann ist es ein C Kurs und du hast bloß nicht mitbekommen, welche Sprache ihr lernt und dass es einen riesigen Unterschied zwischen C und C++ gibt.


Anmelden zum Antworten