プロが教える店舗&オフィスのセキュリティ対策術

C言語で、入力された数値を英単語に変換するプログラムを作ろうとしています。0~999,999,999 までの整数値について,正しく英単語に変換できるようにしたいのですがどうしていいかわかりません。どうか教えてください。

A 回答 (8件)

どういう変換ルールに基づき変換するのですか?


単に変換といっても、数値と英単語は何も関係ないので、何らかの基準が必要になると思うのですが…

この回答への補足

入力された数値をそのまま英語に直すだけです。
出力例
num: 123
English: one hundred twenty-three

num: 34445
English: thirty-four thousand four hundred forty-five

num: 432143213
English: four hundred thirty-two million one hundred forty-three thousand two hundred thirteen.

num: 999432143100
English: nine hundred ninty-nine billion four hundred thirty-two million one hundred forty-three thousand one hundred.

補足日時:2008/12/12 03:24
    • good
    • 0

 


 下位から順に、2桁、1桁、3桁、3桁と区切って変換する。
 
    • good
    • 0

 


 訂正。
 3桁づつ区切って、それをさらに2桁、1桁に区切って変換する。
 
    • good
    • 0

あくまで一つの提案ですが…


2桁の数字に関しては10台などのイレギュラーもあるので、文字列配列に格納しておいたら良いのではないかと思います。
str[100][20] 等を定義して、0から99までの英単語を保持しておく。このときゼロについては、zero ではなく長さ0の文字列にしておいた方が後が楽でしょう。

次に3桁の数字 n を英単語に変換するルーチンを作成。
百の位(数字を100で除してintをとる) : h = int(n/100)
str[h] が百の位を表す単語
str[n-100*h] が十の位・一の位を表す単語
間に "hundred" を入れて文字列結合。

あとは thousand 以上の位と million 以上の位があるかどうかを調べて、それぞれ3桁の数字を上のルーチンで変換した上で、 "million" や "thousand" を結合して出力したら良いのでは?
    • good
    • 0

#1


>どういう変換ルールに基づき変換するのですか?
>単に変換といっても、数値と英単語は何も関係ないので、何らかの基準が必要になると思うのですが…
#1の回答
>>入力された数値をそのまま英語に直すだけです。
実は、この「そのまま英語に直すだけ」の作業が、コンピュータにとっては、もっとも苦手な作業ですね。
人間にとっては、何でもない作業でも、コンピュータにとっては難しい作業なので、具体的に細かく指示を与えないと、動作してくれません。
原理的には、0~999,999,999 までの数字を人間が英語に全て直したものを、どこかに記憶しておき、それを取り出すのが、最も基本的な方法になります。
    • good
    • 1

「すべての組み合わせ」を洗い出して対応表を作り、対応表から英単語を取り出す、と言う方法を使うしかありません。



対応表は「共通の部分は、1つで済ます」などの工夫をすると良いでしょう。

例えば「日本語のひらがな」に変換するのを考えてみましょう。

一の位は
0⇒「」
1⇒「いち」
2⇒「に」
3⇒「さん」
4⇒「よん」
5⇒「ご」
6⇒「ろく」
7⇒「なな」
8⇒「はち」
9⇒「きゅう」
です。

十の位は
0⇒「」
1⇒「じゅう」
2⇒「にじゅう」
3⇒「さんじゅう」
4⇒「よんじゅう」
5⇒「ごじゅう」
6⇒「ろくじゅう」
7⇒「ななじゅう」
8⇒「はちじゅう」
9⇒「きゅうじゅう」
です。2~9は「△△じゅう」の「△△」は一の位と共通です。なので
0⇒「」
1⇒「じゅう」
2~9⇒一の位の対応表+「じゅう」
とすれば、十の位が出来ます。

百の位は
0⇒「」
1⇒「ひゃく」
2⇒「にひゃく」
3⇒「さんびゃく」
4⇒「よんひゃく」
5⇒「ごひゃく」
6⇒「ろっぴゃく」
7⇒「ななひゃく」
8⇒「はっぴゃく」
9⇒「きゅうひゃく」
です。3とか6とか8は他と違うので、専用の対応表が必要でしょう。

