加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

万年历:我的第一个C语言程序(带农历,节日,节气,干支,星座)

(2012-09-24 21:01:04)
标签:

c语言

天干地支

起始位

万年历

农历

分类: C语言

大一的一个小程序,现在整理出来希望可以给刚学C语言的人一些帮助

http://s13/middle/afeac133gca727d59ff3c&690

部分代码:

24节气计算函数(这个算法完全自创,)

int *Jieqi(int year,int month)
{
 int m,n,*t,i,a[2];
 double C[12][2]={5.4055,20.12,3.87,18.73,5.63,20.646,4.81,20.1,5.52,21.04,5.678,21.37,7.108,22.83,7.5,23.13,7.646,23.042,8.318,23.438,7.438,22.36,7.18,21.94};
 t=a;
 for(i=0;i<2;i++)
 {m=year*D+C[month-1][i];
 n=(year-1)/4+(year-1)/400-(year-1)/100;
 a[i]=m-n;
 }
 return(t);
}

 

农历显示函数:

void display(int year,int month) //显示日历
{
 int max,number,ya,q,i,j=1,*t;
 char *jieriname[] = {"春节", "元宵", "端午", "七夕", "中秋", "重阳", "腊八", "除夕","无"};
 char *jie[]={"元旦", "情人", "妇女", "植树", "愚人", "劳动", "青年", "无烟", "儿童", "建军", "教师", "国庆", "圣诞"};
 char *str[12][2]={ "小寒", "大寒" ,"立春", "雨水",
"惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋",
"处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"};
 max=maxDay(year,month);
 number=week(year,month,1); //该年该月的1号为星期几作为起始位
    printf("    %sssssss\n","日","一","二","三","四","五","六");
 printf("    ");
    for(i=0;i<number;i++) //找起始位
    {
        printf("          ");
    }
    while(j<=max)
    {
  
  q=Gjiari(month,j); 
  ya=Njiari(year,month,j);
  if(j>=10)
  {t=Jieqi(year,month);
   if(q!=0)
    printf("%d(%s)  ",j,jie[q-1]);
  else if(j==*t||j==*(t+1))
  {
   if(j==*t) printf("%d(%s)  ",j,str[month-1][0]);
   else if(j==*(t+1)) printf("%d(%s)  ",j,str[month-1][1]);
  }
  else if(ya!=8)
   printf("%d(%s)  ",j,jieriname[ya]);
        else printf("%d%s  ",j,GetDayOf2(year,month,j));
  }
  else
  {t=Jieqi(year,month);
   if(q!=0)
    printf("%d(%s)   ",j,jie[q-1]);
  else if(j==*t||j==*(t+1))
  {
   if(j==*t) printf("%d(%s)   ",j,str[month-1][0]);
   else printf("%d(%s)   ",j,str[month-1][1]);
  }
  else if(ya!=8)
   printf("%d(%s)   ",j,jieriname[ya]);
        else printf("%d%s   ",j,GetDayOf2(year,month,j));}
        if(i%7==6) //周六换行
        {
            printf("\n\n");
   printf("    ");
        }
        i++;
        j++;
    }
    printf("\n\n");
}

农历算法:

char *GetDayOf1(int wCurYear,int wCurMonth,int wCurDay)
char *cTianGan[] = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬","癸"};
   char *cDiZhi[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
   char *cShuXiang[] = {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
   char *cDayName[] = {"*","初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"};
   char *cMonName[] = {"*","正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};
   int wMonthAdd[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
   int wNongliData[100] = {  2635,333387,1701,1748,267701,694,2391,133423,1175,396438

                            ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402

                            ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738

                            ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762

                            ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413

                            ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395

                            ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031

                            ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222

                            ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709

                            ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
static int nTheDate,nIsEnd,m,k,n,i,nBit;
char szNongli[512], szNongliDay[512];
nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38;
    if ((!(wCurYear % 4)) && (wCurMonth > 2))
  nTheDate = nTheDate + 1;
 nIsEnd = 0;    m = 0;
    while (nIsEnd != 1)
   
  if (wNongliData[m] < 4095)
   k = 11;
  else
   k = 12;
  n = k;
        while (n >= 0)
        {
   nBit = wNongliData[m];
            for (i = 1;i < n + 1;i++)
    nBit = nBit / 2;
            nBit = nBit % 2;
            if (nTheDate <= (29 + nBit))
            {
    nIsEnd = 1; break;
   }
            nTheDate = nTheDate - 29 - nBit;
   n = n - 1;
  }
        if (nIsEnd)
   break;
  m = m + 1;
 }
    wCurYear = 1921 + m;
    wCurMonth = k - n + 1;
    wCurDay = nTheDate;
    if (k == 12)
    {
  if (wCurMonth == wNongliData[m] / 65536 + 1)
   wCurMonth = 1 - wCurMonth;
        else if (wCurMonth > wNongliData[m] / 65536 + 1)
            wCurMonth = wCurMonth - 1;
 }

 wsprintf(szNongli,"                              天干--------(%s)\n\n                              地支--------(%s)\n\n                              干支--------(%s%s年)\n\n                              属相--------(%s年)\n\n",cTianGan[((wCurYear - 4) % 60) % 10], cDiZhi[((wCurYear - 4) % 60) % 12],cTianGan[((wCurYear - 4) % 60) % 10], cDiZhi[((wCurYear - 4) % 60) % 12],cShuXiang[((wCurYear - 4) % 60) % 12]);
if (wCurMonth < 1)
        wsprintf(szNongliDay, "                              日期--------闰%s月",cMonName[ -1 * wCurMonth]);
    else
  wsprintf(szNongliDay, "                              日期--------%s月", cMonName[wCurMonth]);
    strcat(szNongliDay, cDayName[wCurDay]);
 return strcat(szNongli, szNongliDay);}
int *Jieqi(int year,int month)
{
 int m,n,*t,i,a[2];
 double C[12][2]={5.4055,20.12,3.87,18.73,5.63,20.646,4.81,20.1,5.52,21.04,5.678,21.37,7.108,22.83,7.5,23.13,7.646,23.042,8.318,23.438,7.438,22.36,7.18,21.94};
 t=a;
 for(i=0;i<2;i++)
 {m=year*D+C[month-1][i];
 n=(year-1)/4+(year-1)/400-(year-1)/100;
 a[i]=m-n;
 }
 return(t);
}

 

总结与收获

在这次设计中,为了可以比其他同学设计的出色,我在万年历中加入了农历,节日,节气,星座,天干地支等诸多功能。我希望自己做的东西可以和别人的用很大不同,我也希望自己可以在一次次的创新中提高自己,加强自己。

通过这次万年历的设计,我们收获了很多,不仅加强了对c语言的理解,我们还认清了自己的不足和薄弱环节,并学会自己独立分析和解决问题。另外, 我们还强化了动手能力,理解了团队合作的重要性。 这次设计,也让我对编程有了更浓厚的兴趣和自信。

 

0

阅读 收藏 喜欢 打印举报/Report
后一篇:清新美图
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有