| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1266 人关注过本帖
标题:万年历输出日期怎么不对齐?
只看楼主 加入收藏
来不及学坏
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-5-28
结帖率:0
收藏
 问题点数:0 回复次数:5 
万年历输出日期怎么不对齐?
#include<stdio.h> /*文件包含预处理命令,printf( )函数在其中声明*/
#include<stdlib.h> /*文件包含预处理命令,scanf( )函数在其中声明*/

char* month_str[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
char* week[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};


int IsLeapYear(int year) /*函数声明语句,查询某年是平年还是闰年*/
{
if((year%4==0&&year%100!=0)||(year%400==0))
return 1;
else
return 0; /*返回值0,返回操作系统*/

}
inline int month_day(int year,int month) /*函数声明语句*/
{
int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(IsLeapYear(year)&&month==2)
return 29;
else
return(mon_day[month-1]); /*函数返回语句,函数返回到主调函数并将mon_day[month-1]的值一并返回*/

}
int DaySearch(int year,int month,int day) /*函数声明语句,查询某年某月某日是星期几*/
{
int c=0; /*变量定义语句*/
float s; /*变量定义语句*/
int m; /*变量定义语句*/
for(m=1;m<month;m++) /*当m值小于month值时,每次循环m的值自加1*/
c=c+month_day(year,m);
c=c+day;
s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-40+c;
return ((int)s%7);
}

int PrintAllYear(int year)/*函数声明语句,打印全年日历*/
{
int temp; /*变量定义语句*/
int i,j; /*变量定义语句*/
printf("\n\n%d Calander\n",year); /*调用在stdio.h中声明的库函数printf( )*/
for(i=1;i<=12;i++) /*当i值小于等于12时,每次循环i的值自加1*/
{
printf("\n\n%s(%d)\n",month_str[i-1],i); /*调用在stdio.h中声明的库函数printf( )*/

printf("日 一 二 三 四 五 六 \n\n"); /*调用在stdio.h中声明的库函数printf( )*/
temp=DaySearch(year,i,1);
for(j=1;j<=month_day(year,i)+temp;j++) /*当j值小于等于month值时,每次循环j的值自加1*/
{
if(j-temp<=0)
printf(" "); /*调用在stdio.h中声明的库函数printf( )*/
else if(j-temp<10)
printf("%d ",j-temp); /*调用在stdio.h中声明的库函数printf( )*/
else
printf("%d ",j-temp); /*调用在stdio.h中声明的库函数printf( )*/

if(j%7==0)
printf("\n"); /*调用在stdio.h中声明的库函数printf( )*/
}
}
return 0; /*返回值0,返回操作系统*/
}

int main(void) /*主函数main(void)*/
{
int option,da; /*变量定义语句*/
char ch; /*变量定义语句*/
int year,month,day; /*变量定义语句*/

printf("\n\n欢迎使用万年历查询系统!\n");/*调用在stdio.h中声明的库函数printf( )*/

while(1) /*无限循环,遇到break跳出循环*/
{
printf("\n请选择您所需要的服务:\n"); /*调用在stdio.h中声明的库函数printf( )*/
printf("\n1 查询某年某月某日是星期几"); /*调用在stdio.h中声明的库函数printf( )*/
printf("\n2 查询某年是平年或闰年"); /*调用在stdio.h中声明的库函数printf( )*/
printf("\n3 打印全年日历"); /*调用在stdio.h中声明的库函数printf( )*/
printf("\n4 退出\n"); /*调用在stdio.h中声明的库函数printf( )*/
scanf("%d",&option);


switch(option)
{
case 1:
while(1)
{
printf("\n请输入年月日(XXXX,XX,XX):"); /*调用在stdio.h中声明的库函数printf( )*/
scanf("%d,%d,%d,%c",&year,&month,&day);
da=DaySearch(year,month,day);
printf("\n%d-%d-%d 是 %s,您希望继续查询吗?(Y/N)",year,month,day,week[da]); /*调用在stdio.h中声明的库函数printf( )*/
fflush(stdin);
scanf("%c",&ch);
if(ch=='N'||ch=='n')
break;
}
break;
case 2:
while(1)
{
printf("\n请输入您希望查询的年份?(XXXX)"); /*调用在stdio.h中声明的库函数printf( )*/
scanf("%d",&year);
if(IsLeapYear(year))
printf("\n%d 是闰年,您希望继续查询吗?(Y/N)",year); /*调用在stdio.h中声明的库函数printf( )*/
else
printf("\n%d 是平年,您希望继续查询吗(Y/N)?",year); /*调用在stdio.h中声明的库函数printf( )*/
fflush(stdin);
scanf("%c",&ch);
if(ch=='N'||ch=='n')
break;
}
break;
case 3:
while(1)
{
printf("\n请输入您希望打印的年份(XXXX)"); /*调用在stdio.h中声明的库函数printf( )*/
scanf("%d",&year);
PrintAllYear(year);
printf("\n您希望继续打印吗Y/N)?"); /*调用在stdio.h中声明的库函数printf( )*/
fflush(stdin);
scanf("%c",&ch);
if(ch=='N'||ch=='n')
break;
}
break;
case 4:
fflush(stdin);
printf("您确认退出吗?(Y/N)"); /*调用在stdio.h中声明的库函数printf( )*/
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0);
break;
default:
printf("\nError:对不起,现在没有这项查询功能!\n"); /*调用在stdio.h中声明的库函数printf( )*/
break;
}

}

return 0; /*返回值0,返回操作系统*/
}
搜索更多相关主题的帖子: 万年历 输出 
2010-07-19 17:17
zisefengye
Rank: 5Rank: 5
等 级:职业侠客
帖 子:167
专家分:386
注 册:2010-6-27
收藏
得分:0 
这个问题有人回答过了,可以翻阅以前的帖子。
2010-07-19 17:19
来不及学坏
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-5-28
收藏
得分:0 
回复 2楼 zisefengye
找不到啊,您能不能帮忙指出一下错误啊,万分感谢!!!!!!
2010-07-19 17:28
zisefengye
Rank: 5Rank: 5
等 级:职业侠客
帖 子:167
专家分:386
注 册:2010-6-27
收藏
得分:0 
简单来说,就是你输出的时候,没有考虑该空多少。你可以在论坛里搜索一下万年历,还有很多方法其实可以更简单,我曾写为此写过几个实用的小方法,你也可以去看看。
2010-07-19 17:55
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
好啦,在论坛帮你找到了:
为万年历写的几个有用的小方法,供大家参考讨论
int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int first_day = 0;
int add_value = 0;
char *week[7] = {"周日", "周一","周二","周三","周四","周五","周六"};

//计算输入年份是否为闰年
bool isLeap(int year)
{
    return ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0));
}

//计算输入年份第一天是星期几
void Init(int year)
{
    add_value = isLeap(year);
    day[1] = 28 + add_value;//如果输入年为闰年,2月份的天数为29
    first_day = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;//计算出输入年第一天为周几
}

//计算到输入年份的当前月的距离
int get_distance(int month)
{
    //初始化一个数组,保存每个月的距离,同时考虑了闰年和平年的不同情形
    int distance[12] = {0, 31, 59 + add_value, 90 + add_value, 120 + add_value,
                        151 + add_value, 181 + add_value, 212 + add_value,
                        243 + add_value, 273 + add_value, 304 + add_value, 334 + add_value};
    return distance[month - 1];
}

//计算输入的日期是星期几
int get_current_day(int year, int month, int date)
{
    //注释掉的方法已被get_distance(int month)替代
    /*int total = 0;
    for(int i = 0 && month > 1; i <= month - 2; i++)
    {
        total += day[i];
    }*/

    int currenet_day = 0;
    Init(year);
    int total = get_distance(month);
    currenet_day = ( first_day + total + date - 1) % 7;
    return currenet_day;
}

//将获取的current_day转换成字符串形式
char* convert_to_string(int current_day)
{
    return week[current_day];
}

int count_leap(int year)
{
    //具体的算法是计算出能被4整除的数个数与能被400整除的数个数之和(就是闰年的个数),再减去能被100整除的数个数(就是同时能被4和400整除的数个数)
    //这样就能获得截止到输入年的闰年的个数
    return year / 4 + year / 400 - year / 100;
    //注释掉的方法已被return year / 4 + year / 400 - year / 100; 替代
    /*int total = 0;
    for(int i = 1; i <= year; i++)
    {
        if(isLeap(i))
            total++;
    }
    return total;*/
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-19 18:04
快速回复:万年历输出日期怎么不对齐?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021738 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved