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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
茶太
記事: 5
登録日時: 10年前

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

#1

投稿記事 by 茶太 » 10年前

「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;
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

使用する演算子が間違っています。
「year % 400 = 0」ではなく「year % 400 == 0」としてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 10年前

ついでに、54行目の「month = 11」も「month == 11」とした方がいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

茶太
記事: 5
登録日時: 10年前

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

#4

投稿記事 by 茶太 » 10年前

拙いプログラムを見て下さりありがとうございます。
おかげでプログラムを完成させることが出来ました。
とても感謝してます。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 10年前

解決でしたら、解決チェックをお願いします。
具体的には、送信ボタンの右の「解決!」にチェックを入れて返信してください。
記事のタイトルは変えないでください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#6

投稿記事 by かずま » 10年前

元のプログラムには、== と = の混同以外に多くの間違いがあります。
解決チェックだけでなく、完成したプログラムを掲載することを希望します。

茶太
記事: 5
登録日時: 10年前

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

#7

投稿記事 by 茶太 » 10年前

コード:

#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言語でのカレンダー作成

#8

投稿記事 by かずま » 10年前

コード:

西暦を入力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
完成していません。

茶太
記事: 5
登録日時: 10年前

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

#9

投稿記事 by 茶太 » 10年前

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#10

投稿記事 by みけCAT » 10年前

かずま さんが書きました:

コード:

2015月   7日    
これは正しい仕様通りの出力ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#11

投稿記事 by かずま » 10年前

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

茶太
記事: 5
登録日時: 10年前

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

#12

投稿記事 by 茶太 » 10年前

コード:

#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年のカレンダーについては自分で確かめた結果正しく出力出来ましたのでプログラムが完成したと思われます。
長々と付き合って下さりありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る