ページ 11

ポイントカードの日付について

Posted: 2007年11月12日(月) 00:25
by sa
構造体で日付を入力したときに、例えば4月1日なら、3月31日を期限にしたいとき、構造体の日付から1ひいたら31にはなりませんよね??そうなるようにするにはどうしたらようでしょうか??

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 00:45
by 管理人
なんか汚いかもしれませんが、こんなのどうでしょう。
その月によって日は結構バラバラなので、個別に指定するしか私にはパッと思いつきません。

プログラムの月は0が1月で11が12月である事に注意してください。0から始まっているので。
最初初期設定は4月1日としています。
#include <stdio.h>

typedef struct{
	int month,day;
}dat_t;

int main(void){
	int i,month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31},back;
	dat_t dat;
	dat.month=4-1;//最初4月とする
	dat.day=1;//最初1日とする。
	printf("何日戻りますか?\n");
	scanf("%d",&back);
	for(i=0;i<back;i++){//戻る日分ループ
		dat.day--;//1日前に戻る
		if(dat.day<=0){//その日が0日以下なら
			dat.month=dat.month-1;//前の月に戻す
			if(dat.month<=0)//その月が0以下なら
				dat.month=11;//去年に戻す
			dat.day=month_day[dat.month];//決定した月の日にちを格納
		}
	}
	printf("%d月%d日です\n",dat.month+1,dat.day);
}
 

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 00:54
by sa
ありがとうございます。入力された日付が今日の日付で、毎日日付はかわりますよね。日にちが31日より小さくて2日より大きかったら、引けば出ますが、1日の場合30日と31日がありますよね?その場合はどのようにしたらよいのでしょうか??30日までの月と31日の月とに分けてプログラムを作ればよいのでしょうか??

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 00:57
by 管理人
上にサンプルプログラムを書きましたが読んでいただけましたでしょうか??
month_day配列にその日にちの情報が入っています。
説明も全て注釈に書いてありますのでよければ読んでください。

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 01:19
by sa
配列に12ヶ月分の日付のデータが入っているので、その配列の要素が月ということになるんですよね??配列の添え字は0からですよね??

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 13:39
by 管理人
そういうことです。
実行してみて自分の思う結果ではなかったでしょうか?
コードでどこか意味がわかりませんでしたでしょうか?
これが最もよいコードかどうかはわかりませんが、参考までに。

Re:ポイントカードの日付について

Posted: 2007年11月12日(月) 20:47
by 組木紙織
日付を扱うときには一月一日からの日にちを基準にして計算するという考え方もあります。
確か気象学や天文学で使われている考え方だったと思います。
一月一日が0だったか、1だったは忘れましたが、以下では一月一日を1として考えてあります。
以下サンプルプログラム。cで記述
エラー処理一切なし。
#include<stdio.h>

const int monthDay[12]={31,28,31,30,31,30,31,31,30,31,30,31};


struct tg_dat{
 	 int month, day;
};

typedef struct tg_dat dat_t;

dat_t getCallenderDay(int);
int getWideDay(dat_t);

int main()
{
	dat_t nowDay,beforeDay;
	int back;
	printf("今日は何月ですか?: ");
	scanf("%d",&nowDay.month);
	
	printf("今日は何日ですか?: ");
	scanf("%d",&nowDay.day);
	
	printf("何日戻りますか?: ");
	scanf("%d",&back);
	beforeDay =getCallenderDay(getWideDay(nowDay)-back);
	
	printf("%d月%d日です",beforeDay.month,beforeDay.day);

 	return 0;
}

dat_t getCallenderDay(int wideDay)
{
	int i=0;
	dat_t dat;
	dat.month=1;
	
	while(wideDay>monthDay){
	    wideDay -=monthDay;
		dat.month++;
		i++;
	}
	
	dat.day = wideDay;
	return dat;
}


int getWideDay(dat_t dat)
{
	int i=0;
	int wideDay=0;
	
	while(dat.month>1){
	   wideDay+=monthDay;
	   i++;
	   dat.month--;
	}
	wideDay+=dat.day;
	return wideDay;
}

最近はずっとfortranやVBでプログラミングしていたので、cで書く感覚を忘れてしまって、
時間がかかってしまいました。
本当はエラー処理もするつもりでしたが、気力が潰えてしまい出来ませんでした。