c语言实现一个简单日历

满足三个需求:

1.输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
2.输入年月,输出该月的日历。
3.输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

最终完善版代码:

代码如下:

#include<stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <windows.h>
int year , month , day ;
int day_of_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
//char wek[7]={'周日','周一','周二','周三','周四','周五','周六'};
int current_year,current_month,current_day;
/************************************通用关键函数**************************************************/
void cls_screen()
{
    printf("请按任意键返回!\n");
    getchar();
    getchar();
    system("cls");
}
void get_current_time()   //获取当前时间
{
    time_t timep;
    struct tm *p;
    time(&timep);
    p = gmtime(&timep);
    current_year=1900+p->tm_year;
    current_month=1+p->tm_mon;
    current_day=p->tm_mday;
}
int judgement (int y)
{
    if (y % 400 == 0 || (y % 100 !=0 && y %4 ==0))
        return 1 ;
    else return 0 ;
}
int show_week (int year , int month , int day)
{
/*
公式:w=(y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)%7
    */
    int w ,k;   //记录周几
    int year_last=year %100,c=year/100 , m = month;
    if (month==1 )
    {
        year_last-=1 ;
        m=13 ;
    }
    else if (month==2)
    {
        year_last-=1;
        m=14;
    }
    w = (year_last + year_last/4 + c/4 - 2*c +26*(m+1)/10+day-1); // abs  绝对值
    if (w<0)
    {
        k=(w%7+7)%7;
    }
    else k=w%7;
    return k ;
}
/************************************第一部分**************************************************/
void print_year (int year)
{
    int i , k ,x ,first_week;
    printf ("请输入想要查询的年月(格式如2012):");
    scanf ("%d",&year);
    printf("=======================%d年===========================\n",year);
    printf("\n");
    if (judgement(year))
    {
        day_of_month[1]=29;
    }
    else day_of_month[1]=28;
    for (i=1 ; i <13 ; i++)
    {
        first_week = show_week(year,i,1);
        printf("=====================%d月日历如下========================\n",i);
        printf ("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
        for (x=1;x<=first_week;x++)
        {
            printf("\t");
            if (x%7==0) printf ("\n");
        }
        for (k=1;k<=day_of_month[i-1];k++)
        {
            printf("%d\t",k);
            if (x%7==0) printf ("\n");
            x++;
        }
        printf("\n");
        printf("\n");
        printf("\n");
    }
}
/************************************第二部分**************************************************/
void print_year_month ()
{
    int k ,x ,first_week;
    printf ("请输入想要查询的年月(格式如2012 12):");
    do
    {
        scanf ("%d %d",&year,&month);
        if (month<1||month>12)
        {
            printf("您输入的月份有误哦~请输入正确的月份\n");
            printf ("请输入想要查询的年月(格式如2012 12):");
        }
    }while(1>month||month>12);
    printf("=====================%d年%d月======================\n",year,month);
    if (judgement(year))
    {
        day_of_month[1]=29;
    }
    else day_of_month[1]=28;
    first_week = show_week(year,month,1);
    printf ("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
    for (x=1;x<=first_week;x++)
    {
        printf("\t");
        if (x%7==0) printf ("\n");
    }
    for (k=1;k<=day_of_month[month-1];k++)
    {
        printf("%d\t",k);
        if (x%7==0) printf ("\n");
        x++;
    }
    printf("\n");
}
/************************************第三部分**************************************************/
int year_before_sumdays (int year,int month, int day)
{
    int days=0 ,i,judgement1;
    int temp_day=0 ,sum_days;       //
    //printf ("%d,%d\n",current_year,current_month);
    judgement1=judgement(year);
    /*===================比当前少=====================*/
    if (year < current_year )
    {
        for (i = year+1;i < current_year ;i++)     
        {
            if (judgement(i))
            {
                days=days+356;
            }
            else days+=355;
        }
        for (i = month+1;i<=12;i++)
        {
            days=days+day_of_month[i-1];
        }
        days = days + day_of_month[month-1]-day;           //指定日子距离当年结束还有多少天
        //printf("去年还有%d\n",days);
        for (i = 0;i < current_month-1;i++ )           
        {  
            if (judgement1)
            {
                day_of_month[1]=29;
            }
            temp_day = temp_day + day_of_month[i];
        }
        //当前日子是这一年的多少天
        temp_day = temp_day + current_day;
        //printf("今天是第%d天\n",temp_day);
        sum_days=temp_day + days ;
    }
    /*===================比当前多=====================*/
    if (year > current_year )
    {
        for (i =current_year+1;i < current_year ;i++)     
        {
            if (judgement(i))
            {
                days=days+356;
            }
            else days+=355;
        }
        for (i = current_month+1;i<=12;i++)
        {
            days=days+day_of_month[i-1];
        }
        days = days + day_of_month[month-1]-current_day;           //指定日子距离当年结束还有多少天
        //printf("去年还有%d\n",days);
        for (i = 0;i <month-1;i++ )           
        {  
            if (judgement1)
            {
                day_of_month[1]=29;
            }
            temp_day = temp_day + day_of_month[i];
        }
        //当前日子是这一年的多少天
        temp_day = temp_day + day;
        //printf("今天是第%d天\n",temp_day);
        sum_days=temp_day + days ;
    }
    /*===================比当前一样=====================*/
    if (year == current_year )
    {
        if(month <current_month)
        {
            for (i=month+1;i<current_month;i++)
            {
                if (judgement1)
                {
                    day_of_month[1]=29;
                }
                days = days + day_of_month[i];
            }
            sum_days = days + current_day + day_of_month[month-1] - day ;
        }
        if (month>current_month)
        {
            for (i=current_month+1;i<month;i++)
            {
                if (judgement1)
                {
                    day_of_month[1]=29;
                }
                days = days + day_of_month[i];
            }
            sum_days = days + day + day_of_month[month-1] - current_day ;
            printf("%d\n",days);
        }
        if (month==current_month)
        {
            sum_days= abs(day-current_day);
        }
    }
    return sum_days ;
}
void print(int year,int month,int day)
{
    int week;
    printf ("请输入想要查询的年月(格式如2012 12 12 ):");
    do
    {
        scanf ("%d %d %d",&year,&month,&day);
        if (judgement(year))
        {
            day_of_month[1]=29;
        }
        printf("\n");
        if (day<=0 || day >day_of_month[month-1])
            printf ("%d月没有%d,请重新输入(格式如2012 12 12 ):",month,day);
    }while(day<=0 || day >day_of_month[month-1]);
    week=show_week (year,month ,day);
    printf("\n");
    switch(month)//判断查找天是否阳历节日先由月份判断是否有节日的月份再由日判断是否为节日
    {
    case 1:switch(day)
           {
    case 1:printf("元旦") ;break;
    default:printf("不是阳历节日");
           }break;
    case 2:switch(day)
           {
    case 14:printf("情人节(Valentines Day)");break;
    default:printf("不是阳历节日");
           }break;
    case 3:switch(day)
           {
             case 8:printf("妇女节¨(Women's Day)");break;
             case 12:printf("植树节(Arbor Day)");break;
             default:printf("不是阳历节日");
           }break;
    case 4:switch(day)
           {
             case 1:printf("愚人节(April Fools Day)");break;
             case 5:printf("清明节(Tomb-sweeping Day)");break;
             default:printf("不是阳历节日");
           }break;
    case 5:switch(day)
           {
    case 1:printf("劳动节(Labor Day)");break;
    case 4:printf("中国青年节(Chinese Youth Day)");
    default:printf("不是阳历节日");
           }break;
    case 6:switch(day)
           {
    case 1:printf("儿童节(Children's Day)");break;
    default:printf("不是阳历节日");
           }break;
    case 8:switch(day)
           {
    case 1:printf("建军节(the Army's Day)");break;
    default:printf("不是阳历节日");
           }break;
    case 9:switch(day)
           {
    case 10:printf("教师节(Teacher's Day)");break;
    default:printf("不是阳历节日");
           }break;
    case 10:switch(day)
            {
    case 1:printf("国庆节(National Day)");break;
    case 31:printf("万圣节(Helloween Day)");break;
    default:printf("不是阳历节日");
            }break;
    case 12:switch(day)
            {
    case 25 :printf("圣诞节(Christmas Day)");break;
    default:printf("不是阳历节日");
            }break;
    }
    printf("\n");
    printf("%d年%d月%d号是:",year,month,day);
    switch(week)//判断所查找天是星期几
    {
    case 0:printf("Sunday");break;
    case 1:printf("Monday");break;
    case 2:printf("Tuesday");break;
    case 3:printf("Wednesday");;break;
    case 4:printf("Thursday");break;
    case 5:printf("Friday");break;
    case 6:printf("Saturday");break;
    }
    printf("\n");
    printf("距离今天有%d天\n",year_before_sumdays ( year, month, day));
    printf("\n");
}
/********************************************************************************************/
void main ()
{
    int choice,year,month,day,flag=1;
    char c , k;
    for(;1;)//显示程序菜单,为永真,每次查找完回到程序菜单ì
    {
        printf("===================================菜单选项===================================\n");
        printf("请选择:\n");
        printf("* * * * * * * *               1.查找某一年的年历              * * * * * * * *\n");
        printf("* * * * * * * *               2.查找某一月的月历              * * * * * * * *\n");
        printf("* * * * * * * *               3.查找某一天                    * * * * * * * *\n");
        printf("* * * * * * * *               0.退出                          * * * * * * * *\n");
        printf("==============================================================================\n");
        printf("请输入您的选择:   ");
        do
        {
            if (flag)
            {
            c=getche();
            printf("\n");
            printf("确定选择%c吗? (y/Y )或者(n/N):   ",c);
            }  
            if (flag )
            {
            k=getche();
        //  printf("\n");
            }
            if (k == 'y' || k == 'Y')
            {
                printf("\n");
                if (c=='\n')
                {
                    printf("\n");
                    printf("输入有误,请输入数字\n");
                    printf("\n");
                    printf("请输入您的选择:   ");
                }
                else if (!isdigit(c))
                {
                    printf("\n");
                    printf("输入有误,请输入数字\n");
                    printf("\n");
                    printf("请输入您的选择:   ");
                }
                else if (isdigit(c))
                {
                    choice = c-'0' ;
                    if (choice < 0 || choice > 3 )
                    {
                        printf("输入有误,请输入0-3之间的数字\n");
                    }
                    else break ;
                }
            }
            else if (k=='n' || k=='N')
            {
                printf("\n");
                printf("你选择了否,请重新输入选项:   ");
                flag=1;
            }
             if ((k != 'y'&& k!='Y'&& k!= 'n'&& k!='N'))
            {
                 printf("\n");
                printf("请输入y/n:   ");
                flag=0;
                if (flag == 0)
            {
            k=getche();
            printf("\n");
            //getchar();
            }
            }
        }while(1);
        if (choice==1)
        {
            print_year(year);
            cls_screen();
        }
        else if (choice==2)
        {
            print_year_month ();
            cls_screen();
        }
        else if (choice==3)
        {
            get_current_time();
            print(year,month,day);
            cls_screen();
        }
        else if (choice==0)
            break;
        else
        {
            printf ("您的输入有误,请重新输入\n");
        }
    }
}

以上就是本文所述的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • C语言编写多功能日历

    我分享的第一个代码 希望大家给予我改进的建议 我的3和4的功能是空着的我还没有想好要些啥功能...  第一次上传代码······ ***还有为啥我上传的代码这么就对不齐了,在vc++6.0里就很好啊??比如说有些代码上传上来就成了在其他代码后面了对不齐 不规格了 . #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #define H "%d&qu

  • C++实现两个日期间差多少天的解决方法

    计算原理是先求出每个日期距离1年1月1日的天数差值,再进一步做差即可. 复制代码 代码如下: #include <stdio.h>struct MyDate{ int year; int month; int day;}; int GetAbsDays(MyDate x){ int i; int month_day[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int year = x.year-1;  // 因为欲求距离1年1月1日的距离 int da

  • C++自定义函数判断某年某月某日是这一年中第几天

    本文实例讲述了C++自定义函数判断某年某月某日是这一年中第几天的方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * 完成日期:2012 年 11 月 30 日 * 版 本 号:v1.0 * * 输入描述: * 问题描述:编写函数判断某年某月某日这一年中是第几天,在主函数中调用该函数. * 程序输出: * 问题分析:略 * 算法设计:略 */ #include<iostream> using namespace std; int main() { void f(int yea

  • C语言中将日期和时间以字符串格式输出的方法

    ctime()函数: 头文件: #include <time.h> 定义函数: char *ctime(const time_t *timep); 函数说明:ctime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为"Wed Jun 30 21 :49 :08 1993\n". 注意:若再调用相关的时间日期函数,此字符串可能会被破坏. 返回值:返回一字符串表

  • C语言中读取时间日期的基本方法

    C语言time()函数:获取当前时间(以秒数表示) 头文件: #include <time.h> 定义函数: time_t time(time_t *t); 函数说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数.如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存. 返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中. 范例 #include <time.h> main(){

  • 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语言小程序 如何判断两个日期之差

    1.普通的写法 复制代码 代码如下: #include <stdio.h>int leapyear(int year){ if((year%4==0 && year%100!=0) || year%400==0)  return 1; else   return 0;}int days(int *day1, int *day2){ int i=0; int *tmp; int diff = 0; const int month[13]={0,31,28,31,30,31,30,

  • C++删除指定文件夹下N天及之前日志文件的方法

    本文实例讲述了C++删除指定文件夹下N天及之前日志文件的方法.分享给大家供大家参考.具体如下: // 功能:删除nDays天及之前的日志文件 // @nDays: 0-不删除日志,3-删除3天及之前的日志(保留今天.昨天.前天的日志) ... void CRecordLog::ClearLog(UINT nDays) // 删除N天前的日志 { if (nDays > 0) { WIN32_FIND_DATA FindFileData; CString sAllFile = m_sLogFold

  • C语言小程序 计算第二天日期示例代码

    复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>int year, month, day;const int day_30 = 30;const int day_31 = 31;int day_month_2 = 0;char err_flag = 0;void compute(){ printf("输入年月日(1992-7-19

  • c语言实现一个简单日历

    满足三个需求: 1.输入一个年份,输出是在屏幕上显示该年的日历.假定输入的年份在1940-2040年之间. 2.输入年月,输出该月的日历. 3.输入年月日,输出距今天还有多少天,星期几,是否是公历节日. 最终完善版代码: 复制代码 代码如下: #include<stdio.h> #include <string.h> #include <time.h> #include <math.h> #include <windows.h> int year

  • go语言实现一个简单的http客户端抓取远程url的方法

    本文实例讲述了go语言实现一个简单的http客户端抓取远程url的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "net/http"  "net/url"  "io/ioutil" ) func main() { resp, err := http.Get("http://www.google.co.

  • 利用 Go 语言编写一个简单的 WebSocket 推送服务

    本文中代码可以在 github.com/alfred-zhong/wserver获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息都是通过短信,微信和 App 推送给用户的,现在要让登录用户在网页端也能实时接收到报警推送. 依稀记得以前工作的时候遇到过类似的需求.因为以前的浏览器标准比较陈旧,并且那时用 Java 较多,所以那时候解决这个问题就用了 Comet4J.具体的原理就是长轮询,长链接.但现在毕竟 html5 流行开来了,IE 都被 Edge 接替了,再用以前这种技术就显得过

  • C 语言实现一个简单的 web 服务器的原理解析

    说到 web 服务器想必大多数人首先想到的协议是 http,那么 http 之下则是 tcp,本篇文章将通过 tcp 来实现一个简单的 web 服务器. 本篇文章将着重讲解如何实现,对于 http 与 tcp 的概念本篇将不过多讲解. 一.了解 Socket 及 web 服务工作原理 既然是基于 tcp 实现 web 服务器,很多学习 C 语言的小伙伴可能会很快的想到套接字 socket.socket 是一个较为抽象的通信进程,或者说是主机与主机进行信息交互的一种抽象.socket 可以将数据流

  • C语言实现一个简单的扫雷游戏

    前言 扫雷跟上一篇文章的三子棋一样,是C语言基础知识的综合运用的实例,对于巩固我们的基础知识非常重要,同时扫雷作为C语言的一个小项目,锻炼我们的编程思维,也是一个不可多得的实践. 提示:以下是本篇文章正文内容 一.扫雷的基本思路 1.用C语言实现简单的扫雷,我们需要创建两个数组,一个数组存放雷的信息,另外一个数组存放排雷后结果的信息. 2.在创建数组时候,需要注意的是数组需要大一圈,什么意思?举个例子,比如说我们实现的是9 ×9的扫雷,那么我们的数组就得创建10×10.为什么呢? 原因如下: 因

  • Go语言实现一个简单生产者消费者模型

    目录 一.生产者消费者模型 二.Go语言实现 1.无缓冲channel 2.有缓冲channel 三.实际应用 简介:介绍生产者消费者模型,及go简单实现的demo. 一.生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程.线程.进程等).产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者. 单单抽象出生产者和消费者,还够不上是生产者消费者模型.该模式还需要有一个缓冲区处于生产者和消费者之间

  • Go语言实现一个简单的并发聊天室的项目实战

    目录 写在前面 并发聊天服务器 具体代码 服务端 客户端 总结 写在前面 Go语言在很多方面天然的具备很多便捷性,譬如网络编程,并发编程.而通道则又是Go语言实现并发编程的重要工具,因为其承担着通道之间互相通信的重任.并且因为其本身就是并发安全的,所以在某些场景下是非常好用的. 并发聊天服务器 这里主要是实现一个简单的并发聊天服务器.首先,客户端可以在服务器中注册自己的信息(登录以及退出),客户端发出的所有的信息由服务器向各个客户端进行转发,或者换句话说是广播. 具体代码 服务端 说的再多,没有

  • 基于C语言编写一个简单的抽卡小游戏

    目录 效果图展示 开始的界面 输入1 输入10 输入0 实现代码 test4.26.c 许愿.c game.h 下载 小奔最近学了C语言不少的东西,但是想用学到的东西来搞一个小游戏. 不过小奔就不做那些猜数字等小游戏了,虽然很经典,但是可以尝试一下其他比较好玩的. 小奔喜欢玩原神,但它抽卡系统的中奖概率太低了,所以就类似做一个它的抽卡系统吧,不过没有保底功能哦(小奔还不想搞,还要学习新的知识,不过以后熟练了就可能会搞一个),是全角色抽卡,只有角色没有武器的,可以十连抽,没有保底功能,抽中的概率只

  • Go语言实战之实现一个简单分布式系统

    目录 引子 思路 实战 节点通信 主节点 工作节点 将它们放在一起 代码效果 总结 引子 如今很多云原生系统.分布式系统,例如 Kubernetes,都是用 Go 语言写的,这是因为 Go 语言天然支持异步编程,而且静态语言能保证应用系统的稳定性.笔者的开源项目 Crawlab 作为爬虫管理平台,也应用到了分布式系统.本篇文章将介绍如何用 Go 语言编写一个简单的分布式系统. 思路 在开始写代码之前,我们先思考一下需要实现些什么. 主节点(Master Node):中控系统,相当于军队中的指挥官

  • C语言代码实现简单扫雷小游戏

    用C语言写一个简单的扫雷,供大家参考,具体内容如下 1.所需要的知识 c语言的基本语法,简单的二维数组,一点简单的递归知识. 2.总体思路 扫雷游戏主要由3个部分组成,埋雷子,扫雷,判断输赢. 扫雷游戏的主体是两个个字符类型的二维数组.一个是mine[][]它的构成是'0'和'1',其中'0'表示无雷,'1'表示有雷.一个是show[][]它的构成是'*'和'数字'.星号表示未开启的地方,数字表示周围的雷数.这里要注意的是:mine和show的实际大小是11x11,但是展示的效果是 9x9.这样

随机推荐