日历

yiqiesuifengf 2010-07-21 11:47:38

#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6
int inputyear(); //输入年份
void prtcalendar(int year); //打印某年的日历
void prtmonthcalendar(int month,int year); //打印某月的日历
char *monthname(int month); //月份名称
int monthdays(int month,int year); //计算某月的天数
int firstdayofmonth(int month,int year); //计算某月的第一天是星期几
void printspace(int weekday); //打印某月第一天以前的空格
int isleapyear(int year);
void main()
{
int year;
year=inputyear();
prtcalendar(year);
}
//输入年份
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
//打印某年的日历
void prtcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prtmonthcalendar(month,year);
printf("\n");
}
}
//打印某月的日历
void prtmonthcalendar(month,year)
{
int weekday,ndays,day;
printf("%s,%d\n",monthname(month),year);
printf("SU MO TU WE TH FR SA\n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
printspace(weekday);
//在星期表上打印日期
for(day=1;day<=ndays;day++)
{
printf("%-8d",day);
if(weekday==saturday)
printf("\n");
weekday=(weekday+1)%7;
}
if(weekday!=sunday)
printf("\n"); //最后一行为星期的开头是不需要换行
}
//返回月份名称
char *monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("illegal month");
}
}
//计算某月的天数
int monthdays(int month,int year)
{
switch(month)
{
case 2:if(isleapyear(year))
return(29);
else return(28);
case 4:
case 6:
case 9:
case 11:return(30);
default:return(31);
}
}
//计算某月的第一天是星期几
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=monday;
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i))
weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
weekday=(weekday+monthdays(i,year))%7;
return(weekday);
}
//打印某月第一天以前的空格
void printspace(int weekday)
{
int i;
for(i=0;i<weekday;i++)
printf(" ");
}
//判断是否是闰年
int isleapyear(int year)
{
return((year%4==0&&year%100!=0)||(year%400==0));
}
今晚写了一下日历发现还真的不错,如果要加上农历的话,看来还要花些时间了,指针都还没用上最为可惜了,现在只能趁暑假加紧练习,但是暑假留在学校很烦,很无聊,同感的顶上!!!!

...全文
136 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhuijunbbb 2011-11-09
  • 打赏
  • 举报
回复
package Lesson5;

import java.util.Scanner;

public class PrintCalender {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入年份:");
int year = input.nextInt();
System.out.print("输入月份:");
int month = input.nextInt();

System.out.println(getAllDay(month, year));
PrintMonth(month, year);
}

private static void PrintMonth(int month, int year) {
getMonthTital(month, year);
getMonthBody(month, year);
}

private static void getMonthTital(int month, int year) {
System.out.println(" " + getMonthName(month) + " " + year);
System.out.println("---------------------------");
System.out.println(" Sun" + " " + "Mon" + " " + "Tue" + " " + "Wed"
+ " " + "Thu" + " " + "Fri" + " " + "Sat");
}

private static String getMonthName(int month) {
String MonthName = "";
switch (month) {
case 1:
return "Jan";
case 2:
return "Feb";
case 3:
return "Mar";
case 4:
return "Apr";
case 5:
return "May";
case 6:
return "Jun";
case 7:
return "July";
case 8:
return "Aug";
case 9:
return "Sept";
case 10:
return "Oct";
case 11:
return "Nov";
case 12:
return "Dec";
}
return MonthName;
}

private static void getMonthBody(int month, int year) {
int startDay = getstartDay(month, year);
int monthDay = getMonthDay(month, year);
for (int i = 0; i < startDay; i++) {
System.out.print(" ");
}
for (int i = 1; i <= monthDay; i++) {
System.out.printf("%4d", i);
if ((i + startDay) % 7 == 0) {
System.out.println();
}
}
System.out.println();
}

private static int getstartDay(int month, int year) {
final int Start_Day_For_Jan_1_1800 = 3;
int allDay = getAllDay(month, year);
return (allDay + Start_Day_For_Jan_1_1800) % 7;
}

private static int getAllDay(int month, int year) {
int total = 0;
for (int i = 1800; i < year; i++) {
if (isLeapyear(i)) {
total = total + 366;
} else {
total = total + 365;
}
}
for (int i = 1; i < month; i++) {
total = total + getMonthDay(month, i);
}
return total;
}

private static int getMonthDay(int month, int year) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
|| month == 10 || month == 12) {
return 31;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
}
if (month == 2)
return isLeapyear(year) ? 29 : 28;
return 0;
}

private static boolean isLeapyear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
}
有错误求算不准 求指教
dogfish001 2010-07-24
  • 打赏
  • 举报
回复
呵呵 学习下
yiqiesuifengf 2010-07-24
  • 打赏
  • 举报
回复
农历还真没想到啊,呵呵,19年啊,看来细节的东西还要发现哦,前人栽树后人乘凉而已,今晚重新写一下hanoi发现递归调用真的不错,其实有没有人用指针写出来这个日历啦,借来参考一下
yiqiesuifengf 2010-07-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6
int inputyear(); //输入年份
void prtcalendar(int year); //打印某年的日历
void prtmonthcalendar(int month,int year); //打印某月的日历
char *monthname(int month); //月份名称
int monthdays(int month,int year); //计算某月的天数
int firstdayofmonth(int month,int year); //计算某月的第一天是星期几
void printspace(int weekday); //打印某月第一天以前的空格
int isleapyear(int year);
void main()
{
int year;
year=inputyear();
prtcalendar(year);
}
//输入年份
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
//打印某年的日历
void prtcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prtmonthcalendar(month,year);
printf("\n");
}
}
//打印某月的日历
void prtmonthcalendar(month,year)
{
int weekday,ndays,day;
printf("%s,%d\n",monthname(month),year);
printf("SU MO TU WE TH FR SA\n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
printspace(weekday);
//在星期表上打印日期
for(day=1;day<=ndays;day++)
{
printf("%-8d",day);
if(weekday==saturday)
printf("\n");
weekday=(weekday+1)%7;
}
if(weekday!=sunday)
printf("\n"); //最后一行为星期的开头是不需要换行
}
//返回月份名称
char *monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("illegal month");
}
}
//计算某月的天数
int monthdays(int month,int year)
{
switch(month)
{
case 2:if(isleapyear(year))
return(29);
else return(28);
case 4:
case 6:
case 9:
case 11:return(30);
default:return(31);
}
}
//计算某月的第一天是星期几
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=monday;
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i))
weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
weekday=(weekday+monthdays(i,year))%7;
return(weekday);
}
//打印某月第一天以前的空格
void printspace(int weekday)
{
int i;
for(i=0;i<weekday;i++)
printf(" ");
}
//判断是否是闰年
int isleapyear(int year)
{
return((year%4==0&&year%100!=0)||(year%400==0));
}

yiqiesuifengf 2010-07-22
  • 打赏
  • 举报
回复
thanks~~~~~
[code=C/C++]

#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6
int inputyear(); //输入年份
void prtcalendar(int year); //打印某年的日历
void prtmonthcalendar(int month,int year); //打印某月的日历
char *monthname(int month); //月份名称
int monthdays(int month,int year); //计算某月的天数
int firstdayofmonth(int month,int year); //计算某月的第一天是星期几
void printspace(int weekday); //打印某月第一天以前的空格
int isleapyear(int year);
void main()
{
int year;
year=inputyear();
prtcalendar(year);
}
//输入年份
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
//打印某年的日历
void prtcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prtmonthcalendar(month,year);
printf("\n");
}
}
//打印某月的日历
void prtmonthcalendar(month,year)
{
int weekday,ndays,day;
printf("%s,%d\n",monthname(month),year);
printf("SU MO TU WE TH FR SA\n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
printspace(weekday);
//在星期表上打印日期
for(day=1;day<=ndays;day++)
{
printf("%-8d",day);
if(weekday==saturday)
printf("\n");
weekday=(weekday+1)%7;
}
if(weekday!=sunday)
printf("\n"); //最后一行为星期的开头是不需要换行
}
//返回月份名称
char *monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("illegal month");
}
}
//计算某月的天数
int monthdays(int month,int year)
{
switch(month)
{
case 2:if(isleapyear(year))
return(29);
else return(28);
case 4:
case 6:
case 9:
case 11:return(30);
default:return(31);
}
}
//计算某月的第一天是星期几
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=monday;
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i))
weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
weekday=(weekday+monthdays(i,year))%7;
return(weekday);
}
//打印某月第一天以前的空格
void printspace(int weekday)
{
int i;
for(i=0;i<weekday;i++)
printf(" ");
}
//判断是否是闰年
int isleapyear(int year)
{
return((year%4==0&&year%100!=0)||(year%400==0));
}[/code]试试
nossiac 2010-07-22
  • 打赏
  • 举报
回复
[ code=C/C++ ]把你的代码放在这个位置[ /code ]
yiqiesuifengf 2010-07-22
  • 打赏
  • 举报
回复
为什么粘贴出来的代码都没有格式的??
怎样使用
qq452551918 2010-07-22
  • 打赏
  • 举报
回复
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
这个循环好像没有出口。。能不能解释一下
chaoliu1024 2010-07-22
  • 打赏
  • 举报
回复
暑假应该学习学习的,楼主好样的!
vanchristin 2010-07-22
  • 打赏
  • 举报
回复
暑假还能坚持学习,好学生啊
艾莎云 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 yiqiesuifengf 的回复:]

#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6
int inputyear(); //输入年份
v……
[/Quote]



LZ真强大 农历也都用上了 那农历可还是要算上别的什么啊~如 各年的都不一样 每隔19年重复一次~
selooloo 2010-07-22
  • 打赏
  • 举报
回复
写得不错,就是对齐不太好,修改了下

#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6
int inputyear(); //输入年份
void prtcalendar(int year); //打印某年的日历
void prtmonthcalendar(int month,int year); //打印某月的日历
char *monthname(int month); //月份名称
int monthdays(int month,int year); //计算某月的天数
int firstdayofmonth(int month,int year); //计算某月的第一天是星期几
void printspace(int weekday); //打印某月第一天以前的空格
int isleapyear(int year);
int main()
{
int year;
year=inputyear();
prtcalendar(year);
getchar();
getchar();
return 0;
}
//输入年份
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
//打印某年的日历
void prtcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prtmonthcalendar(month,year);
printf("\n");
}
}
//打印某月的日历
void prtmonthcalendar(int month,int year)
{
int weekday,ndays,day;
printf("%s,%d\n",monthname(month),year);
printf("SU\tMO\tTU\tWE\tTH\tFR\tSA\n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
printspace(weekday);
//在星期表上打印日期
for(day=1;day<=ndays;day++)
{
printf("%d\t",day);
if(weekday==saturday)
printf("\n");
weekday=(weekday+1)%7;
}
if(weekday!=sunday)
printf("\n"); //最后一行为星期的开头是不需要换行
}
//返回月份名称
char *monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("illegal month");
}
}
//计算某月的天数
int monthdays(int month,int year)
{
switch(month)
{
case 2:if(isleapyear(year))
return(29);
else return(28);
case 4:
case 6:
case 9:
case 11:return(30);
default:return(31);
}
}
//计算某月的第一天是星期几
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=monday;
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i))
weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
weekday=(weekday+monthdays(i,year))%7;
return(weekday);
}
//打印某月第一天以前的空格
void printspace(int weekday)
{
int i;
for(i=0;i<weekday;i++)
printf("\t");
}
//判断是否是闰年
int isleapyear(int year)
{
return((year%4==0&&year%100!=0)||(year%400==0));
}
ForestDB 2010-07-22
  • 打赏
  • 举报
