2016-09-20 4 views
-4

Просто хочу изменить свой вопрос на данный момент - я мог бы просто использовать некоторые рекомендации относительно того, почему у меня три ошибки компилятора в моей программе, не совсем уверен, что я сделал неправильно/am missing - я добавил комментарии в код, чтобы указать, где они находятся. БлагодаряНесколько ошибок - попытка конвертировать римскую запись в десятичный

#include <iostream> 
    #include <string> 


using namespace std; 

class romanType 
{ 

public: 
    void setRomanNum(string store); 
    // this function will store the Roman numeral 

    int convertNum(char rNum); 
    // this function will convert the Roman numeral to a decimal 

    void decimalPrint(int total); 
    // this function will print the decimal number 

    void romanPrint(char rNum); 
    // this function will print the Roman numeral 

    int getNum(char letter); 
    // this function will get the number input 

    romanType(int store); 
    //Constructor with parameter 

    romanType(); 

    char roman[7]; 
    string num; 
    int length = 0; 
    string dNum; 
    int equals; 

}; 

romanType::romanType(int store) 
{ 
    dNum = 1; 

} 


void romanType::setRomanNum (string store) 
{ 
    dNum = store; 
} 

void romanType::romanPrint(char rNum) 
{ 
    cout << "The Roman numeral is: " << roman << endl; 
} 


void romanType::decimalPrint(int total) 
{ 
    cout << "The Decimal number is: " << equals << endl; 
} 


int romanType::convertNum (char rNum) 
{ 

    int letter; 
    int totalNum = 0; 


    for (int i = 0; i< dNum.length(); i++) 
     // "loop will run at most once (loop increment never executed)"? 

    { 

     switch (roman[i]) 
     { 
      case 'M': 
       totalNum+= 1000; 
       break; 

      case 'D': 
       totalNum += 500; 
       break; 

      case 'C': 
       totalNum += 100; 
       break; 

      case 'L': 
       totalNum += 50; 
       break; 

      case 'X': 
       totalNum += 10; 
       break; 

      case 'V': 
       totalNum += 5; 
       break; 

      case 'I': 
       totalNum += 1; 
       break; 

     } 
     totalNum = totalNum + letter; 
     equals = totalNum; 

     return equals; 
    } 
}; 
// "control may reach end of non-void function" 


int main() 
{ 
    romanType output; 


    int rNumeral; 
    char entry; 


    cout << "Please enter a Roman numeral (Capitalized only): " << endl; 
    cin >> rNumeral; 

    cout << "Print Decimal or Roman Numeral? Type 1 for Decimal, 2 for Roman Numeral: " << endl; 
    cin >> entry; 

    if (entry == '1') 
    { 
     cout << "You chose to view the decimal conversion." << endl; 
    output.decimalPrint(rNum); 
    // How do I output the decimal conversion from the void romanType::decimalPrint(int total) function? 
    } 
    else if (entry == '2') 
    { 


     cout << "You chose to view the Roman numeral." << endl; 
    output.romanPrint(rNumeral); 
    } 
    else 
     cout << "Error: bad input" << endl; 
    return 0; 
     exit(1); 


} 
+2

один вопрос на каждый вопрос, пожалуйста. stackoverflow.com не является учебным пособием или службой отладки. Укажите конкретный, дискретный, убедительный вопрос, вместо того, чтобы просить всех искать случай, который случайно посыпал ваш код, как какая-то охота на пасхальные яйца. –

+1

Исправить ошибки компилятора 1. Узнайте, как их читать. После того, как вы выполнили код с помощью отладчика, чтобы догнать логические ошибки. Вы не можете ожидать, что мы сделаем это для вас здесь. –

+0

Исправлено несколько ошибок компилятора, я не знал, как их исправить - все еще есть пара. Если кто-то может помочь мне с ошибками компилятора, это было бы здорово. Я добавил пару комментариев, где я получаю ошибки и не понимаю, почему. Я могу спросить о логике в отдельном вопросе - просто подумал, что это запрещено. Сожалею. – Croset

ответ

4

Ошибка в алгоритме является то, что римская система не является позиционной. См. En.wikipedia.org/wiki/Roman_numerals и en.wikipedia.org/wiki/Subtractive_notation. Вы не можете просто добавить последующие цифры (т. Е. Буквы), но вам также нужно идентифицировать и учитывать случаи, когда происходит вычитание.

почему я получаю ошибку «не соответствующий конструктор для инициализации„латиницей“?

Поскольку только при условии, конструктор не по умолчанию один, но принимает один параметр типа int. Поскольку такой конструктор был предоставлен, конструктор по умолчанию не генерируется компилятором. Определить romanType::romanType() или изменить существующий для romanType::romanType(int i = 0) (добавить параметр по умолчанию). См Is there an implicit default constructor in C++? и why default constructor is not available by default in some case

Ожидаемое выражение?

Обеспечить брекеты вокруг предшествующего блока else. Требуется более одного утверждения -> привязки.

if (entry == '1') { 
    cout << "You chose to view the decimal conversion." << endl; 
    output.decimalPrint(rNum); 
} else if (entry == '2') 
    cout << "You chose to view the Roman numeral." << endl; 
    output.romanPrint(rNumeral); 
} 

«контроль может достичь конца Непустой функции»

Это только предупреждение, но он превратится в ошибку, если вы включите -Werror флаг, который сообщает компилятор обрабатывать все предупреждения как ошибки.

Хорошо, я был неправ на этом. На самом деле трюк заключается в том, что возможно (теоретически), что функция romanType::convertNum(int) следует маршруту, где цикл for никогда не будет выполнен, и, следовательно, инструкция return будет выполнена. Это плохо, так как функция объявлена ​​для возврата int, поэтому должно быть указано явное заявление return, которое (сюрприз) вернет значение. Переместите return из петли. Эта ошибка также тесно связана с следующей, обсуждаемой ниже.

цикл будет работать не более одного раза (приращение цикла никогда не выполнялось) "?

Это потому, что return заявление неправильно размещен: внутри for петли не вне ее, так и внутри тела функции. Следовательно, цикл запускается один раз, и функция возвращается. Переместите оператор return. Подпишитесь на @ATN_LR_boom за это замечание!

Также, пожалуйста, введите код форматирования правильно. Это сэкономит вам много головной боли.

Кроме этого, я бы использовал std::map для функции преобразования, это стало короче и понятнее для читателя по сравнению с оператором switch. Что-то вдоль линий

int romanType::convertNum(int rNum) { 
    const static std::map<char, int> conversion = { 
     {'M', 1000}, 
     {'D', 500}, 
     // more mappings 
     {'I', 1} 
    }; 
    if ((auto it = conversion.find(rNum)) != conversion.end()) 
     return it->second; 
    else 
     return -1; 
} 
+0

AHHHH !!! ПО УМОЛЧАНИЮ СТРОИТЕЛЬСТВО СПАСИБО ВАМ. вы так много :) – Croset

1

Ваша логика для коммутатора является неправильным, попробовать что-то вроде этого:

int totalNum = 0; 
for (int i = 0; i< dNum.length(); i++) 
// the loop ran once because you were returning values when catching a letter 
{ 
    switch (roman[i]) 
    { 
     case 'M': // roman[i] is a char, the cases should try to catch chars 
      totalNum += 1000; // increment your global number 
      break; 

     case 'D': 
      totalNum += 500; 
      break; 
     ... 
    } 
return totalNum; 
+0

Имеет смысл, спасибо! Будет ли это изменено :) – Croset

Смежные вопросы