3

約 4 時間後にテストが予定されており、質問の 1 つで、ユーザーが入力した 100 までの整数をローマ数字に変換するように求められます。私のコードは非常に近いと思います(ガイドとして使用したYouTubeビデオを見つけました)が、残念ながら私のコードは単に機能しません:(。誰でもエラーを見つけることができますか?編集:ああ、sry sry sry、問題はそれですコンパイルすると、ローマ数字が表示されません. 値を入力すると、空白が表示されます.

    #include "stdafx.h"
#include <iostream>
#include <string>
    using namespace std;


int main()
{
    string romnum;
    int input;
    int num;
    cout << "Type in an integer: ";
    cin >> input;
    if(( input >= 101) || (input <= 0)) // <-- this is the upper bound
    {
        cout << "\n INVALID INPUT";
    }
    else
    {
        if(input = 100)
        {
            romnum + 'C';

        }
        input %= 100; // gets the remainder after dividing by 100

        if(input <= 10)
        {
            num = (input/10); // now we are dealing with number in 10s place
            if(num == 9)
            {
                romnum += "XC";
            }
            else if(num >= 5)
            {
                romnum += 'L';

                for(int i=0; i < num - 5;i++)
                {
                    romnum += 'X';
                }
            }
            else if(num == 4)
            {
                romnum += "XL";
            }
            else if(num >= 1)
            {
                for(int i=0; i>num; i++)
                {
                    romnum += 'X';
                }
                input %= 10;
            }
            if(num >= 1)
            {
                num = input; //  now we are dealing with number in ones place
                if(num == 9)
                {
                    romnum += "IX";
                }
                else if(num >= 5)
                {
                    romnum += 'V';
                    for(int i=0; i < num - 5; i++)
                    {
                        romnum += 'I';
                    }
                }
                else if(num == 4)
                {
                    romnum += "IV";
                }
                else if(num >= 1)
                {
                    for(int i = 0; i < num; i++)
                    {
                        romnum += 'I';
                    }
                }
        cout << "The Roman Numeral is: " << romnum;

            }
        }



        cout << "The Roman Numeral is: " << romnum;
    }
    int f;
    cin >> f;
    return 0;
}

enter code here
4

9 に答える 9

11

http://rosettacode.org/wiki/Roman_numerals/Encode#C.2B.2Bから

std::string to_roman(unsigned int value)
{
    struct romandata_t { unsigned int value; char const* numeral; };
    const struct romandata_t romandata[] =
    {
        {1000, "M"}, {900, "CM"},
        {500, "D"}, {400, "CD"},
        {100, "C"}, { 90, "XC"},
        { 50, "L"}, { 40, "XL"},
        { 10, "X"}, { 9, "IX"},
        { 5, "V"}, { 4, "IV"},
        { 1, "I"},
        { 0, NULL} // end marker
    };

    std::string result;
    for (const romandata_t* current = romandata; current->value > 0; ++current)
    {
        while (value >= current->value)
        {
            result += current->numeral;
            value -= current->value;
        }
    }
    return result;
}
于 2013-10-09T10:17:13.527 に答える
4

ここに 1 つの大きな問題があります。

if(input = 100)

私はあなたが意味すると思います

if(input == 100)

デバッガーでコードをステップ実行すると、これは非常に簡単であることがわかります。デバッガーはプログラマーの親友であり、意図したとおりに動作しない場合に最初に使用するツールであることを忘れないでください。

于 2013-10-09T07:52:11.783 に答える
1

これは実際にはあなたの試みよりもはるかに簡単に解決できると思います.率直に言って、あなたが何をしようとしているのか理解できません(しかしそれは私です)。

とにかく、ネストされていなくても、if/elseのシーケンスにすることができます。あなたがする必要があるのは、入力数値に含まれる「最大の」リテラルが何であるかを確認し、それを書き留めてから、入力数値から表す場合に値を減算することだけです。このように0になるまで続けます。

例 (これが C++ 構文かどうかはわかりませんが、もちろん調整できます):

string roman = ""
if(input == 100)
{
    roman += "C";
    input -= 100;
}

if(input >= 50)
{
    roman += "L";
    input -= 50;
}

などなど、残りは自分で把握できます (結局のところ、それは自分のテストです)。

2つのこと:

  • 一部のリテラルは繰り返すことができます (3: III、20: XX)。
  • たとえば、"XL" の代わりに 40 を表す "XXXX" を書くことは (あまり一般的ではありませんが) 依然として有効なローマ数字です。( http://en.wikipedia.org/wiki/Roman_numerals )
于 2013-10-09T08:27:18.247 に答える