0

少し前にC++の学習を始めたばかりです。Jumping into C++ を読んでいます。問題は、第 7 章の質問 1 に関するものです。

数値をテキストに変換するソース コードを実装します。

これは私がこれまでに行ったことです:

#include <iostream>
#include <string>

using namespace std;

int LessThen20 (int i);

int main () {
    int i = 1;
    cout << "please input a number: \n";
    cin >> i;
    if (i < 20) {
        cout << LessThen20(i);
    }

    if ( i >= 20 && i < 30) {
        cout <<"Twenty " ??
    }
}

int LessThen20 (int i) {
    if (i == 0) {
        cout << "zero" <<endl;
    }

    if ( i == 1) {
        cout << "one"; <<endl;
    }

    if (i == 2) {
        cout << "two"; <<endl;
    }

    if ( i == 3) {
        cout << "three"; <<endl;
    }

    if (i == 4) {
        cout << "four"; <<endl;
    }

    if ( i == 5) {
        cout << "five"; <<endl;
    }

    if (i == 6) {
        cout << "six"; <<endl;
    }

    if ( i == 7) {
        cout << "seven"; <<endl;
    }

    if (i == 8) {
        cout << "eight" <<endl;
    }

    if ( i == 9) {
        cout << "nine"; <<endl;
    }

    if (i == 10) {
        cout << "ten"; <<endl;
    }

    if ( i == 11) {
        cout << "eleven"; <<endl;
    }

    if (i == 12) {
        cout << "twelve"; <<endl;
    }

    if ( i == 13) {
        cout << "thirteen"; <<endl;
    }

    if (i == 14) {
        cout << "fourteen"; <<endl;
    }

    if ( i == 15) {
        cout << "fifteen"; <<endl;
    }

    if (i == 16) {
        cout << "sixteen"; <<endl;
    }

    if ( i == 17) {
        cout << "seventeen"; <<endl;
    }

    if (i == 18) {
        cout << "eighteen"; <<endl;
    }

    if ( i == 19) {
        cout << "nineteen"; <<endl;
    }
}

私のプログラムは、入力された数値が 20 未満である限り機能します。しかし、数値 25 を「25」に変換する方法がわかりません。

どんな助けでも大歓迎です!

4

4 に答える 4

6

20 未満はすべて特殊なケースです。"zero", "one", "two",ただし、巨大な if チェーンを使用する代わりに、 etc とデータ構造へのインデックスを含むデータ構造を使用する必要があります。(たとえば、ベクトル、マップ、または配列。これらの使用方法がわからない場合は、すべてのプログラミング言語でデータ構造が非常に便利であり、それらを学びたいと思うので、学習することをお勧めします)。

20 を超えると、より一般的なコーディングを開始する必要があります。単語バージョンの作成を部分に​​分割する必要があります。

1) 単位列を取得します。% 10 は 10 で割った後の余りを取得するため、数値 % 10 を使用して単位のみを取得できます。単位番号を使用して、以前のゼロ、1、2 などのデータ構造にインデックスを付け、何を印刷するかを取得できます。

2) 10 の列を取得します。同様のアイデア - (number / 10) % 10. 次に、10 列を ""、"10"、"20"、"30"、... 0、1、2、3... のようなデータ構造にインデックス付けします。

3) ... 上位のすべての列についても同様です。

于 2013-05-29T01:29:35.757 に答える
4

2 桁目が 2 より大きい場合は、「20」と同じ方法で連結する必要がありますが、30、40 などと連結する必要があります。

同じアプローチを数百、数千などに適用できます。

「プレフィックス」を、直接インデックス付けできる何らかの種類の配列に格納した場合 (つまり、たとえば myTensArray[3] が「30」になるように) するのがおそらく最善です。

于 2013-05-29T01:29:53.100 に答える
1

多くの解決策がありますが、ここでいくつかのアイデアを自分で実装したいと思うので (整数型のみ): まず、文字列を格納するために必要な char 配列の長さを決定します。桁数は、

int digits = ((int)log10(number))+1; //+1 if number is negative

次に、番号を数字に分割します

for(int i = digits - 1; number; i--){  //until number is 0
//charFromDidgit(...) returns the char for a nuber between 0 and 9 (e.g. '3' for 3) 
yourCharArray[i] = charFromDigit(number%10);
number /= 10;
}

配列の最後に終端の 0 を追加することを忘れないでください

于 2013-05-29T01:37:45.720 に答える
-1

原始的な概念だけでこれを行う方法が必要な場合は、数値が特定の値を超えているかどうかを確認し、その数値の大きさに応じてその数値から減算するループを使用するだけです。ループを実行するたびに、変数を使用して、数値から減算した回数を保持します。

例えば:

//Your number is greater than 1 billion
while ( x > 1000000000 ) { 
billions += 1 
x -= 1000000000 
}

//Your number is greater than 1 million
while ( x > 1000000 ) { 
millions += 1 
x -= 1000000
}

//Your number is greater than 1 thousand
while ( x > 1000 ) { 
thousands += 1 
x -= 1000
}

等々。次に、これをはるかに小さな問題にしました。これで、3 桁の数字を処理するだけで済みます (上記とまったく同じ手順を、10 と 100 だけで使用できます)。モジュラス演算子も使用できます。実装するのは難しいですが、より効率的です。

于 2013-12-16T16:21:39.493 に答える