#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define str "   SUN   MON  TUE   WED   THU   FRI   SAT   "

void menu();         //操作菜单
int leap(int year);        //判断某年是不是闰年
int days_month(int year,int month);        //返回某月的天数
int someday(int year,int month,int day);    //计算某天是星期几
void search_month(int year,int month);        //输出某月的日历
void search_someday(int year,int month,int day);    //查询某日是星期几
 
int main()
{
    int i,year,month,day;
    int k1,k2,k3,k4;    //用于判断输入的数据和操作是否正确,1代表正确,0代表错误
    int a = 1;
    menu();
    do
    {
        printf("请输入你要进行的操作(1-4):");
        scanf("%d",&i);
        getchar();
        switch(i)
        {
            case 1:
                printf("请输入你要查询的年份:");scanf("%d",&year);
                for(a;a<=12;a++)
                {
                    printf("\n\n---------*******   %d  *******------------\n",a);
                    search_month(year,a);
                }
                printf("---------*********************------------\n\n\n");
                break;

            case 2:
                printf("请输入您所要查询的相关信息.\n");
                printf("年份:");scanf("%d",&year);
                printf("月份:");scanf("%d",&month);
                k1=1;
                while(k1)
                {
                    if(month>12||month<1)
                    {
                        printf("你输入的月份有误,请重新输入!\n");
                        printf("月份:");
                        scanf("%d",&month);   
                        if(month<1||month>12)    k1=1;
                    }
                    else k1=0;
                }
                search_month(year,month);
                printf("---------*********************------------\n\n\n");
                break;

            case 3:
                printf("请输入你要查询的日期\n");
                printf("年份:");scanf("%d",&year);
                printf("月份:");scanf("%d",&month);
                k2=1;
                while(k2)
                {
                    if(month>12||month<1)
                    {
                        printf("你输入的月份有误,请重新输入!\n");
                        printf("月份:");
                        scanf("%d",&month);   
                        if(month<1||month>12)    k2=1;
                    }
                    else k2=0;
                }
            //    printf("%d年%d月有%d天\n",year,month,days_month(year,month));     调试观察输入的日期是否有误,可忽略
                printf("日期:");scanf("%d",&day);
                k3=1;
                while(k3)
                {
                    if(day>days_month(year,month)||day<1)
                    {
                        printf("你输入的日期有误,请重新输入!\n");
                        printf("日期:");
                        scanf("%d",&day);   
                        if(day>days_month(year,month)||day<1)    k3=1;
                    }
                    else k3=0;
                }
                search_someday(year,month,day);
                printf("---------*********************------------\n\n\n");break;

            case 4:exit(0);
                printf("---------*********************------------\n\n\n");break;

            default:
                k4=1;
                while(k4)
                {
                    printf("你输入的数据有误,请重新输入你要进行的操作(1-4):");
                    scanf("%d",&i);   
                    if(i<1||i>4)    k4=1;
                    else k4=0;
                }
                break;
        }
    }while(i>0&&i<5);   
    return 0;
}

void menu()
{
    int i=1;          
    printf("\n\n\t\t----------------------------------------\n");
    printf("\t\t|--------------------------------------|\n");
    printf("\t\t|           %d.  输出某年的日历         |\n",i);
    printf("\t\t|           %d.  输出某月的日历         |\n",i+1);
    printf("\t\t|           %d.  查询某日是星期几       |\n",i+2);
    printf("\t\t|           %d.  退出系统               |\n",i+3);
    printf("\t\t|--------------------------------------|\n");
    printf("\t\t----------------------------------------\n\n");
       
}

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

int days_month(int year,int month)
{
    int days_month;
    switch(month)
    {
        case  1:
        case  3:
        case  5:
        case  7:
        case  8:
        case  10:
        case  12: days_month = 31;break;
       
        case  4:
        case  6:
        case  9:
        case  11:days_month = 30;break;
       
        case  2:
            if(leap(year)==1)
            {
                days_month = 29;break;
            }
            else days_month = 28;break;
    }
        return days_month;
}

int someday(int year,int month,int day)
{
    //该函数运用了特殊的计算公式,详细可参见 http://blog.163.com/hexin_mars_blog/blog/static/248215040201571351115699/
    int someday,m,n,i;  //someday表示查询的日子是星期几
    m=year-year/1000*1000;
    n=m-m/100*100-1;            //用于获得年份的后两位数
    int days=0;
    for(i=1;i<month;i++) days = days + days_month(year,i);
    days =days + day;
    someday = (n + n/4 - n/100 + n/400 + days)%7;
    return someday;
}

void search_someday(int year,int month,int day)
{
        char weekname[20];
        switch(someday(year,month,day))
            {
                case 0:strcpy(weekname,"星期天") ;break;
                case 1:strcpy(weekname,"星期一") ;break;
                case 2:strcpy(weekname,"星期二") ;break;
                case 3:strcpy(weekname,"星期三") ;break;
                case 4:strcpy(weekname,"星期四") ;break;
                case 5:strcpy(weekname,"星期五") ;break;
                case 6:strcpy(weekname,"星期六") ;break;
            }
            printf("你所要查询的日期是%s\n",weekname);
}

void search_month(int year,int month)
{
    int i=0,j,k=0,m;     //j用于记录某月的第一天是星期几   m用于记录某月的天数  k用于换行提示
    char x[10]="      ";
    m=days_month(year,month);
    j=someday(year,month,1);
   
    //输出某月的日历
    printf("------------------------------------------\n");
    printf("%s\n",str);
    for(;i<j;i++)
    {
        printf("%s",x);k++;
    }   
    for(i=1;i<=m;i++)
    {
        k++;
        if(k%7==0)
        {
            if(i<10)
            {
                printf("    %d ",i);
                printf("\n");   
            }
            else if(i>=10)
            {
                printf("   %d ",i);
                printf("\n");   
            }
        }
        else
        {
            if(i<10)
            {
                printf("    %d ",i);
            }
            else if(i>=10)
            {
                printf("   %d ",i);
            }
        }
    }
    printf("\n------------------------------------------\n");
}

void exit()
{
    exit(0);
}


用C语言写的万年历---亲手写的。好累哦的更多相关文章

  1. C语言用面向对象的思想写贪吃蛇

    大概一年前这时候,接触C语言一个月,那时候知之甚少,对面向对象只觉”可远观而不可亵玩“,而且会看到很多言论说C语言就是面向过程的语言,C++就是面向对象的语言.不过,不记得什么时候在网上看到过一篇博文 ...

  2. 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

    在<C程序设计伴侣>以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件.可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我 ...

  3. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  4. c语言的函数可以这样写,你见过吗?

    c语言的函数可以这样写,你见过吗?真的可以编译通过的.

  5. 使用java语言基于SMTP协议手写邮件客户端

    使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...

  6. Markdown: 用写代码的思维写文档

    作者:吴香伟 发表于 2014/08/07 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 本文不讲解Markdown的语法规则,只关注它带来的好处以及我使用的方 ...

  7. IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题

    程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...

  8. 会写网页 就会写手机APP -- Hybrid Mobile Apps for ASP.NET Developers

    您好,这篇文章是我的BLOG发出,原始出处在此: 会写网页 就会写手机APP -- Hybrid Mobile Apps for ASP.NET Developers http://www.dotbl ...

  9. hql中不能写count(1)能够写count(a.id)

    hql中不能写count(1)能够写count(a.id)里面写详细的属性 String hql="select new com.haiyisoft.vo.entity.cc.repo.Bu ...

随机推荐

  1. c#.net的网站出现“正在中止线程””异常的原因和解决方法

    出现“正在中止线程”异常通常都是由于以下三种原因导致引起,给出解决方案如下: 解决方案: 1.针对Response.End,调用 HttpContext.Current.ApplicationInst ...

  2. 谷歌YSlow准则

    谷歌YSlow准则 YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. 测试个人站点 通过测试个人站点可以获得下面的数据 23条准则 Make fewer HT ...

  3. php引入文件(include 和require的区别)

    引入文件: 首先需要一个php文件: <?php class shao//类名必须和文件名相同!!! { public $xxx="666"; } $shili = new ...

  4. jQuery validata插件实现(每周一插件系列)

    大家好,第一次写有点正规的博客,以前都是随手复制几下.为了打LOL,我写快点,代码我都复制在最下面了,并且写了大量的注释. 首先我写jquery插件,喜欢这么写(好处有很多,以后在讲,哈哈,看过jQu ...

  5. 《剑指offer》— JavaScript(19)顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...

  6. 《C++ Primer》学习笔记 :命名空间的using声明

    最近在学C++,在<C++ Primer>第五版的3.1节中说到使用using声明来使用命名空间中的成员,<C++ Primer>中这样写道: 有了using声明就无须专门的前 ...

  7. [.NET] RabbitMQ 的行为艺术

    RabbitMQ 的行为艺术 序 好像,今天已经是 2 月 28 号了. 听说,29.30.31 号放假. 据说,有图,有真相. 目录 简介 环境搭建 示例一:简单的 Hello World 示例二: ...

  8. 监听器如何获取Spring配置文件(加载生成Spring容器)

    Spring容器是生成Bean的工厂,我们在做项目的时候,会用到监听器去获取spring的配置文件,然后从中拿出我们需要的bean出来,比如做网站首页,假设商品的后台业务逻辑都做好了,我们需要创建一个 ...

  9. input 即时搜索 监听输入值的变化

    在 Web 开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理 ...

  10. TypeScript设计模式之门面、适配器

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...