07/07/06 20:47:10
質問です。年月日を入力してツェラーの公式を利用して曜日を表示するプログラム
をつくりたいんですけど、BCCでコンパイルしたら公式のところでエラー
「浮動小数点の不正な使用」ってでるんですけど、どうしてだかわかりますかね?
#include <stdio.h>
int main(void){
int year,month,day;
char youbi[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;
printf("Year?");
scanf("%d",&year);
printf("Month?");
scanf("%d",&month);
printf("Day?");
scanf("%d",&day);
i=(year + (year/4) - (year/100) + (year/400) + (2.6*month +1.6) + day)%7;
printf("It's %s.",youbi[i]);
return 0;
}
825:デフォルトの名無しさん
07/07/06 20:49:26
>>821
C++の場合スク水フェチのオジサンが自分で着る用に作ったものもあるので注意
826:デフォルトの名無しさん
07/07/06 20:56:27
>>824
(2.6*month +1.6)を(int)(2.6*month +1.6)にしろ。
ここが整数でないから、%の左側全体が整数型でなくなっている。
剰余演算子は浮動小数点数を演算対象にできないので、件のエラーになる。
827:デフォルトの名無しさん
07/07/06 20:57:13
>>823
Cが制御系で使われるのは「最強」だからではなく「高級アセンブラ」だから。
C++も制御系で使われるよ。C++として使われるかはともかく。
つか、最強ってなんだよ。
828:デフォルトの名無しさん
07/07/06 20:58:38
>>824
剰余演算子%というオペランドは整数同士でないとダメ
演算してる行の型がごっちゃになってるから明示的にキャストしたり読みやすくすべき
基本的にコメント文とかで説明もなしに実数を整数に叩き込んだりしちゃだめ
829:デフォルトの名無しさん
07/07/06 21:19:14
なるほど。できました、ありがとうございます。
830:デフォルトの名無しさん
07/07/06 21:30:26
スレ違いかもだけど、ここの人達他のスレより頼りになりそうなので。。。
基本情報の午後問をCで受かりたいのですが、なんの本を読めばいいですか?
当方、C言語はよくわかりません。COBOLは少しできます。
ただCで受けたいのです。
831:デフォルトの名無しさん
07/07/06 21:32:10
>>830
試験は慣れたものでやるべき
832:デフォルトの名無しさん
07/07/06 21:58:20
>>830
アセンブラがオススメ
例年一番簡単
833:デフォルトの名無しさん
07/07/06 21:59:06
C言語ってeclipceかbolandか、
それともvisual basic かどれでやればいいですか?
834:デフォルトの名無しさん
07/07/06 22:04:13
その質問おもしろい?
835:デフォルトの名無しさん
07/07/06 22:10:25
visual studioだっけ?
836:デフォルトの名無しさん
07/07/06 22:12:46
>>833
Linuxでもできるよ。
837:デフォルトの名無しさん
07/07/06 22:14:19
整数型配列は
int iarray[10];
memset(iarray, 0, sizeof(array));
ですべて0で初期化できると知ったのですが、
実数型配列を
double darray[10];
memset(darray, 0.0, sizeof(array));
のように初期化してもかまいませんか?
つまり実数型配列の全ての要素を0.0にしたいのです
838:デフォルトの名無しさん
07/07/06 22:16:31
>>837
いいんじゃね?
DirectXとか、そういう方法で、実数やらポインタやらバリバリクリアしてたな。
移植性は無くなる。
839:デフォルトの名無しさん
07/07/06 22:17:55
> memset(darray, 0.0, sizeof(array));
あ、これは、警告かエラーになるな。
sizeof のところはミスだよね?
840:デフォルトの名無しさん
07/07/06 22:19:54
>>837
ANSI/ISO Cへの移植性を望むなら避けるべき。
浮動小数点数がIEEE 754に則っていることを仮定してよいなら構わない。
841:デフォルトの名無しさん
07/07/06 22:21:17
>>833
ほとんどにアルゴリズムの問題
ポケコンのCインタプリタでおk
842:デフォルトの名無しさん
07/07/06 22:26:29
>>839
あと、0.0 は 0 だな。
843:デフォルトの名無しさん
07/07/06 22:27:49
>>839
すみません sizeof(darray) です
あとmanページでmenset関数を調べてみると
#include <string.h>
void *memset(void *buf, int ch, size_t n);
となっていたので
int ch に0.0と渡してもだめなんですね
ということは関数の仕様上は
memset(darray, 0, sizeof(darray));
と書くのが正しくて、
しかもCコンパイラの浮動小数点がIEEE754前提での使い方なので
結局は配列の要素数の分だけループで回して初期化するのが
一番いちゃもん言われにくいということでよろしいでしょうか?
ありがとうございました
844:デフォルトの名無しさん
07/07/06 22:29:23
エクセス64で 0 ってどうなるの?