• ベストアンサー

romanize() を使って・・・

はじめまして。今年からプログラミングをやりはじめた超初心者です。 皆様にとっては簡単なものかもしれませんが私にはどうしてもわからずこちらに投稿させていただきました。 数を入力し、ローマ字を表示するというプログラムなのですが、たとえば 483を入力してromanize(483, 1, ’a’),romanize(483, 5, ’b’),romanize(483, 10, ’c’),romanize(483, 50, ’d’),romanize(483, 100, ’e’)のようにすると eeeedcccaaa と表示するプログラムを作りたいのです。私がわからないのは入力された数字の中に1, 5, 10などの数字がいくつ含まれているか、また含まれていた場合どのようにしてletter文字 aやbなどのローマ字を表示するかです。 今まではなんとか間違っていてもなんらかを書いていろいろ試し、自力でやっていたのですがどうにも手がつけられないので質問させていただきました。 ご回答のほうよろしくお願いします。

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

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

#2です。 >romanize()は提供された関数です。 もし、そうならば、それを n = romanize(n, 100, 'e'); n = romanize(n, 50, 'd'); n = romanize(n, 10, 'c'); n = romanize(n, 5, 'b'); n = romanize(n, 1, 'a'); のように呼び出せばすむ話ですが、そうではないのでしょうか? とすると、romanize()とおなじものを自分で作りたいということでしょうか? >a,b,cとしたとき aは入力された数、bは元となる数,cはローマ字(letter文字)となっています。aを入力したときbがいくつ含まれているかを求めていき、それからその数だけcを表示する、という方法です。 この説明によれば、romanize(483,1,'a')には1が483個含まれるから'a'を483個印字すれば良いように解釈できますが、どうもそうでは、ないようです。 補足説明から、あなたの望んでいることは、以下のことであると、解釈して、回答します。 1.romanize(a,b,c)関数を自分で作成したい。 2.romanize(a,b,c)関数の仕様は以下の通り。 1)aは0以上の数値が指定される(負の数は想定しなくてよい) 2)bは1,5,10,50,100のいずれかの数値が指定される (この数値以外の数値が指定されるケースは想定しなくて良い) 3)cは任意の1文字が指定される 4)上記の条件で数値が指定されたとき、その数値内に、1,5,10,50,100がいくつ含まれるかを求める。ただし、いくつ含まれるかの数は、100,50,10,5,1の順に判定する。 5)上記4)でいくつ含まれるかが、それぞれ求められた時、bで指定された数値に該当する数がいくつ含まれるを求め、その数分、cを印字する。 以下が回答です。 基本的には aを100で割った商-->100がいくつ含まれるかの答え (aを100で割った余り)を50で割った商-->50がいくつ含まれるかの答え (aを100で割った余り)を50で割った余りを10で割った商-->10がいくつ含まれるかの答え のようにして、 100,50,10,5,1がいくつ含まれるかを求めます。 その次に、bが1,5,10,50,100のいずれかを判定し、その数 に対応した含まれる数を求め、その分印字します。 上記が素直に計算した方法です。 もっと簡単にするなら bの1つ上のランクの数値でaを割った余りをbで割った商が求める印字回数となります。(ただしb=100の場合はbで割った商) 例: b=1の時、(aを5で割った余り)/bの商が答え b=5の時、(aを10で割った余り)/bの商が答え b=10の時、(aを50で割った余り)/bの商が答え b=50の時、(aを100で割った余り)/bの商が答え b=100の時、a/bの商が答え のようになります。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

すみません、#4には、間違いがありました。 再掲 ------------------------------------------ #include <stdio.h> #include <stdlib.h> /* roman は0<= n < 4000 */ /* buff は10以上必要 */ typedef struct radix { int digit; char roman; char romanNext; } RADIX; char *roman(int num, char *buff){ static RADIX table[4]={ { 1000, 'M', '?' }, /* 5000って知らん */ { 100, 'C', 'D' }, { 10, 'X', 'L' }, { 1, 'I', 'V' } }; int tableSize = sizeof(table)/sizeof(RADIX); int i, j, n; char *p; if(num < 0 || num >=4000){ /* 4000未満の正の数 */ *buff='\0'; return NULL;/* 通常は buffを返す */ } for(i=0,p=buff;i<tableSize;i++){ n = num / table[i].digit; if( 1 <= n && n <=3 ){ for(j=0;j<n;j++) *p++=table[i].roman; } else if(n == 4){ *p++=table[i].roman; *p++=table[i].romanNext; } else if(n == 5){ *p++=table[i].romanNext; } else if(6<= n && n <=8){ *p++=table[i].romanNext; for(j=0;j< n-5;) *p++=table[i].roman; } else if(n == 9){ *p++=table[i].roman; *p++=table[i-1].roman; } num -= n * table[i].digit; } *p='\0'; return buff; } int main(int argc, char **argv){ char buff[10]; // printf("3999 as roman:%s\n",roman(3999, buff)); if(argc < 2){ printf("roman number\n"); return -1; } printf("%s is %s\n",argv[1],roman(atoi(argv[1]), buff)); return 0; } ------------------------------------------------------------- ところで、 #2の補足のような仕様だと 例えば、39は、ローマ数字でXXXIXですが、 含まれるXはと言われたら XXXX になって、 質問文のように実行すると、結果として、正しいローマ数字を表すようになりませんよ??

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

