Pers.narod.ru. Алгоритмы. Конвертируем римские цифры в арабские

Алгоритм несложен, если знать значения римских цифр (выводятся программой). Кстати, сейчас идёт год MMIX (2009).

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

int is_correct_input(char *str) {
 while(*str) {
 if (*str!='I' &&
    *str!='V' &&
    *str!='X' &&
    *str!='L' &&
    *str!='C' &&
    *str!='D' &&
    *str!='M') return 0;
  str++;
 }
 return 1;
}

int convert(char *str) {
 int length=0;
 while(*str) {
  str++;
  length++;
 }
 int active=0;
 int next=0;
 switch (*str) {
  case 'I' : {active=1;break;}
  case 'V' : {active=5;break;}
  case 'X' : {active=10;break;}
  case 'L' : {active=50;break;}
  case 'C' : {active=100;break;}
  case 'D' : {active=500;break;}
  case 'M' : {active=1000;break;}
  default : break;
 }
 int result=active;
 while (length>0) {
  switch (*(str-1)) {
   case 'I' : {next=1;break;}
   case 'V' : {next=5;break;}
   case 'X' : {next=10;break;}
   case 'L' : {next=50;break;}
   case 'C' : {next=100;break;}
   case 'D' : {next=500;break;}
   case 'M' : {next=1000;break;}
   default : break;
  }
  if (next<active) result-=next;
  else result+=next;
  length--;
  str--;
  active=next;
 }
 return result;
}

void main() {
 clrscr();
 char input_str[20];
 printf("This program converts numbers from Rome to Arabian form.\n");
 printf("Some Rome digits:\n");
 printf("\nI - 1\nV - 5\nX - 10\nL - 50\nC - 100\nD - 500\nM - 1000\n");
 printf("\nPut CAPS LOCK status ON and enter a Rome number :\n");
 window(1,13,80,18);
 do {
  clrscr();
  scanf("%s",&input_str[0]);
  if (is_correct_input(&input_str[0])) {
   printf("%s - %d",input_str,convert(&input_str[0]));
  }
  else {
   printf("\nIncorrect input.");
   break;
  }
  printf("\nWant to convert once more(Y/N)?");
 } while(getche()!=(int)'N');
 printf("\nPress any key to exit...");
 getch();
}

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz