| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 785 人关注过本帖
标题:万年历 字符不对齐问题
只看楼主 加入收藏
黑之牙
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-7-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
万年历 字符不对齐问题
#include<stdio.h>
int main()
{

    int firstday(int year);

    int sw,leap,i,j,k,wd,day;  
   
    int date[12][6][7];         //定义一个三维数组 分别对应 月、周、日
    char title[] = "SUN MON TUE WED THU FRI SAT";
    int day_tab[][12] = {
                        {31,28,31,30,31,30,31,31,30,31,30,31},
                        {31,29,31,30,31,30,31,31,30,31,30,31}
                        };        //平年和闰年的月份天数
    int year;


    printf("please input the year:");
    scanf("%d",&year);         

    sw = firstday(year);        //计算这一年的第一天是星期几
    leap = (year%4 ==0 && year%100 != 0) || year%400 ==0;
    for( i=0; i<12; i++ )
        for( j=0; j<6; j++)
            for( k=0; k<7; k++)
                date[i][j][k] = 0;   //将所有的日期都归零
    for( i=0; i<12; i++)
        for( wd=0,day=1; day<=day_tab[leap][i]; day++)
        {
            date[i][wd][sw] = day;
            sw = ++sw%7;
            if(sw == 0)
                wd++;
        }

printf("\n==================The Calendar of Year %d=======================\n ",year);
for( i=0; i<6; i++)
{
    for(wd=0,k=0;k<7;k++)                   //将同一行的天数相加
        wd = wd + date[i][5][k] + date[i+6][5][k];
    wd=wd>0? 6:5;
    printf("%2d  %s  %2d  %s   \n",i+1,title,i+7,title);

    for(j=0;j<wd;j++)
    {
        printf("   ");
        for( k=0; k<7; k++)
            if(date[i][j][k])
                printf("%4d",date[i][j][k]);
            else printf("   ");
            printf("      ");
        for( k=0; k<7; k++)
            if(date[i+6][j][k])
                printf("%4d",date[i+6][j][k]);
            else printf("   ");
            printf(" \n");
    }
}

    puts("==================================================================");
    return 0;
}


/*计算该年份第一天是星期几*/
int firstday(int year)
{
    int leap(int ye);

    int i;
    long int n;

   
    n = year*365;

    for(i = 1; i < year; i++)
        if(leap(i))
            n += 1;   
    return (n%7);
}

int leap(int ye)
{
    if( (ye%4 ==0 && ye%100 != 0) || ye%400 ==0 )
        return 1;
    else
    return 0;
}


