0
string scriviNumeroMinoreMille(int a)
{
    vector<string> v_zero_to_nineteen(20);
    vector<string> v_twenty_to_ninety(8);

    v_zero_to_nineteen = {"zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici",
                          "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove"};

    v_twenty_to_ninety = {"venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"};

    string risultato;

    if(a == 0)
    {
        return risultato = "";
    }
    else if(a < 20 && a > 0)
    {
        return risultato = v_zero_to_nineteen[a];
    }
    else if(a == 20 || a == 30 || a == 40 || a == 50 || a == 60 || a == 70 || a == 80 || a == 90)
    {
        return risultato = v_twenty_to_ninety[(a/10)-2];
    }
    else if(a == 100)
    {
        return risultato = "cento";
    }

    int unita = 0;
    int decine = 0;
    int centinaia = 0;

    if(a > 99)
    {
        centinaia = a/100;
        risultato += (v_zero_to_nineteen[centinaia]);
        risultato += "cento";
    }
    if(a > 19)
    {
        if(a-(centinaia*100)%10 == 0)
        {
            decine = (a-(centinaia*100))/10;
            risultato += (v_twenty_to_ninety[decine-2]);
        }
        else
        {
            decine = (a-(centinaia*100)/10);
            risultato += v_twenty_to_ninety[decine-2];
            unita = (a-(centinaia*100)-(decine*10));
            risultato += v_zero_to_nineteen[unita];
        }
    }
    return risultato;
}

この関数は、0から999までの数値をチェックして、文字列内の数値を変換するために作成しました。結果は、たとえば、入力が100の場合、出力は「100」になります(イタリア語に翻訳されます)。

これらの2つのif句内の引数をデバッグする理由がわかりません。

if(a > 99)
{
    centinaia = a/100;
    risultato += (v_zero_to_nineteen[centinaia]);
    risultato += "cento";
}
if(a > 19)
{
    if(a-(centinaia*100)%10 == 0)
    {
        decine = (a-(centinaia*100))/10;
        risultato += (v_twenty_to_ninety[decine-2]);
    }
    else
    {
        decine = (a-(centinaia*100)/10);
        risultato += v_twenty_to_ninety[decine-2];
        unita = (a-(centinaia*100)-(decine*10));
        risultato += v_zero_to_nineteen[unita];
    }
}

関数では考慮されません。これらの2つのifはスキップされます。理由がわかりません。入力として123を入力すると、それらのifはスキップされます。しかし、条件はif(a> 99)、120は99以上です。わかりません。

4

1 に答える 1

0

コードにいくつかのエラーがあります。

まず、文字列型の+ =演算子は「conststring&」を取るので、これを行う代わりに:

risultato += (v_twenty_to_ninety[decine-2])

あなたはこのようにそれを渡す必要があります:

risultato += v_twenty_to_ninety[decine-2].c_str();

ここもまた

decine = (a-(centinaia*100)/10);

ifブロック内でのみ計算を行ったため、この時点ではゼロである「centinaia」を使用しています。if(a > 99)また、/ 10は、次のように括弧の外側にある必要があります。

decine = (a-(centinaia*100))/10

したがって、これをifの外に移動する必要があるcentinaia = a/100;ため、3つのifステートメントすべてが計算された変数を取得します(他の2つと同じ)。

これ:

int unita = 0;
int decine = 0;
int centinaia = a/100;

これに:

int centinaia = a/100;
int decine    = (a-(centinaia*100))/10;
int unita     = (a-(centinaia*100)-(decine*10));

メソッドにこの変更を加えました。次のようになります。

string scriviNumeroMinoreMille(int a)
{
    vector<string> v_zero_to_nineteen(20);
    vector<string> v_twenty_to_ninety(8);

    v_zero_to_nineteen = {"zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici",
                          "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove"};

    v_twenty_to_ninety = {"venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"};

    string risultato;

    if(a == 0)
    {
        return risultato = "";
    }
    else if(a < 20 && a > 0)
    {
        return risultato = v_zero_to_nineteen[a];
    }
    else if(a == 20 || a == 30 || a == 40 || a == 50 || a == 60 || a == 70 || a == 80 || a == 90)
    {
        return risultato = v_twenty_to_ninety[(a/10)-2];
    }
    else if(a == 100)
    {
        return risultato = "cento";
    }

    int centinaia = a/100;
    int decine    = (a-(centinaia*100))/10;
    int unita     = (a-(centinaia*100)-(decine*10));

    if(a > 99)
    {

       risultato += v_zero_to_nineteen[centinaia].c_str();
       risultato += "cento";


    }
    if(a > 19)
    {
        if(a-(centinaia*100)%10 == 0)
        {
            risultato += v_twenty_to_ninety[decine-2].c_str();
        }
        else
        {
            risultato += v_twenty_to_ninety[decine-2].c_str();

            risultato += v_zero_to_nineteen[unita].c_str();
        }
    }
    return risultato;
}

123入力の場合、「unocentoventitre」が出力されますが、イタリア語のxDを話さないため、それが正しいかどうかはわかりません。

それが役に立てば幸い。

編集:テストのために挿入した行を削除/元に戻すのを忘れました。

于 2012-12-16T20:21:33.390 に答える