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


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

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



1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ]
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
pc11.2ch.net/test/read.cgi/tech/1208268461/


415 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:03:58 ]
inline は C99 からだから

416 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:56:05 ]
>>415

そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?

417 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:00:59 ]
VC++ は C89 だ

418 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:03:14 ]
まぁ、最適化を当てにして関数にしておけってのはありだがな。

419 名前:デフォルトの名無しさん [2008/05/07(水) 08:24:58 ]
すみません質問させてください。
入門書見て書いてるんですが

#include <stdio.h>

int astoi(const char s[])
{
int i;
int number = 0;

for(i = 0; s[i] >= '0' && s[i] <= '9'; i++)
number = 10 * number + (s[i] - '0');
return(number);
}

int main(void)
{
char x[]= "1234";

printf("%d", astoi(x));
return(0);
}

という文字型を数値に変えるプログラムで、
number = 10 * number + (s[i] - '0');
のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか?
この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。

420 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:07:44 ]
>>419
文字を数値へ変換してる
asciiコードとかがポイント

421 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:06:21 ]
誰か>>414
>#define は C言語ではない
の意味を説明してくれないか?

422 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:12:54 ]
>>421
プリプロセッサの範疇だと言うことだろ。

423 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 12:12:00 ]
>>419
s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み



424 名前:デフォルトの名無しさん [2008/05/07(水) 13:12:40 ]
>>419

ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。

425 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:49:07 ]
コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?

426 名前:419 mailto:sage [2008/05/07(水) 14:49:58 ]
asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。
レスしてくれたみなさん、ありがとうございました!

427 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:49:27 ]
プリプロセッサも、C標準に規定されている訳だし、
C言語の一部と考えてもいいんじゃないかな。

プリプロセッサがなきゃコメントすら書けん


428 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:50:27 ]
>>426
せめてGoogleくらいは味方にしておこう。

429 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:00:13 ]
プリプロセッサの問題点はC言語の一部かどうかじゃなくて
コンパイラと完全に独立しているところ


430 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:11:51 ]
問題点ではないだろ

431 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:13:36 ]
問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。

432 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:41 ]
プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。
#include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・

ただ #define で色々マクロ組むのはどうかな。
美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。

#define CONSTANT_VAL 50
ではな
const int CONSTANT_VAL = 50;

こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。

433 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:00:28 ]
それは別に警告出ないと思う。
マクロは使わなくていいなら使わない方がいいってのは賛成だが、
C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。



434 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:01:59 ]
プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・
引数の型気にしなくてもいいマクロとか素敵じゃない?

435 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:03:47 ]
マクロはどう展開されてどう実行されるのかを理解して無いと
バグを生むことがあるってのがアレなんだろうね

436 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:10:13 ]
そんなとうにされつくしてる議論してんなよ・・・・・・・・

437 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:14:03 ]
>>436
入門篇って書いてあるし、議論すればえ〜ねん

438 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:16:43 ]
>>433
私はこのレベルの警告を出すようにしてる。

>>434
そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど

a = -3;
k = abs(a++);

結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。


439 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:19:39 ]
C++ だとそれを何とかするために関数テンプレートが導入されたが、
C だとやっぱどうしてもマクロになっちゃうんだよなあ。

440 名前:434 mailto:sage [2008/05/07(水) 20:24:50 ]
>>438
マクロの怖さを頭ではなく心で理解したわ

441 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:26:02 ]
ABSにすれば解決

442 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:52:15 ]
馬鹿が使えば包丁も自動車も凶器になる。

443 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:45:43 ]
>>435
それを言ったら無知と無理解はなんだってバグのもとだろ



444 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:51:07 ]
所詮人間一人なんてちっぽけな存在さ。自分一人なんて
この世の60億分の1に過ぎない存在。万能、全知全能、
絶対権力者の人間なんて存在しない。
人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。
そんなもん。だから、気ぃ張るなや、適当に生きろ。
どうせお前が強がっても、地球の運命までは変えられないから。
せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ
出来んやろ?なっ?俺はずっと共産党に投票してたけどな。

445 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:09:35 ]
マクロを使うと一見上級者のようでかっこいいんだけどね
地道に関数でということかな

446 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:12:57 ]
ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが
同じ道路交通法が適用されている道で守るべきルールは同じさ。
それよりも、ドライバーの運転技術はいかがなものか?他に、
アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が
加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。

447 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:15:20 ]
ええいお前のたとえは分かりにくい

448 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:35:14 ]
linuxのコンソール上でカーソルの処理を行いたいのですが、
カーソルの処理には何を使ったらいいのでしょうか?
ncursesはできれば使いたくないです。
ttp://oshiete1.goo.ne.jp/qa3121681.html
の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。
よろしくお願いします。

449 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:12:49 ]
>434
型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。

450 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:21:56 ]
>>434
昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。

451 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:23:27 ]
FORTRANなら普通の事です

452 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:25:14 ]
>>445
マクロ使っても全然上級者には見えないから安心して関数を使おう


453 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:28:26 ]
可読性、保守性の高いソースを書く人のほうが上級者に見える。
まあマクロはその手段の一つなんだけれども。



454 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:31:13 ]
浮動小数点の定数って定義できるんだっけ?
C++でも未だにマクロ使ってるんだけど

455 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:35:27 ]
別に定数を定義することくらいはできるけど。
ただ、初期化順でハマることはあるかもしれないね。

456 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:37:42 ]
voidポインタの参照先はビットシフトできないのかな?

457 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:40:54 ]
>>456
void*をint*にキャストしてシフトすれば?

458 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:43:20 ]
>>456
何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。


459 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:57:36 ]
キャストしたらできた!

これって任意のバイト数を指定することはできないのかな?
mallocで指定しても駄目だったし無理か・・・

460 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:59:21 ]
>>459
> これって任意のバイト数を指定することはできないのかな?
意味不明

461 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:16:42 ]
void*の参照先を任意のビット幅としてビットシフトしたいんです

462 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:18:04 ]
自分でそういうプログラム書け。

463 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:26:54 ]
>>461
それ、何のデータ?



464 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:28:38 ]
ビットシフトすりゃいいじゃん。

465 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:35:13 ]
>>463
void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・

466 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:38:59 ]
とりあえずバイトオーダをはっきりしておかないとな。
リトルエンディアン環境の場合、数十バイトだろうが
その全体でリトルエンディアンになることを仮定していいのか、
それとも4バイト単位でリトルエンディアンになることを仮定するのか。

467 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:44:48 ]
>>465
char*にキャストして一バイトごと表示しろよ

468 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:51:12 ]
>>466
リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ

>>467
おk試してみる

469 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:05:04 ]
>>461
できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない

470 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:11:23 ]
キャストすればいくらでもできるだろ・・・。

471 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:16:35 ]
>>470
んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ

472 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:20:12 ]
もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな
それだったらlhaの解説書見れば早いと思う

473 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:27:33 ]
>>471
結局できるんじゃないか



474 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:39:36 ]
>>473
「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな

475 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:41:10 ]
> 組み込みのビットシフ
なんじゃこれは?ト

476 名前:デフォルトの名無しさん [2008/05/08(木) 02:38:42 ]
プロトタイプ
static void mera(const char *);
このとき
 1) void mera(const char *merami)
 2) void mera(const char* merazooma)
1だけのはずが
2のようなものも通ってしまうのはどうして?
どちらでも良いという意味ならば、どちらが推奨なの?

また、
static void bagi(const char ****);
このとき
 1) void bagi(const char ****bagima)
 2) void bagi(const char**** begiragon)
どちらも警告W8075程度で通してしまうのはどうなの?
BCC5.5.1

477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:57:27 ]
>>476
> 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。

478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:59:49 ]
スペースがあるかないかだけじゃん。何で違うものだと思うの?

479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:00:44 ]
>>477
おお、ありがとう。

480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:20:48 ]
>>476
char *p も char* p も意味は同じ

スタイルについては、変数の宣言時にたとえば

char* p, * q;

などとするのが不自然という理由で

char *p, *q;

を推奨する人は多い


481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:31:59 ]
追記

一方で char* p; を推奨する人は、変数名はあくまでpであるから
それがchar*であることを示すためにそうすると主張することが多い

ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく
あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名];
だから int const n, m; とは書けても char* p, q; とは書けない)ので、
構文的には変数名側に寄せることが正しい扱いであると言える

482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:37:26 ]
×ただし*はcharやint、あるいは
○ただし*はcharやintのようなデータ型、あるいは

483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:08:15 ]
もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、
また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい



484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:16:42 ]
たくさんのレスありがとう、勉強になりなす。

