現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください
再起呼び出しの回数をカウントして
その回数を返したいのですが
例えば
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も見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
c言語についての質問です。
C言語・C++・C#
-
C言語における再帰呼び出しの限界?について
C言語・C++・C#
-
c言語 16進数の2進数への変換
C言語・C++・C#
-
-
4
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
5
C言語初心者です、、、お助けください
C言語・C++・C#
-
6
間接参照のレベルが異なっています
C言語・C++・C#
-
7
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
8
C言語 関数の中でカウントアップするには
C言語・C++・C#
-
9
プログラミングが分かりません。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
強連結判定を行うプログラムに...
-
2の補数を計算するプログラム
-
C言語 格子点が多角形の中にあ...
-
C++で表を作成したいのです ...
-
intとlongは同じ?
-
2次関数プログラムを描写する...
-
H8/3052 周波数について
-
カードシャッフルのブログラム...
-
再起呼び出しの回数をカウント...
-
プログラミングに関して
-
迷路を脱出する経路探索プログ...
-
条件が多い場合
-
opencvとmbedのシリアル通信で...
-
ヌメロンのプログラム
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
信頼区間の1.96や1.65ってどこ...
-
変数とパラメータとは違うもの...
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
カードシャッフルのブログラム...
-
OpenCVによる4値化について
-
C++で表を作成したいのです ...
-
分数の足し算をさせるプログラ...
-
条件が多い場合
-
画像の拡大・縮小
-
ヌメロンのプログラム
-
C言語で簡単なパックマンゲーム...
-
関数とビット列
-
C++ bmp 透過処理
-
コマンドプロンプトのウィンド...
-
3のつく数と3の倍数を表示 C言語
-
異なるn個の整数からr個の整数...
-
迷路を脱出する経路探索プログ...
-
whileとifを使い偶数を出すには
-
再帰処理をループ処理に変換
おすすめ情報