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

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

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

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

Q&A

解決済

2回答

655閲覧

c言語 アルゴリズムの説明をしてください。

Kazuma_3

総合スコア3

C

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

0グッド

1クリップ

投稿2020/10/04 03:50

大学のCのプログラミングの課題でて、一応できたのですが、なぜこういうコード(アルゴリズム)なのかがわかりません。
問題は、文字’L’がl個、’R’がr個で構成される文字列をすべて表示する関数を作成する。こ こで、l と r は非負整数でキーボードから入力し、l + r ≤ 8 としてよい (高々8 文字が入 る配列 str[9] を 1 つ用意すると良い)。キーボードから非負整数 l, r(ただし l + r ≤ 8) を入力すると上記の関数を呼び出し、文字列を表示するプログラムを作成せよ。(参考: ’L’ を選べれば選んで、残り l − 1 個と r 個の文字列作成。同様に’R’ を選べれば選ん で · · ·。と両方行えばすべて行ったことになる。) です。

コードのわからない部分は、関数func()の引数にi,l,r,strがありますが、関数を使う時に、引数として、0を渡しているところです。なぜ、0なのでしょうか?また、関数func()ないのif文での処理でなぜ、問題文のようなコードがかけるのでしょうか?わかる方いらっしゃましたら、よろしくお願いします!

C

1#include <stdio.h> 2 3void func(int i, int l, int r, char *str); 4 5int main(void){ 6 int l,r; 7 char buf[8+1]; 8 printf("Input two non-neg. intergers ,l and r:"); 9 scanf("%d%d",&l,&r); 10 // printf("l:%d",l); 11 // printf("r:%d",r); 12 func(0,l,r,buf); 13} 14 15void func(int i, int l, int r, char *str){ 16 if(l + r == 0){ 17 str[i] = '\0'; 18 printf("%s\n", str); 19 } 20 if(l > 0){ 21 str[i] = 'L'; 22 func(i + 1, l - 1, r, str); 23 } 24 if(r > 0){ 25 str[i] = 'R'; 26 func(i + 1, l, r - 1, str); 27 } 28 }

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

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

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

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

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

KoichiSugiyama

2020/10/04 04:03

再帰関数という言葉は習いましたか?この問題はその再帰関数を使っています。デバッガで一行ずつ追ってみると動作が理解しやすいと思いますが、実際にステップ実行して判らないところがあれば、再度質問されてはどうでしょうか。
Kazuma_3

2020/10/04 04:33

わかりました。デバック環境の構築からやってみます。
guest

回答2

0

ベストアンサー

なぜ、0なのでしょうか?

bufの先頭から使うから0を渡しているのでしょう。

また、関数func()ないのif文での処理でなぜ、問題文のようなコードがかけるのでしょうか?

「再帰的処理」の概念を学びましょう。
高校数学で学んだ「数学的帰納法」を覚えていますか?

投稿2020/10/04 03:57

otn

総合スコア84786

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

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

Kazuma_3

2020/10/04 05:01

その再帰的処理がわからなかったため質問をしました。
otn

2020/10/04 05:11

簡単に言うと、nの時の処理をn-1の時の処理に任せることです。 階乗計算を再帰処理で求める方法は分かりますか? f(n) = n * f(n-1) ・・・ n>0 のとき f(0) = 1
Kazuma_3

2020/10/04 05:13

はい、わかります。 数学みたいな計算とかの再帰的処理はわかりやすいのですが、今回の問題みたいになると…
guest

0

関数を使う時に、引数として、0を渡しているところです。なぜ、0なのでしょうか?

配列の先頭は0番目です。まずは0文字目を決める必要があります。

投稿2020/10/04 03:54

maisumakun

総合スコア145208

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問