1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
730 名前:プリンがー mailto:aaa [2007/11/02(金) 20:55:14 ] >>727 そうですか〜。 for〜if〜使えばいいのかな?
731 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:59 ] うん
732 名前:プリンがー mailto:aaa [2007/11/02(金) 20:59:16 ] >>728 n!が俺には謎めいてきたw
733 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:04:13 ] >>730 二重ループは知ってる?
734 名前:プリンがー mailto:aaa [2007/11/02(金) 21:07:24 ] >>733 はい。条件分岐はだいたい分かってます。
735 名前:デフォルトの名無しさん [2007/11/02(金) 21:07:42 ] C言語結構粘るな。そろそろ終わってもいいと思うんだが
736 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:12:35 ] 答えはこのとおりだが、自分で考えたいだろうから読みにくくしている。 考え方だけ参考にして。ちなみに行儀の悪いコーディングの例でもあります #include<stdio.h> int main(void){int i,n=10; double e=1.0,x=1.0;for(i=1; i<=n;i++)e+=(x/=i);printf( "%f\n",e);return 0;}
737 名前:プリンがー mailto:aaa [2007/11/02(金) 21:20:58 ] >>736 大変ありがとうございます。 ちなみにn=10とx=1.0は必要ないですよね!?
738 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:27:23 ] >>737 何故そう思う?
739 名前:プリンがー mailto:aaa [2007/11/02(金) 21:42:12 ] >>738 n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。 double/int→doubleここはなんて説明すればいいのか・・・
740 名前:プリンがー mailto:aaa [2007/11/02(金) 21:43:38 ] xは1.0のままだからボックスを作る必要がない。
741 名前:デフォルトの名無しさん [2007/11/02(金) 21:44:52 ] >>738 >>736 のコードが難しすぎたようだ。 初心者にe+=(x/=i);をぱっと理解できるとはおもえん。
742 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:45:00 ] 1.0のままではありませんよ
743 名前:プリンがー mailto:aaa [2007/11/02(金) 21:57:17 ] >>742 なぜ1.0のままじゃないんですか?? めんどくさくなければ教えて下さい。
744 名前:デフォルトの名無しさん [2007/11/02(金) 21:58:27 ] >>743 x /= i は x = x/i; のこと。 x/iをxに代入する。
745 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:58:46 ] >>739 の解釈だと >>736 は e=1 + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10 ってことになるよ とりあえず x の値を表示させてみては?
746 名前:プリンがー mailto:aaa [2007/11/02(金) 22:04:39 ] >>744 それは分かってます。 >>745 ちょっと説明間違ったかなー 分子は1.0のままでしょ
747 名前:デフォルトの名無しさん [2007/11/02(金) 22:17:12 ] >>746 じゃあ1/3!は 0.5/3だって理解は出来る? 同様に 1/4!は 0.166/4
748 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:55 ] >>746 前回のループで計算したxが分子だよ
749 名前:プリンがー mailto:aaa [2007/11/02(金) 22:22:53 ] >>747 1/3!=(1/2)/3 1/4!=(1/6)/4
750 名前:デフォルトの名無しさん [2007/11/02(金) 22:26:12 ] >>749 そうそう。 あれ、分子が1.0のまんま?はて?
751 名前:プリンがー mailto:aaa [2007/11/02(金) 22:27:29 ] >>750 頭が痛くなってきた。
752 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:29:31 ] e+=(x/=i);を分解すると、 x = x / i; e = e + x; xのところに直値で1.0を入れることはできない
753 名前:デフォルトの名無しさん [2007/11/02(金) 22:29:48 ] >>751 つまり分子は1.0のままではない。って事。 1/3!=(1/2!)/3 1/4!=(1/3!)/4 1/5!=(1/4!)/5
754 名前:プリンがー mailto:aaa [2007/11/02(金) 22:33:33 ] >>753 てか階乗の意味ってもともと 1/3!=(1/2!)/3 1/4!=(1/3!)/4 1/5!=(1/4!)/5 なの? 1/3!=1/1*2*3 1/4!=1/1*2*3*4 1/5!=1/1*2*3*4*5 じゃなくて?
755 名前:デフォルトの名無しさん [2007/11/02(金) 22:34:04 ] 西暦を入力すると干支が出るようにしたいんですが、何が違うのかわかりません。教えてください if文が全般的に違うようです。 #include<stdio.h> main() { int year(void); printf("西暦・・・"); scanf("%d", &year); if(year % 12 = 2) {printf("%d 年は戌年",year);} else if(year % 12 = 3) {printf("%d年は亥年\n",year);} else if(year % 12 = 4) {printf("%d年は子年\n",year);} else if(year % 12 = 5) {printf("%d年は丑年\n",year);} else if(year % 12 = 6) {printf("%d年は寅年\n",year);} else if(year % 12 = 7) {printf("%d年は卯年\n",year);} else if(year % 12 = 8) {printf("%d年は辰年\n",year);} else if(year % 12 = 9) {printf("%d年は巳年\n",year);} else if(year % 12 = 10) {printf("%d年は午年\n",year);} else if(year % 12 = 11) {printf("%d年は未年\n",year);} else if(year % 12 = 0) {printf("%d年は申年\n",year);} else {printf("%d年は酉年\n",year);} return 0; }
756 名前:デフォルトの名無しさん [2007/11/02(金) 22:35:47 ] >>754 意味は同じでしょ? 結果が同じならおk
757 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:36:03 ] >>755 比較は == で
758 名前:デフォルトの名無しさん [2007/11/02(金) 22:36:26 ] >>755 switchで頼むわ・・・。
759 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:37:31 ] テーブル使おうや・・
760 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:11 ] Hi, Let's use array.
761 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:14 ] int year(void); って関数じゃなくて変数の宣言をしたいんじゃないの
762 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:50:41 ] >>757-761 お前らそんな一気に言ったら>>755 が可哀想だろw >>755 これを参考に。 #include<stdio.h> const char *eto[] = {"申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"} int main(){ int year; printf("西暦・・・"); scanf("%d", &year); printf("%d年は%s",year, eto[year%12]); return 0; }
763 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:54:15 ] >>762 year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい
764 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:57:06 ] >>763 ああ、まあ、そっちの方が綺麗か 適当に脳内修正しといて
765 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:11 ] >>757 ですね。ちょいとプリントアウトでもして頭整理します。 ありがとです。
766 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:46 ] >>756 だた。
767 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:29:09 ] >>755 それで警告が出るようにコンパイラオプションを指定しろ。 VC++なら/W4、gccなら-Wallとか。
768 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:17 ] ってそもそもエラーになるな、あほだ俺orez
769 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:30 ] >>767 警告っていうか、エラーにならないか?
770 名前:プリンがー mailto:aaa [2007/11/02(金) 23:43:00 ] for(i=0.5;i<=8.2;i++) このときのi++は0.1刻みに増え(i=i+0.1)ますか? それとも1ずつ増え(i=i+1)ますか?
771 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:44:47 ] >>770 やってみればいいじゃないか?
772 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:46:46 ] インクリメント・デクリメントできるのは整数型だけですよ
773 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:05 ] >>770 0.1刻みに増えると思う根拠は何だい?
774 名前:プリンがー mailto:aaa [2007/11/02(金) 23:47:06 ] >>771 コンパイラ?もってないからできない。
775 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:23 ] >>770 基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ 累積誤差が無視できない
776 名前:プリンがー mailto:aaa [2007/11/02(金) 23:48:24 ] >>772 なるほど。
777 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:48:42 ] >>774 今すぐインストールしなさい
778 名前:デフォルトの名無しさん [2007/11/02(金) 23:50:40 ] コンパイラもなくコード書いてどーするwwwwwwwwwwwwwwwww
779 名前:プリンがー mailto:aaa [2007/11/02(金) 23:52:08 ] >>775 例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を 出力せよ。の場合ループを使わざるを得ないよね!?
780 名前:デフォルトの名無しさん [2007/11/02(金) 23:53:06 ] >>779 そういう時は i += 0.1であって i++ではない。
781 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:16 ] >>779 ループは使うがループ変数は整数型でもできる
782 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:56 ] >>779 ループ変数にはintを使ってループの中で10.で割って使う
783 名前:プリンがー mailto:aaa [2007/11/02(金) 23:54:38 ] >>777 コンパイラ購入しないといけないでしょ? ある程度入門書終わらせたら買うけど
784 名前:デフォルトの名無しさん [2007/11/02(金) 23:54:45 ] 一定時間ごとに処理を行うようなプログラムは どのように作ればいいですか?
785 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:55:36 ] >>784 C標準だけではできない 割り込みとかポーリングとかOSやハードウェアをいじくる
786 名前:デフォルトの名無しさん [2007/11/02(金) 23:56:04 ] >>783 google先生に 無料のコンパイラは無いか聞いてみれ
787 名前:プリンがー mailto:aaa [2007/11/02(金) 23:57:39 ] >>782 なるほどー!そうなのか
788 名前:プリンがー mailto:aaa [2007/11/02(金) 23:59:47 ] >>786 いつか聞いてみる! いい道具だしてくれるかな〜ドラえもん
789 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:20 ] >>783 本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う いろんなコンパイラがネットから無料でダウンロードできるしね
790 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:53 ] >>788 今すぐ聞け
791 名前:プリンがー mailto:aaa [2007/11/03(土) 00:05:00 ] >>789 そうんだ〜!とある人から聞いたら コンパイラは買わないといけないよって聞いた! あぶね〜
792 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:11:12 ] >>791 特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか) MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある 勉強ならパソコンでやればいい
793 名前:デフォルトの名無しさん [2007/11/03(土) 00:13:41 ] ああ
794 名前:プリンがー mailto:aaa [2007/11/03(土) 00:20:25 ] >>792 なるほど。 参考になった。
795 名前:プリンがー mailto:aaa [2007/11/03(土) 00:27:51 ] >>782 ループの前に整数を10で割るという変数を定義してて大丈夫でしょ!?
796 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:28:17 ] >>795 喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。 とっととコンパイラをインストールしてこい。 コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。
797 名前:デフォルトの名無しさん [2007/11/03(土) 02:40:36 ] 生まれた年を入力することによって今年何歳になるかを表示するようにしようとしたのですが、何が間違っているかわかりません。 #include<stdio.h> int tosi(int a,int b); return a - b; main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
798 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:43:29 ] >>797 構文
799 名前:デフォルトの名無しさん [2007/11/03(土) 03:46:22 ] 配列の入力の時に,EOFだと-1入力で終了になりますよね? 改行で入力終了にしたいのですが,どうすればいいですか? 1 1 0 0 1 0 1 1 改行 で入力を終了したいです。 教えてください。よろしくお願いします。 //---- 配列入力 num = 0; do { scanf("%d", &arr[num]); } while ( arr[num++] != EOF ); // 改行は入力の終了 num--; // 有効な入力数
800 名前:デフォルトの名無しさん [2007/11/03(土) 04:28:06 ] 変数やポインタについて質問なんですが、 それらが自分自身のメモリサイズを知っているのは何故なんですか? 例えば、 int a[3]={1,2,3}; printf("%d",*(a+1)); とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??
801 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:30:23 ] 気にすんな
802 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:34:20 ] >>800 キニスルナ あえて言うならコンパイラさんの秘密の小部屋の中だ
803 名前:デフォルトの名無しさん mailto:age [2007/11/03(土) 04:45:16 ] デジタルフィギュア www.youtube.com/watch?v=9OHe2h3sZL0
804 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:05 ] >>800 そういう風に作られているからとしか言いようがない CPUが変わるとコンパイラ変えないとだめでしょ?
805 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:31 ] >>801-802 ぅぅ…気になる。。 けど我慢します。 ありがとうございました。 どっかのメモリ上にいるんだろうけど…。 それを参照出来ないのかな…。。 気になる…寝れない。
806 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:51:21 ] >>805 そんなに気になるならアセンブラ勉強しろ 大抵のコンパイラはソース吐かせられるようになっているから それを見れば一目瞭然なんだが
807 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:53:43 ] >>804 ,806 あ、なるほど。 レジスタにもメモリにもディスクにも記憶されてないんですね!? ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。 なんとなく想像付きました。
808 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:57:45 ] >>800 intやcharのオフセットサイズが知りたいのならsizeof(int)でおk 但し、これらの結果は環境に依存するから注意が必要だ
809 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:01:20 ] >>807 CPUのアドレッシングモードを活用している場合もある 例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで アドレスを算出している事が多い RISCの場合は完全にコード内に組み込まれてしまう場合が多いね
810 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:02:23 ] #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "ないよう", "たいとる", MB_OK); return 0; } XP2、VC++2005Express、cl.exeなんですが、たったこれだけのソースなのに以下のエラーが出てコンパイルできません。 なんでなんだぜ? test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。 test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
811 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:43:32 ] c言語で、田 (←は辺の数2x2の例) のような図形の辺上での経路探索プログラムを作っているのですが、 自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、 辺の数を増やすと数時間では終わらなくなってしまいます。 なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。 再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。 再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら 目的位置までの経路を探索する、というものです。 どうすれば、非再帰にできるか助言頂けないでしょうか?
812 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:08:11 ] そうすを出しなさい
813 名前:デフォルトの名無しさん [2007/11/03(土) 06:17:14 ] >>811 経路データをどう与えるんだ? あと一筆書きするって事?
814 名前:デフォルトの名無しさん [2007/11/03(土) 06:26:38 ] 1、2、・・・N 点に対して (1,2) (4,8)という風にデータを与えればいいか ただし(a,b)書いたときa<bとしaとbはつながっているとする 前回にすすんだ経路を記録しておいて、進んだときにその経路を消していけばいいのでは? 戻るときは前回のデータを復元していく たとえば、A=(a1,a2)などとして、ABCDEFGという繋がりが与えられれば、各段階でAからGの経路へ進めるということを繰り返す 初めに(進めるとして)Aへ進めたらBCDEFGが残る 次にAを進めようとするがここは残っていない BCD・・・とチェックしていく
815 名前:デフォルトの名無しさん [2007/11/03(土) 06:36:49 ] 繋がりの個数 N、 繋がり (a0,b0)・・・(a(N-1), b(N-1)) 探索の深さ d 現在の探索位置 k0,・・・k(N-1) 現在位置 x i = 0・・・N-1 xから繋がり(ai,bi)で移動できるか 出来るならkd = i、d++ とし繋がりを消す すべての繋がりがなくなれば成功でリターンする どの繋がりにも行けないならd--。kdのつながりを復元して上へ戻る もしd=0なら失敗でリターンする
816 名前:815 [2007/11/03(土) 06:44:37 ] 最大1000点の繋がりを処理できるプロクラム作ってやるぜ!
817 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:57:02 ] 最短距離となる経路を知りたいのか?経路の総数を知りたいのか?目的がわからん。 経路の総数なら数式で出したほうがラクだと思うが。
818 名前:815 [2007/11/03(土) 07:15:55 ] ねむくなりました とちゆうまで貼り付けておきます #include <iostream> #include <time.h> using namespace std; main(){ unsigned int A[32768]; int n,a,b,c; for(n=0;n<32768;n++)A[n]; for(n=0;n<20000;n++){ a=rand()%1024;b=rand()%1024; if(a!=b){c=a+1024*b; A[c/32] |= 1<<(c%32);}} int v[10000],d=0,x=0; for(n=0;n<10000;n++)v[n]=0; for(n=v[d];n<1024*1024;n++) if( (A[n/32]>>(n%32))&1 ){ a=n>>10 ; b=n%1024; if(x==a){x=b;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} else if(x==b){x=a;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} } }
819 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:07:29 ] >>810 user32.libをリンクしろ。 user32.libはPlatform SDKもしくはWindows SDKに入っている。 VC++ 2005への設定が容易な分、Windows SDKがおすすめ。
820 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:35:56 ] >>799 scanf()の戻り値を見て、0だったら終わればいい。
821 名前:デフォルトの名無しさん [2007/11/03(土) 10:52:55 ] >>798 具体的にどこをどう直せばいいですか?
822 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 10:58:41 ] >>821 #include<stdio.h> int tosi(int a,int b){ return a - b; } main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
823 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:17:33 ] >>811 メモ化 再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの
824 名前:815 出来たけどバグあるよ 直して使ってくれ [2007/11/03(土) 14:24:44 ] #include <iostream> #define TEN 3 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)return 0; d--;n=y[d];a=n%TEN; b=n/TEN; if(a==x)x=b;else x=a; A[c/32]|=1<<(c%32);s++; y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu-s;n++)cout<<z[n]<<"→";}
825 名前:815 すこしなおした バグ取るか、参考として利用してくれ [2007/11/03(土) 15:04:39 ] #include <iostream> #define TEN 20 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<TEN;n++)z[n]=-1;for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)break; z[d]=-1;d--;x=z[d]; A[n/32]|=1<<(n%32); s++;y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu;n++)cout<<z[n]<<"→";}
826 名前:>>811 mailto:sage [2007/11/03(土) 15:17:37 ] もう少し悩んでみることにしました、ありがとうございました。 >>825 ソースまで公開して頂きありがとうございます。 じっくり読んで参考にします。
827 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:07:57 ] すみません。 struct
828 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:12:56 ] すみません。質問です。 struct AAA{ : : }; AAA* a = (AAA*)malloc(sizeof(AAA)*4); とコーディングしていたら客先の担当者からおこられました。 「一応サイズは保証されているけどそれはAAA a[4]ではない」、と。 C++では AAA* a = new AAA[4]で保証されていますの、といったら 「それはC++だからでしょ?」といわれました・・・・。 AAA* a = (AAA*)malloc(sizeof(AAA)*4);ってやっちゃいけないんですか?
829 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:19:04 ] a[4]と宣言できる状態なら、客先の反応が正しいかな。
830 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:24:50 ] >>828 べつに問題ないと思うけど。 固定長で、配列で済むところでmalloc()なんか使うなって意味かな? malloc()禁止だったら、可変長の配列はどうするんだろ。