C言語なら俺に聞け( ..
[2ch|▼Menu]
697:デフォルトの名無しさん
07/11/02 18:09:13
初心者だが上に挙げた事例でどこら辺の物まで
実際のプログラムで活用されるの?

なんか、>>692とかわけわかめなんだ。


698:プリンがー
07/11/02 18:11:37
三角形の面積を求めよ。

#include <stdio.h>
int main (void)
{
double height teihen;
double S;

printf("height=");
scanf("%lf",&height);
printf("teihen=");
scanf("%lf",&height);

S=height*teihen/2;

printf("面積S=%f\n",S);
}

これであってますか?

699:プリンがー
07/11/02 18:20:13
e=1+1/1!+1/2!+・・・+1/10!を求めよ。

#include <stdio.h>
int main (void)
{
int i;
double e;

for(i=1;i<=10;i++){

e+=0.1+1/i!:

}
printf("e=%f\n",e);
return(0);
}
あってます?

700:デフォルトの名無しさん
07/11/02 18:21:53
constのポインタだと
どこらへんがおいしいの?

701:デフォルトの名無しさん
07/11/02 18:22:44
>>698
teihen の値が怖いwwwww


>>699
e+= が怖いwwwww

702:デフォルトの名無しさん
07/11/02 18:23:54
!

703:デフォルトの名無しさん
07/11/02 18:27:18
>>697
例えば、
Manpage of QSORT
URLリンク(www.linux.or.jp)

に、(char * const *) p1が出てくる。

704:デフォルトの名無しさん
07/11/02 18:34:47
e+=0.1+1/i!:

eが初期化してない。
1/i!なんて式初めて見た。

705:デフォルトの名無しさん
07/11/02 18:38:43
for(i=1;i<=10;i++)

のケースだと i! はいつも 0 になり、ゼロディバイドw

706:デフォルトの名無しさん
07/11/02 18:43:07
>>705
!iならそうだろうけど・・・。
i!でもおk

707:デフォルトの名無しさん
07/11/02 18:52:45
>>703
thx
使うときは使うんだな。もっかいポインタやりなおすわ。

708:プリンがー
07/11/02 19:10:08
>>701
teihenじゃなくどうすればいいですか?ippen?

>>704
初期化・・このときe=0の初期化が必要なんですか?

709:デフォルトの名無しさん
07/11/02 19:14:25
>>708
printf("teihen=");
scanf("%lf",&height); // テーヘンだ!テーヘンだ!

710:プリンがー
07/11/02 19:19:49
>>709
あ、入力ミスですw
変数名はteihenで構わないですよね?


711:デフォルトの名無しさん
07/11/02 19:21:09
>>708
>>698の自分のプログラムをよく見ましょう
単純なケアレスミス

あとCにはi!なんて記法は存在しません

712:プリンがー
07/11/02 19:28:03
>>711
そうなんですか。
そうした場合>>699の問題でプログラムの本体はどうすればいんですか?

713:デフォルトの名無しさん
07/11/02 19:29:56
>>712

まずn!の意味を考えると・・・

n! = 1*2*3*4*5 ・・・ * n


あとはそれをプログラムするだけ。

714:プリンがー
07/11/02 19:34:23
>>713
なるほど。
プログラム内に「・・・」の表記はありなんですか?

715:デフォルトの名無しさん
07/11/02 19:38:14
あまりにアホすぎて釣りにしか見えない

716:デフォルトの名無しさん
07/11/02 19:38:21
>>714
まず問題の前に書式の勉強をしておいで。

717:プリンがー
07/11/02 19:40:32
初心者なもんですんまそ。


718:プリンがー
07/11/02 19:46:23
なしですね。

719:デフォルトの名無しさん
07/11/02 19:58:25
本気だったならごめん
勉強がんばれ

720:プリンがー
07/11/02 20:00:47
>>719
ありがとうございます。


721:プリンがー
07/11/02 20:47:49
e=1+1/1!+1/2!+・・・+1/10!を求めよ。
これって関数使わずにプログラム作れますか?

722:デフォルトの名無しさん
07/11/02 20:51:06
mainもつかわずに?

723:プリンがー
07/11/02 20:51:09
>>721
追記
関数でfactorial使ってできるんだろな〜てのは分かるんですが関数の学習
はまだちょこっとしかしてなくて

724:デフォルトの名無しさん
07/11/02 20:51:53
ハンドルネーム使ってる時点で…なぁ

725:プリンがー
07/11/02 20:51:59
>>722
mainは使ってです。

726:デフォルトの名無しさん
07/11/02 20:52:24
プリプロセッサメタプログラミングで求めろってことか

727:デフォルトの名無しさん
07/11/02 20:53:00
作れるよ

728:デフォルトの名無しさん
07/11/02 20:53:24
>>723
そんなのしなくても出来る。

まずn!を計算する処理を考える、
それが出来たらnn!を計算する処理を考える
それが出来たら1/nn!を計算する処理を考える。

729:デフォルトの名無しさん
07/11/02 20:55:00
関数使って作れるならそれをインライン展開したものを考えてみよう

730:プリンがー
07/11/02 20:55:14
>>727
そうですか〜。
for〜if〜使えばいいのかな?

731:デフォルトの名無しさん
07/11/02 20:55:59
うん

732:プリンがー
07/11/02 20:59:16
>>728
n!が俺には謎めいてきたw

733:デフォルトの名無しさん
07/11/02 21:04:13
>>730
二重ループは知ってる?

734:プリンがー
07/11/02 21:07:24
>>733
はい。条件分岐はだいたい分かってます。

735:デフォルトの名無しさん
07/11/02 21:07:42
C言語結構粘るな。そろそろ終わってもいいと思うんだが

736:デフォルトの名無しさん
07/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:プリンがー
07/11/02 21:20:58
>>736
大変ありがとうございます。
ちなみにn=10とx=1.0は必要ないですよね!?


738:デフォルトの名無しさん
07/11/02 21:27:23
>>737
何故そう思う?

739:プリンがー
07/11/02 21:42:12
>>738
n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。
double/int→doubleここはなんて説明すればいいのか・・・

740:プリンがー
07/11/02 21:43:38
xは1.0のままだからボックスを作る必要がない。


741:デフォルトの名無しさん
07/11/02 21:44:52
>>738
>>736のコードが難しすぎたようだ。
初心者にe+=(x/=i);をぱっと理解できるとはおもえん。

742:デフォルトの名無しさん
07/11/02 21:45:00
1.0のままではありませんよ

743:プリンがー
07/11/02 21:57:17
>>742
なぜ1.0のままじゃないんですか??
めんどくさくなければ教えて下さい。

744:デフォルトの名無しさん
07/11/02 21:58:27
>>743

x /= i

x = x/i;
のこと。

x/iをxに代入する。

745:デフォルトの名無しさん
07/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:プリンがー
07/11/02 22:04:39
>>744
それは分かってます。
>>745
ちょっと説明間違ったかなー
分子は1.0のままでしょ


747:デフォルトの名無しさん
07/11/02 22:17:12
>>746
じゃあ1/3!は 0.5/3だって理解は出来る?
同様に 1/4!は 0.166/4

748:デフォルトの名無しさん
07/11/02 22:21:55
>>746
前回のループで計算したxが分子だよ

749:プリンがー
07/11/02 22:22:53
>>747
1/3!=(1/2)/3
1/4!=(1/6)/4

750:デフォルトの名無しさん
07/11/02 22:26:12
>>749
そうそう。
あれ、分子が1.0のまんま?はて?

751:プリンがー
07/11/02 22:27:29
>>750
頭が痛くなってきた。

752:デフォルトの名無しさん
07/11/02 22:29:31
e+=(x/=i);を分解すると、
x = x / i;
e = e + x;

xのところに直値で1.0を入れることはできない

753:デフォルトの名無しさん
07/11/02 22:29:48
>>751
つまり分子は1.0のままではない。って事。

1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5



754:プリンがー
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 22:35:47
>>754
意味は同じでしょ?
結果が同じならおk

757:デフォルトの名無しさん
07/11/02 22:36:03
>>755
比較は == で

758:デフォルトの名無しさん
07/11/02 22:36:26
>>755
switchで頼むわ・・・。

759:デフォルトの名無しさん
07/11/02 22:37:31
テーブル使おうや・・

760:デフォルトの名無しさん
07/11/02 22:38:11
Hi, Let's use array.

761:デフォルトの名無しさん
07/11/02 22:38:14
int year(void);
って関数じゃなくて変数の宣言をしたいんじゃないの

762:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/02 22:54:15
>>762
year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい

764:デフォルトの名無しさん
07/11/02 22:57:06
>>763
ああ、まあ、そっちの方が綺麗か
適当に脳内修正しといて

765:プリンがー
07/11/02 23:03:11
>>757
ですね。ちょいとプリントアウトでもして頭整理します。
ありがとです。

766:プリンがー
07/11/02 23:03:46
>>756だた。


767:デフォルトの名無しさん
07/11/02 23:29:09
>>755
それで警告が出るようにコンパイラオプションを指定しろ。
VC++なら/W4、gccなら-Wallとか。

768:デフォルトの名無しさん
07/11/02 23:30:17
ってそもそもエラーになるな、あほだ俺orez

769:デフォルトの名無しさん
07/11/02 23:30:30
>>767
警告っていうか、エラーにならないか?

770:プリンがー
07/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:デフォルトの名無しさん
07/11/02 23:44:47
>>770
やってみればいいじゃないか?

772:デフォルトの名無しさん
07/11/02 23:46:46
インクリメント・デクリメントできるのは整数型だけですよ

773:デフォルトの名無しさん
07/11/02 23:47:05
>>770
0.1刻みに増えると思う根拠は何だい?

774:プリンがー
07/11/02 23:47:06
>>771
コンパイラ?もってないからできない。

775:デフォルトの名無しさん
07/11/02 23:47:23
>>770
基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ
累積誤差が無視できない

776:プリンがー
07/11/02 23:48:24
>>772
なるほど。

777:デフォルトの名無しさん
07/11/02 23:48:42
>>774
今すぐインストールしなさい

778:デフォルトの名無しさん
07/11/02 23:50:40
コンパイラもなくコード書いてどーするwwwwwwwwwwwwwwwww

779:プリンがー
07/11/02 23:52:08
>>775
例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を
出力せよ。の場合ループを使わざるを得ないよね!?

780:デフォルトの名無しさん
07/11/02 23:53:06
>>779
そういう時は i += 0.1であって i++ではない。

781:デフォルトの名無しさん
07/11/02 23:53:16
>>779
ループは使うがループ変数は整数型でもできる

782:デフォルトの名無しさん
07/11/02 23:53:56
>>779
ループ変数にはintを使ってループの中で10.で割って使う

783:プリンがー
07/11/02 23:54:38
>>777
コンパイラ購入しないといけないでしょ?
ある程度入門書終わらせたら買うけど




784:デフォルトの名無しさん
07/11/02 23:54:45
一定時間ごとに処理を行うようなプログラムは
どのように作ればいいですか?


785:デフォルトの名無しさん
07/11/02 23:55:36
>>784
C標準だけではできない
割り込みとかポーリングとかOSやハードウェアをいじくる

786:デフォルトの名無しさん
07/11/02 23:56:04
>>783
google先生に 無料のコンパイラは無いか聞いてみれ

787:プリンがー
07/11/02 23:57:39
>>782
なるほどー!そうなのか

788:プリンがー
07/11/02 23:59:47
>>786
いつか聞いてみる!
いい道具だしてくれるかな〜ドラえもん

789:デフォルトの名無しさん
07/11/03 00:00:20
>>783
本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う
いろんなコンパイラがネットから無料でダウンロードできるしね

790:デフォルトの名無しさん
07/11/03 00:00:53
>>788
今すぐ聞け

791:プリンがー
07/11/03 00:05:00
>>789
そうんだ〜!とある人から聞いたら
コンパイラは買わないといけないよって聞いた!
あぶね〜

792:デフォルトの名無しさん
07/11/03 00:11:12
>>791
特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか)
MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある
勉強ならパソコンでやればいい

793:デフォルトの名無しさん
07/11/03 00:13:41
ああ

794:プリンがー
07/11/03 00:20:25
>>792
なるほど。
参考になった。


795:プリンがー
07/11/03 00:27:51
>>782
ループの前に整数を10で割るという変数を定義してて大丈夫でしょ!?

796:デフォルトの名無しさん
07/11/03 02:28:17
>>795
喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。
とっととコンパイラをインストールしてこい。
コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。

797:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/03 02:43:29
>>797
構文

799:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/03 04:28:06
変数やポインタについて質問なんですが、
それらが自分自身のメモリサイズを知っているのは何故なんですか?
例えば、
int a[3]={1,2,3};
printf("%d",*(a+1));
とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??

801:デフォルトの名無しさん
07/11/03 04:30:23
気にすんな

802:デフォルトの名無しさん
07/11/03 04:34:20
>>800
キニスルナ
あえて言うならコンパイラさんの秘密の小部屋の中だ


803:デフォルトの名無しさん
07/11/03 04:45:16
デジタルフィギュア
URLリンク(www.youtube.com)


804:デフォルトの名無しさん
07/11/03 04:49:05
>>800
そういう風に作られているからとしか言いようがない
CPUが変わるとコンパイラ変えないとだめでしょ?

805:デフォルトの名無しさん
07/11/03 04:49:31
>>801-802
ぅぅ…気になる。。
けど我慢します。
ありがとうございました。
どっかのメモリ上にいるんだろうけど…。
それを参照出来ないのかな…。。
気になる…寝れない。


806:デフォルトの名無しさん
07/11/03 04:51:21
>>805
そんなに気になるならアセンブラ勉強しろ
大抵のコンパイラはソース吐かせられるようになっているから
それを見れば一目瞭然なんだが

807:デフォルトの名無しさん
07/11/03 04:53:43
>>804,806
あ、なるほど。
レジスタにもメモリにもディスクにも記憶されてないんですね!?
ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。
なんとなく想像付きました。

808:デフォルトの名無しさん
07/11/03 04:57:45
>>800
intやcharのオフセットサイズが知りたいのならsizeof(int)でおk
但し、これらの結果は環境に依存するから注意が必要だ

809:デフォルトの名無しさん
07/11/03 05:01:20
>>807
CPUのアドレッシングモードを活用している場合もある
例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで
アドレスを算出している事が多い
RISCの場合は完全にコード内に組み込まれてしまう場合が多いね

810:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/03 05:43:32
c言語で、田 (←は辺の数2x2の例) のような図形の辺上での経路探索プログラムを作っているのですが、
自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、
辺の数を増やすと数時間では終わらなくなってしまいます。
なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。
再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。
再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら
目的位置までの経路を探索する、というものです。
どうすれば、非再帰にできるか助言頂けないでしょうか?

812:デフォルトの名無しさん
07/11/03 06:08:11
そうすを出しなさい

813:デフォルトの名無しさん
07/11/03 06:17:14
>>811
経路データをどう与えるんだ? あと一筆書きするって事?

814:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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
07/11/03 06:44:37
最大1000点の繋がりを処理できるプロクラム作ってやるぜ!

817:デフォルトの名無しさん
07/11/03 06:57:02
最短距離となる経路を知りたいのか?経路の総数を知りたいのか?目的がわからん。
経路の総数なら数式で出したほうがラクだと思うが。

818:815
07/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:デフォルトの名無しさん
07/11/03 08:07:29
>>810
user32.libをリンクしろ。

user32.libはPlatform SDKもしくはWindows SDKに入っている。
VC++ 2005への設定が容易な分、Windows SDKがおすすめ。

820:デフォルトの名無しさん
07/11/03 08:35:56
>>799
scanf()の戻り値を見て、0だったら終わればいい。

821:デフォルトの名無しさん
07/11/03 10:52:55
>>798
具体的にどこをどう直せばいいですか?

822:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/03 12:17:33
>>811
メモ化

再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの

824:815 出来たけどバグあるよ 直して使ってくれ
07/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 すこしなおした バグ取るか、参考として利用してくれ
07/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
07/11/03 15:17:37
もう少し悩んでみることにしました、ありがとうございました。

>>825
ソースまで公開して頂きありがとうございます。
じっくり読んで参考にします。

827:デフォルトの名無しさん
07/11/03 16:07:57

すみません。

struct


828:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/03 16:19:04
a[4]と宣言できる状態なら、客先の反応が正しいかな。

830:デフォルトの名無しさん
07/11/03 16:24:50
>>828
べつに問題ないと思うけど。
固定長で、配列で済むところでmalloc()なんか使うなって意味かな?
malloc()禁止だったら、可変長の配列はどうするんだろ。


831:デフォルトの名無しさん
07/11/03 16:31:19
>>828
それはそもそもCではエラーなわけだが。そのコードが通るなら、C++なのだからvectorかnewを使うべきだし。

832:デフォルトの名無しさん
07/11/03 16:32:26
「AAA* a = new AAA[4]で保証されていますの」

口調に萌えた

833:デフォルトの名無しさん
07/11/03 16:33:57
C99

834:デフォルトの名無しさん
07/11/03 16:35:28
>>830

回答ありがとうございます。
言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。

すみません。ついでに便乗質問なのですが

(1)
AAA aaa[30][30];
int x=...;
int y=...;
aaa[y][x]=...;

(2)
AAA aaa[30*30];
int x=...;
int y=...;
aaa[y*30+x]=...;

で(2)の使い方をしていたらこれも理解しづらいということで怒られました。
2次元配列のほうが処理的にも良いのでしょうか。

835:デフォルトの名無しさん
07/11/03 16:36:30
ここ見てると自分とのレベルの差が分かるんだが皆学生とかなのか?
レベルの差ってのは自分よりすげーってことね

836:デフォルトの名無しさん
07/11/03 16:37:20
(1)でいい状況でわざわざ(2)を選ぶ神経がわからない。

837:デフォルトの名無しさん
07/11/03 16:38:02
そりゃ、特別な理由がないかぎりa[30][30]と書くべきだろう。

838:デフォルトの名無しさん
07/11/03 16:39:57
>>834
(2)が明確に処理的に優れてることを示せないのに(2)を選んだ理由は?

839:デフォルトの名無しさん
07/11/03 16:40:15
「構造体のmallocなんてありえない!」
callocを使えということかな?

840:デフォルトの名無しさん
07/11/03 16:40:49
>>834
いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います。

私のところではパフォーマンスを要求する場合は(2)の形式でかつ、オフセット計算関数を用意することが多く、
そうでない場合には(1)の形式を配列の配列ではなく配列へのポインタ配列の形で使うことが多くなります。

841:デフォルトの名無しさん
07/11/03 16:46:45
>>834
> 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 

その担当者は、プログラム知らなさすぎなんじゃね?



842:834
07/11/03 16:46:55
>>838

処理的には
a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
計算したほうがよいのかなと思いまして。

>>839

担当者いわく、構造体の領域確保はできない、ない、ということらしいです。

843:デフォルトの名無しさん
07/11/03 16:49:51
>>842
>841に同意。後学の為に、その担当者の所属企業をお教え願えませんか?w

844:デフォルトの名無しさん
07/11/03 16:51:15
>>840
コードの可読性は(1)のほうがいいだろ。
パフォーマンスの問題なら、(2)のほうが何パーセント処理時間が短くなるとか、具体的な数字を見せて説得すれば
いいんじゃね?

845:デフォルトの名無しさん
07/11/03 16:51:51
>>842
>処理的には
>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
>計算したほうがよいのかなと思いまして。

だからなんで「よい」と思うのか教えてくれ。

846:デフォルトの名無しさん
07/11/03 16:52:00
>>842
>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思い
コンパイラの最適化をなめてはいけない。
2次元配列のほうが、より最適化される可能性が高い。

847:デフォルトの名無しさん
07/11/03 16:55:06
>>840
>いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います

>>842
>計算したほうがよいのかなと思いまして

自分なら、思うだけじゃ、可読性を犠牲にする気にはならないな
実測して優位性を証明しる

848:デフォルトの名無しさん
07/11/03 16:57:59
おまいらwwwここ見てみwwwwwww天才降臨wwwww

1 :以下、名無しにかわりましてVIPがお送りします。:2007/11/03(土) 14:02:12.45 ID:o3DHz8v00
URLリンク(id13.fm-p.jp)


裏絵バロスwwwwwwwwwwwww


やあ、ここのBBSのパス解析できたら明日おにゃのことセックルできるお(^ω^ )

スレリンク(news4vip板:698-698番)

849:デフォルトの名無しさん
07/11/03 17:06:48
int a[30][30];
int b[30*30];

int foo(int x, int y) {
return a[y][x];
}

int bar(int x, int y) {
return b[y * 30 + x];
}

gcc でコンパイルしたら、foo も bar も同じコードになった。
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ecx
movl 8(%ebp), %eax
popl %ebp
movl %ecx, %edx
sall $4, %edx
subl %ecx, %edx
addl %edx, %edx
addl %eax, %edx
movl _a(,%edx,4), %eax ;または _b(,%edx,4), %eax
ret


850:デフォルトの名無しさん
07/11/03 17:47:38
fseekについて教えてください。

fseekでファイルのヘッダ部分を飛ばしたいのですが
fseek(fp,???,SEEK_SET);

4行飛ばしたい、というときは第2引数はどうすればいいのでしょうか?
4行をバイトにどう直すのかわからなくて


851:デフォルトの名無しさん
07/11/03 17:54:06
ワロタw

852:デフォルトの名無しさん
07/11/03 17:56:39
1行を80バイトとしてCRとLFの2文字分を足して82バイト。
4行だから、82x4=328バイト分seekするというのはどうだろう?

853:デフォルトの名無しさん
07/11/03 18:01:55
>>852
ありがとうございます、やってみます

>>851
やり方がおかしいのか、おかしいことを言っているのでしょうか?
普通はどうやるんですか?

854:デフォルトの名無しさん
07/11/03 18:02:31
>>822
ありがとうございます。

855:デフォルトの名無しさん
07/11/03 18:10:11
>>853
1行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通

856:デフォルトの名無しさん
07/11/03 18:10:58
>>853 オイオイw

857:デフォルトの名無しさん
07/11/03 18:20:44
でも、データをストリームとして扱うようになったのはUnix以降じゃなかったか?
だからそれ以前の人ならそういう発想でも別に変でないかも。

858:デフォルトの名無しさん
07/11/03 18:51:46
何とかできました。

>>855
普通はそうなのですか…結構アナログな感じなのですね


ただ、すんません。疑問が増えました。
データをストリームとして扱う、の意味がわかりません


859:デフォルトの名無しさん
07/11/03 18:57:10
>> 850
現在位置を取得し、これをAとします。
getsを4回呼び出します。
現在位置を取得し、これをBとします。
fseekで現在位置をAの場所に戻します。
fseekB-Aバイト分現在位置を進めます。

860:デフォルトの名無しさん
07/11/03 18:58:30
>>858
「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。
これに対して、「固定長のブロックとして扱う」やりかたがあって、
ひとつひとつのカタマリが同じ大きさの場合に、
fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。

861:デフォルトの名無しさん
07/11/03 19:24:43
>>859-860
ありがとうございました。
今まで何も理解せずにプログラムしてたのだと思い知りました。。。


862:デフォルトの名無しさん
07/11/03 21:41:45
KOUZOUTAI data[num];

KOUZOUTAI *data
data = (struct Point *)malloc( sizeof(struct Point) * num );


の違いって何なのでしょうか?
どちらもnum分の構造体を確保していると思うのですが。


それとポインタの場合で二次元の構造体を確保する方法教えてください。

863:デフォルトの名無しさん
07/11/03 21:42:36
>>862
すません。
4行目はPointじゃなくて KOUZOUTAIです。

864:デフォルトの名無しさん
07/11/03 21:59:04
int data[10]

int *data = (int *)malloc(sizeof(int)*10)
の違いと同じ。

865:デフォルトの名無しさん
07/11/03 22:00:33
質問です。
ファイルの更新時刻を得るのってどうすればいいんでしょうか?

866:デフォルトの名無しさん
07/11/03 22:01:13
OS次第

867:デフォルトの名無しさん
07/11/03 22:07:28
右クリック → プロパティ

868:デフォルトの名無しさん
07/11/03 22:17:23
>>866
標準ライブラリにそういう関数が入ってたりしないってことでしょうか

869:デフォルトの名無しさん
07/11/03 22:23:21
>>868
ファイルシステムに依存する情報なんで、標準には入ってない

870:デフォルトの名無しさん
07/11/03 22:23:32
>>864
んー
その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず

あと2次元の構造体をポインタで確保する方法もお願いします

871:デフォルトの名無しさん
07/11/03 22:27:14
まず「二次元の構造体」を詳しく。
構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。

872:デフォルトの名無しさん
07/11/03 22:28:40
スコープを跨ぐことができない・できるの違いぐらいじゃない?
あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。

873:デフォルトの名無しさん
07/11/03 22:34:47
>>871
KOUZOUTAI data[10][10]
のようなことです。

二次元配列をポインタで確保するやり方調べてきます。やったことなくて。

>>872
なるほど。
というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?


874:デフォルトの名無しさん
07/11/03 22:49:42
KOUZOUTAI (*data)[10]

875:デフォルトの名無しさん
07/11/03 23:25:23
struct e{
int value;
};

int main(){
struct e **p,(*q)[5];
int i;

//こんな方法とか
p = (struct e**)malloc(10 * sizeof(struct e*));
for(i=0; i<9; ++i){
p[i] = (struct e*)malloc(5 * sizeof(struct e));
}

//こんな方法がある
q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e));

//こんな風に使う
p[0][0] = 0;
q[0][0] = 0;

//忘れずに解放
for(i=0; i<9; ++i){
free(p[i]);
}
free(p);
//qの方が解放は楽
free(q);

return 0;
}

876:875
07/11/03 23:26:22
繰り返し部分間違えた
for(i=0; i<9; ++i)

for(i=0; i<10; ++i)

877:デフォルトの名無しさん
07/11/03 23:38:36
**ばっかりでわかりにくいなぁ。

878:デフォルトの名無しさん
07/11/03 23:42:07
だいぶはしょりますが・・・
int i;
char b;
char a[] = "abcdefg";
scanf("%s",&b);
while(b != a[i])
i++;
・・・略
みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、
「char型はchar*型に変換できない」
というエラーが出ます。どうすればbの文字ををaの配列から参照できますか?
わかりにくくてごめんなさい

879:デフォルトの名無しさん
07/11/03 23:46:27
>>878
>534の下3行。

880:デフォルトの名無しさん
07/11/03 23:49:25
>>878
とりあえずそのようなエラーは出なかった

881:デフォルトの名無しさん
07/11/03 23:50:30
>>879
ありがとうございます。%cにすればいいってことですか…?

882:デフォルトの名無しさん
07/11/03 23:56:23
878ですが、エラーはでなくなったのですがどうやらwhileで無限ループがおきている気がします。
上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?

883:デフォルトの名無しさん
07/11/03 23:57:23
iを0で初期化してる?

884:デフォルトの名無しさん
07/11/04 00:01:00
>>883
しています。無限ループではなく他のどこかがおかしいのかもしれません。
もう一度しっかり見てみます。
ありがとうございました。

885:デフォルトの名無しさん
07/11/04 00:03:57
>>884
bにhを入れたらどこで止まると思う?

886:デフォルトの名無しさん
07/11/04 00:06:17
>>885
そうなると無限ですか?
でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。

887:デフォルトの名無しさん
07/11/04 00:08:04
whileに入る前にbに入ってる文字をprintfで確認したか?

888:デフォルトの名無しさん
07/11/04 00:08:12
出来る限り、はしょらないで載せてくれ
>>883みたいな細々したことを指摘しないといけなくなるから

889:デフォルトの名無しさん
07/11/04 00:08:54
>>886
その実際のソースを書け

890:デフォルトの名無しさん
07/11/04 00:12:11
>>878のソースで「char型はchar*型に変換できない」というエラーが出るというのが気になるんだが……
scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって

891:デフォルトの名無しさん
07/11/04 00:15:44
ごめんなさい
#include<stdio.h>
int main(void){
char a;
char letter[] = "abcdefghijklmnopqrstuvwxyz";
int i = 0;
printf("半角英小文字を1文字入力。:");
scanf("%s",&a);
while(a != letter[i])
i++;
printf("%s",letter[i]);
return 0;
}

です。


892:デフォルトの名無しさん
07/11/04 00:18:27
scanf指摘されたところ直ってないじゃん

893:デフォルトの名無しさん
07/11/04 00:20:18
>>891
%sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう

894:デフォルトの名無しさん
07/11/04 00:20:29
returnの位置

895:デフォルトの名無しさん
07/11/04 00:22:40
>>892
>>893
ありがとうございます。
>>894
何か場所おかしいですか?

896:デフォルトの名無しさん
07/11/04 00:23:01
>>892
直す前のを載せたんじゃないの?

>>891
printf("%s",letter[i]);

printf("%c",letter[i]);

897:デフォルトの名無しさん
07/11/04 00:23:21
バッファオーバーラン

898:デフォルトの名無しさん
07/11/04 00:26:45
>>897

899:デフォルトの名無しさん
07/11/04 00:32:21
みなさんありがとうございます。
おかげでなんとかできました。

1つ気になるのですが"%c"と" %c"の違いはなんですか?

900:デフォルトの名無しさん
07/11/04 01:04:58
>>899
%cと%sの違いなら、

・scanfの場合
%cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる
%sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加

・printfの場合
%cなら、引数として渡された数値に対応した一文字を標準出力に出力
%sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する

901:デフォルトの名無しさん
07/11/04 01:10:39
' '

902:デフォルトの名無しさん
07/11/04 01:22:51
>>900
ありがとうございます。
よくわかりました!

903:デフォルトの名無しさん
07/11/04 10:02:07
ところで、何が出来れば入門を卒業したことになるの?

904:デフォルトの名無しさん
07/11/04 10:25:43
言語の文法マスターしたぜ!もう学ぶことねぇwwww

え・・ポインタのポインタ?関数ポインタ?どうだったっけ?

まだまだだな俺 ←この辺から入門卒業

905:デフォルトの名無しさん
07/11/04 11:07:39
>>904
それ面白いなw
初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。

もう一歩踏み込む気構えが出来た頃合がそうなのかもね。

906:デフォルトの名無しさん
07/11/04 11:37:37
>>904
俺的にはそこで、宣言の問題だと気がついたら卒業としたい。

907:デフォルトの名無しさん
07/11/04 11:44:38
「このスレ卒業テスト」と称して課題を出せばいいんじゃね?

908:デフォルトの名無しさん
07/11/04 12:29:28
CでGUIアプリを作れたら入門者卒業

909:デフォルトの名無しさん
07/11/04 12:42:34
>>908
んなわけあるか

910:デフォルトの名無しさん
07/11/04 12:57:44
>>908
コピペで終わりじゃねーかw

911:デフォルトの名無しさん
07/11/04 14:17:19
ポインタが理解できたら入門者卒業

912:デフォルトの名無しさん
07/11/04 14:24:09
ポインタも
*****pくらいついたらわけがわかりません。

const ***p
***const p
とかなったらわかりません

関数ポインタなんて使ったことありません。なんで使うんですか。
GUIなんて作ったことなんてありません

でも入門卒業したいです><

913:デフォルトの名無しさん
07/11/04 14:57:08
関数ポインタの使い道が分からないなら卒業は無理だな

914:デフォルトの名無しさん
07/11/04 15:13:41
関数ポインタは便利だけど、あまり使うことはないですよ。
私は、DLLを使うときくらいですかね。

915:デフォルトの名無しさん
07/11/04 15:17:29
卒業せんでも中退すれば

916:デフォルトの名無しさん
07/11/04 15:37:45
typedef struct
{
char *str;
int (*myfunc)();
} object;

int main()
{
object obj;
obj->str = malloc(sizeof(char) * 256);
fgets(obj->str, 256, stdin);
obj->myfunc();
puts(obj->str);
free(obj->str);
return 0;
}

int myfunc()
{

}


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5161日前に更新/251 KB
担当:undef