🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

1回答

2672閲覧

コマンド-分数の小数表示

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2019/11/17 03:46

編集2020/02/04 05:22

■やりたい事
コマンド行引数として与えられる2つの正整数 m, n ( 1 < n < 10000000 ) を読み取り、m/n の小数表示を標準出力に書き出すプログラムを作る。
与えられる m, n は、m が n では割り切れないものとする。出力は左詰に m を書き出し、 / に続いて n を書き出す。 続けて、空白を前後に置いて = を書き出し、整数部に続けて . を書き出し、以後小数部を書き出して最後に改行を行え。 小数部は、循環小数になる場合は非循環部を書き出した後、' を書き出し1度だけ循環部を書き出すこと。 有限小数になる場合はその小数部を書き出すこと。
実行例
コマンドライン入力
71 8
標準入力
標準出力
71/8 = 8.875
コマンドライン入力
13 7
標準入力
標準出力
13/7 = 1.'857142
コマンドライン入力
10 6
標準入力
標準出力
10/6 = 1.'6
■自分なりに作成してみましたが思うような出力となりません。
修正箇所等教えて頂きたく。

C

1#include <stdio.h> 2int main(int argc, char *argv[]){ 3 int n; 4 5 scanf("%d", &n); 6 int rr[n], qq[n]; 7 int r, q, i, j, k; 8 r= 1; k= 0; 9 for(i= 1; r!=0 && k==0; i++){ 10 rr[i]= r; 11 r*= 10; 12 q= r/n; qq[i]= q; 13 r= r%n; 14 for(k= i; k!=0 && rr[k]!=r; k--); 15 } 16 printf("0."); 17 for(j= 1; j!=i; j++){ 18 if( r!=0 && j==k ) printf("'"); 19 printf("%d", qq[j]); 20 } 21 printf("\n"); 22 return 0; 23}

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

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

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

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

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

y_waiwai

2019/11/17 03:53 編集

どういう出力結果になるのを目指してるのか、また、それがどういう出力結果となるんでしょう。 質問を編集し、追記してください
退会済みユーザー

退会済みユーザー

2019/11/17 08:59

https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 を読んで出直してきてください。
guest

回答1

0

修正箇所等教えて頂きたく。

コマンド行引数として与えられる2つの正整数 m, n ( 1 < n < 9500 ) を
とあるのに、n を標準入力から読み込もうとしています。
コマンド行引数から読み込むように修正してください。

m を全く読み込んでいません。
コマンド行引数から読み込むように修正してください。

m と n が 71 と 8 のとき、出力は 8.87 なのに
printf("0."); と書いています。修正してください。

コード全体を修正すると、

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // atoi 3 4#define NUM 9500 5 6int main(int argc, char *argv[]) 7{ 8 int i, j, m, n, m0, q[NUM], p[NUM] = { 1 }; 9 if (argc != 3) return 1; 10 m = atoi(argv[1]); 11 n = atoi(argv[2]); 12 if (m < 1 || n <= 1 || n >= NUM) return 2; 13 m0 = m; 14 for (i = 0; i < NUM; i++) { 15 q[i] = m / n; 16 m %= n; 17 if (p[m]) break; 18 p[m] = i + 1; 19 m *= 10; 20 } 21 printf("%d/%d = %d", m0, n, q[0]); 22 if (m || i > 0) putchar('.'); 23 for (j = 1; j <= i; j++) { 24 if (m && j == p[m]) putchar('\''); 25 printf("%d", q[j]); 26 } 27 printf("\n"); 28 return 0; 29}

どの部分が分からないのかを質問してください。

投稿2019/11/23 12:33

kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2019/11/23 13:13

ご回答有難うございます! 狙っていた出力結果となったのですが桁数が増えると「実行時エラーが発生しました」 となりエラーとなってしまいます...。 例 コマンドライン 16384 24576 正解出力結果 16384/24576 = 0.'6↵ 教えて頂いたプログラムでの出力結果 「実行時エラーが発生しました」となり何も表示しない 図々しいですが再度教えて頂く。。。
kazuma-s

2019/11/23 13:19

2つの正整数 m, n ( 1 < n < 9500 ) を読み取りという条件をなぜ無視するんですか? 以前にも同じコメントをもらったはずですが、懲りないようですね。 そんなことより、私の回答のコードのどこが疑問かを教えてください。
kazuma-s

2019/11/23 13:35

ちょっと待ってください。私のコードでは n が 9500以上の時は終了するようになっています。「実行時エラーが発生しました」と出ることはありません。本当にこのプログラムを実行していますか?
退会済みユーザー

退会済みユーザー

2019/11/23 14:41

ご回答有難うございます。 勿論( 1 < n < 9500 )の間であれば問題無く実行できました。 ただ興味本位でコマンドラインの桁を増やして実行した所エラーとなりました ■やったこと #define NUM 9500から10000000へ変更 コマンドライン 8203125 9765625 結果 8203125/9765625 = 084 欲しい結果 8203125/9765625 = 0.84
kazuma-s

2019/11/23 15:41

なぜ、その変更を伏せて、いいがかりをつけるんですか? やはり私のコードではなく、あなたが改変したコードだったわけです。 それを隠して「実行時エラーが発生しました」と言われても、回答のしようがありません。 本当は質問するときには、OS は何か、コンパイラは何か、どのようにしてコンパイルしたかなどの情報も付けないと、正しい回答をすることができない場合もあります。 さて、NUM の値をそんなに大きくすると、int q[NUM], p[NUM] は 80Mバイト必要になります。 q も p も main のローカル変数であり、自動変数でもあるので、スタック上に領域を確保します。 ところがスタックというのは通常そんなに多くのメモリを割り当てないことになっているので、実行エラーになることがあります。 q と p をグローバル変数にして静的変数にするか、あるいは、 static int q[NUM], p[NUM]; として、ローカル変数でありながら静的変数にすることで、 スタック以外のメモリに割り付けられるようにしてみてください。 どうなりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問