• ベストアンサー

日齢計算プログラム

誕生年月日を入力し、本日時点での日齢を計算するプログラムを作成する。日齢とは誕生の日から本日までの経過日数である(昨日生まれた人の日齢は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); } }

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >ところが昭和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
destinatio
質問者

お礼

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; }

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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→『関数を使わないで日付の計算をしたいのですが。』 ・以上。まずはカッコを修正して下さい。それからです。

destinatio
質問者

補足

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

destinatio
質問者

お礼

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

関連するQ&A

  • C言語 ツェラーの公式を使った曜日の計算

    ツェラーの公式を使い、年、月、日にちから曜日を表示するプログラムを作りました。 #include<stdio.h> main() { int y,m,d,x,z; printf("年、月、日にちの順に入力してください→"); scanf("%d%d%d",&y,&m,&d); if(m<2){ m=m+12; y=y-1; } x=y+y/4-y/100+y/400+(13*m+8)/5+d; z=x%7; switch(z){ case 0: printf("日曜日\n"); break; case 1: printf("月曜日\n"); break; case 2: printf("火曜日\n"); break; case 3: printf("水曜日\n"); break; case 4: printf("木曜日\n"); break; case 5: printf("金曜日\n"); break; case 6: printf("土曜日\n"); break; } } これを基本に、1582年10月5日以前の入力があったとき「エラー」と表示するにはどうすればいいですか? 解答お願いします。

  • このソースがコンパイルエラーになってしまいます

    このソースのどこがわるいのかわかりません エラー時にこのようなエラーメッセージが出ます In function `writedata': 52: error: syntax error before string constant 65: error: syntax error before string constant 89:2: warning: no newline at end of file ソースはこれです #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writedata(char datafile[]); void viewdata(char datafile[]); char datadir[] = "dat/"; int year,month,day; int main(int argc,char *argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile,"walk%04d%02d",year,month); if((argc > 1) && (strcmp(argv[1],"-view")==0)) { viewdata(datafile); } else { writedata(datafile); } return 0; } void writedata(char datafile[]) { diary today_data; FILE *outfp; char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか?(y/n) > ",year,month,day); scanf("%c", &y_n); while(getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ",year,month,day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str"%d %d %d",&year,&month,&day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31)|| (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile,"walk%04d%02d",year,month); } today_data.day = day; printf("距離は? >"); scanf("%lf", &today_data.dist); while(getchar() != '\n') { } printf"コメントは?(30文字以内) >"); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s",datadir,datafile); if((outfp = fopen(filename,"a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp , "%d %.2lf", today_data.day,today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp,"%s",today_data.comment); fclose(outfp); printf("記録しました"); } void viewdata(char datafile[]) { } なぜ、エラーになったか教えてくださいお願いします

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • カレンダープログラム、曜日の出力について。

    西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。 過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。 プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。 forやifの条件の記述がおかしいのでしょうか? なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。 始めのgetsの所はあえてです。 #include<stdio.h> #include<stdlib.h> int main(void) { char ss[9],cop1[5],cop2[3],cop3[3]; int year,manth,day,aa,cc,i,f; gets(ss); ss[8] = 0; cop1[4] = 0; cop2[2] = 0; cop3[2] = 0; for(i = 0;i <= 3;i++){ cop1[i] = ss[i]; } for(i = 0;i <= 1;i++){ cop2[i] = ss[i+4]; } for(i = 0;i <= 1;i++){ cop3[i] = ss[i+6]; } year = atoi(cop1); manth = atoi(cop2); day = atoi(cop3); printf("%d年%d月%d日",year,manth,day); for(f = 1900; f <= year; f++){  //閏年か平年で日数を変える if((year%4) == 0 && year != 1900){ aa += 366; } else{ aa += 365; } } if((year%4) == 0 && manth >= 3 ){//閏年かつ3月以降日数+1 aa += 1; } switch(manth){ case 1: cc = (aa + day)%7; break; case 2: cc = (aa + 31 +day)%7; break; case 3: cc = (aa + 59 +day)%7; break; case 4: cc = (aa + 90 +day)%7; break; case 5: cc = (aa + 120 +day)%7; break; case 6: cc = (aa + 151 +day)%7; break; case 7: cc = (aa + 181 +day)%7; break; case 8: cc = (aa + 212 +day)%7; break; case 9: cc = (aa + 243 +day)%7; break; case 10: cc = (aa + 273 +day)%7; break; case 11: cc = (aa + 304 +day)%7; break; case 12: cc = (aa + 334 +day)%7; break; } switch(cc){ case 1: printf(" (月)"); break; case 2: printf(" (火)"); break; case 3: printf(" (水)"); break; case 4: printf(" (木)"); break; case 5: printf(" (金)"); break; case 6: printf(" (土)"); break; case 0: printf(" (日)"); break; } return 0; }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

  • このプログラムの問題点を教えてください。

    いつもお世話になっております。 また質問させていただきます。 あるサイトの課題を自分なりにやってみました。 問題文 クイズを3題出題し、ユーザの解答に応える(「正解」とか「不正解」とか言う)プログラムを書いてください。   クイズは何でもかまいません。 それで作ってみたプログラムがこれです。 #include <stdio.h> int main(void){ int x,y; printf("1234\n"); scanf("%d",&x); switch(x){ case 0: return 0; case1: printf("hgfhgfhsa\n"); break; case2: printf("hjtuyer\n"); break; case3: printf("uytcbbvxbn\n"); break; case4: printf("oiu68fgfd\n"); break; } while(1){ printf("haydhgfsjd?\n"); printf("1,kukakaka 2,hihihi 3,yayay\n"); scanf("%d",&y); if(y == 1){ printf("763827648327ue\n"); break; } else if(y == 2){ printf("menndokusai\n"); break; } なんとかコンパイルができました。本当は3問問題を書かなければいけないのですが2問目が終わって確認の意味でコンパイルしました。 それで実行してみたところ、1問目の答えが出ませんでした。自分でも理由がわかりません。 なので皆様に問題点を指摘してほしいのです。 へんな質問ですがよろしくおねがいします。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • 数字文字をカウントするプログラムの動作について

    良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。 C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。 #include <stdio.h> int main(void) { int i,ch; int cnt[10] = {0}; while(1) { ch = getchar(); if (ch==EOF) break; switch(ch) { case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */ case '1' : cnt[1]++;printf("%d\n",ch);break; case '2' : cnt[2]++;printf("%d\n",ch);break; case '3' : cnt[3]++;printf("%d\n",ch);break; case '4' : cnt[4]++;printf("%d\n",ch);break; case '5' : cnt[5]++;printf("%d\n",ch);break; case '6' : cnt[6]++;printf("%d\n",ch);break; case '7' : cnt[7]++;printf("%d\n",ch);break; case '8' : cnt[8]++;printf("%d\n",ch);break; case '9' : cnt[9]++;printf("%d\n",ch);break; } } puts("数字文字の出現回数"); for(i=0;i<10;i++) printf("'%d':%d\n",i,cnt[i]); getchar();getchar(); return(0); } といったプログラムです。 実行し、数値を入力、CTRL+Zで入力を終了し、出現回数を表示させる、という動作自体は無事にできるのですが、何故chの値が変更していくのかがわかりません、数値を入力した時点で51や49といったそれぞれ違う数値が表示されるのですが、chの値を変更させる命令を、何が引き起こしているのかが理解できません、3(51)と判定されて同じ数が無限にカウントされないのは何故なのでしょうか・・・・? また、その後の無限ループからの脱出をCTRL+Zがどうして引き起こすのかも理解できず困っています、教科書には「CTRL+Zは入力の終了を意味する」とあるのですが、これは一体どういう意味なのでしょうか、強制的に割り込んでEOFを代入するということなのでしょうか・・・? お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

  • C言語 初心者です。

    いつもお世話になっています。 以下のソースはファイルに今日の日付を書き込み、それをコマンドプロンプトに表示させたいと思い作成しましたが、できません。 どうか教えてください。 #include <time.h> #include <stdio.h> void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fp = fopen("time.txt", "w"); int year, month, day; fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900, local->tm_mon + 1, local->tm_day); printf("%d%d%d%d\n", year, month, day); fclose(fp); } int main(void) { put_data(); return 0; }

専門家に質問してみよう