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

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

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

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

Q&A

解決済

1回答

811閲覧

四則演算全種類を再帰関数を使って計算結果を出力したいです

satakehirohumi

総合スコア9

C

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

0グッド

0クリップ

投稿2020/06/04 14:10

4つの数字a,b,c,dをa□(b□(c□d))という様に□に四則演算全種類を入れて(全部で4^3=64通り)その結果を出力するプログラムを作りたいです。
二つの数を引数として、再帰的に求めたいです。(c□d)を計算→b□(c□d)を計算→a□(b□(c□d))という様にしたいのですがうまく再帰関数が作れません。

c

1void aaa(int x,int y){ 2 int a[4],i; 3 a[0]=x+y; 4 a[1]=x-y; 5 a[2]=x*y; 6 a[3]=x/y; 7 8 for(i=0;i<4;i++){ 9 return aaa(?,a[i]); 10 } 11}

本当にざっくりですが上の様な感じで再帰関数を作りたいです。

わかる方よければ教えてください。(c言語です)

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば、 4 3 2 1 を与えて、4 / (3 - (2 + 1)) を計算すると
0 で割ることになりますが、その場合どうすればよいのでしょうか?

0 で割る時エラーにせず、結果を 0 にしたとすれば次のようになりますが
これでよいのでしょうか?

C

1#include <stdio.h> 2 3int a[4]; 4char o[3]; 5 6void func(int n, int v) 7{ 8 if (n == 0) 9 printf("%d %c (%d %c (%d %c %d)) = %d\n", 10 a[0], o[0], a[1], o[1], a[2], o[2], a[3], v); 11 else { 12 n--; 13 o[n] = '+'; func(n, a[n] + v); 14 o[n] = '-'; func(n, a[n] - v); 15 o[n] = '*'; func(n, a[n] * v); 16 o[n] = '/'; func(n, v ? a[n] / v : 0); 17 } 18} 19 20int main(void) 21{ 22 if (scanf("%d%d%d%d", a, a+1, a+2, a+3) == 4) func(3, a[3]); 23}

計算を double で行うようにすると、0 で割った場合 inf や nan になります。

C

1#include <stdio.h> 2 3double a[4]; 4char o[3]; 5 6void func(int n, double v) 7{ 8 if (n == 0) 9 printf("%g %c (%g %c (%g %c %g)) = %.15g\n", 10 a[0], o[0], a[1], o[1], a[2], o[2], a[3], v); 11 else { 12 n--; 13 o[n] = '+'; func(n, a[n] + v); 14 o[n] = '-'; func(n, a[n] - v); 15 o[n] = '*'; func(n, a[n] * v); 16 o[n] = '/'; func(n, a[n] / v); 17 } 18} 19 20int main(void) 21{ 22 if (scanf("%lf%lf%lf%lf", a, a+1, a+2, a+3) == 4) func(3, a[3]); 23}

追記
なぜ、質問者は何も応答しないのでしょうか?

0 で割った時は error と表示するようにしてみました。

C

1#include <stdio.h> 2 3int err = 0, a[4]; char o[3]; 4 5void func(int n, int v) 6{ 7 if (n == 0) { 8 printf("%d %c (%d %c (%d %c %d)) = ", 9 a[0], o[0], a[1], o[1], a[2], o[2], a[3]); 10 if (err) puts("error"); else printf("%d\n", v); 11 err = 0; 12 } 13 else { 14 n--; 15 o[n] = '+'; func(n, a[n] + v); 16 o[n] = '-'; func(n, a[n] - v); 17 o[n] = '*'; func(n, a[n] * v); 18 o[n] = '/'; func(n, v == 0 ? err = 1 : a[n] / v); 19 } 20} 21 22int main(void) 23{ 24 if (scanf("%d%d%d%d", a, a+1, a+2, a+3) == 4) func(3, a[3]); 25}

投稿2020/06/04 17:52

編集2020/06/10 14:32
kazuma-s

総合スコア8224

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

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

satakehirohumi

2020/06/10 16:52

理解できました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問