Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

In C++ Please! Modify your Roman Number program to read entries from a file, one line at a time. Process each line and keep a

In C++ Please!

Modify your Roman Number program to read entries from a file, one line at a time. Process each line and keep a running total of the valid entries, separately for decimal values and for Roman Numbers. Enter the number of entries and the sums of the valid entries (in both categories) to complete this quiz. Also keep track of the number of invalid entries.

File:

I i 123 MCMLXXVII CMIX IIXXII FFFF XXXXII xlii 42 iiiiiiiiiiiiiiiiiiiiiiiii IM 2020 HELLO IMI MDCLXVI

Please answer this!

What is the sum of the ROMAN numerals in this file?

What is the sum of the DECIMAL numbers in this file?

How many INVALID ENTRIES are in the file?

Program:

#include #include #include

using namespace std; bool isValidRomanNumber(string s) { bool ret = false; regex str_expr("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"); if (regex_match(s, str_expr)) ret = true; return ret; }

bool isValidDecimalNumber(string s) { int i = 0, j = s.length() - 1; //function to check for spaces in string while (i < s.length() && s[i] == ' ') i++; while (j >= 0 && s[j] == ' ') j--; if (i > j) return 0;

if (i == j && !(s[i] >= '0' && s[i] <= '9')) return 0;

if (s[i] != '.' && s[i] != '+' && s[i] != '-' && !(s[i] >= '0' && s[i] <= '9')) return 0;

bool checkForDotOrExponential = false; for (i; i <= j; i++) { if (s[i] != 'e' && s[i] != '.' && s[i] != '+' && s[i] != '-' && !(s[i] >= '0' && s[i] <= '9')) return false;

if (s[i] == '.') { if (checkForDotOrExponential == true) return false; if (i + 1 > s.length()) return false; if (!(s[i + 1] >= '0' && s[i + 1] <= '9')) return false; }

else if (s[i] == 'e') { checkForDotOrExponential = true;

if (!(s[i - 1] >= '0' && s[i - 1] <= '9')) return false; if (i + 1 > s.length()) return false;

if (s[i + 1] != '+' && s[i + 1] != '-' && (s[i + 1] >= '0' && s[i] <= '9')) return false; } } return true; } int getCorrespondingDecimalOfRomanChar(char inputChar) { if (inputChar == 'I') return 1; if (inputChar == 'V') return 5; if (inputChar == 'X') return 10; if (inputChar == 'L') return 50; if (inputChar == 'C') return 100; if (inputChar == 'D') return 500; if (inputChar == 'M') return 1000;

return -1; } string convertRomanToDecimal(string s) {

int convertedDecimal = 0;

for (int i = 0; i < s.length(); i++) {

int value1 = getCorrespondingDecimalOfRomanChar(s[i]); if (i + 1 < s.length()) { int value2 = getCorrespondingDecimalOfRomanChar(s[i + 1]); if (value1 >= value2) { convertedDecimal = convertedDecimal + value1; } else { convertedDecimal = convertedDecimal + value2 - value1; i++; } } else { convertedDecimal = convertedDecimal + value1; } } return to_string(convertedDecimal); } string convertDecimalToRoman(string s) { string ret = ""; int number = std::stold(s); int listOfNumbers[] = { 1,4,5,9,10,40,50,90,100,400,500,900,1000 }; string listOfSymbols[] = { "I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M" }; int i = 12; while (number > 0) { int quotient = number / listOfNumbers[i]; number = number % listOfNumbers[i]; while (quotient--) { ret += listOfSymbols[i]; } i--; } return ret; } int main() { string inputString; bool contiLoop = true; int numberOfConvertions = 0; int numberOfRomanToDecimalConvertions = 0; int numberOfDecimalToRomanConvertions = 0; cout << "Welcome to Roman Number Conversion!" << endl; do { cout << "Please Enter a Value to Convert:"; cin >> inputString; if (inputString == "0" || inputString == "O") contiLoop = false; else {

if (isValidRomanNumber(inputString)) { string convertedVal = convertRomanToDecimal(inputString); cout << inputString << "(Roman) = " << convertedVal << "(Decimal)" << endl; numberOfRomanToDecimalConvertions++; } else if (isValidDecimalNumber(inputString)) { string convertedVal = convertDecimalToRoman(inputString); cout << inputString << "(Decimal) = " << convertedVal << "(Roman)" << endl; numberOfDecimalToRomanConvertions++; } else { cout << "I did not understand input" << inputString << endl; } } } while (contiLoop); numberOfConvertions = numberOfRomanToDecimalConvertions + numberOfDecimalToRomanConvertions; cout << numberOfConvertions << " numbers were converted (" << numberOfDecimalToRomanConvertions << "Decimal to Roman," << numberOfRomanToDecimalConvertions << " Roman to Decimal)" << endl; cout << "Thank you for Playing Roman Number Conversion! " << endl; return 0; }

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Contemporary Issues In Database Design And Information Systems Development

Authors: Keng Siau

1st Edition

1599042894, 978-1599042893

More Books

Students also viewed these Databases questions