程序结果字符总是不对齐  哪边出错了呢
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 万年历 字符 
2010-07-15 16:19
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:10 
我写了一个,你试试看:
#include <stdlib.h>
#include <stdio.h>
int main()
{
 
  system("color c");
  
  int c, year, month, day, i, j, k ,diyitian;
 
  char ch;
  printf("sunyh1999 \n\n");
  printf("请输入今年的年份:");
  
  scanf("%d", &year);
  
  diyitian = ( year + ( year - 1 ) / 4 - ( year - 1) / 100 + ( year - 1 ) / 400 ) % 7;
  
  if (diyitian == 0)
   
 diyitian = 7;
  
  printf("  周一  周二  周三  周四  周五  周六  周七\n");
  
  if (year % 4 == 0)
   
 c = 29;
 
  else if (0 != year % 4)
  
    c = 28;
   
  for (month = 1; month <= 12; month++)
  {
    if (month == 1)
    {
      printf("                 ( %d月份)       \n", month);
      for (i = 1; i < diyitian; i++)
        printf("      ");
      for (day = 1; day <= 31; day++)
      {
        printf("%6d", day);
        if (i % 7 == 0)
        {
          printf("\n");
          k = i % 7 ;
          for (j = 1; j <= k; j++)
            printf("             ");
        }
        i++;
      }
      printf("\n");
    }
   
    else if (month == 2)
    {
      printf("                 ( %d月份)\n", month);
      k = i % 7 - 1;
      if (k ==  -1)
      {
        for (int i = 1; i <= 6; i++)
          printf("      ");
      }
      else
        for (j = 1; j <= k; j++)
          printf("      ");
      for (day = 1; day <= c; day++)
      {
        printf("%6d", day);
        if (i % 7 == 0)
        {
          printf("\n");
          k = i % 7;
          for (j = 1; j <= k; j++)
            printf("      ");
        }
        i++;
      }
      printf("\n");
    }
   
    else if (month == 3 || month == 5 || month == 7 || month == 8 || month ==10 || month == 12)
    {
      printf("                 ( %d月份)\n", month);
      k = i % 7 - 1;
      if (k ==  -1)
      {
        for (int i = 1; i <= 6; i++)
          printf("      ");
      }
      else
        for (j = 1; j <= k; j++)
          printf("      ");
      for (day = 1; day <= 31; day++)
      {
        printf("%6d", day);
        if (0 == i % 7 )
        {
          printf("\n");
          k = i % 7;
          for (j = 1; j <= k; j++)
            printf("      ");
        }
        i++;
      }
      printf("\n");
    }
    else if (month == 4 || month == 6 || month == 9 || month == 11)
    {
      printf("                 ( %d月份)\n", month);
      k = i % 7 - 1;
      if (k ==  -1)
      {
        for (int i = 1; i <= 6; i++)
          printf("      ");
      }
      else
        for (j = 1; j <= k; j++)
          printf("      ");
      for (day = 1; day <= 30; day++)
      {
        printf("%6d", day);
        if (i % 7 == 0)
        {
          printf("\n");
          k = i % 7;
          for (j = 1; j <= k; j++)
            printf("      ");
        }
        i++;
      }
      printf("\n");
    }
  }
  
  system("pause");
}

 

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-15 16:59
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
用户输入年份,打印年历

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-15 17:00
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1698
专家分:4310
注 册:2007-12-27
收藏
得分:10 
回复 楼主 黑之牙
其实很简单,
    for(j=0;j<wd;j++)
    {
        printf("   ");
        for( k=0; k<7; k++)
            if(date[i][j][k])
                printf("%4d",date[i][j][k]);
            else printf("   ");
            printf("      ");
        for( k=0; k<7; k++)
            if(date[i+6][j][k])
                printf("%4d",date[i+6][j][k]);
            else printf("   ");
            printf(" \n");
    }
这段代码,有日期的时候%4d输出日期占4格,没有日期的地方你却只输出3个空格,当然对不齐了。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-07-15 17:13
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
嗯,版主说的对,没有日期的地方你却只输出3个空格,当然对不齐了。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-15 17:15
黑之牙
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-7-17
收藏
得分:0 
回复 4楼 forever74
这下对了,真厉害!
2010-07-15 19:23
黑之牙
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-7-17
收藏
得分:0 
回复 2楼 sunyh1999
不错,复制回去研究下
2010-07-15 19:27
zisefengye
Rank: 5Rank: 5
等 级:职业侠客
帖 子:167
专家分:386
注 册:2010-6-27
收藏
得分:0 
有几个地方修改一些可能会更好
bool isLeap(int year)
{
    return (year % 400 == 0) || year % 4 == 0 && year % 100 != 0); //如果是闰年返回1,否则返回0
}
int day[]= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
day[1] += isLeap(year);//直接加上返回值就可获取2月的实际天数
这样可以减少很多判断语句。
2010-07-16 21:55
jmchang
Rank: 2
等 级:论坛游民
帖 子:16
专家分:66
注 册:2010-7-14
收藏
得分:0 
只要修改一点点问题就能解决。

[url=http://www.]抛光蜡[/url]
2010-07-17 16:53
快速回复:万年历 字符不对齐问题
数据加载中...
 
   



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

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