C :: Aufgabe #82

2 Lösungen Lösungen öffentlich

Jahreszahlenkonverter für römische Schreibweise

Anfänger - C von BlackBird321 - 04.06.2015 um 22:36 Uhr
Bitte schreibe ein Programm, welches eine einzugebende Jahreszahl in eine römische Schreibweise umwandelt.

Beispiel:

1995 = MCMXCV
2015 = MMXV

Lösungen:

vote_ok
von devnull (8870 Punkte) - 07.06.2015 um 09:44 Uhr
Quellcode ausblenden C-Code
/********************************************
 * romjahr.c    römische Jahreszahlen
 ********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAXYEAR 4000

char* romchr(int digit, int range, char *p) {
	char r1, r2, r3;
	
	switch (range) {
	  case 1: r1 = 'I'; r2 = 'V'; r3 = 'X'; break;
	  case 2: r1 = 'X'; r2 = 'L'; r3 = 'C'; break;
	  case 3: r1 = 'C'; r2 = 'D'; r3 = 'M'; break;
	  case 4: r1 = 'M';
	}
	switch (digit) {
	  case 3 : *p++ = r1;
	  case 2 : *p++ = r1;
	  case 1 : *p++ = r1; break;
	  case 4 : *p++ = r1;
	  case 5 : *p++ = r2; break;
	  case 6 : *p++ = r2;
			   *p++ = r1; break;
	  case 7 : *p++ = r2;
			   *p++ = r1;
			   *p++ = r1; break;
	  case 8 : *p++ = r2;
			   *p++ = r1;
			   *p++ = r1;
			   *p++ = r1; break;
	  case 9 : *p++ = r1;
			   *p++ = r3; break;
	}
	return p;
}

char* arcnv(int val) {
	static char buf[20];
	char *pr = buf;
	int div=1000, range=4;
   
	memset(buf, 0, 20);
	if (val < MAXYEAR) {
		while (div) {
			pr = romchr(val/div, range--, pr);
			val%=div;
			div/=10;
		}
	}
	return buf;
}

int main() {
    unsigned int year;

	printf("Geben Sie eine Jahreszahl (< %d) ein: ", MAXYEAR);
	scanf("%u", &year);
	printf("%u entspricht römisch %s\n", year, arcnv(year));
	return 0;
}
vote_ok
von Gnom (550 Punkte) - 04.05.2020 um 20:51 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>

char* ConvertA2R(int a) {
    
    static char buf[20];
    char *p = buf;

    while (a >= 1000) {*p++ = 'M'; a-=1000;}
    if    (a >= 900)  {*p++ = 'C'; *p++ = 'M'; a-=900;}
    if    (a >= 500)  {*p++ = 'D'; a-=500;}
    if    (a >= 400)  {*p++ = 'C'; *p++ = 'D'; a-=400;}
    while (a >= 100)  {*p++ = 'C'; a-=100;}
    if    (a >= 90)   {*p++ = 'X'; *p++ = 'C'; a-=90;}
    if    (a >= 50)   {*p++ = 'L'; a-=50;}
    if    (a >= 40)   {*p++ = 'X'; *p++ = 'L'; a-=40;}
    while (a >= 10)   {*p++ = 'X'; a-=10;}
    if    (a >= 9)    {*p++ = 'I'; *p++ = 'X'; a-=9;}
    if    (a >= 5)    {*p++ = 'V'; a-=5;}
    if    (a >= 4)    {*p++ = 'I'; *p++ = 'V'; a-=4;}
    while (a >= 1)    {*p++ = 'I'; a-=1;}

    return buf;
}

int main(void) {
    
    unsigned int year;

    printf("Geben Sie eine Jahreszahl ein: ");
    scanf("%u", &year);
    printf("Die arabische Zahl %d entspricht der römischen Zahl %s\n\n\n", year, ConvertA2R(year));
    return 0;    
}