サンプルを作ってみました。 -------------------------- #include <stdio.h> #include <string.h> /* roman は0<= n < 4000 */ /* buff は10以上必要 */ typedef struct radix { int digit; char roman; char romanNext; } RADIX; char *roman(int num, char *buff){ static RADIX table[4]={ { 1000, 'M', '?' }, /* 5000って知らん */ { 100, 'C', 'D' }, { 10, 'X', 'L' }, { 1, 'I', 'V' } }; int tableSize = sizeof(table)/sizeof(RADIX); int i, j, n; char *p; if(num < 0 || num >=4000){ /* 4000未満の正の数 */ *buff='\0'; return NULL;/* 通常は buffを返す */ } for(i=0,p=buff;i<tableSize;i++){ n = num / table[i].digit; if( 1 <= n && n <=3 ){ for(j=0;j<n;j++) *p++=table[i].roman; } else if(n == 4){ *p++=table[i].roman; *p++=table[i].romanNext; } else if(n == 5){ *p++=table[i].romanNext; } else if(n <= 6 && n <=8){ *p++=table[i].romanNext; for(j=0;j< n-5;) *p++=table[i].roman; } else if(n == 9){ *p++=table[i].roman; *p++=table[i-1].roman; } num -= n * table[i].digit; } return buff; } int main(void){ char buff[10]; printf("3999 as roman:%s\n",roman(3999, buff)); return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

よくある金種計算のように大きい桁から解決していくようなことになると思います。 仕様として、関数にローマ数字の表記を渡さなければならない理由がよく分かりません。 アラビア数字とローマ数字の対応表は、関数の中で持っていればいいことの様に思います。

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

すいません。基本的なことなのですが、 romanize()という関数は、すでに提供されている関数なのですか。それとも、いま、あなたが作ろうとしている関数なのでしょうか。 また、romanize(a,b,c)としたときの、各引数a,b,cの意味について説明していただけませんでしょうか。 また、引数a,b,cが与えられたとき、romanizeはどのように動作すべきものなのでしょうか。要は、romanize()の仕様はどのようになっておりますでしょうか?

maya20
質問者

補足

ご回答ありがとうございます。romanize()は提供された関数です。 a,b,cとしたとき aは入力された数、bは元となる数,cはローマ字(letter文字)となっています(すみません。説明が下手で・・)aを入力したときbがいくつ含まれているかを求めていき、それからその数だけcを表示する、という方法です。 先ほどの補足でmain()内の int number;と書きましたが int n;、input_number → input_n が正しいです。間違えました。。

  • bulgaris
  • ベストアンサー率50% (8/16)
回答No.1

あなたの質問から表示の法則性を推測しましたが、 私の推測した法則に基づいた回答は、あなたの質問とは合致しなくなります。 そこで逆に質問です。 1) romanizeが呼ばれる順序は逆ではないですか? 2) 483の部分は何かの変数ではないですか? 3) 本当に全てのromanizeに483の値が渡されていますか? また公開できるならば、ソースコードを一部抜粋して提示すると、回答しやすくなるかも知れません。

maya20
質問者

補足

すみません。かなりあいまいに質問を提示してしまったみたいですね・・・。 コードの一部としましては int romanize(int a, int b, char letter) { aの中にbがいくつ含まれるかにより  letterをその個数だけ表示 } main() { int number; n = input_number(); n = romanize(n, 100, 'e'); n = romanize(n, 50, 'd'); n = romanize(n, 10, 'c'); n = romanize(n, 5, 'b'); n = romanize(n, 1, 'a'); putchar('\n'); } というものです。(日本語で書いてある部分はわかりません)483という数字の部分はプログラムを実行したときに自分で入力する数字のことを表しています。

