プロが教える店舗&オフィスのセキュリティ対策術

現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください

再起呼び出しの回数をカウントして
その回数を返したいのですが

例えば

coid honoi(int n,char a,char b,char c)  {
    int count=0;
    if (n>0)  {
        hanoi(n-1,a,c,b);
        count++;
    }
}

のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。

同様に

if()  {
    int count=0;
    hanoi();
    count++
}

としても、count=1のままでした。

再起呼び出しをするたびに、この count値を増やしていくには
どのようにプログラムを書けばよいのでしょうか?

まだCは初心者レベルなので
易しめにご説明ください。
よろしくお願いします。

A 回答 (3件)

関数の外で変数を宣言し、どこかで初期化して、カウントアップすれば実現できます。



static int count;
  :
  :
int main(int argc, char *argv[]) {

  :
  :
  count = 0;
  hanoi(適当な引数);
  :
  :

}
void hanoi(int n,char a,char b,char c)  {
    count++;
    if (n>0)  {
        hanoi(n-1,a,c,b);
    }
}

こんな感じです。
    • good
    • 0
この回答へのお礼

main関数で宣言することで
実現することができました。

"static"を付けた宣言ついては、
まだ勉強不足なので
もう少し勉強しようと思います。
ありがとうございました。

お礼日時:2004/07/13 22:12

 普通は呼び出された側でカウントするのではなく、呼び出す側でカウントするのがいいですが・・・。



 方法としては、グローバル変数(関数の外にある変数で、どの関数からでも使用できる)を使うか、メイン関数で使うかです。

 また、メイン関数で使う場合にも、条件判断(ループ)内で初期化してはカウントする意味がないので、初期化は必ず初め(遅くても直前)に行います。

 プログラムにすると、たとえば、

int count=0;

int main()
{
honoi(...);
}

void honoi(...)
{
count++;
}

であったり、または、

int main()
{
int count=0 ;

while(...)
{
honoi(...);
count++;
};
}

void honoi(...)
{
...
}

などとなります。
    • good
    • 2
この回答へのお礼

main関数内で宣言するのが
簡単だったので
その方法で実現できました。

グローバル変数も上手く使いこなせるように
頑張ります。

ありがとうございました。

お礼日時:2004/07/13 22:17

ハノイの塔ですねー、懐かしいです。


変数のスコープについてはご存知でしょうか?
変数にはグローバル変数とローカル変数の2種類があり、
#include <stdio.h>
int a /*これはグローバル変数*/

void hoge(void)
{
int b /*これはローカル変数*/
}

main()
{
int c /*これはローカル変数*/
void hoge();
}
となります。ローカル変数はその関数が終了すればメモリーから解放され、逆にグローバル変数はプログラムが終了したらメモリーから解放されます。つまりstar_blueさんのcount変数はhanoi関数が終了したらメモリーから消されるので、count値が増えていきません。グローバルにcountを宣言されるか、hanoi関数内でstatic int count =0;と宣言すれば大丈夫でしょう。
ちなみにグローバル変数は0で初期化されますのでint count c =0の=0は入りません。staticはプログラムが終了するまで値を保ちます。
    • good
    • 1
この回答へのお礼

実は課題はハノイの搭ではないんですが
持っていたCの本のサンプルプログラムが
ハノイの搭しか載ってなかったんです。

値が増えないのは毎回初期化されていると言うよりも
メモリーから消されるためなんですね。
勉強になりました。

ありがとうございました。

お礼日時:2004/07/13 22:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています