[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/28 00:11 / Filesize : 251 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 20



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()禁止だったら、可変長の配列はどうするんだろ。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef