ページ 11

お願いします

Posted: 2015年7月28日(火) 23:03
by sim
引数としての分数の積を求める関数。商を求める関数。
[code]
#include<stdio.h>
typedef struct fraction
{
int num; /*分子*/
int den; /*分[/album]母*/
}fraction;

struct fraction multiply(struct fraction val1,struct fraction val2);
struct fraction divide(struct fraction val1,struct fraction val2);

int main(void)
{
fraction fraction;
int num,den;

printf("分子を入力してください。\n");
scanf("%d",&num);

printf("分母を入力してください。\n");
scanf("%d",&den);

fraction=kakunou(num,den);

multiply(num,den);

return 0;
}
struct fraction multiply(struct fraction val1,struct fraction val2);
{

}
struct fraction divide(struct fraction val1, struct fraction val2);
{
}
[/code]


/*struct fraction multiply(struct fraction val1,struct fraction val2);
struct fraction divide(struct fraction val1, struct fraction val2);*/
のところがわかりません。[quote][/quote]

Re: お願いします

Posted: 2015年7月28日(火) 23:19
by みけCAT
まず、28行目と32行目のセミコロンを削除してください。
次に、とりあえずオーバーフローを気にしなければ、普通に分数の掛け算とわり算を実装すればいいでしょう。

コード:

struct fraction multiply(struct fraction val1,struct fraction val2)
{
	struct fraction ret;
	/* ここでretの各メンバに値を代入する */
	return ret;
}
/* divideも同様 */
分数の掛け算:結果分子=引数1分子×引数2分子、結果分母=引数1分母×引数2分母
分数の割り算:結果分子=引数1分子×引数2分母、結果分母=引数1分母×引数2分子
約分は最大公約数を求めてそれで割るのが一般的ですが、「ユークリッドの互除法」が使えます。
[search=google]ユークリッドの互除法[/search]

Re: お願いします

Posted: 2015年7月28日(火) 23:37
by sim
valはどう使うべきですか?

Re: お願いします

Posted: 2015年7月28日(火) 23:38
by みけCAT
sim さんが書きました:valはどう使うべきですか?
引数1 = val1
引数2 = val2

Re: お願いします

Posted: 2015年7月28日(火) 23:44
by box
sim さんが書きました:

コード:

	fraction=kakunou(num,den);
kakunou関数の実体はどこにありますか?
sim さんが書きました:

コード:

	multiply(num,den);
1個の分数だけを渡しているように見えます。その状態で、どうやってかけ算しますか?
また、かけ算した結果を捨ててしまっているように見えます。それでいいんでしょうか?

Re: お願いします

Posted: 2015年7月28日(火) 23:47
by みけCAT
box さんが書きました:[
sim さんが書きました:

コード:

	multiply(num,den);
1個の分数だけを渡しているように見えます。その状態で、どうやってかけ算しますか?
そもそも分数を渡していないですね。

Re: お願いします

Posted: 2015年7月28日(火) 23:56
by box
sim さんが書きました:引数としての分数の積を求める関数。商を求める関数。
ということは、分数を「2個」入力する必要があるわけです。ところが
sim さんが書きました:

コード:

	fraction fraction;
1個しか作っていません。これがつまずきの始まり。
sim さんが書きました:

コード:

struct fraction multiply(struct fraction val1,struct fraction val2);
struct fraction divide(struct fraction val1,struct fraction val2);
引数として2個の分数を渡そうという意図は正しいです。ところが、実際には
sim さんが書きました:

コード:

	multiply(num,den);
単に分子と分母を渡しているだけで、分数を渡していません。これが2個目のつまずき。
やりたいと思っていること(プロトタイプ宣言の記述)と実際にやっていることが食い違っています。

Re: お願いします

Posted: 2015年7月29日(水) 00:11
by box
書こうとしている関数が
 ・何を入力として受け取って
 ・中でどんな処理をして
 ・呼び出し元に何を返すのか(あるいは何も返さないのか)

その関数を呼び出す側はその関数に何を渡してあげて、戻り値があればそれをどのように使うのか

こういったあたりを、日本語で整理してからコードに落とし込むことをおすすめします。
なぜなら、(おそらくは母国語であろう)日本語で書けない処理を
(一種の外国語である)プログラミング言語で書くことはかなりむずかしいと思うからです。

何しろ、日本語でちゃんと書けた処理でさえ、いざプログラムを書いてみるとバグだらけ、
などということは日常茶飯事ですしね。