No.1
- 回答日時:
どういう変換ルールに基づき変換するのですか?
単に変換といっても、数値と英単語は何も関係ないので、何らかの基準が必要になると思うのですが…
この回答への補足
入力された数値をそのまま英語に直すだけです。
出力例
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.
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.5
- 回答日時:
#1
>どういう変換ルールに基づき変換するのですか?
>単に変換といっても、数値と英単語は何も関係ないので、何らかの基準が必要になると思うのですが…
#1の回答
>>入力された数値をそのまま英語に直すだけです。
実は、この「そのまま英語に直すだけ」の作業が、コンピュータにとっては、もっとも苦手な作業ですね。
人間にとっては、何でもない作業でも、コンピュータにとっては難しい作業なので、具体的に細かく指示を与えないと、動作してくれません。
原理的には、0~999,999,999 までの数字を人間が英語に全て直したものを、どこかに記憶しておき、それを取り出すのが、最も基本的な方法になります。
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」などの特殊な表現を「例外として特別な処理」をすれば完成です。
No.7
- 回答日時:
整数値が与えられたときにそれをどのように英語で表現すればよいか, 説明してみてください. それができれば, 素直にプログラムに落とすだけです.
でやると, 結局「対応表が必要だね」ってことになります. 漢字だと簡単だけど, 英語でやろうとするとどうしても「0~19」までは表にする必要があります. まあ, 0~99 のすべての表を作ってもいいし, 20以上は規則的なのでその規則性を使えばより小さな表ですむことになります.
あと, 英語では 3桁 (あるいは 6桁) ごとに新しい単位が出てくるので 100の位の処理と「新しい単位」の確認をすれば OK.
最初に書いたけど, 自分で説明できないとプログラムはかけません.
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" );
}
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- 英語 数字の単位について教えてください 6 2022/11/10 08:25
- マウス・キーボード 教えて! AppleのMagic Keyboard(JIS)をWindows 10で使用次第のですが 2 2022/06/01 18:07
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- 英語 英語を聞いて理解するとき、逐語訳せず、英語のままで理解するようにしたほうがスムーズに聞き取れると言わ 3 2022/03/23 18:53
- その他(プログラミング・Web制作) 変換のプログラムを教えてください。 6 2023/07/01 09:57
- C言語・C++・C# 整数1〜99を入力させ、それを英語で表示するプログラムを作成したいんですが、そのプログラミングを教え 4 2023/04/28 14:12
- モテる・モテたい 英国数物化オールマイティーの男性か、数学特化型の男性か、どちらの方が女性にモテやすいですか? 1 2022/06/04 17:56
- その他(学校・勉強) 英単語の勉強をして思考力が上がることってあるんですか? 2 2022/08/18 17:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetDlgItemInt( ) c++
-
緯度、経度の 10進法と 60進法...
-
VBAを使って二進法計算
-
分を時間に変換するプログラム
-
isoをimgに変換したいのですが...
-
【EXCEL】カナ、ひらがなを英字...
-
C/C++→JAVAに変換するツール
-
CIDコードからUNICODEへの変換...
-
線対称の角度を求める
-
StrConvの使い方について教えて...
-
C言語からC#への変換ツール
-
なぜ通信には16進数文字列が使...
-
家電製品の電力周波数を変える機械
-
VBへの変換の仕方 RS232C送信...
-
SJIS⇔UTF-8の文字コード...
-
C++からCへのソース変換について
-
機械語からアセンブリ言語への...
-
Excel-VBAのmsgBox()の不思議
-
VB6からVB2010への変換について
-
マンセル⇔XYZ,RGB変換式或いは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
Excel-VBAのmsgBox()の不思議
-
Mac 乗数の入力方法
-
家電製品の電力周波数を変える機械
-
3のつく数字と3の倍数のみを表...
-
bmp→jpgに、jpg→bmpに
-
10進数をBCDに変換する方法
-
【EXCEL】カナ、ひらがなを英字...
-
StrConvの使い方について教えて...
-
分を時間に変換するプログラム
-
画像ファイル変換(Tiff→PDF)
-
マンセル⇔XYZ,RGB変換式或いは...
-
C/C++→JAVAに変換するツール
-
VB6からVB2010への変換について
-
c++でmatからvectorへの変換の...
-
DOSコマンドでの文字コード変換...
-
VB.NETをJavaに変換するツール...
-
SJIS⇔UTF-8の文字コード...
-
なぜ通信には16進数文字列が使...
-
C#でのpngからbmpへの変換について
おすすめ情報