2014-02-07 2 views
2

Я работаю над программой для своего курса на C++. Руководящие принципы заключаются в создании конвертера, который превращает целые числа в римские цифры, причем спецификации состоят в том, что я должен использовать хотя бы один оператор while, do while и один переключатель.C++: путаница при преобразовании целых чисел в римские цифры

Мой код работает по большей части, но я не могу привлекать особые случаи, связанные с 4 и 9 (например, (4, 14, 24 34 и т. Д.) 40, (140, 240 и т. Д.) 400, (1400 , 2400, 3400 и т. Д.) И (9, 19, 29, 39 и т. Д.) 90, (190, 290 и т. Д.) 900, 9000)) работать для меня. Это код, у меня есть на данный момент:

#include <iostream> 
#include <string> 
using namespace std; 
int main() 
{ 
    cout << "Please enter an interger." << endl; 
    int num = 0; 
    cin >> num; 
    string rep = "";  


    switch(num) 
    { 
     case 40:          
     rep += "XL"; 
     num -= 40;         
     break;          
     case 90: 
     rep += "XC"; 
     num -= 90; 
     break; 
    } 


     if (num >= 1000){ 
     rep += string(num/1000,'M'); 
     num %= 1000; 
     } 
     if (num >= 500){ 
      rep += string(num/500,'D'); 
      num %= 500; 
     } 
     if (num >= 100){ 
      rep += string(num/100,'C'); 
      num %= 100; 

     } 
     if (num >= 50){ 
      rep += string(num/50,'L'); 
      num %= 50; 

     } 
     if (num >= 10){ 
      rep += string(num/10,'X'); 
      num %= 10; 
     } 
     if (num >= 5){ 
      rep += string(num/5,'V'); 
      num %= 5; 
     }  
     if (num >= 1){ 
     rep += string(num,'I'); 
     num %= 1; 
     } 


     cout << num << endl; 
     cout << rep << endl; 

    return 0; 
} 
+0

Таковы некоторые довольно тупые спецификации. (То, что указал ваш учитель) – nhgrif

+1

@nhgrif: ну, явная цель кода - преобразовать целое число в римские цифры, но эта цель совершенно бесполезна, хотя она делает что-то явно конструктивное. Реальная цель упражнения состоит в том, чтобы изучить эти три структуры управления, что чрезвычайно полезно, хотя это может быть не имеет отношения к якобы имеющейся цели кода. В сущности, реальные задачи не обязательно являются лучшим способом изучения синтаксиса :-) –

+0

Вот почему я считаю, что спецификации тупые. Синтаксис обучения должен выполняться в лекции класса, в викторинах или в рамках небольших заданий домашней работы: «Напишите цикл for». например. Фактические проекты, подобные этому, не должны иметь требований вне того, что программа должна выполнять в целом, и студент должен быть оценен по его способности реализовать лучшие структуры управления. – nhgrif

ответ

0
switch(num) 
{ 
case 40:          
    rep += "XL"; 
    num -= 40;         
    break;          
case 90: 
    rep += "XC"; 
    num -= 90; 
    break; 
} 

Они работают только тогда, когда число является точным 40 или 90. Постарайтесь отделить число, а не сравнивать равенство.

+0

Как бы я это сделал, поддерживая переключатель, который должен существовать в моем проекте? – Titanguy654

+0

@ Titanguy654 Просто не делайте этого. – xis

0

Я бы сделал это, сначала найдя подходящий алгоритм (Google произвела для меня полезные результаты), а затем, после его реализации, я найду способ зациклиться на трех требуемых структурах управления.

Я подозреваю, что эти требования действительно могут вам помочь. Например, рассмотрим простое преобразование, число 2000. This should produce "MM".

Итак, давайте начнем с этой идеи. Ваш алгоритм должен быть примерно таким:

while (the number is greater than zero) { 
    Check if the number is greater than 1000. If so, take 1000 off the number and put an "M" in the string. 
} 

Этот код использует цикл while (то, что отсутствует в вашем текущем коде).

Затем вы можете перейти к новому тестовому примеру, например 100. Это должно привести к «C». Тогда я буду работать на 200 и 300, получая то же самое, если цикл сверху, чтобы выполнить эту работу.

Я нашел интересный алгоритм онлайн, который проверял более 400 и менее 500 и заменил его на «CD». Возможно, это поможет вашему мышлению.

0

От http://rosettacode.org/wiki/Roman_numerals/Encode#C.2B.2B

std::string to_roman(unsigned int value) 
{ 
    struct romandata_t { unsigned int value; char const* numeral; }; 
    const struct romandata_t romandata[] = 
    { 
     {1000, "M"}, {900, "CM"}, 
     {500, "D"}, {400, "CD"}, 
     {100, "C"}, { 90, "XC"}, 
     { 50, "L"}, { 40, "XL"}, 
     { 10, "X"}, { 9, "IX"}, 
     { 5, "V"}, { 4, "IV"}, 
     { 1, "I"}, 
     { 0, NULL} // end marker 
    }; 

    std::string result; 
    for (const romandata_t* current = romandata; current->value > 0; ++current) 
    { 
     while (value >= current->value) 
     { 
      result += current->numeral; 
      value -= current->value; 
     } 
    } 
    return result; 
} 
Смежные вопросы