// romanclass.cpp - Roman Numeral Class IMPLEMENTATION #include"romanclass.h" #include void romannum::get(istream& INSTR) { char tval[80]; // Accumulated Cstring int idx = 0; // current index char cur; // current character read bool inputOK = true; // FLAG for read loop cur = INSTR.peek(); // Look at 1st char while ( isspace(cur) ) { INSTR.get(cur); //(skip whitespace) cur = INSTR.peek(); } while ( inputOK ) { cur = toupper(cur); switch (cur) { case 'M': case 'D': case 'C': case 'L': case 'X': case 'V': case 'I': tval[idx] = cur; idx++; INSTR.get(cur); // READ this char from stream cur = INSTR.peek(); // Look at the next char break; default: inputOK = false; } // end switch } // end while tval[idx] = '\0'; // NULL terminate Cstring ch2rom( tval ); // Convert from text } // end get() void romannum::put(ostream& OSTR) { char tval[80]; rom2ch(tval); // Convert to Cstring OSTR << tval; // output to stream } void romannum::add( romannum Z) { } void romannum::sub( romannum Z) { nval = nval - Z.nval; if (nval < 0) // Can't have negative roman numerals nval = 0; // can't really have ZERO either, but... } int romannum::rom2int() { return nval; } void romannum::int2rom(int num) { nval = num; } void romannum::rom2ch(char trom[] ) { // just a stub trom[0] = ':'; trom[1] = '-'; trom[2] = ')'; trom[3] = '\0'; } void romannum::ch2rom( const char textval[] ) { int valsofar = 0; int prevval = 1000; int curval = 0; int curidx = 0; while ( curval != -1 ) { switch ( textval[curidx] ) { case 'M' : curval = 1000; break; case 'D' : curval = 500; break; case 'C' : curval = 100; break; case 'L' : curval = 50; break; case 'X' : curval = 10; break; case 'V' : curval = 5; break; case 'I' : curval = 1; break; default: curval = -1; } // end switch curidx++; if ( curval != -1 ) { if (curval > prevval ) // Handle 4s & 9s (subtraction) { if ( ((curval / prevval) == 5) || ((curval / prevval) == 10) ) valsofar = valsofar + curval - (2 * prevval); else curval = -1; // FORMAT ERROR: Stop Processing } else valsofar = valsofar + curval; prevval = curval; }// end do math } // end while nval = valsofar; } bool romannum::GT(romannum Z) { if ( nval > Z.nval ) return true; else return false; } bool romannum::EQ(romannum Z) { } void romannum::SETEQ( romannum Z) { nval = Z.nval; }