dポイントプレゼントキャンペーン実施中!

万年カレンダーのプログラム(C言語)が分からなくて困っています。
一応作ってみたけどダメだったので何処がおかしいか指摘してくれると幸いです
あとC言語についてはかなり初心者ですすみません

#include <stdio.h>
int main(void)
{
int d[13]={ 31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 };
char youbi[7][4]={"日","月","火","水","木","金","土"};
int y ,m ,n ,a ,b ,c ,cc ,s ,ss ,e;

printf("西暦 月 日を入力");
scanf("%d ""%d ""%d ",y,m,n);

for(a = 1900 ; a < y ; a++){
if(a % 4 == 0){
if(a % 400 == 0){
s = s+2;
}
else{
s = s+1;
}
}
if(a % 100 == 0){
s = s+1;
}
else{
s = s+2;
}
}

if(y % 4 == 0){
if(y % 400 == 0){
ss = ss+2;
}
else{
ss = ss+1;
}
}
if(y % 100 == 0){
ss = ss+1;
}
else{
ss = ss+2;
}

if(ss == 2){
d[1] = 29;
}
else{
d[1] = 28;
}
for(b = 0 ; b < m+2 ; b++){
e = d[m] + e;
m = m+1;
}
e = e+n;
c = e%7;
s = c+s;
cc = s%7;
printf("%c",youbi[cc]);

return 0;
}

A 回答 (5件)

突っ込みどころ満載ですが…


○プログラムについて
1) #1の人が書いてますが scanf の書式がおかしい。
2) s,ss,e など加算される変数が初期化されていない。
 そもそもs以外はループしてないので加算する必要性自体が無い。
3) for(b = 0 ; b < m+2 ; b++){ のループの中で mをインクリメントしている
 なのでb<m+2は常にtrueになりループから抜けられない。

○万年カレンダーのアルゴリズムについて
4) 閏年の算出方法がおかしい。
 y%4 == 0 && (y%100 != 0 || y%400 ==0) であるはずなのに
 (y%4 == 0 && y%400 ==0) と y%100 != 0 でダブルカウントされている。
5) 基点を1900年1月1日じゃなくて1582年10月15日にするとツェラー(Zeller)の公式が使えます。
    • good
    • 0

>y%4 == 0 && (y%100 != 0 || y%400 ==0) であるはずなのに



カッコの付け方がおかしいです。

(y%4 == 0 && y%100 != 0) || y%400 ==0
でないとダメ。
もしくはカッコを付けない。&&の優先順位が高いから。
    • good
    • 0

>scanf("%d ""%d ""%d ",y,m,n);



カレンダー云々の前に、scanfの書式文字列に続く引数が
本当にy,m,nでいいのか、という話です。
    • good
    • 0

問題を解析するのもプログラムの勉強の一つです。



どう入力したら、どう出力されることを期待しているのか。
それが実際にはどうなってるのか。

まずは、御自身で一つ一つ確認してください。

> scanf("%d ""%d ""%d ",y,m,n);
> printf("%c",youbi[cc]);

scanfとprintfのマニュアルをよく読み返してください。
特に「フォーマット文字列」というところを。
初心者ならなおさら。この関数は熟練者でも使う機会の多いものだから、ちゃんと身につけないと。

> for(a = 1900 ; a < y ; a++){
> if(a % 4 == 0){
> if(a % 400 == 0){
> s = s+2;
> ....

sはここで初めて登場しますが、いきなり sの値を使おうとしています。
Cでは宣言した変数の中身はどんな値になっているか決っていません。
他の言語では「必ず0に初期化されている」とか決っているものもありますが、それと混同しないように。

また、これ以下の部分がなにをやろうとしてるのか、そのためにどんなアルゴリズムを使用しているのか、よくわかりません。
なんとなく、うるう年の判定やってるようにも見えるのですが、sやssで何を計算しているのやら。

> for(b = 0 ; b < m+2 ; b++){
> e = d[m] + e;
> m = m+1;
> }

このループは終了しません(正確には、致命的なエラーなりが発生して終了することになりますが)
なぜだか考えてみましょう。わからなければ
1回目のループの開始時と終了時の各変数の値、終了判定式とその結果
2回目のループの開始時と終了時の各変数の値、終了判定式とその結果
...
と書き出してみましょう。

他にもあるかもしれませんが、気付いたところのみ。
    • good
    • 0

どう意図したのとちがうの?


それが判らないとなんとも・・・

そうじゃないと どこがわるいっていうのを突き止めにくい。
ただエラーが出てるっていうならtypoを探す話になるけど。。。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!