c言語 関数の利用

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pzym321
記事: 4
登録日時: 4年前

c言語 関数の利用

#1

投稿記事 by pzym321 » 4年前

年月日を引数として、当年の1月1日から数えて何日目となるかを返す関数を作成せよ。なお、設問1で作成した閏年判定関数を利用し、2月の日数計算に利用せよ。関数のプロトタイプ宣言は以下の通りとする。

int count_day_of_year(int year, int month, int day);

上記を呼び出すmain関数も作成し動作を確認せよ。

なお、各月の日数(28/29, 30, 31)の計算にcase文を用いることもひとつの手法である。
添付ファイル
AD38C2DF-A7D9-4688-83F5-05C108718838.jpeg
設問1

box
記事: 2002
登録日時: 13年前

Re: c言語 関数の利用

#2

投稿記事 by box » 4年前

で、質問は何ですか?
当年の1月1日から数えて何日目となるかを返す関数を作成せよ。
作成してください。
上記を呼び出すmain関数も作成し動作を確認せよ。
作成し、動作を確認してください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: c言語 関数の利用

#3

投稿記事 by かずま » 4年前

「設問1で作成した閏年判定関数」とは何でしょうか?
添付ファイルの is_leep_year のことでしょうか?

閏年は leap year ですが、その関数だと
閏年である 2000年が閏年ではないと判定されてしまいます。
また、判定結果を返さず、引数の年をそのまま返しているので
判定結果を利用できません。

問題文には「case文を用いることも」とありますが、
これは switch文の間違いでしょう。
case は switch文の中に書く文につけるラベルです。

質問をするときは、何が分からないのかをきちんと書きましょう。

・問題文の意味が分からないのか。
・解き方が分からないのか。
・プログラムの書き方が分からないのか。
・コンパイルエラーが出るのか。
・実行結果が正しくないのか。

次の質問に答えてください。
・2019年5月12日は、何日目ですか?
・それはどうやって求めましたか?

Math

Re: c言語 関数の利用

#4

投稿記事 by Math » 4年前

初心者のかたのようですね。こうゆう問題は優しいことからコツコツとやれば意外と簡単ですよ。

gcc 8.2.0 を使用する

main.c

コード:

#include <stdio.h>

// ● 設問1で作成した閏年判定関数を利用:簡素化してあります:閏年は1を返す、それ以外は0
int is_leap_year(int year){

    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) ? 1:0;
}

//  ● 関数のプロトタイプ宣言
int count_day_of_year(int year, int month, int day);

int main(void){

    int a; int b; int c; int x;
    int anser_days=0; // 当年の1月1日から数えて何日目

    printf("西暦を入力してから、Enterを押してください  ");
    scanf("%d",&a);

    printf("月を入力してから、Enterを押してください  ");
    scanf("%d",&b);

    printf("日を入力してから、Enterを押してください  ");
    scanf("%d",&c);

    printf("*** anser=%d\n",count_day_of_year(a, b, c));

    return 0;

}

//  ● 関数の定義:実装
int count_day_of_year(int year, int month, int day){
//             1  2  3  4  5  6  7  8  9 10 11 12
    int m[]={ 31,28,31,30,31,30,31,31,30,31,30,31 };

    int anser_days=0;

    for(int i=2019; i<year; i++){

        printf("%d年\t",i);
        if(is_leap_year(i)){ anser_days +=364; printf("+%d日\t anser_days=%d日\n",364,anser_days); }
                       else{ anser_days +=365; printf("+%d日\t anser_days=%d日\n",365,anser_days); }
    }

    for(int i=0; i<month; i++){

        anser_days += m[i]; printf("i=%d月:+%d日:\tanser_days=%d日\n",i+1,m[i],anser_days);
        if(i==1 && is_leap_year(year)){ anser_days +=1;printf("2月閏年補正:1日\t%d日\n",anser_days); }
    }
    
    anser_days += day; printf("+%d日\tanser_days=%d日\n",day,anser_days);

    return anser_days;
}
実行してみる
http://www2.koyoen.birdview.co.jp/~abcx ... -12-a-.PNG

Math

Re: c言語 関数の利用

#5

投稿記事 by Math » 4年前

if(is_leap_year(i)){ anser_days +=364; printf("+%d日\t anser_days=%d日\n",364,anser......

の 364 は 366 (うるう年)の間違いですね。

(anser という変数は answer のつもりね(^^;

Math

Re: c言語 関数の利用

#6

投稿記事 by Math » 4年前

time_t をつかえば日数は簡単にもとまる。

time_t で表示される時間は、万国標準時 (UCT)の1970年1月1日の00:00:00からの 経過時間を秒単位で表した32ビット数値である。 time_t の値を 86400 ( = 60 * 60 * 24 ) で割れば、1970年1月1日からの通算日数となる。
http://home.a00.itscom.net/hatada/c-tips/datetime.html

かずま

Re: c言語 関数の利用

#7

投稿記事 by かずま » 4年前

Math さんが書きました:
4年前
初心者のかたのようですね。こうゆう問題は優しいことからコツコツとやれば意外と簡単ですよ。

gcc 8.2.0 を使用する

main.c
そのプログラムを実行してみると

コード:

西暦を入力してから、Enterを押してください  2019
月を入力してから、Enterを押してください  1
日を入力してから、Enterを押してください  1
i=1月:+31日:  anser_days=31日
+1日    anser_days=32日
*** anser=32
2019年1月1日が、当年1月1日から 32日目となります。

さらに、問題文の「年月日を引数として、当年の1月1日から数えて」
ですが、当年というのは、引数の年月日の年のことだと考えるのが
普通ではありませんか?

標準ライブラリの mktime を使えば年間通算日は求まります。

コード:

#include <stdio.h> // scanf, printf
#include <time.h>  // mktime

int count_day_of_year(int year, int month, int day)
{
	struct tm tm = { 0 };
	tm.tm_year = year - 1900;
	tm.tm_mon = month - 1;
	tm.tm_mday = day;
	return mktime(&tm) != -1 ? tm.tm_yday + 1 : -1;
}

int main(void)
{
	int y, m, d;
	while (printf("> "), scanf("%d%d%d", &y, &m, &d)==3 && m>=1 && m<=12)
		printf("%d/%d/%d: %d\n", y, m, d, count_day_of_year(y, m, d));
}
実行例

コード:

> 2019 1 1
2019/1/1: 1
> 2019 5 13
2019/5/13: 133
> 2019 12 31
2019/12/31: 365
> 2020 12 31
2020/12/31: 366
> .
自分で計算しようとすれば、

コード:

int count_day_of_year(int y, int m, int d)
{
	static int t[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };
	return (m>2 && y%4==0 && (y%100 || y%400==0)) + t[m-1] + d;
}
これは、「設問1で作成した閏年判定関数を利用し」という条件に
従っていないので解答ではありませんが。

pzym321
記事: 4
登録日時: 4年前

Re: c言語 関数の利用

#8

投稿記事 by pzym321 » 4年前

pzym321 さんが書きました:
4年前
年月日を引数として、当年の1月1日から数えて何日目となるかを返す関数を作成せよ。なお、設問1で作成した閏年判定関数を利用し、2月の日数計算に利用せよ。関数のプロトタイプ宣言は以下の通りとする。

int count_day_of_year(int year, int month, int day);

上記を呼び出すmain関数も作成し動作を確認せよ。

なお、各月の日数(28/29, 30, 31)の計算にcase文を用いることもひとつの手法である。

返信

“C言語何でも質問掲示板” へ戻る