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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 23 to XXIII 
:(
    Опции темы
september
Дата 6.10.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите написать консольную прогу, которая бы переводила любое число в римский кодировку (формат).
Например:
Вводим  - 1989
олучаем на выходе - MCMLXXXIX

PM MAIL   Вверх
sergejzr
Дата 6.10.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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





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


Опытный
**


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

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



Может можно конечно и лучше, но что-то ничего на ум не приходит, кроме как выполнить перевод для каждого разряда:
Код

#include<iostream>
#include<conio.h>
using namespace std;
const int MAX_LENGTH=255;//максимальная длина строки
void DecToRom(char* strRes,int num)//функция перевода
//работает на числах от 0 до 3999, иначе нужно дополнять Numbers
{
    const char Numbers[]="IVXLCDM";//римские цифры
    int number;//для выделения цифры
    int dc=0;//указатель на римские цифры
    int i=0;//счетчик
    while(num)//пока num<>0
    {
        number=num%10;//выделяем младший разряд
        switch(number)
        {
        case 1:
        case 2:
        case 3:
            {
                for(int j=0;j<number;j++)
                    strRes[i++]=Numbers[dc];//записываем выбранную римскую цифру
                break;
            }
        case 4:
            {
                //записываем римскую цифру, но наоборот, так как в дальнейшем будет инвертация строки
                strRes[i++]=Numbers[dc+1];
                strRes[i++]=Numbers[dc];
                break;
            }
        case 5:
            {
                strRes[i++]=Numbers[dc+1];
                break;
            }
        case 6:
        case 7:
        case 8:
            {
                for(int j=0;j<number-5;j++)
                    strRes[i++]=Numbers[dc];
                strRes[i++]=Numbers[dc+1];
                break;
            }
        case 9:
            {                
                strRes[i++]=Numbers[dc+2];
                strRes[i++]=Numbers[dc];
                break;
            }
        }
        dc+=2;//переходим к следующей паре
        num/=10;
    }
    char ch;//вспомогательная переменная для обмена
    //записываем строку в обратном порядке
    for(int j=0;j<i/2;j++)
    {
        ch=strRes[j];
        strRes[j]=strRes[i-1-j];
        strRes[i-1-j]=ch;
    }
    strRes[i]=NULL;//null символ
}
int main()
{
    int num;
    char strRes[MAX_LENGTH+1];
    cout<<"Please enter a number:\n";
    cin>>num;
    DecToRom(strRes,num);
    cout<<"Result="<<strRes<<endl;
    getch();
    return 0;
}

PM MAIL WWW ICQ Skype GTalk   Вверх
Dov
Дата 7.10.2006, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Код
#include <iostream.h>
#include <string.h>

int main()
{
    int num;
    char* roman[] = {"MMM", "D", "CCC", "L", "XXX", "V", "III"};
    
    do{
        cout << "Enter a number[1...3999], 0 - QUIT: ";
        cin >> num;

        if(num > 0 && num < 4000)
        {
            char res[16] = "";            

            for(int i = 0, mult = 1000; mult; mult /= 10, i += 2)
            {
                int tmp = num / mult % 10;

                switch(tmp)
                {
                case 1:
                case 2:
                case 3:
                    strncat(res, roman[i], tmp);
                    break;
                case 4:
                    strncat(res, roman[i], 1);
                    strcat (res, roman[i - 1]);
                    break;                    
                case 5:
                case 6:
                case 7:
                case 8:
                    strcat (res, roman[i - 1]);
                    strncat(res, roman[i], tmp - 5);
                    break;
                case 9:
                    strncat(res, roman[i], 1);
                    strncat(res, roman[i - 2], 1);
                }    
            } 
            cout << "Result: " << res << endl;
        }
    }while(num > 0); 

    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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