Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перевод чисел из десятичной системы счисления, в Римскую 
:(
    Опции темы
simка
Дата 27.11.2004, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Написать прогу перевода чисел из десятичной системы счисления в Римскую. Исходное число считывается из одного файла, а результат записывается в другой файл.
I-1;V-5;X-10;L-50:C-100;D-500;M-1000

PM MAIL   Вверх
Intro
Дата 28.11.2004, 19:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Такая прога на олимпиаде была, там не решил, но дома разобрался... короче считывай char[] потом переводи в число, дальше разбирай с лево на право --- естественно перед элементом может стоять I поэтому обязательно это учитывай...
  Вверх
chipset
Дата 28.11.2004, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Модератор: Название темы должно отражать ее суть!


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
sergejzr
Дата 28.11.2004, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Вот написал в обе стороны smile
Комментировать не стал, так как вроде и так всё ясно smile
Кстати, я конечно не всё сам выдумывал уже готового в инете полно smile
Код

#include"iostream.h"
#define MAX_RNUM 512 //Максимальная длинна строки

int main()
{

int choice=0;
char in_stroka[MAX_RNUM];
char*begunok;
int in=0,out=0;

cout<<"Pervod chisel. Vybirajte 1(R-A) 2(A-R)? (1/2)"<<endl;

//Пользователь обязан задать 1 или 2 и ничего другого :)
while(!(choice==1||choice==2))cin>>choice;

switch(choice)
{
   case 1:
   {
       cout<<"Zadajte rimskuju cifru i nazhmite ENTER. Maximal'no: "<<MAX_RNUM<<" znakov"<<endl;
       cin>>in_stroka;

               //Ну вот, смотрим на символ и прибавляем к ответу его значение
       for(begunok=in_stroka;*begunok;begunok++)
       {
           switch(*begunok)
           {
               case 'M': out+=1000; break;
               case 'D': out+=500; break;
               case 'C': out+=100; break;
               case 'L': out+=50; break;
               case 'X': out+=10; break;
               case 'V': out+=5; break;
               case 'I': out+=1; break;
               default:{ cout<<"Neizvestnyj znak!"<<*begunok<<" vyhod!"; return -1; }
           }
           
       }
                //Готово
       cout<<in_stroka<<"(R) = "<<out<<"(A)";
   }
   break;
   case 2:
       {
                                                             
           cout<<"Zadajte Arabskuju cifru i nazhmite ENTER"<<endl;
           cin>>in;
               out=in;        
                               //А здесь "делим" вычитанием. Всё равно каждую букву прорисовывать                                        
               while (out >= 1000)
               {
                   cout<<"M"; out = out-1000;
               }
               if (out >= 500)                                                          
               {
                   cout<<"D"; out = out- 500;
               }
               while (out >=  100)                                                        
               {
                   cout<<"C"; out = out- 100;
               }                                        
               if (out >= 50)                                                            
               {
                   cout<<"L"; out = out-  50;
               }                                        
               while (out >=   10)                                                        
               {
                   cout<<"X"; out = out-  10;
               }                                        
               if (out >=  5)                                                            
               {
                   cout<<"V"; out = out-   5;
               }                                        
               while (out >=    1)                                                        
               {
                   cout<<"I"; out = out-   1;
               }                                      
       }
}
return 0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Alexandr87
Дата 29.11.2004, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 2
Всего: 39



Короче код написанный для перевода рим->дес., работает в некоторых случаях не корректно, не предусмотрен случай когда идет вычитание при стоящем справа меньшем числе:
Так XIX - не 21, а 19.

Алгоритм следующий: (писать код не буду, т.к. некогда, да и опыта мало, чтоб сделать это быстро и понятно)

1.Рассматриваем введеную строку с права налево.
2.Пишем функцию проверки(но можно включить и main()), которая будет принимать два char'a(можно указатели), и выдавать 1, если первый в римской сс, больше второго. Затем, можно воспользоваться тем, что предложил sergej.z , но только ставить условие, мол если следующий за текущем символом больше текущего, то не прибавлять десятичный эквивалент данного char'a, а отнимать его.

Это сообщение отредактировал(а) Alexandr87 - 29.11.2004, 14:26
PM Jabber   Вверх
Alexandr87
Дата 29.11.2004, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 2
Всего: 39



Вощем вроде вот, контроль вводимых значений делай сам


Код

#include <iostream>
using namespace std;

int comp(char arg1)
{
int argg1=0;
switch (arg1)
{
case 'I':
 argg1=1;break;
case 'V':
 argg1=5;break;
case 'X':
 argg1=10;break;
case 'L':
 argg1=50;break;
case 'C':
 argg1=100;break;
case 'D':
 argg1=500;break;
case 'M':
 argg1=1000;
}
return argg1;
}


void main()
{
int out=0;
char my[50];
cout<<"Vvedite chislo v rimskoi zapisi\n>>";
cin>>my;
for (int x=strlen(my)-1; x>=0; x--)
{
 if (comp(my[x])>=comp(my[x+1]))
  out+=comp(my[x]);
 if (comp(my[x])<comp(my[x+1]))
  out-=comp(my[x]);
}
cout<<out;
cin.get();
cin.get();
}


PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.