閏年を求めるプログラム
Posted: 2006年11月08日(水) 00:10
西暦y年m月d日の<前の日>あるいは<次の日>の日付を求めてセットする関数
void yesterday(int *y, int *m, int *d){/* …*/}
void tomottow (int *y, int *m, int *d){/* …*/}
を作成せよ。閏年などもきちんと判定すること。
という問題で
#include <stdio.h>
void yesterday(int *y, int *m, int *d)
{
int feb=28;
/* うるう年の判定 */
if(*y%4==0 && *y%100!=0 || *y%400==0){
feb=29;
}
*d=*d-1;
if(*d==0){
if(*m==3){
*d=feb;
}else if(*m==5||*m==7||*m==10||*m==12){
*d=30;
}else{
*d=31;
}
*m=*m-1;
if(*m==0){
*m=12;
*y=*y-1;
}
}
}
void tomorrow(int *y, int *m, int *d)
{
int feb=28;
/* うるう年の判定 */
if(*y%4==0 && *y%100!=0 || *y%400==0){
feb=29;
}
*d=*d+1;
if(*m==2){
if(*d>feb){
*m=*m+1;
*d=1;
}
}else if(*m==4||*m==6||*m==9||*m==11){
if(*d>30){
*m=*m+1;
*d=1;
}
}else{
if(*d>31){
*m=*m+1;
if(*m>12){
*m=1;
*y=*y+1;
}*d=1;
}
}
}
int main(void)
{
int year, month, day;
printf("年:");
scanf("%d", &year);
printf("月:");
scanf("%d", &month);
printf("日:");
scanf("%d", &day);
yesterday(&year, &month, &day);
printf("昨日%d年は%d月%d日\n", year, month, day);
tomorrow(&year, &month, &day);
printf("明日は%d年%d月%d日\n", year, month, day);
return(0);
}
このソースではyesterday,tomorrowをどちらか一方のみにすれば
うまく動きますが、両方いれるとtomorrowで返される値が本日の物になってしまいます。
tomorrow(&year, &month, &day);
tomorrow(&year, &month, &day);
printf("明日は%d年%d月%d日\n", year, month, day);
こうすれば正常に表示されますが、なんか気持ち悪いです。
year == year2;
month == month2;
day == day2;
と書いて
tomorrow(&year2, &month2, &day2);
printf("明日は%d年%d月%d日\n", year2, month2, day2);
としたら意味の分からない数字がかえってきてしまいました。
yesterdayとtomorrowを同時に実行しなければ
正常に処理されるので関数はいいとおもうのですが、正常にあたいを表示するには
どうすればいいでしょうか??
よろしくお願いいたします。
void yesterday(int *y, int *m, int *d){/* …*/}
void tomottow (int *y, int *m, int *d){/* …*/}
を作成せよ。閏年などもきちんと判定すること。
という問題で
#include <stdio.h>
void yesterday(int *y, int *m, int *d)
{
int feb=28;
/* うるう年の判定 */
if(*y%4==0 && *y%100!=0 || *y%400==0){
feb=29;
}
*d=*d-1;
if(*d==0){
if(*m==3){
*d=feb;
}else if(*m==5||*m==7||*m==10||*m==12){
*d=30;
}else{
*d=31;
}
*m=*m-1;
if(*m==0){
*m=12;
*y=*y-1;
}
}
}
void tomorrow(int *y, int *m, int *d)
{
int feb=28;
/* うるう年の判定 */
if(*y%4==0 && *y%100!=0 || *y%400==0){
feb=29;
}
*d=*d+1;
if(*m==2){
if(*d>feb){
*m=*m+1;
*d=1;
}
}else if(*m==4||*m==6||*m==9||*m==11){
if(*d>30){
*m=*m+1;
*d=1;
}
}else{
if(*d>31){
*m=*m+1;
if(*m>12){
*m=1;
*y=*y+1;
}*d=1;
}
}
}
int main(void)
{
int year, month, day;
printf("年:");
scanf("%d", &year);
printf("月:");
scanf("%d", &month);
printf("日:");
scanf("%d", &day);
yesterday(&year, &month, &day);
printf("昨日%d年は%d月%d日\n", year, month, day);
tomorrow(&year, &month, &day);
printf("明日は%d年%d月%d日\n", year, month, day);
return(0);
}
このソースではyesterday,tomorrowをどちらか一方のみにすれば
うまく動きますが、両方いれるとtomorrowで返される値が本日の物になってしまいます。
tomorrow(&year, &month, &day);
tomorrow(&year, &month, &day);
printf("明日は%d年%d月%d日\n", year, month, day);
こうすれば正常に表示されますが、なんか気持ち悪いです。
year == year2;
month == month2;
day == day2;
と書いて
tomorrow(&year2, &month2, &day2);
printf("明日は%d年%d月%d日\n", year2, month2, day2);
としたら意味の分からない数字がかえってきてしまいました。
yesterdayとtomorrowを同時に実行しなければ
正常に処理されるので関数はいいとおもうのですが、正常にあたいを表示するには
どうすればいいでしょうか??
よろしくお願いいたします。