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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/05/12(火) 05:17:35
>>950
アホな事書くなヴォケ
953デフォルトの名無しさん:2009/05/12(火) 08:00:03
何でアホなことなの?
>>950 はCの文法通りなんだけど。
954デフォルトの名無しさん:2009/05/12(火) 08:08:57
はじめてみた
これなに?C99?独自拡張?
俺が無知なだけ?
955デフォルトの名無しさん:2009/05/12(火) 08:23:26
gccだと -ansi -pedantic でもコンパイルできるからANSI(C89)でもOKじゃないかな。
956デフォルトの名無しさん:2009/05/12(火) 08:26:15
>>950
gccではコンパイルできたけどVC++ではエラーになった
957デフォルトの名無しさん:2009/05/12(火) 09:34:06
>>956
VCはC99に未対応。
958デフォルトの名無しさん:2009/05/12(火) 10:11:55
>>954
つ[複合リテラル]
959デフォルトの名無しさん:2009/05/12(火) 10:29:59
>>955
何いい加減な事言ってるんだ
K&R本のどこにもこんな書き方は認められていないぞ
認められているのはISO/IEC 9899:1999のみだ
C89はアウト
960デフォルトの名無しさん:2009/05/12(火) 10:31:04
>>958
ああコンパウンド・リテラルね
まんまC99からしか使えない
961955:2009/05/12(火) 10:45:25
>>959
あれ… さっきのファイルをもう一回 -ansi -pedantic でコンパイルしたら警告がでた。
a.c:4: warning: ISO C90 forbids compound literals

さっき何で平気だったんだろうと思ってシェルの履歴を見たら -peduntic になってたよ。
gccが何も言ってこないから気づかなかった。
962デフォルトの名無しさん:2009/05/12(火) 11:24:44
>>950
Cってこんな書き方出来るんだ。
ってかこれって初心者が覚える書き方じゃないだろw
963デフォルトの名無しさん:2009/05/12(火) 12:05:40
無しで書くとしたらわざわざ変数一個定義する訳だから、初心者とか関係なく
覚えておいて損はないと思う。
964デフォルトの名無しさん:2009/05/12(火) 12:23:45
enemy = 4; //3以上の数で初期化

while( enemy > 3 ){

srand ( ( unsigned) time ( NULL ) );
enemy = rand() % 10;

}


乱数を使って0〜2の数値をenemyに格納する時って、こういう書き方が普通なの?
もっと良い書き方あれば教えて欲しい
965デフォルトの名無しさん:2009/05/12(火) 12:26:36
srand はプログラム起動時に1回書けばよろしい
同じ値でsrand呼ぶとrandが返す値は同じだぞ
966デフォルトの名無しさん:2009/05/12(火) 12:27:50
ってそれ以前に rand() % 3じゃいかんの?
967デフォルトの名無しさん:2009/05/12(火) 12:32:34
>>966
あ、そっかw
3で割れば余りは0〜2だもんな。

ゴメン、ボケてた
968デフォルトの名無しさん:2009/05/12(火) 12:39:03
enemy = rand() % 3;
もしくは
enemy = rand() / (RAND_MAX + 1.0) * 3;
969デフォルトの名無しさん:2009/05/12(火) 12:49:21
こういう細々とした定石コードを纏めたサイトって無いのかね
970デフォルトの名無しさん:2009/05/12(火) 13:02:44
どこに定石が…w
971デフォルトの名無しさん:2009/05/12(火) 13:05:44
定石なんかいらないだろw
その場その場で考えて行けばいいだけで
それとも頭悪いの?
972デフォルトの名無しさん:2009/05/12(火) 13:08:45
定石というか

struct x {
char a[10];
}

とか

struct x {
int a;
int b;
int c[];
}

こういうのか。
973デフォルトの名無しさん:2009/05/12(火) 13:15:18
#include <stdio.h>

int main(void)
{
printf("hallo world!\n");

return 0;
}

定石と言ったらこれだろJK
974デフォルトの名無しさん:2009/05/12(火) 13:17:06
無限ループは
for(;;) で書くか while(1) で書くか…
975デフォルトの名無しさん:2009/05/12(火) 13:21:18
構文エラー )が;の前にありません。
srand ( ( unsigned ) time ( NULL );

え?なんで?あるじゃん。
一応srandの上も確認するが、バグが見当たらない。


  ,j;;;;;j,. ---一、 `  ―--‐、_ l;;;;;;
 {;;;;;;ゝ T辷iフ i    f'辷jァ  !i;;;;;   …ハハッVC2005め、エラーを出して構って欲しかったのか。
  ヾ;;;ハ    ノ       .::!lリ;;r゙  全くツンデレだなお前は。
   `Z;i   〈.,_..,.      ノ;;;;;;;;>  そんなふうに考えていた時期が
   ,;ぇハ、 、_,.ー-、_',.    ,f゙: Y;;f   俺にもありました
   ~''戈ヽ   `二´    r'´:::. `!
976デフォルトの名無しさん:2009/05/12(火) 13:42:07
つっこむか引き抜くかまよう段階
977デフォルトの名無しさん:2009/05/12(火) 16:28:13
>>974
whileに定数書いたらコンパイラに注意されたことがある
978デフォルトの名無しさん:2009/05/12(火) 16:47:39
>>964
同じような間違いをなんどか見たことあるけど、
こういう人って入門書とか読まずにリファレンスだけで勉強してるのだろうか。
979デフォルトの名無しさん:2009/05/12(火) 16:50:49
リファレンスだけで勉強できるだけの素養があれば、srand()を毎回してはいけないことくらいは分かるんじゃね?
980デフォルトの名無しさん:2009/05/12(火) 16:58:25
素養がないのに、リファレンスだけでやってるから失敗してるとか。
981デフォルトの名無しさん:2009/05/12(火) 17:50:22
ループ変数はi〜n
それ以外は絶対に使わない
982デフォルトの名無しさん:2009/05/12(火) 21:02:05
ループ変数のkが出てきた時点でプログラムの構造を根本的に考え直した方がいい
983デフォルトの名無しさん:2009/05/12(火) 21:04:45
擬似乱数という物を理解してないとsrandの意味は分からんよな
984デフォルトの名無しさん:2009/05/12(火) 21:05:36
次スレ立てました
C言語なら俺に聞け(入門篇) Part 48
http://pc12.2ch.net/test/read.cgi/tech/1242129892/
985デフォルトの名無しさん:2009/05/12(火) 22:10:21
トランプのカードをシャッフルさせようとしています
1番の方法と2番の方法のどちらの方法を選ぶのが良いでしょうか?
#include<stdio.h>
#include<stdlib.h>

void swap(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}

int main(void){
int i, card[52];

for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[rand()%(i+1)]); // 1番

for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52-i)]); // 2番

return 0;
}
986デフォルトの名無しさん:2009/05/12(火) 22:17:01
>>985
「シャッフル アルゴリズム」でググるといろいろでてくると思う。
987デフォルトの名無しさん:2009/05/12(火) 22:17:39
どちらも良くない
for(数回)

for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52)]);

が、まだまし
988デフォルトの名無しさん:2009/05/12(火) 22:20:14
>>987
添え字がオーバーしとるがな
989デフォルトの名無しさん:2009/05/12(火) 22:22:31
>>985
fisher yatesでぐぐれ
直感的にも正しい(実質ランダムに一枚づつ抽出と同じであることが容易に理解できる)ものだし
ループは一重で済むし

>>987
糞以下のものをだすな
990デフォルトの名無しさん:2009/05/12(火) 22:23:44
おお
for(数回)

for(i=0;i<52;i++) swap(&card[i], &card[rand()%(52)]);

訂正や
991985:2009/05/12(火) 22:30:18
>>989
こんな感じでしょうか
for(i=0;i<52;i++) card[i]=i;
for(i=52-1;i>=0;i--) swap(&card[i], &card[rand()%(i+1)]);

ぱっと見は1番に近いですが
アルゴリズムの内容的には2番と一緒になりますね
992デフォルトの名無しさん:2009/05/12(火) 22:45:41
>>985
2番よりも >>991 の方がリテラル埋め込みが少ないからオススメ
993デフォルトの名無しさん:2009/05/12(火) 23:37:59
>>985

for(i=0; i<52; i++) {
j = rand() % (i + 1);
card[i] = card[j];
card[j] = i;
}

で初期化とシャッフルを同時にやるのはどうよ?
994デフォルトの名無しさん:2009/05/12(火) 23:40:39
990はバカすぎて話になんねーw
995デフォルトの名無しさん:2009/05/13(水) 00:00:01
for(i = 0; i < X; i++){
n = rand()%52;
for(j = 0; j < n; j++){
swap(&card[j], &card[n+j]);
for(k = n; k < 51; k++ )
swap(&card[k], &card[k+1]);
}
}
996デフォルトの名無しさん:2009/05/13(水) 00:10:48
>>994
若干偏りのでるアルゴリズムではあるが
実用上は問題ないのでは?
997デフォルトの名無しさん:2009/05/13(水) 00:15:43
全く偏りの出ない>>985に対して後からそれより偏るもの出してどうすんだよw
998デフォルトの名無しさん:2009/05/13(水) 00:16:03
unixコマンドのsortは数百Mのテキストも平気でソートできるけど
どういうアルゴリズムでやっているか概略を知っている方いらっ
しゃいましたらご教授下さい。(オンメモリなのかそうでないか
とか)
999デフォルトの名無しさん:2009/05/13(水) 00:32:32
ソース読むとか。
sortにはメモリバッファのサイズを指定するオプションがあるので、
メモリが少ない時は少ないなりのアルゴリズムでやってるのかな。
役に立たんレスで済まんね。
1000デフォルトの名無しさん:2009/05/13(水) 00:53:10
次スレで俺の時代が到来
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。