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 » So Feb 01, 2015 1:54 pm

SO dann hab ich das ganze mal überarbeitet !

Jetzt hab ich nur noch das Problem mit den Zahlen 1-3, da scheint mir noch ein kleiner fehler drin zu sein. Die Else funktion ist auch noch nicht so in Ordung aber ich weiss nicht warum !

Code: Alles auswählen

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

int main(void)

{
   int dezimalzahl;
   int dezimalzahl1000;
   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 / 500) <=1)

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

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


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


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

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


   if((Rest / 2)<=1)
   {
      for(int i=1;i<=Rest /1;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 » So Feb 01, 2015 2:39 pm

Entgegen der üblichen Konvention, hier mal ein Funktionierender Code:

Code: Alles auswählen

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

int main(void)

{
	int dezimalzahl;
	int teiler;
	int i;
	int Rest;


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


		teiler = dezimalzahl/1000;
		Rest = dezimalzahl % 1000;
		if(teiler == 1)
		{
			for(int i=0;i<teiler;i++)
			{
				printf("M");
			}
		}
		if(Rest >= 900)
		{
			printf("CM");
			Rest %= 900;
		}
		
		teiler = Rest/500;
		Rest = Rest % 500;
		if(teiler == 1)
		{
			printf("D");
		}
		else if (Rest >= 400)
		{
			printf("CD");
			Rest %= 400;
		}
		  
		teiler = Rest / 100;
		Rest = Rest % 100;

		if(teiler > 0)
		{
			for(int i=0; i < teiler;i++)
			{
				printf("C");
			}
		}
		if(Rest >= 90)
		{
			printf("XC");
			Rest %= 90;
		}
		  
		teiler = Rest / 50;
		Rest = Rest % 50;

		if(teiler == 1)
		{
			printf("L");
		}
		else if(Rest >= 40)
		{
			printf("XL");
			Rest %= 40;
		}
		  
		teiler = Rest / 10;
		Rest = Rest % 10;

		if(teiler >= 1)
		{
			for(int i=0; i < teiler; i++)
			{
				printf("X");
			}
		}
		if(Rest >= 9)
		{
			printf("IX");
			Rest %= 9;
		}
		  
		teiler = Rest / 5;
		Rest = Rest % 5;


		if(teiler == 1)
		{
			printf("V");
		}
		else if(Rest == 4) printf("IV");
		  
		Rest %= 4;
		for(int i = 0; i < Rest; i++)
		{
			printf("I");
		}
	}
	getch();

	return 0;

}
Vorweg: Code wird besser lesbar, wenn er eingerückt wird. Damit die Einrückung auch einigermaßen gut aussieht, gibt es da zwei konventionen:
2 oder 4 Leerzeichen. Ich habe hier mit 4 Leerzeichen gearbeitet.

Zum Code:
Du hattest mehrere Fehler drin.
z.B

Code: Alles auswählen

 if(dezimalzahl1000<=1)
   {
      for(int i=1;i<=dezimalzahl1000;i++)
      {
         printf("M");
      }
   }
   else printf("CM");
"dezimalzahl1000" ist die durch 1000 dividerte eingegebene Zahl. Da diese aber nicht größer gleich 1000 sein soll, ist diese Variable entweder 1 oder 0.
Die Bedingung <= 1 wird also immer wahr sein, der Fall 900 und damit CM ausgeben wird nie erreicht.
Das hast du aber nicht bemerkt, weil dich deine Schleife gerettet hat:

Code: Alles auswählen

 for(int i=1;i<=dezimalzahl1000;i++)
i ist 1, dezimalzahl1000 ist 0, die Schleife wird nie ausgeführt.

Zudem ist deine else Bedinung nicht richtig.
Bisher fragst du ab: Ist die zahl durch 1000 Teilbar? Ja - M ausgeben, Nein - CM ausgeben.
Wenn du aber z.B 9 eingibst, ist dies nicht durch 1000 Teilbar und es wird CM ausgegeben, das ist aber falsch.
Daher muss die else-Bedingung ausgegliedert werden:

Code: Alles auswählen

if((zahl / 1000) == 1)
    printf("M");
if(zahl >= 900)
    printf("CM");
Dann hast du ab und zu durch die falschen Zahlen geteilt und deine Abfrage ob 1, 2 oder 3 hat halt die Mehrfachnennung beinhaltet.
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 » So Feb 01, 2015 4:06 pm

Hallo cloidnerux !

Danke erstmal für deine Geduld mit mir :lol: !
"dezimalzahl1000" ist die durch 1000 dividerte eingegebene Zahl. Da diese aber nicht größer gleich 1000 sein soll, ist diese Variable entweder 1 oder 0.
Die Bedingung <= 1 wird also immer wahr sein, der Fall 900 und damit CM ausgeben wird nie erreicht.
Das hast du aber nicht bemerkt, weil dich deine Schleife gerettet hat:
O.K. Das versteh ich dann müsste die Bedingung == heißen und nicht <=. Daher kommt auch nicht die Ausgabe von CM ! Habs bei mir mal geändert und dann kommt das CM auch an erster Stelle natürlich folgt dann noch zusätzlich das DCCCC !
Zudem ist deine else Bedinung nicht richtig.
Bisher fragst du ab: Ist die zahl durch 1000 Teilbar? Ja - M ausgeben, Nein - CM ausgeben.
Wenn du aber z.B 9 eingibst, ist dies nicht durch 1000 Teilbar und es wird CM ausgegeben, das ist aber falsch.
Daher muss die else-Bedingung ausgegliedert werden:
Wohin ausgegliedert ? Leider kann ich das nicht so nachverfolgen !

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 » So Feb 01, 2015 4:09 pm

Wohin ausgegliedert ? Leider kann ich das nicht so nachverfolgen !
Bisher ist es so:
Entweder durch 1000 teilbar oder CM ausgeben
Es müsste aber heißen
Entweder Durch 1000 Teilbar => M ausgeben
oder Größer gleich 900 => CM ausgeben

Code: Alles auswählen

if((zahl / 1000) == 1)
    printf("M");
else if(zahl >= 900)
    printf("CM");
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 » So Feb 01, 2015 5:26 pm

cloidnerux hat geschrieben:
Wohin ausgegliedert ? Leider kann ich das nicht so nachverfolgen !
Bisher ist es so:
Entweder durch 1000 teilbar oder CM ausgeben
Es müsste aber heißen
Entweder Durch 1000 Teilbar => M ausgeben
oder Größer gleich 900 => CM ausgeben

Code: Alles auswählen

if((zahl / 1000) == 1)
    printf("M");
else if(zahl >= 900)
    printf("CM");
Ah o.K. !

Ich danke dir und setz mich wieder ein wenig an das Programm !

MfG

Marty

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

Re: Römische Zahlen

Beitrag von MartyMcFly1976 » Mi Feb 04, 2015 4:24 pm

Hallo !

Danke nochmal für die Hilfestellungen !

Ich hoffe das ich die Geschichte hier richtig verstanden habe und Poste mal das Programm mit ein paar Koentaren und ich habe da noch eine oder zwei Fragen dazu.

Code: Alles auswählen

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

int main(void)

{
   int Zahl;
   int teiler;
   int i;
   int Rest;


   printf ("\t\t\tProjekt r\x94mische Zahlen Rechner\n\n");
   while(1)
   {
      printf("\t\tBitte geben sie eine Zahl bis 1000 ein:\t");
      scanf("%d",&Zahl);				// Scannen der Zahl


      teiler = Zahl/1000;				// Der teiler ist  dezimalzahl durch 1000
      Rest = Zahl % 1000;				// Der Rest ist Modulo durch 1000
      if(teiler == 1)					// Ist der Teiler == 1
      {
         for(int i=0;i<teiler;i++)		// i gleich 0 und der < teiler
         {
            printf("M");				// schreibe ein M
         }
      }
      if(Rest >= 900)					// Ist der Rest >= 900
      {
         printf("CM");					// Schreibe ein CM
         Rest %= 900;					// Teile den Rest Modulo gleich 900 
      }
      
      teiler = Rest/500;				// Rest durch 500
      Rest = Rest % 500;
      if(teiler == 1)					// Ist die Zahl == teiler
      {
         printf("D");					// schreibe D
      }
      else if (Rest >= 400)				// Ist die Zahl >= 400 
      {
         printf("CD");					// Schreibe CD
         Rest %= 400;					// Rest Modulo gleich 400
      }
       
      teiler = Rest / 100;				// Rest durch 100
      Rest = Rest % 100;				// Rest Modulo 100

      if(teiler > 0)					// Ist der Teiler > 0
      {
         for(int i=0; i < teiler;i++)	
         {
            printf("C");
         }
      }
      if(Rest >= 90)
      {
         printf("XC");
         Rest %= 90;
      }
       
      teiler = Rest / 50;
      Rest = Rest % 50;

      if(teiler == 1)
      {
         printf("L");
      }
      else if(Rest >= 40)
      {
         printf("XL");
         Rest %= 40;
      }
       
      teiler = Rest / 10;
      Rest = Rest % 10;

      if(teiler >= 1)
      {
         for(int i=0; i < teiler; i++)
         {
            printf("X");
         }
      }
      if(Rest >= 9)
      {
         printf("IX");
         Rest %= 9;
      }
       
      teiler = Rest / 5;
      Rest = Rest % 5;


      if(teiler == 1)
      {
         printf("V");
      }
      else if(Rest == 4) printf("IV");
       
      Rest %= 4;
      for(int i = 0; i < Rest; i++)
      {
         printf("I");
      }
   }
   getch();

   return 0;

}
Meine erste Frage wäre :

Warum wird der Restbetrag einmal if(teiler == 1) und einmal if(teiler > 0) oder if(teiler >= 1) benannt ?

Warum setzt man das Modulo %= mit einem Gleichheitszeichen dazu ?

Wäre Klasse wenn ich dazu noch ein paar Infos haben könnte !

MfG

Marty

Senator45
Beiträge: 3
Registriert: Fr Jan 23, 2015 6:30 pm

Re: Römische Zahlen

Beitrag von Senator45 » Mi Feb 04, 2015 4:43 pm

Schau mal in den Erlenkötter 'C' Programmieren von Anfang an ab Seite 40. Entscheidungen treffen. Ich glaube, du hast bis hierhin noch nicht viel verstanden. Du solltest das Thema wirklich noch etwas vertiefen.

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 » Mi Feb 04, 2015 4:49 pm

MartyMcFly1976 hat geschrieben:Ich hoffe das ich die Geschichte hier richtig verstanden habe und Poste mal das Programm mit ein paar Koentaren und ich habe da noch eine oder zwei Fragen dazu.

Meine erste Frage wäre :

Warum wird der Restbetrag einmal if(teiler == 1) und einmal if(teiler > 0) oder if(teiler >= 1) benannt ?
Benannt? Ich verstehe entweder Deine Frage nicht oder das Problem liegt nicht bei mir ;-)
Das sind Abfragen, aber das solltest du wissen, sonst wäre der Code nicht von Dir.
MartyMcFly1976 hat geschrieben:Warum setzt man das Modulo %= mit einem Gleichheitszeichen dazu ?
Setzt man einen Operator vor das Gleichheitszeichen, so sind linker Operand und Ziel identisch:

Code: Alles auswählen

a = a + 1;
entspricht

Code: Alles auswählen

a += 1;
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.

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 » Mi Feb 04, 2015 5:45 pm

Warum wird der Restbetrag einmal if(teiler == 1) und einmal if(teiler > 0) oder if(teiler >= 1) benannt ?
Weil hier unterschiedliche Bedingungen vorliegen.
Wenn du eine Zahl kleiner 1000 durch 500 Teilst, geht das ganzzahlig entweder einmal oder eben nicht:
999/500 = 1 Rest 499
499 / 500 = 0 Rest 499
Damit ist die Berechnung

Code: Alles auswählen

teiler = Rest / 500;
Entweder 0, die Zahl ist kleiner als 500 oder 1, die Zahl ist größer gleich 500.

Wenn du aber durch 100 Teilst:
999 / 100 = 9 Rest 99
499 / 100 = 4 Rest 99
100 / 100 = 1 Rest 0
Bekommst du einen Wert größer gleich 1 raus, deswegen auch das >= 1 oder > 0, was das die gleiche Wirkung hat.
Deswegen auch keine Schleife bei der 500:

Code: Alles auswählen

if(teiler == 1)               // Ist die Zahl == teiler
      {
         printf("D");               // schreibe D
      }
im Gegensatz zur 100

