Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система числення.doc
Скачиваний:
15
Добавлен:
06.12.2018
Размер:
691 Кб
Скачать
☆

Формулювання задачі

Оскільки у завданні потрібно створити програму, яка буде переводити римські числа в десяткові і навпаки, то при запуску даної програми буде доречним створити меню, в якому користувач матиме змогу вибрати форму переведення. Натискуючи 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");