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

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

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

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

解決済

有理数の掛け算の約分無しまでは実行できるが、約分まで考慮するとsegmentation faultになってしまう。

aoba-purines
aoba-purines

総合スコア8

C

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

3回答

0評価

0クリップ

371閲覧

投稿2022/04/10 14:44

構造体を用いて有理数型の掛け算をする関数mula、最大公約数を求める関数gcdを用いて、有理数型掛け算の結果を約分して返すプログラムを作成したのですが、実行するとsegmentation faultになってしまいます。

html

#include<stdio.h> #include<stdlib.h> typedef struct { int n, d; } rational; int gcd ( int a, int b ) {if(a == b){ return a;} else if(a > b){ return gcd(a-b,a);} else { return gcd(a,b-a);} } rational setr(int n, int d) { rational z; if (d == 0) { fprintf(stderr, "Denominator must be nonzero.\n"); exit(1); } z.n = n; z.d = d; return z; } void printr(rational z) { printf("%d/%d\n", z.n, z.d); } rational mulr(rational x, rational y) { int n = x.n * y.n; int d = x.d * y.d; int k = gcd(n,d); rational z = setr(n/k, d/k); return z; } void check4(int argc, char *argv[]) { rational x, y; { int a = atoi(argv[1]); int b = atoi(argv[2]); int c = atoi(argv[3]); int d = atoi(argv[4]); x = setr(a, b); y = setr(c, d); } { // mulr rational z = mulr(x, y); printr(z); } } int main(int argc, char *argv[]) { check4(argc, argv); return 0; }

約分を考えない際には上手くいったので

int k = gcd(n,d); rational z = setr(n/k, d/k);

の箇所が間違っていると思います。しかしどう全体を訂正すれば良いのかわかりません。
よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jimbe

2022/04/10 14:55

どのような値を入れたらその現象が発生するのでしょうか。 また、どこまで実行出来ていてその時の変数の値はどうなっているのかをお調べになったでしょうか。
aoba-purines

2022/04/10 15:07

どの値でも駄目でした。 最大公約数kで分母分子を割るという考えは間違っていないと思います。 kで割らない場合はどの値でも成功しました。
jimbe

2022/04/10 17:31 編集

> どの値でも駄目でした。 4 つの int 型を基に動作するプログラムの場合、int が 32bit として数の組み合わせは約 43 憶の 4 乗個存在します。 その全てで駄目だったのでしょうか。 プログラムの動作に対しましては推測で範囲を限定(もしくは拡張)しないほうが良いと思います。 例えば全部 0 を指定しても発生するのでしょうか。 発生するとすれば、setr 関数の if 文内で exit するまでの間に問題があることになります。 全部 1 では? 全部 -1 では? 正数・ゼロ・負数の組み合わせや約分が発生する場合・しない場合等でいくつかのテストパターンを作り、それぞれでどう動作するはずか、そして実際にはどう動作しているかを一つ一つ確認することで、バグを探し出せます。
aoba-purines

2022/04/11 01:32

有難うございます。 やってみます。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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