#4

[C言語]日付を6ケタで入力しyyyy/mm/ddで出力するプログラムを作ってみた!

こんにちは。Takuya.B(@TB_IQ)です。

プログラミングの技術向上の為、日常的にプログラムの作成練習に取り組んでいます。

6ケタで日付を付ける(2016年9月29日なら"160929"のように)癖がありますが、6ケタの数字を正しく表示するプログラムを作ってみましたので、ご紹介します!

スポンサーリンク

6桁の数字(160930 → 2016年9月30日)と表示するプログラム

とりあえず作ってみたのはコレ!

#include <stdio.h>

int main(void) { 
  int date,yy,mm,dd; 

  printf("今日の日付を6ケタで入力して下さい>>"); 
  scanf("%d", &date); yy = date / 10000; 

  mm = (date - (yy*10000))/100; 
  dd = date % 100; 

  printf("20%d年%d月%d日\n", yy,mm,dd); 
  return 0;
}

これで出力するとこうなります。

000

あれ?ちょっと待てよ…。もしかして…。

bbb
aaa

12月35日とかも表示できちゃいました…(´・ω・`) これはマズイ。

西向く侍(2,4,6,9,11月)のときは31日を入力(例:160931)したらエラーが出でるようにしたい。特に2月は28日まで、うるう年には29日を表示させるようにしたい。

そんなことを考えていたら頭の中がグチャグチャになってパニックになってしまいましたが、何とかゴリゴリしながら完成したものがこちら!!


int main(void)
{
    int Flag = 0;
    int date,yy,mm,dd;

    printf("\n\nおはようございます!今日の日付を6ケタで入力して下さい (例)2016年9月29日 → 160929\n>>");
    while(Flag==0){
    scanf("%d", &date);

    yy = date / 10000;
    mm = (date - (yy*10000))/100;
    dd = date % 100;

         if(yy>=16 && mm<=12 && dd<=31){ //15年 or 13月 or 35日はありえない
             if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12){
                 Flag=1;
             } else if(mm!=2 && dd<=30){
                 Flag=1;
             } else if(dd<=28){
                 Flag=1;
             } else if(yy==20 || yy==24 || yy==28 || yy==32){
                 if(dd<30){
                    Flag=1;
                    printf("今年は閏年だあああああああああぁぁぁぁぁ!!!!\n");
                 }
             }
         } else {
             Flag=0;
         }

        if(Flag==0){
            printf("\n\nこれは正しい日付ではありません。もう一度日付を6ケタで入力して下さい\n>>>");
        } else {
            printf("\n正しい日付が入力されました!今日の日付は…");
        }
    }
        printf("\n20%d年%d月%d日\n\n", yy,mm,dd);

return 0;
}

スポンサーリンク

解説

2016年13月53日のような存在しない日付が入力されたときに、6ケタの数字を入力し直したいので、while文を使っています。

int Flag = 0;

while(Flag==0){
  scanf("%d", &date);

  if(条件式){
    Flag = 1; //正しくにゅにゅう入力されたらFlagに1を渡してループ脱出
  } else {
    Flag = 0; //Flagは初期値0で宣言してるので不必要だが、念のため
  }
}

ループから脱出させるために、新たに変数"Flag"を初期値0で宣言しています。if文で条件分岐させ、正しい値が入力されているときだけ変数"Flag"に1を渡してループ脱出させるようにしています。

if文中でFlagに0を再び渡していますが、そもそもif文の条件に合わなければFlagの値は0のままなので不必要です。これは念のためです。

もっとシンプルにコードを書くこともできるはずですが、わたしにはこれが精一杯でした(汗)

スポンサーリンク

まとめ