はじめまして。今年からプログラミングをやりはじめた超初心者です。
皆様にとっては簡単なものかもしれませんが私にはどうしてもわからずこちらに投稿させていただきました。
数を入力し、ローマ字を表示するというプログラムなのですが、たとえば
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- その他(パソコン・周辺機器) WINDOWS11 IMEの日本語入力で困っています 4 2023/04/29 19:24
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) 条件に合った数値の合計を表示させたい関数と条件指定の方法 3 2023/05/13 16:07
- Excel(エクセル) Excel2019のデータ入力に便利な関数について 4 2023/07/06 05:42
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
型変換
-
C言語 共用体について コマンド...
-
javaでunsignedは使えないので...
-
コマンドラインに入力されてい...
-
c++ 文字列を入力して、一文字...
-
【C言語】テキストファイル内の...
-
C言語について。
-
switch文で文字を比較すること...
-
romanize() を使って・・・
-
ワイルドカードを用いた文字列検索
-
sprintf関数の作り方
-
ncursesで...
-
str系関数を使わずに二つの文字...
-
wParam
-
C言語 ミリ秒を日付に変換には
-
C言語のfor文です。 繰り返しの...
-
char型からのバイト数取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
絶対パスからのファイル名の切...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
おすすめ情報