![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
万年カレンダーのプログラム(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;
}
No.4ベストアンサー
- 回答日時:
突っ込みどころ満載ですが…
○プログラムについて
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)の公式が使えます。
No.5
- 回答日時:
>y%4 == 0 && (y%100 != 0 || y%400 ==0) であるはずなのに
カッコの付け方がおかしいです。
(y%4 == 0 && y%100 != 0) || y%400 ==0
でないとダメ。
もしくはカッコを付けない。&&の優先順位が高いから。
No.3
- 回答日時:
>scanf("%d ""%d ""%d ",y,m,n);
カレンダー云々の前に、scanfの書式文字列に続く引数が
本当にy,m,nでいいのか、という話です。
No.2
- 回答日時:
問題を解析するのもプログラムの勉強の一つです。
どう入力したら、どう出力されることを期待しているのか。
それが実際にはどうなってるのか。
まずは、御自身で一つ一つ確認してください。
> 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回目のループの開始時と終了時の各変数の値、終了判定式とその結果
...
と書き出してみましょう。
他にもあるかもしれませんが、気付いたところのみ。
No.1
- 回答日時:
どう意図したのとちがうの?
それが判らないとなんとも・・・
そうじゃないと どこがわるいっていうのを突き止めにくい。
ただエラーが出てるっていうならtypoを探す話になるけど。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語 3 2022/11/09 13:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
入力した文字列から母音だけを...
-
Delphiで・・・
-
エクセルでC言語のfor文と同じ...
-
文字列を後ろから1文字ずつ表示...
-
ループを途中で抜けたいのですが。
-
For文の終了値を関数にしても問...
-
7と入力したら画像のような図形...
-
HTTPレスポンスの終端はどうわ...
-
ループについて
-
__asm int 3でのブレイクポイン...
-
プログラムで関数は使わない方...
-
C言語forループが完結した場合...
-
入力した数値を倍々するプログラム
-
エクセルVBAで Do While (1)って?
-
while文でつまづいています
-
if文の中にfor文なのか、for文...
-
C言語 数字を削除する関数
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報