3

私は全くの初心者です。

num1 から num90 までの変数 (文字列) のリストがあります。int の数値を num という単語に追加して、関数からこれらを呼び出す必要があります。

タスクは、数字を「C++ に飛び込む」ことから単語に変換することです...私は「正しい」方法でそれを行っていないかもしれませんが、この部分はしばらくの間私を止めていました!!

私はこのようにしようとしています:

    #include <iostream>
    #include <string>

    using namespace std;

    // Hard code numbers to 20 and then in tens to 90
    string num1 = "one";
    string num2 = "two";
    string num3 = "three";
    string num4 = "four";
    string num5 = "five";
    string num6 = "six";
    string num7 = "seven";
    string num8 = "eight";
    string num9 = "nine";

その他...最大90

    int main ()
    {

    // Break the number down into three digit blocks
    int num = 0;

    cout << "Please enter the number: ";
    cin >> num;


  while (num > 999)
    {
int digit = (num % 1000);
num = ((num - digit)/1000);
//cout << digit << '\n';
//cout << num << '\n';

// For each block of numbers work out hundreds,


if (digit > 100)
{
    int i = digit;
    int j = (i % 100);
    cout << num.append(j) << " hundred";
}

私がする必要があるのは、文字列 num* を呼び出すために、単語 num にタグ付けされる 'j' に格納されている数値です。

これは可能ですか?

4

3 に答える 3

3

もちろん、地図を使用してください:

#include <map>
#include <string>
#include <iostream>

std::map<int, std::string> words { { 1, "one" }, { 2, "two" }, { 3, "three" } };

int main()
{
    std::cout << words[1] << std::endl;
}

おそらく、いくつかの特殊なケース (最大 20 か?) に対処する必要があり、「100」などを表す単語が必要になります。国際化可能にしたい場合は、さらに難しく考える必要があります。

于 2012-12-02T11:31:47.747 に答える
2

私がする必要があるのは、文字列 num* を呼び出すために、単語 num にタグ付けされる 'j' に格納されている数値です。

このアプローチの問題点は、コードで使用する変数名がコンパイルされていないことです。プログラムを実行すると、変数の値が操作されますが、「num3」という名前を使用することにしたことを認識したり、気にしたりしません。 「numero3」または「foobar」の代わりに。

数字(3)と​​文字列(「3」)の間にリンクを作成したい場合は、Vector(@Markが示唆するように、20以降は問題がありますが)またはMap(@として)を使用できますKerrekの提案): どちらの場合も、文字列は変数の名前ではなく、変数の値 (たとえば、 の数字の値、またはリテラル値の 1 )によって参照れるlookup[digit]ためこれらは機能します。words[1]


編集:

参考までに、'if' と 'switch' を使用したバージョンを次に示します...

#include <iostream>
#include <string>
using namespace std;

string units2word(int units){
    switch (units){
        case 0: return "zero";
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        // etc ...
        case 18: return "eighteen";
        case 19: return "nineteen";
    }
}

string tens2word(int tens){
    switch(tens){
        case 2: return "twenty";
        case 3: return "thirty";
        // etc ...
        case 9: return "ninety";
    }
}

string num2words(int num) {
    if (num > 99 && num%100 == 0) return units2word(num/100) + " hundred";
    if (num > 99) return units2word(num/100) + " hundred and " + num2words(num%100);
    if (num < 20) return units2word(num);
    if (num%10 == 0) return tens2word(num/10);
    return tens2word(num/10) +"-"+ units2word(num%10);
}

int main(int argc, char *argv[]) {
    int num = -1;
    while( num < 0 || num > 999){
        cout << "Please enter a number between 0 and 999: ";
        cin >> num;
    }
    cout << "You typed: " << num2words(num) << endl;
}
于 2012-12-02T11:48:42.897 に答える
1

std::vector の使用を検討する必要があります。これにより、インデックスを取る変数が得られます

std::vector<std::string> lookup;
lookup.push_back( "zero" );   // starts at lookup[0]

lookup.push_back( "one" );
lookup.push_back( "two" );
// etc

// then

std::cout << lookup[digit] << std::endl;
std::cout << lookup[num] << std::endl;
于 2012-12-02T11:30:36.763 に答える