Code: Alles auswählen

 teiler = Rest / 100;            // Rest durch 100
      Rest = Rest % 100;            // Rest Modulo 100

      if(teiler > 0)               // Ist der Teiler > 0
      {
         for(int i=0; i < teiler;i++)   
         {
            printf("C");
         }
      }
Weil wenn du 300 hast zum Beispiel, musst du 3 mal C ausgeben. Das mache ich indem ich den berechneten Wert als Argument in der Schleife nutze.
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 » Do Feb 05, 2015 4:27 pm

Hallo !

Jo der Erlenkötter, kann ich nichts mit Anfangen. Durch reines lesen klappt das programmieren bei mir nicht.
Weil hier unterschiedliche Bedingungen vorliegen.
Wenn du eine Zahl kleiner 1000 durch 500 Teilst, geht das ganzzahlig entweder einmal oder eben nicht:
999/500 = 1 Rest 499
499 / 500 = 0 Rest 499
Damit ist die Berechnung
Ah ja O.k. ! 500 kann ja in einer tausenderzahl nur einmal vorkommen, daher keine Schleife ! Bei der Hundert muss dann wieder eine Schleife rein sonst gibt er die auch nur einmal aus und somit wäre die Rechnung auch total falsch ! Dann wird die 50 und die 5 ebenso behandelt !

Super Danke für die gute Erläuterung !

MfG

Marty

Antworten