C言語なら俺に聞け(入門篇) Part 21
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/11/07(水) 06:24:18・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 20
http://pc11.2ch.net/test/read.cgi/tech/1192455273/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
http://pc11.2ch.net/test/read.cgi/tech/1194262698/
0002デフォルトの名無しさん
2007/11/07(水) 06:25:04Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
0003デフォルトの名無しさん
2007/11/07(水) 06:25:50ともあれ>>1乙
0004デフォルトの名無しさん
2007/11/07(水) 07:46:40現在WAVEの単純音データに離散フーリエ変換を行ってそのデータをExcelでグラフ化しているのですが
フーリエが終わってデータを格納した後、それをグラフにおこして別窓で表示させたいのですがどのようなプログラムをかけばいいのでしょうか?
またそのような事が詳しくかかれているHPなど参考になるところがありましたら是非紹介をお願いします。
わかりにくくてすみません。
0005デフォルトの名無しさん
2007/11/07(水) 13:09:44窓の開き方がわからないとか、図形の表示の仕方がわからない?
その場合は Win32 API を勉強
0006デフォルトの名無しさん
2007/11/07(水) 13:23:410007デフォルトの名無しさん
2007/11/07(水) 14:51:32上記とは別にルーレット選択とボルツマン選択のサンプルプログラムもよろしくお願いします。
プログラムはC言語でお願いします。 どうもこれらがイメージつかないんでお願いします。
0008デフォルトの名無しさん
2007/11/07(水) 15:30:37スレ違い。
つーか、マルチすんなや。
http://pc11.2ch.net/test/read.cgi/tech/1193150915/961
http://pc11.2ch.net/test/read.cgi/tech/1193556424/227
ちゃんと↑の228にレスついているだろ。
0009デフォルトの名無しさん
2007/11/07(水) 15:43:420010デフォルトの名無しさん
2007/11/07(水) 15:54:26違う。つーか、入門者はそんなこと気にしなくて構いません。
0011デフォルトの名無しさん
2007/11/07(水) 15:57:520012sage
2007/11/07(水) 16:01:08ちょっと気にしてるんだよ。
やっぱgccか・・・?
デバッガ使うスキルがないんで確認ができないんだよね。
0013デフォルトの名無しさん
2007/11/07(水) 16:03:15アセンブリ出力を読むスキルもない?
例えば、callってニモニックがどこに散らばっているか位読めれば末尾再帰が展開されたかどうか判るんだけど。
つーか、スレ違い脱中年。
0014デフォルトの名無しさん
2007/11/07(水) 16:03:350015デフォルトの名無しさん
2007/11/07(水) 16:05:190016デフォルトの名無しさん
2007/11/07(水) 18:33:55-S でいいだろ
0017デフォルトの名無しさん
2007/11/07(水) 18:37:49VCだったら /FA かな
0018デフォルトの名無しさん
2007/11/07(水) 20:04:57コマンドラインからパスワード等の入力をするときは、標準入力にパスワードを入力してるのに
画面には入力した文字を表示しないようになってるよね。これってどうやって実装してるんですか?
fgets()などのC言語のライブラリ関数では、どうやればいいかわからない。。
0019デフォルトの名無しさん
2007/11/07(水) 20:30:32を読めば分かると思うが、通常は打った文字はechoされて画面に出る。
が、しかし、echoフラグを一時的に切れるような、getpassあたりの関数を使えば隠す事が可能になる。
詳しい実装方法は、getpass関数のソースを読めばわかると思うよ。
0021デフォルトの名無しさん
2007/11/07(水) 22:44:27struct e{
int value[];
};
を
int temp[256]
e num[256].value[256];
と宣言して
temp[i]にnumのvalueを一時的にまとめてコピーしたいのですが
temp[i]=num[i].value[];
といったことはできるのでしょうか?
0022デフォルトの名無しさん
2007/11/07(水) 22:51:470023デフォルトの名無しさん
2007/11/07(水) 22:58:20そのためにmemcpyがあるのですね。
できました。ありがとうございましt
0024デフォルトの名無しさん
2007/11/07(水) 23:26:07temp[]に
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
の縦の行、つまり 0 4 8 12 を一度に入れたいのですが
そういうやり方はfor使うしかないですかね
0025デフォルトの名無しさん
2007/11/07(水) 23:34:42gccだったら?
0026デフォルトの名無しさん
2007/11/07(水) 23:36:22一度にって表現がよくわからない。
0027デフォルトの名無しさん
2007/11/07(水) 23:39:260028デフォルトの名無しさん
2007/11/07(水) 23:44:570029デフォルトの名無しさん
2007/11/07(水) 23:46:240030デフォルトの名無しさん
2007/11/07(水) 23:51:22サンクス。
0031デフォルトの名無しさん
2007/11/07(水) 23:53:25二次元配列がメモリ上でどうなってるか考えてみればすぐわかるだろうに。
0032デフォルトの名無しさん
2007/11/08(木) 00:13:35まだまだトーシローな俺は
二次元配列のような格納できる関数でもあるのかとおもっちまったぜ・・・
0033デフォルトの名無しさん
2007/11/08(木) 00:19:20そうですね。諦めました
人間諦めが肝心
0034デフォルトの名無しさん
2007/11/08(木) 10:44:09struct e{
int value[256];
};
e tmp;
e num[256];
tmp = num[i];
0035デフォルトの名無しさん
2007/11/08(木) 12:58:14構造体同士の代入はできて配列同士の代入はできないて理不尽じゃね?
0036デフォルトの名無しさん
2007/11/08(木) 14:14:01いや別に。Cでは配列をそのまま扱うことはできないと諦めているからどうでもいいよ。
どうせ、関数にそのまま渡すことさえできないんだから。
0037デフォルトの名無しさん
2007/11/08(木) 14:23:10マルチ乙
0038デフォルトの名無しさん
2007/11/08(木) 14:34:56理不尽っつぅかそういう考え方なんだな。配列は一つの纏まったオブジェクトではない、と。
一つの纏まったオブジェクトにしたいなら、上のように構造体で包めばいい。
0039デフォルトの名無しさん
2007/11/08(木) 16:46:00マイナスの符号とかがあると変わってしまって表が汚くなります
0040デフォルトの名無しさん
2007/11/08(木) 16:51:290041デフォルトの名無しさん
2007/11/08(木) 16:58:330042デフォルトの名無しさん
2007/11/08(木) 17:01:40どうも!
0043デフォルトの名無しさん
2007/11/08(木) 17:44:24構造体も配列同様、コピーできなかったのも今は昔。
0044デフォルトの名無しさん
2007/11/08(木) 17:49:200045デフォルトの名無しさん
2007/11/08(木) 17:52:540046デフォルトの名無しさん
2007/11/08(木) 18:01:16IEEE754であれば、表わすことができる最大値が1e308程度なので、商がその値を超えなければ(精度は兎も角)解は得られる。
つまり、1/1e-308は1e308だが、10/1e-308は1e309なので無限大になってしまう。
尤も、無限大になっても特に危険はないので安心して0で割ればいいと思う。
0047デフォルトの名無しさん
2007/11/08(木) 18:05:381 / -1e-320はちゃんと-Infになるからね。
0048デフォルトの名無しさん
2007/11/08(木) 18:46:180で割るととまってしまうんですが・・・
0049デフォルトの名無しさん
2007/11/08(木) 18:49:53スゲー便利
0050デフォルトの名無しさん
2007/11/08(木) 20:06:220の除算をしたらプログラム割り込みが発生し、強制終了となる。
0051デフォルトの名無しさん
2007/11/08(木) 20:34:160052デフォルトの名無しさん
2007/11/08(木) 23:29:450で割ってるのに気がつかなくてはまったことがある
0053デフォルトの名無しさん
2007/11/09(金) 00:32:251
0
-1
-2
というテキストファイルinput.txtをscanfを使ってリダイレクトで、
scanf.exe<input.txt >output.txt
というようにして読み込みたいのですが、
for(i=0;i<100;i++){
scanf("%d",&c[i]);
tmp=i;
if(c[i]==EOF){
break
}
として、ファイルの終端まで読もうとすると、-1の行までしか読み込みません。
-2まで読み込んでファイルの終端で読み込みを完了させるにはどうしたらよいのでしょうか?
scanfとリダイレクトは絶対使わなければならないので、そこ以外を変更することで対処したいのです。
0054デフォルトの名無しさん
2007/11/09(金) 00:41:59scanfの戻り値を見ろ。あるいはscanf後にfeof(stdin)を見るという手も使えると思う。
0055デフォルトの名無しさん
2007/11/09(金) 05:47:16EOFとの比較は、「ほにゃららの場合はEOFになる」と明記されたものと行います。
例えばfgetc()のリターン値とか。
0056デフォルトの名無しさん
2007/11/09(金) 13:55:01dp=(double*)malloc(sizeof double);
コンパイル通らないよ
どうすればいい
0057デフォルトの名無しさん
2007/11/09(金) 13:59:32か
sizeof *dp
で
0058デフォルトの名無しさん
2007/11/09(金) 14:00:360059デフォルトの名無しさん
2007/11/09(金) 14:01:330060デフォルトの名無しさん
2007/11/09(金) 14:39:24for(i = 0; i < n; i++) used[i]=NO;
perm(0);
return(0);
}
void perm(int d)
{
int i,j;
int b[MAXN];
int s = adj[a[0]][a[n-1]];
if(d == n){
for(i = 0; i < n-1; i++){
s+=adj[a[i]][a[i+1]];
}
}
else {
for (i = 0; i < n; i++) {
if (used[i] == NO) {
a[d] = i;
used[i] = YES;
perm(d + 1);
used[i] = NO;
}
}
}
}
これだけだとただの列挙になってしまいます
最小値だけをだすにはどうしたらいいでしょうか?
0061デフォルトの名無しさん
2007/11/09(金) 19:05:00ありがとうございます。
ちょっと詳しくしらべてみます。
0062デフォルトの名無しさん
2007/11/10(土) 00:00:54int *x;
int y;
};
にして
p = (struct Point *)malloc( sizeof(struct Point) *10 );
p->x=(int *)malloc(sizeof(int)*10);
とメモリを確保したら
p[0〜9].x[0〜9] のメモリが確保されているということですよね。
p[1].x = 10;
とやったらxに10が入ると思ったのですが入らないのはなんでですか?
0063デフォルトの名無しさん
2007/11/10(土) 00:03:00#include <stdio.h>
int main(void)
{
int a,i,j;
printf("何段ですか? ");
scanf("%d",&a);
for(i=1;i<=a;i++){
for(j=1;j<=i-1;j++)
putchar(' ');
for(j=1;ここの部分がわかりません;j++)
putchar('*');
putchar('\n');
}
return(0);
}
助言をお願いします
0064デフォルトの名無しさん
2007/11/10(土) 00:03:44p[1].x[1] = 10;
こう入れないとだめなんですね
んで、 p[0].x[0] = 10;
だと表示ができるのですが
p[1].x[1] = 10;
だとエラーが出てしまいます。なんででしょうか
0065デフォルトの名無しさん
2007/11/10(土) 00:21:11p = (struct Point *)malloc( sizeof(struct Point) *10 );
ここでp10個分、p[10]が確保されてるので
for(i = 0;i < 10;i++) p[i]->x = (int *)malloc(sizeof(int)*10);
で各xには別のx[10]分を確保
0066デフォルトの名無しさん
2007/11/10(土) 00:22:29もし>>62の通りのプログラムなら、p[0]のxしか確保されてない
p->x=(int *)malloc(sizeof(int)*10); //p->xはp[0].xと同義
全てのpについてxを確保するなら以下のように繰り返しを使う
for(i=0; i<10; ++i){
p[i].x=(int *)malloc(sizeof(int)*10);
}
0067デフォルトの名無しさん
2007/11/10(土) 00:23:47このたび仕事でC言語のソース解析を行うことになったのですが、コードリーディングのために便利なツールなどは無いでしょうか?
コード中の関数や構造体をダブルクリックすると、定義してあるソースまでジャンプしてくれたりしたら助かるのですが
よろしくお願いいたします
0068デフォルトの名無しさん
2007/11/10(土) 00:24:10p[0].x[0〜9]が確保されていて
p[1].xは確保されていなかったわけですね。
ありがとうございます。頭がスッキリニッコリ
ということは解放するときは
for(int i=0;i<10;i++)
free(p[i].x);
free( p );
こういう風にせんといかんわけですね。
0069デフォルトの名無しさん
2007/11/10(土) 00:26:36VisualStudioは、右クリックから定義へ移動って機能があるけど、Cでちゃんと動くかはわからない。
0070デフォルトの名無しさん
2007/11/10(土) 00:29:10それなりに動く。
たまにどのシンボルか選べってなることもあるけど。
0071デフォルトの名無しさん
2007/11/10(土) 00:30:21doxygenというのがあるよ
ttp://www.fides.dti.ne.jp/~oka-t/doxygen.html#sample
こんな感じでクラスや関数間の関係を可視化してくれる。
導入方法はここから
ttp://skazami.web.infoseek.co.jp/tools/Graphviz_Doxygen.htm
0072デフォルトの名無しさん
2007/11/10(土) 00:30:590073デフォルトの名無しさん
2007/11/10(土) 00:59:10例えば…
struct{
foo[]
};
で、配列の使用時に
foo[bar]; (barは最大値)
という風にしたいのですが…
それとも構造体の定義時にあらかじめ余裕をもって配列を定義してしまう方がいいですか?
0074デフォルトの名無しさん
2007/11/10(土) 01:15:34良く分からないなら、あらかじめ定義した方が良いだろうね。
0075デフォルトの名無しさん
2007/11/10(土) 01:23:53秀丸エディタにそういう機能あるよ。
0076デフォルトの名無しさん
2007/11/10(土) 01:48:32ありがとうございます。
正直よくわからないので、助言どおり余裕を持って最初に定義してしまうことにします…すんません。
0077デフォルトの名無しさん
2007/11/10(土) 05:16:10for(i = a;i >= 1;i--){
for(j = a - i;j > 0;j--) putchar(' ');
for(j = i * 2 - 1;j > 0;j--) putchar('*');
putchar('\n');
}
最初のをfor(i=1;i <= a;i++)で上下反転。
0078デフォルトの名無しさん
2007/11/10(土) 10:33:24まったくワカリマセン(´・ω・`)・・どなたか助けてください
↓こんなの
***
**
*
0079デフォルトの名無しさん
2007/11/10(土) 10:39:04宿題スレ池
#include <stdio.h>
#define N 3
int main()
{
char i, j;
for (i = 0; i < N; i++) {
for(j = N; j > i; j--) {
printf("*");
}
printf("\n");
}
return 0;
}
008078
2007/11/10(土) 10:43:36ありがとうございます
そうさせていただきます・・w
0081デフォルトの名無しさん
2007/11/10(土) 11:47:01今C言語の勉強をしていて、Cpadというエディターで書いたあとにコンパイルして
実行ボタンを押して実行しています。
コマンドプロンプトが表示されて、処理が実行されますが一回で終わってしまいます。
例えば「ある数をscanfして、それに2を加えた数をprintfする」というプログラムのとき
結果が出力されたあとに、またscanfに戻るって何度もプログラムを続けることってできないですか?
説明下手ですが、宜しくお願いします。
0082デフォルトの名無しさん
2007/11/10(土) 11:49:57for(;;) {
scanf(・・・);
printf(・・・);
}
0083デフォルトの名無しさん
2007/11/10(土) 12:02:25ありがとうございます。それで指定した数までは終了しないようになりました。
#include <stdio.h>
int main(void)
{
int i, j,a;
printf("数を入力して\n");
for (i = 0; i < 10; i++) {
scanf("%d",&j);
a=5+j;
printf("%d\n",&j);
}
return 0;
}
何入力しても結果が3928になるのはなぜなんだろう…
0084デフォルトの名無しさん
2007/11/10(土) 12:04:31a の値を表示させてないからじゃないかな
0085デフォルトの名無しさん
2007/11/10(土) 12:04:370086デフォルトの名無しさん
2007/11/10(土) 12:08:30迅速なレスありがとうございます。
間違っていました…。
でも今度は結果が3926が出力されるようになりました。
今日手探りで色々入れたので、もしかしたら環境の問題なのかもしれません。
ちょっと色々試してみます。ありがとうございました。
0087デフォルトの名無しさん
2007/11/10(土) 12:10:42printf("%d\n", a); // & はいらない
0088デフォルトの名無しさん
2007/11/10(土) 12:32:05int r,g,b;
}
という構造体を
struct RGB *color;
color = (struct RGB *)malloc( sizeof(struct RGB) *10 );
と10個作って、各要素を足して4で割るということを続けていきたいのですが
(color[0]+color[1])/4
という感じに、構造体同士を足したりできるのでしょうか?
0089デフォルトの名無しさん
2007/11/10(土) 12:36:29ムリ。
0090デフォルトの名無しさん
2007/11/10(土) 12:41:57(color[0].r+color[1].r)/4
(color[0].g+color[1].g)/4
(color[0].b+color[1].b)/4
としないといかんわけですか。
0092デフォルトの名無しさん
2007/11/10(土) 13:32:08再帰の概念は何となく分かったのですが、いざプログラムとなると…。
例えば、構造体を
struct node{
int a;
struct node *r;
struct node *l;
};
と定義し、
引数を二分探索木の根のアドレスとし、二分探索木の最小の値を持つ節点の
アドレスを返す関数minを作成。
1 struct node *min(struct node *t){
2 struct node *m = (struct node *)NULL;
3 if(t != (struct node *)NULL){
4 if(t->l == (struct node *)NULL)
5 m = t;
6 else
7 m = min(t->l);
8 }
9 return m;
10 }
と書いてあるのですが、どういう手順で実行されるのかと、7行目で、
なぜ変数に関数を代入してるのかも意味が解りません。
0093デフォルトの名無しさん
2007/11/10(土) 13:47:26関数を実行した戻り値を代入しているんだ
009492
2007/11/10(土) 14:28:06レスありがとうございます。
関数を代入しているわけではなく、関数の戻り値を代入しているのですね。
なぜ、戻り値を代入しているのですか?
3行目は、二分探索木の有無の判定で、無い場合は、そのままNULLを
返して終了。
4〜5行目は、左部分木が無ければ、根が最小値なので、最小値の節点の
アドレスを入れる変数であるmに根のアドレスであるtを代入して、
それを返して終了。
なので、7行目以外は解るのですが、7行目はどういう処理をしてる
のですかね?
0095デフォルトの名無しさん
2007/11/10(土) 14:35:53tがNULL→NULLを返す
t->lがNULL→tが最小なのでtを返す
それ以外→t->lから始まる二分木で最小の物を返す
ok?
0096デフォルトの名無しさん
2007/11/10(土) 14:42:11○┘└○
○┘○┘└○
○┘ ・・・┘└・・・
○┘
009792
2007/11/10(土) 15:24:02はい、そこまでは解っています。どういう処理と言うか、tがNULLでなく、
t->lもNULLでない場合にどういう手順で動いてるかが解らなくて。
tがNULLでなく、t->lもNULLでない場合を考えたとして、
>>96さんの図で言えば、一番左下に位置している○が最小ですよね。
そして、一番左下の○まで来て、さらに再帰呼び出しをすると、
3行目のif(t != (struct node *)NULL)で条件に一致せずに、
9行目のreturn m;に進んで、ここで、どうなるんですか?
2行目でstruct node *m = (struct node *)NULL;としているので、
戻り値は、このアドレスになって、7行目のm = min(t->l);で、mに
代入しても、最小値のアドレスになりませんよね…
0098デフォルトの名無しさん
2007/11/10(土) 15:44:58if(t->l == (struct node *)NULL)
に引っかかって
m = min(t->l);
が実行されずに
m=t
が実行されるので
if(t != (struct node *)NULL){
が偽になるのは再帰ではなく外から呼び出した場合だけ
009992
2007/11/10(土) 16:00:46確かに一番左下を再帰呼び出しした時に、
if(t->l == (struct node *)NULL)にひっかかるので、
一番左下の○まで来て、さらに再帰呼び出しされる事は、ないですね。
となると、
if(t->l == (struct node *)NULL)
に引っかかって
m=t
が実行されて、
次は
return m;
ですよね?
このreturn m;で、メイン関数に返されて終了ってことですかね?
それだと、
m = min(t->l);
じゃなくて、
min(t->l);
で十分じゃないですか?
何のために、m = min(t->l);としているのですか?
0100デフォルトの名無しさん
2007/11/10(土) 16:19:20教えてください。
学校でユークリッドの互除法によって最大公約数を出すプログラムを
作ったんですが、これは2つの数の最大公約数を求めるものですよね。
もし3つとか6つとかの数の最大公約数を求めるんだったらどうプログラムするのが
一番なのでしょうか?ユークリッドを工夫すれば出来るでしょうか。
0101デフォルトの名無しさん
2007/11/10(土) 16:22:55メイン関数に返るのではなく呼び出した関数の呼び出した位置に返るのだよ
つまりmin(t->l)が実行されたあとにその戻り値がmに代入されてreturn mで戻り値となりそれが更に・・・
てな具合で呼び出した順を逆にたどるために各階で戻り値を返す必要があるわけだ
■ このスレッドは過去ログ倉庫に格納されています