
誕生年月日を入力し、本日時点での日齢を計算するプログラムを作成する。日齢とは誕生の日から本日までの経過日数である(昨日生まれた人の日齢は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);
}
}
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
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;
}
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→『関数を使わないで日付の計算をしたいのですが。』
・以上。まずはカッコを修正して下さい。それからです。
この回答への補足
Oh-Orangeさんありがとうございます。
やはりかっこのいちがおかしかったようでそれを変更すると
実行できました。ところが昭和38年5月14日で試してみると
16350と出力されました。本当なら16229となるはずだったので
すが…どこがおかしいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 宇宙科学・天文学・天気 仙台で積雪量が増えたのに降雪量や天気概況には雪が降らなかった観測結果が出ることが最近多くなっている。 1 2023/02/01 19:16
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
- 宇宙科学・天文学・天気 室蘭や苫小牧の8月中旬の平年の最高気温が下旬よりも低いのはなぜですか。 2 2022/08/20 22:28
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSV読み込み時に条件に合う行(...
-
perl Windows 7でファイルの衝...
-
年月日の数値化?
-
うるう年の出し方
-
C言語のプログラミングについて...
-
2つの日付・時間の差分を求め...
-
JSONで文字列が長い時
-
オプションメニュー設定について
-
プルダウンを外部リンクする
-
LISPで連想配列の操作?
-
Application.ScreenUpdating = ...
-
メモリをアドレスを直接指定し...
-
Pythonのプログラミングの質問...
-
FLASHとCGIでのデータの受け渡...
-
perlでtelnetクライアント
-
CGIやPHPで外部ファイルの内容...
-
C言語:単語カウント
-
formで特定のinputを送信しない...
-
複数列を持ったリストボックス...
-
PerlでCabochaを呼び出すには(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付の差分の求め方(日、分)
-
「型が一致しません」のエラー...
-
1桁の日付に0を付ける
-
ファイル操作
-
PHPメールフォームに入力された...
-
C言語でのPICプログラミング
-
Perlの日付の比較に関して
-
当日の日付をプルダウンメニュ...
-
前日の日付取得するには?
-
PerlからMysqlに接続してデータ...
-
月見る月はこの月の月
-
Cookieの有効期限について
-
perlでcheckboxがうまく整理で...
-
C言語のプログラミングについて...
-
日齢計算プログラム
-
関数について
-
Perlで60進数を作りたい
-
2つの日付・時間の差分を求め...
-
日付範囲をの連番と月末を取得
-
うるう年の出し方
おすすめ情報