ページ 11

c言語でのカレンダー作成

Posted: 2015年6月30日(火) 00:55
by 茶太
「45行目」で記述エラーを発見しました。
「lvalue」を付け忘れています。
と表示されます。
どなたかどこが間違っているか教えて下さいませんか?

コード:

#include<stdio.h>

void calendar(int year, int month);
int lastday(int year, int month);
int dayofweek(int year, int month);

int main(void)
{
	int year, month;
	printf("西暦を入力");
	scanf("%d",&year);
	printf("月を入力");
	scanf("%d",&month);
	calendar(year, month);
	return 0;
}

void calendar(int year, int month)
{
	int l, d, i;
	l = lastday( year, month);
	d = dayofweek(year, month);
	printf("    %d月    %d    \n",year, month);
	printf(" 日  月  火  水  木  金  土\n");
	for(i = 1; i <= d; i++)
	{
		printf("  ");
	}
	for(i = 1; i <= l; i++)
	{
		printf(" %d",i);
		if( (d + i) % 7 == 0)
		{
			printf("\n");
		}
	}
	
}

int lastday(int year,int month)
{
	int day;
	if(month == 2)
	{
		if(year % 4 == 0 && year % 100 != 0 || year % 400 = 0)
		{
			day = 29;
		}
		else
		{
			day = 28;
		}
	}
	else if(month == 2 || month ==4 || month == 6 || month == 9 || month = 11) 
	{
		day = 30;
	}
	else
	{
		day = 31;
	}
	return day;
}
	
int dayofweek(int year, int month)
{
	int h, y, m;
	h = year / 100;
	y = year % 100;
	
	if(month == 1 || month ==2)
	{
		month = month + 12;
		year = year - 1;
	}
	d = y + (y / 4) + (h / 4) -2h + (13(m + 1) / 5) + 1;
	return d;
}

Re: c言語でのカレンダー作成

Posted: 2015年6月30日(火) 01:36
by みけCAT
使用する演算子が間違っています。
「year % 400 = 0」ではなく「year % 400 == 0」としてください。

Re: c言語でのカレンダー作成

Posted: 2015年6月30日(火) 01:37
by みけCAT
ついでに、54行目の「month = 11」も「month == 11」とした方がいいかもしれません。

Re: c言語でのカレンダー作成

Posted: 2015年6月30日(火) 17:55
by 茶太
拙いプログラムを見て下さりありがとうございます。
おかげでプログラムを完成させることが出来ました。
とても感謝してます。

Re: c言語でのカレンダー作成

Posted: 2015年6月30日(火) 20:26
by みけCAT
解決でしたら、解決チェックをお願いします。
具体的には、送信ボタンの右の「解決!」にチェックを入れて返信してください。
記事のタイトルは変えないでください。

Re: c言語でのカレンダー作成

Posted: 2015年7月01日(水) 22:21
by かずま
元のプログラムには、== と = の混同以外に多くの間違いがあります。
解決チェックだけでなく、完成したプログラムを掲載することを希望します。

Re: c言語でのカレンダー作成

Posted: 2015年7月02日(木) 02:50
by 茶太

コード:

#include<stdio.h>
void calendar(int year, int month);
int lastday(int year, int month);
int dayofweek(int year, int month);

int main(void)
{
	int year, month;
	printf("西暦を入力");
	scanf("%d",&year);
	printf("月を入力");
	scanf("%d",&month);
	calendar(year, month);
	return 0;
}

void calendar(int year, int month)
{
	int l, d, i;
	l = lastday(year, month);
	d = dayofweek(year, month);
	printf("    %d月   %d日    \n",year, month);
	printf(" 日 月 火 水 木 金 土\n");
	for(i = 1; i <= d; i++)
	{
		printf("   ");
	}
	for(i = 1; i <= l; i++)
	{
		printf(" %2d",i);
		if( (d + i) % 7 == 0 )
		{
			printf("\n");
		}
	}
	
}

