こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

日齢計算プログラム

誕生年月日を入力し、本日時点での日齢を計算するプログラムを作成する。日齢とは誕生の日から本日までの経過日数である(昨日生まれた人の日齢は1日)。誕生年の入力は西暦ではなく和暦とする。出力は画面に出力するとともに、ファイル“abc.txt”に出力する。
現段階では一年を365日とし、毎月の日数を正しくとらえて計算するプログラム。
ただし、うるう年は考慮していないのでこの場合の日齢も正確ではない。○月×日が一年の最初の日から何日目であるかを計算する関数を作る。
1月 1/1からの日数=日
2月 1/1からの日数=日+31
3月 1/1からの日数=日+59
というように作っています。
ところがコンパイルをすると”gfewy.cpp(60) : error C2601: 'main' : ローカル関数の定義が正しくありません。”というエラーメッセージが出てきます。
どのように訂正すればいいのでしょうか、教えてください。
#include <stdio.h>

int day_count(int x,int y)
{
int z;
switch(x){
case 1:
z=y;
break;

case 2:
z=y+31;
break;

case 3:
z=y+59;
break;

case 4:
z=y+90;
break;

case 5:
z=y+120;
break;

case 6:
z=y+151;
break;

case 7:
z=y+181;
break;

case 8:
z=y+212;
break;

case 9:
z=y+243;
break;

case 10:
z=y+273;
break;

case 11:
z=y+304;
break;

case 12:
z=y+334;
break;

return(z);
}

void main (void)

{
FILE *fp;
char nengo;
int year_td,month_td,day_td,year_bd,month_bd,day_bd,nichirei;


fp=fopen("abc.txt","w");

printf("your birthday\n");
fprintf(fp,"your birthday\n");
printf("input nongou:");scanf("%c",&nengo);
fprintf(fp,"input nongou:");
printf("input year:");scanf("%d",&year_bd);
fprintf(fp,"input year:");
printf("input month:");scanf("%d",&month_bd);
fprintf(fp,"input month:");
printf("input day:");scanf("%d",&day_bd);
fprintf(fp,"input day:");

switch(nengo){
case'm':
case'M':
year_bd=year_bd+1867;
break;
case't':
case'T':
year_bd=year_bd+1911;
break;
case's':
case'S':
year_bd=year_bd+1925;
break;
case'h':
case'H':
year_bd=year_bd+1988;
break;
default:
printf("input nengo is invalid.\n");
}


year_td=2007;
month_td=10;
day_td=22;
nichirei=365*(year_td-year_bd)+(day_count(month_td,day_td)-day_count(month_bd,day_bd));

printf("your birthday:year=%d,month=%d,day=%d\n",year_bd,month_bd,day_bd);
fprintf(fp,"your birthday:year=%d,month=%d,day=%d\n",year_bd,month_bd,day_bd);
printf("your nichirei:%d\n",nichirei);
fprintf(fp,"your nichirei:%d\n",nichirei);

fclose(fp);

}

}

投稿日時 - 2007-10-24 16:16:14

QNo.3457501

すぐに回答ほしいです

質問者が選んだベストアンサー

★アドバイス
>ところが昭和38年5月14日で試してみると
>16350と出力されました。本当なら16229となるはずだったので
>すが…どこがおかしいのでしょうか?
 ↑
 コピー&ペーストして『昭和38年5月14日』と入力すると『16221』と計算されました。
 本当に『16350』と表示されたのですか?
・閏年は考慮していないとなっていますけど。
 ここを除けば計算ロジックはあっているように見えます。
>nichirei=365*(year_td-year_bd)+(day_count(month_td,day_td)-day_count(month_bd,day_bd));
 ↑
 この1行を分かりやすく3行にすると
 a = (year_td * 365) + day_count( month_td, day_td ); // today
 b = (year_bd * 365) + day_count( month_bd, day_bd ); // birthday
 c = (a - b); // 差
 『c』が誕生日からの通算日数になります。
 もちろん閏年は考慮していません。
 この計算式でも『昭和38年5月14日』の計算結果は『16221』となりました。
・ちなみに day_count() 関数の return 位置を正しく修正しましたか?
 カッコの位置を修正したようですがこれによって return 位置も修正しないとまずいです。
 つまり
 int day_count(int x,int y)
 {
  switch ( x ){
   :
   省略
   :
   default: ←追加
   z=0;
   break;
  }
  return(z); ←ここに return を修正しましたか?
 }
・return 位置を修正してもう一度計算してみて下さい。
 きっと『昭和38年5月14日』の計算結果が『16221』となります。
 あとは閏年も考えてソースをバージョンUPして下さい。
・以上。閏年に関しては下の『参考URL』をどうぞ。

参考URL:http://oshiete1.goo.ne.jp/qa3252212.html

投稿日時 - 2007-10-25 16:26:12

お礼

Oh-Orangeさんのご指摘どおり『昭和38年5月14日』の計算結果は『16221』となりました。
return(z);の修正も抜けていました。
以下のやり方でうるう年も考慮しました。ありがとうございました。
#include <stdio.h>
int sum_year_day(int y, int yy)
{
int i, z;
z=0;
for(i=y+1;i<yy;i++){
if((i%4==0 && i%100!=0) || i%400==0){
z=z+366;
}else{
z=z+365;
}
}
return z;
}

int sum_month(int y, int m, int d)
{
int sd, i;
if(((y%4==0 && y%100!=0) || y%400==0) && m==2){
sd=29-d;
}else if(m==1 || m==3 || m==5 || m==7|| m==8 || m==10 || m==12){
sd=31-d;
}else if(m==4 || m==6 || m==9 || m==11){
sd=30-d;
}else if(m==2){
sd=28-d;
}

for(i=m+1;i<=12;i++){
if(((y%4==0 && y%100!=0) || y%400==0) && i==2){
sd=sd+29;
}else{
if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
sd=sd+31;
}else if(i==4 || i==6 || i==9 || i==11){
sd=sd+30;
}else if(i==2){
sd=sd+28;
}
}
}
return sd;
}

int sum_month2(int y, int m, int d)
{
int sd, i;

sd=d;

for(i=1;i<m;i++){
if(((y%4==0 && y%100!=0) || y%400==0) && i==2){
sd=sd+29;
}else{
if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
sd=sd+31;
}else if(i==4 || i==6 || i==9 || i==11){
sd=sd+30;
}else if(i==2){
sd=sd+28;
}
}
}
return sd;
}

投稿日時 - 2007-10-31 17:49:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

★カッコの位置がおかしいです。
・これによりコンパイルエラーになっていると思います。
 つまり下のようになっています。
 #include <stdio.h>
 
 int day_count( int x, int y )
 {
  switch ( x ){
   :
   省略
   :
  }
  
  void main(void)
  {
   :
   省略
   :
  }
 }
 『day_count』関数の中に main 関数は作れません。
 次のように修正すべきです。
 #include <stdio.h>
 
 int day_count( int x, int y )
 {
  switch ( x ){
   :
   省略
   :
  }
 } ←ここにカッコを持ってくる
 
 void main(void)
 {
  :
  省略
  :
 }

その他:
・次のリンクを参考にして下さい。ヒントになると思いますので。どうぞ。
 http://oshiete1.goo.ne.jp/qa3252212.html→『カレンダープログラム、曜日の出力について。』
 http://oshiete1.goo.ne.jp/qa3141156.html→『関数を使わないで日付の計算をしたいのですが。』
・以上。まずはカッコを修正して下さい。それからです。

投稿日時 - 2007-10-24 16:52:36

補足

Oh-Orangeさんありがとうございます。
やはりかっこのいちがおかしかったようでそれを変更すると
実行できました。ところが昭和38年5月14日で試してみると
16350と出力されました。本当なら16229となるはずだったので
すが…どこがおかしいのでしょうか?

投稿日時 - 2007-10-24 23:07:06

ANo.1

day_count のかっこの対応をチェックしてください.

投稿日時 - 2007-10-24 16:37:04

お礼

ありがとうございます。
かっこの対応が間違っていました。

投稿日時 - 2007-10-24 17:58:45

あなたにオススメの質問