• ベストアンサー

C言語のソースコードの書き方

C言語のソースコードの書き方に関する質問です。 0を5個と1を4個の、合わせて9個の数字を並べて出来上がる数列のパターン(126通り)を全て羅列させるプログラムを作りたいと考えていますが、そのためにどういった方針を立ててソースコードを書けばよいかが分かりません。 どういった構造かだけでも構いませんので、教えて頂けると幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

という方針で書くとこんな感じね。 #include <stdio.h> void print_pattern(char pattern[], int size) { for (int i = 0; i < size; i++) { printf("%c", pattern[i]); } printf("\n"); } void iter(char pattern[], int end, int n, int m) { if (n == 0 && m == 0) { print_pattern(pattern, end); return; } if (n == 0) { pattern[end] = 'b'; iter(pattern, end + 1, n, m - 1); return; } if (m == 0) { pattern[end] = 'a'; iter(pattern, end + 1, n - 1, m); return; } pattern[end] = 'b'; iter(pattern, end + 1, n, m - 1); pattern[end] = 'a'; iter(pattern, end + 1, n - 1, m); } int main(void) { int m = 5, n = 4; char pattern[m + n]; iter(pattern, 0, m, n); return 0; }

Erdbeerkegels
質問者

お礼

回答ありがとうございます。

その他の回答 (3)

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.4

数字的には9ビットの2進数なので、0~511までの数字となります。 forで0~511までループし、2進数に変換して、0が5個、1が4個の 組み合わせの数字を見つければいいだけです。

回答No.3

色々と蛇足だった。これでいい。 void iter(char pattern[], int end, int n, int m) { if (n == 0 && m == 0) { print_pattern(pattern, end); } if (n > 0) { pattern[end] = 'a'; iter(pattern, end + 1, n - 1, m); } if (m > 0) { pattern[end] = 'b'; iter(pattern, end + 1, n, m - 1); } }

回答No.1

コンピューターのプログラムを考えるとき、難しい問題を簡単な問題に分解して考えるのが普通です。 この問題、0が1個、1が1個で出来上がるパータンはどうやって出しますか? 0が2個、1が1個だとどうでしょう。0が3個、1が1個だとどうでしょう? 0が3個、1が1個のパターンは、 実は、一番最初に0を置く場合、0が2個、1が1個のパターンと同じです。 逆に、1が最初に来る場合、あとは0しか来ません。 数字の0と文字の0が紛らわしいので、ちょっと問題を変えます。 一般化すると、aをn個、bをm個の組み合わせの表示は、 nが0個の場合、bをm個並べるという1パターンしかありません。 mが0個の場合も、aをn個並べるという1パターンしかありません。 それ以外の場合、 aを最初において、そのあと、aをn-1個、bをm個並べるパターンか bを最初において、そのあと、aをn個、bをm-1個並べるパターンとなるでしょう。 aをn-1個、bをm個並べるパターンは上の問題のnとmの数字を入れ替えれば同じ考えでできます。 あとは、これまでおいたものを配列などに保存しておいて、n=0、m=0となったときに表示するようにすればよいでしょう。 こういうやり方を再帰呼び出しと言います。自分のところでできることは自分のところでやり、自分のところで解けないものは自分を違ったパラメーターでもう一度呼び出して解くというやり方です。

Erdbeerkegels
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • Cのソースコード集について

    ファイル1個分くらいの小さいC言語のプログラムのソースコードが 沢山のっているサイトがあるのですが、知っている方がいたら教えてください。 確か海外のサイトで、いろんな人が自由にソースを投稿できたような気がします。 SourceForgeの小さい版みたいな感じで、Linuxなどのソースも扱っていました。載っているソースには自作PingやExploit系などがあったと思います 自分は今Cを勉強していて、上達するために他人のソースを読もうと思ったのですが、Linuxカーネルは難しすぎますしGNUの周辺のユーティリティ系も沢山のファイルに分割されていて自分には難しかったので以前にみたそのサイトのコードで勉強しようと思ったのですが どうやって行ったか忘れてしまいました。 なので勉強のために規模の小さいソースプログラムが必要なので 類似サイトなどでも何でもいいので情報をお持ちの方は教えてください。

  • C言語のソースをC++言語に変換したい

    C言語で書かれていたソースをC++言語に変換したいのですが どのような点に気をつければよいでしょうか 現在、プログラムの主な構造は構造体とそれを扱う関数が実装されていて、 これらをクラスを使用して書き換えようと思います。 それ以外に気にしておくものはありますか。 例えば、ヘッダファイルで<stdio.h>をインクルードしているところがありますが、 これは<cstdio>に書き換えたほうがよいかもしれない、と言われたことはあります。 printfなどはprintfのまま使用しても大丈夫ですか。 std::printfに書き換えたり、iostreamを使用する方法に書き換えたほうがいいですか。 規格としてはどのようになっているのでしょうか。 (「過去との互換性のためにあるだけであり、非推奨」とかあったりしますか。)

  • C言語ソースコードに関する質問です。

    以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。 0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。) ソースコードを書くと、エラーがでた。 #include <stdio.h> int fib(int n) { if(n==1 || n==2) return 1; else return fib(n-1)+fib(n-2); } int main(void) { int n; for(n=0;n<17;n++) printf("%d,",fib(n)); } 正しソースコードを教えてください! よろしくお願いします。

  • c言語の質問方法について

    c言語の質問はどのように質問すれば一番わかりやすいですか? またソースコードはすべて表示したほうがいいですか?

  • C++ 図からソースコード自動生成

    図からソースコードを自動生成するソフトがいっぱいありますが、これは内部でいったいどのような仕組みになっているのでしょうか? 内部の詳細を詳しく知りたく投稿させていただきました。 試しに、C++とjavaのクラスの定義(1クラスのみ)を図から行えるようなプログラムの作成を試みております。 以下2点で悩んでおります。 (1)2つの言語に対応するため中間言語を作る必要はあるのか? (2)図からコードを作る部分の開発が全く進みません。 似たプログラムの解説をしているサイトや本や公開されているソースコード、アドバイスありましたらご教授くださいませ。

  • VIsual C++6.0のソースを書くところについて

    プログラミング言語の経験は全くない初心者です。 まだ何をつくろうとは考えていませんが、 将来的には簡単なゲームみたいなのを作れれば、と思ってます。 とりあえず新Visual C++6.0入門 ソフトバンク 著者 林 晴比古(はるひこ) を買って実際やってみました。 本に書いてある通りにしてみると確かにできました。 この本であまり文法が理解できなかったので途中で C言語の文法説明をサイトで見つけたので、 今度はそれを見ながらやろうとしたのですが、 問題が一つ! そういうソースを見つけて打つときはどこに打ったらいいのでしょうか? そのソースは年を聞いたりするプログラムなんですけども・・ 詳しい場所を教えてくだされば幸いです。

  • c言語やjavaのソースを読みたいのですが

    c言語やjavaのソースを読みたいのですが ゲームやアプリのプログラムを公開しているサイトを御存知でしたら 教えてください。言語の開発環境は、VC++・vc#・Eclipse・visualBasic(2005)です。

  • C言語でのソースファイルが・・・

    C言語でのソースファイルが・・・ 最近C言語(MinGW、MSYS)の勉強をしていました。 それで今日も勉強の続きをしようと全てのソースファイルを見たらMSYSでしか開けなかったのが普通にWクリックで開けるメモ帳になっていました。 自分でそのソースファイルに何かをしたわけではなく本を見ながら文字を書いて覚えるみたいな作業をしていただけなので何かをしたというわけではないです。 なのでなにをしてこうなった。何があってこうなった。と言うことがまったくわかりません。 これはもとのソースファイルにもどせるのでしょうか? また予想でいいのでなにが原因か考えてはもらえないでしょうか? 少々現状を理解できなくて質問が曖昧になってます・・・。すいません。 ご回答お願いします。

  • C言語とpython言語について。

    Visual Studio Codeで、C言語(これは必要なものを全てインストール済み)で、その上で、python言語のインスール(必要なもの全て)しても、C言語が、実行&コンパイル出来なくなる事はないですよね?教えて頂けると幸いです。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542