トップページ⇒tech
909コメント312KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe YouichiNGNG
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0552Kusakabe YouichiNGNG
In article >>549, デフォルトの名無しさん/549 wrote:

> sum += a;
> と
> sum = sum + a;
> とどっちがいいの?

Cだったら前者でいいのでは?
後者のように書く意味はとくにないでしょう。
0553デフォルトの名無しさんNGNG
入力分 : m
入力秒 : s

hour += (mim += (sec += s) / 60 + m) / 60;
min %= 60; sec %= 60;
0554defaultの名無しさんNGNG
過去スレ検索してないけど質問してよろしい?
0555デフォルトの名無しさんNGNG
>>554

よい。
糞壁が書き込むよりずっとまし。
0556Kusakabe Youchi NGNG
>>554

スレって何ですか?
0557デフォルトの名無しさんNGNG
>>556
ここは祭り禁止ですよ。
0558デフォルトの名無しさんNGNG
>>554
とりあえず >>1 にある C FAQ だけは読んどけ。
0559defaultの名無しさんNGNG
>>558
>>1のC FAQを見てもわかりませんでした。
一体日下部陽一って何なんですか?
0560ありNGNG
fread()とかでファイルを読むときにfp指定するけど、
このfpって次に使うときは、進んだままになっちゃうの?

はじめてのCって本の例題見るとそんな感じになっていました。
0561デフォルトの名無しさんNGNG
>>560
戻したければ fgetpos(), fsetpos() 使う。ftell(), fseek() でも良いけど。
0562デフォルトの名無しさんNGNG
>>559
それはプログラマー板で聞きましょう。技術じゃないし。
0563Kusakabe YouichiNGNG
In article >>560, あり/560 wrote:

> fread()とかでファイルを読むときにfp指定するけど、
> このfpって次に使うときは、進んだままになっちゃうの?

fpで指している構造体の中の一部にそれを覚えておく箇所があるわけですね。
次にreadしたりwriteしたりfseekしたらずれますが。
0564デフォルトの名無しさんNGNG
fpで指している構造体を使わないreadやwriteを使ってもずれるわけですか。
不思議ですね。
0565デフォルトの名無しさんNGNG
a〜hまでの8文字の中から4つを選び出す組み合わせを全て表示するプログラム
を知りたいのですが、

グーグルで「c 組み合わせ アルコリズム」で出ますか?
0566デフォルトの名無しさんNGNG
日下部は騙りを無くすためにトリップ使え。
0567デフォルトの名無しさんNGNG
日下部先生マンセー
0568Kusakabe YouichiNGNG
In article >>567, デフォルトの名無しさん/567 wrote:

> 日下部先生マンセー

ビル建設中にべつの場所にあったときのほうがおいしかったですね > 黒豚のトンカツ
0569デフォルトの名無しさんNGNG
>>568
わ、わかりにくい... 一瞬考えてしまったが肉屋の方か。
0570time.hNGNG
時間の話題なのに、おもいっきり無視されてる…
ウツダ
0571デフォルトの名無しさんNGNG
小数点以下一桁を切り上げする方法と
割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を
教えてください。お願いします。
0572デフォルトの名無しさんNGNG
>>571
>割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を

ライブラリでも用意するしかないよ。
0573デフォルトの名無しさんNGNG
>>571
> 割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を
そんなに大きな桁を何に使うの?
無量大数でも68桁(88桁の説もあり)なのに...
0574デフォルトの名無しさんNGNG
K&Rを勉強中の初学者です。
演習2-9で分からないところがあるので、おしえていただきたいのです。

コードの改良は、

int bitcount (unsigned x)
{
int b;

for (b=0;(x=(x & (x-1)) != 0;b++)
    ;
return b;
}

でいいんじゃないかと思うのですが、

2の補数システムではなぜそうなるか、の説明がよくわかんないです。

最も右の1ビットから下位ビットが1の補数となり、&によって、0がセットされるため、
最も右の1ビットが消える。

では、ちょっと的外れのようなので、正しい理由を教えていただきたく思います。
もちろん、コードの間違いもありましたら、お願いします。
0575571NGNG
>>572-573
課題で出されたものです。
もしかして課題とかの質問はだめですか?
ちょっと一人ではわからないので詳しい人に聞きたいのですが...
0576デフォルトの名無しさんNGNG
>>575
「多倍長整数演算」とかで、検索かけてみ。
ここで説明するのはきつい。
0577デフォルトの名無しさんNGNG
>>574
コンパイルする環境ないの?
そのコードは動いてないよ。
0578デフォルトの名無しさんNGNG
>>574
何も間違ってないぞ。
その解釈であってる。
0579デフォルトの名無しさんNGNG
>>574
101000 (x)
100111 (x-1)
100000 (x & (x-1))
0580571NGNG
>>576
ありがとうございます。
0581デフォルトの名無しさんNGNG
>>575
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/index.html
リンク先の項番71から読め
0582デフォルトの名無しさんNGNG
srtcmpを使って数字を比較しようとしているのですが、
これだと2つの値が同じときでも後者が大きいと判断
されてしまいました。
ちゃんと等しいときに0を返してくれるのってどうすれば
いいのでしょう?

#include<stdio.h>
#include<string.h>

int main(){
char a[2],b=0;
a[1]=10;
a[2]=10;
b=strcmp(&a[1], &a[2]);
printf("a[1]: %d a[2]: %d b=%d\n",a[1],a[2],b);
if(strcmp(&a[1], &a[2])==0)
printf("等しい\n");
else if(strcmp(&a[1], &a[2])>0)
printf("a[1]が大きい\n");
else
printf("a[2]が大きい\n");
}
0583571NGNG
>>581
ありがとうございます。
読んでみましたがよくわからないです。。。

C言語及びプログラム言語初心者には
難しい課題を与えられた気がします。。。
もっと簡単にできないでしょうか?
0584デフォルトの名無しさんNGNG
>>582
> srtcmpを使って数字を比較しようとしているのですが、
そもそもstrcmpは数字を比較するものではない。

> ちゃんと等しいときに0を返してくれるのってどうすれば
> いいのでしょう?
「ちゃんと等しい」をもっと「ちゃんと」定義して欲しい。

とりあえず
> if(strcmp(&a[1], &a[2])==0)
if(a[1] - a[2])
では駄目なのか?
0585デフォルトの名無しさんNGNG
>>582
>srtcmpを使って数字を比較しようとしているのですが、
もうね、アホかと。馬鹿かと。
0586デフォルトの名無しさんNGNG
あのさぁ、だめだめ!
割り算ってどーやるの?あれ?
まずふつーにやるだろ?余りがでんだろ?
その次どーすんの?0くっつけんだろ?それってなに?10倍ジャン?
そーやってやると小数圏に突入(乳突起きぼんぬ)すんだろ、
そんでつづけていけば最高じゃんか

そーやってやれ。余裕だ。
0587デフォルトの名無しさんNGNG
>>584
> そもそもstrcmpは数字を比較するものではない。
ごもっともです。
でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
0にはなってくれません。

とりあえずif(a[1]-a[2])でもできないこともなさそうです。
ありがとうっす。
0588デフォルトの名無しさんNGNG
>>582
すごい妄想だな!
strcmpは同じだとTRUE=1を返すんだっけ?そこが逆?
あと、数字の大きさ比較するにはなにも、引き算でいいじゃんか
0589デフォルトの名無しさんNGNG
引き算したかったらatoiを使えYO
たとえば文字(列)"4"を数字でつかえる4にしてくれるZO
0590デフォルトの名無しさんNGNG
ちなみにAPI板にも寄ってください・・・
0591デフォルトの名無しさんNGNG
そこまでたたかなくてもいいじゃん(^-^;
0592デフォルトの名無しさんNGNG
宿題レスにもな。
0593デフォルトの名無しさんNGNG
>>574
for (b=0; x != 0; x&=(x-1), b++)
にしないと、x=1のときゼロになる
0594デフォルトの名無しさんNGNG
>>587
> でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
> 0にはなってくれません。
残念ながらstrcmpは「文字」を比較するものでもありません。
「文字列」を比較します。

「文字」と「文字列」の違いについては入門書を良く読んでください。
0595デフォルトの名無しさん NGNG
とりあえず添え字は0からだよ、a[2]は書いてはいけない領域
0596デフォルトの名無しさんNGNG
つーか複雑なこといわなくても、
文字を比較したかったら=使えばいいじゃんか
strcmpは文字も比較できるぞ。
=使ってて例えばabcdefghi(\0)からbcdなりcなりを
抽出したいときはどーする?そーゆーときstrcmpとか
シリーズを使うのだ!
0597デフォルトの名無しさんNGNG
>>596
> strcmpは文字も比較できるぞ。
できません。
できると思う人はできる例を示してください。

char a = 'a';
char b = 'a';
これをstrcmpでどう比較するの?
0598デフォルトの名無しさんNGNG
>>597
strncmpを使えばできるね。
strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
できないと言えなくも無いね。

だけど、そんなコードを俺の目の前で書いたら、氏なす。
0599デフォルトの名無しさんNGNG
>>598

それはたまたま'\0'があったらってことだよね?
多くの場合において無いと思うから、同じ文字だったらアクセス違反になるだろうね。

ところで、なんで比較演算子を使いたがらないんだろう?
数字が昇順に並んでいない文字コードがあるの?
もしあったとしても、atoi()で変換してやればいいじゃない。
0600599NGNG
あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・
0601Kusakabe YouichiNGNG
In article >>599, デフォルトの名無しさん/599 wrote:
> ところで、なんで比較演算子を使いたがらないんだろう?
> 数字が昇順に並んでいない文字コードがあるの?

けっこうありますね > そういうコードセット
0602Kusakabe YouichiNGNG
In article >>600, 599/600 wrote:

> あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・

え、それとは独立な問題ですよ。
0603デフォルトの名無しさんNGNG
>>597
馬鹿言うな
文字比較したいときは人間の手で一文字の
配列をつくるんですYO。
たとえば文字(列)検索ルーチンで
わざわざ一文字と複数文字の区別するんですか?
(ちょっとはするけどさ)基本的に文字列としてあつかうでしょ?
0604Kusakabe YouichiNGNG
In article >>603, デフォルトの名無しさん/603 wrote:
> たとえば文字(列)検索ルーチンで

どっちですか? > 文字/文字列
0605デフォルトの名無しさん NGNG
糞壁が痛い人を呼んでいるので終了。
Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)
strcmpは文字列を対象に書かれてますので、文字の照合は///出来ません///
0606デフォルトの名無しさんNGNG
>>strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
>>できないと言えなくも無いね。
この辺りから糞壁信者っぽい、ネタにもならんね
0607デフォルトの名無しさんNGNG
大体文字と文字列の区別なんて意味がわかっちまえば
こだわる必要ねーんだよ。意味がわかったら
人間語の文字つー意味にもどれよ。
要は終記号がないとコンピューターが判断できない
つー話でしょうが。

テキスト中の文字(列)検索したいときに
いちいち一文字と複数文字の区別考えて
「えーっと、いま検索窓にaっていれたから
今は文字検索したな」やれ「あ、”あいう”っていれたから
これから文字列検索をします!」とか下らんことかんがえる
わけですか?語句検索すんのに文字も文字列もきにしないんですけど。
0608デフォルトの名無しさんNGNG
じゃぁ文字照合したいときはどーすんの?
できないじゃん。
どーせちょちょっとやって、strcmp使ったって
いいんじゃんか。おんなじことだぜ?ほかの方法つかったって。
0609Kusakabe YouichiNGNG
In article >>605, デフォルトの名無しさん/605 wrote:
> 糞壁が痛い人を呼んでいるので終了。

わたしのせいにしようとしても無駄ですよ:)
呼んでいるのはあたなでしょう:)

> Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)

なんじゃそりゃ:) > 例え
0610Kusakabe YouichiNGNG
In article >>607, デフォルトの名無しさん/607 wrote:
> テキスト中の文字(列)検索したいときに

で、どっち? :) > 文字/文字列
0611デフォルトの名無しさんNGNG
以下605の戻って無限ループ
===終了===
0612デフォルトの名無しさんNGNG
(・∀・) デンパイタデヤッテロ!!
0613デフォルトの名無しさんNGNG
うぉ!まだ言ってるんのか!
僕はヤフー検索するのに文字か文字列
なんて考えません。語句です。語ですか?句ですか?
とかいっちゃうあなたにマイナス1点
だいたいあなた、間違ってるYO.
文字列or文字、それでWholeをカバーするんですか?
絶対にどっちかだ!とか考えてんでしょ?
文字列を文字の区別はYes or Noとは違いますよ?
僕は人間言葉の文字という意味を使った。
0614574NGNG
有り難うございました。
考え出したら、ぐるぐる巡ってしまって、ちょっと解んなくなってました。
コードは、')'が足りなかったですね。
有り難うございます。

では、また、頑張ってみます。
0615デフォルトの名無しさんNGNG
ここで糞壁を煽るのは良いけど、技術的な突っ込み所満載な悲惨さまでは
再現しなくていいよ (^^;
0616Kusakabe YouichiNGNG
In article >>613, デフォルトの名無しさん/613 wrote:

> うぉ!まだ言ってるんのか!
> 僕はヤフー検索するのに文字か文字列なんて考えません。

っていうかどっちですか?

1文字の文字と、
1文字の文字列は別物ですよ。
0617デフォルトの名無しさんNGNG
いやマジで他所でやって頂きたい
>>613
>僕は人間言葉の文字という意味を使った。
人間言葉の文字って何? 検索しても出てきませんが?
0618デフォルトの名無しさんNGNG
サイコロをA回振ります。
1〜6のそれぞれの目が出た回数を記録していきます。
振り終わった時に考えられる結果(1がm回、2がn回、3が…)
の総数と、一番多く出た目の数と一番少なく出た目の数の
差がB以下になる確率を出します。
Aを入力してからBを入力すると計算が始まります。
不正な数字が入力された時のチェックなどは省いています。
と、いうプログラムを気合で作りました。C初心者です。

添削希望です。
もっといい書き方などありましたら教えていただきたいです。
2回に分けてコピペします。
0619618NGNG
#include<stdio.h>
#include<conio.h>

void count(int *a,int margin,int *total,int *hit);
void haji(int *a,int *b);
void indec(int *a,int *b);

int zzz=0;

int main(void)
{
int eye[6]={0,0,0,0,0,0},margin,shake;
unsigned long int total=0,hit=0;
char ex;

printf("振る回数 … ");
scanf("%d",&shake);
printf("差 … ");
scanf("%d",&margin);

eye[0] = shake;

while(eye[5] != shake){



if(eye[5])haji(eye,eye+5);
else if(eye[4])indec(&eye[4],&eye[5]);
else if(eye[3])indec(&eye[3],&eye[4]);
else if(eye[2])indec(&eye[2],&eye[3]);
else if(eye[1])indec(&eye[1],&eye[2]);
else indec(&eye[0],&eye[1]);

count(eye,margin,&total,&hit);


}
count(eye,margin,&total,&hit);

printf("\n\n振る回数:%d回 差:%d以下\n",shake,margin);
printf("パターン数:%ld ヒット数:%ld ヒット率:%.15lf%\n\n",total,hit,(double)hit/(double)total*100);
printf("何かキーを押すと終了します。");

ex=getche();

if(shake>70){
printf("\n!!再確認!! 何かキーを押すと終了します。");
ex=getche();
}

return 0;

}
0620デフォルトの名無しさんNGNG
>615 寧ろ技術的な裏付けの無い発言を書き捨てる時の共有コテハン (w
つーか下げでやれ下げで
0621618NGNG
void indec(int *a,int *b)
{
(*a)--;
(*b)++;
}
void haji(int *a,int *b)
{
int i,kou=*b;

if(zzz < *b){
zzz = *b;
printf("%3d ",*b);
}
*b = 0;

for(i=4;;i--){
if(*(a+i)){
*(a+i+1) = kou;
(*(a+i+1))++;
(*(a+i))--;
break;
}
}

}
void count(int *a,int margin,int *total,int *hit)
{
int i,high,low;

high = *a;
low = *a;

for(i=0;i<6;i++){
if(high < *(a+i))high = *(a+i);
}

for(i=0;i<6;i++){
if(low > *(a+i))low = *(a+i);
}

if(high - low <= margin)(*hit)++;

(*total)++;
}


以上です。よろしくおねがいします。
0622デフォルトの名無しさんNGNG
eyeは無いでしょ(^-^;
0623あぼーんNGNG
あぼーん
0624618NGNG
>>622
あの、では、eofdieですか?英語弱くて…
あと、コメント無くてスイマセン。
0625デフォルトの名無しさんNGNG
>>608
> じゃぁ文字照合したいときはどーすんの?
strchr
ちなみに文字列照合の場合はstrstrを使う。

>>616も言っているが
「文字」と「文字列長が1の文字列」は別物

入門書から読み直せ
0626Kusakabe YouichiNGNG
In article >>625, デフォルトの名無しさん/625 wrote:
> 入門書から読み直せ

どんな入門書がよいでしょう?
0627デフォルトの名無しさんNGNG
「作ってわかるCプログラミング」を万引き
0628デフォルトの名無しさんNGNG
「ツクッテワカル Cプログラミング」ニ キマッテルダロ
0629デフォルトの名無しさんNGNG
作ってわかるCプログラミング、紙質が素晴らしいね
紙面の余白がとても多いのも良い、メモ帳にぴったりですね
次からはミシン目を入れて下さい :-D
0630Kusakabe YouichiNGNG
In article >>629, デフォルトの名無しさん/629 wrote:

> 作ってわかるCプログラミング、紙質が素晴らしいね

はい、ペイジ数がとても多いのに、厚さを増さないように、
高い紙を使ったそうです。

> 紙面の余白がとても多いのも良い、メモ帳にぴったりですね

え? 余白は「少ない」ですよ。わたしはもっと余白をとってほしかった
(とくに小口側じゃなくてノドの側、ぎっしりすぎて読みにくい)

「余白が多い」とかって、ようするに実物見てないのでは? :)
(ここで誰かが書いてたデマを信じて書いたんだったら、恥かくだけですよ^^)
0631デフォルトの名無しさんNGNG
>>627-629
ここでやるなよ。
隔離板へ逝け。
0632デフォルトの名無しさんNGNG
>>626
C言語入門書
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog78.html

によると
> 「悪い入門書」のチェックポイント
> ・著者のイニシャルがK(あ、あとついでにMも)である :-p
だそうです。
# 例えばK下部とかかな?
0633574NGNG
593さん、有り難うございます。
あの辺りのスレ読み飛ばしていました。
0634デフォルトの名無しさんNGNG
オライリーのC実践でいいんじゃないの?
0635デフォルトの名無しさんNGNG
>>632

http://www.amy.hi-ho.ne.jp/~lepton/program/mail/19990628.html
78の K西本批判は、その通りだと思います。
0636デフォルトの名無しさんNGNG
だから俺は明示的にC言語の「文字」
の意味だ、と言った覚えがないのだが
0637デフォルトの名無しさんNGNG
分かった分かった「人間言葉の文字」だよな (w
0638デフォルトの名無しさんNGNG
>>636
ここは C 言語スレです。一般的な「文字」について語りたいなら、別のスレでお願いします。
(そもそも「俺」って誰だよ、番号書いてくれないと名無しさんばっかで分からん)
0639exciteさんに訊いてみましたNGNG
人間言葉の文字
↓
The character of human language
↓
人間の言語の特徴
0640デフォルトの名無しさんNGNG
だったら君はテキスト内を検索
するときにせいぜいアスキーコードでも
使って配列でもつくるんだねw
0641Kusakabe YouichiNGNG
In article >>636, デフォルトの名無しさん/636 wrote:

> だから俺は明示的にC言語の「文字」

明示的っていう日本語はないですね。
0642デフォルトの名無しさん NGNG
どっけ池、糞壁!(・∀・ )♪
0643仕様書無しさんNGNG
上京を「京都に行くこと」と訳す人間に、
日本語語って欲しくないです。
0644デフォルトの名無しさんNGNG
上京ってのは、みやこへ行くことだろ。
京都の人間にとっちゃ、みやこは今でも京都だし、
それを聞いた東京の人間は、とっくに遷都しただろと思う。
0645デフォルトの名無しさんNGNG
スレ違いかつ板違い。
0646デフォルトの名無しさんNGNG
>>643
誤植です。
0647Kusakabe YouichiNGNG
In article >>643, 仕様書無しさん/643 wrote:

> 上京を(I☆ぢ京都に行くこと(I�C般�C洪祐屬法「

何言ってるんだかわからないですね。
0648デフォルトの名無しさんNGNG
それはCとは関係あるの? 関係ないならsageでね。
0649デフォルトの名無しさんNGNG
>>648
> それはCとは関係あるの? 関係ないならsageでね。
sageていれば関係無いことをいくら書き込んでもいいということですか?
0650デフォルトの名無しさんNGNG
なんでKusakabeの引用は化けるの?
0651Kusakabe YouichiNGNG
In article >>650, デフォルトの名無しさん/650 wrote:

> なんでKusakabeの引用は化けるの?

わたしのが化けているのではなくて、もとのがいけないだけでは?
0652デフォルトの名無しさんNGNG
kusakabeが悪いよ。
■ このスレッドは過去ログ倉庫に格納されています