简单日历

​ 主要目的是学习函数模块划分,成品大概是这样,加了一些花里胡哨的东西(/▽\)

分三个模块,主函数.c 显示.c 计算.c 与.h 文件

有两种实现方式,区别在于是否以数组在模块之间传递。

第一种-用数组进行保存日历页

1.主函数.c

输入信息并控制

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "calendar1.h"
#include <stdbool.h>
#include <string.h>
#define ON 1
#define OFF 0 int main( )
{
int year = 2019;
int month = 7;
char op[10] = { 0 };
int button = 1;
do
{
calen_cal(year,month);
calen_display(year, month,button);
scanf(" %s", op);
if( !strcmp(op, "ON") ) {
button = 1; continue;
}
if( !strcmp(op, "OFF") ) {
button = 0; continue;
}
if( *op == 'U' || *op == 'u' )
{
if( month == 1 )
{
--year;
month = 12;
}
else --month;
continue;
}
if( *op == 'D' || *op == 'd' )
{
if( month == 12 )
{
++year;
month = 1;
}
else ++month;
continue;
}
if( *op == 'R' || *op == 'r' )break; printf("请按以下格式输入:2019-7\n");
int temY, temM;
scanf("%d-%d", &temY, &temM);
if( is_right(temY, temM) )
{
year = temY; month = temM;
}
} while( true );
}
2.计算函数相关.c

计算( •̀ ω •́ )✧

​```c
#include <stdio.h> #include "calendar.h"
int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; int is_leepyear(int year)//是否为闰年
{
return ( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 );
}
int is_right(int year, int mon) //输入的年份或月份是否正确
{
return ( year > 1900 && mon <= 12 && mon >= 1 );
}
int first_day_index(int year, int mon)//返回该月第一天的下标 0-6
{
if( is_leepyear(year) )months[1] = 29;
else months[1] = 28; int days = 0;
for( int i = mon - 1; i > 0; --i )
{
days += months[i - 1];
}
for( int i = year - 1; i >= 1900; --i )
{
if( i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ) days += 366;
else days += 365;
}
return days % 7;
} int Last_days(int year, int mon)// 返回上个月最后一天的天数,用来排日历中的上一月信息
{
if( mon == 1 )return 31;
else return months[mon - 2];
} void calen_cal(int *calen,int year,int mon,int index)//将排好的信息放到数组中
{
int Last_day = Last_days(year, mon);
int count = 0;
//排上个月
for( int i = 1; i <= index; ++i, ++count )
{
calen[count]=Last_day - index + i;
}
//排本月
for( int i = 1; i <= months[mon - 1]; ++i, ++count )
{
calen[count] = i;
}
//排下月
for( int i = 1; count < 42; ++i, ++count )
{
calen[count] = i;
}
} ​```
3. 打印显示.c

花里胡哨的显示

​```c
#include <stdio.h>
#include <Windows.h>
#include "calendar.h"
void calen_print(int *calen, int button, int index)
{
//打印上一月
int i = 0;
for( i = 1; i <= index; ++i )
{
if( button == 1 )printf("%5d", calen[i - 1]);
else printf(" ");
if( i % 7 == 0 )putchar(10);
}
//打印本月
for( ; calen[i - 1] != 1; ++i )
{
printf("%5d", calen[i - 1]);
if( i % 7 == 0 )putchar(10);
}
//打印下一月
for( ; i <= 42; ++i )
{
if( button == 1 )printf("%5d", calen[i - 1]);
else printf(" ");
if( i % 7 == 0 )putchar(10);
}
}
void calen_ui(int *calen, int button, int index,int year,int mon)
{
system("cls");
//这块是更改控制台颜色
srand(time(NULL));
int rand_color;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
printf("%d-%d U/D\n", year, mon); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
printf("Mon Tue Wed Thu Fri Sat Sun\n"); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
printf("--------------------------------------\n"); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
calen_print(calen, button,index); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
printf("--------------------------------------\n"); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color);
printf("U/u 向上翻页,D/d向下翻页,R/r退出,ON/OFF是否显示其他天数,输入其他进入日期跳转模式\n"); rand_color = rand( ) % 14;
SetConsoleTextAttribute(hConsole, rand_color); } ​```
4. 头文件.h

