C言語なら俺に聞け! Part 110
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/06(水) 05:48:01質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 109
http://pc8.2ch.net/test/read.cgi/tech/1119435171/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0685デフォルトの名無しさん
2005/07/12(火) 11:59:49エラー行は「void main()」です
どうしたらよいでしょうか?
0686デフォルトの名無しさん
2005/07/12(火) 12:09:460687デフォルトの名無しさん
2005/07/12(火) 12:10:570688デフォルトの名無しさん
2005/07/12(火) 12:12:03で、宣言すると なんで
warning: first argument of `main' should be `int'
って怒られんの?
引数の数なんてcharでも足りるでしょ
ちゃんとした理由知ってるひといます?
0689デフォルトの名無しさん
2005/07/12(火) 12:13:400690デフォルトの名無しさん
2005/07/12(火) 12:27:11呼ぶ側の事も考えれ
0691デフォルトの名無しさん
2005/07/12(火) 12:30:31じゃあ昔の人は何で初期化したんだよ
0692デフォルトの名無しさん
2005/07/12(火) 12:32:320693デフォルトの名無しさん
2005/07/12(火) 12:33:08マルチすなや。
0694デフォルトの名無しさん
2005/07/12(火) 12:36:31フレームカウンタとか、ユーザからの入力とか。
0695デフォルトの名無しさん
2005/07/12(火) 12:37:590696デフォルトの名無しさん
2005/07/12(火) 12:39:100697デフォルトの名無しさん
2005/07/12(火) 12:39:391. 手っ取り早い
2. よく使われている例を丸写ししただけ
3. 他の方法を考えるのが面倒
こんな感じでは?
0698デフォルトの名無しさん
2005/07/12(火) 12:45:120699デフォルトの名無しさん
2005/07/12(火) 12:46:000700デフォルトの名無しさん
2005/07/12(火) 12:46:480701683
2005/07/12(火) 13:03:42int main()
srand(time(NULL));
・
・
ってことですか?
コンパイルするとここでは宣言できないって言われるですが
0702デフォルトの名無しさん
2005/07/12(火) 13:05:43コンパイラが古いんじゃないかと。
0703684じゃないけど
2005/07/12(火) 13:06:43int main()
{
srand(time(NULL));
:
}
ただ、main の頭でやるというか、他で rand を使うに先立って一度だけ srand をすればいい。
だから別に main でやらなくてもいいよ。
0704デフォルトの名無しさん
2005/07/12(火) 13:16:29「mainの頭」と言われて、srandを変数宣言よりも前に置いたのかw
愉快な奴だなw
0706683
2005/07/12(火) 13:19:56それ早くいってくれよorz
0707デフォルトの名無しさん
2005/07/12(火) 13:27:01言わなくても分かれよ。
基本だろ?
0708デフォルトの名無しさん
2005/07/12(火) 13:31:230709デフォルトの名無しさん
2005/07/12(火) 13:34:20srand(time(NULL));
int main
とかするよりもマシだろう。
# ソースを「実行」しようとした奴もいたし...Cはスクリプトじゃねーよ
0710デフォルトの名無しさん
2005/07/12(火) 13:34:53いくらなんでも関数本体のブロックに入る前じゃダメだろ
0711デフォルトの名無しさん
2005/07/12(火) 15:15:300712デフォルトの名無しさん
2005/07/12(火) 15:36:018/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
ただし,nは1以上とする
#include<stdio.h>
void main()
{
int i,n,kou,wa=0;
printf("1以上の整数nは?\n");
scanf("%lf",&n);
for (i = 1;i <= n; i++) {
wa += kou;
kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
}
printf("和=%lf\n",wa);
}
すいません・・・ずっと考えているんですがどこが違っているのか
わかりません。どなたか教えてください。
0713デフォルトの名無しさん
2005/07/12(火) 15:43:22int は整数の型ってことに注意。
少数を扱いたいなら float か double。
ソースを見たところ i と n は int で構わないだろうけど、それ以外は少数なんでないかい?
0714デフォルトの名無しさん
2005/07/12(火) 15:45:34kou
が逆だろ。ゆとりありすぎ
0715デフォルトの名無しさん
2005/07/12(火) 15:50:14浮動小数点型においてたくさんの数値を足し込むときには、値の小さいものから足していくと誤差が少なくなるよ。
とどのつまり上記問題では、i を 1 から n に向かってループさせるのではなく、n から 1 に向かってループさせると
精度が良くなるってこと。
これは C固有のテクニックではないけどね。
0716712
2005/07/12(火) 15:52:230717デフォルトの名無しさん
2005/07/12(火) 15:53:21>713の注意と、scanf()の型指定子にも注意。
それと、>714の言いたいことはwaに加算する順序が違うだろうと言うことだな。
0718デフォルトの名無しさん
2005/07/12(火) 16:49:26<kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
>kou = (double) 8 / ((4 * i - 3) * ( 4 * i - 1));
0719デフォルトの名無しさん
2005/07/12(火) 16:53:06括弧より、お前の知識が足りない。小学校からやり直せ
0720718
2005/07/12(火) 17:05:430721デフォルトの名無しさん
2005/07/12(火) 17:06:340722デフォルトの名無しさん
2005/07/12(火) 17:07:12>>719
解説よろ
0723デフォルトの名無しさん
2005/07/12(火) 17:33:17だが気のせいだ。何を気にしているのか知らんが。
0724デフォルトの名無しさん
2005/07/12(火) 17:34:070725デフォルトの名無しさん
2005/07/12(火) 17:37:480726724!=712
2005/07/12(火) 17:45:19for(;;){
printf("1以上の整数nは?\n");
if(scanf("%d",&n)==1 && n>=1) break;
*ここで行末まで読み捨てる。
}
0727デフォルトの名無しさん
2005/07/12(火) 17:46:42素直に読み捨てろ。
0728デフォルトの名無しさん
2005/07/12(火) 17:47:270729デフォルトの名無しさん
2005/07/12(火) 17:48:210730デフォルトの名無しさん
2005/07/12(火) 17:49:36scanf()を捨てろ。
0731デフォルトの名無しさん
2005/07/12(火) 17:59:580732デフォルトの名無しさん
2005/07/12(火) 18:08:200733726
2005/07/12(火) 18:14:51なるほど。
でもEOFも検出しないと無限ループだからこんな感じか。ショッペー
for(;;){ int c = getchar(); if(c==EOF) return 0; if(c=='\n') break; }
0734デフォルトの名無しさん
2005/07/12(火) 18:16:270735デフォルトの名無しさん
2005/07/12(火) 18:25:47いったいどういう仕組みなんだろう、何で括弧入らないんだ?
割り算が先に評価されると思うのだが
0736デフォルトの名無しさん
2005/07/12(火) 18:27:38サンプルソース
int i=1;
printf("%f\n", (double)8 / (4*i-3)*(4*i-1));
printf("%f\n", (double)8 / ((4*i-3)*(4*i-1)));
実行結果
24.000000
2.666667
どっちが正しいの?
0737デフォルトの名無しさん
2005/07/12(火) 18:30:440738デフォルトの名無しさん
2005/07/12(火) 18:32:150739デフォルトの名無しさん
2005/07/12(火) 18:35:080740デフォルトの名無しさん
2005/07/12(火) 18:35:19フラッシュする代わりに読み捨てちゃダメなの…?
0742デフォルトの名無しさん
2005/07/12(火) 18:41:460743デフォルトの名無しさん
2005/07/12(火) 18:47:07どういうこと、つながってないとは、一連の問題文に読めるが?
0744デフォルトの名無しさん
2005/07/12(火) 18:48:10{
return (n<1) ? 0 : f(n-1) + (8.0 / ((4*n-3) * (4*n-1)));
}
0745デフォルトの名無しさん
2005/07/12(火) 18:48:42最近C言語の解説本、増えてるよね? 流行ってんじゃねーの
0746デフォルトの名無しさん
2005/07/12(火) 18:49:48括弧あるじゃん
0747デフォルトの名無しさん
2005/07/12(火) 18:50:54>>738→>>739 orz
0748デフォルトの名無しさん
2005/07/12(火) 18:52:31>8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
これさ
>8/(1×3)+8/(5×7)
>8/{(4n-3)×(4n-1)}
おかしくね?
0749デフォルトの名無しさん
2005/07/12(火) 18:53:190750デフォルトの名無しさん
2005/07/12(火) 18:59:05さすがにそれは違う
8/(1×3)+8/(5×7)
これはn=1 , n=2を連続して書いてるだけだ。代入してみなよ
0751デフォルトの名無しさん
2005/07/12(火) 18:59:39ごめん。おれの読み間違いみたいだ。
小学校に入って女友達作ってくる
0752デフォルトの名無しさん
2005/07/12(火) 18:59:57ありがとう。早とちりした。
0753デフォルトの名無しさん
2005/07/12(火) 19:00:16だから何で括弧が要らないのか教えてくれ。気になって仕事に戻れんw
0754デフォルトの名無しさん
2005/07/12(火) 19:03:31/は分数
だから8/(4n-3)×(4n-1)は
8
−−−−−−
(4n-3)×(4n-1)
なんだよ。小学校から出直せ。
0755デフォルトの名無しさん
2005/07/12(火) 19:05:470756デフォルトの名無しさん
2005/07/12(火) 19:07:22なんだネタかツマラン
0757デフォルトの名無しさん
2005/07/12(火) 19:07:32a/b*c+d って書いたらどうなるんだい?
a
−−−−
b * c + d
とか言っちゃう?
0758デフォルトの名無しさん
2005/07/12(火) 19:18:280759デフォルトの名無しさん
2005/07/12(火) 19:23:55こういう2次元配列用のポインタって宣言出来ましたっけ?
0760デフォルトの名無しさん
2005/07/12(火) 19:29:360761デフォルトの名無しさん
2005/07/12(火) 19:29:380763デフォルトの名無しさん
2005/07/12(火) 19:48:45FF�[→アセンブラ言語」
0764デフォルトの名無しさん
2005/07/12(火) 20:38:18bufp is pointer to array[0..639] of char.
結びつきの強いものから順に。英語で読む。
bufpはcharの配列[0..639]へのポインタ
0765デフォルトの名無しさん
2005/07/12(火) 21:38:07自力で組めるようになった?
おれは自力で行ったのはマージソート。そのあと基数ソートにたどり着い
ちゃってクイックソートイラネ
0766デフォルトの名無しさん
2005/07/12(火) 22:10:17int is_prime(int n)
{
int i;
if (n < 2)
return 0;
for (i = 2; i < n; i++)
if ((n % i) == 0)
return 0;
return 1;
}
int main(void)
{
int i;
for (i = 2; i < 500; i++) {
if (is_prime(i) && is_prime(1000-i))
printf("%d %d\n", i, 1000-i);
}
return 0;
}
このプログラムで各々が何をしているのかわかりません。
教えてくれないでしょうか?
0767デフォルトの名無しさん
2005/07/12(火) 22:16:460768デフォルトの名無しさん
2005/07/12(火) 22:18:54素数かどうかチェックする関数だろ。
0769デフォルトの名無しさん
2005/07/12(火) 22:25:35is_primeは素数判定で、printfは標準出力への文字列表示です。
0770デフォルトの名無しさん
2005/07/12(火) 22:42:58マジレスすると
http://pc8.2ch.net/test/read.cgi/tech/1087648569/104
の答えw
0771デフォルトの名無しさん
2005/07/12(火) 22:55:03fopenではファイル名にこういうのを入れられない。
フルパスに展開する関数とかあるんでしょうか。
0772デフォルトの名無しさん
2005/07/12(火) 22:56:41いずれにせよ、環境依存のコードになるだろうな。
0773デフォルトの名無しさん
2005/07/12(火) 23:04:490774デフォルトの名無しさん
2005/07/12(火) 23:08:59可
0775デフォルトの名無しさん
2005/07/12(火) 23:09:42Winなら GetFullPathName とかなかったっけ? ~ ならUNIX系か
>>773
Winなら使えた記憶がある
0776デフォルトの名無しさん
2005/07/12(火) 23:11:480777デフォルトの名無しさん
2005/07/12(火) 23:12:21int main(void)
{
int i, j;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };
for (i = 1; i < 2; i++)
for (j = 1; j < 2; j++)
mc[1][1] = ma[i][j]*mb[i][j] + ma[i+1][j]*mb[i][j+1] + ma[i+2][j]*mb[i][j+2];
mc[1][2] = ma[i][j]*mb[i+1][j] + ma[i+1][j]*mb[i+1][j+1] + ma[i+2][j]*mb[i+1][j+2];
mc[2][1] = ma[i+1][j]*mb[i][j] + ma[i+1][j+1]*mb[i][j+1] + ma[i+1][j+2]*mb[i][j+2];
mc[2][2] = ma[i+1][j]*mb[i+1][j] + ma[i+1][j+1]*mb[i+1][j+1] + ma[i+1][j+2]*mb[i+1][j+2];
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}
return (0);
}
2行3列と3行2列の積をもとめるプログラムなんですが
mcを求める演算を簡単にするにはどうしたらいいのでしょうか。
しかもこれさえまともに動かない・・orz
0778デフォルトの名無しさん
2005/07/12(火) 23:13:49まともに動かないのは、forの括弧が抜けてるから
0779778
2005/07/12(火) 23:15:100780デフォルトの名無しさん
2005/07/12(火) 23:18:100781デフォルトの名無しさん
2005/07/12(火) 23:20:56かなり強引につくったんですが
0782デフォルトの名無しさん
2005/07/13(水) 00:08:37つhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/711.txt
0783デフォルトの名無しさん
2005/07/13(水) 00:23:02a = 0.509;
b = 1.501;
c = a ^ b;
↑こんな感じで書くとビルドエラーになるんですが、小数同士の
Xorを取るにはどうすればいいんでしょう?
"^"の左右オペランドが間違いとか言われます。
0784デフォルトの名無しさん
2005/07/13(水) 00:28:35■ このスレッドは過去ログ倉庫に格納されています