• ベストアンサー

数値英単語変換プログラム

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

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.8

う~ん残念、最後の 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" );  } } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

その他の回答 (7)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

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

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.6

「すべての組み合わせ」を洗い出して対応表を作り、対応表から英単語を取り出す、と言う方法を使うしかありません。 対応表は「共通の部分は、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」などの特殊な表現を「例外として特別な処理」をすれば完成です。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

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

回答No.4

あくまで一つの提案ですが… 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" を結合して出力したら良いのでは?

回答No.3

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

回答No.2

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

回答No.1

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

bluesky445
質問者

補足

入力された数値をそのまま英語に直すだけです。 出力例 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.

関連するQ&A

  • 数値英単語変換

    C言語で、入力された数値を英単語に変換するプログラムを作りますが、0~999,999,999 までの整数値について,正しく英単語に変換できるところとします。プログラミングが本当に苦手で、いったいどこから始めばいいのか、さっぱりわかりません。どうか教えてください。 できれば、詳しく説明して頂ければ、助かります。

  • 英単語をカタカナに変換するスクリプト

    英単語数文字をカタカナに変換したいです。 例えば、pen and ink でしたら ペン アンド インク のように変換するものです。 プログラムから参照できるスクリプトはありましたでしょうか? 検索したところ、ルビックスというウェブサイトがありました。 http通信を使わず、プログラムから利用したいので難しそうです。

  • フーリエ変換のプログラム

     プログラム言語の種類は問いません。 入力数値データを読み込み(ファイルからでも直接入力によるものでもかまいません)、 フーリエ変換を行うプログラムの基本的な考え方を教えてください(プログラムそのものは求めません。考え方を教えてください)。  しばらくの間フーリエ変換について勉強してはいるものの、まだよく理解していない状況ですし、プログラムに関してもまだまだ未熟者です。 しかし、どちらも勉強しながらこのプログラムを作ってみようと思っています。  けれども、フーリエ変換の指数関数を用いた式だと虚数を扱わなければならないし、 sin, cosを使った式だと計算量が膨大になってしまいそうで(指数関数を用いた式でもそんなに変わらないとは思いますが)、 どこから手をつければよいかまったく見当がつきません。 考え方を教えていただければ結構ですので、よろしくお願いします。

  • 英単語をアルファベット順に

    英単語をいくつか入力し、それをアルファベット順に並べ替えるプログラムが作りたいのですが。アルファベットをaから順に小さくなっていくようにし、英単語の頭文字を取り出し大きい順に並べ替えるというふうな感じにしたいのですが、なかなかうまくいきません。誰か教えていただけませんか?

  • VBとExcelを使って英単語テストプログラムを作るには?

    英単語とその和訳をエクセルシートとして登録し、そこから和訳をランダムに出題して英単語を入力させる。正解なら正解、間違いなら間違いを表示して、新しい問題をランダムに出題させる・・・こんな単純?なプログラムを作成したいです。具体的なソースか、又は参考になるホームページを教えて下さい。よろしくお願いします。

  • 単語登録した単語で変換できないものがあります。

    IME2003を使っています。 一括登録した単語辞書が現在入っているのですが、 変換できない単語がいくつかあります。 よくホームページなどで紹介されている方法で、 IMEの修復や1度出力して修復後に入れ直しをしたりなど試してみたのですが、改善されません。 そこで怪しいなと思ったことがあります。 変換したときに例えば「問う」という単語を変換すると、 候補がずらっと出てきますよね。 そこにある英語の候補なのですが、 「toe」と出てるのです。 「tou」と入力してるのにですよ? 他にも「人(jin)(zin)」と変換すると英単語候補が 「gin」になっているのです。 これが原因となっているのでしょうか? 治し方とかわかる方おられましたら、教えてください! お願いします(><)

  • C言語でアナグラムを求めるプログラム

    C言語初心者で、勉強中です。 今アナグラムを求めるプログラムをC言語で作成しています。 内容はあらかじめある英単語が書いてあるテキストファイルから互いにアナグラムとなっている英単語をすべて求めてそれを出力するというプログラムです。 どこから手をつけていいかわからず悩んでいます。 そこでヒントをいただこうと思って質問しました。 どなたか回答よろしくお願いします。

  • Cプログラム

    c言語で「正整数Nを入力後、N個の実数を入力し、それらの平均値と最大値を表示するプログラム」を教えてください。

  • PIC 文字 を 数値に 変換

    アセンブラ言語(PIC)で、シリアルで受信した文字列数値を数値に変換したいのですが、どなたかプログラムを教えてくださいませんか?

  • 数値を文字列に変換する処理

    基本情報の午後試験の擬似言語の問題でわからないところが あります。 この処理は、数値の整数部分を文字列に変換しスタックに積む プログラムです。 (たとえば、12.345だったら整数部分の12の一の位から順に スタックに積んでいきます。) Int()は小数部分を切り捨てる処理です。 文字型:Chr[]={"0","1","2","3","4","5","6","7","8","9"},T 整数型:Fint,idx; Fint=Int(F); while(Fint>0) { Idx=Fint - (Fint/10)*10; Push(chr[idx]); Fint=Fint/10; } 質問としては、なぜ上記のような処理で下位桁から順にスタックに 積んでいけるのかわかりません。 たとえば、Fint=Int(F)でFintに12が格納されて、 Idx=Fint - (Fint/10)*10の式でIdxには0が格納されて本来格納 されるべき'2'が格納されないと思うからです。 Idx=12-(12/10)*10→0というようにです。 表記は、擬似言語とC言語がごっちゃになっており大変わかりにくい かとは思いますが、何卒よろしくお願いします。