Römische Zahlen

Schnelle objektorientierte, kompilierende Programmiersprache.
MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mo Jan 26, 2015 11:09 am

Hallo !

Ich hab nun die Geschichte etwas umgeschrieben und arbeite mit Modulo und der for Schleife. Leider stürzt nun mein Programm immer komplett ab wenn ich die Dezimalzahl eingebe. Woran kann das liegen ?

Code: Alles auswählen

# include <stdio.h>
# include "conio.h"
# include "ctype.h"

int main(void)

{
	int dezimalzahl;
	int dezimalzahl1000;
	int dezimalzahl900;
	int dezimalzahl500;
	int dezimalzahl400;
	int dezimalzahl100;
	int dezimalzahl90;
	int dezimalzahl50;
	int dezimalzahl40;
	int dezimalzahl10;
	int dezimalzahl9;
	int dezimalzahl5;
	int dezimalzahl4;
	int dezimalzahl3;
	int dezimalzahl2;
	int dezimalzahl1;
	int i;
	int Rest;


	printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
	printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
	scanf("%i")&dezimalzahl;


	dezimalzahl1000 = dezimalzahl/1000;
	if(dezimalzahl1000<=1)
	{
		for(int i=1;i<=dezimalzahl1000;i++)
		{
			printf("M");
		}
	}
	else
		printf("CM");
		
	Rest = dezimalzahl % 1000;

	if(dezimalzahl500<=1)
	{
		for(int i=1;i<=dezimalzahl500;i++)
		{
			printf("D");
		}
	}
	else
		printf("CD");
		
	Rest = dezimalzahl % 500;

	if(dezimalzahl100<=1)
	{
		for(int i=1;i<=dezimalzahl100;i++)
		{
			printf("C");
		}
	}
	else
		printf("XC");
		
	Rest = dezimalzahl % 100;

	if(dezimalzahl50<=1)
	{
		for(int i=1;i<=dezimalzahl50;i++)
		{
			printf("L");
		}
	}
	else
		printf("XL");
		
	Rest = dezimalzahl % 50;


	if(dezimalzahl10<=1)
	{
		for(int i=1;i<=dezimalzahl10;i++)
		{
			printf("X");
		}
	}
	else
		printf("IX");
		
	Rest = dezimalzahl % 10;


	if(dezimalzahl5<=1)
	{
		for(int i=1;i<=dezimalzahl5;i++)
		{
			printf("V");
		}
	}
	else
		printf("IV");
		
	Rest = dezimalzahl % 5;

	if(dezimalzahl3<=1)
	{
		for(int i=1;i<=dezimalzahl3;i++)
		{
			printf("III");
		}
	}
	else
		printf("II");
		
	Rest = dezimalzahl % 2;


	if(dezimalzahl1<=1)
	{
		for(int i=1;i<=dezimalzahl1;i++)
		{
			printf("I");
		}

	}

getch();

return 0;

}
MfG

Marty

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Römische Zahlen

Beitrag von cloidnerux » Mo Jan 26, 2015 11:17 am

Leider stürzt nun mein Programm immer komplett ab wenn ich die Dezimalzahl eingebe. Woran kann das liegen ?
Das sieht mir ziemlich falsch aus:

Code: Alles auswählen

scanf("%i")&dezimalzahl;
Schau nochmal hier nach: scanf()

Code: Alles auswählen

 Rest = dezimalzahl % 1000;

   if(dezimalzahl500<=1)
Du weist "dezimalzahl500" nichts zu, der Wert wird im besten Fall 0, im schlimmsten Fall zufällig sein.
Meintest du vielleicht eher

Code: Alles auswählen

Rest = dezimalzahl % 1000;
if((Rest / 500) <= 1)
oder

Code: Alles auswählen

Rest = dezimalzahl % 1000;
dezimalzahl500 = Rest / 500;
if(dezimalzahl500<=1)
Du kannst auch den Code durch den Einsatz von Arrays reduzieren:

Code: Alles auswählen

int zahlen[]={1000, 500, 100, 50, 20, 10, 5, 3, 2, 1};
char * ziffern[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "III", "II", "I"};
[...]
for(int i = 0; i < 10; i++)
{
    teiler = zahl / zahlen[i];
    rest = zahl % zahlen[i];
    if(teiler == 1)
        printf(ziffern[i]);
    [...]
}
}
Edit by Xin: Link zu scanf() korrigiert
Redundanz macht wiederholen unnötig.
quod erat expectandum

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mo Jan 26, 2015 11:34 am

