現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください
再起呼び出しの回数をカウントして
その回数を返したいのですが
例えば
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は初心者レベルなので
易しめにご説明ください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
関数の外で変数を宣言し、どこかで初期化して、カウントアップすれば実現できます。
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);
}
}
こんな感じです。
main関数で宣言することで
実現することができました。
"static"を付けた宣言ついては、
まだ勉強不足なので
もう少し勉強しようと思います。
ありがとうございました。
No.3
- 回答日時:
普通は呼び出された側でカウントするのではなく、呼び出す側でカウントするのがいいですが・・・。
方法としては、グローバル変数(関数の外にある変数で、どの関数からでも使用できる)を使うか、メイン関数で使うかです。
また、メイン関数で使う場合にも、条件判断(ループ)内で初期化してはカウントする意味がないので、初期化は必ず初め(遅くても直前)に行います。
プログラムにすると、たとえば、
int count=0;
int main()
{
honoi(...);
}
void honoi(...)
{
count++;
}
であったり、または、
int main()
{
int count=0 ;
while(...)
{
honoi(...);
count++;
};
}
void honoi(...)
{
...
}
などとなります。
main関数内で宣言するのが
簡単だったので
その方法で実現できました。
グローバル変数も上手く使いこなせるように
頑張ります。
ありがとうございました。
No.2
- 回答日時:
ハノイの塔ですねー、懐かしいです。
変数のスコープについてはご存知でしょうか?
変数にはグローバル変数とローカル変数の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はプログラムが終了するまで値を保ちます。
実は課題はハノイの搭ではないんですが
持っていたCの本のサンプルプログラムが
ハノイの搭しか載ってなかったんです。
値が増えないのは毎回初期化されていると言うよりも
メモリーから消されるためなんですね。
勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/11/09 13:27
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
printf で二進表示を行いたい。
C言語・C++・C#
-
c言語 16進数の2進数への変換
C言語・C++・C#
-
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
-
4
c言語についての質問です。
C言語・C++・C#
-
5
while文について、c言語です。
C言語・C++・C#
-
6
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
7
strcat関数を自作したいです
C言語・C++・C#
-
8
C言語初心者 構造体 課題について
C言語・C++・C#
-
9
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
10
C言語の入力した文字を反転させるプログラミングの仕方が分かりません。
Ruby
-
11
C言語初心者 ポインタについて、お助けください、、
C言語・C++・C#
-
12
C言語プログラミングについて(回文、palindrome)
C言語・C++・C#
-
13
C言語のfor文です。 繰り返しの中で文字を一つずつ増やしていくやり方を教えてください for(i=
C言語・C++・C#
-
14
C言語における再帰呼び出しの限界?について
C言語・C++・C#
-
15
入力した文字列から母音だけを出力するプログラム
C言語・C++・C#
-
16
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
17
strcmp
C言語・C++・C#
-
18
C言語初心者です、、、お助けください
C言語・C++・C#
-
19
C言語初心者 構造体 課題について
C言語・C++・C#
-
20
コンパイルできません。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報