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

C言語なら、俺に聞け! <26>

■ このスレッドは過去ログ倉庫に格納されています
0001日下部?はつみみですNGNG
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
0153デフォルトの名無しさんNGNG
できるよ。
どうせ有効桁数6桁だからその部分と'0'をずらっと並べる。
"3.40282000000・・・・"と
0154初心者NGNG
うるせえ!さる!
殺すぞ!おい、543!この野郎邪魔すんな!

0155デフォルトの名無しさんNGNG
>>154
あなたはこのスレに誤爆しないで・・・
0156デフォルトの名無しさんNGNG
>>152
完全な整数は無理。
そこまでの精度は無い
0157155NGNG
543って>>152のことか(ワラ
0158543NGNG
げ!
もしかして「近似」の結果なんすか???
ちなみに上の
「3.40282e+038 」
の意味を教えていただければと。。。

初心者でスンマソーン。。。
0159デフォルトの名無しさんNGNG
3.40282×10^38

0160デフォルトの名無しさんNGNG
3.40282x10^38
0161デフォルトの名無しさんNGNG
>>158
3.40282 * 10^38
0162543NGNG
>>159-161

本当にありがとうございます。
0163161NGNG
>>159-161
3Pハァハァ
0164初心者NGNG
おい!543!
無視すんな!
真面目ぶってもおもしろくねぇぞ!
笑わせろ!
0165161NGNG
>>164
おまえが笑わせてみろよ(プ
0166543NGNG
そうしてみると、ある巨大な整数(紙の上には書けるくらい)が、
「素数か否か」
を判定するプログラムってかなり難しいと考えていいですかね?
0167543NGNG
>164
おっきい?
0168初心者NGNG
Fカップですが何か?
0169543NGNG
豚なの?
0170デフォルトの名無しさんNGNG
宿題が出来なくて暴れてるヤツをかまうなって・・
0171デフォルトの名無しさんNGNG
>>166
多倍長整数演算のライブラリとか、どっかで拾ってくればいいよ。
0172543NGNG
ありがとう。

0173デフォルトの名無しさんNGNG
素数か否かを判定するには1から平方根までの素数で試し割りしてみるんだっけ?
割れなきゃ素数。

どおしても大きな値を扱いたいならそれなりに工夫が要る
組込型じゃ扱えない。

0174543NGNG
そうですか。。。
例えばですね、
全ての1以上の自然数nに対して、
n^2と、(n+1)^2 の間には必ず素数が存在する(リーマン予想)
はnが何兆の時まで正しい事が確認されている、らしいんです。

うーむ。。。これをCで動かすには。。。グタ。
0175デフォルトの名無しさんNGNG
やめときなさい。
0176543NGNG
はい。
0177デフォルトの名無しさんNGNG
C以外でも動かないだろ。

文字列を使って計算すれば?
たとえばunsigned shortは65535までしか扱えないけど
char num[10]なら"100000000"だぞ。
もちろん四則演算も自分で実装する。
plus(num1, num2);とか

あるいは大きな数字は複数のintで表すとか。
12345678=
1234*10000 + 5678だろ?
そうすればint num1 = 1234, num2 = 5678で表して
2で割るならおのおのを2で割れば?

0178543NGNG
>177
アイデアは嬉しいっす。
ありがとうございます。

ただですね、a+bをcで割る時に、
a,b両方がcで割り切れなくとも、a+bがcで割れることが
あるんです(例 a=b=1,c=2)。
0179デフォルトの名無しさんNGNG
a+bではなくa*10^x+bですが。
まぁいいか。
0180デフォルトの名無しさんNGNG
>>178
そのへんも、ちゃんと実装するのよ
0181543NGNG
考えてみます。
ありがとうございました。
一旦落ちて飯の支度をします。
0182デフォルトの名無しさんNGNG
無限ループに陥ったとき、画面上でマウスをダブルクリックするとループはとまりますが、ctrl+cを押した場合と異なった処理が行われているのですか?
0183デフォルトの名無しさんNGNG
> 一旦落ちて飯の支度をします。
0184デフォルトの名無しさんNGNG
>>181
どうしてもCじゃないとだめっすか?
このスレに書いている以上、どうしてもCじゃないとだめなのかもしんないけど。

標準でないライブラリを使ってもいいのであれば、
ttp://www.score.is.tsukuba.ac.jp/~okuma/OpenMath/
なんてどうだろう、って使ったことないんだけども。

bignumのある処理系使うと手軽なんだけど。
scheme (たいていbignum持ってる) とか、Rubyとか(この名前出すと厨房よってくるか?)。
でも処理の規模を考えるとこの辺の処理系使うのは速度に問題あり、かな。
0185543NGNG
>>184
ええとですね、
俺はCの勉強も兼ねてるんです。
もう直ぐ三十路なのに職も無く、ぷらぷらするのも
なんなので、C(VC++)を勉強してそれ関係の仕事にと。。。

遅い?
0186デフォルトの名無しさんNGNG
>>185
どういう方面に就職希望かわからんけど、
素数の計算とかはあんまり深入りしないで、違うことやったほうが
いいと思う。
0187543NGNG
>186
サンクス。
当方VBAはそこそこ使えますが、それ以外のプログラムは
html言語をちょろっと出来る程度なので凄く不安。。。
はぁ。。。
0188デフォルトの名無しさんNGNG
html・・・
0189デフォルトの名無しさんNGNG
>>185
なるほど、そういうことね。

おれも>>186の言うことに半分賛成。
でもこういう風に自分で課題を設定して何かやろうとするのはいいことだと思うよ。
ただ、今回の課題は初心者にはレベルが高すぎるような気がする。

やるとすると、

struct bignum {
 unsigned int *buf;
 size_t len;
};

みたいな構造体を使ってごにょごにょすることになるんだろうけど、
メモリ管理とかややこしい問題が絡んでくるんでかなりきついと思う。

どういった本を読んでます? (この話題も荒れるかも)
とにかくCに関してはクズ本が99%を占めてるんで、
下手な本で勉強するとロクなことにならん。

おれが今まで読んだ中では Practical C というオライリーから出てる本がいいかな。
入門書はそんなに読んでないけど。他にちゃんと読んだつったらK&Rくらいだからなあ。
ttp://www.oreilly.co.jp/BOOK/cpra/
これね。岩谷の粗悪な翻訳も以前出てたのでそれを掴まされないように注意してね。
0190デフォルトの名無しさんNGNG
>>185
遅くないよ。
0191デフォルトの名無しさんNGNG
俺の知り合いに45才で会社を起こして、自分でCのプログラム書いて
バリバリ稼いでいる奴がいるよ。

最近はさすがに疲れたのか、学生にアルバイトさせているが。
0192543NGNG
皆さんありがとう。
今手元にある本は、
「新C++言語入門 ビギナー編」 by 林晴比古
「新VisualC++6.0入門」    by ヾ

です。
先にも述べたとおり、これまで組んできた事のある言語は
HTMLとVBA。
VBAのほうは(マクロを組むと言うのかな)、ちゃんと金融会社
に勤務中に、ある計算をするためにプログラムを組んでいました
(moduleを沢山使いました)。

あとUNIXも使った事はあるんです。
手元にある本は
「UNIX プログラミング環境」 by kernighan and Rob.Pike
(石田 晴久訳)

です。
0193デフォルトの名無しさんNGNG
本で1から練習するよりも、本を片手に実践の方が
速く身に付くよ。
0194デフォルトの名無しさんNGNG
C言語はJavaなどの言語に比べて細かいプログラムが
組めるらしいのですが、 具体的にどのくらい細かくまでプログラミングできるのでしょうか
0195デフォルトの名無しさんNGNG
>>194
細かさの意味がわからんが、大して変わらんかと
0196こうやって細切れに出来るって事かなNGNG
#include <stdio.h>
int
main
(
int
argc
,
char
*
*
argv
)
{
printf
(
"Hello "
"World.\n"
)
;
return
0
;
}
0197デフォルトの名無しさんNGNG
レベル ノ ヒクイ ジサクジエン ニ ワラタ
0198デフォルトの名無しさんNGNG
>>193
どーい。この分野ほど、知っているだけではなにもできない分野はないね。
なんでもひたすら試してみるといいよね。
0199デフォルトの名無しさんNGNG
random
randomize
って使ってる?
0200デフォルトの名無しさんNGNG
srandやrandなら使わんことも無い
0201デフォルトの名無しさんNGNG
malloc
free
って使ってる?
0202デフォルトの名無しさんNGNG
pennis
って最近使ってる?
0203デフォルトの名無しさんNGNG
NTTコムウェア
って知ってる?
0204199NGNG
房のせいでちゃんとした回答が得られなかった
020533NGNG
超亀レス

>34 36
ありがとう。
0206543NGNG
スンマソーン。
再び543っす。
仮に面接で、
「C言語できますか?」
ってきかれたら、俺のレベルで、
「簡単なプログラムなら出来ます」
って答えて問題無いすかね???
0207543NGNG
http://pc.2ch.net/test/read.cgi/tech/1023530449/
ここの543でした。
すみません。。。
0208デフォルトの名無しさんNGNG
>>206
「簡単なプログラムなら出来ます」
なんて回答をしている時点で
相手には君のレベルが分かっちゃうからOK!
0209543NGNG
???
よくわからんです(笑)
0210デフォルトの名無しさんNGNG
>>206
具体的に作ったプログラムを言った方がいいのでは?
0211543NGNG
んじゃぁ、ここの553に書いたものが自作の中で
最新のものだと人に言えないかも。。。

http://pc.2ch.net/test/read.cgi/tech/1023530449/

C言語二日目。。。
0212デフォルトの名無しさんNGNG
2chをフル活用してますな
0213543NGNG
ええ。
0214デフォルトの名無しさんNGNG
本当に簡単だな
0215543NGNG
ええ。。。(恥
0216デフォルトの名無しさんNGNG
2次元配列の要素数を取得するにはどうすればよいですか?
0217デフォルトの名無しさんNGNG
質問なんですが

プログラムは細かく関数化したほうがいいですか?
フローチャートを書くことは勉強になりますか?
フローチャートって楽しいですか?

おねがいしまする
0218デフォルトの名無しさんNGNG
>>217
・物による。いろんな分割法あり
・まぁ、いい加減に書きまくるよりはイイかと
・俺は嫌い
0219デフォルトの名無しさんNGNG
>>216
厳密にはCには二次元配列はないと思った。

で、たとえば、
int ary[10][10];

なんて配列があったとして、要素数を求めるのは

sizeof(ary) / sizeof(ary[0][0])

だろうねえ。
0220デフォルトの名無しさんNGNG
>>218
ありがとうございました
ググルで 関数 分割法で調べてみまする
0221デフォルトの名無しさんNGNG
>>219
ありがとうございました。
C++にはあるんでしょうか・・・・?

でもそれはスレ違いになりそうなのでC++スレに逝ってきます
0222デフォルトの名無しさんNGNG
>>218
フローチャートは百害あって一利なしだと思う。
あっちゃこっちゃ飛ぶgotoの乱用みたいなチャートになりがちだし。
PADとかHCP(だっけか?)のほうがましだけど、
こういうのって擬似コード使うほうがよっぽどいいと思ってる。
0223217NGNG
関数内がifばっかりって…
やっぱり良くないですよね…
0224デフォルトの名無しさんNGNG
>>215
あっちでレスしてみたよ。584ね。

で、このレベルでプログラム書けます、というのは、うーん。
嘘じゃないけどもね(ニガワラ

まあでも仕事でやるとスキルがむちゃくちゃあがるからね。
独習よりははるかにいいと思う。
問題は、採ってくれるところがあるかどうかだけども(w
0225217NGNG
値が4つあって、その値を大きい順に並べて、その順番を数値に当てはめて返すという
関数なんですが
0226543NGNG
>>224
どうもです。
あっちのレス読んできました。
ありがとうございます。
とりあえず俺としては、
「プログラムを組む上で最も基本的なことが抑えられていて、
 且つ余計な事をしていないか?」
ということが問題だったのです。

といいつつ、気になるので質問させてください。
sm = ((a + b) * (b - a + 1)) / 2;
のほうが計算が速くなるとかっていうメリットはあるのでしょうか?

初心者ですんません。
0227デフォルトの名無しさんNGNG
>>226
うーん。まあVC++よりはCの話題だからこっちのスレでいいか(w

で、一般にループまわすよりは速くなります。

ただし欠点もあって、forでまわすよりもオーバーフローしやすいという問題があります。
掛け算してるところでね。
0228デフォルトの名無しさんNGNG
すいません 書き直します
値が4つあって、その値を大きい順に並べて、
その順番を数値に当てはめて返すという
関数なんですが

例
A=2 B=5 C=4 D=1
だったら
cbadなので5を返す

というのなんですが、
ifとかつかわずに可能でしょうか。
if使うとものすごく長くなってしまったので
おながいします
0229デフォルトの名無しさんNGNG
> その順番を数値に当てはめて返すという

わからん…

>例
>A=2 B=5 C=4 D=1
>だったら
>cbadなので5を返す

最大値を返すってこと?
0230デフォルトの名無しさんNGNG
>>228
ポカーン
0231デフォルトの名無しさんNGNG
bcad?
0232デフォルトの名無しさんNGNG
>>228
今世紀(はじまって間もないけど)最大の難問だ
何が言いたいのか全くわからん・・・
0233デフォルトの名無しさんNGNG
>>228
宿題?

A, B, C, Dが0未満じゃないと仮定して、こんな感じかな。
ただし、試してないよ。

#define numitem(a) (sizeof(a) / sizeof((a)[0]))

int max(a, b) {
 return (a > b) ? a : b;
}

int foo(a, b, c, d) {
 int i, m = 0, ary[4] = {a, b, c, d};

 for (i = 0; i < numitem(ary); i++) {
  m = max(m, ary[i]);
 }
 return m;
}
0234デフォルトの名無しさんNGNG
素因数分解のプログラムってどうやればいいんですか?
0235233NGNG
あっと、配列の初期化ってこういう風にはできなかったっけか(汗
0236デフォルトの名無しさんNGNG
>>234
ユークリッドの互除法でぐぐってみれ。
0237228NGNG
あ、すいません
例えば
abcdという順番で大きければ1を返す
bacdならば2を返す
でbcadなので5を返すという風にしたいのです。

この数字はなんでもよいです…
何かしら返り血から順番がわかるようにしたいのです

おねがいします(;_;)
0238デフォルトの名無しさんNGNG
>>234
楕円曲線法でぐぐってみれ。
0239228NGNG
そこで素直に
abcdを大きい順に変数M1からM4に格納して
M1が何なら どの値を返すという風に
IFを羅列しようと考えているのですが…
すいません
0240デフォルトの名無しさんNGNG
>>237
わかた〜よ!!
abcdの順列に番号をつけておいて
大きい順に並べ替えたものに対応する番号を返すんだね!!
0241228NGNG
>>240
配送です。
おめがいします
すいません
0242デフォルトの名無しさんNGNG
>>241

return (srt[0]*10000 + srt[1]*1000 + srt[2]*100 +srt[3]);

0243228NGNG
>>242
誤植ばっかりですいません2ch怖いので…

それってひとつの値が10を超えても大丈夫ですか?
引数の値は不定値で桁数がわからないのです。
0244デフォルトの名無しさんNGNG
オレ的にこう


#include <stdio.h>

int main(void)
{
int A=2, B=5,C=4, D=1;
int values[] = {A, B, C, D };

int result = 0;
for( int j = 0; j<4; ++j ) // j 番目に大きい数字を見つけて result に入れる
{
int min = 0;
int minIndex = -1;
for( int i = 0; i<4; ++i )
{
if ( values[i]>min )
{
minIndex = i;
min = values[i];
}
}
result |= (minIndex+10)<<(j*4);
values[minIndex] = 0;
}

printf( "%X\n", result );
return 0;
}
0245デフォルトの名無しさんNGNG
メガデモ級のが作れるようになれば一人前じゃないの
0246228NGNG
>>244
おおすごい
なるほど、
たしかにそうなんだな…
abcdを数字にすれば返せるし
ありがとうございました
0247244NGNG
>>246
あ、ゴメン
コメント逆だ、j番目に小さい数字を
0248デフォルトの名無しさんNGNG
2byte文字がうまくあつかえないのですが、その辺について詳しいサイト知りませんか?
0249デフォルトの名無しさんNGNG
>>248
ここはどう?
http://www.mars.dti.ne.jp/~torao/program/appendix/japanese.html
0250デフォルトの名無しさんNGNG
C++では#define NULL0;と書きますが、なぜC言語では#define NULL (void*)0;
と書くのですか?
0251デフォルトの名無しさんNGNG
>>250
#define NULL 0と書かれている場合もあるよ。
それとセミコロンはいらない。
0252デフォルトの名無しさんNGNG
次スレはケイコタンの1きぼんぬ
■ このスレッドは過去ログ倉庫に格納されています