日付を進めるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kimi

日付を進めるプログラム

#1

投稿記事 by kimi » 8年前

昨日も投稿してある程度直したんですけどまた聞きに来ました
一日進めてるプログラムです(問題ばかりなんで今のところは年は進みません)
なぜかどの月でも30日で終わってしまいます、
(知識は明解c言語入門を読んだばかりのところです)
===============================================

コード:

#include<stdio.h>

/*一日進める関数*/
void increment_date(int *y, int *m, int *d)
{
	
	if ((++(*d)) > 28)
	{
		
		if (*d == 31) {
			(*m)++; *d = 1;
		}

	else if(*d == 30 && ((*m == 4||*m == 6)||*m == 11)) {
		(*m)++; *d = 1;
	}else if(*d == 28){(*m)++; *d = 1;}

    }

}


int main()
{

	int y, m, d,ok;
	
	
	

		puts("年、月、日の順番で入力してください");

		scanf("%d", &y);
		scanf("%d", &m);
		scanf("%d", &d);


		puts("一日進めます、いいですね?よかったら1だめなら0");
		scanf("%d", &ok);

		while (ok) 
		{
			

			increment_date(&y, &m, &d);
			printf("今日は%d年%d月%d日です。\n", y, m, d);

			puts("一日進めます、いいですね?よかったら1だめなら0");
			scanf("%d", &ok);

		}
	

		return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 日付を進めるプログラム

#2

投稿記事 by みけCAT » 8年前

kimi さんが書きました:昨日も投稿してある程度直したんですけどまた聞きに来ました
日にちを進めるプログラムが進みません。 • C言語交流フォーラム ~ mixC++ ~
のことですね。
トピックを放置してはいけません。
前のトピックでお礼と解決した方法を言い、解決にして(返信画面の「送信」ボタンの右にある「解決!」にチェックを入れて返信を投稿する)から次のトピックを立てるか、
この場合同じプログラムに関する問題なので前のトピックの返信として投稿するべきでしょう。

(面倒を見られる程度であれば、関係ない問題に関する複数のトピックを並行して(1個の問題が解決しないうちに他の問題に関するトピックを)立てるのは問題ないと考えています)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 日付を進めるプログラム

#3

投稿記事 by みけCAT » 8年前

kimi さんが書きました:なぜかどの月でも30日で終わってしまいます、
再現できませんでした。
2017年4月は29日で終わりました。 (詳細は下記)

kimiさんが見ているコードとコンパイラが見ているコードが同じかを確認してください。すなわち、
・エディタ上の最新のソースコードを正しい位置に保存したか
・本当に意図したソースコードをコンパイルしているか
を確認してください。



入力

コード:

2017 4 25
1 1 1 1 1 1 1 1 1 1
0
実行結果

コード:

年、月、日の順番で入力してください
一日進めます、いいですね?よかったら1だめなら0
今日は2017年4月26日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年4月27日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年4月28日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年4月29日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月1日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月2日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月3日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月4日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月5日です。
一日進めます、いいですね?よかったら1だめなら0
今日は2017年5月6日です。
一日進めます、いいですね?よかったら1だめなら0
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 日付を進めるプログラム

#4

投稿記事 by みけCAT » 8年前

まずは、「月を進めて日を1にする」処理を行う条件を日本語で書いてみてください。
その後で、それをソースコードにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

梅衣堂ひよ
記事: 24
登録日時: 8年前

Re: 日付を進めるプログラム

#5

投稿記事 by 梅衣堂ひよ » 8年前

7行目

コード:

    if ((++(*d)) > 28)
ここでは先に日付を進めてから28を過ぎたか判定をとっていますが、
10~16行目

コード:

        if (*d == 31) {
            (*m)++; *d = 1;
        }
 
    else if(*d == 30 && ((*m == 4||*m == 6)||*m == 11)) {
        (*m)++; *d = 1;
    }else if(*d == 28){(*m)++; *d = 1;}
 
    }
これでは内部的には月の変わり目なため、表示上では月が替わるのが1日早くなってしまいます。
7行目

コード:

    if ((++(*d)) > 28)
それと、28日は過ぎているのに28日と同じか判定をとろうとしてもtrueになることはありません。
また、28日の判定をとれるようになった際、28日が2月限定か判定をとっていないため、30・31日のそれぞれの条件式をfalseで突破してきた際に28日の処理に入ることになります。

いずれ閏年の処理もいれたりするのでしょうから、一度increment_dateの処理を1から考え直すことをお勧めします。

[hr]
ちなみに、2月は別として、7月までは奇数月が31日、偶数月が30日まで、8月からは奇数月が30日で偶数月が31日となっています。
14行目

コード:

    else if(*d == 30 && ((*m == 4||*m == 6)||*m == 11)) {
そのため、一月が30日なのは、4,6,9,11月です。
31~35行目

コード:

        puts("年、月、日の順番で入力してください");
 
        scanf("%d", &y);
        scanf("%d", &m);
        scanf("%d", &d);
また、最初に日付を入力してますが、月と日付が正しい値になっているか判定をとっていないため、13月32日などありえない日付を入力できてしまいます。
オフトピック
ソースについてですが、インデントがずれていたりif文によって{}の位置がバラバラだったりと非常に読みにくいものとなっています。
自分しか見ないソースだとしても気を付けたほうがいいことですが、質問の際などにソースを他者に見せる場合は特に意識したほうがよいと思います
結構説明が下手ですのでご了承ください。割と言葉が足りなかったり文字だらけで分かりにくかったりします。

kimi

Re: 日付を進めるプログラム

#6

投稿記事 by kimi » 8年前

たくさんの返信ありがとうございました!

かずま

Re: 日付を進めるプログラム

#7

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

kimi さんが書きました:たくさんの返信ありがとうございました!
解決したのなら、完成したコードを提示しましょう。

月の最終日を表で持つと簡単になりますよ。

コード:

#include <stdio.h>
 
void increment_date(int *y, int *m, int *d)
{
    static int t[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (++*d > t[*m-1]) {  // 1日進めて、それが月の最終日を超えていたら
        *d = 1;
        if (++*m > 12) {
            *m = 1;
            ++*y;
        }
    }
}
 
int main(void)
{
    int y, m, d, ok;
    puts("年、月、日の順番で入力してください");
    if (scanf("%d%d%d", &y, &m, &d) != 3 || m < 1 || m > 12) return 0;
    while (1) {
        puts("一日進めます、いいですね?よかったら1だめなら0");
        if (scanf("%d", &ok) != 1 || !ok) break;
        increment_date(&y, &m, &d);
        printf("今日は%d年%d月%d日です。\n", y, m, d);
    }
    return 0;
}

返信

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