
はじめまして。今年からプログラミングをやりはじめた超初心者です。
皆様にとっては簡単なものかもしれませんが私にはどうしてもわからずこちらに投稿させていただきました。
数を入力し、ローマ字を表示するというプログラムなのですが、たとえば
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などのローマ字を表示するかです。
今まではなんとか間違っていてもなんらかを書いていろいろ試し、自力でやっていたのですがどうにも手がつけられないので質問させていただきました。
ご回答のほうよろしくお願いします。

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の商が答え
のようになります。
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
になって、
質問文のように実行すると、結果として、正しいローマ数字を表すようになりませんよ??
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;
}
No.3
- 回答日時:
よくある金種計算のように大きい桁から解決していくようなことになると思います。
仕様として、関数にローマ数字の表記を渡さなければならない理由がよく分かりません。
アラビア数字とローマ数字の対応表は、関数の中で持っていればいいことの様に思います。

No.2
- 回答日時:
すいません。
基本的なことなのですが、romanize()という関数は、すでに提供されている関数なのですか。それとも、いま、あなたが作ろうとしている関数なのでしょうか。
また、romanize(a,b,c)としたときの、各引数a,b,cの意味について説明していただけませんでしょうか。
また、引数a,b,cが与えられたとき、romanizeはどのように動作すべきものなのでしょうか。要は、romanize()の仕様はどのようになっておりますでしょうか?
この回答への補足
ご回答ありがとうございます。romanize()は提供された関数です。
a,b,cとしたとき aは入力された数、bは元となる数,cはローマ字(letter文字)となっています(すみません。説明が下手で・・)aを入力したときbがいくつ含まれているかを求めていき、それからその数だけcを表示する、という方法です。
先ほどの補足でmain()内の int number;と書きましたが int n;、input_number → input_n が正しいです。間違えました。。
No.1
- 回答日時:
あなたの質問から表示の法則性を推測しましたが、
私の推測した法則に基づいた回答は、あなたの質問とは合致しなくなります。
そこで逆に質問です。
1) romanizeが呼ばれる順序は逆ではないですか?
2) 483の部分は何かの変数ではないですか?
3) 本当に全てのromanizeに483の値が渡されていますか?
また公開できるならば、ソースコードを一部抜粋して提示すると、回答しやすくなるかも知れません。
この回答への補足
すみません。かなりあいまいに質問を提示してしまったみたいですね・・・。
コードの一部としましては
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
配列をnビットシフトする
-
アルファベットの出現頻度求め...
-
文字列から空白を取り除きたい...
-
【C言語】構造体内の領域解放(...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
英単語をアルファベット順に
-
char型からのバイト数取得
-
char* を渡したとき、不適切なP...
-
文字を16進変換
-
ftoa の作り方
-
間接参照のレベルが異なっています
-
構造体の各メンバにfor文からア...
-
switch文で文字を比較すること...
-
再帰プログラム
-
ローマ字変換アルゴリズムを教...
-
C言語のポインターで詰まっている
-
char型と言うものがまだ理解出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
型変換
おすすめ情報