C :: Aufgabe #20

2 Lösungen Lösungen öffentlich

Zahlen in Römischer Schreibweise

Anfänger - C von pocki - 29.12.2012 um 19:40 Uhr
Schreibe eine Programm welches eine Ganzzahl einliest und diese anschließend in römischer Schreibweise wieder ausgibt und umgekehrt bei einer eingegebenen Zahl in römischer Schreibweise diese als normale Zahl wieder ausgibt:

Konsolenausgabe:


Geben Sie eine Zahl ein: 1234
entspricht: MCCXXXIV

Geben Sie eine Zahl ein: DXXXVII
entspricht: 537


Die Erkennung der Schreibweise sollte automatisch funktionieren.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 04.03.2014 um 10:28 Uhr
Quellcode ausblenden C-Code
/********************************************
 * romnum.c   römisch-arabisch konvertieren
 * devnull    03-03-2014                
 ********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int romval(char r) 
{
	int v;
	
	switch (r) {
	  case 'I' : v = 1;    break;
	  case 'V' : v = 5;    break;
	  case 'X' : v = 10;   break;
	  case 'L' : v = 50;   break;
	  case 'C' : v = 100;  break;
	  case 'D' : v = 500;  break;
	  case 'M' : v = 1000; break;
	  default  : v = 0;
	}
	return v;
}

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;
}

int racnv(char *roman)
{
	char *pr;
	int vn,vp,sum;
	
	for (sum=0, vp=1000, pr=roman; *pr!=0; pr++) {
		vn = romval(*pr);
		if (vn == 0)
			return 0;
		else {
			if (vp < vn)
				sum -= vp + vp;
			vp = vn;
			sum += vn;
		}
	}
	return sum;
}

char* arcnv(char *sval)
{
	static char rbuf[20];
	char *pa, *pr;
	int range;
   
	memset(rbuf, 0, 20);
	if (atoi(sval) < 4000) {
		range = strlen(sval);
		for (pa=sval, pr=rbuf; *pa!=0; pa++, range--)
			pr = romchr(*pa, range, pr);
	}
	return rbuf;
}

int main()
{
    char inb[20];

	printf("Geben Sie eine Zahl ein: ");
	scanf("%s", inb);
	if (isdigit(inb[0]))
		printf("entspricht römisch %s\n", arcnv(inb));
	else
		printf("entspricht arabisch %d\n", racnv(inb));
	return 0;
}
vote_ok
von zefcat (290 Punkte) - 15.12.2016 um 16:22 Uhr
Quellcode ausblenden C-Code
/********************************************
 * romnum.c   römisch-arabisch konvertieren
 * devnull    03-03-2014                
 ********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
int romval(char r) 
{
    int v;
     
    switch (r) {
      case 'I' : v = 1;    break;
      case 'V' : v = 5;    break;
      case 'X' : v = 10;   break;
      case 'L' : v = 50;   break;
      case 'C' : v = 100;  break;
      case 'D' : v = 500;  break;
      case 'M' : v = 1000; break;
      default  : v = 0;
    }
    return v;
}
 
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;
}
 
int racnv(char *roman)
{
    char *pr;
    int vn,vp,sum;
     
    for (sum=0, vp=1000, pr=roman; *pr!=0; pr++) {
        vn = romval(*pr);
        if (vn == 0)
            return 0;
        else {
            if (vp < vn)
                sum -= vp + vp;
            vp = vn;
            sum += vn;
        }
    }
    return sum;
}
 
char* arcnv(char *sval)
{
    static char rbuf[20];
    char *pa, *pr;
    int range;
    
    memset(rbuf, 0, 20);
    if (atoi(sval) < 4000) {
        range = strlen(sval);
        for (pa=sval, pr=rbuf; *pa!=0; pa++, range--)
            pr = romchr(*pa, range, pr);
    }
    return rbuf;
}
 
int main()
{
    char inb[20];
 
    printf("Geben Sie eine Zahl ein: ");
    scanf("%s", inb);
    if (isdigit(inb[0]))
        printf("entspricht römisch %s\n", arcnv(inb));
    else
        printf("entspricht arabisch %d\n", racnv(inb));
    return 0;
}