МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра автоматизованих систем управління
Розрахункова робота
Тема: «Переведення римських чисел в
десяткові і навпаки»
ВСТУП
Ідучи довгим шляхом розвитку від часу створення колеса, людина створювала все нові і нові дива науки і техніки. Одним із основних досягнень в науці і техніці у ХХ столітті є персональний комп’ютер. Відтоді відбувається перехід до інформаційних технологій, тобто до широкого застосування комп’ютерів у виробництві, управлінні, науці, світі, медицині, торгівлі тощо. З поступовим розвитком персональних комп’ютерів, людина задумувалась над практичним і зручним їх користуванням.
Оволодівши комп’ютером, вона не зупиняється на досягнутому, тому і надалі починає створювати щось нове. Таким досягнення являється і програмування. Існує безліч різних мов програмування. Але однією із універсальних, потужних, гнучких, лаконічних, мобільних та ефективних є мова С.
Мова програмування C, із високою ефективністю виконавчого коду і можливістю безпосереднього доступу до апаратних ресурсів комп’ютера, є однією з фундаментальних і найбільш уживаних мов проблемно-орієнтованого і системного програмування. є С Тому глибоке знання і практичне володіння інструментальними засобами мови обов’язковим для фахівців в області програмного забезпечення комп’ютерів, комп’ютерних інформаційних технологій, систем автоматизованого керування і проектування, комп’ютерної інженерії, а також для всіх, хто пов’язує свою діяльність з комп’ютером і хоче опанувати науку програмування.
стала основою створення і розвитку ряду мов об’єктно-орієнтованого С Мова C#. Java, С++, програмування, зокрема:
Щоб довести особливості програмування мовою С, для прикладу, можна створити програму, яка буде переводити римські числа в десяткові і навпаки.
ОГЛЯД ЛІТЕРАТУРИ
1. Шпак З.Я. Програмування мовою С. – Львів: Оріяна-Нова, 2006. – 432с.
Розділ 7. Вказівники
7.1. Оголошення вказівників, звертання до даних через вказівники
Усі вказівники-змінні обов’язково повинні бути оголошені. Для цього застосовують таку синтаксичну конструкцію:
базовий_тип * ім’я_вказівника;
Приклади оголошень вказівників:
char * pс; /* вказівник на дані з типом char */
unsigned * p1, * p2; /* два вказівники на дані з типом unsigned */
long * q, h, w; /* q – вказівник, h і w – звичайні змінні */
Розділ 9. Символьні рядки
9.1.Оголошення та ініціалізація символьних рядків
9.2.Звертання до елементів символьних рядків
9.5Масиви символьних рядків і масиви вказівників
Розділ 11. Функції
11.1.Структура функцій
Згідно із стандартом мови C функція повинна описуватись конструкцією такої форми:
тип_результату ім’я_функції (оголошення параметрів)
{
оголошення внутрішніх змінних
оператори тіла функції
}
11.2.Виклик функції. Прототипи функцій
11.5.Масиви та символьні рядки як параметри функцій
11.9.Вказівники на функції
2. Інтернет – ресурси
1) http://uk.wikipedia.org/wiki/Система_числення
Систе́ма чи́слення - сукупність способів і засобів запису чисел для проведення підрахунків. Розрізняють такі типи систем числення:
позиційні;
змішані;
непозиційні;
Десяткова система числення — це позиційна система числення із основою 10. Кожне число в якій записується за допомогою 10-ти символів, цифр - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Запис числа формується за загальним принципом: на n-й позиції (справа наліво від 0) стоїть цифра, що відповідає кількості n-х степенів десятки у цьому числі.
2) http://uk.wikipedia.org/wiki/Римська_система_числення
Прикладом непозиційної системи числення, яка збереглася до наших днів, може служити система числення, що застосовувалася більш двох з половиною тисяч років тому в Прадавньому Римі.
В основі римської системи числення лежать знаки I (один палець) для числа 1, V (розкрита долоня) для числа 5, X (дві складені долоні) для 10, а також спеціальні знаки для позначення чисел 50, 100, 500 і 1000.
Позначення для останніх чотирьох чисел римської системи числення із часом перетерпіли значні зміни. Учені припускають, що спочатку знак для числа 100 мав вигляд пучка із трьох рисок на зразок російської букви Ж, а для числа 50 — вид верхньої половинки цієї букви, яка надалі трансформувалася в знак L.
ФОРМУЛЮВАННЯ ЗАДАЧІ
Щоб записати число, римляни використовували не тільки додавання, але й вирахування ключових чисел. При цьому застосовувалося наступне правило.
Значення кожного меншого знаку, поставленого ліворуч від більшого, віднімається зі значення більшого знаку.
Наприклад, запис IX у римській системі числення позначає число 9, а запис XI-число 11.
Десяткове число 28 представляється наступним образом:
XXVIII = 10 + 10 + 5 + 1 + 1 + 1.
Десяткове число 99 у римській системі числення має такий вигляд:
XCIX = -10+100-1+10.
Те, що при записі нових чисел ключові числа можуть не тільки складатися, але й відніматися, має істотний недолік: запис римськими цифрами позбавляє число одиничності вигляду. Дійсно, відповідно до наведеного вище правила, число 1995 у римській системі числення можна записати, наприклад, такими способами:
MCMXCV = 1000 + (1000 - 100) + (100 -10) + 5,
MDCCCCLXXXXV =
=1000 + 500 + 100 + 100 + 100 + 100 + 50 + 10 + 10 + 10 + 10 + 5,
MVM = 1000 + (1000 - 5),
MDVD = 1000 + 500 + (500 - 5) і так далі.
Єдиних правил запису римських чисел дотепер немає, але існують пропозиції про прийняття для них міжнародного стандарту.
У наші дні кожну з римських цифр пропонується записувати в одному числі не більш трьох раз підряд.
АЛГОРИТМ РОЗВ’ЯЗАННЯ ЗАДАЧІ
Оскільки у завданні потрібно створити програму, яка буде переводити римські числа в десяткові і навпаки, то при запуску даної програми буде доречним створити меню, в якому користувач матиме змогу вибрати форму переведення. Натискуючи 1 – переведення буде відбуватись з десяткових чисел в римські, 2 – з римських чисел в десяткові. У разі натиснення клавіші 3 завершується робота програми.
БЛОК-СХЕМА ОСНОВНОЇ ПРОГРАМИ
БЛОК-СХЕМА ФУНКЦІЇ ПЕРЕВЕДЕННЯ З ДЕСЯТКОВОЇ С.Ч. В РИМСЬКУ С.Ч.
БЛОК-СХЕМА ФУНКЦІЇ ПЕРЕВЕДЕННЯ З РИМСЬКОЇ С.Ч. В ДЕСЯТКОВУ С.Ч.
КОД ПРОГРАМИ
#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");
КОНТРОЛЬНІ ПРИКЛАДИ ТА РЕЗУЛЬТАТИ РЕАЛІЗАЦІЇ
1. Переведення чисел з десяткової системи в римську:
ВХІДНІ ДАНІ
РЕЗУЛЬТАТ
15
XV
36
XXXVI
148
CXLVIII
394
CCCXCIV
1788
MDCCLXXXVIII
2946
MMCMXLVI
4031
Zavelyke!
2. Переведення чисел з римської системи в десяткову:
ВХІДНІ ДАНІ
РЕЗУЛЬТАТ
VIII
8
xvii
17
CDLXIIG
Hybna rymska cyfra - G
MCccX
1310
LXXXXIV
Zabahato povtoren’ – X
CCMCIV
Nepravylne rymske chyslo – jmovirna pomylka-C
MMCDXVII
2417
ВИСНОВОК
Римськими цифрами користувалися дуже довго. Ще 200 років тому в ділових паперах числа повинні були позначатися римськими цифрами (уважалося, що звичайні арабські цифри легко підробити).
Римська система числення сьогодні використовується, в основному, для найменування знаменних дат, томів, розділів і глав у книгах. Тому дану програму можна використовувати у навчальних установах, бібліотеках, культурних осередках, на підприємствах, де розповсюджений даний вид позначення дат, відділів тощо.
Програма швидко і з точністю переводить різні римські значення в десяткові та навпаки. В ній передбачено всі можливі варіанти помилок та синтаксису.
ДОДАТОК