Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
Wold
Сообщений: n/a
#1

Перевод чисел из римских в арабские и наоборот - C++

28.05.2009, 19:23. Просмотров 3295. Ответов 0
Метки нет (Все метки)

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

int AtoR(int);//прототипы функций
int RtoA(char,char);

void main()
{
SetConsoleOutputCP(1251);//подключение функции для вывода кириллицы

int Arabic,tip,i,vspomog;
char Roman[20];


cout<<"Римское->Арабское(1) Арабское->Римское(2) ";
cin>>tip;

//в зависимости от поставленной задачи выполняются различные блоки программы
if(tip==1)//1-й блок
{
cout<<"Введите римское число латиницей (заглавными буквами): ";
cin>>Roman;//римское число в виде набора символов записывается в массив

Arabic=0;//его арабскому эквиваленту изначально присваивается значение ноль

for(i=0;Roman[i]!=NULL;i++)//i увеличивается от 0 до номера элемента, которым заканчивается заполненная часть массива
{
vspomog=RtoA (Roman[i],Roman[i+1]);//в функцию передаётся i-й элемент и следующий за ним
//в переменную vspomog записывается возвращённый функцией результат, благодаря этому функция вызывается только один раз

if ((vspomog==4)||(vspomog==9)||(vspomog==40)||(vspomog==90)||(vspomog==400)||(vspomog==900))
//если функцией возвращены числа 4,9,40,90,400 или 900, это значит что были использованы сразу два символа римского числа и
//поэтому необходимо принудительно увеличить i на еденицу, чтобы 2-й элемент не учавствовал в преобразовании ещё один раз
{
i++;
}

Arabic+=vspomog;//каждый раз после выполнения функции к предыдущему значению прибавляется результат действия функции
//в итоге, после прохождения функции по всем символам римского числа Arabic будет равен арабскому эквиваленту римского числа
}

cout<<endl<<Arabic<<endl;
}

else//2-й блок
{
cout<<"Введите арабское число \n";
cin>>Arabic;//ввод арабского числа

if((Arabic<=0)||(Arabic>=4000))//арабское число может обозначать только от 1 до 3999
{
cout<<"Введённое число не может быть преобразовано в римское \n";
exit(1);
}

do//функция вызывается пока исходное число не уменьшится до нуля (его при каждом вызове уменьшает сама функция)
{
Arabic=AtoR(Arabic);
}
while(Arabic>0);
}


cout<<endl;

}
//Функции
int AtoR(int a)
{//функция находит максимальное фиксированное значение, которое можно вычесть из исходного, вычитает его и
//одновременно выводит на экран соответствующую кодировку вычитаемого числа в римском формате
if (a>=1000) {cout<<"M"; return a-1000;}
if (a>=900) {cout<<"CM"; return a-900;}
if (a>=500) {cout<<"D"; return a-500;}
if (a>=400) {cout<<"CD"; return a-400;}//возвращается уменьшенное значение
if (a>=100) {cout<<"C"; return a-100;}
if (a>=90) {cout<<"XC"; return a-90;}
if (a>=50) {cout<<"L"; return a-50;}
if (a>=40) {cout<<"XL"; return a-40;}
if (a>=10) {cout<<"X"; return a-10;}
if (a>=9) {cout<<"IX"; return a-9;}
if (a>=5) {cout<<"V"; return a-5;}
if (a>=4) {cout<<"IV"; return a-4;}
if (a>=1) {cout<<"I"; return a-1;}
return -1;
}

int RtoA (char a,char b)// аргументами являются переданные из main'а два символа римского числа, стоящие подряд
{
if((a=='I')&&(b=='V')) {return 4;}//если они образуют число, описанное "правилом вычитания",
if((a=='I')&&(b=='X')) {return 9;}//то возвращается соответствующее этой кодировке арабское число
if((a=='X')&&(b=='L')) {return 40;}
if((a=='X')&&(b=='C')) {return 90;}/*тогда в следующий раз в функцию будет передано два элемента, стоящие после текущего 2-го аргумента*/
if((a=='C')&&(b=='D')) {return 400;}
if((a=='C')&&(b=='M')) {return 900;}
switch(a)
{
case 'I': return 1;//если особых слачаев два стоящих рядом числа не образуют,
case 'V': return 5;//то возвращается арабское число, соответствующее первому элементу (1-му аргументу функции)
case 'X': return 10;
case 'L': return 50;/*а в таком случае в следующий раз в функцию будет передано два элемента, стоящие после текущего 1-го аргумента*/
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
}

return -1;
}



НАРОД ВОД это НЕ РАБОТАЕТ КАК НУЖНО

Римское->Арабское(1) Арабское->Римское(2)
Введите арабское число
479
CDLXXIX
Press any key to continue



Римское->Арабское(1) Арабское->Римское(2)
CDLXXIX
Введите арабское число
Введённое число не может быть преобразовано в римское
Press any key to continue

почему???(((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2009, 19:23     Перевод чисел из римских в арабские и наоборот
Посмотрите здесь:

Перевод римских чисел в арабские - C++
Доброй ночи всем. Нужны наиболее рациональные и простые в реализации идеи для решения задачи. Дан текст из заглавных латинских букв за...

Из римских чисел в арабские в файле - C++
Здравствуйте. Дана задача - в данном тексте заменить все римские числа на арабские. Вот я и не могу понять, каким образом в файловом потоке...

Проверрка ввода римских чисел - C++
Нужна проверка ввода римских чисел в калькуляторе Калькулятор готов, а вот как проверку ввода организовать не знаю

Перевод с арабской на римскую сс и наоборот - C++
Программа работает на половину, переводит только с римских чисел на арабские, помогите доделать что бы переводила и с арабских на римские ...

Перевод с арабской на римскую сс и наоборот - C++
не могу составить программу перевода с арабской на римскую сс. Помогите плиз.

Перевод ASCI в ASCII и наоборот - C++
Добрый день учень нужна помощь... немогу никак разобраться с проблемой перевода кодировок, мне нужно чтоб в окне dos да и в текстовые файлы...

Перевод сантиметров в дюймы и наоборот - C++
Добрый день. Очень нужна помощь. Нужно создать программу для перевода сантиметров в дюймы и наоборот. Использовать соотношение 1 дюйм =...

Перевод заглавных букв в строчные и наоборот - C++
Доброго времени суток. Помогите: у меня есть строка, нужно написать две функции, которая переводит все символы этой строки в lowercase,...

Перевод числа из двоичной в десятичную и наоборот. - C++
Помогите пожалуйста написать прогу перевода числа из двоичной системы счисления в десятичную и наоборот на языке &quot;C&quot;.Я в этом...

Перевод величин из радианной меры в градусную и наоборот - C++
Нужно составить программу на языке С++, осуществляющую перевод величин из радианной меры в градусную и наоборот. Программа должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru