トップページ⇒tech
1001コメント336KB

【初心者歓迎】C/C++室 Ver.28【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/09(金) 10:08:51
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0478デフォルトの名無しさん2006/06/20(火) 12:10:44
>>477
自由にしてたらコンパイラごとにソースの意味が変わっちゃうからダメだろ。
0479デフォルトの名無しさん2006/06/20(火) 12:16:59
>>476
/* */の中はエスケープは効かないが、//の後ろは効くという主張?
0480デフォルトの名無しさん2006/06/20(火) 12:21:58
>>479
改行のエスケープは規格で定められている。
0481デフォルトの名無しさん2006/06/20(火) 12:25:03
日本語禁止でいいんじゃね?
そういうプロジェクトいくつかあったよ
0482デフォルトの名無しさん2006/06/20(火) 12:25:46
>>480
それはコメント中もだっけ?
0483デフォルトの名無しさん2006/06/20(火) 12:25:51
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int myRand(int a)
{
return rand()%a+1;
}
int main(void)
{
srand( (unsigned)time(NULL) );
int a;
printf("整数を入力\n");
scanf("%d", &a);
printf("%d", myRand(a));
return 0;
}
このプログラムで、srand((unsigned)time(NULL));を書くとコンパイル時にエラーが出てしまうのですがなぜですか?
まったく原因が分かりません。
0484デフォルトの名無しさん2006/06/20(火) 12:26:59
行連結は翻訳段階2で行われるけど
コメント処理は翻訳段階3だからねー。
規格合致処理系なら
/\
*\
*\
/\
もコンパイルは通る。
0485デフォルトの名無しさん2006/06/20(火) 12:27:39
>>475
日本語に対応してないコンパイラ(Cygwin の gcc とか)
0486デフォルトの名無しさん2006/06/20(火) 12:28:54
ああ、* へのエスケープが効くかどうかは、今手元にないからシラネ。
0487デフォルトの名無しさん2006/06/20(火) 12:29:26
>>483
エラーメッセージ嫁。
0488デフォルトの名無しさん2006/06/20(火) 12:32:10
>>483
Cでは、変数の宣言はブロックの先頭でなければならない。
関数呼び出しの後ろで宣言するな。
04894832006/06/20(火) 12:32:29
エラー E2140 kadai10_2.c 13: ここでは宣言できない(関数 main)
です
04904832006/06/20(火) 12:34:42
>>488
ありがとうございます!
うまくいきました
0491デフォルトの名無しさん2006/06/20(火) 12:42:43
>>485
それは確かに。
でもそういうコンパイラを使うプロジェクトなら
それこそ日本語禁止にしないと駄目だよな。
0492デフォルトの名無しさん2006/06/20(火) 12:50:54
>>485
もう 3.4 になってるから、 -finput-charset 使えば問題なし。
0493デフォルトの名無しさん2006/06/20(火) 14:17:43
>>492
お、使えるんだ。
04944322006/06/20(火) 15:20:14
>>435 さん
おお、ありがとうございます!

それで、質問というのは
そのプログラムをVC++に入れてコンパイルしても、エラーが沢山出てしまって
動作してくれなくて困っています。
具体的にどういじって、どんなファイルを用意すれば良いのかなど、
ご教授してくれると有難いです・・・。

程度が低すぎて申し訳ない。
0495デフォルトの名無しさん2006/06/20(火) 15:36:24
ひょっとして、
もしかして、

サンプルのtxtファイル自体をVCに食わせようとしてる?




あと、単にエラー出たとか言われてもエスパーじゃないのでエラー内容は君にしかわからん
04964352006/06/20(火) 15:50:26
>>494
ビルドしたプロジェクトをうpしといた。受信パスはsuganuma。
ttp://www.uploda.org/uporg421601.zip.html

普通、ひとつのクラスの実装はひとつのcppで行うので、そのようにファイルを作った。
誰かへの説明のためなどの理由で、ファイルを分割するひつようがあるなら、
このビルドできるプロジェクトをいじってね。

次に質問するときは、エラーメッセージをコピペすること。
04974352006/06/20(火) 15:57:42
んあ、ひょっとして、引数に与えるファイルの内容がわからないってこと?
ttp://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-4
にあるように、
 実行可能ファイル名 制御データファイル名 構造データファイル名
で起動する。引数に与えるデータファイルは、そのページの赤字のところそのものが
入ったファイルを用意してやればいいよ。何してるのかさっぱりわからんけど。
04984352006/06/20(火) 16:04:22
つか、俺あのプログラム書いた本人がVCでビルドしようとして出来ないんだと思ってたよ。
0499デフォルトの名無しさん2006/06/20(火) 21:50:36
void Kansu {
  ・
  ・
  ・
  //抜けたい場所
  ・
  ・
  ・
}


whileやfor文ならbreakで抜けれますが、
returnを使わずに関数を途中で抜ける方法ってありますか?
0500デフォルトの名無しさん2006/06/20(火) 21:52:44
関数を途中で抜けるのと、returnをすることの違いとは?
0501デフォルトの名無しさん2006/06/20(火) 21:54:27
あ、returnって値を返さなきゃならないんですよね?
もしかして値を返さなくてもreturnできるですか?
0502デフォルトの名無しさん2006/06/20(火) 21:54:58
return を使う事と、関数を途中で抜ける事は等価なので、
質問自体が矛盾している。
0503デフォルトの名無しさん2006/06/20(火) 21:58:06
ああ、returnの後ろに何も書かなければ値を返さなくても関数を抜けれるんですね。
何かつけないとダメと思ってました。ありがとうございます。
0504デフォルトの名無しさん2006/06/20(火) 22:05:28
まあこの場合戻り値がvoidだしな。何かしら返す必要があるならダメ。

それか、gotoやら例外で飛ぶこともできる。前者の濫用はやるべきではないが。
0505デフォルトの名無しさん2006/06/20(火) 22:05:50
>>503
たしかCだとvoid以外の関数でも戻り値をせずにreturnが使えるはずだから、
一応念のため言っておくけど、returnに戻り値を書かなくても済むのは、
戻り値の型がvoidである関数限定だと思っておきなさい。
0506デフォルトの名無しさん2006/06/20(火) 22:06:02
引数を与えないでreturnした場合は何が戻り値になるんだろう。
たまたまEAXレジスタに入ってたゴミが返るとかそんな感じなのかな。
今まで考えたこともなかった。

関数を途中で抜けて、しかも戻り値を使わないような場合って
ほとんどエラーが起こった状況だと思うんだけど、エラーが
起こったことがわかるように戻り値を返してやるのが親切かも。
0507デフォルトの名無しさん2006/06/20(火) 22:24:25
VC++2005、bcc、gcc、ICCはeaxのゴミっぽい。
05085042006/06/20(火) 22:28:45
うっかりしてたがgotoは同じ関数内のラベルにしか飛べないのでこの場合ダメだった
この場合setjmpとlongjmpを使う。
つっても例外使った方がいいと思うけど
0509デフォルトの名無しさん2006/06/20(火) 22:37:46
>>506
Cではたしか不定の値(ようするにごみ)が返ることになるんだったと思う。
(もしかしたら未定義だったかもしれない)

C++ではコンパイルエラー。
0510デフォルトの名無しさん2006/06/21(水) 00:19:11
>>509
実装依存なので、律儀に0を返すコンパイラもあります。
0511デフォルトの名無しさん2006/06/21(水) 03:26:58
0や1などの小さな整数しか入れない変数を定義する時、intにしないでcharを使ったほうが
メモリが節約できると思うのですが、そうすると他人に理解しにくいというか、
間違ってると思われるでしょうか?
0512デフォルトの名無しさん2006/06/21(水) 03:42:30
>>511
殆どメモリの節約にならないばかりか、最適化の妨げになるのでintで充分です。
0513デフォルトの名無しさん2006/06/21(水) 14:48:12
質問です。
gettimeofday関数を使用して実行時間を計測したいのですが、
#include <sys/time.h> が見つかりません とエラーが出てgettimeofday関数を使用できません。
このファイルは普通どこにあるんでしょうか??
VisualStudio.NET2003使用。
0514デフォルトの名無しさん2006/06/21(水) 14:55:23
そんなものはない。
0515デフォルトの名無しさん2006/06/21(水) 15:40:40
>>513
落ち着いてどんな質問がしたいのかもう一度考えて。
0516デフォルトの名無しさん2006/06/21(水) 16:29:45
gettimeofdayはlinuxの関数じゃない?
0517デフォルトの名無しさん2006/06/21(水) 16:38:19
BSDにもあるぞな。

まあ、VCのライブラリには無いようなので適当に<time.h>includeしてclock()使うとか
0518デフォルトの名無しさん2006/06/21(水) 17:06:09
man 2 gettimeofday
(略)
準拠
 SVr4, BSD 4.3
0519デフォルトの名無しさん2006/06/21(水) 17:08:49
まあ、Windowsなら普通はGetTickCountとかQueryPerformanceCounterとか使う
0520デフォルトの名無しさん2006/06/21(水) 17:35:59
>>513
実行時間の計測ならプロファイラ使え
05214322006/06/21(水) 17:44:32
>>435
こんなにご丁寧に、親切教えて頂いて、
本当にありがとうございます!

アップして頂いたコードも落とさせて頂きました。
ビルドしたら、上手くいったのですが・・・

こんな事を聞くのも心苦しいのですが、
VC++で実行すると、***error 入力データファイルを指定してください。
と出ます。

435さんが教えてくださった通り、data1.dat、data2.datというファイルを作り、
中に制御データ、構造データを入れるところまではやったのですが
ここから起動する、というのがよく分からないです・・。

ここまで親切に教えてくださいましたし、あまり甘えるのもアレかと思うのですが
もし宜しければ、起動の方法を教えてください。
0522デフォルトの名無しさん2006/06/21(水) 18:13:28
VCから直接動かそうとしているなら、>>444。
そうじゃないなら、[Windowsキー]+Rで、cmdと入力して、exeがあるところまでcdしてから>>442
05234322006/06/21(水) 22:58:59
>>522 さん
出来ました!
ありがとうございました!

>>444さん、>>435さん
お世話になりました!
特に435さんは、とても丁寧ににして頂いてとても感謝しています。
素人の程度の低い質問に答えてくださり、
皆様本当にありがとうございました!
0524デフォルトの名無しさん2006/06/21(水) 23:11:26
>>523
まぁ全部の発言が俺なわけだが・・・。
なんにせよ、よかった。いろいろ頑張れよ。
0525デフォルトの名無しさん2006/06/21(水) 23:35:09
>>523-524
ワロタww
524親切だな
0526デフォルトの名無しさん2006/06/22(木) 00:46:16


STL の情報が網羅されている(出来れば)日本語のサイトが見たいのですが、

std::deque
std::list を使うか、 std::vector を使うかで迷っているのですが、
1. 二つのコンテナをつなげて一つのコンテナにする
2. 末尾に要素を追加
3. 先頭から要素を取り出して、削除する
4. 要素の数を取得する
という4つの操作しかしないのですが、std::listの方が速いですか?
0527速度が気になるなら試せばいい2006/06/22(木) 00:47:23
>>526
日本語でどうぞ。
つーか、文章は完結させましょう。
05285262006/06/22(木) 00:48:21
すいません。
書く内容を纏めている途中で送信してしまいました。

でも大体書きたいことは伝わったかなと思います。よろしくお願いします。
0529デフォルトの名無しさん2006/06/22(木) 00:52:32
>>526
短く言うと、std::dequeは大抵は お そ い と知っておいてくれ。
0530デフォルトの名無しさん2006/06/22(木) 01:05:52
STLに関してはかなり纏まったページが見つかりました。
ttp://www.wakhok.ac.jp/~sumi/index.html

>>529
どうも。とりあえず std::list でやってみたいと思います。
merge() もあるようですし。
0531デフォルトの名無しさん2006/06/22(木) 01:48:20
std::list<>::size()はcomplexityが…と思って調べたらconstantなのね。
0532笹井奈琴2006/06/22(木) 03:14:41
enumって、前方参照宣言できないんでしたっけ?
次のプログラムのコンパイルが通らない...

---ファイル:bigger.h
enum e_bigger_t { MEGUMI, HOSHINO, SAAYA };

---ファイル:momu.h
enum e_bigger_t;
void momu( e_bigger_t eb );

---ファイル:momu.cpp
#include "momu.h"
#include "bigger.h"
void momu( e_bigger_t eb ) {
// なんか処理
}
$ g++ momu.cpp
ってやると
momu.h:1: error: use of enum `e_bigger_t' without previous declaration
「e_bigger_tってなんだよ?」って...
つか、e_bigger_tは列挙体だよ、って、そこで教えてるのに...
0533デフォルトの名無しさん2006/06/22(木) 03:23:49
浅はかな素人思考だな。何もわかっていない。
0534デフォルトの名無しさん2006/06/22(木) 03:43:09
という内容の指摘を素人でも書ける言葉だけでまとめるのは
ギャグでやってるのかなw
0535デフォルトの名無しさん2006/06/22(木) 03:50:45
浅はかな素人ギャグだな。何も笑えない。
0536デフォルトの名無しさん2006/06/22(木) 03:57:30
>>532
結論を言えば、ダメ。
enumは不完全型として認められていない。
0537笹井奈琴2006/06/22(木) 04:40:23
>>536
さんきゅ!
VC++ではできたように思ったんだが勘違いか、
VC++独自の仕様なんだろうなあ。

ありがと。
0538デフォルトの名無しさん2006/06/22(木) 11:09:03
>>531 linear だよ。
05394322006/06/22(木) 11:19:02
>>524 さん
ああ、そうだったのですか、失礼しました。

はい、頑張ります!
本当にありがとうございました!
0540デフォルトの名無しさん2006/06/22(木) 11:34:47
>>538
SGIの実装がlinearなだけ
ttp://www.sgi.com/tech/stl/FAQ.html

仕様では、constant timeのほうが良いとされているけど。
0541デフォルトの名無しさん2006/06/22(木) 11:57:04
>>540
ほんとだ。
でも constant と要求されてるわけじゃないから、 constant とも言い切れないな。
困った規格だ。
0542デフォルトの名無しさん2006/06/22(木) 12:08:47
class A {
public:
void f() const {}
void f() {}
};
定義がconstの有無だけのオーバーロード?関数はどうやって呼び出しを区別するのですか?
こういう定義をする意味もよく分かりません。
どういった場合に使われるのか良ければ教えてください。
0543デフォルトの名無しさん2006/06/22(木) 12:27:22
>.542
A a;
A const ca;
a.f(); // こっちは const 付いてない f()
ca.f(); // こっちは const 付いてる f()

コンテナの operator [] とか、オブジェクトの中身への参照を返すときに
戻り値の型にも const を使い分けてよく使われる。
0544デフォルトの名無しさん2006/06/22(木) 12:57:24
>>543
回答ありがとうございます。
0545デフォルトの名無しさん2006/06/22(木) 14:01:34
WAVEファイルの取り込みってどんなプログラム書けばいいんですか?
ここ2ヶ月そのことしか考えてません。
0546デフォルトの名無しさん2006/06/22(木) 15:41:34
>>545
ttp://www.catb.org/~esr/faqs/smart-questions.html
0547デフォルトの名無しさん2006/06/22(木) 15:46:50
>>543
確かthisにconstが付くんだっけ。typeidで表示されてみればいいか?
0548デフォルトの名無しさん2006/06/22(木) 17:36:28
理由が分からん('A`)
#include <stdio.h>
#include <stdlib.h>

typedef union {
double a;
unsigned char b[8];
} D8;

double swap(D8 s) {
return (double)((s.b[0] << 56) |(s.b[1] << 48) |
(s.b[2] << 40) |(s.b[3] << 32) |
(s.b[4] << 24) |(s.b[5] << 16) |
(s.b[6] << 8) |(s.b[7]));
}

int main() {
D8 a;
int i;
a.a = 0.0;
a.a = swap(a);
printf("%g\n", a.a);
}

gcc ttt.c
ttt.c: In function
[minomura@mozart07 minomura]$ ttt.c:10: warning: left shift count width of type
ttt.c:11: warning: left shift count width of type
ttt.c:12: warning: left shift count width of type
ttt.c:13: warning: left shift count width of type
0549デフォルトの名無しさん2006/06/22(木) 17:47:30
s.b[0] << 56 で s.b[0] の型は 56bit長もねーよ と言ってる

56bit以上の整数型 (仮に T としよう)でキャストの後ビットシフトすれ
((T)s.b[0]) << 56
0550デフォルトの名無しさん2006/06/22(木) 18:08:59
>>548
むしろ、藻前が何をしたいのかがわからん。
0551デフォルトの名無しさん2006/06/22(木) 20:19:58
エスパー

typedef union {
unsigned long long a;
unsigned char b[8];
} D8;

unsigned long long swap(D8 s) {
int i;
D8 tmp;
for(i=0;i<8;i++) tmp.b[i] = s.b[8-1-i];
return tmp.a;
}
0552デフォルトの名無しさん2006/06/22(木) 22:13:45
スレ違いだったらごめんなさい。

C言語のプログラミングをマスターするために来週から練習します。
プログラムを打つのは初心者です
C言語を覚えたら、javaなどやろうと考えています

OS:XP h

今後のことを考えて、お勧めの市販ソフト又はフリーソフトは何がいいんですか?
ご指導お願いします
0553デフォルトの名無しさん2006/06/22(木) 22:19:53
>>552
VC++ 2005 Express
05545312006/06/22(木) 22:49:23
>>538,540
あ、たしかにshouldだった。shallと勘違いしていた。スマン
0555デフォルトの名無しさん2006/06/22(木) 23:02:52
>>553
即レスありがとうございます
これはCとC++がやれるソフトでOKですか?
0556デフォルトの名無しさん2006/06/22(木) 23:09:41
>>555
 そりゃ、CもC++もできるけど、高いよー。
プログラマでメシを食う覚悟があるならどうぞ。
単に趣味とか学校の単位のためとかならとりあえずタダのBorlandで。
0557デフォルトの名無しさん2006/06/22(木) 23:11:55
>>556
Expressは無料だろうが。
0558デフォルトの名無しさん2006/06/22(木) 23:19:59
>>556
アカデミックなら4800円。
MSの青田刈りもここまで来たかという感じがする。
0559デフォルトの名無しさん2006/06/22(木) 23:25:52
あとcygwin-gcc
0560デフォルトの名無しさん2006/06/22(木) 23:30:45
>>555-559
ありがとうございます
0561デフォルトの名無しさん2006/06/23(金) 00:29:20
VC++でWindowsアプリケーションを作ってるとログ出力機能を持たせることが多いです。
で、そのログ出力の内容を外部からhookさせる方法やソフトはないでしょうか?
ログ出力機能を持った既存のアプリの変更は無しが嬉しいです。
ようするにログの内容を別窓で見たいのです。
0562デフォルトの名無しさん2006/06/23(金) 00:49:55
>>552
Visual C++ 2005 Express (簡単な)まとめサイト
ttp://www14.atwiki.jp/garyohosu/
0563デフォルトの名無しさん2006/06/23(金) 00:53:25
この動きがいまいち理解できません。
class TestBase {
public:
print() { std::cout << "TestBase" << std::endl; }
};
class TestSub : public TestBase {
public:
print() { std::cout << "TestSub" << std::endl;}
};

これで、TestBase* testBase = new TestSub; testBase->print() をすると、TestBaseが呼ばれます。
で、TestBaseのprintにvirtualをつけると、TestSubが呼ばれます。

この動きが良くわかりません。
わかりやすく教えてください。
0564デフォルトの名無しさん2006/06/23(金) 00:58:44
>>563
printがTestBase、TestSubのどちらが呼ばれるかは
printがvirtualでないとき静的に決まり、virtualだと動的に決まる。

つまりこの場合静的と言うと、ソースコード上testBaseの型がTestBaseだからTestBase::printが呼ばれるということ。
動的と言うのは、printを呼ぶときにTestBaseへのポインタから呼び出そうとも、
newして作られたのはTestSubだから、TestSub::printが呼ばれるということ。
0565デフォルトの名無しさん2006/06/23(金) 00:59:23
C++使用で、厳しく求められる安全性とソースの共有の上で
・TCHAR [](固定長) による文字列とその処理
・(STL)std::basic_string<TCHAR> による文字列とその処理
・(MFC)CString による文字列とその処理
について考えているのですが、

C++でも文字列変数にTCHAR[]が多いのはなぜでしょうか?
安全性の要求があってもbasic_stringなどでなくTCHAR[](固定長)を使うのは
なにか理由があるのでしょうか?
0566デフォルトの名無しさん2006/06/23(金) 01:04:38
単純に、安全性が確保できているなら固定長配列でも問題ないと思う。
0567デフォルトの名無しさん2006/06/23(金) 01:04:48
>>565
WinAPIの引数がTCHARだからじゃない?
CStringはともかく、std::stringを使わない積極的理由は思いつかない。
0568デフォルトの名無しさん2006/06/23(金) 01:10:29
>>564

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

静的か動的かということですか。

なれないと難しい動きですね。
ありがとうございました。
0569デフォルトの名無しさん2006/06/23(金) 01:28:28
>>563

デストラクタに virtualがついているのも同じ理由。
動的にデストラクタを呼び出す為。

覚えると何かと便利だ。
0570デフォルトの名無しさん2006/06/23(金) 01:54:16
>>563
TestBase*と宣言しているから、生成したのはTestSubでも
virtualをつけなければ、単純にTestBase::print() が呼ばれる。

virtualをつけても実はTestBaseのメソッドしかアクセスできない。
virtualの場合、TestBase内にTestBase::print() 関数への
ポインタ変数が作られる。
そして、TestSubで生成するとTestBase内のこのポインタに
TestSub::print() へのアドレスが格納される。

TestBase::
 virtual print() ←  実は関数へのポインタ
 print() ←TestBase::print() の実体  ↑
                        |
                         |
TestSub::                   |
 print() ←TestSub::print() の実体 ---+
         TestSubの生成時にポインタをセット
0571デフォルトの名無しさん2006/06/23(金) 07:56:09
>>563
というか、そのコードというか考え方そのものがあまりよくない。
virtualを付ける/付けないで動きが違う理由は、上記の通りだけどね。
もう一度、継承する意味と多態性について勉強したほうがいいと思う。
0572デフォルトの名無しさん2006/06/23(金) 07:57:49
あ、書き忘れた。
ベースクラスの関数を隠蔽してしまう(上書きしてしまう)ような関数定義は、あまりよくないってこと。
0573デフォルトの名無しさん2006/06/23(金) 15:26:28
>>572
それには漏れは全く同意しない。ケースバイケースですらなく、1%も。
0574デフォルトの名無しさん2006/06/23(金) 15:30:06
>>573
理由は?
0575デフォルトの名無しさん2006/06/23(金) 15:38:01
virtual を付けてオーバーライドして動作を変えることを「あまりよくない」とする
理由が(オブジェクト指向を知らない人が混乱すること以外)存在しないし、
ふつうにポリモするときにはこれは必須。

virtual をつけずに(誤って)隠ぺいしてしまうことの問題は、昔からある一般的な
シンボルの衝突の問題であって、派生だ基底だという問題ではないから。
これは単に「関数名はよく考えてつけよう」という話。

virtual をつけずに意図して隠ぺいするのはテンプレート等メンバのシグネチャレベル
でのインタフェイスを維持するときに便利だし。

「確かにこれは悪い」っていう例がこれらの利点を打ち消すほどたくさんあれば、
考えを変えるけど。
0576デフォルトの名無しさん2006/06/23(金) 15:54:15
>>575
まぁ考え方の違いなんだろうけど、言語的に便利な場面で意図的に隠蔽するような
関数定義をするのは全く問題ないけど、多態性という文脈で考えたときに、どちらが
呼ばれるか混乱するという意味で、俺は隠蔽するのは良くないと思う。

一般的なシンボルの衝突、と言ってしまえばその通りかもしれないけど、オブジェクトに
よって同一のメッセージ(という単語を出すと荒れるような気がするが)に対して異なる
振る舞いをするというのが多態性の基本的な考え方なので、そうクールに切り捨てて
いい問題とは思わない。
0577デフォルトの名無しさん 2006/06/23(金) 15:59:12
//N=50で落ちるのはバグの性だったようです。これならN=100でも落ちない。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)*p = rand() % 2; }
void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)return;
block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);paint(block, i,N-1);
} } int main(){int block[N][N], *p, i = 1;srand(time(NULL));get_randam(block);make_ans(block);for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){
switch(*p){case 0: printf(" 1"); break; case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break;
}if(i % N == 0) putchar('\n'); } return 0;}
上のソースは、宿題レスでだいぶ前に俺が適当に問題提示してみた問題の答え(どなたかが答えたソースです)
-**-**
-*-*-*
*-****
**----
の*で囲まれてる所をすべて別の文字に埋めるっていう問題
で、問題出しただけで答えは自分自身わからなかったのですが
この答えのソース見てもどうやって、再帰つかって探索してるのかが
いったいどうやったらこういうのを思いつけるのかがわからないです。
センスもあるんでしょうが、パズルの解法とかの関連ページ見ても
わからずで。
どういう風に、再帰さして結果を出してるのか。
ヒントか、参考になるページとかあれば、どなたか教えてください。
■ このスレッドは過去ログ倉庫に格納されています