首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用c++编写的万年历格式输出的有关问题,求解决啊都搞了好几天了

2013-10-27 
用c++编写的万年历格式输出的问题,求解决啊,都搞了好几天了#include iostream#include iomanipusing n

用c++编写的万年历格式输出的问题,求解决啊,都搞了好几天了

#include <iostream>
#include <iomanip>
using namespace std;
char* weekd[7]={"日","一","二","三","四","五","六"};
bool Isrunnian(int n)
{
if(n%400==0||(n%4==0&&n%100!=0))
return true;
else
return false;
}
int weekday(int a)

int n=(a+(a-1)/4-(a-1)/100+(a-1)/400)%7;//计算a年元旦为星期n
return n+1;
}
int monthday(int i) //这里是返回月有几天的,i是月份

if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) 
return    31; //如果是1,2,5,7,8,10,12月,则返回是31天
else if (i==2) //判断2月
if(Isrunnian(i)) //当返回1时就是闰年,则为29天
return    29; 
else return 28; //否则为28天
else 
return    30; //其他的月份为30天

void show1(int a)
{
int i,j;
int n=weekday(a);
for(i=1;i<=12;i++)
{
cout<<"                    ";
int lemp=1;
cout<<setw(16)<<i<<"月份";
cout<<endl;
cout<<"                    ";
for (j=0;j<7;j++)
cout<<setw(5)<<weekd[j];
cout<<endl;
cout<<"                    ";
for(int k=1;k<n;k++,lemp++)      //输入每月第一天的起始位置,用空格补充 
cout<<setw(5)<<" ";   //就是如果是星期四,则前面有3个空格,1从星期四的位置出现
for(int d=1;d<=monthday(i);d++,lemp++) //循环输出每个月的日子

cout<<setw(5)<<d;    //d就是日子
if(lemp==7)          //控制一行输出到星期天,如果到星期天则重新计数 

cout<<endl; //是星期六的话刚输出一个换行
cout<<"                    ";
lemp=0;          //让临时记录星期的变量为0,以备下次使用


n=lemp%7;       //当输出完一个月后,记录这个月的最后一天在哪,寻找下个月的 
    if(n==0)        //第一天的起始位置 
n=7;//就是当n为0的时候,是周日,令n为7
        cout<<endl;
}
}

这种事居中输出的 c++ 万年历
[解决办法]
#include <iostream>
#include <iomanip>
using namespace std;
char* week_name="日   一   二   三   四   五   六";
bool Isrunnian(int n)
{
  if(n%400==0
[解决办法]
(n%4==0&&n%100!=0))
    return true;
  else
    return false;
}
int weekday(int a)

  int n=(a+(a-1)/4-(a-1)/100+(a-1)/400)%7;//计算a年元旦为星期n
  return n+1;
}
int monthday(int i) //这里是返回月有几天的,i是月份

  if(i==1
[解决办法]
i==3
[解决办法]
i==5
[解决办法]
i==7
[解决办法]
i==8
[解决办法]
i==10
[解决办法]
i==12) 
    return    31; //如果是1,2,5,7,8,10,12月,则返回是31天
  else if (i==2) //判断2月
    if(Isrunnian(i)) //当返回1时就是闰年,则为29天
      return    29; 
    else return 28; //否则为28天
  else 
    return    30; //其他的月份为30天


#define FIELD_WIDTH 5
#define LINE_WIDTH (FIELD_WIDTH*7)
#define LINE_NUMBER 8
typedef char month_map_t[LINE_NUMBER][LINE_WIDTH+1];
month_map_t calender[12];
void compose_calender(int a)
{
  int i,j;
  int n=weekday(a);
  memset(calender, ' ', sizeof(calender));
  for(i=1;i<=12;i++)
  {
    month_map_t *p_month_map = &calender[i-1];
    sprintf(&(*p_month_map)[0][11], "%2d月份", i);
    (*p_month_map)[0][strlen((*p_month_map)[0])] = ' ';
    strcpy((*p_month_map)[1], week_name);


    (*p_month_map)[1][strlen((*p_month_map)[1])] = ' ';
    int lemp=n;
    char *q = (*p_month_map)[2] + (n-1)*FIELD_WIDTH;
    int l = 3;
    for(int d=1;d<=monthday(i);d++,lemp++) //循环输出每个月的日子
    { 
      sprintf(q, "%2d", d); //cout<<setw(5)<<d;    //d就是日子
      q[strlen(q)] = ' ';
      q += FIELD_WIDTH;
      if(lemp==7)          //控制一行输出到星期天,如果到星期天则重新计数 
      { 
        q = (*p_month_map)[l++];
        lemp=0;          //让临时记录星期的变量为0,以备下次使用
      } 
    } 
    n=lemp%7;       //当输出完一个月后,记录这个月的最后一天在哪,寻找下个月的 
    if(n==0)        //第一天的起始位置 
      n=7;//就是当n为0的时候,是周日,令n为7
    for (j = 0; j < LINE_NUMBER; j++)
      (*p_month_map)[j][LINE_WIDTH] = '\0';
  }
}

int main()
{
  int i, j;

  compose_calender(1);

  //按原先格式输出
  for (i = 0; i < 12; i++)
  {
    for (j = 0; j < LINE_NUMBER; j++)
    {
      printf("%s\n", calender[i][j]);
    }
    printf("\n");
  }

  //按新格式输出
  for (j = 0; j < LINE_NUMBER; j++)
  {
    for (i = 0; i < 12; i++)
    {
      printf("%s  ", calender[i][j]);
    }
    printf("\n");
  }

  //还可按其他格式输出。。。。。。

}


[解决办法]
8楼程序中的2维数组定义:
#define FIELD_WIDTH 5
#define LINE_WIDTH (FIELD_WIDTH*7)
#define LINE_NUMBER 8
typedef char month_map_t[LINE_NUMBER][LINE_WIDTH+1];

LINE_NUMBER表示有8行,其中第1行放月份名称,第2行放星期名称,第3..7行放日期。
FIELD_WIDTH表示日期的宽度是5个字符。
LINE_WIDTH表示一行的宽度,每行放7天,所以是FIELD_WIDTH*7。
每行最后要加一个0,用以表示字符串结束,所以定义数组时要LINE_WIDTH+1。

2维数组的类型定义month_map_t用于存放一个月的日历。然后定义数组存放一年的日历:
month_map_t calender[12];

热点排行