ページ 1 / 1
日付を進めるプログラム
Posted: 2017年3月31日(金) 20:50
by kimi
昨日も投稿してある程度直したんですけどまた聞きに来ました
一日進めてるプログラムです(問題ばかりなんで今のところは年は進みません)
なぜかどの月でも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;
}
Re: 日付を進めるプログラム
Posted: 2017年3月31日(金) 21:08
by みけCAT
kimi さんが書きました:昨日も投稿してある程度直したんですけどまた聞きに来ました
日にちを進めるプログラムが進みません。 • C言語交流フォーラム ~ mixC++ ~
のことですね。
トピックを放置してはいけません。
前のトピックでお礼と解決した方法を言い、解決にして(返信画面の「送信」ボタンの右にある「解決!」にチェックを入れて返信を投稿する)から次のトピックを立てるか、
この場合同じプログラムに関する問題なので前のトピックの返信として投稿するべきでしょう。
(面倒を見られる程度であれば、関係ない問題に関する複数のトピックを並行して(1個の問題が解決しないうちに他の問題に関するトピックを)立てるのは問題ないと考えています)
Re: 日付を進めるプログラム
Posted: 2017年3月31日(金) 21:13
by みけCAT
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
Re: 日付を進めるプログラム
Posted: 2017年3月31日(金) 21:16
by みけCAT
まずは、「月を進めて日を1にする」処理を行う条件を日本語で書いてみてください。
その後で、それをソースコードにするといいでしょう。
Re: 日付を進めるプログラム
Posted: 2017年4月01日(土) 01:43
by 梅衣堂ひよ
ここでは先に日付を進めてから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日早くなってしまいます。
それと、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文によって{}の位置がバラバラだったりと非常に読みにくいものとなっています。
自分しか見ないソースだとしても気を付けたほうがいいことですが、質問の際などにソースを他者に見せる場合は特に意識したほうがよいと思います
Re: 日付を進めるプログラム
Posted: 2017年4月01日(土) 14:24
by kimi
たくさんの返信ありがとうございました!
Re: 日付を進めるプログラム
Posted: 2017年4月02日(日) 12:29
by かずま
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;
}