485 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 07:37:37 ]
>>476
×begiragon
○bagicross
なんで誰も指摘しないんだよー

486 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 13:10:17 ]
>>448
エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。

カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ


487 名前:448 mailto:sage [2008/05/08(木) 19:42:21 ]
>>486
そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。

488 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:43:21 ]
XPでコンソールのカーソルを移動させるにはどうすればいいの?


489 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:04 ]
スレ違い

490 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:11 ]
>>488
msdn.microsoft.com/ja-jp/library/cc429740.aspx

491 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:34:04 ]
mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、
freeにサイズを書かなくてなんでサイズがわかるんでしょうか。
#include <stdio.h>
void main()
{
char *c;
c = malloc( 10 );
if( c == NULL )return;
strcpy( c , "aiue" );
c--;//ひとつ前のポインタ(サイズは書いていないようだ)
c--;//ここにもサイズはない
c++;c++;//元に戻す
free( c );
c = NULL;
return;
}

492 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:38:08 ]
>>491
管理テーブルが別にあるから

493 名前:491 mailto:sage [2008/05/08(木) 21:52:55 ]
>>492
ポインタの前ではなくほかのところにあったんですね。
どうもありがとうございました。



494 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:04:26 ]
どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?

495 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:13:52 ]
実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする

496 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:40:41 ]
>>492
ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;

こうしておいて
printf("%d : ", *(ip - 1));  // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1));  // c 先頭から long 分戻った場所から数値として表示

こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)


497 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:50:03 ]
>>493

> ポインタの前ではなくほかのところにあったんですね。

それは処理系依存。
ポインタの前にある場合もあるだらう。


498 名前:デフォルトの名無しさん [2008/05/08(木) 23:11:55 ]
じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??

499 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:13:38 ]
管理テーブルを保持することよりも、
空きメモリを探す処理とfreeの分、
CPU時間の無駄遣いになることを気にしたほうがいい気がする。

500 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:22:31 ]
ということはlinked listとかすごい効率悪いんだな・・・


ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?

501 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:23:16 ]
実装によるとしか
mallocのソースでも眺めてみれ

502 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:25:09 ]
入門書クリアしたら次は何がいいかな?
アルゴリズム辞典とか眺めるの?

503 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:09 ]
linked list はスタック上にメモリをプールしておけばいいぜ。



504 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:32 ]
×スタック上
○スタック状

505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:50:05 ]
>>502
良いソースを読むことだと思う
どの言語でも同じだと思うが

506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:55:07 ]
何か作りたいものがあるから学んでいるのでは?
それを作るのにまだ足りないものがあるならそれを学べばOK
足りてるなら作ろう

507 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:06:55 ]
実際に自分の目的とするものを作ること
その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること

言語仕様がわかってても要求を実現できない新人多すぎ
コーダーじゃねぇんだからさ

508 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:58:14 ]
0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時
N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。
(消失した情報は2を代入すればよい)
上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力)
というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。
環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。

なお、ここではN=5、e=0.05、p=0.1としています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5 ;

int main(void)
{
int v[N], u[N] ;
int i ;
float e, p, x ;

for (i = 0; i <= N-1 ; i++ )
{
printf("v[%d]=",i) ; scanf("%d",&v[i]) ;
while (v[i] && v[i]!=1)
{ printf("v[%d]=",i) ; scanf("%d",&v[i]) ; }
}

509 名前:508続き mailto:sage [2008/05/09(金) 17:58:40 ]

p = 0.1 ; e =0.05 ;

for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}

printf("(") ;
for(i = 1 ; i <= 7 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;

return 0 ;
}

510 名前:509訂正。失礼しました mailto:sage [2008/05/09(金) 18:01:25 ]
p = 0.1 ; e =0.05 ;

for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}

printf("(") ;
for(i = 0 ; i <= N-1 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;

return 0 ;
}

511 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:31:39 ]
>>508
srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?

512 名前:508 mailto:sage [2008/05/09(金) 18:36:04 ]
>>511
その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります

513 名前:508 mailto:sage [2008/05/09(金) 18:38:06 ]
あ、変化しないんだから
u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。



514 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:47:04 ]
久々に突っ込みどころ満載なコードを見た気がする

515 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:57:02 ]
>>502
pc11.2ch.net/test/read.cgi/tech/1209810861/
で手伝っていただけるとありがたいのですが、いかが?






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

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

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