c语言实现一个简单日历_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");
        }
    }
}

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

时间: 2024-10-23 03:29:45

c语言实现一个简单日历_C 语言的相关文章

分析C语言一个简单程序_C 语言

首先给大家一个简单的例子,让读者有个整体的认识,代码如下: #include <stdio.h> int main() { puts(""); return 0; } 函数的概念 先来看第4行代码,这行代码会在显示器上输出"".前面我们已经讲过,puts 后面要带( ),字符串也要放在( )中. 在C语言中,有的语句使用时不能带括号,有的语句必须带括号.带括号的称为函数(Function) . C语言提供了很多功能,例如输入输出.获得日期时间.文件操作等

中文字符-如何用C语言编写一个简单的输入法程序,要求可以输入汉字。

问题描述 如何用C语言编写一个简单的输入法程序,要求可以输入汉字. 不太清楚汉字在计算机中是如何存储的,想知道例如微软的智能ABC以及搜狗输入法是怎样实现拼音拼写下的汉字输入. 解决方案 首先要有一个汉字的编码库,比如GB2312编写的是拼音输入法的话,还要建立一个拼音与汉字对应的数据库然后根据用户输入的拼音,提示出对应的汉字(汉字的优先顺序由数据库决定,同时还可以学习该用户的使用习惯)如果输入法还支持智能联想输入的话,还要加入词库(也有优先级),这样可以根据前一个字来推断出下一个可能的字 解决

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

一个简单的c语言填空 初学者求助

问题描述 一个简单的c语言填空 初学者求助 如图所示 空格处该填什么呢?我填了ptr-stu<3 ptr++ 但是学校的系统说不对 解决方案 ptr < stu + 3; ptr++ 解决方案二: 楼上加一,应该是对的 解决方案三: c语言中指针减法是没有意义的

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

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

C语言指针入门学习面面观_C 语言

这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,

C语言实现去除字符串中空格的简单实例_C 语言

在网上看了些去除空格的代码,觉得都不是很简洁,就自己写代码实现它本着高效率,不使用额外存储空间的想法实现该功能去除空格一共有三种: 1.去除全部空格: 2.一种是去除左边空格: 3.去除右边空格  想去除左右两边空格,只要先去除左边再去除右边的就行了 以下是实现代码: /*去除字符串中所有空格*/ voidVS_StrTrim(char*pStr) { char *pTmp = pStr; while (*pStr != '/0') { if (*pStr != ' ') { *pTmp++ =

在C++中自定义宏的简单方法_C 语言

可以使用宏定义没有返回值的"函数".例如:   复制代码 代码如下: #define PrintMax(a, b) \   do \   { \     int x = a, y = b; \     printf("Max: %d\n", x > y ? x : y);\   } while (0) // ... PrintMax(3, 4);     这样的"函数"与真正意义上的函数有本质的区别,因为宏是一个编译前行为,仅仅是编译前对文

c语言实现词频统计的简单实例_C 语言

需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,还是挺费劲的. 2.定义一个包含单词和频率两个成员的结构体来统计词频(进行了动态分配内存,可以处理较大文本). 3.使用fopen函数读取指定的文档. 4.使用fgetc函数获取字符,再根据取得的字符是否是字母进行不同的处理. 5.采用快速排序法对统计结果进行排序. 5