千の位は
0⇒「」
1⇒「せん」
2⇒「にせん」
3⇒「さんぜん」
4⇒「よんせん」
5⇒「ごせん」
6⇒「ろくせん」
7⇒「ななせん」
8⇒「はっせん」
9⇒「きゅうせん」
です。ここも3とか8は他と違うので、専用の対応表が必要でしょう。

さて、一万~千万の位は「一の位~千の位と同じ+まん」ですから、一~千の位と同じ処理をして、最後に「まん」を足せば良い事になります。

一億~千億の位も「一の位~千の位と同じ+おく」ですから、同じです。

なので「813573」は「81+まん+3573」と処理する事になります。

これで「813573」が「はちじゅういちまんさんぜんごひゃくななじゅうさん」になります。

英語の場合も「3桁ごと」に「thousand」や「million」が付くだけなので「一の位~百の位と同じ+thousand」や「一の位~百の位と同じ+million」で大丈夫でしょう。

で、1つだけ「例外」があるので、これらの処理をする前に、例外処理をしておきます。

それは「数値が0だった時」です。この場合は例外的に「れい」(零のこと)に変換して終了します。英語なら「Zero.」にして終了ですね。

英語も、同じように「一の位、十の位、百の位の対応表を3つ作って、3桁ごとに処理」で出来ます。

あとは、日本語に無い「11」「12」などの特殊な表現を「例外として特別な処理」をすれば完成です。
    • good
    • 0

整数値が与えられたときにそれをどのように英語で表現すればよいか, 説明してみてください. それができれば, 素直にプログラムに落とすだけです.


でやると, 結局「対応表が必要だね」ってことになります. 漢字だと簡単だけど, 英語でやろうとするとどうしても「0~19」までは表にする必要があります. まあ, 0~99 のすべての表を作ってもいいし, 20以上は規則的なのでその規則性を使えばより小さな表ですむことになります.
あと, 英語では 3桁 (あるいは 6桁) ごとに新しい単位が出てくるので 100の位の処理と「新しい単位」の確認をすれば OK.
最初に書いたけど, 自分で説明できないとプログラムはかけません.
    • good
    • 0

う~ん残念、最後の ninty-nine が合わない(BorlandC++5.5.1)。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define HYAKU 4

char c3step[ 5 ][ 16 ] = {
 "billion ", "million ", "thousand ", "", "hundred"
};
char c0019str[ 20 ][ 16 ] = { // 00 - 19

 "", "one", "two", "three", "four",
 "five", "six", "seven", "eight", "nine",
 "ten", "eleven", "twelve", "thirteen", "fourteen",
 "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
};
char c2099str[ 10 ][ 16 ] = { // 20, 30, ,,90
 "", "",
 "twenty", "thirty", "forty", "fifty",
 "sixty", "seventy", "eighty", "ninety"
};
void main( void )
{
 char cStr[ 4 ][ 32 ] = {
  "123", "34445", "432143213", "999432143100" };
 char cWork[ 16 ] = { 0 }, cDumm;
 int i, k, m, iLen, i100, i10, i1, iOn;

 for( i = 0; i < 4; i++ ){

  iLen = strlen( cStr[ i ] ) - 1;

  for( k = 11; k >= 0; k-- ){ // cWork 後ろ詰め

   cWork[ k ] = '*'; // 0x2A

   if( iLen < 0 ) continue;

   cWork[ k ] = cStr[ i ][ iLen-- ];
  }
  printf( "%s\n", cWork );

  for( iOn = 0, m = 0; m < 4; m++ ){

   i100 = cWork[ m * 3 ] - 0x30; // 0x2A - 0x30

   if( i100 > 0 ){

    iOn++;

    printf( "%s %s ", c0019str[ i100 ], c3step[ HYAKU ] );
   }
   cDumm = cWork[ m * 3 + 3 ];

   cWork[ m * 3 + 3 ] = '\0';

   i10 = atoi( &cWork[ m * 3 + 1 ] );

   cWork[ m * 3 + 3 ] = cDumm;

   if( ! iOn && ! i10 ) continue;

   if( i10 < 20 ){

    printf( "%s %s", c0019str[ i10 ], c3step[ m ] );

    continue;
   }
   i1 = i10 % 10;

   i10 /= 10;

   printf( "%s", c2099str[ i10 ] );

   if( i1 ) printf( "-" );

   printf( "%s %s", c0019str[ i1 ], c3step[ m ] );
  }
  printf( "\n" );
 }
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A