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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разработать собственные функции динамического распределения памяти http://www.cyberforum.ru/cpp-beginners/thread37034.html
Разработать собственные функции динамического распределения памяти, используя в качестве “кучи” динамический массив, создаваемый обычной функцией распределения памяти (malloc). Разработанная функция my_malloc должна возвращать указатель на выделенную область, причем в память перед указателем должен быть записан размер выделенной области, необходимый при ее возвращении, либо сохранена другая...
C++ Нахождение ко-ва символов в каждой строке файла Здравствуйте, помогите пожалуйста решить задачу на С: Прочитать файл, который может содержать символы перевода строки. Для каждой строки определить и вывести на экран её номер и длину. http://www.cyberforum.ru/cpp-beginners/thread37006.html
C++ Задание по структурам и классам
Есть вот такой код: #include "stdafx.h" #include <iostream> #include <iomanip> #include <conio.h> #include <string.h> #include <fstream> using namespace std; void Choice(); char buff;
C++ Функция с переменным числом параметров
Вычисление суммы ряда значений оформить в виде функции с переменным числом параметров. прога вот: В ней не хватает как рас функции с переменным числом параметров Как эту функцию задать?? Подскажите пожалуйста!
C++ Создание строк http://www.cyberforum.ru/cpp-beginners/thread36802.html
Строка символов представляет собой предложение, написанное на русском языке. Предложение заканчивается точкой. Подсчитать и вывести количество различных букв, которые входят в это предложение. Ответ должен приводиться в грамматически правильной форме, например: а – 25 раз, к – 3 раза и т.д
C++ Проверка выделена ли память под указатель Уважаемые программисты!!!!! подскажите пожалуйста можно ли каким-либо способом проверить в условном операторе, выделена ли память под указатель я пытался делать так: if (ptr == NULL) { ptr = new ...//дальше выделяется память } но в этом случае выбрасывалось исключение типа access violation reading location типа того.. что мне делать скажите плиз!!! подробнее

Показать сообщение отдельно
Wold
Сообщений: n/a

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

28.05.2009, 19:23. Просмотров 3292. Ответов 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

почему???(((
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru