C语言实现万年历小程序

一、杂谈

大一学了C之后一直困惑,C到底怎么用?它不像HTML那么直观,也没有SQL那么常用,更没有Java那么功能强大,那他为何还存在,并依然火热呢?

答案很简单:编程语言是一家,C语言结构简单,但所蕴含的逻辑思维和其他语言大致相同,适合初学者。

编程不是一蹴而就,能力需要日积月累,推荐想我一样的初学者,大家自己动手玩玩简单的C程序!

二、万年历

像这样一个简单的全年日历,仔细观察不难发现由每个月的日历组成,每个月有最多6行,占6周,每周7天;

程序如下:

设定日历大小:

int date[12][6][7];  //12个月,每月最多6行,每行7天
int calendar[ ][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;
char title[]="SUN MON TUE WED THU FRI SAT";  //周几
int sw,leap,i,j,k,wd,day;          //变量
// sw 周几,leap 0平年 1闰年,i,j,k辅助变量,wd 第几周,day 日

提示用户输入想要查询的年份:(回车换行)

printf("Please input the year whose calendar you want to know: ");
scanf("%d%*c",&year);

再计算该年1月1 日是起于周几:

(由于公元1月1日设为星期六,故3月1日为星期三。为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。

每 4年(3个平年+1个闰年)共208周+5天 =208*7+5=1461
每百年共100*(208周+5天)-1天=5217周+5天 (整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天
即400年一轮回!)

long int getyear(int year,int month){
 if(month<3) return year-1;  //以元年3月为基石
 else return year;
}
long int getmonth(int month){
 if(month<3) return month+13; //将月份调至下个月
 else return month+1;
}
long int getday(int year,int month,int day){
 return 1461L*getyear(year,month)/4+153L*getmonth(month)/5+day;  //计算距离元年3月1日天数
  //计算方法:每四年一周期1461天(相当于计算平均每年多少天)
  //每五个月一周期153天(相当于计算平均每月多少天)
}
int getweekday(int year,int month,int day){
 return(int)((getday(year,month,day)%7-2+7)%7);        //得该日期的星期数
  //得到的天数除以7天取余,减去3月1日周三,其他均为保证正数1-7的附加计算
}

判断是否为闰年:

leap= year%4==0 && year%100||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;

填充该年日期:

sw=getweekday(year,1,1);
for(i=0;i<12;i++)
 for(wd=0,day=1; day <= calendar[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+=date[i][5][k]+date[i+6][5][k];
 wd=wd?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|");
 }
 scanf("%*c");
 }
 puts("=================================================================|");
 puts("\n Press any key to quit...");

结果为

完整代码:

#include "stdio.h"
long int getyear(int year,int month){
 if(month<3) return year-1;
 else return year;
}

long int getmonth(int month){
 if(month<3) return month+13;
 else return month+1;
}

long int getday(int year,int month,int day){
 return 1461L*f(year,month)/4+153L*g(month)/5+day;
}

int getweekday(int year,int month,int day){
 return(int)((n(year,month,day)%7-2+7)%7);
}

int date[12][6][7];
int calender[ ][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}};
main()
{int sw,leap,i,j,k,wd,day;
 int year;
 char title[]="SUN MON TUE WED THU FRI SAT";
printf("Please input the year whose calendar you want to know: ");
scanf("%d%*c",&year);
sw=w(year,1,1);
leap=year%4==0&&year%100||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_tbl[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+=date[i][5][k]+date[i+6][5][k];
 wd=wd?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|");
 }
 scanf("%*c");
}
puts("=================================================================|");
puts("\n Press any key to quit...");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现万年历程序

    本文实例为大家分享了C语言实现万年历程序,供大家参考,具体内容如下 #include <stdio.h> int year(int y) { if ((y%4==0) && (y%100!=0) || y%400==0) return 366; else return 365; } int main() { int y; int i,j,sum=0; int begin,week; int days[12]={31,28,31,30,31,30,31,31,30,31,30,3

  • C语言实现万年历

    C语言实现的万年历显示,按下上下左右按键来更换日期和年份,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <time.h> #include<conio.h> typedef struct today { int day; int month; int year; } today; int day_cankao[2][13]={ {0,31,28,31,30,31,30,31,31,3

  • C语言实现的一个万年历小程序

    该程序简单地输入一个年份(1901年之后的年份),随后程序输出该年份十二个月的日历. #include<stdio.h> #define Mon 1 #define Tues 2 #define Wed 3 #define Thur 4 #define Fri 5 #define Sat 6 #define Sun 0 #define January_days 31 #define February_days 28 #define March_days 31 #define April_day

  • C语言实现万年历小程序

    一.杂谈 大一学了C之后一直困惑,C到底怎么用?它不像HTML那么直观,也没有SQL那么常用,更没有Java那么功能强大,那他为何还存在,并依然火热呢? 答案很简单:编程语言是一家,C语言结构简单,但所蕴含的逻辑思维和其他语言大致相同,适合初学者. 编程不是一蹴而就,能力需要日积月累,推荐想我一样的初学者,大家自己动手玩玩简单的C程序! 二.万年历 像这样一个简单的全年日历,仔细观察不难发现由每个月的日历组成,每个月有最多6行,占6周,每周7天: 程序如下: 设定日历大小: int date[1

  • C语言实现关机小程序

    本文实例为大家分享了C语言实现关机小程序,立即关机和定时关机的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<windows.h> int main() { printf(" ===================\n");//菜单界面 printf(" 1.立刻关机\n"); print

  • 用C语言实现扫雷小程序

    本文实例为大家分享了C语言实现扫雷小程序的具体代码,供大家参考,具体内容如下 扫雷程序的编写需要有清晰的思路,所以我们先要清楚扫雷的实现有几个功能模块让我们编写,再用主函数将功能结合在一起: //菜单函数//初始化数组函数//布雷函数//统计周围雷的个数//打印玩家棋盘//打印设计者棋盘//扫雷函数//避免第一次被雷炸死的函数//展开函数//判断玩家棋盘剩余未知区域的个数 根据这几点可以写出如下的头文件: #ifndef __GAME_H__ #define __GAME__H__ #inclu

  • C语言编写扫雷小程序

    本文实例为大家分享了C语言实现扫雷小程序的具体代码,供大家参考,具体内容如下 首先创建一个项目,建立一个头文件game.h,两个源文件game.c和test.c game.h代码片: #ifndef  __GAME_H__ #define  __GAME_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> #define ROWS 10//行数 #define COLS 10//列数 #define M

  • 易语言制作黑客小程序源码

    DLLL命令表 .版本 2 .DLL命令 FindWindow, 整数型, , "FindWindowA" .参数 lpClassName, 文本型 .参数 lpWindowName, 整数型 .DLL命令 FindWindowA, 整数型, , "FindWindowA" .参数 lpClassName, 文本型 .参数 lpWindowName, 文本型 .DLL命令 GetWindow, 整数型, , "GetWindow" .参数 hWn

  • C语言实现万年历小功能

    本文实例为大家分享了C语言实现万年历的具体代码,供大家参考,具体内容如下 一.学了C语言,相信大家都可以做出来.我们要实现的就是用户输入年,月,日.然后打印出来. 二.需要用到的知识点 1.for循环.2.if判断.3.函数的调用 如果您们学了图形库的话,可以贴图上去,效果更加好看.我没有素材,所以,直接用C语言来完成. 三.运行结果 四.我们用C语言代码实现 /*******************************************************************

  • 使用C语言编写钢琴小程序

    网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是Flash小游戏,26个按键的. 后来想用C语言自己实现一个,没有界面--控制台的. 原理很简单,先在控制台中获取按键事件,在按键事件中,开一个线程,这个线程就是专门用来播放键对应的音效mp3的. 为什么要用线程呢,因为直接按键播放的话,如果不把mp3播放完,就无法再播放同一mp3,用线程就没有这个问题了. 线程函数中,就是使用mciSendString函数,打开然后播放对应的mp3文件. 刚开始写完的时候很哈皮,可以弹奏了,从网上找了一些曲谱

  • C语言实现扫雷小程序

    前言 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 多文件形式 在实现游戏的首先,需要创建test.c game.c game.h三个文件. test.c主要进行游戏的测试. game.c主要进行游戏内部一些函数的具体实现. game.h主要是一些声明,宏定义. 游戏逻辑 1.打印简易菜单 2.定义及初始化数组 3.随机生成布置雷 4.玩家排雷 游戏实现 打印简易菜单 打印菜单让玩家选择

  • 易语言编写登录小程序实例讲解

    我们首先来看下源码内容 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .如果真 (编辑框1.内容 = "" 或 编辑框2.内容 = "") 信息框 ("用户名或密码不能为空!", 0, , ) 编辑框1.获取焦点 () 标签3.可视 = 假 标签4.可视 = 假 返回 () .如果真结束 .如果真 (编辑框1.内容 = "123" 且 编辑框2.内容 = "123") 信息框 ("登

随机推荐