Code: Alles auswählen

scanf("%i")&dezimalzahl;
Hier will ich die dezimalzahl einlesen als ganze Zahl desswegen doch das i?

Code: Alles auswählen

Rest = dezimalzahl % 1000;
if((Rest / 500) <= 1)
O.K. verstanden wollte immer die Dezimalzahl durchschleifen und hab vergessen das es immer der Rest ist den ich bis nach unten durchschleifen muss !

MfG

Marty

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Römische Zahlen

Beitrag von Xin » Mo Jan 26, 2015 11:49 am

MartyMcFly1976 hat geschrieben:

Code: Alles auswählen

scanf("%i")&dezimalzahl;
Hier will ich die dezimalzahl einlesen als ganze Zahl desswegen doch das i?
scanf liefert ein Ergebnis (die Anzahl der eingelesenen Zeichen) und das verundest (UND-Operation -> a & b) Du. Hier wird nicht der Address-Operator( &a ) aufgerufen. Du möchtest scanf mitteilen, dass es die Zahl %i an die Adresse von dezimalzahl schreiben möchte.
Dein Ausdruck ist syntaktisch korrekt, aber semantisch ähm... naja, halt Unsinn.

Code: Alles auswählen

scanf("%i", &dezimalzahl );
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mo Jan 26, 2015 3:03 pm

So bisschen für die Klausur gelernt und dann geht weiter hier !

Code: Alles auswählen

# include <stdio.h>
# include "conio.h"
# include "ctype.h"

int main(void)

{
	int dezimalzahl;
	int dezimalzahl1000;
	int dezimalzahl900;
	int dezimalzahl500;
	int dezimalzahl400;
	int dezimalzahl100;
	int dezimalzahl90;
	int dezimalzahl50;
	int dezimalzahl40;
	int dezimalzahl10;
	int dezimalzahl9;
	int dezimalzahl5;
	int dezimalzahl4;
	int dezimalzahl3;
	int dezimalzahl2;
	int dezimalzahl1;
	int i;
	int Rest;


	printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
	printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
	scanf("%d")&dezimalzahl;


	dezimalzahl1000 = dezimalzahl/1000;
	if(dezimalzahl1000<=1)
	{
		for(int i=1;i<=dezimalzahl1000;i++)
		{
			printf("M");
		}
	}
	else
		printf("CM");
		
	Rest = dezimalzahl % 1000;

	if((Rest / 500) <=1)
	{
		for(int i=1;i<=dezimalzahl500;i++)
		{
			printf("D");
		}
	}
	else
		printf("CD");
		
	Rest = dezimalzahl % 500;

	if((Rest / 100) <=1)
	{
		for(int i=1;i<=dezimalzahl100;i++)
		{
			printf("C");
		}
	}
	else
		printf("XC");
		
	Rest = dezimalzahl % 100;

	if((Rest / 50) <=1)
	{
		for(int i=1;i<=dezimalzahl50;i++)
		{
			printf("L");
		}
	}
	else
		printf("XL");
		
	Rest = dezimalzahl % 50;


	if((Rest / 10) <=1)
	{
		for(int i=1;i<=dezimalzahl10;i++)
		{
			printf("X");
		}
	}
	else
		printf("IX");
		
	Rest = dezimalzahl % 10;


	if((Rest / 5) <=1)
	{
		for(int i=1;i<=dezimalzahl5;i++)
		{
			printf("V");
		}
	}
	else
		printf("IV");
		
	Rest = dezimalzahl % 5;

	if((Rest / 3) <=1)
	{
		for(int i=1;i<=dezimalzahl3;i++)
		{
			printf("III");
		}
	}
	else
		printf("II");
		
	Rest = dezimalzahl % 2;


	if((Rest / 1)<=1)
	{
		for(int i=1;i<=dezimalzahl1;i++)
		{
			printf("I");
		}

	}

getch();

return 0;

}
Nun hab ich das dezimal gegen den Rest ausgetauscht und in scanf d eingetragen so wie beim Tannenbaum :oops: !

MfG

Marty

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Römische Zahlen