int lastday(int year,int month)
{
	int day;
	if(month == 2)
	{
		if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		{
			day = 29;
		}
		else
		{
			day = 28;
		}
	}
	else if(month == 2 || month ==4 || month == 6 || month == 9 || month == 11) 
	{
		day = 30;
	}
	else
	{
		day = 31;
	}
	return day;
}
	
int dayofweek(int year, int month)
{
	int h, y, m, d;
	
	if(month == 1 || month == 2)
	{
		m = month + 12;
		year = year - 1;
	}
	h = year / 100;
	y = year % 100;
	
	d =(y + (y / 4) + (h / 4) -2 * h + (13 * (m + 1) / 5) + 1) % 7 + 1;
	return d;
}

Re: c言語でのカレンダー作成

Posted: 2015年7月03日(金) 03:20
by かずま

コード:

西暦を入力2015
月を入力7
2015月   7日    
 日 月 火 水 木 金 土
              1  2  3
  4  5  6  7  8  9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30 31
完成していません。

Re: c言語でのカレンダー作成

Posted: 2015年7月03日(金) 22:12
by 茶太
70行目の式を month = month + 12
76行目の式をd =(y + (y / 4) + (h / 4) -2 * h + (13 * (month + 1) / 5) + 1) % 7 - 1
にすべきでした。
指摘してくださりありがとうございます。

Re: c言語でのカレンダー作成

Posted: 2015年7月03日(金) 22:39
by みけCAT
かずま さんが書きました:

コード:

2015月   7日    
これは正しい仕様通りの出力ですか?

Re: c言語でのカレンダー作成

Posted: 2015年7月03日(金) 22:52
by かずま
茶太 さんが書きました:70行目の式を month = month + 12
76行目の式をd =(y + (y / 4) + (h / 4) -2 * h + (13 * (month + 1) / 5) + 1) % 7 - 1
にすべきでした。
2015年 4月、5月、8月はどうなりますか?

Re: c言語でのカレンダー作成

Posted: 2015年7月04日(土) 15:23
by 茶太

コード:

#include<stdio.h>
void calendar(int year, int month);
int lastday(int year, int month);
int dayofweek(int year, int month);

int main(void)
{
int year, month;
printf("西暦を入力");
scanf("%d",&year);
printf("月を入力");
scanf("%d",&month);
calendar(year, month);
return 0;
}

void calendar(int year, int month)
{
int l, d, i;
l = lastday(year, month);
d = dayofweek(year, month);
printf(" %d年 %d月 \n",year, month);
printf(" 日 月 火 水 木 金 土\n");
for(i = 1; i <= d; i++)
{
printf(" ");
}
for(i = 1; i <= l; i++)
{
printf(" %2d",i);
if( (d + i) % 7 == 0 )
{
printf("\n");
}
}

}

int lastday(int year,int month)
{
int day;
if(month == 2)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
day = 29;
}
else
{
day = 28;
}
}
else if(month == 2 || month ==4 || month == 6 || month == 9 || month == 11)
{
day = 30;
}
else
{
day = 31;
}
return day;
}

int dayofweek(int year, int month)
{
int h, y, m, d;

if(month == 1 || month == 2)
{
month = month + 12;
year = year - 1;
}
h = year / 100;
y = year % 100;


d =(y + (y / 4) + (h / 4) -2 * h + (13 * (month + 1) / 5) + 1 + 700) % 7 - 1;
if(d < 0)
d = 6;
return d;
}
22行目は年と月にしました。
76行目の式はdの値がマイナスになってしまうことがあるとわかったので、7で割り切れる700を足しました。
また、dの()内の式が7で割り切れてしまった場合d=-1となってしまい正しくカレンダーが表示出来ないことに気が付きました。
この場合if文でd=6となるように変えました。
2015年のカレンダーについては自分で確かめた結果正しく出力出来ましたのでプログラムが完成したと思われます。
長々と付き合って下さりありがとうございます。