質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1939閲覧

アラビア数字,ローマ数字にそれぞれ相互に変換できる関数を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/10/21 07:58

編集2018/10/21 08:49

#前提知識
授業での課題なのですが,前提知識が関数,論理演算子,for文, if文,再帰関数くらいで,ほとんで手がつけられないです.
この授業では現在ポインタを扱っているのですが,ネットで調べると辞書型のものばかりヒットしてあまり参考になりません...
#試したこと(ローマ数字→アラビア数字)
文字列を

int roman2num(char *s){ int length = strlen(s); // counting digits int one, five, ten, fifty, hundred, f_hundred, thousand; for(int i = 0; i < length; i++){ if(s[i] == 'I') one++; if(s[i] == 'V') five++; if(s[i] == 'X') ten++; if(s[i] == 'L') fifty++; if(s[i] == 'C') hundred++; if(s[i] == 'D') f_hundred++; if(s[i] == 'M') thousand++; } int sum = 0; return sum; }

このように一つ一つ数字に変換しようとしたのですが,XIとIXなどをどうカウントするかで困っています.
なにかヒントだけでもいいので教えてくれると助かります.

#追記
以下のようにアラビア数字→ローマ数字の関数を作ったのですが,うまく動きません...何がおかしいのか教えていただくと助かります(エラーは吐いていないですが,出力が文字化けしている).
ローマ数字からアラビア数字にするのも現状あまりうまく行っていません.

#include <stdio.h> #include <stdlib.h> #include <string.h> char num2roman(int); int main(){ // Examples printf("XIV = %c\n", num2roman(14)); // "XIV" printf("CDXCV = %c\n", num2roman(495)); // "XIV" printf("MCMXLV = %c\n", num2roman(1945)); // "XIV" printf("MMMCMXCIX = %c\n", num2roman(3999)); // "XIV" return 0; } char num2roman(int n){ int one, ten, hundred,thousand; one = n % 10; ten = n / 10; hundred = n / 100; thousand = n / 1000; char th_S[20], h_S[20], t_S[20], o_S[20], Roman_number[100]; int i; // 1,000の位 if(thousand >= 1){ for(i = 0; i < thousand; i++){ th_S[i] = 'M'; } } // 100の位 if(hundred < 4){ for(i = 0; i < hundred; i++){ h_S[i] = 'C'; } } else if (hundred == 4){ h_S[0] = 'C'; h_S[1] = 'D'; } else if(hundred >=5 && hundred < 9){ h_S[0] = 'D'; for(i = 1; i < hundred - 5; i++){ h_S[i] = 'C'; } } else if(hundred == 9){ h_S[0] = 'C'; h_S[1] = 'M'; } // 10の位 if(ten < 4){ for(i = 0; i < ten; i++){ t_S[i] = 'X'; } } else if (ten == 4){ t_S[0] = 'X'; t_S[1] = 'L'; } else if(ten >=5 && ten < 9){ t_S[0] = 'L'; for(i = 1; i < ten - 5; i++){ t_S[i] = 'X'; } } else if(ten == 9){ t_S[0] = 'X'; t_S[1] = 'C'; } // 1の位 if(one < 4){ for(i = 0; i < one; i++){ o_S[i] = 'I'; } } else if (one == 4){ o_S[0] = 'I'; o_S[1] = 'V'; } else if(one >=5 && one < 9){ o_S[0] = 'V'; for(i = 1; i < one - 5; i++){ o_S[i] = 'I'; } } else if(one == 9){ o_S[0] = 'I'; o_S[1] = 'X'; } sprintf(Roman_number,"%s%s%s%s", th_S, h_S, t_S, o_S); return *Roman_number; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

C++プログラミング:アラビア数字をローマ数字に変換する

考え方や流れの参考になれば。
C++で書かれてますが、Cに読み替えればとても分かりやすいですよ。

配列を用意して

C++

1#include <iostream> 2 3using namespace std; 4 5string introm(int a) { 6 int intnum[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; 7 const char *romnum[] = {"M", "CM", "D", "CD", "C", "XC", "L", 8 "XL", "X", "IX", "V", "IV", "I"}; 9 10

whileの2重ループで回すだけ

C++

1 string s; 2 int i = 0; 3 while (a) { 4 while (a / intnum[i]) { 5 s += romnum[i]; 6 a -= intnum[i]; 7 } 8 i++; 9 } 10 return s; 11}

投稿2018/10/21 09:19

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/21 11:56

非常にわかりやすいです! 確かにC++とPythonでも書けるのでそっちでも探したほうが良かったかもしれません.
guest

0

ググって参考になりそうなコードを探してみては?

投稿2018/10/21 10:54

編集2018/10/21 10:56
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/21 11:55

あまり参考になるものがなく...(実力不足なんでしょうが)
guest

0

試してません。 ヒントという事なので、思いつき。

  • IV
  1. one++;
  2. if (one > 0) one = 5 - one;
    else five++;

IV は、最初に 小さい数字(I)が来て、次に大きい数字(V)がきます。
VI は、最初に 大きい数字(V)が来て、次に小さい数字(I)が来ます。

例外処理とか考えると大変ですが、シンプルなところで。

投稿2018/10/21 08:20

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/21 08:57

多分最大限わかりやすくしてくださってると思うのですが,脳みそが追いついていっていないです...
guest

0

「C言語 アラビア数字」でぐぐるといろいろでてきますね

投稿2018/10/21 08:16

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問