トップページ⇒tech
1001コメント272KB

C言語なら俺に聞け! Part 110

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/06(水) 05:48:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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:46
なんで最近の若者はtimeで乱数をつくろうとするの?
0687デフォルトの名無しさん2005/07/12(火) 12:10:57
スレ違い
0688デフォルトの名無しさん2005/07/12(火) 12:12:03
int main(short argc, char **argv)
で、宣言すると なんで
warning: first argument of `main' should be `int'
って怒られんの?

引数の数なんてcharでも足りるでしょ
ちゃんとした理由知ってるひといます?
0689デフォルトの名無しさん2005/07/12(火) 12:13:40
規格でそう定められてるから。
0690デフォルトの名無しさん2005/07/12(火) 12:27:11
>>688
呼ぶ側の事も考えれ
0691デフォルトの名無しさん2005/07/12(火) 12:30:31
>>686
じゃあ昔の人は何で初期化したんだよ
0692デフォルトの名無しさん2005/07/12(火) 12:32:32
初期化?
0693デフォルトの名無しさん2005/07/12(火) 12:33:08
>>688
マルチすなや。
0694デフォルトの名無しさん2005/07/12(火) 12:36:31
>>691
フレームカウンタとか、ユーザからの入力とか。
0695デフォルトの名無しさん2005/07/12(火) 12:37:59
プ
0696デフォルトの名無しさん2005/07/12(火) 12:39:10
timeのほうがよっぽど汎用的じゃねぇか。>>686が何を非難しようとしてるのか分からん。うらやましいだけか?
0697デフォルトの名無しさん2005/07/12(火) 12:39:39
>>686
1. 手っ取り早い
2. よく使われている例を丸写ししただけ
3. 他の方法を考えるのが面倒

こんな感じでは?
0698デフォルトの名無しさん2005/07/12(火) 12:45:12
そもそも、昔は乱数表だろ。
0699デフォルトの名無しさん2005/07/12(火) 12:46:00
C/C++でスレッドプールを扱うための標準ライブラリってあるんですか?
0700デフォルトの名無しさん2005/07/12(火) 12:46:48
ない。
07016832005/07/12(火) 13:03:42
>>684
int main()
srand(time(NULL));
・
・
ってことですか?
コンパイルするとここでは宣言できないって言われるですが
0702デフォルトの名無しさん2005/07/12(火) 13:05:43
>>701
コンパイラが古いんじゃないかと。
0703684じゃないけど2005/07/12(火) 13:06:43
>>701
int main()
{
 srand(time(NULL));
 :
}

ただ、main の頭でやるというか、他で rand を使うに先立って一度だけ srand をすればいい。
だから別に main でやらなくてもいいよ。
0704デフォルトの名無しさん2005/07/12(火) 13:16:29
>>701
「mainの頭」と言われて、srandを変数宣言よりも前に置いたのかw
愉快な奴だなw
07056832005/07/12(火) 13:16:38
>>684
>>703
サンクス。おかげで上手い事できました。
07066832005/07/12(火) 13:19:56
>>704
それ早くいってくれよorz
0707デフォルトの名無しさん2005/07/12(火) 13:27:01
>>706
言わなくても分かれよ。
基本だろ?
0708デフォルトの名無しさん2005/07/12(火) 13:31:23
c99なら無問題。
0709デフォルトの名無しさん2005/07/12(火) 13:34:20
まぁ、mainの頭といったら
srand(time(NULL));
int main
とかするよりもマシだろう。

# ソースを「実行」しようとした奴もいたし...Cはスクリプトじゃねーよ
0710デフォルトの名無しさん2005/07/12(火) 13:34:53
>>708
いくらなんでも関数本体のブロックに入る前じゃダメだろ
0711デフォルトの名無しさん2005/07/12(火) 15:15:30
慎重を期してrandの直前で呼ぶのがいいよ
0712デフォルトの名無しさん2005/07/12(火) 15:36:01
整数nを入力し,下記の数列の和を計算するプログラムを作成しなさい.
 8/(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:22
>>712
int は整数の型ってことに注意。
少数を扱いたいなら float か double。
ソースを見たところ i と n は int で構わないだろうけど、それ以外は少数なんでないかい?
0714デフォルトの名無しさん2005/07/12(火) 15:45:34
wa
kou
が逆だろ。ゆとりありすぎ
0715デフォルトの名無しさん2005/07/12(火) 15:50:14
蛇足ながらもう一点。
浮動小数点型においてたくさんの数値を足し込むときには、値の小さいものから足していくと誤差が少なくなるよ。
とどのつまり上記問題では、i を 1 から n に向かってループさせるのではなく、n から 1 に向かってループさせると
精度が良くなるってこと。

これは C固有のテクニックではないけどね。
07167122005/07/12(火) 15:52:23
みなさんどうもありがとうございました
0717デフォルトの名無しさん2005/07/12(火) 15:53:21
>>712
>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
>>718
括弧より、お前の知識が足りない。小学校からやり直せ
07207182005/07/12(火) 17:05:43
小学校にはなれませんね、残念ながら。
0721デフォルトの名無しさん2005/07/12(火) 17:06:34
なんだか凄い流れだな
0722デフォルトの名無しさん2005/07/12(火) 17:07:12
俺も括弧足りない気がする
>>719
解説よろ
0723デフォルトの名無しさん2005/07/12(火) 17:33:17
>>718 だけじゃないようだ。よかったね。

  だが気のせいだ。何を気にしているのか知らんが。
0724デフォルトの名無しさん2005/07/12(火) 17:34:07
fflush(stdin);のもっと行儀のいいポータブルな書き方ってないの?
0725デフォルトの名無しさん2005/07/12(火) 17:37:48
処理系依存
0726724!=7122005/07/12(火) 17:45:19
じゃあ712でscanfの入力でリトライ機能入れようと思ったらどう書くの?

for(;;){
printf("1以上の整数nは?\n");
if(scanf("%d",&n)==1 && n>=1) break;
*ここで行末まで読み捨てる。
}
0727デフォルトの名無しさん2005/07/12(火) 17:46:42
>>724
素直に読み捨てろ。
0728デフォルトの名無しさん2005/07/12(火) 17:47:27
scanf("%*[^\n]%*c");
0729デフォルトの名無しさん2005/07/12(火) 17:48:21
そもそもscanfは使わない希ガス
0730デフォルトの名無しさん2005/07/12(火) 17:49:36
>>726
scanf()を捨てろ。
0731デフォルトの名無しさん2005/07/12(火) 17:59:58
.。o sscanfとfgetsが相談しているようです。
0732デフォルトの名無しさん2005/07/12(火) 18:08:20
やっぱり括弧が足りない気がする。
07337262005/07/12(火) 18:14:51
>>728
なるほど。
でもEOFも検出しないと無限ループだからこんな感じか。ショッペー
for(;;){ int c = getchar(); if(c==EOF) return 0; if(c=='\n') break; }
0734デフォルトの名無しさん2005/07/12(火) 18:16:27
バッファをフラッシュするのとEOFまで読み捨てるのとでは意味が違う
0735デフォルトの名無しさん2005/07/12(火) 18:25:47
>>732
いったいどういう仕組みなんだろう、何で括弧入らないんだ?
割り算が先に評価されると思うのだが
0736デフォルトの名無しさん2005/07/12(火) 18:27:38
>>735
サンプルソース
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:44
いやだから>>712のニ行目を(ry
0738デフォルトの名無しさん2005/07/12(火) 18:32:15
fgetsとgetcharとstrchrで自作関数だ!
0739デフォルトの名無しさん2005/07/12(火) 18:35:08
今頃Cなんてやってどうするの?バカジャネーノ
0740デフォルトの名無しさん2005/07/12(火) 18:35:19
>>734
フラッシュする代わりに読み捨てちゃダメなの…?
07417362005/07/12(火) 18:36:26
>>737
あ、ちなみにおれは括弧が必要だと思ってるよ。
小学校に入れるものなら入ってやり直して女友達をいっぱい作りたい。
0742デフォルトの名無しさん2005/07/12(火) 18:41:46
あれ、1行目と2行目がつながりませんよ
0743デフォルトの名無しさん2005/07/12(火) 18:47:07
>>742
どういうこと、つながってないとは、一連の問題文に読めるが?
0744デフォルトの名無しさん2005/07/12(火) 18:48:10
double f(int n)
{
return (n<1) ? 0 : f(n-1) + (8.0 / ((4*n-3) * (4*n-1)));
}
0745デフォルトの名無しさん2005/07/12(火) 18:48:42
>>738
最近C言語の解説本、増えてるよね? 流行ってんじゃねーの
0746デフォルトの名無しさん2005/07/12(火) 18:49:48
>>744
括弧あるじゃん
0747デフォルトの名無しさん2005/07/12(火) 18:50:54
>>745
>>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:19
お前ら頭悪すぎ
0750デフォルトの名無しさん2005/07/12(火) 18:59:05
>>748
さすがにそれは違う
8/(1×3)+8/(5×7)
これはn=1 , n=2を連続して書いてるだけだ。代入してみなよ
0751デフォルトの名無しさん2005/07/12(火) 18:59:39
>>743
ごめん。おれの読み間違いみたいだ。
小学校に入って女友達作ってくる
0752デフォルトの名無しさん2005/07/12(火) 18:59:57
>>750
ありがとう。早とちりした。
0753デフォルトの名無しさん2005/07/12(火) 19:00:16
>>749
だから何で括弧が要らないのか教えてくれ。気になって仕事に戻れんw
0754デフォルトの名無しさん2005/07/12(火) 19:03:31
割るは÷だろ
/は分数
だから8/(4n-3)×(4n-1)は
    8
−−−−−−
(4n-3)×(4n-1)
なんだよ。小学校から出直せ。
0755デフォルトの名無しさん2005/07/12(火) 19:05:47
C2005では分数がサポートされます。
0756デフォルトの名無しさん2005/07/12(火) 19:07:22
>>754
なんだネタかツマラン
0757デフォルトの名無しさん2005/07/12(火) 19:07:32
>>754
a/b*c+d って書いたらどうなるんだい?

   a
−−−−
b * c + d

とか言っちゃう?
0758デフォルトの名無しさん2005/07/12(火) 19:18:28
http://www.komonet.ne.jp/~c/chap14.htm
0759デフォルトの名無しさん2005/07/12(火) 19:23:55
char Buf[480][640];

こういう2次元配列用のポインタって宣言出来ましたっけ?
0760デフォルトの名無しさん2005/07/12(火) 19:29:36
できるけどちょっと難しいよね。typedef組み合わせればわかりやすくなるかも
0761デフォルトの名無しさん2005/07/12(火) 19:29:38
char (*bufp)[640];
07627592005/07/12(火) 19:48:37
thx>>760-761

上手くいきました。

>char (*bufp)[640];
どう読むのか難しいでつね。
0763デフォルトの名無しさん2005/07/12(火) 19:48:45
「FF�Z→C言語
 FF�[→アセンブラ言語」
0764デフォルトの名無しさん2005/07/12(火) 20:38:18
>>762
bufp 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:17
#include <stdio.h>

int 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:46
それC言語の話題じゃない。
0768デフォルトの名無しさん2005/07/12(火) 22:18:54
関数名だけ見て。
素数かどうかチェックする関数だろ。
0769デフォルトの名無しさん2005/07/12(火) 22:25:35
if は条件分岐で、 for は条件ループで、returnは変数からのリターンで
is_primeは素数判定で、printfは標準出力への文字列表示です。
0770デフォルトの名無しさん2005/07/12(火) 22:42:58
>>766
マジレスすると
http://pc8.2ch.net/test/read.cgi/tech/1087648569/104
の答えw
0771デフォルトの名無しさん2005/07/12(火) 22:55:03
ファイルを開くとき、ファイル名に~/とか../を使いたいんですが、
fopenではファイル名にこういうのを入れられない。
フルパスに展開する関数とかあるんでしょうか。
0772デフォルトの名無しさん2005/07/12(火) 22:56:41
ないよ。環境変数のHOMEとか取得するしかないかな。
いずれにせよ、環境依存のコードになるだろうな。
0773デフォルトの名無しさん2005/07/12(火) 23:04:49
../って使えないの?
0774デフォルトの名無しさん2005/07/12(火) 23:08:59
>>773
可
0775デフォルトの名無しさん2005/07/12(火) 23:09:42
>>771
Winなら GetFullPathName とかなかったっけ? ~ ならUNIX系か
>>773
Winなら使えた記憶がある
0776デフォルトの名無しさん2005/07/12(火) 23:11:48
はー?
0777デフォルトの名無しさん2005/07/12(火) 23:12:21
#include <stdio.h>

int 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
>>777
まともに動かないのは、forの括弧が抜けてるから
07797782005/07/12(火) 23:15:10
それだけじゃ、ないみたい・・・w
0780デフォルトの名無しさん2005/07/12(火) 23:18:10
まるでループ不要
0781デフォルトの名無しさん2005/07/12(火) 23:20:56
ループ意味をなしてないですよねw

かなり強引につくったんですが
0782デフォルトの名無しさん2005/07/13(水) 00:08:37
>>777
つhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/711.txt
0783デフォルトの名無しさん2005/07/13(水) 00:23:02
double a, b, c;
a = 0.509;
b = 1.501;
c = a ^ b;

↑こんな感じで書くとビルドエラーになるんですが、小数同士の
Xorを取るにはどうすればいいんでしょう?
"^"の左右オペランドが間違いとか言われます。
0784デフォルトの名無しさん2005/07/13(水) 00:28:35
小数のXORって……一体どんな値が出ることを期待しているのかなぁ。
■ このスレッドは過去ログ倉庫に格納されています