ページ 11

日にちを進めるプログラムが進みません。

Posted: 2017年3月30日(木) 12:15
by kimi
#include<stdio.h>

void decrement_date(int *y, int *m, int *d)
{

if ((*d++) > 27)
{

if (*d == 31) {
*m++; *d = 1;
}

else if((*d == 30) && (*m == 4, 6, 9, 11)) {
*m++; *d = 1;
}else if(*d != 29){*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)
{


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

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

}

     return 0;
}
===============================================================================

Re: 日にちを進めるプログラムが進みません。

Posted: 2017年3月30日(木) 12:27
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
  • return 0;の前に全角スペースがあり、コンパイラによってはエラーになる。
  • *d++や*m++はdやmが指しているデータ(int型)ではなく、dやm自体(ポインタ)をインクリメントする。
    ポインタが指しているデータをインクリメントするには(*d)++のようにする。
  • (*m == 4, 6, 9, 11)のような形で複数の値とのマッチはできない。これは11、すなわち真になる。
    どれかと等しいかをチェックするには(*m == 4 || *m == 6 || *m == 9 || *m == 11)とする。
  • そもそも*dが30のとき*d != 29は真になるので、わざわざ2回にわける意味がない。
    ちなみに、条件(*d++) > 27より、これを((*d)++) > 27に修正したとすれば、ここでの*dは29以上である。
  • そもそも渡されたyを全く使わず、閏年の判定も年越しも無いのでおかしい。
  • 日にちを進めるのに関数名にdecrementが入っているのは不自然。

Re: 日にちを進めるプログラムが進みません。

Posted: 2017年3月30日(木) 12:36
by みけCAT
現状の報告だけでなく、きちんと「質問」を書いていただきたいです。

フォーラムルールより
「うまくいきません」という質問は大抵回答に困ります。

  1. 自分は今何がしたくて

  2. どう取り組んで(作ったプログラムはどれで

  3. どのようなエラーやトラブルで困っていて

  4. 自分は何が解らないのか、知りたいのか

  5. 今のCの知識はどの程度なのか

この5点をしっかりと明記して下さい。

環境に依存する場合やライブラリを使っているときは

使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。

コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう
1 → 「日にちを進めるプログラム」を作りたい? (明示されていない)
2 → コードがある、OK
3 → 書かれていない (重要)
4 → 書かれていない (「質問」の部分であり、最重要!)
5 → 書かれていない (個人的にはあまり重要ではないと思うが)