| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1288 人关注过本帖
标题:求高手看下这个程序!
只看楼主 加入收藏
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 10楼 voidx
我现在真不知到是不是空个的问题了!把这个对齐了,别的又错位了!我在加空格,。。。最后还是不能对齐。怎么回事啊
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-06-06 17:18
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
呵呵,你试试我跟你说的那个方法嘛,比如 printf("  %d", i); 改用 printf("%4d", i); 这样的
2011-06-06 17:20
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 12楼 voidx
我%2d %3d %4d 全试过了没用,你看图6,7,8三个月的,6月的第一行没对齐,七月没对齐了,8对齐了,可是不是对应的(往前移了)
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 唏嘘草 于 2011-6-6 18:43 编辑 ]
2011-06-06 18:42
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这个是你第一行打印的空格数不对啊~
打印空格的时候用 printf("%4s", " "); 这样的,一天一个空格,肯定没问题
2011-06-06 18:46
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 14楼 voidx
学习了!
2011-06-07 07:57
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 14楼 voidx
大哥啊,不行啊
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-06-07 08:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,纠结在这里了?注释的不错,不过对第一个switch的理解有偏差。
唉,我的英文星期缩写不好么?非要换成汉字?给你一份我改的,对比一下
程序代码:
#include <stdio.h>

void PrintMonth(int year, int month)
{
    int preDays, preMonth, preYears, monthDays, i;
    char isLeap;
    
    preYears = year - 1;
    preDays = preYears * 365 + preYears / 4 - preYears / 100 + preYears / 400;
    isLeap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) ? 1 : 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 && isLeap) preDays++;
    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 && isLeap) monthDays++;
    switch(month)
    {
        case 1: printf("January"); break;
        case 2: printf("February"); break;
        case 3: printf("March"); break;
        case 4: printf("April"); break;
        case 5: printf("May"); break;
        case 6: printf("June"); break;
        case 7: printf("July"); break;
        case 8: printf("August"); break;
        case 9: printf("September"); break;
        case 10: printf("October"); break;
        case 11: printf("November"); break;
        case 12: printf("December"); break;
    }
    printf(" %d", year);
    if(isLeap) printf(" leap year");
    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");
    }
    printf("\n");
}

int main()
{
    int year, month;
    for(;;)
    {
        scanf("%d %d", &year, &month);
        if(year <= 0 || month <= 0) break;
        PrintMonth(year, month);
    }
    return 0;
}

重剑无锋,大巧不工
2011-06-07 08:32
唏嘘草
Rank: 2
等 级:论坛游民
帖 子:128
专家分:93
注 册:2011-6-4
收藏
得分:0 
回复 17楼 beyondyf
说实话有点晕啊,半角拳脚的不是太清除,关键这个是什么样的组合啊,你能形象的表示一下吗?有劳,顺便解释一下啊占几个宽度的问题
2011-06-07 08:47
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,简单地说,在控制台下设一个正常的英文字母的宽度为1,那么汉字的宽度为2,你的星期标头用1个汉字表示并加1个空格,这样每个间隔的宽度是3。
if(preDays < 6) for(i = 0; i <= preDays; i++) printf("   ");/*这里的空格是几个?为什么?*/
所以这一句的占位空格数为3。
理解为什么前面有一个if判断么?防止当本月第一天是星期日时日历的第一行输出空行。
printf("%2d ", i);/*别忘了这里的空格,为什么?*/
因为每个间隔的宽度是3,所以这里的输出是2D加一个空格。这是个人申美的问题。你也可以试试
printf("%-3d", i);

负号表示左对齐。

重剑无锋,大巧不工
2011-06-07 09:07
jinzhu0505
Rank: 2
等 级:论坛游民
帖 子:24
专家分:35
注 册:2010-10-16
收藏
得分:0 
有两行没看懂,改成自己熟悉的代码
if((preDays>=0)&&(preDays < 7)) for(i = 1; i <= preDays; i++) printf("    ");//在之前的空着的星期下打4个空格--------解决对齐问题;
if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
代码如下:
#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>=0)&&(preDays < 7)) for(i = 1; i <= preDays; i++) printf("    ");//在之前的空着的星期下打4个空格
    //if(preDays < 6) for(i = 0; i <= preDays; i++) printf("   ");//在之前的空着的星期下打空格
for(i = 1; i <= monthDays; i++)
    {
        printf("%2d  ", i);
        if((i + preDays) % 7 ==0) printf("\n");//一行满7个数就换行
        //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;
}

2011-06-07 10:53
快速回复:求高手看下这个程序!
数据加载中...
 
   



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

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