【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21922

年月日判定プログラム
投稿者---赤ヘル軍団(2005/07/15 00:20:12)


私、プログラミング初心者です。
下記のプログラムを一生懸命作ったんですが
どぉしてもうまくいきません。
実行結果の
printf("%d年%d月%d日は2000年1月1日から%d日目\n",year,month,day,sum);
がうまく表示されません。
そこで、ドコがヘンで、どぉ直せばいいか
教えて頂けると有難いです。
よろしくお願いします。

#include <stdio.h>
int main(){
int year,month,day,i,A,B,total,sum;
int mm[13];

mm[2]=28;
mm[12]=mm[10]=mm[8]=mm[7]=mm[5]=mm[3]=mm[1]=31;
mm[11]=mm[9]=mm[6]=mm[4]=30;

printf("年 月 日を入力\n");
printf("年:"); scanf("%d",&year);
if(year<2000)
printf("\n2000年以後を入力しなさい\n");

else
printf("月:"); scanf("%d",&month);
if(month<0 || month>12)
printf("\nそのような月は存在しません\n");

else
printf("日:"); scanf("%d",&day);
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
&&(day<1 || day>31))
printf("\nそのような日は存在しない\n");

else if(month==2){
if((((year%4==0)&&(year%100!=0))||(year%400==0))&&(day<0 || day>29))
printf("\nそのような日は存在しない\n");

else if((month==4||month==6||month==9||month==11)&&(day<0 || day>30))
printf("\nそのような日は存在しない\n");

if(((year%4==0)&&(year%100!=0))||(year%400==0))
mm[2]++;
total=0;
for(i=1;i<month;i++)
total=total+mm[i];
total=total+day;
A=(year-2000)/4-(year-2000)/100+2*(year-2000)/400;
B=year-2000-A;
sum=A*366+B*365+total;

printf("%d年%d月%d日は2000年1月1日から%d日目\n",year,month,day,sum);
return(0);
}
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:年月日判定プログラム 21923 まきじ 2005/07/15 00:39:55
<子記事> Re:年月日判定プログラム 21926 nop 2005/07/15 10:41:55
<子記事> Re:年月日判定プログラム 21935 Tea 2005/07/15 16:43:50


No.21923

Re:年月日判定プログラム
投稿者---まきじ(2005/07/15 00:39:55)


>printf("%d年%d月%d日は2000年1月1日から%d日目\n",year,month,day,sum);

2 月の場合しか実行しないと思いますが?


この投稿にコメントする

削除パスワード

No.21924

Re:年月日判定プログラム
投稿者---赤ヘル軍団(2005/07/15 00:45:06)


コメント有難うございます。

2月だけですか…。
それすらも気づきませんでした。

今、自分なりに考えてるんですが
ドコをどお直せばいいか
その辺の助言を頂けると
非常にありがたいです。
お願いします。


この投稿にコメントする

削除パスワード

No.21925

Re:年月日判定プログラム
投稿者---まきじ(2005/07/15 08:40:10)


>ドコをどお直せばいいか

else if(month==2){} の中に記述されているからです。


この投稿にコメントする

削除パスワード

No.21926

Re:年月日判定プログラム
投稿者---nop(2005/07/15 10:41:55)


mktime()
difftime()

辺りを調べると良いかも。


この投稿にコメントする

削除パスワード

No.21935

Re:年月日判定プログラム
投稿者---Tea(2005/07/15 16:43:50)


こんにちは、いつも拝見させていただいております。
今回初めて投稿させていただきます。

>ドコがヘンで、どぉ直せばいいか
>教えて頂けると有難いです。

if文のあとにブロックがあまりにも足りない(ないわけではありませんが)ので、
{}を適所に加えたところ、大よその不具合は解消されました(全てではありません)。
ですので、if文についての勉強不足が要因と考えられます。
if文を再度見直してみるとよろしいと思います。

他に、不等号の使い方をよく理解していらっしゃらない(でも一部正しく書かれていたりするので不思議です)ようなので、
私が{}を加えた後に実行した結果の不具合の一例を以下に表示します。参考になるでしょうか?

年 月 日を入力
年:2000
月:0
日:0
2000年0月0日は2000年1月1日から0日目

的外れでしたら、申し訳ありません。


この投稿にコメントする

削除パスワード

No.21953

Re:年月日判定プログラム
投稿者---赤ヘル軍団(2005/07/15 22:48:54)


たくさんのお教え、ありがとうございました。
みなさんのご意見を参考の上、自分なりにさんざんこだわった結果
↓のようなプログラムができあがりました。

#include <stdio.h>
int main()
{
int yy,m,dd,i,A,B,total,x,y,z,leap1,leap2; //yy = 年,m = 月,dd = 日
int mm[13]; //mm[i]は、mm[0]が隠れているため
mm[1]=mm[3]=mm[5]=mm[7]=mm[8]=mm[10]=mm[12]=31;
mm[4]=mm[6]=mm[9]=mm[11]=30;
mm[2]=28;
printf("二つの年月日から何日目かを計算するプログラムです\n");
for(z=1;z<3;z++){              //for文による繰り返し。zが3になったら終了
printf("%dつ目\n",z);
printf("年:"); scanf("%d",&yy);
if(yy<0) printf("入力ミスです\n");
else printf("月:");scanf("%d",&m);
if(m<0 || 12<m) printf("入力ミスです\n");
else printf("日:");scanf("%d",&dd);
if((yy%4==0)&&(yy%100!=0)||(yy%400==0))
leap1,mm[2]++;
else leap2;
if((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&(dd<1||dd>31))
printf("入力ミスです。");
//↑1,3,5,7,8,10,12月の日にちが1より小さく31より大きかったらエラー
if((m==4||m==6||m==9||m==11)&&(dd<1||dd>30)) printf("入力ミスです");
//↑4,6,9,11月の日にちが1より小さく30より大きかったらエラー。
if((m==2&&leap1)&&(dd<1||dd>29)||(m==2&&leap2)&&(dd<1||dd>28))
printf("入力ミスです");
//↑うるう年の2月の日にちが1より小さく29より大きかったらエラー
//うるう年じゃない場合は28
//日数に変換する↓
A=yy/4-yy/100+2*yy/400;
B=yy-A;
total=0;
for(i=1;i<m;i++)
total=total+mm[i];
total=total+dd;
if(z==1){
x=A*366+B*365+total; //z=1のときの日数
}
else{y=A*366+B*365+total;      //z=2のときの日数
}
} //繰り返しここまで
printf("%d日目です。",y-x);
}

さらに修正すべき点などご意見を頂けると幸いです。


この投稿にコメントする

削除パスワード

No.21954

Re:年月日判定プログラム
投稿者---まきじ(2005/07/15 23:00:55)


>mm[1]=mm[3]=mm[5]=mm[7]=mm[8]=mm[10]=mm[12]=31;
>mm[4]=mm[6]=mm[9]=mm[11]=30;
>mm[2]=28;

mm[13]={0,31,28,31,30,31,30,31,31,30,31,31};

では駄目なんでしょうか?

>if((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&(dd<1||dd>31))
>if((m==4||m==6||m==9||m==11)&&(dd<1||dd>30))

mm[m] を使えば、ひとつになると思います。

>if((m==2&&leap1)&&(dd<1||dd>29)||(m==2&&leap2)&&(dd<1||dd>28))

年を入力後、うるう年の判定をして、mm[2] を変更しとけば
他の月と同じ箇所でチェックできると思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