使用C语言打印月历

使用C语言打印月历需要进行如下步骤:

第一步:确定需求

我们需要编写一个程序,根据用户输入的年份和月份,输出该月份的日历。用户输入的年份和月份需要通过命令行参数传递。

第二步:分析问题

要输出一个月份的日历,我们需要知道这个月有多少天,以及从哪一天开始。根据该月第一天是星期几,我们可以推算出每天在日历中的位置。因此,我们需要解决以下问题:

  • 根据年份和月份计算该月的天数
  • 计算该月第一天是星期几
  • 打印日历

第三步:解决问题

根据年份和月份计算该月的天数

我们可以使用一个数组记录每个月份的天数,然后根据用户输入的年份和月份,查找对应的天数。需要注意的是,闰年的2月份有29天。

int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap_year(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
int get_days(int year, int month) {
    if (month == 2 && is_leap_year(year)) {
        return 29;
    } else {
        return days[month - 1];
    }
}

计算该月第一天是星期几

我们可以使用Zeller's congruence公式来计算某一天是星期几。具体来说,公式如下:

h = (q + ((m + 1) * 26) / 10 + k + k / 4 + j / 4 + 5j) % 7

其中,

  • h是星期几,0表示星期日,1表示星期一,以此类推。
  • q是月份中的某一天。
  • m是月份,3表示3月,4表示4月,以此类推,1和2表示上一年的13月和14月。
  • k是年份的后两位数。
  • j是年份的前两位数。
int get_day_of_week(int year, int month) {
    int q = 1;
    int m = (month == 1 || month == 2) ? month + 12 : month;
    int k = year % 100;
    int j = year / 100;
    return (q + ((m + 1) * 26) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
}

打印日历

为了使输出的结果美观,我们可以使用表格来展示日历。可以使用printf函数打印表格的各个元素,其中需要使用%2d来保持数字的对齐。需要注意的是,输出的第一行需要打印该月份的名称,可以使用一个数组来保存月份的名称。

void print_calendar(int year, int month) {
    printf("    %s %d\n", months[month - 1], year);
    printf(" Su Mo Tu We Th Fr Sa\n");

    int days_of_month = get_days(year, month);
    int first_day_of_week = get_day_of_week(year, month);

    for (int i = 0; i < first_day_of_week; i++) {
        printf("   ");
    }

    for (int i = 1; i <= days_of_month; i++) {
        printf("%3d", i);
        if ((first_day_of_week + i) % 7 == 0) {
            printf("\n");
        }
    }
    if ((first_day_of_week + days_of_month) % 7 != 0) {
        printf("\n");
    }
}

第四步:使用示例

以下是一个简单的示例代码,可以编译运行后在命令行输入“./calendar 2021 5”来打印2021年5月的日历。

#include <stdio.h>

char *months[] = {"January", "February", "March", "April", "May", "June",
                  "July", "August", "September", "October", "November", "December"};

int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};

int is_leap_year(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

int get_days(int year, int month) {
    if (month == 2 && is_leap_year(year)) {
        return 29;
    } else {
        return days[month - 1];
    }
}

int get_day_of_week(int year, int month) {
    int q = 1;
    int m = (month == 1 || month == 2) ? month + 12 : month;
    int k = year % 100;
    int j = year / 100;
    return (q + ((m + 1) * 26) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
}

void print_calendar(int year, int month) {
    printf("    %s %d\n", months[month - 1], year);
    printf(" Su Mo Tu We Th Fr Sa\n");

    int days_of_month = get_days(year, month);
    int first_day_of_week = get_day_of_week(year, month);

    for (int i = 0; i < first_day_of_week; i++) {
        printf("   ");
    }

    for (int i = 1; i <= days_of_month; i++) {
        printf("%3d", i);
        if ((first_day_of_week + i) % 7 == 0) {
            printf("\n");
        }
    }
    if ((first_day_of_week + days_of_month) % 7 != 0) {
        printf("\n");
    }
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: calendar year month\n");
        return 1;
    }

    int year = atoi(argv[1]);
    int month = atoi(argv[2]);

    print_calendar(year, month);

    return 0;
}

以下是另一个示例代码,可以实现连续输出3个月的日历。注意,需要反复调用get_days和get_day_of_week函数。

#include <stdio.h>

char *months[] = {"January", "February", "March", "April", "May", "June",
                  "July", "August", "September", "October", "November", "December"};

int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};

int is_leap_year(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

int get_days(int year, int month) {
    if (month == 2 && is_leap_year(year)) {
        return 29;
    } else {
        return days[month - 1];
    }
}

int get_day_of_week(int year, int month) {
    int q = 1;
    int m = (month == 1 || month == 2) ? month + 12 : month;
    int k = year % 100;
    int j = year / 100;
    return (q + ((m + 1) * 26) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
}

void print_month(int year, int month) {
    printf("    %s %d\n", months[month - 1], year);
    printf(" Su Mo Tu We Th Fr Sa\n");

    int days_of_month = get_days(year, month);
    int first_day_of_week = get_day_of_week(year, month);

    for (int i = 0; i < first_day_of_week; i++) {
        printf("   ");
    }

    for (int i = 1; i <= days_of_month; i++) {
        printf("%3d", i);
        if ((first_day_of_week + i) % 7 == 0) {
            printf("\n");
        }
    }
    if ((first_day_of_week + days_of_month) % 7 != 0) {
        printf("\n");
    }
}

void print_calendar(int start_year, int start_month, int num_of_months) {
    for (int i = 0; i < num_of_months; i++) {
        print_month(start_year, start_month + i);
    }
}

int main() {
    print_calendar(2021, 5, 3);
    return 0;
}
阅读剩余 78%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用C语言打印月历 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 使用python获取cpu每秒的使用率

    下面是详细讲解“使用python获取cpu每秒的使用率”的完整攻略。 1. 确认获取CPU使用率的目标平台和Python版本 在开始之前,我们需要确认我们要获取CPU使用率的平台和Python版本。因为不同的平台和Python版本可能有不同的获取方式。例如,Windows和Linux下获取CPU使用率的方式可能就不一样,Python 2.x和Python 3…

    C 2023年5月23日
    00
  • C++实现校园导游系统

    C++实现校园导游系统攻略 系统概述 本系统利用C++实现了校园导游的功能,用户可以在系统中选择要参观的景点,并得到相关的信息如景点介绍、地址、开放时间等。同时,用户还可以在地图上查看各个景点的位置和路线,方便用户进行导览。 功能模块 本系统主要分为以下模块: 景点数据读入模块,用于从文件中将景点信息读入内存。 景点信息显示模块,用于在控制台上显示景点信息。…

    C 2023年5月23日
    00
  • C语言从零探索函数的知识

    C语言从零探索函数的知识 1. 函数基础 1.1 函数的作用与定义 函数是编程语言中非常重要的一部分,它可以把复杂的逻辑代码封装成简单易用的组件,方便我们进行调用和管理。一个完整的函数定义一般包含函数名、参数列表以及函数体。例如: int add(int a, int b) { return a + b; } 1.2 函数的调用与返回值 在函数定义好之后,我…

    C 2023年5月23日
    00
  • Photoshop 打造溶液字母文字特效

    Photoshop 打造溶液字母文字特效 前言 此篇攻略将详细介绍如何利用 Photoshop 实现溶液字母文字特效。通过本篇文章的讲解,您将掌握以下技能: 制作基础文字效果 制作溶液材质效果 制作混合效果,完成溶液字母文字特效 准备工作 在开始制作溶液字母文字特效之前,请确保您已经安装好了最新版的 Photoshop,并准备好以下素材: 背景图片 字母素材…

    C 2023年5月22日
    00
  • 短视频脚本怎么写?短视频脚本写作技巧盘点

    短视频脚本怎么写?短视频脚本写作技巧盘点 什么是短视频脚本? 短视频脚本是指给短视频拍摄提供指导和约束的文本,包括了短视频中需要讲述的主要内容、场景、情节等。 短视频脚本写作技巧 1. 讲述一个故事 短视频不同于长视频,它需要在极短的时间内吸引观众的注意力,讲述一个吸引人的故事是非常重要的。编写短视频脚本时,需要在极短的时间内安排好完整的情节,让观众能够很快…

    C 2023年5月22日
    00
  • C语言 字符串和字符串函数

    C语言字符串和字符串函数 在C语言中,字符串是由一系列字符组成的字符数组。C语言中的字符串是以空字符(‘\0’)结尾的字符数组。字符串常用于存储文本,比如打印、读取和传输文件内容等操作。C语言提供了许多字符串函数以简化字符串的操作和处理。 字符串的基本操作 字符串的定义和赋值 在C语言中,定义字符串有以下两种方式: char str1[6] = {‘h’, …

    C 2023年5月9日
    00
  • 新手向超详细的C语言实现动态顺序表

    当初步学习C语言之后,常常将动态内存管理作为初学者的第一个难点。本文将向新手讲解实现动态顺序表的过程,以及如何使用动态内存管理API来解决动态分配和释放内存的问题。本攻略使用C语言编写,通过动态分配内存的方式来模拟实现动态顺序表。 实现步骤 1. 定义数据结构 首先,需要定义一个结构体,来表示这个动态顺序表的数据结构。结构体中至少需要包含如下信息:- 存储元…

    C 2023年5月23日
    00
  • 利用c++编写简易版2048小游戏

    利用C++编写简易版2048小游戏攻略 1. 程序概述 2048是一款经典的数字游戏,玩家在4*4的棋盘上操作数字合并,最终得到2048为胜利。我们可以使用C++编写一个简易版的2048小游戏,让用户可以通过控制台进行游戏。 2. 实现步骤 2.1 定义游戏类 我们首先需要定义一个游戏管理类,用于管理游戏的所有操作。在类的定义中包含如下属性和方法: 2.1.…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部