C言語なら俺に聞け( ..
[2ch|▼Menu]
320:デフォルトの名無しさん
08/04/12 12:52:04
どの言語だろうと、基本的な部分は共通しているし
実装されている、出来ることを知ることの方が重要。
あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ
限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。
とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。

321:デフォルトの名無しさん
08/04/12 14:10:50
と、突然どうした。。。

322:デフォルトの名無しさん
08/04/12 14:15:56
簡単な文字出力のプログラムを作ったとして、
それをチャット上などで動作させることはできないのですか?
コマンドプロンプトの中でしか出力できないのですが

323:デフォルトの名無しさん
08/04/12 14:17:00
>>322
そう。

324:デフォルトの名無しさん
08/04/12 14:34:24
>>322
チャット上に文字出力するプログラム作ればいいじゃん

325:デフォルトの名無しさん
08/04/12 14:36:31
>>324
出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・

326:デフォルトの名無しさん
08/04/12 14:38:40
>>322
そのチャットソフトが外部プログラムを呼び出すようにできていれば、可能かもしれない。
# まぁ無理だ。

327:デフォルトの名無しさん
08/04/12 14:40:46
>>326
そうなんですか?teacupチャットだけど
ホットコーヒーのやつでは出来てたような。。。
とりあえず外部プログラムを呼び出すようにできてるかも分からないので、もちと勉強してきます!
ありがとうございました!

328:デフォルトの名無しさん
08/04/12 21:26:46
名古屋近辺の専門学校でC言語学びたいと思うんだけど、どこがあるか紹介して。
または2チャンネルのスレッドでそういうスレがあったらきぼん。

329:デフォルトの名無しさん
08/04/12 21:27:35
>>328
大学へGO!
やっぱり基礎が大事だから

330:デフォルトの名無しさん
08/04/13 07:30:38
C言語で操っている、操作させている、制御しているコンピュータの基本的な仕組み
そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて
ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞
物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは
0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。
ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、
その色は0と1の組み合わせで構成されているデータに見えてきただろ?
PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから
その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。

331:デフォルトの名無しさん
08/04/13 09:52:55
人間なんて所詮炭素と水なのさ

という話と同等のどうでもいい話

332:デフォルトの名無しさん
08/04/13 10:06:34
その通り、しかし、それを理解してそれに対して適切に制御、操作できれば
可能な範囲内で様々なことが出来るようになる。だから基本に戻れと。
ただ・・・人間も、いくら美人だろうとイケメソだろうが、所詮最後は朽ち果てて
この世から存在すらなくなってしまうのさ。ほら、躊躇してねーで、とっとと
好きなプログラムを作れ。そしてエロ画像で好きなだけはぁはぁしてろ、な?

333:デフォルトの名無しさん
08/04/13 10:08:37
>>332
生きた証をどう残すかだな。子孫か、グレートコードか。

334:デフォルトの名無しさん
08/04/13 10:10:29
なんで択一なんだよ
両方ゲットせいよ

335:デフォルトの名無しさん
08/04/13 10:11:39
もちろん両方残せるのが一番良い。

336:デフォルトの名無しさん
08/04/13 10:13:58
おまえら何の話してるんだよ

337:デフォルトの名無しさん
08/04/13 10:20:13
自分も可能な範囲で子供を作れるのさ、作られるものは
遺伝子レベルでのことになるが。

338:デフォルトの名無しさん
08/04/13 14:32:55
returnとか戻り値とかどういうときにどう使うんですか?
詳しくかつ解りやすく教えてください

339:デフォルトの名無しさん
08/04/13 14:43:45
自作した関数は式の中で使えるんだよ。

340:デフォルトの名無しさん
08/04/13 15:17:19
int main()

341:デフォルトの名無しさん
08/04/13 15:21:39
int sankaku(int teihen, int tkasa)
{
return teihen * takasa / 2;
}

int main()
{
printf("%d", sankaku(10, 50));
return 0;
}

342:デフォルトの名無しさん
08/04/14 18:18:42
ソースURLリンク(kansai2channeler.hp.infoseek.co.jp)
ヘッダファイル(Macの方はこれがないと実行できません)URLリンク(kansai2channeler.hp.infoseek.co.jp)

内容は1〜9の数字を表示して、中に入っていない数字(3が表示されていないなら3)を入力する簡単なゲームです
このままだと最高記録と、最後に終了した時刻を書き込むだけなのですが
いままでの記録のベスト10と、それぞれに対応した終了時刻を扱えるに変更したいです

最初にfread,fwrite関数で記録の要素数を計ってプログラムを組んだのですが
正常に読み取り、書き取りができませんでした
その時のコードを載せればいいのですが、そのままだといくつか変更しないとエラーが出るので正常に動くソースをさらしました
できるだけ簡単に記録のベスト10と、それぞれに対応した終了時刻を扱える方法を教えてください

343:デフォルトの名無しさん
08/04/14 21:33:40
どんどん流れてくるデータ列を、指定された割合で「バランスよく」
間引く方法で悩んでいます。

割合を%で指定された場合に、データ処理時に以下のようにしたのですが
int a = (clock() % 100) + 1;
if(a > DROPRATE) { ; }

これだと50%を指定したときに(0がFALSEで1がTRUEだとして)
000000111111000000111111
という感じに並んでしまい、
010101010101....
とはなってくれません。

出来るだけきれいに固まりが出来ないように間引くのには、通常どんな方法を
とればよいのでしょうか?

344:デフォルトの名無しさん
08/04/14 21:33:41
>>342
先ず、get_data()を改修してみよう。
fscanf()の使い方はそのままで、そこで得たbest, yearなどを格納できるように構造体配列を用意するのを忘れずに。
それができたら、テキストエディタで現在のkiroku.txtを編集してダミーデータを作ってそれを喰わせてみよう。
ここまでできれば、後はput_data()を改修して、記録の取り扱いのロジックを書けばいい。

要は、1件扱うのも10件扱うのも同じこと。
fscanf()とfprintf()で作っているのなら別途fread(), fwrite()が必要になるなんてことはない。

345:デフォルトの名無しさん
08/04/14 21:41:57
>>343
なんで clock なんか使ってるの?
rand 使えば?

346:デフォルトの名無しさん
08/04/14 21:44:43
いえ、randomで書いて、やっぱり固まり部分が出きるので
きれいにならぶ規則性がほしいな、と思っているのですが・・・
三角関数とか使うのは嫌だし・・・

347:デフォルトの名無しさん
08/04/14 21:45:11
>>343
clock() に DROPRATE を掛ければ委員ジャマイカ?

348:デフォルトの名無しさん
08/04/14 21:48:25
>>346
バケツ変数みたいなものを用意して、毎回通過時にDROPRATEずつバケツに足していくとか。
勿論、バケツが一杯になったら空にすればいい。
Ex.

static unsigned bucket = 0;
bucket += DROPRATE;
if (bucket >= 100) {
bucket = 0;
flag = true;
} else {
flag = false;
}

349:デフォルトの名無しさん
08/04/14 21:51:05
データ列の速度が1じゃないとだめか。
こうか?
a = (a+DROPRATE) % 100;
if(a > DROPRATE) { ; }

350:デフォルトの名無しさん
08/04/14 21:57:40
リサンプルにおけるエイリアシング現象じゃないの。

351:デフォルトの名無しさん
08/04/14 22:05:02
>>346
なるほど。規則的にしたいのか。
a 中に b 個 1 が規則的に出てきて欲しいのであれば、

void ab(int a, int b) {
for (int i = 0; i < a * b; i += b) {
printf("%d", (i % a < b));
}
printf("\n");
}

とかどうよ。

352:デフォルトの名無しさん
08/04/14 22:06:05
コメントありがとうございます。
>>347
 すみません。良くわかりません。
>>349
 なるほど、これだと確かに固まりが分散しそうですね。やってみます。

353:デフォルトの名無しさん
08/04/14 22:07:45
>>343
規則的でよければブレゼンハムのアルゴリズムが使えるよ
乱数要素を混ぜるならバッファ付のディザリングみたいの使えばおk

354:デフォルトの名無しさん
08/04/14 22:08:24
>>351
 ありがとうございます。やってみます。

355:353
08/04/14 23:02:19
>>343
いまさらだけど…
>>351 と同じインターフェイスで

void ab_(int a, int b){ // ブレゼンハム
int i, x;

for(i=0,x=a/2;i<a;i++,x+=b+1){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}

double uniform_rand(void){return (double)rand()/(RAND_MAX+1);}
void ab__(int a, int b){ // 乱数ディザリング
int i, d;

for(i=0;i<a;i++){
d=0;
if(uniform_rand()*(a-i)<b) d=1,b--;
printf("%d", d);
}
printf("\n");
}

356:デフォルトの名無しさん
08/04/14 23:52:21
>>355
 ありがとうございます。参考になります。

皆さんへ
 結局、>>351さんのループ部分をばらした関数を作って使いました。
 どうもありがとうございました。

357:デフォルトの名無しさん
08/04/15 00:24:57
>>353
347=349だけど参考になった。
ブレゼンハムのアルゴリズムっていうのか。

358:353
08/04/15 14:25:42
>>357
参考にするなら訂正しておくよ orz
void ab_(int a, int b){ // ブレゼンハム
int i, x;

for(i=0,x=(a+b)/2;i<a;i++,x+=b){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}

359:デフォルトの名無しさん
08/04/15 23:37:51
getchar()を使用し、絶対値を返すプログラムを作れ、ということで
ここでいろいろ参考にして、一応作ってみました。
結果は問題ないと出るのですが、イマイチ無駄な処理が多いかなと自信なくて、
修正できるとこがあれば、自分が判りそうな範囲で修正して教えてくださいー;
URLリンク(kansai2channeler.hp.infoseek.co.jp)

360:デフォルトの名無しさん
08/04/15 23:38:59
宿題スレ池

361:278
08/04/16 00:14:15
>>359
だから関数化しようって。
無駄な処理を言うなら、フラグを駆使してまでmainだけで頑張ることが無駄。
278のをgetchar使うように修正しといたから。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

362:359
08/04/16 00:21:36
>>361
すみません、わざわざありがとうございます;

363:デフォルトの名無しさん
08/04/16 00:55:50
質問お願いします。
#include <stdio.h>

int main(void)
{
  int x[80],y[80];
  int a=-400,b=-400,lp,c=0;
 
  for(lp=0;lp<40;lp++){
     x[c]=a;y[c++]=b;
     x[c]=a;y[c++]=-b;
     a+=20;
     }  
  for(lp=0;lp<80;lp++){
     printf("x[%d]=%d y[%d]=%d\n",lp,x[lp],lp,y[lp]);
     }
  system("PAUSE");
  return 0;
}
上のプログラムで、ループを使って配列変数に値を代入する部分で、
最初のループでyに値を代入する時、y[c++]にbの値を代入するようになってますが、この時cに+1されているはずなのになぜy[0]の部分にbが代入されるのでしょうか?
一応、線を引くための座標を代入させるのが目的なので、y[0]に代入されて正解なのですが、どうしても気になったので質問させていただきました。分かりづらい説明かもしれませんがどうかお願いします。

364:デフォルトの名無しさん
08/04/16 00:59:37
>質問お願いします。
日本語でおk

c++ は cの値を取り出して使った後で、 cの値が+1 となる
つまり上記のy[c++]=bは c=0であれば y[0]にbを代入した後に、c=1 となる
おk?

365:デフォルトの名無しさん
08/04/16 01:00:47
>>363
x[c]=a;
y[c++]=b;

これの前中後それぞれに、cの値を表示するprintf文入れりゃわかるよ。

366:デフォルトの名無しさん
08/04/16 01:08:38
y[c++] = b だと y[c]←b の後に cを1加算  つまり y[0] == b
y[++c] = b だと cを1加算した後に y[c]←b つまり y[1] == b

367:デフォルトの名無しさん
08/04/16 01:08:52
>>365
前後じゃわからんだろう

368:363
08/04/16 01:21:50
>>364-366
++の位置で1を加算するタイミングが変わるのですね。
理解することが出来ました。ありがとうございます。

369:デフォルトの名無しさん
08/04/16 02:47:52
>>359
すでに指摘されていますが、absolute() とするのならば、input() なども作るのはどうでしょう。
桁数切り取りの場合わけに苦労しているようですが、「数字部分で8桁」と考えればいいかと想います。エラー1, エラー2 の検出も簡単に記述できると思います。min, cnt, err が絡み合わないように整理したほうがいいでしょう。
9桁目以降で数字以外の文字が入力された場合は、題意としてはエラーにしたほうがいいかも?(これは仕様の読みの問題ですが。)

些細なことですが、
getchar() ( -> fgetc() ) の返り値は int です。
main の返り値は int がお約束です。

提示されたソースの手法に従うのなら、こんなのはいかが?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4))
URLリンク(kansai2channeler.hp.infoseek.co.jp)

>>361
きれい‥‥。でも質問者は <string.h> 全般がわからなくてスルーしちゃったのかも。

370:デフォルトの名無しさん
08/04/16 03:17:34
エラーを数値でやるより列挙子使おうぜと言おうと思ったがまだ習ってないか。

371:369
08/04/16 03:40:15
#define のかわりに列挙子を使う人もいますね。最近知りました。

372:デフォルトの名無しさん
08/04/16 14:10:53
質問です。
変数のみの行を記述してもコンパイルエラーにならないようですが、
・文法上、なぜOK?
・どんな動きをする(最適化等で消されて何もしない?)

void main(void)
{
 int a;

 a;       <- この行
}


373:デフォルトの名無しさん
08/04/16 14:13:08

BorlandC++ 5.5
Renesas C Compiler 9 for SH
でコンパイルOKでした。

374:デフォルトの名無しさん
08/04/16 14:17:33
・あらゆる式は;を付ければ式文として文になるから
・何もしない

375:デフォルトの名無しさん
08/04/16 14:26:21
例えばf(i);のように書いてあるとして、
あとから先頭の方に#define f(arg) (arg)と書けば
関数呼び出しが無かったことにできます
プリプロセスの都合上必要なだけです

376:デフォルトの名無しさん
08/04/16 14:26:25
Cでは関数を呼ぶのも代入も式の内なので、式文が許されないとプログラム書けない。

377:デフォルトの名無しさん
08/04/16 14:41:50
>>376
エラーにならない理由を聞かれて規則でそう決まってるじゃ答えになりません
エラーがでない理由はエラーにしない方がよいと言語の設計者が考えたからであって
文法規則はその結果でしかないです

378:デフォルトの名無しさん
08/04/16 15:09:08
訊かれてるのは「文法上、なぜOK?」であって、言語設計者がどう考えたかではないし

379:デフォルトの名無しさん
08/04/16 15:28:47
関係ないけどmainの戻り値はintにしとけ

380:デフォルトの名無しさん
08/04/16 15:41:28
ちっちっち、てんで説明になってないぜ、坊や達?一度、顔を洗って出直しな。
ついでに鏡を見てごらん。そう、何かこう、プギャー!な面が映し出されているだろ?
それが何だか分かるかい?そう、自分の顔さ。見事な面だろ?
人前に出た君を、周りはその顔の人だと見ているのさ。

それはさておき、a;がなぜおkかって?単項でも数式と言えるからさ。
こんなの、数学でも初歩的だよ?w

381:デフォルトの名無しさん
08/04/16 17:12:49
>>374-380
コンパイラ(構文解析か?)が仕様としたものが分かりました。ありがとうございます。

>>375 確かに。目にしていたはず。
>>380 "単項でも数式と言える"なるほど。 最後のwが興ざめですが。

382:デフォルトの名無しさん
08/04/16 19:45:59
なぁ〜〜にぃ〜〜!やっちまったな!
男は黙ってぇ〜 炭坑に入れ

383:デフォルトの名無しさん
08/04/16 21:04:19
しばらく平和だったのに頭おかしいのが戻ってきちまったな

384:デフォルトの名無しさん
08/04/16 21:16:38
平和ばっかりじゃつまらないだろ?たまにはリーチ、一発、タンヤオ、イーペーコー
七対子、対々和、三暗刻くらいは狙おうぜ?そして僕イケメン。

385:デフォルトの名無しさん
08/04/16 21:19:49
>>384
国士無双、四暗刻のダブル役満なみにねーよwww

386:デフォルトの名無しさん
08/04/16 21:20:20
国士のwktk感は異常

387:デフォルトの名無しさん
08/04/16 22:09:44
C言語の入門書を本屋で立ち読みしたのですが、
コンパイラとして無料で手に入るものもいくつかあがってました。
市販の処理系というのは、いずれ必要になるものなのでしょうか?
それとも、無料のもので長くやっていけるもの?

388:デフォルトの名無しさん
08/04/16 22:22:22
無理に市販のも使わなくてもいいよ。 無料で十分。
慣れて詳しくなってからでも、有料を選ぶのは遅くないだろうしな。

389:359
08/04/16 23:54:58
>>369
ありがとうございます、参考にさせていただきます。
あと、結果についてなのですが、case1のときのエラー判定が少し違ってて、
1aならエラー1、aaならエラー2、aならエラー2のように
ちょっと間違ってたようですー。

390:デフォルトの名無しさん
08/04/17 00:54:31
borlamd C++ compiler 5.5って、windows Vista でも動きますか?

391:デフォルトの名無しさん
08/04/17 03:09:46
>>390
GUIを持っているわけではなく、特殊なライブラリーもないから動くでしょう。
俺はもっぱらVisualC++2008 ExpressEditionを使っている。

392:デフォルトの名無しさん
08/04/17 07:16:23
まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。
あるアプリで競艇のデータを作っています。掛け金を掛け方に応じ変えています。
■2連複=2000■3連単=3000
また投資額は(掛け方*レース数)です。
アプリ上で掛け方を入れたら自動的に投資額がでるようなのですが、式が分かりません。
自分で色々試し
■IF(方式=2連複,((レース数*2000,((レース数*3000)みたいなのを作りましたが、これだとダメでした。
宜しくお願いします。

393:デフォルトの名無しさん
08/04/17 08:11:47
>まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。
「++」が何のことか判りませんが、Cの質問ではないようですので
お使いのアプリ名でスレタイ検索してみてはいかがでしょうか。

394:デフォルトの名無しさん
08/04/17 08:36:04
>>393
やはりそうですか。
ありがとうございました。

395:デフォルトの名無しさん
08/04/17 08:42:22
>>389
それはすみません。今時間がないので、本日遅くに修正いたします。

396:デフォルトの名無しさん
08/04/17 15:18:29
Borland C++Compiler をダウンロードしようとしてもうまくいきません。
登録を済ませてからダウンロードボタンを押しても
「Internet Exploler ではこのページは表示できません」
と出ます。どうしてでしょう・・・

397:デフォルトの名無しさん
08/04/17 16:00:03
Borland C++ Compiler オ ワ タ
スレリンク(tech板)

実はオワテないです、ちゃんとダウソしてくり

398:デフォルトの名無しさん
08/04/17 16:06:25
>>396
URLリンク(www.codegear.com)

↑のC++ BuilderもしくはTurbo C++を落とすべし。

399:デフォルトの名無しさん
08/04/17 16:31:06
hello, world.

出たーーーーーーーーーーーーーーー
これまでに要した時間3時間。
先が思いやられる


400:デフォルトの名無しさん
08/04/17 18:17:05
質問です。いま入門書をみてテキストのプログラムを打ちこんでいるのですが、
以下の内容だとコンパイルできません。エラーはif構文に ) がないと表示さ
れてしまいます。


int a = 10
int b =20

~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
printf("aが20 またはbが30 またはaが10でない");
if (a== 20 || b== 30 || a!== 10)
{
printf("条件に当てはまりました。\n");
}
else
{
printf("条件に当てはまりません。\n");
}
}




401:デフォルトの名無しさん
08/04/17 18:17:09
ここはあなたの日記帳ではありません

402:デフォルトの名無しさん
08/04/17 18:17:44
>>400
!==

403:デフォルトの名無しさん
08/04/17 18:24:11
それで、ひとつひとつ調べたところ

if(a == 20 || b == 30)

だとコンパイルされます。他の値も調べてみたんですが、
ifに続く条件が3つになるとコンパイルできないことがわかりました。
2つまでだとコンパイルできます。

Borland C++Compilerの無料のCコンパイラを使用しているんですが
これに問題があるのでしょうか?


404:デフォルトの名無しさん
08/04/17 18:25:42
>>400

ありがとうございます。
一度やってみます。

405:デフォルトの名無しさん
08/04/17 18:25:48
それで、じゃねーよw


406:デフォルトの名無しさん
08/04/17 18:26:33
すいません
>>402さんでした
ご指摘ありがとうございます



407:デフォルトの名無しさん
08/04/17 18:42:17
やっぱり
if (a== 20 || b== 30 || a!== 10)をif (a== 20 || b== 30 || a!= 10)
と打ちなおしても if構文に ) がない、関数main
とエラーが出てしまいます。

うーん、やっぱり駄目なのかな


408:デフォルトの名無しさん
08/04/17 18:44:26
そういう慌てん坊さんは、格好悪くて括弧がつかないって中学校の数学の教師が言ってた

409:デフォルトの名無しさん
08/04/17 19:13:26
0で割る(除算する)と「問題が発生したため...」となって強制終了されるのですが、
0で割るのをやめる以外で、エラーを回避する方法はありますか?

410:デフォルトの名無しさん
08/04/17 19:36:58
>>409
0で割るのをやめる。

純粋に疑問なんだが、0で割ってエラーにならないとしたらどういう結果
になるのが自然だと思うんだろう。



411:デフォルトの名無しさん
08/04/17 19:47:40
なぜ0で割れないのか不思議だったが考えてみれば簡単で当然だった
16を4で割るということは16を4つのグループに分けるということ
どんな数字も0個のグループに分けることはできないんだから

412:デフォルトの名無しさん
08/04/17 19:52:18
0で割ったら0にしてほしいと思っています。
そのほうが便利だと感じます。

413:デフォルトの名無しさん
08/04/17 19:53:26
浮動小数点数でおk

414:デフォルトの名無しさん
08/04/17 20:06:51
>>400
int a
int b
の宣言文にセミコロン。

415:デフォルトの名無しさん
08/04/17 20:14:27
0をかけるってことは0の逆数で割るってことで、0/0で割ること。
0/0で割るのは0/0をかけるのと同じだから、0で割るのは0をかけるのと同じで0になっていい。
コンピューターだとビット演算の仕様でそういうことにはできないのかな。

416:デフォルトの名無しさん
08/04/17 20:15:07
>>407
黙ってソース全体をコピペするなりどこかに上げるなりしろ

417:デフォルトの名無しさん
08/04/17 20:15:54
>415
目をさませ
あるいは寝ろ

418:デフォルトの名無しさん
08/04/17 20:23:35
逆数

0 でないある数 a に対して、a × b = 1 となるような数 b を a の逆数 (ぎゃくすう) といい、

419:デフォルトの名無しさん
08/04/17 20:24:14
なるほど、1=2という結論ですね。

420:デフォルトの名無しさん
08/04/17 21:08:37
>>419
それは違う。それが成り立ってしまうと、数学的帰納法で全ての数が等価になってしまう。

421:デフォルトの名無しさん
08/04/17 21:15:48
なにか問題が?

422:デフォルトの名無しさん
08/04/17 21:24:01
>>414
セミコロンをつけましたがやはりダメでした

423:デフォルトの名無しさん
08/04/17 21:26:22
>>400>>402,414以外の間違いは見当たらないんだが。

424:デフォルトの名無しさん
08/04/17 21:44:04
エラーメッセージ貼れよ

425:デフォルトの名無しさん
08/04/17 22:04:46
#include<stdio.h>
#include<math.h>

int main(void)
{
double i,n,S;

for(i=10;i<=1000000000;i*=10){
S=0.0;
for(n=1;n<=i;n++){
S+=asin(n/i) /sqrt(1.0-(n/i)*(n/i)) /i;
}
printf("分割点%10d: %lf\n",i,S);
}
return 0;
}
domain errorが発生するんだけどどうして?

426:デフォルトの名無しさん
08/04/17 22:20:36
%dにdouble突っ込みゃそりゃどうなるか分からん罠。

427:デフォルトの名無しさん
08/04/17 22:28:17
>>425
sqrt(1.0-(n/i)*(n/i))が怪しい
1.0-(n/i)*(n/i)の計算結果が-0.0になることがあるんじゃないの?
sqrt(fabs(1.0-(n/i)*(n/i)))にしてみるとか


428:デフォルトの名無しさん
08/04/17 22:31:15
>/sqrt(1.0-(n/i)*(n/i))
これがまずい。
nがiのとき0で割ることになる

>>426
そこもおかしいが、domain errorとは関係ない

429:デフォルトの名無しさん
08/04/17 22:35:29
#include<stdio.h>
#include<math.h>

int main(void)
{
double i,n,S;

for(i=10;i<=1000000000;i*=10){
S=0.0;
for(n=1;n<=i;n++){
S+=asin(n/i) /sqrt(fabs(1.0-n/i*n/i)) /i;
}
printf("分割点%10d: %lf\n",i,S);
}
return 0;
}
やっぱりできない

430:デフォルトの名無しさん
08/04/17 22:36:38
i, nをintにして、(n/i)の計算を((double)n/i)にするとか

doubkeを
> for(i=10;i<=1000000000;i*=10){
のように計算するのは好ましくない。誤差が出てしまう。

431:デフォルトの名無しさん
08/04/17 22:41:01
>>415
1 / 1 = 1
1 / 0.1 = 10
1 / 0.01 = 100
1 / 0.000...001 = 100...000
1 / (10 ^ -n) = 10 ^ n
こうやって被除数を限りなく0に近づけて
1 / 0 = ∞
という考えもできる。俺が厨房のときはこれだと思っていた。

ところがこれ、負のほうから0に近づけると-∞になるから
こういう極限は存在しなかった。

432:デフォルトの名無しさん
08/04/17 22:58:13
>>430
でないだろ普通・・・
お前の環境doubleが何byteなんだよw

433:デフォルトの名無しさん
08/04/17 23:05:30
どうすれば誤差が出るのか理解せずにdoubleだと誤差が出るって覚えこんだんだろうな。

434:デフォルトの名無しさん
08/04/17 23:17:46
>>423
わかりました。

if (a== 20 || b== 30 || a!= 10)
               ↑を !a にしたらコンパイルできました。

考えてくれてありがとうございました。



435:デフォルトの名無しさん
08/04/17 23:28:37
>>434
いや、ちゃんとコンパイルできますよ。
これをコンパイルしてみてください。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
当方で確認した環境はWindowsXP, 処理系はcygwin(gcc3.4.4) です。

うまくいかない場合は、実行環境/コンパイラの種類を教えてください。
手に入るものなら私でも試してみます。

436:423
08/04/17 23:29:30
>>434
402,414の2つのレス分直したらコンパイル通ったぞ
どこか違うところ間違ってないか

#include<stdio.h>
int main(void)
{
int a = 10;
int b = 20;

printf("aが20 またはbが30 またはaが10でない");
if (a== 20 || b== 30 || a != 10)
{
printf("条件に当てはまりました。\n");
}
else
{
printf("条件に当てはまりません。\n");
}
return 0;
}


437:デフォルトの名無しさん
08/04/17 23:37:21
>>409
お使いの環境に matherr() 関数はありませんか?

438:デフォルトの名無しさん
08/04/17 23:40:33
>>435
>>436
考えてもらってありがとう。なんとかコンパイルできたので
また何かエラーが出たら教えてください。


439:デフォルトの名無しさん
08/04/17 23:44:25
>>389
順序を変えました。inputInt() の該当部分を、次のようにしました。
if (err == 1)
return 1;
if (cnt == 0)
return 2;
URLリンク(kansai2channeler.hp.infoseek.co.jp)

440:デフォルトの名無しさん
08/04/17 23:49:08
>>412
算数の教科書をみなおしてみましょう。
わり算はかけ算の逆であると決めれば、わる数が 0 である場合は
「答えになることのできる数はない」
のです。

441:デフォルトの名無しさん
08/04/18 00:45:34
borland C++ compiler 5.5で、setbccを使って、環境変数と設定ファイルの
設定をしていたんですが、なぜか、PATHの設定が失敗してしまいます。
何がいけないんでしょうか?

442:デフォルトの名無しさん
08/04/18 00:46:31
>>441
スレ違い、失せろ

443:デフォルトの名無しさん
08/04/18 00:47:56
>>442
お前が失せろ

444:デフォルトの名無しさん
08/04/18 00:49:32
じゃあ俺が失せるよ!

445:デフォルトの名無しさん
08/04/18 00:58:08
いやいや、ここは俺が

446:441
08/04/18 00:58:28
>>442
スレ違いで、失礼いたしました。
このような質問は、どのスレッドで聞くべきなんでしょうか? 
すみませんが、教えてください。

447:デフォルトの名無しさん
08/04/18 00:59:31
>>446
どうぞどうぞ

448:デフォルトの名無しさん
08/04/18 01:00:04
>>445
あっ どうぞ、どうぞw

449:448
08/04/18 01:01:50
33秒差で負けた・・・

450:デフォルトの名無しさん
08/04/18 01:03:10
>>447-449
早漏乙

451:デフォルトの名無しさん
08/04/18 01:27:18
>>446
BCC Developper
スレリンク(tech板)

ここで聞くのがいいんだろうけど、問題はとんでもない過疎スレで、
質問してもレスがつくという保障はない。

とりあえず、ここでいいんじゃないの?

452:デフォルトの名無しさん
08/04/18 09:36:52
>>441
>何がいけないんでしょうか?
あんたの頭。

453:デフォルトの名無しさん
08/04/18 13:53:50
シンボリックな定数を扱う場合、
大きくわけて#defineを使うのとenumを使うのがあるようですが、
どのように使い分ければいいのでしょうか?
それとも好みの問題?

454:デフォルトの名無しさん
08/04/18 14:03:01
複数の定数にまとまった意味があるならenum、
整数値でないならdefine、
後はプロジェクトごとの規定による。

455:デフォルトの名無しさん
08/04/18 14:26:08
来週から新人研修でC言語担当になったので来てみました。
最初からじっくり読んでエスパー目指します。

456:デフォルトの名無しさん
08/04/18 16:30:54
>sprintf("%0.2f", 1.1)
って書き方は間違いですか?

直すとしたら、
>sprintf("%.2f", 1.1)
といった感じでしょうか?


457:デフォルトの名無しさん
08/04/18 16:33:33
>>456
直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った

ゼロフラグが有っても別に間違いということはないと思う

458:456
08/04/18 16:37:44
了解。どうも有難う。

459:nito
08/04/18 16:39:40
vs2005で
featall[i*featnum[i]+p].descr = n[p].descr;
とすると
main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
というエラーがでます。
どうしてでしょうか。
ちなみにdescrは[128]です。

460:デフォルトの名無しさん
08/04/18 16:51:23
>>459
int a[10]; で
a = 5; とかできない。
ってのと同じ。

461:デフォルトの名無しさん
08/04/18 16:56:51
そのエラーメッセージもおかしくて、正確には「変更可能な左辺値」だけどな…
配列をまるっとコピーしたいならmemcpyかmemmoveを使え

462:デフォルトの名無しさん
08/04/18 17:05:17
>>461
おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。

463:nito
08/04/18 17:24:42
>460
言われてみれば確かに…

>461
おkす。やってみます。

みなさんありがとうございます。
何分Cは初めたばかりでしてちょくちょくつっかかってまして
また使わせていただきます(滝汗

464:nito
08/04/18 18:07:26
続きになるんですが
memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof());
と書くことにしました。
この場合、sizeofには
int[128]
と入れれば
128個の配列分確保されるんでしょうか。

465:デフォルトの名無しさん
08/04/18 18:25:29
>>464
yes

466:465
08/04/18 18:33:49
老婆心ながら
memcpy は移動元と異動先が被るような場合はうまくいかない。
bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う
というのもある。

467:デフォルトの名無しさん
08/04/18 19:29:52
printf( "%c" , 'A' );
が標準出力に文字「A」を出すという保証はないですよね?
「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、
そこらの処理系ではたまたま合ってるだけですよね
規格を読む限り

468:デフォルトの名無しさん
08/04/18 20:02:49
>>466
何故そこでmemmove()を薦めない。

469:デフォルトの名無しさん
08/04/18 20:36:25
>>466
bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。

470:デフォルトの名無しさん
08/04/18 20:51:50
入力された値が3だったら、
***
-**
--*
といった具合(後ろで桁合わせ、-は空白)に出力されるプログラムを組みたいと思います。
#include <stdio.h>
int main(void)
{
int num,i,j,k;
scanf("%d",&num);
for(i=1; i<=num; i++)
{
for(j=num; 0<j; j--)
{
printf("*");
}
printf("\n");
for(k=1; k<=i; k++)
{
printf(" ");
}
}
return 0;
}
の様に組んだのですが、実行すると
***
-***
--***
となってしまいます。
*を出力する部分がうまく動いていないのだと思い、色々いじくってみたのですが、
3,2で終わってしまったり、無限ループしてしまうといった状態でどう改善させれば良いのか分かりません。
宜しくお願い致します。

471:デフォルトの名無しさん
08/04/18 20:58:09
-for(j=num; 0<j; j--)
+for(j=num; i<=j; j--)


472:デフォルトの名無しさん
08/04/18 21:10:45
#include <stdio.h>
int main()
{
int num;
scanf("%d", & num);
for (i = 0; i < num; ++i) {
printf("%*s%.*s\n", i, "", num - i, "**********");
}
return 0;
}

473:デフォルトの名無しさん
08/04/18 22:37:09
>>471,>>472
実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。

474:デフォルトの名無しさん
08/04/18 22:38:54
空白のループは*のループの前に持ってきたほうがいい

475:472
08/04/18 23:11:15
>>473
感謝するなら理解してからにしてくれ。

476:デフォルトの名無しさん
08/04/19 02:01:40
case3以降の計算が滅茶苦茶になるんですが

#include<stdio.h>
void main()
{
int person;/*宿泊者の人数*/
int price; /*1人あたりの宿泊費*/
int room; /*1部屋あたりの宿泊費*/

person=3;

switch(person)
{
case1:/*1人の時*/
price=18000;
break;
case2:/*2人の時*/
price=10000
break;


477:デフォルトの名無しさん
08/04/19 02:07:39
476のつづき

case3:/*3人の時*/
price=8000
break;
  }
room=price*person;/*1部屋あたりの宿泊料を計算*/

printf("宿泊人数%d人の時、",person);
printf("1人あたりの宿泊料は%d円です。\n",price);
printf("1部屋あたりの宿泊料は%dです。\n",room);
}
  

478:デフォルトの名無しさん
08/04/19 02:07:53
続きは?
あと
× void main() { ... }
○ int main() { ... return 0; }

479:デフォルトの名無しさん
08/04/19 02:09:18
すれ違ってしまった・・・。

以降ってことは 4 とか入れた場合のことか?
そりゃ price に何も値代入してないから無茶苦茶になるぜ。

480:デフォルトの名無しさん
08/04/19 02:10:45
コンパイルするとcase3以降の計算が間違ってしまいます。

それでcase2までにすると、どんな値をいれても正確に計算されるんですが
3つ以上になるとおかしくなるんです。

481:デフォルトの名無しさん
08/04/19 02:14:15
>>478、479
ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。

482:デフォルトの名無しさん
08/04/19 02:16:17
case と数値の間にスペースがないのはコピペミスか?

483:デフォルトの名無しさん
08/04/19 02:16:37
>467
どう読んだか知りませんが、間違ってます。

484:デフォルトの名無しさん
08/04/19 07:57:59
>>481
>482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。

485:デフォルトの名無しさん
08/04/19 10:28:29
ただのラベルになっちゃうからねぇ

486:デフォルトの名無しさん
08/04/19 10:31:35
default:
 if (person == 3) goto case3;

487:デフォルトの名無しさん
08/04/19 12:24:23
学習教材として、「猫でもわかるC言語プログラミング」か
「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、
経験者の方から見てどちらが使いやすいんでしょうか?」
アマゾンはいまいち頼りにならなくて・・・・

488:デフォルトの名無しさん
08/04/19 12:39:11
エラトステネスの篩をCで書いているんですが、
以下のプログラムをコンパイルして実行しても、数字を入力させるだけで何も起こりません。
prime[ ]が変であるのはわかるんですがどう直せばいいかわからなくて…
ご教授よろしくお願いします。

#include <stdio.h>
int main(void)
{
int i,j,num,prime[10000+1];
printf("Please input the number : ");
scanf("%d",&num);
for(i=2;i<=num;i++){
prime[0]=prime[1]=0;
prime[i]=1;
}
for(i=0;i<=num;i++){
if(prime[i]){
for(j=2;(j*i)<=num;j++)
prime[j*i]=0;
}
}
for(i=0;i<=num;i++){
if (prime[i]){
printf("%d",i);
}
}
printf("\n");
return 0;
}

489:デフォルトの名無しさん
08/04/19 12:43:41
476ですが、
>>478
>>479
>>484
>>486さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。

もう一度、プログラムを書きなおしてみても同じ結果でした。
コンパイルになにか不具合があるのでは?と疑っています。

とりあえずcase2までは計算できるので、エラーは置いといて先のプログラムに進んでみよう
と思います。


490:デフォルトの名無しさん
08/04/19 12:50:55
>エラーは置いといて先のプログラムに進んでみようと思います。
やめろバカ
一足飛びに習得できるほどCはヌルい言語じゃないぞ

とりあえずコンパイルしたソースをそのまま貼るんだ

491:デフォルトの名無しさん
08/04/19 12:55:30
>>488
・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
 ifに条件が足りないはず

492:デフォルトの名無しさん
08/04/19 13:14:29
>>476>>477のプログラムをコンパイルすると
person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。

実際のコンパイルの結果は

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

宿泊人数3人の時

1人あたりの宿泊料は 2147348480 円です

1部屋あたりの宿泊料は 2147078144 円です

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

となります。(21億4千7百34万8千480円)と(21億4千7百7万8千144円)



493:デフォルトの名無しさん
08/04/19 13:18:13
>>492
>person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。

494:488
08/04/19 13:19:21
>>491
言う通りにしたら正常に動作しました。ありがとうございました。

あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?

495:デフォルトの名無しさん
08/04/19 13:20:44
primeをmallocで確保

496:デフォルトの名無しさん
08/04/19 13:26:31
>>493

書いたプログラムを確かめたところ、ご指摘のとおり
case 3: と空白を開ければ、指示通り正しい計算ができました。

初歩的なミスでお騒がせしてすいませんでした。
またよろしくお願いします。



497:デフォルトの名無しさん
08/04/19 14:20:41
ファイル中に1行ずつ下記の様なデータが入っているとします。
1行に含まれるデータの数は各行でまちまちです。

element1 element2 element3 ・・・ elementL
element1 element2 element3 ・・・ elmenetM
   ・
   ・
element1 element2 element3 ・・・ elementN

このときに各elementを1つずつ、読み込むにはどの様にすればよいでしょうか?
現在、下記の様に変数を多めに取って解決しているのですが、もっとよいやり方
はありますでしょうか?

while(fgets(buf, sizeof(buf), fp)!=NULL){
scan_num = sscanf(buf, "%s %s %s %s %s", element1, element2, element3, element4, element5);
}



498:デフォルトの名無しさん
08/04/19 14:43:41
つfscanf

499:497
08/04/19 14:57:05
>498
レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが
要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。
要件漏れすいませんでした。

fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと
のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に
処理する方法があれば教えてください。


500:デフォルトの名無しさん
08/04/19 15:31:22
>>499
fgets(), sscanf()

501:デフォルトの名無しさん
08/04/19 15:37:44
fgetcで改行まで読む

502:デフォルトの名無しさん
08/04/19 15:46:07
関数へのポインタの定義で”型名 (*ポインタ変数)(引数)”とするところを
”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう?
お願いします。


503:デフォルトの名無しさん
08/04/19 15:49:11
int *kansu() は int型のポインタを返す関数と解釈される

504:デフォルトの名無しさん
08/04/19 15:56:26
>>503
よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?

505:デフォルトの名無しさん
08/04/19 16:01:46
そういうこと
int* p;
p = kansu();

506:デフォルトの名無しさん
08/04/19 16:06:59
>>503
ありがとございました。

507:デフォルトの名無しさん
08/04/19 16:08:55
typedef int kansu_t(void);
kansu_t* kansu = &foo;
int n = kansu();

typedef は偉大だと本気で思う。

508:デフォルトの名無しさん
08/04/19 17:30:27
C言語勉強中の者です。
データ管理のプログラムを作る時、各々のデータ(文字列)の配列のサイズは、
malloc()関数で決めるのが一般的なのでしょうか?


509:デフォルトの名無しさん
08/04/19 17:32:18
可変長の場合はね。
mallocのほか、calloc()やrealloc()でも可。

510:デフォルトの名無しさん
08/04/19 17:38:25
最初のうちは、#defineで最大サイズを容易に変更できるようにした固定長配列でもいいと思うけどな。
いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。

511:デフォルトの名無しさん
08/04/19 17:43:25
free 忘れは大変だしな。

512:デフォルトの名無しさん
08/04/19 17:52:55
>>509,510,511

ありがとうございます。
「ある程度の規模」というのがわからないのですが、
たとえば、500個くらいのデータの各々に「メモ」配列をつける場合、
200文字までと固定してしまって、実際にはメモのない場合がほとんどだったら?



513:デフォルトの名無しさん
08/04/19 17:53:58
長さを固定にしたくなければ動的に確保すればいいし、
固定で十分なら固定にすればいい。

514:デフォルトの名無しさん
08/04/19 17:54:40
初心者はstring

515:デフォルトの名無しさん
08/04/19 17:54:59
C スレで何言ってんの?

516:デフォルトの名無しさん
08/04/19 17:57:25
mallocやfreeは上級者しか無理 stringをかなり進める

517:デフォルトの名無しさん
08/04/19 18:01:37
>>512
「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。

518:デフォルトの名無しさん
08/04/19 18:03:44
C≠C++

519:512
08/04/19 18:09:29
みなさん、ありがとうございます。
さしあたって、Cを勉強しているのですが、
stringが簡単そうですね。
C++も視野に入れて勉強していこうと思います。


520:デフォルトの名無しさん
08/04/19 18:13:37
string a="あいう";

a=a+"えお";

などと自動でサイズ変更してくれる。
初心者はstring

521:デフォルトの名無しさん
08/04/19 18:19:10
a=a+"えお"; とか書くなよ・・・。
a+="えお"; だろ。
コスト考えれ。

522:デフォルトの名無しさん
08/04/19 18:24:08
後ろに空きがあったら、メモリを解放せずに増やす方法ありますか? 普通に牌列としてアクセスできてです。

523:デフォルトの名無しさん
08/04/19 19:37:51
realloc

524:デフォルトの名無しさん
08/04/19 19:53:31
「キーボードより英大文字(A-Z)の文字列を変数cに入力し、それぞれの字種の出現頻度を表示するプログラムを作成せよ。
最初に配列の要素を0で初期化し、英大文字の入力はctrl+zにより終了するようにせよ。
ただし、英大文字以外が入力されたら、その文字数を変数othersでカウントして表示する事。」
という問題について考えていますが、今ここまで出来ました。

#include <stdio.h>
int main(void)
{
int other,i,a[26]; /*変数other、制御用変数i、配列a[26]を宣言*/
for(i=0;i<26;i++)
a[i]=0; /*forループで配列aの全要素初期化*/
puts("Input A-Z, end:ctrl+z");
while((i=getchar())!=EOF)
if

ここから、字種の出現頻度を求めるために一体どうすればいいのか分かりません…。
何かヒントを頂けないでしょうか。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5384日前に更新/199 KB
担当:undef