| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1288 人关注过本帖
标题:求高手看下这个程序!
只看楼主 加入收藏
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
结帖率:88.24%
收藏
已结贴  问题点数:20 回复次数:31 
求高手看下这个程序!
万年历:
程序代码:
#include <stdio.h>

void PrintMonth(int year, int month)//定义函数(有两个参数)
{
int preDays, preMonth, preYears, monthDays, i;//声明。。
           前一月份,前一年份,一个月的天数
    char Leap;//声明变量  闰年
    
    preYears = year - 1;//计算前一年份
    preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
    Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
    preMonth = month - 1;//前一月份
    switch(preMonth)
    {//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
        case 1: preDays += 31; break;
        case 2: preDays += 59; break;
        case 3: preDays += 90; break;
        case 4: preDays += 120; break;
        case 5: preDays += 151; break;
        case 6: preDays += 181; break;
        case 7: preDays += 212; break;
        case 8: preDays += 243; break;
        case 9: preDays += 273; break;
        case 10: preDays += 304; break;
        case 11: preDays += 334; break;
    }
    if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
    switch(month)
    {//根据输入的月份给出这个月的天数(平年)
        case 1: monthDays = 31; break;
        case 2: monthDays = 28; break;
        case 3: monthDays = 31; break;
        case 4: monthDays = 30; break;
        case 5: monthDays = 31; break;
        case 6: monthDays = 30; break;
        case 7: monthDays = 31; break;
        case 8: monthDays = 31; break;
        case 9: monthDays = 30; break;
        case 10: monthDays = 31; break;
        case 11: monthDays = 30; break;
        case 12: monthDays = 31; break;
    }
    if(month == 2 && Leap) monthDays++;//闰年2月29天
    switch(month)
    {//输出月份
        case 1: printf("1月"); break;
        case 2: printf("2月"); break;
        case 3: printf("3月"); break;
        case 4: printf("4月"); break;
        case 5: printf("5月"); break;
        case 6: printf("6月"); break;
        case 7: printf("7月"); break;
        case 8: printf("8月"); break;
        case 9: printf("9月"); break;
        case 10: printf("10月"); break;
        case 11: printf("11月"); break;
        case 12: printf("12月"); break;
    }
    printf(" %d", year);//输出年份
    if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
    printf("\n日 一 二 三 四 五 六\n");
    preDays %= 7;//开始是星期几
    if(preDays < 6) for(i = 0; i <= preDays; i++) printf("   ");//在之前的空着的星期下打空格
    
for(i = 1; i <= monthDays; i++)
    {
        printf("%2d  ", i);
        if((i + preDays) % 7 ==6) printf("\n");//一行满7个数就换行
    }
    printf("\n");
}

int main()//主函数
{
    int year, month;//声明年和月
    for(;;)        //死循环,查完一个年份后,还可继续查
    {
        scanf("%d %d", &year, &month);  //输入年份和月份
        if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
        PrintMonth(year, month);//调用函数PrintMonth()
    }
    return 0;
}
                            为什么当换行的时候是除以6而不是除以7啊!有点郁闷!还有一点小瑕疵!见图,为什么第一行不是对齐的啊?                                                                                           以后再查询就是很规整的那样的啊?什么情况啊?
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 唏嘘草 于 2011-6-5 21:43 编辑 ]
搜索更多相关主题的帖子: color 
2011-06-05 21:42
变幻小子
Rank: 6Rank: 6
来 自:广东陆丰
等 级:侠之大者
帖 子:188
专家分:473
注 册:2011-3-4
收藏
得分:0 
学习

