Формулювання задачі
Оскільки у завданні потрібно створити програму, яка буде переводити римські числа в десяткові і навпаки, то при запуску даної програми буде доречним створити меню, в якому користувач матиме змогу вибрати форму переведення. Натискуючи 1 – переведення буде відбуватись з десяткових чисел в римські, 2 – з римських чисел в десяткові. У разі натиснення клавіші 3 завершується робота програми.
Алгоритм розв’язання задачі
БЛОК-СХЕМА ОСНОВНОЇ ПРОГРАМИ
Виберіть
тип переведення:
1
2

Переведення з римської с.ч. в десяткову
3

Переведення з десяткової
с.ч. в римську



БЛОК-СХЕМА ФУНКЦІЇ ПЕРЕВЕДЕННЯ З ДЕСЯТКОВОЇ С.Ч. В РИМСЬКУ С.Ч.

z=2
p=ld


1


dc=p->decim









x-=dc;
*pr++=p->latin
break
dc=p->decim-(p+z)
->decim


1




x-=dc
*p++=(p+z)->latin
*p++=p->latin
2
3




*pr=0
strcpy(rm,res)
return rm
БЛОК-СХЕМА ФУНКЦІЇ ПЕРЕВЕДЕННЯ З РИМСЬКОЇ С.Ч. В ДЕСЯТКОВУ С.Ч.
dec=0
prc=romenumb

*prd=’\0’
n1=Nomer(*prc)


*(prc+1)==’\0’
return dec
dec+=ld[n1].decim
n2=Nomer(*(prc+1))






dec+=ld[n1].decim
dec-=ld[n1].decim

prc++
n1<=n2
Код програми
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef
struct lat_dec {
int latin;
int decim;
} LATDEC;
LATDEC ld[]={{'M',1000},{'D',500},{'C',100},{'L',50},
{'X',10},{'V',5},{'I',1}};
void Dec_to_Rome(void);
void Rome_to_Dec(void);
char* Dec_Rome(int dc, char* rm);
int Rome_Dec(char* rm);
int NotRomeNumber (char *pln);
int WrongRepeat (char *pln);
int WrongRomeNumber (char *pln);
int LatNumb (char rl);
int Nomer (int rc);
void GoDown(int r);
int Menu(void);
void main (void)
{
int v;
do {
v=Menu();
if (v==1)
Dec_to_Rome();
else
if (v==2)
Rome_to_Dec();
} while (v!=3);
}
int Menu(void)
{
int k;
clrscr();
GoDown(10);
printf("\t\tZrobit' vybir:\n ");
printf("\t 1 - Peretvorenna z desatkovoji u rymsku\n ");
printf("\t 2 - Peretvorenna z rymskoji u desatkovu\n ");
printf("\t 3 - Zavershenna\n\t\t");
while(1) {
scanf("%d", &k);
if (k>0 && k<4) break;
puts("\t! Natysnit' 1..3 !");
}
return k;
}
void Dec_to_Rome(void)
{
int decnb;
char romenb[20];
clrscr();
GoDown(8);
do {
printf("\tDesatkove chyslo (<4000) -> ");
scanf("%d", &decnb);
if (decnb>=4000)
printf("\t\t Zavelyke! \n\n" );
} while(decnb>=4000);
printf("\tRymske chyslo -> %s", Dec_Rome(decnb,romenb));
getch();
}
char* Dec_Rome(int x, char* rm)
{
LATDEC *p;
int dc, z;
char res[20]="", *pr=res;
z=2;
p=ld;
while (x>0) {
dc=p->decim;
while (x>=dc) {
x-=dc;
*pr++=p->latin;
}
if (x==0) break;
dc=p->decim-(p+z)->decim;
if (x>=dc) {
x-=dc;
*pr++=(p+z)->latin;
*pr++=p->latin;
}
p++; z=(z==2?1:2);
}
*pr=0;
strcpy(rm,res);
return rm;
}
void Rome_to_Dec(void)
{
char rymch[20];
int wrnsmb;
char *text[]={"Hybna rymska cyfra","Zabahato povtoren'",
"Nepravylne rymske chyslo - jmovirna pomylka"};
int mstk=0;
clrscr();
GoDown(8);
do { mstk=0;
printf("\tRymske chyslo -> ");
scanf("%s", rymch);
strupr(rymch);
if ((wrnsmb=NotRomeNumber(rymch))!=0) mstk=1;
else
if ((wrnsmb=WrongRepeat(rymch))!=0) mstk=2;
else
if ((wrnsmb=WrongRomeNumber(rymch))!=0) mstk=3;
if (mstk>0)
printf("\t\t %s - %c \n\n", text[mstk-1], wrnsmb);
} while (mstk);
printf("\n\t Desatkove -> %d", Rome_Dec(rymch));
getch();
}
int Rome_Dec(char* romenb )
{
LATDEC *p;
int dec=0;
char *prc=romenb;
int n1, n2;
while (*prc!='\0') {
n1=Nomer(*prc);
if(*(prc+1)=='\0')
dec+=ld[n1].decim;
else {
n2=Nomer(*(prc+1));
if (n1<=n2)
dec+=ld[n1].decim;
else
dec-=ld[n1].decim;
}
prc++;
}
return dec;
}
int NotRomeNumber (char *pln)
{
char *latin="MDCLXVI";
while (*pln!='\0') {
if (!strchr(latin,*pln))
return *pln;
pln++;
}
return 0;
}
int WrongRepeat (char *pl)
{
char nrep[]="DLV";
int n=1;
while (*(pl+1)!='\0') {
if (*pl==*(pl+1)) {
n++;
if (n==2 && strchr(nrep,*pl))
return *pl;
if (n>3)
return *pl;
}
else n=1;
pl++;
}
return 0;
}
int WrongRomeNumber (char *pln)
{
char *p=pln;
int n1,n2,n=0;
char use[]="nnnnnnn";
n2=LatNumb(*p); p++;
while (*p!='\0') {
n1=n2; n2=LatNumb(*p);
if (n1>n2)
if(n1&1 || n1-n2>2 || use[n1]=='y' || n2<n)
return *(p-1);
else
{ use[n1]='y'; use[n2]='y'; n=n1; }
else
if (n1==n2) n=n1;
else
if (use[n2]=='y' || n2<n)
return *p;
p++;
}
return 0;
}
int LatNumb (char rl)
{
char *latin="MDCLXVI";
return strchr(latin,rl)-latin;
}
int Nomer (int rc)
{ int n=0;
while (ld[n].latin!=rc)
n++;
return n;
}
void GoDown(int nr)
{ int i;
for(i=0; i<nr; i++)
printf("\n");
