#include <iostream>
#include <string>
using namespace std;
class rom2dec
{
public: void roman();
int convert();
void print();
void get();
private: int M, D, C, L, X, V, I;
char romanNumeral;
};
void rom2dec::roman()
{
M = 1000;
D = 500;
C = 100;
L = 50;
X = 10;
V = 5;
I = 1;
}
int rom2dec::convert()
{
if(romanNumeral == 'I' || 'i')
{ cout << 1; }
else if(romanNumeral == 'V' || 'v')
{ cout << 5; }
else if(romanNumeral == 'X' || 'x')
{ cout << 10; }
else if(romanNumeral == 'L' || 'l')
{ cout << 50; }
else if(romanNumeral == 'C' || 'c')
{ cout << 100; }
else if(romanNumeral == 'D' || 'd')
{ cout << 500; }
else if (romanNumeral == 'M' || 'm')
{ cout << 1000; }
else if(romanNumeral != 'I' && romanNumeral != 'i' && romanNumeral != 'V' && romanNumeral != 'v' && romanNumeral != 'X' && romanNumeral != 'x' && romanNumeral != 'L' && romanNumeral != 'l' && romanNumeral != 'C' && romanNumeral != 'c' && romanNumeral != 'D' && romanNumeral != 'd' && romanNumeral != 'M' && romanNumeral != 'm')
{ cout << "Error! Not a valid value!" << endl; }
return romanNumeral;
}
void rom2dec::print()
{ cout << romanNumeral << endl; }
void rom2dec::get(){ }
int main()
{
char romanNumeral;
cout << "Please enter a number in Roman numerals to be converted: " << endl;
cin >> romanNumeral;
return 0;
}
Я не получаю ошибок при сборке программы, но когда я отлаживаю и пытаюсь преобразовать римскую цифру в десятичную, я не получаю десятичной. Все предложения приветствуются, и если есть более простой способ написать последнее, пожалуйста, дайте мне знать. Благодарю.
В вашей программе много ошибок:
Я исправил код:
#include <iostream>
#include <string>
using namespace std;
class rom2dec
{
public:
rom2dec(char x): romanNumeral(x) {};
~rom2dec() {};
void roman();
int convert();
void print();
void get();
private: int M, D, C, L, X, V, I;
char romanNumeral;
};
void rom2dec::roman()
{
M = 1000;
D = 500;
C = 100;
L = 50;
X = 10;
V = 5;
I = 1;
}
int rom2dec::convert()
{
if (romanNumeral == 'I' || romanNumeral == 'i')
{ cout << 1; }
else if (romanNumeral == 'V' || romanNumeral == 'v')
{ cout << 5; }
else if (romanNumeral == 'X' || romanNumeral == 'x')
{ cout << 10; }
else if ((romanNumeral == 'L') || romanNumeral == 'l')
{ cout << 50; }
else if (romanNumeral == 'C' || romanNumeral == 'c')
{ cout << 100; }
else if (romanNumeral == 'D' || romanNumeral == 'd')
{ cout << 500; }
else if (romanNumeral == 'M' || romanNumeral == 'm')
{ cout << 1000; }
else
{ cout << "Error! Not a valid value!" << endl; }
return romanNumeral;
}
void rom2dec::print()
{ cout << romanNumeral << endl; }
void rom2dec::get(){ }
int main()
{
char romanNumeral;
cout << "Please enter a number in Roman numerals to be converted: " << endl;
cin >> romanNumeral;
rom2dec obj(romanNumeral);
obj.convert();
return 0;
}
Я дал это немного переделать.
вместо лапши if-else-if-else-if
Контрольное заявление я использовал неупорядоченная карта для отображения строчных букв в int (заглавные буквы преобразуются в строчные, прежде чем искать на карте).
сам класс теперь улучшен одиночка, и работает как функтор на персонажи.
там сейчас перегружен istream
operator>>
это позволяет использовать экземпляр класса в качестве приемника для потоков istream (std :: cin или потока строк, которые я использовал для издеваться пользовательский ввод)
Чтобы использовать это в интерактивном режиме, просто измените #if 0
в #if 1
#include <iostream>
#include <unordered_map>
#include <string>
#include <sstream>class rom2dec
{
public:
using map_type = std::unordered_map<char,int>;
static rom2dec& instance() {
static rom2dec r2d;
return r2d;
}
int operator() (char romanNumeral) const;
void print(char romanNumeral) const;
void get(); // ?
private:
rom2dec() = default;
~rom2dec() = default;
rom2dec(const rom2dec&) = delete;
rom2dec(rom2dec&&) = delete;
rom2dec& operator=(rom2dec&&) = delete;
rom2dec& operator=(const rom2dec&) = delete;
static map_type map_;
};
rom2dec::map_type rom2dec::map_ = {
{'i', 1},
{'v', 5},
{'x', 10},
{'l', 50},
{'c', 100},
{'d', 500},
{'m', 1000}
};int rom2dec::operator() (char romanNumeral) const
{
int rv = -1;
auto it = map_.find(std::tolower(romanNumeral));
if (it != map_.end()) {
rv = it->second;
} else {
std::cerr << "Error! '" << romanNumeral
<< "' is not a valid value!"<< std::endl;
}
return rv;
}
void rom2dec::print(char romanNumeral) const
{
std::cout << romanNumeral << "\n";
}
void rom2dec::get() {}
std::istream& operator>>(std::istream& is, const rom2dec& r2d) {
char romanNumeral;
if (is >> romanNumeral) {
int dec = r2d(romanNumeral);
if (dec > 0)
std::cout << romanNumeral << " = " << dec << "\n";
}
return is;
}int main()
{
auto& r2d = rom2dec::instance();
#if 0
auto& is = std::cin;
#else
std::stringstream is("C\n+\n+\nM\nM\nX\nI\nV");
#endifdo {
std::cout << "Please enter a single Roman numeral to be converted"<< "(press <CTRL>+<D> to terminate):\n";
} while (is >> r2d);
return EXIT_SUCCESS;
}
жить у Колиру