明天的梦
2011-06-06 00:56
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:0 
程序代码:
#include <stdio.h>

 
void PrintMonth(int year, int month)//定义函数(有两个参数)
 {

 int preDays, preMonth, preYears, monthDays, i;//声明。。
           // 前一月份,前一年份,一个月的天数
     char Leap;//声明变量  闰年
     int j=0;
    preYears = year - 1;//计算前一年份
     preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
     Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
     preMonth = month - 1;//前一月份
     switch(preMonth)
     {//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
         case 1: preDays += 31; break;
         case 2: preDays += 59; break;
         case 3: preDays += 90; break;
         case 4: preDays += 120; break;
         case 5: preDays += 151; break;
         case 6: preDays += 181; break;
         case 7: preDays += 212; break;
         case 8: preDays += 243; break;
         case 9: preDays += 273; break;
         case 10: preDays += 304; break;
         case 11: preDays += 334; break;
     }
     if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
     switch(month)
     {//根据输入的月份给出这个月的天数(平年)
         case 1: monthDays = 31; break;
         case 2: monthDays = 28; break;
         case 3: monthDays = 31; break;
         case 4: monthDays = 30; break;
         case 5: monthDays = 31; break;
         case 6: monthDays = 30; break;
         case 7: monthDays = 31; break;
         case 8: monthDays = 31; break;
         case 9: monthDays = 30; break;
         case 10: monthDays = 31; break;
         case 11: monthDays = 30; break;
         case 12: monthDays = 31; break;
     }
     if(month == 2 && Leap) monthDays++;//闰年2月29天
     switch(month)
     {//输出月份
         case 1: printf("1月"); break;
         case 2: printf("2月"); break;
         case 3: printf("3月"); break;
         case 4: printf("4月"); break;
         case 5: printf("5月"); break;
         case 6: printf("6月"); break;
         case 7: printf("7月"); break;
         case 8: printf("8月"); break;
         case 9: printf("9月"); break;
         case 10: printf("10月"); break;
         case 11: printf("11月"); break;
         case 12: printf("12月"); break;
     }
     printf(" %d", year);//输出年份
     if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
     printf("\n  日  一  二  三  四  五  六\n");
     preDays %= 7;//开始是星期几
     if(preDays < 6) 
         for(i = 0; i <preDays; i++)printf("    ");//在之前的空着的星期下打空格(条件不是<=而是<)
    for(i = 1; i <= monthDays; i++)
     {
        if((i + preDays-1) % 7 ==0) printf("\n");//一行满7个数就换行(i+preDays-1)!!!
         printf("%4d", i);
         
     }
     printf("\n");

 }

 
int main()//主函数
 {
     int year, month;//声明年和月
     for(;;)        //死循环,查完一个年份后,还可继续查
     {
         scanf("%d %d", &year, &month);  //输入年份和月份
         if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
         PrintMonth(year, month);//调用函数PrintMonth()
     }
     return 0;
}


修改完成,可以了。
2011-06-06 09:37
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:0 
程序代码:
#include <stdio.h>

 
void PrintMonth(int year, int month)//定义函数(有两个参数)
 {

 int preDays, preMonth, preYears, monthDays, i;//声明。。
           // 前一月份,前一年份,一个月的天数
     char Leap;//声明变量  闰年
     int j=0;
    preYears = year - 1;//计算前一年份
     preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
     Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
     preMonth = month - 1;//前一月份
     switch(preMonth)
     {//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
         case 1: preDays += 31; break;
         case 2: preDays += 59; break;
         case 3: preDays += 90; break;
         case 4: preDays += 120; break;
         case 5: preDays += 151; break;
         case 6: preDays += 181; break;
         case 7: preDays += 212; break;
         case 8: preDays += 243; break;
         case 9: preDays += 273; break;
         case 10: preDays += 304; break;
         case 11: preDays += 334; break;
     }
     if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
     switch(month)
     {//根据输入的月份给出这个月的天数(平年)
         case 1: monthDays = 31; break;
         case 2: monthDays = 28; break;
         case 3: monthDays = 31; break;
         case 4: monthDays = 30; break;
         case 5: monthDays = 31; break;
         case 6: monthDays = 30; break;
         case 7: monthDays = 31; break;
         case 8: monthDays = 31; break;
         case 9: monthDays = 30; break;
         case 10: monthDays = 31; break;
         case 11: monthDays = 30; break;
         case 12: monthDays = 31; break;
     }
     if(month == 2 && Leap) monthDays++;//闰年2月29天
     switch(month)
     {//输出月份
         case 1: printf("1月"); break;
         case 2: printf("2月"); break;
         case 3: printf("3月"); break;
         case 4: printf("4月"); break;
         case 5: printf("5月"); break;
         case 6: printf("6月"); break;
         case 7: printf("7月"); break;
         case 8: printf("8月"); break;
         case 9: printf("9月"); break;
         case 10: printf("10月"); break;
         case 11: printf("11月"); break;
         case 12: printf("12月"); break;
     }
     printf(" %d", year);//输出年份
     if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
     printf("\n  日  一  二  三  四  五  六\n");
     preDays %= 7;//开始是星期几
     if(preDays < 6) 
         for(i = 0; i <preDays; i++)printf("    ");//在之前的空着的星期下打空格(条件不是<=而是<)
    for(i = 1; i <= monthDays; i++)
     {
        if((i + preDays-1) % 7 ==0) printf("\n");//一行满7个数就换行(i+preDays-1)!!!
         printf("%4d", i);
         
     }
     printf("\n");

 }

 
int main()//主函数
 {
     int year, month;//声明年和月
     for(;;)        //死循环,查完一个年份后,还可继续查
     {
         scanf("%d %d", &year, &month);  //输入年份和月份
         if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
         PrintMonth(year, month);//调用函数PrintMonth()
     }
     return 0;
}


修改完成,可以了。
2011-06-06 09:37
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:0 
程序代码:
#include <stdio.h>

 
void PrintMonth(int year, int month)//定义函数(有两个参数)
 {

 int preDays, preMonth, preYears, monthDays, i;//声明。。
           // 前一月份,前一年份,一个月的天数
     char Leap;//声明变量  闰年
     int j=0;
    preYears = year - 1;//计算前一年份
     preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
     Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
     preMonth = month - 1;//前一月份
     switch(preMonth)
     {//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
         case 1: preDays += 31; break;
         case 2: preDays += 59; break;
         case 3: preDays += 90; break;
         case 4: preDays += 120; break;
         case 5: preDays += 151; break;
         case 6: preDays += 181; break;
         case 7: preDays += 212; break;
         case 8: preDays += 243; break;
         case 9: preDays += 273; break;
         case 10: preDays += 304; break;
         case 11: preDays += 334; break;
     }
     if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
     switch(month)
     {//根据输入的月份给出这个月的天数(平年)
         case 1: monthDays = 31; break;
         case 2: monthDays = 28; break;
         case 3: monthDays = 31; break;
         case 4: monthDays = 30; break;
         case 5: monthDays = 31; break;
         case 6: monthDays = 30; break;
         case 7: monthDays = 31; break;
         case 8: monthDays = 31; break;
         case 9: monthDays = 30; break;
         case 10: monthDays = 31; break;
         case 11: monthDays = 30; break;
         case 12: monthDays = 31; break;
     }
     if(month == 2 && Leap) monthDays++;//闰年2月29天
     switch(month)
     {//输出月份
         case 1: printf("1月"); break;
         case 2: printf("2月"); break;
         case 3: printf("3月"); break;
         case 4: printf("4月"); break;
         case 5: printf("5月"); break;
         case 6: printf("6月"); break;
         case 7: printf("7月"); break;
         case 8: printf("8月"); break;
         case 9: printf("9月"); break;
         case 10: printf("10月"); break;
         case 11: printf("11月"); break;
         case 12: printf("12月"); break;
     }
     printf(" %d", year);//输出年份
     if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
     printf("\n  日  一  二  三  四  五  六\n");
     preDays %= 7;//开始是星期几
     
         for(i = 0; i <preDays+1; i++)printf("    ");//在之前的空着的星期下打空格
    for(i = 1; i <= monthDays; i++)
     {
        if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
         printf("%4d", i);
         
     }
     printf("\n");

 }

 
int main()//主函数
 {
     int year, month;//声明年和月
     for(;;)        //死循环,查完一个年份后,还可继续查
     {
         scanf("%d %d", &year, &month);  //输入年份和月份
         if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
         PrintMonth(year, month);//调用函数PrintMonth()
     }
     return 0;
}


上面改那个发现与电脑上的日历对不上, 从新改过了。
2011-06-06 09:45
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:0 
程序代码:
#include <stdio.h>

 
void PrintMonth(int year, int month)//定义函数(有两个参数)
 {

 int preDays, preMonth, preYears, monthDays, i;//声明。。
           // 前一月份,前一年份,一个月的天数
     char Leap;//声明变量  闰年
     int j=0;
    preYears = year - 1;//计算前一年份
     preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;//从公元元年到之前一年结束时的总天数
     Leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 0;//判断是否是闰年,是Leap=1否Leap=0
     preMonth = month - 1;//前一月份
     switch(preMonth)
     {//这部分是计算从公元元年到今年这个月的前一个月末总的天数(平年)
         case 1: preDays += 31; break;
         case 2: preDays += 59; break;
         case 3: preDays += 90; break;
         case 4: preDays += 120; break;
         case 5: preDays += 151; break;
         case 6: preDays += 181; break;
         case 7: preDays += 212; break;
         case 8: preDays += 243; break;
         case 9: preDays += 273; break;
         case 10: preDays += 304; break;
         case 11: preDays += 334; break;
     }
     if(preMonth >= 2 && Leap) preDays++;//由于上面是以平年算的一般情况,而此处月份(year)为3月份以上又为闰年所以2月有29天少加了一天
     switch(month)
     {//根据输入的月份给出这个月的天数(平年)
         case 1: monthDays = 31; break;
         case 2: monthDays = 28; break;
         case 3: monthDays = 31; break;
         case 4: monthDays = 30; break;
         case 5: monthDays = 31; break;
         case 6: monthDays = 30; break;
         case 7: monthDays = 31; break;
         case 8: monthDays = 31; break;
         case 9: monthDays = 30; break;
         case 10: monthDays = 31; break;
         case 11: monthDays = 30; break;
         case 12: monthDays = 31; break;
     }
     if(month == 2 && Leap) monthDays++;//闰年2月29天
     switch(month)
     {//输出月份
         case 1: printf("1月"); break;
         case 2: printf("2月"); break;
         case 3: printf("3月"); break;
         case 4: printf("4月"); break;
         case 5: printf("5月"); break;
         case 6: printf("6月"); break;
         case 7: printf("7月"); break;
         case 8: printf("8月"); break;
         case 9: printf("9月"); break;
         case 10: printf("10月"); break;
         case 11: printf("11月"); break;
         case 12: printf("12月"); break;
     }
     printf(" %d", year);//输出年份
     if(Leap) printf(" 闰年");//输出闰年,平年为一般情况
     printf("\n  日  一  二  三  四  五  六\n");
     preDays %= 7;//开始是星期几
     
         for(i = 0; i <preDays+1; i++)printf("    ");//在之前的空着的星期下打空格
    for(i = 1; i <= monthDays; i++)
     {
        if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
         printf("%4d", i);
         
     }
     printf("\n");

 }

 
int main()//主函数
 {
     int year, month;//声明年和月
     for(;;)        //死循环,查完一个年份后,还可继续查
     {
         scanf("%d %d", &year, &month);  //输入年份和月份
         if(year <= 0 || month <= 0) break;//判断输入的年份和月份是否符合要求
         PrintMonth(year, month);//调用函数PrintMonth()
     }
     return 0;
}


上面改那个发现与电脑上的日历对不上, 从新改过了。
2011-06-06 09:45
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 6楼 bccn_2012
你有没有测试过啊!错的一踏糊涂
2011-06-06 11:26
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:20 
回复 7楼 唏嘘草
图片附件: 游客没有浏览图片的权限,请 登录注册

错在哪里?
2011-06-06 11:32
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 8楼 bccn_2012
没错就是空格的问题
,我经过不断的修正与摸索,终于把这个给解决了!貌似开始小完美了!
2011-06-06 16:41
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 9楼 唏嘘草
原来是空格的问题?
为什么不用 printf("%4d"); 这样的?
2011-06-06 16:46
快速回复:求高手看下这个程序!
数据加载中...
 
   



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

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