2012-03-30 6 views
2

可能性の重複をint型作りは:
My output is outputting correctlyローマ数字を使用してプログラムを実行し、それらを

これは宿題の問題です。私はローマ数字のいくつかが正しくないことを知っています。私の先生は、値が正しい限り数値を正しく書く方法には気を付けません。

私はこのプログラムにいくつかの問題があります。私は、ユーザが「E」を押すことを要求することを除いて、whileループから抜け出す他の方法を知らない。

これを実行すると、出力はcout << "The first number is " << RomanNum1 << endl;と変わります。これは、VやVIなどではなくEです。

私は関数を使うはずです。私はそれらを作ることについて心配していません。プログラムの一番下の部分は、先生が出力を見たいと思っているものです。どんな助けでも大歓迎です。

//This programs reads in Roman numerals and outputs the correct numerical value. 
//This program will do simple math using Roman numerals and output a numerical value 
#include <iostream> 

using namespace std; 

const char One = 'I'; 
const char Five = 'V'; 
const char Ten = 'X'; 
const char Fifty = 'L'; 
const char OneHundred = 'C'; 
const char FiveHundred = 'D'; 
const char OneThousand = 'M'; 
const char EXIT = 'E'; 
const char Plus = '+'; 
const char Minus = '-'; 
const char Times = '*'; 
const char Divide = '/'; 

const int ValueOfOne = 1; 
const int ValueOfFive = 5; 
const int ValueOfTen = 10; 
const int ValueOfFifty = 50; 
const int ValueOfOneHundred = 100; 
const int ValueOfFiveHundred = 500; 
const int ValueOfOneThousand = 1000; 

int main(){ 
    char RomanNum1, RomanNum2; 
    char Operation; 
    int Answer; 
    string Response; 

    int ICount = 0; 
    int VCount = 0; 
    int XCount = 0; 
    int LCount = 0; 
    int CCount = 0; 
    int DCount = 0; 
    int MCount = 0; 

    int Sum = 0; 


    cin >> RomanNum1; 
    while (RomanNum1 != EXIT){ 

     if (RomanNum1 == One){ 
      ICount++; 
     } 
     else if (RomanNum1 == Five){ 
      VCount++; 
     } 
     else if (RomanNum1 == Ten){ 
      XCount++; 
     } 
     else if (RomanNum1 == Fifty){ 
      LCount++; 
     } 
     else if (RomanNum1 == OneHundred){ 
      CCount++; 
     } 
     else if (RomanNum1 == FiveHundred){ 
      DCount++; 
     } 
     else if (RomanNum1 == OneThousand){ 
      MCount++; 
     } 
     else { 
      RomanNum1 = EXIT; 
     } 
     cin >> RomanNum1; 
    } 

    cin >> RomanNum2; 
    while (RomanNum2 != EXIT){ 

     if (RomanNum2 == One){ 
      ICount++; 
     } 
     else if (RomanNum2 == Five){ 
      VCount++; 
     } 
     else if (RomanNum2 == Ten){ 
      XCount++; 
     } 
     else if (RomanNum2 == Fifty){ 
      LCount++; 
     } 
     else if (RomanNum2 == OneHundred){ 
      CCount++; 
     } 
     else if (RomanNum2 == FiveHundred){ 
      DCount++; 
     } 
     else if (RomanNum2 == OneThousand){ 
      MCount++; 
     } 
     else { 
      RomanNum2 = EXIT; 
     } 
     cin >> RomanNum2; 
    } 

    cin >> Operation; 
    if (Operation == Plus){ 
     Answer = RomanNum1 + RomanNum2; 
     Response = "sum"; 
    } 
    else if (Operation == Minus){ 
     Answer = RomanNum1 - RomanNum2; 
     Response = "difference"; 
    } 
    else if (Operation == Times){ 
     Answer = RomanNum1 * RomanNum2; 
     Response = "product"; 
    } 
    else { 
     Answer = RomanNum1/RomanNum2; 
     Response = "quotient"; 
    } 

    Sum = ValueOfOne * ICount + ValueOfFive * VCount + ValueOfTen * XCount 
     + ValueOfFifty * LCount + ValueOfOneHundred * CCount + ValueOfFiveHundred 
     * DCount + ValueOfOneThousand * MCount; 

    cout << "The first number is " << RomanNum1 << endl; 
    cout << "The second number is " << RomanNum2 << endl; 
    cout << "Arithmetic operation is " << Operation << endl; 
    cout << "The " << Response << " of " << RomanNum1 << " and " << RomanNum2 << " is " << Sum << endl; 

    return 0; 
} 

/* here is what the output should be 
Input for Run 1: 
MCCXXVI 
LXVIIII 
+ 
DCX 
MCI 
- 
LXVI 
CCLXI 
/
MD 
XXX 
/
LXVIIII 
XXVIIII 
* 

The output for Test Run 1: 
MCCXXVI 
The first number is 1226 
LXVIIII 
The second number is 69 
+ 
Arithmetic operation is + 
The sum of 1226 and 69 is MCCLXXXXV (1295) 

DCX 
The first number is 610 
MCI 
The second number is 1101 
- 
Arithmetic operation is - 
The difference of 610 and 1101 is -CCCCLXXXXI (-491)*/ 
+0

を作成するための高い時間であるC++でする必要がある場合ローマ数字を整数の対応にリンクする配列。そうすることで、コードの管理が容易になり、コードをより細かく保つことができます。 – Moses

+2

確かに、ローマ数字は正しく扱われませんが、どういうことがありますか?とにかく、あなたのコードは '-Wall -Wextra'を使っても警告を生成しないので、私はupvoteできます。 1つは頻繁にそれを見ない。 –

+0

このプログラムでは配列を使用できません – user1237037

答えて

2

こんにちは、ローマ数字についてのヒント。小さな値が大きい値の前にある場合は、小さい方の値が大きな値から減算され、結果が合計に加算されます。たとえば、詳細についてはIV = 4 は、関連するWikipediaのページをチェックしてください。 http://en.wikipedia.org/wiki/Roman_numerals

ので、加算部分を改訂しなければなりません。

一般に、コード内で何回か繰り返しが見られる場合は、いつでもそのコードをメソッドに抽出することを躊躇しないでください。

そして宿題が使用すると、配列は、まだどのように機能するかを学んできた場合、私は非常に並列または多次元のいずれかを作成することをお勧めし、サイドノートとしてRomanNumeralクラス:)

+0

ああ、そうです。オーバーロードされた>>および<<演算子、内部的に整数型の記憶域を持つRomanNumeralクラス、次にoverload +、 - 、*、/ ...宿題が完了しました! –

+0

このプログラムを使用することはできません。私たちはすべての点を失う。また、彼は注文を気にしない。番号がVIXの場合は、XVI = 16を出力するはずです。 – user1237037

関連する問題