関連するQ&A

  • エクセル2007関数

         A   B    C     D E 1   15  20  300 2   21  22  400 3   34  31  452 D1に、A列の数字のいずれかを入力すると、 E1に、A列のいずれかの数字を入力した行のC列の数字を表示させたい。 たとえば、 D1に、21と入れると、E1に400と D1に、34と入れると、E1に452と 表示させたいのですが、 関数は、ありますでしょうか?

  • エクセル2007使用です。条件書式を使用して、あるセルの数が一定量を越えたら、指定するセルの数字を表示する

    エクセル2007を使用しています。 A1に100 B1に200 と入力しておいて、C1からC30の合計数字をD1に表示するようにします。 このD1の数字が20を 越えなければ、E1にA1の入力値を表示して、 越えたら、E1にB1の入力値を表示させたいのですが、 マクロを使用せずにやるにはどうすればよいのでしょうか? 集計表を作っているのですが、うまくいかず悩んでおります。

  • プログラム作りです。

    数学プログラムの授業をしています。:プログラム言語は「Basic」です。 次の問題を後から自分で考えますので、見本を示してくださいっT_T。 (1)文字列A~Jまでを入力して A,C,E,G,Iと一つ飛びに表示するプログラム (2) 自分の姓と名前をローマ字読みで入れ、表示は、1を入力したら、ローマ字で名前、姓の順に表示、2させるプログラム。  文字変数の扱い方がよくわかりません。その点も教えてください。

  • データの統計

    以下のような表のとき、D1に>75と入力しE1に>450と入力したとき、B列の数字が入力されているセルの行が、上記の条件が満たされるB列のセルの数をB1に出したいのですが、何か良い方法がありましたらご教授お願いします。 B1に1と表示されれば正しいです。 A   B   C    D    E             >75   >450 881  884       75    359 686           80    486 1052  1054      75    994 179  179       50    930 データ量は5000行を超え、なお増加中です。

  • スペースで区切って数字を入力

    スペースで区切られた5個の数字を端末から入力し、表示するプログラムが書けずに困っています。 #include<stdio.h> int main(){ char str[5]=={%lf %lf %lf %lf %lf,&a,&b,&c,&d,&e} などと書いていってもよさそうなのですが、数を5→10などと増やしていくと初期化子の数が多すぎでコンパイルで通りません。 配列を用いたよい方法はないでしょうか?

  • いくつかのファイルの一致を確認するプログラミングの作り方。

    いくつかのファイルの一致を確認するプログラミングの作り方。 例えば7個のtxtファイル a, b, c, d, e, f, g があるとします。 a, b, c, d, e, f, g はそれぞれのファイルのファイル名です。 そのうち、 a, b, g のファイルの内容が全く同じであった場合、 a, b, g は一致していると判断するには、どんなプログラムを作成すればよいのでしょう? ちなみにファイルの中身は 数字が配列のように並んでおり、文字数は5000文字程度です。

  • エクセル2003 表示の方法

    どうぞ宜しくお願いします 入力内容は、 1Eに2桁までの数字(0.1~99.9)、 1Fに4桁までの数字(1~9999)、 1Gに4桁までの数字(1~9999)、を入力します 1Hには、A~Dの英文字 ◆例を書きますので宜しくお願い思案す 1Eに、9と入力   1Fに、456と入力   1Gに、789と入力 1Hに、Aと入力しますと  1Bには、09と 1Cには、0456と 1Dには、0789と表示され 1Aには、0904560789Aと表示され 1Hには、09-0456-0789-Aと表示されるようにしたいのです pcあまり詳しくありません どうぞ宜しくお願いします

  • Linuxでのシェルプルグラミングでファイル内の数字の読み込み

    Linuxでのシェルプログラミングについての質問です。 (#!/bin/shを使ってます。) 改行、空白、数字をランダムに含むファイルを複数読み込んで、それぞれのファイルから数字だけ一個ずつ抜き出すにはどうすればいいでしょうか? 最初に二個の数字(A,Bとする)読み込んで、その二つの最大公約数(C)を計算した後、さらに次の数字(D)を読み込んで次は先ほどの公約数(C)と新しく読み込んだ数字(D)の最大公約数(E)を計算して・・・を繰り返していくプログラムを作ろうとしています。 最大公約数を計算するwhile loopはできています。数字はファイルから読み込まれるため、一個ずつ空白、改行を無視しながら読み込んでいかなければいけないと思うのですが、どのようにやっていけばいいのかわかりません。

  • Visual C++ 2005 のプログラムについて

    今回課題としてC++のプログラムを作れというものを突然出されて、C++をほとんど知らないので戸惑っています。 ○数字の、1を入力するとE、2ならD、3ならC、4ならB、5ならA、を表示するプログラムをswitch文を使ってつくりなさい。 ○九九の表を表示するプログラムを作りなさい。配列を使用して作りなさい。 というものです。Visual C++ 2005を使っています。いろんなサイトを見て自分なりにやってみましたが、どうしてもうまくいきません。どういったプログラムになるのか教えてください。よろしくお願いします。

  • IF関数の星取表で・・・

    セルA1からE1に1から5の数字があって5の列に検索する数字を入力したときにセルA2に○がつくようにはできたのですが、その時に検索値の4番目に入力した数字だけは違う記号を表示させたいのですが、どのようにすればいいのでしょうか・・・   A B C D E 1 1 2 3 4 5  2 ○ ○  ○ △ 3 4 5 1 2 4 5   ←(ここに検索値を入力する)

専門家に質問してみよう