回复
友情顶。
canshui 2010-07-22
  • 打赏
  • 举报
回复
呵呵,厉害……

话说,我现在只编的出通讯录!

想lz学习咯……
错_对 2010-07-22
  • 打赏
  • 举报
回复
int inputyear()
{
int year;
while(1)
{
recle: printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
else ///如果输入放入年数在1900以前,,回到重输入状态
printf("the year must be at least 1900\n");
goto recle ;



[Quote=引用 11 楼 qq452551918 的回复:]

int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);
}
printf("the year must be at least 1900\n");
}
这个循环好像没有出口。。能不能解释一下
[/Quote]
dinglan1314 2010-07-22
  • 打赏
  • 举报
回复
呵呵 学习下
紫回蓝 2010-07-22
  • 打赏
  • 举报
回复
这厉害,也不知道我什么时候才能到达这个水平
bobo364 2010-07-22
  • 打赏
  • 举报
回复
这个循环好像没有出口。。能不能解释一下,有出口,他的意思是只要小于1900,就一直循环,大于就return(year)
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
return(year);//这里是出口
}
printf("the year must be at least 1900\n");
}
bobo364 2010-07-22
  • 打赏
  • 举报
回复
好东西,收藏了
#include<stdio.h>
#define sunday 0
#define monday 1
#define tuesday 2
#define wednesday 3
#define thursday 4
#define friday 5
#define saturday 6

int inputyear(); //输入年份
void prtcalendar(int year); //打印某年的日历
void prtmonthcalendar(int month,int year); //打印某月的日历
char *monthname(int month); //月份名称
int monthdays(int month,int year); //计算某月的天数
int firstdayofmonth(int month,int year); //计算某月的第一天是星期几
void printspace(int weekday); //打印某月第一天以前的空格
int isleapyear(int year);


int main()
{
int year;
year=inputyear();
prtcalendar(year);
system("pause");
return 0;
}


//输入年份
int inputyear()
{
int year;
while(1)
{
printf("which year?");
scanf("%d",&year);
if(year>=1900)
{
return(year);
}
}
printf("the year must be at least 1900\n");
}

//打印某年的日历
void prtcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prtmonthcalendar(month,year);
printf("\n");
}
}

//打印某月的日历
void prtmonthcalendar(month,year)
{
int weekday,ndays,day;
printf("%s,%d\n",monthname(month),year);
printf("SU MO TU WE TH FR SA\n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
printspace(weekday);
//在星期表上打印日期
for(day=1;day<=ndays;day++)
{
printf("%-8d",day);
if(weekday==saturday)
{
printf("\n");
}
weekday=(weekday+1)%7;
}
if(weekday!=sunday)
{
printf("\n"); //最后一行为星期的开头是不需要换行
}
}

//返回月份名称
char *monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("illegal month");
}
}

//计算某月的天数
int monthdays(int month,int year)
{
switch(month)
{
case 2:if(isleapyear(year))
{
return(29);
}
else
{
return(28);
}
case 4:
case 6:
case 9:
case 11:return(30);
default:return(31);
}
}

//计算某月的第一天是星期几
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=monday;
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i))
{
weekday=(weekday+1)%7;
}
}
for(i=1;i<month;i++)
{
weekday=(weekday+monthdays(i,year))%7;
}
return(weekday);
}

//打印某月第一天以前的空格
void printspace(int weekday)
{
int i;
for(i=0;i<weekday;i++)
{
printf(" ");
}
}

//判断是否是闰年
int isleapyear(int year)
{
return((year%4==0&&year%100!=0)||(year%400==0));
}
nossiac 2010-07-21
  • 打赏
  • 举报
回复
暑假还能坚持学习的人不多了.
想起了我的大学,唉,真可惜.
加载更多回复(2)

70,033

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