头文件声明

​```c
void calen_ui(int *calen, int button, int index, int year, int mon);
void calen_cal(int *calen, int year, int mon,int index);
int first_day_index(year, mon);
​```

用c写的简单的日历(学习模块划分)的更多相关文章

  1. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  2. js写一个简单的日历

    思路:先写一个结构和样式,然后写本月的时间,之后计算上下月份的关系 <!DOCTYPE html> <html lang="en"> <head> ...

  3. 使用SSI框架写的简单Demo(查询模块)

    在网上看到好多个版本,自己有时间索性就写个Demo记录下整个框架的逻辑流程: 1.首先拷贝整个框架所需要的jar包到WEB-INF/lib包下(这个网上都可以搜到的) 2.配置文件的配置, 2.1.在 ...

  4. 【UI插件】简单的日历插件(下)—— 学习MVC思想

    前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...

  5. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  6. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  7. 自己用js写的两个日历控件

    前一阵写了两个日历控件,做了简单的封装,发出来共朋友们参考. 第一个日历控件,条状的日历. (使用方法:调用initBarTime(id,evn),第一个参数是要渲染div的id,第二个参数是点击日期 ...

  8. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  9. jstorm开发指南-写个简单的jstorm应用

    jstorm开发指南-写个简单的jstorm应用 发表于 2015-07-18   |   分类于 大数据   |   暂无评论 jstorm 是阿里巴巴开源的基于storm采用Java重写的一套分布 ...

随机推荐

  1. ES:PB级别的大索引如何设计

    一.单个大索引的缺陷 如果每天亿万+的实时增量数据呢,基于以下几点原因,单个索引是无法满足要求的: 1.存储大小限制维度 单个分片(Shard)实际是 Lucene 的索引,单分片能存储的最大文档数是 ...

  2. Flume 实战练习

    前期准备 了解Flume 架构及核心组件 Flume 架构及核心组件 Source : 收集(指定数据源从哪里获取) Channel : 聚集 Sink : 输出(把数据写到哪里去) 学习使用 Flu ...

  3. IDEA系列(九)Intellij IDEA界面介绍 - 哲也的博客

    原文出处:https://github.com/judasn/IntelliJ-IDEA-Tutorial 首次打开 重点说明: IntelliJ IDEA 是没有类似 Eclipse 的工作空间的概 ...

  4. Runtime常见使用

    一些语法 更改对象的类/获取对象的类 1234 CustomClass *class1 = [[CustomClass alloc]init];Class aclass =object_setClas ...

  5. Nginx502,504和499错误解决方案

    499错误解决方案 499错误是什么?让我们看看NGINX的源码中的定义: ngx_string(ngx_http_error_495_page), /* 495, https certificate ...

  6. 人工智能VS投资者:股票市场上谁的胜算更高?

    人工智能研究历史渊源,当人工智能与资本投资,尤其是股票投资相结合或许听起来有些异想天开,但正如科幻作家William Gibson所言:"未来已经到来,只是分布不均." 在股票市场 ...

  7. python django 之 django自带的分页

    1. 例1: 基础的分页    1). vim app01/views.py        def users(request):            from django.core.pagina ...

  8. SpringBoot入门系列(三)资源文件属性配置

    前面介绍了Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据.不清楚的朋友可以看看之前的文章:https://www.cnbl ...

  9. Ubuntu中VMware tools的安装步骤

    按照下面的步骤,轻松解决!! 1.点击导航栏中的虚拟机,下面的安装VMware tools 2.点击桌面上的光盘,进入后,将tar.gz文件复制到桌面,然后右击提取到此处: 3.在桌面打开终端,cd到 ...

  10. JavaScript实现树结构(一)

    JavaScript实现树结构(一) 一.树结构简介 1.1.简单了解树结构 什么是树? 真实的树: 树的特点: 树一般都有一个根,连接着根的是树干: 树干会发生分叉,形成许多树枝,树枝会继续分化成更 ...