nixp.ru v3.0

28 мая 2017,
воскресенье,
19:26:02 MSK

DevOps с компанией «Флант»
Genie написал 27 июля 2004 года в 21:36 (374 просмотра) Ведет себя как мужчина; открыл 40 тем в форуме, оставил 4758 комментариев на сайте.

…препод дал задачку: написать программу для перевода из десятичной записи в римскую.

все написали именно что он просил, кроме.. ну, понятно ;)

Программка несколко некорректна, в том плане, что введены «римские числа» T (5000) и 1 (10000) — просто для удобства представления чисел до 10000.

#include 
#define      fNone      0
#define      fDec      1
#define      fRom      2
#define      fQuit      3
char      romal1[]="OIVXLCDMT1",
      *romal2[]={"","1","11","111","12","2","21","211","2111","13"},
      buffer[80],
      flag=fNone,
      len;
int      number;
int      try_decimal(void)
{      char      *ptr=buffer;
      if(*buffer=='0')
            return flag=fDec*(!buffer[1]);
      while((*ptr>='0')&&(*ptr<='9'))
            ptr++;
      return flag=fDec*((!*ptr)&&((len=(char)(ptr-buffer))>0)&&(len<5));
}
int      is_romal(char**ptr, char*ptr1, char*ptr2)
{      char      *ptr3=*ptr;
      while(*ptr2)
            if(*(ptr3++)!=ptr1[*(ptr2++)-'1'])
                  return 0;
      *ptr=ptr3;
      return 1;
}
int      try_romal(void)
{      char      *ptr=buffer,
            pos=4,
            tryed;
      number=0;
      if(*(int*)buffer=='O')
            return flag=fRom;
      while(pos--)
      {      tryed=10;
            while((tryed--)&&
                  !is_romal(&ptr, &romal1[pos*2+1], romal2[tryed]));
            number=number*10+tryed;
      }
      return flag=fRom*(!*ptr);
}
void      convert(void)
{      char      *ptr1=buffer,
            *ptr2;
      switch(flag)
{
case fDec:
      printf("Десятичное '%s' = римскому '",buffer);
      if((len==1)&&(*ptr1=='0'))
      {      putchar('O');
            break;
      }
      while(len--)
      {      ptr2=romal2[*ptr1++-'0'];
            while(*ptr2)
                  putchar(romal1[len*2+(*ptr2++)-'0']);
      }
      break;
case fRom:
      printf("Римское '%s' = десятичному '%d",buffer,number);
      break;
}
      printf("'\n");
}
void main(void)
{      printf(      "Программа для перевода десятичных чисел в римские и обратно.\n"
            "Для выхода нажмите Ctrl-C.\n\n");
      do
      {      printf("Ведите число:");
            scanf("%s",buffer);
            if(!try_decimal()&&!try_romal())
                  printf("Это ни десятичное, ни римское число!\n");
            else
                  convert();
      }while(flag!=3);
}