Beitrag von cloidnerux » Mo Jan 26, 2015 3:14 pm

Nun hab ich das dezimal gegen den Rest ausgetauscht und in scanf d eingetragen so wie beim Tannenbaum :oops: !
Aber möchtest noch immer nicht die Klammer auch um das "&dezimalzahl" schreiben?

Code: Alles auswählen

scanf("%d")&dezimalzahl;
=>

Code: Alles auswählen

scanf("%d", &dezimalzahl);
Redundanz macht wiederholen unnötig.
quod erat expectandum

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mo Jan 26, 2015 4:03 pm

Hi !
cloidnerux hat geschrieben:
Nun hab ich das dezimal gegen den Rest ausgetauscht und in scanf d eingetragen so wie beim Tannenbaum :oops: !
Aber möchtest noch immer nicht die Klammer auch um das "&dezimalzahl" schreiben?

Code: Alles auswählen

scanf("%d")&dezimalzahl;
=>

Code: Alles auswählen

scanf("%d", &dezimalzahl);
Poah stimmt, geguckt und doch net richtig, zwei Sachen gleichzeitig lernen klappt net wirklich gut :roll: ! Immer so kleine Sachen die ich übersehe !

Nu bleib ich hier dran und mache das erst fertig !

Es dauert immer nur ein bischen weil mir das Programm nach einer Eingabe immer abschmiert. Teilweise muss ich neu starten !

Jetzt muss ich wohl hier auch was ändern :

Code: Alles auswählen

for(int i=1;i<=dezimalzahl500;i++
Wenn ich das nun richtig verstanden habe muss in dieser Zeile auch der REST drin stehen, denn sonst sucht er nach dem WERT in der "dezimalzahl500" den es aber nicht gibt da ich ihn nicht zugewiesen habe ?!? :?:

Dann würde es so aussehen :

Code: Alles auswählen

# include <stdio.h>
# include "conio.h"
# include "ctype.h"

int main(void)

{
	int dezimalzahl;
	int dezimalzahl1000;
	int dezimalzahl900;
	int dezimalzahl500;
	int dezimalzahl400;
	int dezimalzahl100;
	int dezimalzahl90;
	int dezimalzahl50;
	int dezimalzahl40;
	int dezimalzahl10;
	int dezimalzahl9;
	int dezimalzahl5;
	int dezimalzahl4;
	int dezimalzahl3;
	int dezimalzahl2;
	int dezimalzahl1;
	int i;
	int Rest;


	printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
	printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
	scanf("%d",&dezimalzahl);


	dezimalzahl1000 = dezimalzahl/1000;
	if(dezimalzahl1000<=1)
	{
		for(int i=1;i<=dezimalzahl1000;i++)
		{
			printf("M");
		}
	}
	else
		printf("CM");
		
	Rest = dezimalzahl % 1000;

	if((Rest / 500) <=1)
	{
		for(int i=1;i<=Rest / 500;i++)
		{
			printf("D");
		}
	}
	else
		printf("CD");
		
	Rest = dezimalzahl % 500;

	if((Rest / 100) <=1)
	{
		for(int i=1;i<=Rest / 100;i++)
		{
			printf("C");
		}
	}
	else
		printf("XC");
		
	Rest = dezimalzahl % 100;

	if((Rest / 50) <=1)
	{
		for(int i=1;i<=Rest / 50;i++)
		{
			printf("L");
		}
	}
	else
		printf("XL");
		
	Rest = dezimalzahl % 50;


	if((Rest / 10) <=1)
	{
		for(int i=1;i<=Rest / 10;i++)
		{
			printf("X");
		}
	}
	else
		printf("IX");
		
	Rest = dezimalzahl % 10;


	if((Rest / 5) <=1)
	{
		for(int i=1;i<=Rest / 5;i++)
		{
			printf("V");
		}
	}
	else
		printf("IV");
		
	Rest = dezimalzahl % 5;

	if((Rest / 3) <=1)
	{
		for(int i=1;i<=Rest / 3;i++)
		{
			printf("III");
		}
	}
	else
		printf("II");
		
	Rest = dezimalzahl % 1;


	if((Rest / 1)<=1)
	{
		for(int i=1;i<=Rest /1;i++)
		{
			printf("I");
		}

	}

getch();

return 0;

}
So funktionieren schon mal ein paar Einzelzahlen iwe I II III und nun habe ich glaube ich nur noch kleine Fehler in den einzelnen Zeilen ! Die Sonderzahlen wie IV versuche ich nun mal anzugehen.

MfG

Marty

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Römische Zahlen

Beitrag von cloidnerux » Mo Jan 26, 2015 5:24 pm

Code: Alles auswählen

for(int i=1;i<=dezimalzahl500;i++
Wenn ich das nun richtig verstanden habe muss in dieser Zeile auch der REST drin stehen, denn sonst sucht er nach dem WERT in der "dezimalzahl500" den es aber nicht gibt da ich ihn nicht zugewiesen habe ?!? :?:
Ich brauchte etwas, um das zu verstehen.
So wie das programmiert ist, ist es unnötig.

Code: Alles auswählen

  Rest = dezimalzahl % 1000;

   if((Rest / 500) <=1)
   {
      for(int i=1;i<=Rest / 500;i++)
      {
         printf("D");
      }
   }
   else
      printf("CD");
Modulo (%) liefert dir den Rest einer ganzzahligen Division.
Wenn du z.B die Zahl 1346 durch 1000 Teilst, erhälst du 1 Rest 346.
Daraus ergibt sich eine Konsequenz, nämlich das für

Code: Alles auswählen

c = a % b;
c immer kleiner als b ist und größer gleich 0.
Macht ja auch sinn, wenn du durch 1000 teilst und als Rest 1000 heraus kommen würde, ist ja irgendwas schief gelaufen.

Warum erwähne ich das?
Weil du eine Schleife eingebaut hast, in der du schaust wie oft die 500 in den Rest der Division durch 1000 passt. Dieser Rest ist aber maximal 999, da passt 500 genau 1 mal rein.
=> Die Schleife ist unnütz.
Weiterhin ist deine Bedingung auch falsch

Code: Alles auswählen

 if((Rest / 500) <=1)
Rest ist maximal 999, das Ergebnis der Division ist daher entweder 0(Rest < 500) oder 1(Rest >= 500). Daher kann das else nie ausgeführt werden.
Es müsste also so aussehen:

Code: Alles auswählen

if((Rest / 500) == 1)
{
    printf("D");
}
else
    printf("CD");
[/code]

Genauso ist die Bedingung für die Hunderter falsch:

Code: Alles auswählen

if((Rest / 100) <=1)
Wenn Rest jetzt 485 wäre, dann würde nicht C ausgegeben, sondern XC, da 485 / 100 = 4 ist.
Richtig heißt es:

Code: Alles auswählen

if((Rest / 100) >= 1)
{
    for(int i = 0; i < (Rest / 100); i++)   //Ich fange mit index 0 an, weil es so Standard für arrays ist, dafür ist das <= zu einem < geworden
    {
        printf("C");
    }
}
else
      printf("XC");
Redundanz macht wiederholen unnötig.
quod erat expectandum

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mo Jan 26, 2015 6:18 pm

Soweit so gut, dann muss ich ja auch die 50 so umschreiben wie die 500 und die 10 wie die 100 dann wieder die 5 wie die 50 !

Im Moment schreibt er noch weitere Zahlen hinter das Richtige Ergebnis ! z.B. 800 DCCC und zusätzlich noch XLIXIV.

Code: Alles auswählen

# include <stdio.h>
# include "conio.h"
# include "ctype.h"

int main(void)

{
	int dezimalzahl;
	int dezimalzahl1000;
	int dezimalzahl900;
	int dezimalzahl500;
	int dezimalzahl400;
	int dezimalzahl100;
	int dezimalzahl90;
	int dezimalzahl50;
	int dezimalzahl40;
	int dezimalzahl10;
	int dezimalzahl9;
	int dezimalzahl5;
	int dezimalzahl4;
	int dezimalzahl3;
	int dezimalzahl2;
	int dezimalzahl1;
	int i;
	int Rest;


	printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
	printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
	scanf("%d",&dezimalzahl);


	dezimalzahl1000 = dezimalzahl/1000;
	if(dezimalzahl1000<=1)
	{
		for(int i=1;i<=dezimalzahl1000;i++)
		{
			printf("M");
		}
	}
	else
		printf("CM");
		
	Rest = dezimalzahl % 1000;

	if((Rest / 500) ==1)
	{
		printf("D");
	}
	else
		printf("CD");
		
	Rest = dezimalzahl % 500;

	if((Rest / 100) >= 1)
	{
    for(int i = 0; i < (Rest / 100); i++)
        printf("C");
	}
	else
       printf("XC");
		
	Rest = dezimalzahl % 100;

	if((Rest / 50) ==1)
	{
		printf("L");
	}
	else
		printf("XL");
		
	Rest = dezimalzahl % 50;


	if((Rest / 10) >=1)
	{
		for(int i=0;i < Rest / 10;i++)
		{
			printf("X");
		}
	}
	else
		printf("IX");
		
	Rest = dezimalzahl % 10;


	if((Rest / 5) ==1)
	{
		for(int i=1;i < Rest / 5;i++)
		{
			printf("V");
		}
	}
	else
		printf("IV");
		
	Rest = dezimalzahl % 5;

	if((Rest / 3) <=1)
	{
		for(int i=1;i<= Rest / 3;i++)
		{
			printf("III");
		}
	}
	else
		printf("II");
		
	Rest = dezimalzahl % 1;


	if((Rest / 1)<=1)
	{
		for(int i=1;i<= Rest / 1;i++)
		{
			printf("I");
		}

	}

getch();

return 0;

}
MfG

Marty

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » So Feb 01, 2015 11:01 am

Schönen Sonntag morgen !

Nach einer Woche voller Klausuren hab ich nun mal wieder Zeit gefunden an dem Programm zu schreiben !

Bis hierhin bin ich nun gekommen :

Code: Alles auswählen

# include <stdio.h>
# include "conio.h"
# include "ctype.h"

int main(void)

{
   int dezimalzahl;
   int dezimalzahl1000;
   int dezimalzahl900;
   int dezimalzahl500;
   int dezimalzahl400;
   int dezimalzahl100;
   int dezimalzahl90;
   int dezimalzahl50;
   int dezimalzahl40;
   int dezimalzahl10;
   int dezimalzahl9;
   int dezimalzahl5;
   int dezimalzahl4;
   int dezimalzahl3;
   int dezimalzahl2;
   int dezimalzahl1;
   int i;
   int Rest;


   printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
   printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
   scanf("%d",&dezimalzahl);


   dezimalzahl1000 = dezimalzahl/1000;
   if(dezimalzahl1000<=1)
   {
      for(int i=1;i<=dezimalzahl1000;i++)
      {
         printf("M");
      }
   }
   else
      printf("CM");
      
   Rest = dezimalzahl % 1000;

   if((Rest / 500) <=1)
   {
      for(int i=1;i<=Rest / 500;i++)
      {
         printf("D");
      }
   }
   else
      printf("CD");
      
   Rest = dezimalzahl % 500;

   if((Rest / 100) <=1)

   {
      for(int i=1;i<=Rest / 100;i++)
      {
         printf("C");
      }
   }
   else
      printf("XC");
      
   Rest = dezimalzahl % 100;

   if((Rest / 50) <=1)
   {
      for(int i=1;i<=Rest / 50;i++)
      {
         printf("L");
      }
   }
   else
      printf("XL");
      
   Rest = dezimalzahl % 50;


   if((Rest / 10) <=1)
   {
      for(int i=1;i<=Rest / 10;i++)
      {
         printf("X");
      }
   }
   else
      printf("IX");
      
   Rest = dezimalzahl % 10;


   if((Rest / 5) <=1)
   {
      for(int i=1;i<=Rest / 5;i++)
      {
         printf("V");
      }
   }
   else
      printf("IV");
      
   Rest = dezimalzahl % 5;

   if((Rest / 3) <=1)
   {
      for(int i=1;i<=Rest / 3;i++)
      {
         printf("III");
      }
   }
   else
      printf("II");
      
   Rest = dezimalzahl % 1;


   if((Rest / 1)<=1)
   {
      for(int i=1;i<=Rest /1;i++)
      {
         printf("I");
      }

   }

getch();

return 0;

}
Leider hab ich irgendwo wohl noch einen rechnenfehler drin denn einzelne Zahlen zeigt das Programm mir an nur noch nicht alle !

Kann mir jemand einen Tip geben wo ich mich vertan hab !

MfG

MARTY

Antworten