feat: 更新

This commit is contained in:
lixworth 2024-12-07 16:23:34 +08:00
parent 025242f1a4
commit 089bcc92a1
52 changed files with 15173 additions and 1 deletions

View File

@ -1,5 +1,8 @@
# UIT2024 项目考核 万年历
文件夹下已存放UIT2023的部分日历代码,`stu_2024` 下存放的均是2024级所有人的代码。
由于环境不同,代码仅供参考!
### 考核要求
制作使用 C/C++ 编写一个命令行应用 万年历,有如下功能:
@ -15,4 +18,3 @@
截止日期2024年11月17日周日
注意事项:**原则上禁止代码抄袭,我们将参考程序实际运行情况与代码内容进行提问!**

350
lcm.c Normal file
View File

@ -0,0 +1,350 @@
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
void one(int year);//查询对应年份的日历,要求可双列输出可单列输出
void two(int year, int month, int day);//查询对应日期的星期
void three(int year);//查询对应年份是否为闰年
int main() {
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
int a;
int year, month, day;
while (scanf("%d", &a) != EOF) {
system("cls");
if (a == 1) {
printf("请输入年份:");
while (scanf("%d", &year) != EOF) {
system("cls");
if (year > 0) {
one(year);
break;
}
else {
printf("请重新输入:");
}
}
}
else if (a == 2) {
printf("请输入日期(年 月 日):");
while (scanf("%d %d %d", &year, &month, &day) != EOF) {
system("cls");
if (year > 0 && month > 0 && month < 13) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
if (day > 0 && day <= 31) {
two(year, month, day);
break;
}
else
printf("请重新输入日期(年 月 日):");
}
else if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 0 && day <= 30) {
two(year, month, day);
break;
}
else
printf("请重新输入日期(年 月 日):");
}
else if (month == 2) {
if (!(year % 4) && (year % 100)) {
if (day > 0 && day <= 29) {
two(year, month, day);
break;
}
else
printf("请重新输入日期(年 月 日):");
}
else {
if (day > 0 && day <= 28) {
two(year, month, day);
break;
}
else
printf("请重新输入日期(年 月 日):");
}
}
}
else {
printf("请重新输入日期(年 月 日):");
}
}
}
else if (a == 3) {
printf("请输入年份:");
while (scanf("%d", &year) != EOF) {
system("cls");
if (year > 0) {
three(year);
break;
}
else {
printf("请重新输入:");
}
}
}
else if (a == 4) {
return 0;
}
else {
printf("请重新输入:");
}
}
}
void one(int year) {
int a[13] = { 0,31,0,31,30,31,30,31,31,30,31,30,31 };
if (!(year % 4) && (year % 100)) {
a[2] = 29;
}
else {
a[2] = 28;
}
int g = ((year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;
g++;
printf("1.单列输出\n");
printf("2.双列输出\n");
int q;
while (scanf("%d", &q) != EOF) {
system("cls");
if (q == 1 || q == 2) {
break;
}
else {
printf("请重新输入:");
}
}
if (q == 1) {
if (year != 1582) {
if (year < 1582)
g += 5;
if (g >= 7)
g %= 7;
printf("\n%d年\n", year);
int m = 1;
while (m <= 12) {
printf("\n%d月\n", m);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
for (int j = 0, k = 1;k <= a[m];j) {
if (j == g) {
g++;
j++;
printf("%d\t", k++);
if (j == 7) {
j = 0;
g = 0;
printf("\n");
}
}
else {
j++;
printf("\t");
}
}
printf("\n");
m++;
}
}
else {
printf("\n%d年", year);
int m = 1;
while (m <= 12) {
printf("\n%d月\n", m);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
for (int j = 0, k = 1;k <= a[m];j) {
if (j == g) {
g++;
j++;
if (m == 10 && k == 5)
k = 15;
printf("%d\t", k++);
if (j == 7) {
j = 0;
g = 0;
printf("\n");
}
}
else {
j++;
printf(" \t");
}
}
printf("\n");
m++;
}
}
}
else {
if (year < 1582) {
g += 5;
}
if (g >= 7) {
g %= 7;
}
int f = (g + 31) % 7;
int y = f;
printf("%d年\n", year);
int m = 1;
while (m <= 12) {
int n = m + 1;
printf("%d月\t\t\t\t\t\t\t\t%d月\n", m, n);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t\t星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
int i = 1, j = 1;
for (i = 1, j = 1;i <= a[m] || j <= a[n];i, j) {
for (int k = 0;1;k) {
if (k == g) {
k++, g++;
if (i <= a[m])
printf("%d\t", i++);
else
printf("\t");
if (k == 7) {
k = 0, g = 0;
break;
}
}
else {
printf("\t");
k++;
}
}
printf("\t");
for (int k = 0;1;k) {
if (k == f) {
k++, f++;
if (year == 1582 && n == 10 && j == 5) {
j = 15;
}
if (j <= a[n])
printf("%d\t", j++);
else
printf("\t");
if (k == 7) {
k = 0, f = 0;
break;
}
}
else {
printf("\t");
k++;
}
}
printf("\n");
}
if (year == 1582 && m == 9) {
g = (y + a[n] - 10) % 7;
f = (g + a[n + 1]) % 7;
y = f;
}
else {
g = (y + a[n]) % 7;
f = (g + a[n + 1]) % 7;
y = f;
}
m += 2;
}
}
system("pause");
system("cls");
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("\n\n请输入您接下来想要进行的操作:");
}
void two(int year, int month, int day) {
char n[7];
char a[7];
int g, i, k, r = 0;
g = ((year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;
if (year != 1582) {
if (year < 1582)
g += 5;
if (g >= 7)
g %= 7;
}
if (year == 1582 && month == 10) {
if (day > 4 && day < 15) {
system("cls");
printf("由于一些特殊原因从1582年10月5日到1582年10月14日这十天被删去所以请重新输入\n");
system("Pause");
system("cls");
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("\n\n请输入您接下来想要进行的操作:");
return ;
}
}
switch (0)
{
case 0:a[0] = 's';
case 1:a[1] = 'm';
case 2:a[2] = 't';
case 3:a[3] = 'w';
case 4:a[4] = 'x';
case 5:a[5] = 'f';
case 6:a[6] = 'a';
}
for (i = 0, k = g;i < 7;i++, g++)
{
if (g == 7)
g = 0;
n[i] = a[g];
}
switch (month - 1)
{
case 12:r += 31;
case 11:r += 30;
case 10:r += 31;
case 9:r += 30;
case 8:r += 31;
case 7:r += 31;
case 6:r += 30;
case 5:r += 31;
case 4:r += 30;
case 3:r += 31;
case 2:r += 28;
case 1:r += 31;
}
if (!(year % 4) && (year % 100) && (month > 2))
r++;
r += day;
k = r % 7;
printf("%d年%d月%d日是", year, month, day);
switch (n[k])
{
case 's':printf("星期日\n");break;
case 'm':printf("星期一\n");break;
case 't':printf("星期二\n");break;
case 'w':printf("星期三\n");break;
case 'x':printf("星期四\n");break;
case 'f':printf("星期五\n");break;
case 'a':printf("星期六\n");break;
}
system("pause");
system("cls");
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("\n\n请输入您接下来想要进行的操作:");
}
void three(int year) {
if ((year % 4 == 0) && (year % 100) != 0) {
printf("\n%d年是闰年\n\n", year);
}
else {
printf("\n%d年不是闰年\n\n", year);
}
system("pause");
system("cls");
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("请输入您接下来想要进行的操作:");
}

274
lix.cpp Normal file
View File

@ -0,0 +1,274 @@
//
// Created by Worth Lix on 2023/11/26 19:13.
//
#include <cstdio>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define RESET "\033[0m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define INFO (std::cout << RESET)
#define WARN (std::cout << YELLOW)
#define ERROR (std::cout << RED)
#define SUCCESS (std::cout << GREEN)
#define LOG_CLEAR (std::cout << "\033c")
vector<string> stringStream;
int get_week(int y, int m, int d) {
if (m == 1 || m == 2) {
m += 12;
y--;
}
return ((d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7) + 1;
}
int check_leap_year(int year) { return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)); }
int get_month_days_count(int year, int month) {
// 1 3 5 7 8 10 12
if (month == 2) {
if (check_leap_year(year)) {
return 29;
} else {
return 28;
}
}
int day31[] = {1, 3, 5, 7, 8, 10, 12};
for (int i = 0; i <= 6; ++i) {
if (day31[i] == month) {
return 31;
}
}
return 30;
}
void menu() {
LOG_CLEAR;
time_t now = time(0);
struct tm *local = localtime(&now);
printf("现在的时间是: %d/%02d/%02d %02d:%02d:%02d\n\n菜单:\n", 1900 + local->tm_year, 1 + local->tm_mon,
local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec);
WARN << "1.查询对应年份的日历" << endl;
WARN << "2.查询对应日期的星期" << endl;
WARN << "3.查询对应年份是否为闰年" << endl;
WARN << "4.退出" << endl;
INFO << endl << "请输入菜单编号(1-4): ";
}
void query_year() {
cout << "请输入要查询的年份:" << endl;
int query;
cin >> query;
LOG_CLEAR;
cout << "请选择想要输出的日历格式:" << endl;
cout << "1.竖向输出:" << endl;
cout << "2.2*6格式横向输出:" << endl;
int input;
cin >> input;
string cache;
string echo_month[100][100] = {};
int echo_month_line;
switch (input) {
case 1:
LOG_CLEAR;
if (query == 1582) {
ERROR << "不支持该年份的查询! 震惊派蒙一整年.jpg" << endl;
break;
}
SUCCESS << "====================== " << query << "年 ======================" << endl;
for (int i = 1; i <= 12; ++i) {
cout << RED << i << "" << endl;
cout << RESET << "周日\t周一\t周二\t周三\t周四\t周五\t周六" << endl;
int start = get_week(query, i, 1);
if (start < 7) {
for (int j = 0; j < start; ++j) { cout << "\t"; }
}
for (int j = 1; j <= get_month_days_count(query, i); ++j) {
printf("%02d\t", j);
if (get_week(query, i, j) == 6) {
printf("\n");
}
}
printf("\n\n");
}
break;
case 2:
LOG_CLEAR;
if (query == 1582) {
ERROR << "不支持该年份的查询! 震惊派蒙一整年.jpg" << endl;
break;
}
SUCCESS << "====================== " << query << "年 ======================" << endl;
for (int i = 1; i < 12; i = i + 2) {
cache += RED + to_string(i) + "" + "\t\t\t\t\t\t\t\t" + to_string(i + 1) + "";
stringStream.push_back(cache);
cache.clear();
cache = cache + RESET + "周日\t周一\t周二\t周三\t周四\t周五\t周六" +
"\t\t周日\t周一\t周二\t周三\t周四\t周五\t周六";
stringStream.push_back(cache);
cache.clear();
int start = get_week(query, i, 1);
if (start < 7) {
for (int j = 0; j < start; ++j) { cache += "\t"; }
}
echo_month_line = 0;
for (int j = 1; j <= get_month_days_count(query, i); ++j) {
if (j < 10) {
cache += to_string(0) + to_string(j) + "\t";
} else {
cache += to_string(j) + "\t";
}
if (get_week(query, i, j) == 6) {
echo_month[i][echo_month_line] = cache;
cache.clear();
echo_month_line++;
}
if (j == get_month_days_count(query, i)) {
int week = get_week(query, i, j);
week = week == 7 ? 0 : week;
for (int k = 0; k < 7 - week; ++k) {
if (k == 7 - week - 1) {
cache + " ";
continue;
}
cache += " \t";
}
echo_month[i][echo_month_line] = cache;
cache.clear();
}
}
echo_month_line = 0;
start = get_week(query, i + 1, 1);
if (start < 7) {
for (int j = 0; j < start; ++j) { cache += "\t"; }
}
for (int j = 1; j <= get_month_days_count(query, i + 1); ++j) {
if (j < 10) {
cache += to_string(0) + to_string(j) + "\t";
} else {
cache += to_string(j) + "\t";
}
if (get_week(query, i + 1, j) == 6 || j == get_month_days_count(query, i + 1)) {
echo_month[i + 1][echo_month_line] = cache;
cache.clear();
echo_month_line++;
}
}
cache.clear();
for (int j = 0; j < 6; ++j) {
if (echo_month[i][j] == "") {
cache = " \t \t \t \t \t \t \t\t" + echo_month[i + 1][j];
} else {
cache = echo_month[i][j] + "\t" + echo_month[i + 1][j];
}
stringStream.push_back(cache);
cache.clear();
}
stringStream.push_back("\n");
}
for (unsigned int i = 0; i < stringStream.size(); ++i) { cout << stringStream[i] << endl; }
stringStream.clear();
break;
default:
cout << 123 << endl;
break;
}
}
void query_week() {
cout << "请输入要查询的日期: (年月日才用空格间隔)" << endl;
int y, m, d;
cin >> y >> m >> d;
if (y == 1582) {
ERROR << "不支持该年份的查询! 震惊派蒙一整年.jpg" << endl;
} else {
int week = get_week(y, m, d);
switch (week) {
case 1:
SUCCESS << "周一" << endl;
break;
case 2:
SUCCESS << "周二" << endl;
break;
case 3:
SUCCESS << "周三" << endl;
break;
case 4:
SUCCESS << "周四" << endl;
break;
case 5:
SUCCESS << "周五" << endl;
break;
case 6:
SUCCESS << "周六" << endl;
break;
case 7:
SUCCESS << "周日" << endl;
break;
default:
break;
}
}
}
void query_leap_year() {
cout << "请输入要查询的年份:" << endl;
int year;
cin >> year;
if (check_leap_year(year)) {
SUCCESS << "闰年" << endl;
} else {
SUCCESS << "平年" << endl;
}
}
int main() {
system("chcp 65001");
int run = 1;
while (run) {
menu();
int command;
cin >> command;
switch (command) {
case 1:
LOG_CLEAR;
query_year();
system("pause");
break;
case 2:
LOG_CLEAR;
query_week();
system("pause");
break;
case 3:
LOG_CLEAR;
query_leap_year();
system("pause");
break;
case 4:
run = 0;
break;
default:
ERROR << "菜单错误: 后面的区域请以后再探索吧!" << endl;
system("pause");
break;
}
}
return 0;
}

View File

@ -0,0 +1,264 @@
#include "stdio.h"
/*判断闰年*/
int leap(int year)
{
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
}
/*获取某月的天数*/
int ji_suan_tian_shu(int month, int year)
{ if(year==1582&&month==10)
{
return 21;
}
if (month == 2) {
return leap(year)? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
/*计算1月1日是星期几*/
int ji_suan_di_yi_tian(int year)
{
int K=year%100;
int J=year/100;
if(year<1582)
{
return (1+(13*(1+1))/5+K+K/4+5-J)%7;
}
else
{
return (1+(13*(1+1))/5+K+K/4+J/4+5*J)%7;
}
}
/*输出日历的星期单列*/ void xing_qi()
{
printf(" 日 一 二 三 四 五 六\n");
}
/*处理1582年单列*/void chu_li_1582_nian_10_yue_de_ri_li(int *di_yi_tian)
{
for (int i=0;i<*di_yi_tian;i++)//在前面加空格
{
printf("");
}
for (int day=1;day<=4;day++)//输出1到4号
{
printf("%5d",day);
if ((*di_yi_tian+day-1)%7==6)//到了周六换行
{
printf("\n");
}
}
int x=5;
for (int day=15;day<=31;day++)//输出15号及之后
{
if ((*di_yi_tian+x-1)%7==0)//一周换行
{
printf("\n");
}
printf("%5d",day);
x++;
}
printf("\n");
//*di_yi_tian=(*di_yi_tian+21)%7;
}
/*输出某月的日历单列*/void shu_chu_yue_ri_li(int month, int year) {
int zhe_ge_yue_you_duo_shao_tian = ji_suan_tian_shu(month, year);
int zhe_ge_yue_di_yi_tian = ji_suan_di_yi_tian(year);
for (int i = 1; i < month; i++) //计算某月前面的月有多少天
{
zhe_ge_yue_di_yi_tian+= ji_suan_tian_shu(i, year);
}
zhe_ge_yue_di_yi_tian%= 7;//计算前面月的最后一天是周几
xing_qi();
/*输出前面的空格*/for (int i = 0; i <zhe_ge_yue_di_yi_tian ; i++) {
printf(" ");
}
/*处理1582年10月少的那10天*/if (year == 1582 && month == 10)
{
chu_li_1582_nian_10_yue_de_ri_li(&zhe_ge_yue_di_yi_tian);
//两个函数结合准确输出1582年10月的月历
}
else {
// 输出其余日期
for (int i = 1; i <=zhe_ge_yue_you_duo_shao_tian; i++) {
printf("%5d", i);
if ((zhe_ge_yue_di_yi_tian + i) % 7 == 0) {
printf("\n");
}
}
}
if ((zhe_ge_yue_di_yi_tian + zhe_ge_yue_you_duo_shao_tian) % 7!= 0) {
printf("\n");//当前月1号星期加上有多少天判断是不是整的周数
}//判断该月最后一行是不是完整的
}
/*输出一年的日历*/ void shu_chu_ri_li(int year)
{
for (int month = 1; month <= 12; month++)
{
printf(" %d月\n", month);
shu_chu_yue_ri_li(month, year);
printf("\n");
}
}
/*输出一年的日历双列*/
void shu_chu_ri_li_2(int year)
{
int kai_shi_day[12];
kai_shi_day[0]=ji_suan_di_yi_tian(year);//储存开始日期
for (int month=1;month<12;month++) //计算每月起始星期几
{
kai_shi_day[month]=(kai_shi_day[month-1]+ji_suan_tian_shu(year,month))%7;//将每个月起始星期储存
}
const char *yue_fen[]={"1月", "2月", "3月", "4月", "5月", "6月","7月", "8月", "9月", "10月", "11月", "12月"};
for (int i = 0; i < 6; i++) //每行两个月
{
printf("\n");
for (int j = 0; j < 2; j++) //两个月的标题
{
int month = i * 2 + j + 1;
printf(" %d %s ",year,yue_fen[month-1]);
}
printf("\n");
for (int j = 0; j < 2; j++)//星期标题
{
printf("日 一 二 三 四 五 六 ");
}
printf("\n");
int zui_duo_days[2] = { ji_suan_tian_shu(year, i * 2 + 1), ji_suan_tian_shu(year, i * 2 + 2) };//两个月的最大天数
int kai_shi_days[2] = { kai_shi_day[i * 2], kai_shi_day[i * 2 + 1] };//起始星期几
//打印日期
int day[2] = {1, 1}; //每个月的当前日期
int sheng_yu_days = 1; //是否有剩余日期
while (sheng_yu_days)//判断是否有剩余
{
sheng_yu_days = 0;
for (int j = 0; j < 2; j++)
{
if (day[j] == 1)//打印空格
{
for (int k = 0; k < kai_shi_days[j]; k++)
{
printf(" ");
}
}
while (day[j] <= zui_duo_days[j] && ((day[j] + kai_shi_days[j] - 1) % 7) != 6)//打印日期
{
printf("%2d ",day[j]++);
sheng_yu_days=1;//设置为1表示未打印完
}
if (day[j] <= zui_duo_days[j])//最后一个日期,换行并进入下一个月
{
printf("%2d ",day[j]++);
sheng_yu_days=1;
} else
{
printf(" "); //填充空格
}
printf(" "); //每月之间的间隔
}
printf("\n");
}
}
}
int main()
{
int x;
for(;x!=4;)
{
printf(" menu\n ");
printf("1.判断是否是闰年\n");
printf("2.查询这一年的某一天是周几\n");
printf("3.输出这一年的日历\n");
printf("4.退出程序\n");
printf("扣1,2,3,4来选择功能\n");
scanf("%d",&x);
if(x>4)
{
printf("请从1 2 3 4中选择输入\n");
}//if的括号
else if(x==1)
{
int year;
printf("请输入年份:\t");
scanf("%d",&year);
if((year%4==0&&year%100!=0)||year%400==0)
printf("是闰年\n");
else
printf("是平年\n");
}
else if(x==2)
{
int year;
int month;
int day;
printf("请输入日期 (输入格式为 年 月 日):");
scanf("%d %d %d",&year,&month,&day);
if(year==1582&&month==10&&day>4&&day<15);
printf("不存在这一天,请重新输入 (输入格式为 年 月 日):\t");
scanf("%d %d %d",&year,&month,&day);
const char *chu_chun_xing_qi[]={"","","","","","",""};
int K=year%100;
int J=year/100;
int w;
if(year<1582||(year==1582&&(month<10||(month==10&&day<=4))))
{
w=(day+(13*(month+1))/5+K+K/4+5-J)%7;
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
}
else
{
w=(day+(13*(month+1))/5+K+K/4+J/4+5*J)%7;
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
}
}
else if(x==3)
{
int year;
printf("请输入年份:\t");
scanf("%d",&year);
printf("扣1 2选择\n1.单列\n2.双列\t");
int c;
scanf("%d",&c);
if(c==1)
{
shu_chu_ri_li(year);
}
else if(c==2)
{
shu_chu_ri_li_2(year) ;
}
}
}//for的括号
return 0;
}

View File

@ -0,0 +1,635 @@
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<Windows.h>
#include<string>
#include<math.h>
#include<stdlib.h>
using namespace std;
//1.展示模块,需要将内容展示出来,告诉别人这是万年历
//2.输入模块,将数字展示出来
//3.检查模块,检查输入是否正确,防止小孩儿乱输入
//4.弹窗{需要将日历展示出来首先将每一年排好顺序其次注意1582年有问题
//随后,将周六周天的日期,表示为红色
// }
// 换行问题()
// 分割问题()
//
//5.展示结束,国旗
int mo1(void);
int mo2(int n);
void mo3(int n);
int mo4(void);
void mo5(int n);
void mo6(int n);
void aixin(void);
int zhanshi(void);
int dan1(int n);
void dan2(int n);
void xingqi(int aa);
void color(short x) //自定义函根据参数改变颜色
{
if (x >= 0 && x <= 15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
int bao(int n)
{
if (n > 1000000) {
cout << "输入越界,请重新输入"<<endl;
return zhanshi();
}
else cout << "输入成功" << endl;
}
int zifu(string a)
{
int n = 0;
if (a.size() > 4) {
cout << "输入错误,请重新输入" << endl;
return zhanshi();
}
else
{
for (int i = 0; i < a.size(); i++)
{
if (a[i] < '0' || a[i]>'9')
{
cout << "输入错误,请重新输入" << endl;
return zhanshi();
}
else
{
int p = a[i] - '0';
p = pow(10, a.size() - i - 1) * p;
n += p;
}
}
return n;
}
}
int zhanshi(void)
{
string n;
int i = 0;
int a = 0;
char b;
color(6);
cout << "Hello young people!!!" << endl;
cout << "------------------------------------------------------------------------------------------------------------------------" << endl;
cout << "------------------------------------------------------------------------------------------------------------------------" << endl;
cout << "------------------------------------------------------------------------------------------------------------------------" << endl;
cout << "This is a perpetual calendar!!!" << endl;
color(7);
cout << "它有很多功能" << endl;
color(3);
cout << "1.告诉你这一天是星期几" << endl;//完成
cout << "2.今天是否是一个适合表白的日子" << endl;//完成
cout << "3.输入某年的月历" << endl;
cout << "4.展示某一年的日历" << endl;
cout << "5.判断某一年是否为闰年" << endl;//完成
color(12);
cout << "如果程序弹出,说明输入错误" << endl;
color(7);
cout << "现在 请输入您需要的服务" << endl;
do {
Sleep(100);
//scanf("%c", &n);
cin >> n;
//getchar();
if (n.size() > 1) {
cout << "输入不符合规范,请重新输入" << endl;
return zhanshi();
}
else {
b = n[0];
if (b < 48 || b > 53) {
cout << "请重新输入!!!" << endl;
cout << "重新输入前,请输入换行" << endl;
i++;
}
if (i == 20) {
cout << "不会玩别玩了!!!" << endl;
break;
}
if (getchar() == '\n') {
a++;
}
if (a > 5) return 0;
}
} while (b < 48 || b>53);
switch (b-'0') {
case 1: mo1(); break;
case 2: mo2(b); break;
case 3: mo6(b); break;
case 4: mo4(); break;
case 5: mo5(b); break;
default: return 0;
}
return 1;
}
int mo1(void)
{
int w;
string yy;
string mm;
string dd;
int ri[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int y, m, d;
cout << "请输入年 月 日" << endl;
cin >> yy;
y = zifu(yy);
cin >> mm;
m = zifu(mm);
cin >> dd;
d = zifu(dd);
if (y == 1582 && m == 10) {
if (d < 15 && d>4) {
cout << "请重新输入" << endl;
return mo1();
}
}
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
ri[2] += 1;
}
if (y < 0 || y>10000 || m < 1 || m>12 || d < 1 || d > ri[m]) {
return mo1();
}
if (y == 1582 && m == 10 && d > 4) {
if (d > 4 && d < 15) {
cout << "请重新输入"<<endl;
return mo1();
}
d -= 10;
}
if (m == 1 || m == 2) {
m += 12;
y--;
}
w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
switch (w)
{
case 1:cout << "星期一[Monday]" << endl; break;
case 2:cout << "星期二[Tuesday]" << endl; break;
case 3:cout << "星期三[Wednesday]" << endl; break;
case 4:cout << "星期四[Thursday]" << endl; break;
case 5:cout << "星期五[Friday]" << endl; break;
case 6:cout << "星期六[Saturday]" << endl; break;
case 0:cout << "星期天[Sunday]" << endl; break;
}
return 0;
}
int mo2(int n)
{
string aa;
string mm;
string pp;
int a;
int m;
int p;
int ri[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
cout << "请输入年 月 日" << endl;
cin >> aa;
a=zifu(aa);
bao(a);
cin >> mm;
m = zifu(mm);
cin >> pp;
p = zifu(pp);
bao(m);
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) {
ri[2] += 1;
}
if (m > 12 || m < 1) {
cout << "请重新输入" << endl;
return mo2(m);
}
bao(p);
if (p > ri[m] || p < 1) {
cout << "请重新输入" << endl;
return mo2(p);
}
if (m == 4 && p == 1) {
cout << "愚人节表白,建议换一个日子呢" << endl;
}
else if (m == 5 && p == 20 || p == 21) {
cout << "祝你成功!!!" << endl;
aixin();
}
else {
color(12);
cout << "不管你输入什么,都证明你有这样的想法" << endl;
cout << "勇敢的人有资格追求爱情,祝你成功!!!" << endl;
return 0;
}
return 0;
}
int mo4(void)
{
cout << "按1 单列输出" << endl;
cout << "按2 双列输出" << endl;
string aa;
int a;
cin >> aa;
a = zifu(aa);
bao(a);
if (a > 2 || a < 1) {
cout << "输入失败,请重新输入" << endl;
}
switch (a)
{
case 1:dan1(a); break;
case 2:dan2(a); break;
default:return mo4(); break;
}
return 0;
}
void mo5(int n)
{
string aa;
int a;
cout << "请输入年份" << endl;
cin >> aa;
a = zifu(aa);
/* n = 0;
if (a.size() > 4) return;
else
{
for (int i = 0; i < a.size(); i++)
{
if (a[i] < '0' || a[i]>'9')
{
return;
}
else
{
int p = a[i] - '0';
p = pow(10, a.size() - i - 1) * p;
n+=p;
}
}
}
*/
if (n % 4 == 0 && n % 100 != 0 || n % 400 == 0) {
cout << "是闰年" << endl;
}
else cout << "不是闰年" << endl;
}
void mo6(int n)
{
int d;
string yy;
string mm;
int y, m;
int w;
int t;
int j;
int ri[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
/* printf("_________________________________________\n");
printf(" 周日 周一 周二 周三 周四 周五 周六 \n");
printf("_________________________________________\n");*/
//判断1号为周几
//将1号之前的数输出空格
//scanf(%6d,&d);
//到七就换行;
//输出1
//输出2到31
//先输入
cout << "请输入年 月" << endl;
cin >> yy;
y = zifu(yy);
cin >> mm;
m = zifu(mm);
bao(y);
bao(m);
if (m > 12 || m < 1) {
return mo6(m);
}
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
ri[2] += 1;
}
j = m;
if (m == 1 || m == 2) {
m += 12;
y--;
}
w = (1 + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;//
printf("_________________________________________\n");
printf(" 周日 周一 周二 周三 周四 周五 周六 \n");
printf("_________________________________________\n");
for (int i = 0; i < w; i++) {
cout << " ";
}
t = w;
if (y == 1582 && m == 10) {
for (int i = 1; i <= 4; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
}
for (int i=15; i <= ri[j]; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
}
}
else {
for (int i = 1; i <= ri[j]; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
}
}
return;
}
void aixin(void)
{
color(12);
float x, y, a;
for (y = 1.5f; y > -1; y -= 0.1f) {
for (x = -1.5f; x < 1.5f; x += .05f) {
a = x * x + y * y - 1;
putchar(a * a * a - x * x * y * y * y < 0.0f ? '*' : ' ');
}
Sleep(15);
putchar('\n');
}
return;
}
int dan1(int n)
{
int y, m, d;
string yy;
int w;
int t;
int ri[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
cout << "请输入年份" << endl;
//scanf("%d", &y);
cin >> yy;
y = zifu(yy);
bao(y);
for (int j = 1; j < 13; j++) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
ri[2]++;
}
m = j;
if (m == 1 || m == 2) {
m += 12;
y--;
}
w = (1 + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
printf("_________________________________________\n");
printf(" %d月 \n", j);
printf("_________________________________________\n");
printf(" 周日 周一 周二 周三 周四 周五 周六 \n");
printf("_________________________________________\n");
for (int i = 0; i < w; i++) {
cout << " ";
}
t = w;
if (y == 1582 && j == 10) {
for (int i = 1; i <= 4; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
if (i == ri[j])cout << endl;
}
for (int i = 15; i <= ri[j]; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
if (i == ri[j])cout << endl;
}
}
else {
for (int i = 1; i <= ri[j]; i++) {
if (t == 7) {
cout << endl;
t = 0;
}
printf("%5d", i);
t++;
if (i == ri[j])cout << endl;
}
ri[2] = 28;
if (m == 13 || m == 14) {
y++;
}
}
}
return 0;
}
void xingqi(int aa)
{
//int j = 1;
for (int i = 0; i < 2; i++) {
printf("_________________________________________\t");
}
cout << "\n";
for (int i = 0; i < 2; i++) {
printf(" %d月 \t", aa++);
}
cout << "\n";
for (int i = 0; i < 2; i++) {
printf("_________________________________________\t");
}
cout << "\n";
for (int i = 0; i < 2; i++) {
printf(" 周日 周一 周二 周三 周四 周五 周六 \t\t");
}
cout << "\n";
for (int i = 0; i < 2; i++) {
printf("_________________________________________\t");
}
cout << "\n";
return;
}
void dan2(int n)
{
cout << "请输入年份";
cout << endl;
int y;
string yy;
cin >> yy;
y = zifu(yy);
bao(y);
//////////////
int aa = 1;
int bb = 2;
//////////////
int m = 1;
int a = 1;
int b = 1;
int c = 1;
int tt = 6;
int d = 35;
//int w;
int ri[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
ri[2]++;
}
int w;//将一号的位置存起来
int ww[13] = { 0 };
int t[13] = { 0 };
for (m = 1; m < 13; m++) {
if (m == 1 || m == 2) {
m += 12;
y--;
}
w = (1 + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
ww[a] = w;
a++;
if (m == 13 || m == 14) {
m -= 12;
y++;
}
}//地址存入成功
for (int i = 1; i < 13; i++) {
t[i] = ww[i];
}
for (aa = 1, bb = 2; aa <= 11, bb <= 12; aa += 2, bb += 2) {
tt = 6;
b = 1;
c = 1;
xingqi(aa);
while (tt--) {
if (tt == 5) {
for (int i = 0; i < ww[aa]; i++) {
printf(" ");
}
}
for (; b <= ri[aa]; b++) {
printf("%5d", b);
t[aa]++;
if (t[aa] == 7) {
t[aa] = 0;
cout << "\t\t";
break;
}
}
b++;
if (t[aa] != 0) {
for (; t[aa] < 7; t[aa]++)
cout << " ";
cout << "\t\t";
}
if (tt == 0)
if (b > ri[aa]) {
cout << " \t\t\t\t";
}
if (tt == 5) {
for (int i = 0; i < ww[bb]; i++) {
printf(" ");
}
}
if (y == 1582 && bb == 10) {
for (; c <= ri[bb]; c++) {
if (c == 5) {
c += 10;
}
printf("%5d", c);
t[bb]++;
if (t[bb] == 7) {
t[bb] = 0;
printf("\n");
break;
}
}
if (c > ri[bb])cout << "\n";
}//////////////////////////
else for (; c <= ri[bb]; c++) {
printf("%5d", c);
t[bb]++;
if (t[bb] == 7) {
t[bb] = 0;
printf("\n");
break;
}
}//结束循环,执行\n
c++;
if (tt == 0) {
cout << "\n";
}
}
}
return;
}
int main(void)
{
color(7);
string a;
int f=zhanshi();
color(7);
if (f)
{
//system("cls");
cout << "\n您是否想尝试其他模块?" << endl;
cout << "如果是的话请输入YES" << endl;
cout << "如果不想尝试的话请输入NO" << endl;
}
else
cout << "Bye Bye"<<endl;
//cin >> a;
getchar();
getline(cin, a);
system("cls");
if (a == "YES") {
cout << "OK" << endl;
main();
}
else if (a == "NO") {
cout << "再见!!!" << endl;
}
else {
cout << "不会玩别玩了!!!" << endl;
return 0;
}
return 0;
}

View File

@ -0,0 +1,315 @@
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
int Leap (int year) //判断闰年
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
int Kimlareson(int year, int month, int day)
{
if (month<3) //1,2月要当做去年的13,14月算
{
month+=12;
year-=1;
}
int K = year % 100;
int J = year / 100;
if (year<1582||(year==1582&&(month<10||(month==10&&day<=4))))//1582年10月4日及之前
{
return (day+(13*(month+1))/5+K+K/4+5-J)%7;
}
else //1582年10月15日及之后
{
return (day+(13*(month+1))/5+K+K/4+J/4+5*J)%7;
}
}
int daysinmonth(int year,int month)
{
switch(month)
{
case 2:
return Leap(year)?29:28; //判断2月天数
case 4: case 6: case 9: case 11:
return 30;
default:
return 31;
}
}
void print_month_calendar(int year,int month,int *start_day)//单个月的日历
{
const char *months[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
printf("\n %d %s\n",year,months[month - 1]);
printf("日 一 二 三 四 五 六\n");
int days_in_month=daysinmonth(year,month);
for (int i=0;i<*start_day;i++)
{
printf(" ");
}
for (int day=1;day<=days_in_month;day++)
{
printf("%2d ",day);
if ((*start_day+day)%7==0)
{
printf("\n");
}
}
printf("\n");
*start_day=(*start_day+days_in_month)%7;
}
void print_1582(int *start_day) //单独处理1582年10月这个怪胎
{
printf("\n 十月 1582\n");
printf("日 一 二 三 四 五 六\n");
for (int i=0;i<*start_day;i++)
{
printf(" ");
}
// 打印1-4日
for (int day=1;day<=4;day++)
{
printf("%2d ",day);
if ((*start_day+day-1)%7==6)
{
printf("\n");
}
}
int current_day=5; //跳过5-14日
for (int day=15;day<=31;day++)
{
if ((*start_day+current_day-1)%7==0)
{
printf("\n");
}
printf("%2d ",day);
current_day++;
}
printf("\n");
*start_day=(*start_day+21)%7; //1582年10月只有21天
}
void print_calendar(int year) //打印单列日历
{
int start_day=Kimlareson(year,1,1);
for (int month=1;month<=12;month++)
{
if (year==1582&&month==10)
{
print_1582(&start_day); //处理1582年10月
}
else
{
print_month_calendar(year,month,&start_day);
}
}
}
void print_calendar_double(int year) //打印双列整年日历
{
int start_day[12];
start_day[0]=Kimlareson(year,1,1);
for (int month=1;month<12;month++) //计算每月起始星期几
{
start_day[month]=(start_day[month-1]+daysinmonth(year,month))%7;
}
const char *months[]={"一月", "二月", "三月", "四月", "五月", "六月","七月", "八月", "九月", "十月", "十一月", "十二月"};
for (int i = 0; i < 6; i++) //每行输出两个月
{
printf("\n");
for (int j = 0; j < 2; j++) //两个月的标题
{
int month = i * 2 + j + 1;
printf(" %d %s ",year,months[month-1]);
}
printf("\n");
for (int j = 0; j < 2; j++) //星期标题
{
printf("日 一 二 三 四 五 六 ");
}
printf("\n");
int max_days[2] = { daysinmonth(year, i * 2 + 1), daysinmonth(year, i * 2 + 2) };//获取两个月的最大天数和起始星期几
int start_days[2] = { start_day[i * 2], start_day[i * 2 + 1] };
//打印日期
int day[2] = {1, 1}; //每个月的当前日期
int printed_anything = 1; //标记是否有剩余日期可打印
while (printed_anything) {
printed_anything = 0;
for (int j = 0; j < 2; j++)
{
if (day[j] == 1) //打印月初的空格
{
for (int k = 0; k < start_days[j]; k++)
{
printf(" ");
}
}
while (day[j] <= max_days[j] && ((day[j] + start_days[j] - 1) % 7) != 6)//打印日期
{
printf("%2d ",day[j]++);
printed_anything=1;
}
if (day[j] <= max_days[j])//打印最后一个日期,换行并跳到下一个月
{
printf("%2d ",day[j]++);
printed_anything=1;
} else
{
printf(" "); //填充空格保持对齐
}
printf(" "); //每月之间的间隔
}
printf("\n"); //换行到下一个星期
}
}
}
int main()
{
SetConsoleOutputCP(65001);
int x;
for(;x!=4;)
{
printf(" menu\n");
printf("[1]判断是否闰年\n");
printf("[2]输出该年份的日历\n");
printf("[3]求这一天是星期几\n");
printf("[4]退出\n");
scanf("%d",&x);
if(x==1)
{
int y,x;
printf("请输入年份:");
scanf("%d",&y);
if (y<0)
{
printf("你确定你输的是对吗?\n");
}
else if(y>=10000)
{
printf("%d...你不觉得太过久远了吗?\n",y);
}
else
{
x=Leap(y);
if(x==1)
printf("是闰年\n");
else
printf("不是闰年\n");
}
}
else if(x==2)
{
int y,x;
printf("请输入年份:");
scanf("%d",&y);
if (y<0)
{
printf("你确定你输的是对吗?\n");
}
else if(y>=10000)
{
printf("%d...你不觉得太过久远了吗?\n",y);
}
else
{
printf("请选择单列或双列输出1.单列 2.双列):");
scanf("%d",&x);
if(x==1)
{
print_calendar(y);
}
else if(x==2)
{
print_calendar_double(y);
}
else
{
printf("啧...我觉得我说的很明显了呢...\n");
}
}
}
else if(x==3)
{
int year, month, day;
printf("请输入日期(年 月 日):");
scanf("%d %d %d", &year, &month, &day);
if(year<0||month<=0||day<=0)
{
printf("你是认真的吗?\n");
}
else if(year>=10000)
{
printf("%d...你不觉得太过久远了吗?\n",year);
}
else if(month>=13||day<=0||day>31)
{
printf("你是认真的吗?\n");
}
else if((month==2&&Leap(year)&&day>29)||(month==2&&Leap(year)==0&&day>28))
{
printf("你是认真的吗?\n");
}
else if(year==1582&&month==10&&day>4&&day<15)
{
printf("这一天已经被教皇大人吃掉了www\n");
}
else
{
int weekday=Kimlareson(year, month, day);
const char *weekdays[] = {"星期六","星期日","星期一","星期二","星期三","星期四","星期五"};
printf("%d年%d月%d日是%s\n",year,month,day,weekdays[weekday]);
}
}
else if(x==4)
exit(0);
else if(x==99)
printf("你先生,何时来的?\n是要时停扫地偷胖次吗?\n");
else
{
printf("请不要开玩笑了,我没有这个功能哦\n");
}
}
return 0;
}

View File

@ -0,0 +1,359 @@
#include <stdio.h>
#include <stdlib.h>
/*闰年函数*/
int isLeapYear(int year)
{
if (year == 1582)
{
return 0;
}
return ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0));
}
int getFirstDayOfYear(int year)
{
int d = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
if (year > 1582)
{
if (year == 1583)
{
d -= 10;
}
}
return d % 7;
}
/*计算给定日期是星期几的函数*/
int getDayOfWeek(int year, int month, int day)
{
int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
if (month < 3)
{
year--;
}
return (year + year / 4 - year / 100 + year / 400 + t[month - 1] + day) % 7;
}
/*单列日历函数*/
int danlie(int year)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((year%4==0&&year%100!=0)||year%400==0)
c[1]++;
int sum=(year-1)*365;
if(year>1582)
sum-=10;
for(int i=1;i<year;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b];
if(year==1582)
{
for(int y=1;y<=12;y++)
{
printf("\n\n%18d-%d\n",year,y);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(y==10&&x==5)
{
x=15;
fd=5;
}
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%5d",x);
fd++;
}
}
}
else
{
for(int y=1;y<=12;y++)
{
printf("\n\n%18d-%d\n",year,y);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%5d",x);
fd++;
}
}
}
printf("\n");
}
/*双列日历函数*/
int shuanglie(int a)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((a%4==0&&a%100!=0)||a%400==0)
c[1]++;
int sum=(a-1)*365;
if(a>1582)
sum-=10;
for(int i=1;i<a;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b],d1,d2;
int m[12];
for(int x=0;x<12;x++)
{
if(x==0)
m[0]=fd;
else if(x==1)
m[1]=(fd+31)%7;
else
m[x]=(m[x-1]+c[x-1])%7;
} //这个月第一天=上个月的第一天加上上个月的天数再除以七
if(a==1582)
{
for(int y=1;y<12;y+=2)
{
int r=0;
d1=m[y-1],d2=m[y];
printf("\n\n%18d-%d %5d-%d\n",a,y,a,y+1);
printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
int z,l;
if(x==1)
z=1;
printf("%5d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(d1==7)
{
d1=0;
printf(" ");
if(x<8) //这边是为了让第一行只有一天的情况正常输出
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++)
{
if(y==9&&l==5)
{
l=15;
d2=5;
}
if(l==c[y]&&r!=0)
break;
else if(l==c[y]&&r==0)
r++; //让1582正常输出
printf("%5d",l);
d2++;
if(d2==7)
{
z=l+1;
d2=0;
if(x==c[y-1]&&z<c[y])
{
printf("\n");
printf(" ");
for(z;z<=c[y];z++)
printf("%5d",z);
}
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" \n");
}
}
else
{
for(int y=1;y<12;y+=2) //y代表月份
{
int r=0;
d1=m[y-1],d2=m[y]; //d1代表单数月的第一天 d2代表双数月的第一天
printf("\n\n%18d-%d %5d-%d\n",a,y,a,y+1);
printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
int z,l;
if(x==1)
z=1;
printf("%5d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(x==c[y-1]&&d2!=0)
break;
if(d1==7)
{
d1=0;
printf(" ");
if(x<8)
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++) //l为偶数月日期
{
printf("%5d",l);
d2++;
if(x==c[y-1]&&l<c[y]&&d2==7)
{
printf("\n");
for(int v=z+7;v<=c[y];v++)
printf(" %5d",v);
printf("\n");
break;
}
if(d2==7)
{
z=l+1;
d2=0;
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" \n");
}
}
return 0;
}
void ShowMenu()
{
printf("1.公主是想查询某天是星期几及该年是否是闰年吗?\n\n");
printf("2.公主是想输出某一年的日历吗?(单列)\n\n");
printf("3.公主是想输出某一年的日历吗?(双列)\n\n");
printf("4.公主是想退出吗?\n\n");
printf("公主请输入你的选择: ");
}
int main()
{
int choice;
do {
ShowMenu();
if (scanf("%d", &choice)!= 1)
{
printf("你要不看看你输的是啥?重输!!\n");
while (getchar()!= '\n');
continue;
}
switch (choice)
{
case 1:
{
int year, month, day;
printf("请输入年 月 日(用空格隔开): ");
if (scanf("%d %d %d", &year, &month, &day)!= 3)
{
printf("啊哦 输入不对哦,请重新输入正确的年、月、日。\n");
while (getchar()!= '\n');
continue;
}
int weekday = getDayOfWeek(year, month, day);
printf("%d年%d月%d日是星期", year, month, day);
switch (weekday)
{
case 0: printf(""); break;
case 1: printf(""); break;
case 2: printf(""); break;
case 3: printf(""); break;
case 4: printf(""); break;
case 5: printf(""); break;
case 6: printf(""); break;
}
printf(" , ");
if (isLeapYear(year))
{
printf("%d是闰年\n", year);
}
else
{
printf("%d不是闰年\n", year);
}
break;
}
case 2:
{
int year;
printf("公主请输入年份: ");
if (scanf("%d", &year)!= 1)
{
printf("你要不看看你输的是啥,请重输正确的年份!!\n");
while (getchar()!= '\n');
continue;
}
danlie(year);
break;
}
case 3:
{
int a;
printf("公主请输入年份吧: ");
if (scanf("%d", &a)!= 1)
{
printf("你要不看看你输的是啥,重输正确的年份!!\n");
while (getchar()!= '\n');
continue;
}
shuanglie(a);
break;
}
case 4:
printf("退出程序\n");
break;
default:
printf("你要不看看你输的是啥?重输!!\n");
}
} while (choice!= 4);
return 0;
}

View File

@ -0,0 +1,393 @@
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
int main(void)
{
printf("1.查询对应年份的日历\n2.查询某具体日期的星期\n3.查询对应年份是否为闰年\n");
int num,year,mon,day,a,b,d;
printf("**********************\n");
printf("输入查询项目编号\n");
scanf("%d",&num);
system("cls");//清屏
if(num==1)
{
int nums;
printf("1.单列输出\n2.双列输出\n");
printf("输入想要表现形式的序号:\n");
scanf("%d",&nums);
if(nums==1)
{
printf("输入年份");
scanf("%d",&year);
a=(year%4==0&&year%100!=0||year%400==0);
b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;//每年一月一日是周几
if(year!=1582)
{
for(mon=1;mon<=12;mon++)
{
switch(mon)//判每月天数
{
case 1:
day=31;
break;
case 2:
if(a==1)
day=29;
else
day=28;
break;
case 3:
day=31;
break;
case 4:
day=30;
break;
case 5:
day=31;
break;
case 6:
day=30;
break;
case 7:
day=31;
break;
case 8:
day=31;
break;
case 9:
day=30;
break;
case 10:
day=31;
break;
case 11:
day=30;
break;
case 12:
day=31;
break;
}
printf("----------------%d月---------------\n",mon);
printf(" 日 一 二 三 四 五 六\n");//一个中文占两个字节
switch(b)//判位置
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
for(int i=1,j=b;i<=day;i++,j++)
{
printf("%5d",i);
if(j%7==6)
printf("\n");
}
b=(b+day)%7;//下个月的第一天周几
printf("\n");
}
}
else if(year==1582)//1582的单列输出
{
d=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+11)%7;
for(mon=1;mon<=12;mon++)
{
switch(mon)
{
case 1:
day=31;
break;
case 2:
if(a==1)
day=29;
else
day=28;
break;
case 3:
day=31;
break;
case 4:
day=30;
break;
case 5:
day=31;
break;
case 6:
day=30;
break;
case 7:
day=31;
break;
case 8:
day=31;
break;
case 9:
day=30;
break;
case 10:
day=31;
break;
case 11:
day=30;
break;
case 12:
day=31;
break;
}
printf("----------------%d月---------------\n",mon);
printf(" 日 一 二 三 四 五 六\n");
switch(d)
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
for(int i=1,j=d;i<=day;i++,j++)
{
if(mon==10)
{
if(i>4&&i<15)
continue;
printf("%5d",i);
if(i==16||i==23||i==30)
{
printf("\n");
}
}
else
{
printf("%5d",i);
if(j%7==6)
printf("\n");
}
}
if(mon==10)
{
d=(d+day+ 1)%7;//下个月第一天是周几
printf("\n");
}
d=(d+day)%7;//下个月第一天是周几
printf("\n");
}
}
}
else if(nums==2)//双列
{
printf("输入年份");
scanf("%d",&year);
a=(year%4==0&&year%100!=0||year%400==0);
b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;//每年一月一日是周几
for(mon=1;mon<=12;mon++)
{
switch(mon)//判每月天数
{
case 1:
day=31;
break;
case 2:
if(a==1)
day=29;
else
day=28;
break;
case 3:
day=31;
break;
case 4:
day=30;
break;
case 5:
day=31;
break;
case 6:
day=30;
break;
case 7:
day=31;
break;
case 8:
day=31;
break;
case 9:
day=30;
break;
case 10:
day=31;
break;
case 11:
day=30;
break;
case 12:
day=31;
break;
}
printf("----------------%d月----------------|",mon++);
printf("----------------%d月----------------\n",mon);
printf(" 日 一 二 三 四 五 六");
printf(" 日 一 二 三 四 五 六\n");
switch(b)//判位置
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
for(int i=1,j=b;i<=day;i++,j++)
{
printf("%5d",i);
if(j%7==6)
printf("\n");
}
b=(b+day)%7;//下个月的第一天周几
printf("\n");
}
}
}
else if(num==2)//判星期
{
int year,mon,day,a,b,c,d,e ;
printf("输入想要查询的具体日期\n");
printf("年:\n");
scanf("%d",&year);
printf("月:\n");
scanf("%d",&mon);
printf("日:\n");
scanf("%d",&day);
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year==1582)
arr[10]=21;
a=(year%4==0&&year%100!=0||year%400==0);
b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;
d=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+11)%7;
if(year>1582)
{
if(a==1)
arr[2]=29;
for(int i=0;i<mon;i++)
{
b=(b+arr[i])%7;
c=(b+day-1)%7;
}
}
else if(year<1582)
{
if(a==1)
arr[2]=29;
for(int i=0;i<mon;i++)
{
d=(d+arr[i])%7;
c=(d+day-1)%7;
}
}
else if(year==1582)
{
if(mon<=10&&day<5)
{
for(int i=0;i<mon;i++)
{
d=(d+arr[i])%7;
c=(d+day-1)%7;
}
}
else if(mon==10&&15<=day<=31)
{
for(int i=0;i<mon;i++)
{
d=(d+arr[i])%7;
c=(d+day-11)%7;
}
}
else if (mon>10)
{
for(int i=0;i<mon;i++)
{
d=(d+arr[i])%7;
c=(d+day-1)%7;
}
}
}
switch(c)
{
case 0:
printf("星期日");
break;
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
}
}
else if(num==3)
{
printf("输入年份");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0)
{
printf("闰年");
return 0;
}
else
printf("不是闰年");
}
return 0;
}

View File

@ -0,0 +1,353 @@
#include "stdio.h"
#include "string.h"
#include "math.h"
int panduan(int a,int b,int c) // a年b月c日
{
if(b<=0||b>12)
{
printf("每年为12个月份你所输入的%d不在这范围内",b);
return 0;
}
if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
if(c<=0||c>31)
{
printf("你输入的为%d月本月共31天你输入的%d不在此范围内",b,c);
return 0;
}
if(b==4||b==6||b==9||b==11)
if(c<=0||c>30)
{
printf("你输入的为%d月本月共30天你输入的%d不在此范围内",b,c);
return 0;
}
if((a%4==0&&a%100!=0)||a%400==0)
if(b==2)
if(c<=0||c>29)
{
printf("你输入的为闰年的2月本月共29天你输入的%d不在此范围内",c);
return 0;
}
if(b==2)
if(c<=0||c>28)
{
printf("你输入的不是闰年的2月本月共28天你输入的%d不在此范围内",c);
return 0;
}
if(a==1582&&b==10&&c>4&&c<15)
{
printf("因为特殊原因不存在你所输入的1582年10月%d日",c);
return 0;
}
char weak[7][5]={"周三","周四","周五","周六","周日","周一","周二"};
long long sum=365*(a-1)+c;
int p=a/100,m=a/400;
for(int l=1;l<a;l++)
if((l%4==0&&l%100!=0)||l%400==0)
sum++;
switch(b)
{
case 12:sum+=30; //11月30天
case 11:sum+=31; //10月31天
case 10:sum+=30; //9 月30天
case 9 :sum+=31; //8 月31天
case 8 :sum+=31; //7 月31天
case 7 :sum+=30; //6 月30天
case 6 :sum+=31; //5 月31天
case 5 :sum+=30; //4 月30天
case 4 :sum+=31; //3 月31天
case 3 :sum+=28; //2 月28天
case 2 :sum+=31; //1 月31天
}
if((a%4==0&&a%100!=0)||a%400==0)
{
printf("你输入的%d为闰年\n",a);
if(b>2)
sum++;
}
else
printf("你输入的%d年不是闰年\n",a);
if(a>1582)
sum-=10;
else if(a==1582&&b>10)
sum-=10;
else if(a==1582&&b==10&&c>=15)
sum-=10;
else
sum;
int k=sum%7;
printf("你输入的%d年%d月%d日为%s",a,b,c,weak[k]);
}
int danhang(int a)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((a%4==0&&a%100!=0)||a%400==0)
c[1]++;
int sum=(a-1)*365;
if(a>1582)
sum-=10;
for(int i=1;i<a;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b]; //确定一月一日为周几
if(a==1582)
{
for(int y=1;y<=12;y++)
{
printf("\n\n%d月\n",y);
printf(" 日 一 二 三 四 五 六\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(y==10&&x==5)
{
x=15;
fd=5;
}
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%4d",x);
fd++;
}
}
}
else
{
for(int y=1;y<=12;y++)
{
printf("\n\n%d月\n",y);
printf(" 日 一 二 三 四 五 六\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%4d",x);
fd++;
}
}
}
}
int shuanghang(int a)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((a%4==0&&a%100!=0)||a%400==0)
c[1]++;
int sum=(a-1)*365;
if(a>1582)
sum-=10;
for(int i=1;i<a;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b],d1,d2; //确定一月一日为周几
int m[12];
for(int x=0;x<12;x++)
{
if(x==0)
m[0]=fd;
else if(x==1)
m[1]=(fd+31)%7;
else
m[x]=(m[x-1]+c[x-1])%7;
}
if(a==1582)
{
for(int y=1;y<12;y+=2)
{
int r=0;
d1=m[y-1],d2=m[y];
printf("\n\n%d月 %d月\n",y,y+1);
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
int z,l;
if(x==1)
z=1;
printf("%4d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(d1==7)
{
d1=0;
printf(" ");
if(x<8)
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++)
{
if(y==9&&l==5)
{
l=15;
d2=5;
}
if(l==c[y]&&r!=0)
break;
else if(l==c[y]&&r==0)
r++;
printf("%4d",l);
d2++;
if(d2==7)
{
z=l+1;
d2=0;
if(x==c[y-1]&&z<c[y])
{
printf("\n");
printf(" ");
for(z;z<=c[y];z++)
printf("%4d",z);
}
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" ");
}
}
else
{
for(int y=1;y<12;y+=2) //y为月份
{
int r=0;
d1=m[y-1],d2=m[y];
printf("\n\n%d月 %d月\n",y,y+1);
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++) //x为奇数月日期
{
int z,l;
if(x==1)
z=1;
printf("%4d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(x==c[y-1]&&d2!=0)
break;
if(d1==7)
{
d1=0;
printf(" ");
if(x<8)
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++) //l为偶数月日期
{
printf("%4d",l);
d2++;
if(x==c[y-1]&&l<c[y]&&d2==7)
{
printf("\n");
for(int v=z+7;v<=c[y];v++)
printf(" %4d",v);
printf("\n");
break;
}
if(d2==7)
{
z=l+1;
d2=0;
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" ");
}
}
return 0;
}
int main(void)
{
int i;
printf("本程序为万年历\n若你想知道这一年是否为闰年或者一天为周几请输入1\n");
printf("若你想要输出一个年份的日历请输入2\n");
scanf("%d",&i);
if(i==1)
{
int a,b,c;
printf("请输入年份:\n");
scanf("%d",&a);
printf("请输入月份:\n");
scanf("%d",&b);
printf("请输入日期:\n");
scanf("%d",&c);
panduan(a,b,c);
}
else if(i==2)
{
int c;
printf("请选择是单列输出还是双列输出\n单列请输入1 双列请输入2\n");
scanf("%d",&c);
if(c==1)
{
int a;
printf("请输入年份:\n");
scanf("%d",&a);
danhang(a);
}
else if(c==2)
{
int a;
printf("请输入年份:\n");
scanf("%d",&a);
shuanghang(a);
}
}
return 0;
}

View File

@ -0,0 +1,202 @@
#include <stdio.h>
#include <stdbool.h>
#include <process.h>
int yearstartday(int Year);
bool isLeapYear(int Year);
int monthDays(int Year, int Month);
int getWeekDay(int Year, int Month, int Day);
void outMonthDays(int Year, int Month);
void outMonthDays1582(int Year, int Month);
void menu();
void MenuChoice(int Choice);
void printYearCalendar(int Year);
const char* weekDays[] = {"", "", "", "", "", "", ""};
int main() {
menu();
return 0;
}
int yearstartday(int Year) {
int detayear, corday, weekstartday, detaday;
detayear = Year - 2000;
if (detayear > 0) {
corday = 2;
detayear -= 1;
} else {
corday = 0;
if (detayear <= -418) {
corday = -3;
if (detayear <= -2000) {
corday = -1;
}
}
}
detaday = (detayear / 400) * 2 - detayear / 100 + detayear / 4 + detayear + corday;
weekstartday = (6 + detaday % 7) % 7;
return weekstartday;
}
bool isLeapYear(int Year) {
return (Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0);
}
int monthDays(int Year, int Month) {
if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12) {
return 31;
} else if (Month == 4 || Month == 6 || Month == 9 || Month == 11) {
return 30;
} else {
return isLeapYear(Year) ? 29 : 28;
}
}
int getWeekDay(int Year, int Month, int Day) {
int i, temp, weekday, Days = 0;
for (i = 1; i <= Month - 1; i++) {
Days += monthDays(Year, i);
}
Days = Days + Day - 1;
temp = yearstartday(Year) + Days;
weekday = temp % 7;
if (Year == 1582 && Month > 10) {
weekday -= 3;
}
return weekday;
}
void outMonthDays(int Year, int Month) {
int i, j, weekday;
printf(" %d月日历\n", Month);
printf(" 日 一 二 三 四 五 六\n");
weekday = getWeekDay(Year, Month, 1);
for (i = 0; i < weekday; i++) {
printf(" ");
}
for (j = 1; j <= monthDays(Year, Month); j++) {
printf("%4d", j);
if ((j + weekday) % 7 == 0) {
printf("\n");
}
}
printf("\n");
printf("-------------------------------------\n");
}
void outMonthDays1582(int Year, int Month) {
int i, j, weekday;
printf(" %d月日历\n", Month);
printf(" 日 一 二 三 四 五 六\n");
weekday = getWeekDay(Year, Month, 1);
for (i = 0; i < weekday; i++) {
printf(" ");
}
for (j = 1; j <= monthDays(Year, Month); j++) {
if (Month == 10) {
if (j > 4 && j < 15) {
} else {
printf("%4d", j);
if (j == 16 || j == 23 || j == 30) {
printf("\n");
}
}
} else {
printf("%4d", j);
if ((j + weekday) % 7 == 0) {
printf("\n");
}
}
}
printf("\n");
printf("-------------------------------------\n");
}
void printYearCalendar(int Year) {
printf("Calendar for %d\n\n", Year);
for (int month = 1; month <= 12; month += 2) {
outMonthDays(Year, month);
printf("\n");
if (month + 1 <= 12) {
outMonthDays(Year, month + 1);
printf("\n");
}
}
}
void menu() {
int choice;
while (1) {
printf("万年历\n1. 输入年月日输出星期几\n");
printf("2. 判断闰平年\n");
printf("3. 单列输出某年日历\n");
printf("4. 双列输出某年日历\n");
printf("5. 退出\n");
printf("请输入选择:");
scanf("%d", &choice);
MenuChoice(choice);
}
}
void MenuChoice(int Choice) {
int Year, Month, Day;
switch (Choice) {
case 1:
printf("请输入年 月 日:");
scanf("%d %d %d", &Year, &Month, &Day);
if (Year == 1582 && Month == 10 && Day > 4 && Day < 15) {
printf("1582年10月5日至10月14日不存在\n");
} else {
int weekday = getWeekDay(Year, Month, Day);
printf("%d年%d月%d日是星期%s\n", Year, Month, Day, weekDays[weekday]);
}
break;
case 2:
printf("请输入年份:");
scanf("%d", &Year);
if (isLeapYear(Year)) {
printf("%d年是闰年\n", Year);
} else {
printf("%d年是平年\n", Year);
}
break;
case 3:
printf("请输入年份:");
scanf("%d", &Year);
if (Year == 0) {
printf("输入错误,没有公元零年\n");
} else {
if (Year > 0) {
printf(" 公元%d年日历为:\n", Year);
} else {
printf(" 公元前%d年日历为:\n", -Year);
}
printf("=====================================\n");
if (Year != 1582) {
for (Month = 1; Month <= 12; Month++) {
outMonthDays(Year, Month);
}
} else {
for (Month = 1; Month <= 12; Month++) {
outMonthDays1582(Year, Month);
}
}
}
break;
case 4:
printf("请输入年份:");
scanf("%d", &Year);
if (Year == 0) {
printf("输入错误,没有公元零年\n");
} else {
printYearCalendar(Year);
}
break;
case 5:
printf("退出程序\n");
exit(0);
default:
printf("无效的选择\n");
}
}

View File

@ -0,0 +1,349 @@
#include "stdio.h"
#include "stdlib.h"
//判断闰年
int isLeapYear(int year)
{
if(year%400==0||(year%100!=0&&year%4==0))
{
return 1;
}
return 0;
}
// 计算某年某月的天数
int daysInMonth(int year, int month)
{
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year))
{
return 29;
}
return days[month - 1];
}
// 计算公元1年1月1日到给定日期的总天数
int totalDays(int year, int month, int day)
{
int total = 0;
for (int i = 1; i < year; i++)
{
if ((i % 4 == 0 && i % 100!= 0) || i % 400 == 0)
{
total += 366;
} else {
total += 365;
}
}
for (int i = 1; i < month; i++)
{
if (year == 1582 && i == 10)
{
// 如果是1582年且计算到10月减去10天
if (day >= 15)
{
day -= 10;
}
}
total += daysInMonth(year, i);
}
total += day;
return total;
}
// 判断输入是否为合法的数字
int isNumber(char *input)
{
for (int i = 0; input[i]!= '\0'; i++)
{
if (input[i] < '0' || input[i] > '9')
{
return 0;
}
}
return 1;
}
// 判断日期是否合法
int isValidDate(int year, int month, int day)
{
if (year <= 0)
{
return 0;
}
if (month < 1 || month > 12)
{
return 0;
}
if (day < 1 || day > daysInMonth(year, month))
{
return 0;
}
return 1;
}
//1852
int a(int year,int month,int day)
{
if(year==1582)
{
return 0;
}
if(month==10)
{
return 0;
}
if(day>4&&day<15)
{
return 0;
}
return 1;
}
// 输出一个月的日历
void printMonth(int year, int month)
{
printf(" %d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
int startDay = (totalDays(year, month, 1) % 7);
for (int i = 0; i < startDay; i++)
{
printf(" ");
}
int days = daysInMonth(year, month);
for (int i = 1; i <= days; i++)
{
printf("%2d ", i);
if ((totalDays(year, month, i) % 7) == 6)
{
printf("\n");
}
}
if ((totalDays(year, month, days) % 7)!= 6)
{
printf("\n");
}
}
// 获取指定日期是周几
int isWeek(int totalDay) {
return (totalDay % 7);
}
// 计算某月某天的日期
int Count_Day(int day[]) {
return (day[0] * 1000 + day[1] * 100 + day[2] * 10 + day[3]);
}
// 双列输出日历的核心函数
void printDoubleColumnCalendar(int year) {
// 对2个月分为6个块进行打印
for (int block = 0; block < 6; ++block) {
// 打印表头
printf("%2d月 %2d月 \n", block + 1, block + 7);
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
int lineEnd_l = 1, lineEnd_r = 1;
int day_l[] = {year, block + 1, 1};
int day_r[] = {year, block + 7, 1};
int totalDay_l = Count_Day(day_l);
int totalDay_r = Count_Day(day_r);
// 每个月有5行需要输出
for (int line = 0; line < 5; ++line) {
// flag作标记位每行有16个输出数字的位置第9位和16位始终置0其余位置不为0则输出数字
int flag[16] = {0};
// 标记第一行和其它行用lineEnd_L和R作为整体的日期统计
if (line == 0) {
int monthFirstday_l = isWeek(totalDay_l) + 1;
int monthFirstday_r = isWeek(totalDay_r) + 1;
for (int stringStation = monthFirstday_l; stringStation < 8; ++stringStation) {
flag[stringStation] = lineEnd_l++;
}
for (int stringStation = monthFirstday_l + 8; stringStation < 16; ++stringStation) {
flag[stringStation] = lineEnd_r++;
}
} else {
for (int stringStation = 1; stringStation < 8; ++stringStation) {
flag[stringStation] = lineEnd_l++;
if (lineEnd_l > (daysInMonth(year, block + 1))) {
break;
}
}
for (int stringStation = 9; stringStation < 16; ++stringStation) {
flag[stringStation] = lineEnd_r++;
if (lineEnd_r > (daysInMonth(year, block + 7) + 1)) {
break;
}
}
}
// 输出每行的日期
for (int i = 1; i < 16; ++i) {
if (i == 9) {
printf(" ");
}
if (flag[i] == 0) {
printf(" ");
} else {
if (flag[i] < 10) {
printf(" %d", flag[i]);
} else {
printf(" %d", flag[i]);
}
}
}
printf("\n");
}
}
}
// 菜单选项1判断闰年和星期几
void option1(void)
{
char yearStr[10], monthStr[10], dayStr[10];
int year, month, day;
// 输入年份并验证
printf("请输入年份:");
scanf("%s", yearStr);
if (!isNumber(yearStr))
{
printf("输入错误,请输入数字!\n");
return;
}
year = atoi(yearStr);
// 输入月份并验证
printf("请输入月份:");
scanf("%s", monthStr);
if (!isNumber(monthStr))
{
printf("请输入数字!\n");
return;
}
month = atoi(monthStr);
// 输入日期并验证
printf("请输入日期:");
scanf("%s", dayStr);
if (!isNumber(dayStr))
{
printf("输入错误,请输入数字!\n");
return;
}
day = atoi(dayStr);
// 验证日期整体合法性
if (!isValidDate(year, month, day))
{
printf("日期不合法!\n");
return;
}
if(!a(year,month,day))
{
printf("不存在此日期。\n");
return;
}
// 判断闰年并输出
if (isLeapYear(year))
{
printf("%d年是闰年。\n", year);
}
else
{
printf("%d年不是闰年。\n", year);
}
// 计算并输出星期几
int total = totalDays(year, month, day);
char *weekdays[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
printf("%d年%d月%d日是%s\n", year, month, day, weekdays[total % 7]);
}
// 菜单选项2输出一年的日历实现较好的双列输出
void option2(void)
{
char choiceStr[10];
int choice;
// 选择输出方式并验证
printf("请选择输出方式(1: 单列输出2: 双列输出): ");
scanf("%s", choiceStr);
if (!isNumber(choiceStr))
{
printf("输入错误,请输入数字!\n");
return;
}
choice = atoi(choiceStr);
if (choice!= 1 && choice!= 2)
{
printf("选择错误!\n");
return;
}
char yearStr[10];
int year;
// 输入年份并验证
printf("请输入年份:");
scanf("%s", yearStr);
if (!isNumber(yearStr))
{
printf("输入错误,请输入数字!\n");
return;
}
year = atoi(yearStr);
if (year <= 0)
{
printf("年份不合法!\n");
return;
}
//单列输出
if (choice == 1)
{
for (int month = 1; month <= 12; month++)
{
printMonth(year, month);
}
}
else
{
printDoubleColumnCalendar(year);
}
}
int main(void)
{
int choice;
while(choice<=2)
{
// 显示菜单并获取用户选择
printf("1. 判断闰年和星期几\n");
printf("2. 输出一年的日历\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
option1();
break;
case 2:
option2();
break;
default:
printf("退出程序\n");
break;
}
}
return 0;
}

View File

@ -0,0 +1,460 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
void rili(int year,int pri){//1.按月份输出
int a,b,con=0;
int c=0;
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
if(year<=1582){
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
}
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(pri==1){ //单列输出
for(int i=1;i<13;i++){
printf("=======================%2d月=======================\n",i);
printf("\t\t\t\t\t\t\n");
if(year==1582&&i==11)
a=1;
if(year==1582&&i==112)
a=3;
if(a!=0){
for(int x=1;x<=a;x++)
{
printf("\t");
}
}
else
printf("\n");
for(int j=1;j<=arr[i];j++)
{
if(year==1582&&i==10&&(j>4&&j<15)){ //特殊年
continue;
}
con+=1;
printf("%d\t",j);
if((con+a)%7==0||j==arr[i])
printf("\n");
}
a=(arr[i]+a)%7;
con=0;
printf("\n");
}
} //单列结束
else if(pri==2){ //双列
con=0;
int q,m;
for(int i=1;i<13;i+=2){
printf("=======================%2d月=======================\t",i);
printf("=======================%2d月=======================\n",i+1);
printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
b=(arr[i]+a)%7;
q=7-b+1;
m=7-a+1;
if(year==1582&&i==11){
a=1;b=3;m=7;q=5;
}
if(a!=0){
for(int x=1;x<=a;x++)
{
printf("\t");
}
}
for(int x=1;x<=7-a;x++)
{
printf("%d\t",x);
}
if(year==1582&&i+1==10){
printf("\t1\t2\t3\t4\t15\t16\t");
q=17;
}
else{
if(b!=0)
{
for(int x=1;x<=b;x++)
{
printf("\t");
}
}
for(int y=1;y<=7-b;y++)
{
printf("%d\t",y);
}
}
printf("\n");
/////////////////////////////////////第一行
for(int j=m;j<=arr[i];j++)
{
printf("%d\t",j);
if(j==arr[i]&&(j+a)%7!=0){
for(int g=0;g<=7-b-1;g++){
printf("\t");
}
}
if((j+a)%7==0||j==arr[i]){
for(int y=q;y<=arr[i+1];y++){
printf("%d\t",y);
if(year==1582&&(i+1)==10){
if(y==23||y==30||y==31){
q=y+1;
printf("\n");
break;
}
else
continue;
}
else{
if(((y+b)%7==0||y==arr[i+1])&&j!=arr[i]){
q=y+1;
printf("\n");
break;
}
else if(j==arr[i]&&(y+b)%7==0&&y!=arr[i+1]){
q=y+1;
printf("\n\t\t\t\t\t\t\t");
continue;
}
}
}
}
if(year==1582&&i==9&&j==29)
printf("\n");
}
a=(arr[i+1]+b)%7;
printf("\n");
}
}
}
void xingqi(int year,int mon,int day){ //查询星期
int a,b,con=0;
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
if(year<=1582){
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
}
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(year==1582){
arr[10]=21;
}
for(int i=1;i<mon;i++){
a=(a+arr[i])%7;
}
if(year==1582&&mon==10&&day>=15){
b=(day-10)%7;
}
else
b=(a+day-1)%7;
switch(b){
case 1:printf("这一天是星期一\n");break;
case 2:printf("这一天是星期二\n");break;
case 3:printf("这一天是星期三\n");break;
case 4:printf("这一天是星期四\n");break;
case 5:printf("这一天是星期五\n");break;
case 6:printf("这一天是星期六\n");break;
case 0:printf("这一天是星期日\n");break;
}
}
void run(int year){ //判断闰年
if((year%4==0&&year%100!=0)||year%400==0)
printf("%d是闰年\n",year);
else
printf("%d不是闰年\n",year);
}
bool nian(int year){
if(year>0&&year<10000)
return true;
else
return false;
}
bool yue(int mon){
if(mon>0&&mon<13)
return true;
else
return false;
}
bool ri(int year,int mon,int day){
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(year==1582&&mon==10&&day>4&&day<15)
return false;
if(day>0&&day<=arr[mon])
return true;
else
return false;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
qwe:printf("1.查询对应年份的日历\n2.查询对应日期的星期\n3.查询对应年份是否为闰年\n4.退出\n(如果需要返回请按0)\n");
printf("请选择想要执行的项目:\n");
char num[100001]; //选择项目内容
int year=0,pri=0,mon=0,day=0,a,b,c;//年份 输出方式 月
char y[100001],p[100001],m[100001],d[100001];
while(gets(num)){
year=0;pri=0;mon=0;day=0;
if(strlen(num)!=1){
printf("输入错误!请重新输入:\n");
continue;
}
if(num[0]=='1'){
asd: printf("请输入想要查询的年份:\n");
edc: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto edc;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
}
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto edc;
}
printf("请选择日历的表现形式:\n1.单列输出\n2.双列输出\n");
bnm: while(gets(p)){
if(p[0]=='0'&&strlen(p)==1){
goto asd;
}
if(strlen(p)>1||(strlen(p)==1&&(p[0]>'2'||p[0]<'1'))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
pri=(int)p[0]-48;
while(pri!=1&&pri!=2){
printf("请输入1或2\n");
goto bnm;
}
rili(year,pri);
//执行1 输出日历
}
else if(num[0]=='2'){
rty: printf("请输入想要查询的具体日期\n");
printf("年:");
wsx: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto wsx;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
}
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto wsx;
}
uio: printf("月:");
qaz: while(gets(m)){
mon=0;
if(m[0]=='0'&&strlen(m)==1){
goto rty;
}
if(strlen(m)>2||(strlen(m)<=2&&((m[0]>'9'||m[0]<'0')||((m[1]>'9'||m[1]<'0')&&m[1]!='\0')))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
a=strlen(m)-1;
c=strlen(m);
while(a>=0){
b=((int)m[a]-48)*pow(10,c-a-1);
mon+=b;
a-=1;
}
if(!yue(mon)){
printf("您输入的月份有误请重新输入:\n");
goto qaz;
}
printf("日:");
rfv: while(gets(d)){
day=0;
if(d[0]=='0'&&strlen(d)==1){
goto uio;
}
if(strlen(d)>2||(strlen(d)<=2&&((d[0]>'9'||d[0]<'0')||((d[1]>'9'||d[1]<'0')&&d[1]!='\0')))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
a=strlen(d)-1;
c=strlen(d);
while(a>=0){
b=((int)d[a]-48)*pow(10,c-a-1);
day+=b;
a-=1;
}
while(!ri(year,mon,day)){
printf("您输入的日期有误请重新输入:\n");
goto rfv;
}
xingqi(year,mon,day);
}
else if(num[0]=='3'){ //3程序
printf("请输入想要查询的年份:\n");
tgb: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto tgb;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
} //判空字符
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto tgb;
} //判错误年份
run(year);
}
else if(num[0]=='4')break;
else{ //判错误序号
printf("输入错误!请重新输入:\n");
continue;
}
printf("想要在使用一次赵思雨的无敌旋风霹雳程序吗\n1.好的\n2.婉拒\n");//继续程序
char ok[100001];
int f=ok[100001]-48;
okf: while(gets(ok)){
if(strlen(ok)>1||(strlen(ok)==1&&(ok[0]>'2'||ok[0]<'1'))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
f=(int)ok[0]-48;
while(f!=1&&f!=2){
printf("请输入1或2\n");
goto okf;
}
if(f==2)break;
else if(f==1){
system("cls");
goto qwe;
}
}
}

View File

@ -0,0 +1,236 @@
#include <stdio.h>
int isLeapYear(int year)
{
return (year % 4 == 0 && year % 100!= 0) || (year % 400 == 0);
}
int getDaysInMonth(int year, int month)
{
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 1 && isLeapYear(year))
{
return 29;
}
return daysInMonth[month];
}
void printCalendarHeader()
{
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
}
void printMonth(int year, int month)
{
int z;
int days = getDaysInMonth(year, month);
int firstDayOfMonth = (year * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;
int i,day;
for (i = 0; i < month; i++)
{
firstDayOfMonth += getDaysInMonth(year, i);
}
firstDayOfMonth %= 7;
printCalendarHeader();
for (i = 0; i < firstDayOfMonth; i++)
{
printf(" ");
}
for (day = 1; day <= days; day++)
{
printf("%5d", day);
if ((firstDayOfMonth + day) % 7 == 0)
{
printf("\n");
}
}
}
int main(void)
{
int choice;
printf("1. 查询对应年份日历\n");
printf("2. 查询对应日期星期\n");
printf("3. 判断所输入年份是否为闰年\n");
printf("4. 退出\n");
scanf("%d", &choice);
int year,month,week,day,day_x,day_z=0,c=0;
int i,j,k,l,m,n,b;
char a;
start:
switch (choice)
{
case 1:
printf("请输入年份:");
scanf("%d", &year);
int month;
int z;
printf("1.单列输出\n2.双列输出\n");
scanf("%d",&z);
for (month = 0; month < 12; month++)
{
printf("\n %d月\n", month + 1);
printMonth(year, month);
}
break;
case 2:
printf("请输入该查询的年份:\n");
scanf("%d",&year);
printf("请输入该查询的月份:\n");
scanf("%d",&month);
printf("请输入该查询的日期: \n");
scanf("%d",&day);
if(year<1 || year>9999)
{
printf("输入年份错误,请重新输入:");
scanf("%d",&year);
}
if(month<1 || month>12)
{
printf("输入月份错误,请重新输入:");
scanf("%d",&month);
}
if(day<1 || day>31)
{
printf("输入日期错误,请重新输入:");
scanf("%d",&day);
}
if(month<3)
{
year--;
month+=12;
}
if(year==1582 && month==10)
{
day_x=21;
if(day>=15)
{
k=year%100;j=year/100;l=day;m=month;
n=(l+(26*(m+1)/10)+k+(k/4)+(j/4)+5*j)%7;
switch(n)
{
case 0:
printf("星期六");
break;
case 1:
printf("星期日");
break;
case 2:
printf("星期一");
break;
case 3:
printf("星期二");
break;
case 4:
printf("星期三");
break;
case 5:
printf("星期四");
break;
case 6:
printf("星期五");
break;
}
break;
}
else
{
l=day+10;
k=year%100;j=year/100;m=month;
n=(l+(26*(m+1)/10)+k+(k/4)+(j/4)+5*j)%7;
switch(n)
{
case 0:
printf("星期六");
break;
case 1:
printf("星期日");
break;
case 2:
printf("星期一");
break;
case 3:
printf("星期二");
break;
case 4:
printf("星期三");
break;
case 5:
printf("星期四");
break;
case 6:
printf("星期五");
break;
}
}
break;
}
else
{
k=year%100;j=year/100;l=day;m=month;
n=(l+(26*(m+1)/10)+k+(k/4)+(j/4)+5*j)%7;
switch(n)
{
case 0:
printf("星期六");
break;
case 1:
printf("星期日");
break;
case 2:
printf("星期一");
break;
case 3:
printf("星期二");
break;
case 4:
printf("星期三");
break;
case 5:
printf("星期四");
break;
case 6:
printf("星期五");
break;
}
}
break;
case 3:
printf("请输入年份:\n");
scanf("%d",&year);
if(year%4==0 && year%100!=0 || year%400==0)
{
printf("%d是闰年\n",year);
}
else
{
printf("%d不是闰年\n",year);
}
break;
case 4:
a=choice;
if(a==4)
{
return 0;
}
break;
default:
printf("无效的选择,请重新输入(1~4):\n");
scanf("%d",&choice);
do
{
if(choice>4 || choice==0)
{
printf("无效选择,请重新输入:");
continue;
}
else
{
break;
}
}
while(choice<=4 && choice!=0);
goto start;
}
return 0;
}

View File

@ -0,0 +1,150 @@
#include <stdio.h>
int main() {
int choice;
int j,k,l,m,n;
printf("菜单选项:\n");
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("请输入你的选择(1-4)");
scanf("%d", &choice);
start:
switch (choice) {
case 1:
printf("请输入需要查询的年份\n");
int year;
scanf("%d", &year);
int month,day;
int i,k;
// 单列输出日历
printf("单列日历输出如下:\n");
for (month = 1; month <= 12; month++) {
// 每个月的天数数组先按非闰年设置后续根据是否闰年调整2月天数
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0) {
daysInMonth[1] = 29;
}
// 计算该月1号是星期几蔡氏公式简化版思路
int y = year % 100;
int c = year / 100;
if (month < 3) {
y -= 1;
c -= 1;
}
int firstDay = (1 + (13 * (month + 1) / 5) + y + (y / 4) + (c / 4) - 2 * c) % 7;
firstDay = firstDay < 0? firstDay + 7 : firstDay;
// 输出月份标题
printf(" %d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
// 输出该月1号前的空格
for (i = 0; i < firstDay; i++) {
printf(" ");
}
// 输出该月每天的日期
int numDays = daysInMonth[month - 1];
for (day = 1; day <= numDays; day++) {
printf("%2d ", day);
if ((firstDay + day) % 7 == 0) {
printf("\n");
}
}
// 如果该月最后一行不满7个补充换行
if ((firstDay + numDays) % 7!= 0) {
printf("\n");
}
printf("\n");
}
break;
case 2:
printf("请输入需要查询的日期\n");
{
printf("请输入该查询的年份:\n");
scanf("%d",&year);
printf("请输入该查询的月份:\n");
scanf("%d",&month);
printf("请输入该查询的日期: \n");
scanf("%d",&day);
if(month<3)
{
year--;
month+=12;
}
k=year%100;j=year/100;l=day;m=month;
n=(l+(26*(m+1)/10)+k+(k/4)+(j/4)+5*j)%7;
switch(n)
{
case 0:
printf("星期六");
break;
case 1:
printf("星期日");
break;
case 2:
printf("星期一");
break;
case 3:
printf("星期二");
break;
case 4:
printf("星期三");
break;
case 5:
printf("星期四");
break;
case 6:
printf("星期五");
break;
}
break;
}
case 3:
printf("请输入需要查询的年份\n");
{
int year;
printf("请输入一个年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
}
break;
case 4:
printf("正在退出程序...\n");
break;
default:
printf("无效的选择,请重新输入(1~4)\n");
scanf("%d",&choice);
if(choice<=4)
{
goto start;
}
}
return 0;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,231 @@
#include<bits/stdc++.h>
using namespace std;
// 判断是否为闰年
bool run_nian(int year) {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
// 计算某年某月的天数
int TIANSHU(int year, int month) {
static int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2 && run_nian(year))
return 29;
return days[month];
}
// 计算指定日期是星期几(蔡勒公式)
int WEEK(int year, int month, int day) {
int week;
if (month < 3) {
month += 12;
year--;
}
int c = year / 100;
int y = year % 100;
if ((year < 1582) || (year == 1582 && month <= 10 && day <= 4))
week = (day + 1 + 2 * month + 3 * (month + 1) / 5 + year + year / 4 + 5) % 7;
else if ((year > 1582) || (year == 1582 && month >= 10 && day >= 10))
week = (c / 4 - 2 * c + y + y / 4 + 13 * (month + 1) / 5 + day - 1) % 7;
else
week = 8;
if (week < 0)
week += 7;
return week;
}
// 打印单月日历
void danlie(int year, int month) {
if (year != 1582) {
cout << " " << year << "" << month << "\n";
cout << " 一 二 三 四 五 六 日\n";
int weekday = WEEK(year, month, 1);
for (int i = 0; i < weekday % 7; i++)
cout << " ";
int days = TIANSHU(year, month);
for (int i = 1; i <= days; ++i) {
cout << setw(3) << i;
if ((weekday + i) % 7 == 0)
cout << "\n";
}
cout << "\n";
} else {
if (month != 10) {
cout << " " << year << "" << month << "\n";
cout << " 一 二 三 四 五 六 日\n";
int weekday = WEEK(year, month, 1);
for (int i = 0; i < weekday % 7; i++)
cout << " ";
int days = TIANSHU(year, month);
for (int i = 1; i <= days; ++i) {
cout << setw(3) << i;
if ((weekday + i) % 7 == 0)
cout << "\n";
}
cout << "\n";
}
else {
cout << " " << year << "" << month << "\n";
cout << " 一 二 三 四 五 六 日\n";
int weekday = WEEK(year, month, 1);
for (int i = 0; i < weekday % 7; i++)
cout << " ";
int days = TIANSHU(year, month);
for (int i = 1; i <= days; ++i) {
if (i <= 4 || i > 14)
cout << setw(3) << i;
else
continue;
if (i == 16 || i == 23 || i == 30)
cout << "\n";
}
cout << "\n";
}
}
}
// 打印双月日历(并排显示两个月)
void shuang_yueli(int year, int month) {
int days1 = TIANSHU(year, month);
int days2 = TIANSHU(year, month + 1);
cout << " " << year << "" << month << "月 - " << year << "" << month + 1 << "\n";
cout << " 一 二 三 四 五 六 日 一 二 三 四 五 六 日\n";
int weekday1 = WEEK(year, month, 1);
int weekday2 = WEEK(year, month + 1, 1);
int i, j, ij1, ij2;
for (int m = 0; m < weekday1; ++m)
cout << " ";
for (i = 1; i < days1; i++) {
for (j = 1; j < days2; j++) {
for (ij1 = 1; ij1 <= (weekday1 + i) % 7; ij1++) {
cout << setw(3) << i;
i++;
}
for (int m = 0; m < weekday2; ++m)
cout << " ";
for (ij2 = 1; ij2 <= (weekday2 + j) % 7; ij2++) {
cout << setw(3)<< j;
j++;
if((weekday2+j)%7==0)
{
cout<<"\n";
}
}
}
}
}
// 显示菜单并获取用户选择
int menu() {
int choice;
cout << "万年历程序菜单:\n";
cout << "1. 查询某年某月某日是周几及该年是否为闰年\n";
cout << "2. 输出指定年份的单月日历\n";
cout << "3. 输出指定年份的双月日历\n";
cout << "4. 退出程序\n";
cout << "请输入你的选择:";
while (scanf("%d", &choice) != 1) {
while (getchar() != '\n') ;
printf("无效的选择,请重新输入\n");
}
return choice;
}
// 获取有效年份输入
int wannianli() {
int year;
cout << "请输入年份(公元后):";
while (scanf("%d", &year) != 1) {
while (getchar() != '\n') ;
printf("无效的选择,请重新输入\n");
}
return year;
}
// 获取有效月份输入
int month_1() {
int month;
cout << "请输入月份1 - 12";
while (scanf("%d", &month) != 1) {
while (getchar() != '\n') ;
printf("无效的选择,请重新输入\n");
}
if (month > 12 || month < 1) {
printf("无效的选择,请重新输入\n");
}
return month;
}
// 获取有效日期输入
int DAY(int year, int month) {
int date;
cout << "请输入日期1 - " << TIANSHU(year, month) << "";
while (scanf("%d", &date) != 1) {
while (getchar() != '\n') ;
printf("无效的选择,请重新输入\n");
}
return date;
}
int main() {
int choice;
do {
choice = menu();
switch (choice) {
case 1: {
int year = wannianli();
int month = month_1();
int date = DAY(year, month);
bool leap = run_nian(year);
int weekday = WEEK(year, month, date);
if (weekday == 0)
cout << year << "" << month << "" << date << "日是星期天。\n";
if (weekday == 8)
cout << year << "" << month << "" << date << "日不存在。\n";
if (weekday < 8 && weekday > 0)
cout << year << "" << month << "" << date << "日是星期" << weekday << "\n";
cout << year << (leap ? "是闰年。\n" : "不是闰年。\n");
break;
}
case 2: {
int year = wannianli();
for (int month = 1; month <= 12; ++month) {
danlie(year, month);
}
break;
}
case 3: {
int year = wannianli();
for (int month = 1; month < 12; month += 2) {
shuang_yueli(year, month);
}
break;
}
case 4:
cout << "程序已退出。\n";
break;
default:
cout << "无效的选择,请重新输入。\n";
break;
}
} while (choice != 4);
return 0;
}

View File

@ -0,0 +1,219 @@
#include<stdio.h>
#include <stdio.h>
// 判断是否为闰年
int runjudge(int year) {
if (year < 1582) {
// 儒略历的闰年规则
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
} else {
// 公历的闰年规则
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
}
// 获取某个月的天数
int getnumberdaysinmonth(int year, int month) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
return 31;
else if (month == 4 || month == 6 || month == 9 || month == 11)
return 30;
else if (month == 2)
return runjudge(year) ? 29 : 28;
else if (year == 1582 && month == 10)
return 21; // 1582年10月4日后改为15日中间10天被删除所以返回21天
else
return 0; // 错误的月份
}
// 计算某日是星期几
// 假设日期如公元1年1月1日是星期日
int getstartday(int year, int month, int day) {
int sum = 0;
// 目标年份前一年的总天数
for (int y = 1; y < year; y++) {
sum += runjudge(y) ? 366 : 365;
}
// 年份是1582年1582年10月少了10天
if (year == 1582) {
for (int m = 1; m < 10; m++) {
sum += getnumberdaysinmonth(1582, m);//调用函数
}
sum += 4; // 1582年10月只计算到14日
} else {
// 计算到目标月份前一个月的总天数
for (int m = 1; m < month; m++) {
sum += getnumberdaysinmonth(year, m);
}
}
// 加上目标月的天数
//计算星期几
int wd = sum % 7;
return (wd+7)%7; //
}
// 打印星期的表头
void printbegin() {
printf(" Sun Mon Tue Wed Thu Fri Sat \n");
}
// 打印某个月的天数
void printmonthday(int year, int month) {
int firstday = getstartday(year, month, 1); // 获取该月第一天是星期几
int monthday = getnumberdaysinmonth(year, month); // 获取该月天数
// 打印空格
for (int i = 0; i < firstday; i++) {
printf(" "); // 每个空格代表一个星期的单元格
}
// 打印每一天
for (int n = 1; n <= monthday; n++) {
printf("%4d", n); //
if ((firstday + n) % 7 == 0) { // 如果到达周末,换行
printf("\n");
}
}
printf("\n"); // 月末换行
}
// 打印某个月的日历
void printcalendar(int year, int month) {
printbegin();
printmonthday(year, month);
}
// 打印某年的所有月份的日历
void printyearcalendar(int year) {
for (int i = 1; i <= 12; ++i) {
printf("%d月\n", i);
printcalendar(year, i);
printf("\n");
}
}
void print_calendar(int firstday1, int monthday1, int firstday2, int monthday2,int m,int y) {
// 打印标题
printf("%d年 %d月 %d年 %d月\n",y,m,y,m+1);
printf("Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
// 最长行的最大行数
int max_rows = (monthday1 + firstday1 + 6) / 7; // 计算1月的最大行数,极端情况下假设第一天是周六,
if ((monthday2 + firstday2 + 6) / 7 > max_rows) {
max_rows = (monthday2 + firstday2 + 6) / 7; // 计算2月的最大行数第一天为星期几+这一天有多少天去最大行数
}
for (int row = 0; row < max_rows; row++) {
// 打印1月
for (int i = 0; i < 7; i++) {//最内层i为每一列zuobiaosuoyin
if (row * 7 + i < firstday1) {
printf(" "); // 打印空格
} else if (row * 7 + i - firstday1 < monthday1) {//索引,下棋
printf("%-3d ", row * 7 + i - firstday1 + 1);//三个字节,当前位置在有效范围,打印
} else {
printf(" "); // 超过该月天数,打印空格
}
}
// 打印间隔
printf(" ");
// 打印2月
for (int i = 0; i < 7; i++) {
if (row * 7 + i < firstday2) {
printf(" "); // 打印空格
} else if (row * 7 + i - firstday2 < monthday2) {
printf("%-3d ", row * 7 + i - firstday2 + 1);
} else {
printf(" "); // 超过该月天数,打印空格
}
}
printf("\n"); // 换行
}
}
// 打印某年所有月份的日历(双列输出)
void printdoubleyearcalendar(int year,int month,int day)
{
printf("\n");
for (int month = 1; month <= 12; month += 2) //两层嵌套循环,最外层遍历每一行,调用上一个函数进行内层循环
{
int firstday1= getstartday(year, month, 1);
// 获取第一个月的第一天
int monthday1 = getnumberdaysinmonth(year, month); // 获取第一个月的天数
int firstday2 = getstartday(year, month + 1, 1); // 获取第二个月的第一天
int monthday2 = getnumberdaysinmonth(year, month + 1); // 获取第二个月的天数
print_calendar(firstday1, monthday1, firstday2, monthday2,month,year);//进行连接
}
}
int main(void)
{
int choice,year,month,day;
int wwd=getstartday(year,month,day);
do{
printf("\n======菜单======\n");
printf("1.请输入一个日期,得到是周几\n");
printf("2.请输入一个年份,得到那年的日历\n");
printf(" 2.1 单列输出\n");
printf(" 2.2 双列输出\n");
printf("3.请输入一个年份,判断那年是否为闰年\n");
printf("4.退出\n");
printf("请选择一个选项:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入您要查找的 年 月 日:");
scanf("%d %d %d",&year,&month,&day);
getstartday(year,month,day);
printf("您所查找的日期为%d\n",wwd);
break;
case 2:
printf("请选择输出方式:\n");
printf("1. 单列输出\n");
printf("2. 双列输出\n");
int outputChoice;
scanf("%d", &outputChoice);
printf("请输入您要查找的年份: ");
scanf("%d", &year);
if (outputChoice == 1) {
printyearcalendar(year); // 打印单列日历
} else if (outputChoice == 2) {
printdoubleyearcalendar(year,month,day); // 打印双列日历
}
else
{ printf("无效的输出方式\n");
}
break;
case 3:
printf("请输入您要查找的年份:");
scanf("%d",&year);
runjudge(year);
if(runjudge(year)==1)
printf("这是一个闰年\n");
else
printf("这不是一个闰年\n");
break;
case 4:
printf("退出程序\n");
break;
default:
printf("无效的选项,请重新输入\n");
}
}while(choice!=4);
return 0;
}

View File

@ -0,0 +1,51 @@
#include <stdio.h>
int main(){
int y,m,d,w,b,FOE=0;
char a[2]={'\0'};
while(FOE==0){
printf("万年历程序菜单:\n1 输出指定年份的日历\n2 查询指定日期的星期\n3 查询指定年份是否为闰年\n4 退出\n");//菜单
while(gets(a)){
if(a[0]=='4'&&a[1]=='\0'){ FOE=1; break; }//退出;
else if(a[0]=='1'&&a[1]=='\0'){
printf("想要查询的年份:"); scanf("%d",&y);
printf("日历的表现形式:\n1 单列输出\n2 双列输出\n"); scanf("%d",&b);
if(b==1) printf("111");
else if(b==2) printf("222");
getchar();
}//单双列;
else if(a[0]=='2'&&a[1]=='\0'){
printf("想查询的具体日期\n年:"); scanf("%d",&y);
printf("月:"); scanf("%d",&m);
printf("日:"); scanf("%d",&d);
if(m==1||m==2) y--,m+=12;
if(y<=1582&&m<=10&&d<=4){
if(m==1||m==2) y--,m+=12;
w=(d+2*m+3*(m+1)/5+y+y/4+5)%7+1;
}
else{
if(m==1||m==2) y--,m+=12;
w=(d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
}
if(w==0) w=7;
printf("该日期是星期%d.\n按下Enter以继续",w);
getchar();
}//星期几;
else if(a[0]=='3'&&a[1]=='\0'){
printf("想查询的年份:"); scanf("%d",&y);
if((y%4==0&&y%100!=0)||y%400==0) printf("%d 是闰年.",y);
else printf("%d 不是闰年.按下Enter以继续\n",y);
getchar();
}//闰年查询;
if(a[0]!='1'&&a[0]!='2'&&a[0]!='3'&&a[0]!='4'&&a[0]!='\0'){ printf("输入错误!请重新输入:\n");a[0]='\0';a[1]='\0';continue;}
else if((a[0]=='1'||a[0]=='2'||a[0]=='3'||a[0]=='4')&&a[1]!='\0'){ printf("输入错误!请重新输入:\n");a[0]='\0';a[1]='\0';continue;}
FOE=0;
if(a[0]!='\0') getchar();
system("cls");
a[0]='\0';a[1]='\0';
break;
//防报错(部分);
}
}
}

View File

@ -0,0 +1,192 @@
#include <stdio.h>
#include <stdlib.h>
//判断读入的n值-------------------------------------------------------------------------------------------------------
int durun() {
int i;
char x;
printf("1.查询某年某月是星期几是否为闰年\n2.打印单列日历\n3.打印双列日历\n4.退出程序\n");
scanf(" %c",&x);
if(x=='1')
x=1;
else if(x=='2')
x=2;
else if(x=='3')
x=3;
else if(x=='4')
x=4;
else x=5;
return x;
}
//判断年份-------------------------------------------------------------------------------------------------------------
int runian(int x1) {
int m=28;
if(x1%4==0&&x1%100!=0||x1%400==0)
m=29;
return m;
}
int riqi(int x1) {
int w,i;
if(x1>2000)
w=((x1-1)*365+((x1-1)/4)-((x1-1)/100)+((x1-1)/400)+1)%7;
else w=(x1/100)/4-2*(x1/100)+x1%100+(x1%100)/4+(13*12/5);
w=w%7;
if(w==0)
w=7;
return w;
}
//主体-----------------------------------------------------------------------------------------------------------------
int main() {
for(;;) {
qaz:;
int m[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int n,year,ri;
n=durun();
if(n==5) {
system("cls");
printf("输入错误请从新输入\n\n");
goto qaz;
}
if(n==4)
break;
//---------------------------------------------------------------------------------------------------------------------------
if(n==1) {
system("cls");
zaq:;
int xiqi,i;
printf("请依次输入年 月 日\n返回上一级请输入-1\n");
scanf("%d",&year);
if(year==-1) {
system("cls");
goto qaz;
}
scanf("%d%d",&m[0],&ri);
m[2]=runian(year);
if(year<=9999&&year>0&&m[0]>=1&&m[0]<=12&&ri>0&&ri<=m[m[0]]) {
xiqi=riqi(year);
if(year==1582) {
if(m[0]==10&&ri>4&&ri<15) {
printf("输入错误\n\n");
goto zaq;
}
if(m[0]>10)
m[10]-=10;
if(ri>=15&&m[0]==10)
xiqi=xiqi-10;
}
for(i=1; i<m[0]; i++)
xiqi+=m[i];
xiqi+=ri;
xiqi=(xiqi-1)%7;
if(xiqi==0)
xiqi=7;
printf("%d年%d月%d日是星期%d",year,m[0],ri,xiqi);
if(m[2]==29)
printf("是闰年\n\n");
else printf("不是闰年\n\n");
} else printf("输入错误\n\n");
}
//--------------------------------------------------------------------------------------------------------------------------------------------
if(n==2) {
system("cls");
int i,j,w,year;
printf("请输入年份\n返回上一级请输入-1\n");
scanf("%d",&year);
if(year==-1) {
system("cls");
goto qaz;
}
m[2]=runian(year);
w=riqi(year);
if(year<=9999&&year>0) {
printf("======================%.4d======================\n\n\n",year);
for(i=1; i<=12; i++) {
printf("=======================%.2d=======================\n",i);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(j=1; j<w; j++)
printf(" ");
for(j=1; j<=m[i]; j++) {
if(year==1582&&i==10) {
if(j==5)
j=15;
}
printf(" %.2d ",j);
w++;
if(w>7) {
printf("\n");
w=1;
}
}
printf("\n\n");
}
} else printf("输入错误\n\n");
}
//---------------------------------------------------------------------------------------------------------------------------------
if(n==3) {
system("cls");
int i,j1,w,w2,year;
int x1,x2,x3,x4,x5;
printf("请输入年份\n返回上一级请输入-1\n");
scanf("%d",&year);
if(year==-1) {
system("cls");
goto qaz;
}
m[2]=runian(year);
w=riqi(year);
if(year<=9999&&year>0) {
printf("===============================================%.4d===============================================\n\n\n",year);
for(i=1; i<=12; i=i+2) {
x1=1,x3=1,x4=1;
printf(" \n");
printf("=======================%.2d======================= ",i);
printf("=======================%.2d=======================\n",i+1);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日 ");
printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
w2=(w+m[i])%7;
if(w2==0)
w2=7;
for(j1=1; j1<w; j1++)
printf(" ");
for(j1=1; j1<=38; j1++) {
if(j1<=m[i])
printf(" %.2d ",j1);
else if(x4==m[i+1])
break;
else printf(" ");
w++;
if(w>7) {
if(x1==1) {
for(x2=1; x2<w2; x2++)
printf(" ");
x1=0;
x5=w2;
}
for(x3; x3<=m[i+1]; x3++) {
if(x4<=m[i+1]) {
if(year==1582&&i==9&&x4==5) {
x4=15;
}
printf(" %.2d ",x4);
x4++;
}
x5++;
if(x5>7) {
x5=1;
printf("\n");
break;
}
}
printf("\n");
w=1;
}
}
if(year==1582&&i==9)
m[10]=21;
w=(w2+m[i+1])%7;
if(w==0)
w=7;
}
} else printf("输入错误\n\n");
}
}
}

View File

@ -0,0 +1,123 @@
#include <stdio.h>
#include <stdlib.h>
// 判断是否为闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100!= 0) || (year % 400 == 0);
}
// 计算某月有多少天
int daysInMonth(int year, int month) {
int days[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return days[month - 1];
}
// 计算1900年1月1日到给定日期的总天数
int totalDays(int year, int month, int day) {
int total = 0;
int y;
for (y = 1900; y < year; y++) {
total += 365 + isLeapYear(y);
}
int m;
for (m = 0; m < month; m++) {
total += daysInMonth(year, m);
}
total += day;
return total;
}
// 打印日历
void printCalendar(int year, int singleColumn) {
int startDay = (totalDays(year, 1, 1) + 1) % 7;
printf("Calendar - %d\n", year);
if (singleColumn) {
int month;
for ( month = 1; month <= 12; month++) {
int days = daysInMonth(year, month);
printf("\n\t%d月\n", month);
printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n");
int i;
for (i = 0; i < startDay; i++)
printf("\t");
int day;
for (day = 1; day <= days; day++) {
printf("\t%d", day);
if ((startDay + day) % 7 == 0)
printf("\n");
}
if ((startDay + days) % 7!= 0)
printf("\n");
startDay = (startDay + days) % 7;
}
} else {
printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\t\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n");
int month;
for (month = 1; month <= 12; month++) {
int days = daysInMonth(year, month);
int currentStartDay = (totalDays(year, month, 1) + 1) % 7;
int i;
for (i = 0; i < currentStartDay; i++)
printf("\t");
int day;
for (day = 1; day <= days; day++) {
printf("\t%d", day);
if ((currentStartDay + day) % 7 == 0)
printf("\t\t");
}
printf("\n");
}
}
}
// 查询某日期是周几
void queryDay() {
int year, month, day;
printf("请输入日期(年 月 日)");
scanf("%d %d %d", &year, &month, &day);
int total = totalDays(year, month, day);
int weekDay = (total - 1) % 7;
char *weekDays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun"};
printf("%d年%d月%d日是 %s\n", year, month, day, weekDays[weekDay]);
printf("该年是 %s年\n", isLeapYear(year)? "" : "");
}
// 菜单
void menu() {
int choice;
int year;
int singleColumn = 1;
while (1) {
printf("\n1. 查询某日期是周几并判断是否为闰年\n");
printf("2. 打印某一年的日历(单列)\n");
printf("3. 打印某一年的日历(双列)\n");
printf("4. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
queryDay();
break;
case 2:
printf("请输入年份:");
scanf("%d", &year);
printCalendar(year, singleColumn);
break;
case 3:
singleColumn = 0;
printf("请输入年份:");
scanf("%d", &year);
printCalendar(year, singleColumn);
singleColumn = 1;
break;
case 4:
exit(0);
default:
printf("无效的选择,请重新选择\n");
}
}
}
int main() {
menu();
return 0;
}

View File

@ -0,0 +1,164 @@
#include<stdio.h>
int isAvailable(int year);
void getDay(int year,int first_day[]);
int weak(int year);
void drawCalendar(int days[],int first_day[]);
int main(){
int year=0;
int days[12]={31,28.31,30,31,30,31,30,31,30,31,30};
int first_day[12]={0};
int i,t;
for(t=1;t==1;){
int n;
printf("=============兴趣使然=============\n");
printf("1.查询某年日历(单列输出)\n");
printf("2,查询某年是什么年\n");
printf("3.查询某年某月是星期几\n");
printf("4.退出系统\n\n");
printf("请输入选项下:");
scanf("%d",&n);
while(1){
if(n==1){
printf("请输入要查询的年份:");
scanf("%d",&year);
if(!isAvailable(year)){
break;
}
getDay(year,first_day);
if((year%4==0 && year%100!=0) || year%400==0){
days[1]=29;
}
drawCalendar(days,first_day);
putchar('\n');
break;
}
else if(n==2){
printf("请输入要查询的年份:");
scanf("%d",&year);
if(!isAvailable(year)){
break;
}
if((year%4==0 && year%100!=0) || year%400==0){
printf("%d是闰年\n",year);
}
else{
printf("%d是平年\n",year);
}
putchar('\n');
break;
}
else if(n==4){
t=0;
break;
}
else{
printf("请输入要查询的年份:");
scanf("%d",&year);
if(!isAvailable(year)){
break;
}
int weak1=0;
weak1=weak(year);
printf("星期%d",weak1);
putchar('\n');
break;
}
}
}
return 0;
}
int isAvailable(int year){
if(year>0){
return 1;
}
return 0;
}
void getDay(int year,int first_day[]){
int m=0;
int d=1;
int w=0;
int y=year;
for(m=3;m<=12;m++){
w=(d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
first_day[m]=w;
}
y-=1;
for(m=13;m<=14;m++){
w=(d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
first_day[m-13]=w;
}
}
void drawCalendar(int days[],int first_day[]){
int space=0;
int i=0,d=0,j=0;
for(i=0;i<12;i++){
space=first_day[i];
printf(" %2d月日历\n",i+1);
printf("|-----------------------------|\n");
printf("| 日 一 二 三 四 五 六 |\n");
printf("|-----------------------------|\n|");
for(j=0;j<space;j++){
printf(" ");
}
days[0]=31,days[2]=30,days[11]=30;
for(d=1;d<=days[i];d++){
printf(" %2d",d);
if((d+space)%7==0){
printf("|\n|");
}
}
space=7-(d-1+space)%7;
for(j=0;j<space;j++){
printf(" ");
}
printf("|\n|----------------------------|\n|");
}
}
int weak(int year){
int d=0,k,j;
k=year%100;
j=year/100;
int m=0;
int w=0;
int y=year;
printf("请输入要查阅的月份及其日期:");
scanf("%d%d",&m,&d);
if(m<3){
switch(m){
case 1:m=13;break;
case 2:m=14;break;
}
}
w=(d + 13 * (m + 1) / 5 + k + k / 4 + j / 4 + 5 * j)% 7;
switch(w){
case 0:w=6;break;
case 1:w=7;break;
case 2:w=1;break;
case 3:w=2;break;
case 4:w=3;break;
case 5:w=4;break;
case 6:w=5;break;
}
return w;
}

View File

@ -0,0 +1,160 @@
#include <stdio.h>
int main(){
int n;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(;;){
printf("1.查询星期\n2.打印日历\n输入需要的序号\n");
scanf("%d",&n);
if(n==1)
{
int year,a=0,b,i,j;
printf("输入年份 月份 日期\n");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0)
m[2]=29;
scanf("%d",&m[0]);
scanf("%d",&b);
if(year==1582&&m[0]==10&&b>4&&b<15)
printf("输入错误\n");
else if(year<0||m[0]<0||m[0]>12||b<0||b>31){
printf("输入错误\n");
}else if(m[2]==28&&b>28||m[2]==29&&b>29)
printf("输入错误\n");
else if((m[0]==1||m[0]==3||m[0]==5||m[0]==7||m[0]==8||m[0]==10||m[0]==12)&&b==31)
printf("输入错误\n");
else {
j=b;
if(year==1582){
m[10]-=10;
if(b>=15)
b-=10;
}
if(year>=2000)
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;
else a=(year/100)/4-2*(year/100)+year%100+(year%100)/4+(13*12/5);
for(i=1;i<m[0];i++){
b+=m[i];
}
a+=b-1;
a=a%7;
if(a==0)
a=7;
if(year==1582){
if(b>=15)
b-=10;
}
printf("%d年%d月%d日是星期%d\n",year,m[0],j,a);
if(m[2]==29)
printf("%d年是闰年\n",year);
else printf("%d年不是闰年\n",year);
}
}else
if(n==2)
{
int year,a=0,i,j,b,f;
printf("输入年份\n");
scanf("%d",&year);
if(year<0)
printf("输入错误\n");
else {
printf("1.1*12输出\n2.2*6输出\n输入需要的序号\n");
scanf("%d",&n);
if(year%4==0&&year%100!=0||year%400==0)
m[2]=29;
if(year>=2000)
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;
else a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;
if(a==0)
a=7;
if(n==1)
{
printf("~~~~~~~~~~~~~~~~~~~~~~%.4d~~~~~~~~~~~~~~~~~~~~~~\n\n\n",year);
for(i=1;i<=12;i++){
printf("~~~~~~~~~~~~~~~~~~~~~~~%.2d~~~~~~~~~~~~~~~~~~~~~~~\n",i);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(b=1;b<a;b++)
printf(" ");
for(j=1;j<=m[i];j++){
if(year==1582&&i==10){
if(j==5)
j=15;
}
printf(" %.2d ",j);
a++;
if(a>7){
printf("\n");
a=1;
}
}printf("\n");
}
}else
if(n==2){
int x1,x2,x3,x4;
printf("===============================================%.4d===============================================\n\n\n",year);
for(i=1;i<=12;i+=2){
x2=1,x3=1;
printf("~~~~~~~~~~~~~~~~~~~~~~~%.2d~~~~~~~~~~~~~~~~~~~~~~~ ",i);
printf("~~~~~~~~~~~~~~~~~~~~~~~%.2d~~~~~~~~~~~~~~~~~~~~~~~\n",i+1);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日 ");
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(b=1;b<a;b++)
printf(" ");
f=(a+m[i])%7;
if(f==0)
f=7;
x1=1;
for(j=1;j<=40;j++){
if(j<=m[i])
printf(" %.2d ",j);
else if(x3>m[i+1]){
break;
}else printf(" ");
a++;
if(a>7){
if(x1==1){
for(b=1;b<f;b++)
printf(" ");
x1=0;
x2=f,x4=f;
}
for(x2;x2<=38;x2++){
if(year==1582&&(i+1)==10){
if(x3==5)
x3=15;
}
if(x3<=m[i+1]){
printf(" %.2d ",x3);
x3++;
}
x4++;
if(x4>7){
printf("\n");
a=1;
x2++;
x4=1;
break;
}
}
}
}
if(year==1582&&(i+1)==10){
m[10]-=10;
}
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;
int x5;
for(x5=1;x5<=i+1;x5++)
a+=m[x5];
a=a%7;
if(a==0)
a=7;
printf("\n");
}
}else{
printf("输入错误\n");
return 0;
}
}
}else printf("输入错误\n");
}
}

View File

@ -0,0 +1,259 @@
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
// print函数用于显示菜单时打印星号和空格。
void print(char c, int n)
{
int i;
for (i = 1; i <= n; i++)
{
putchar(c);
}
}
// 查询某年某月某日的日期是周几。
int getWeekday(int year, int month, int day) {
// 计算1582年10月4日后是星期几的函数
if (year <= 1582) {
if (month < 3) {
year--;
month += 12;
}
int h = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
return h + 1;
}
// 计算1582年10月4日及以前给定日期是星期几的函数
else if (year > 1582) {
if (month < 3) {
year--;
month += 12;
}
int c = year / 100;
int y = year % 100;
int m = month;
int d = day;
int w = c / 4 - 2 * c + y + y / 4 + (13 * (m + 1) / 5) + d - 1;
w = w % 7;
if (w < 0) {
w += 7;
}
return w;
}
return -1;
}
// 检查日期合法性的函数
int isDateValid(int year, int month, int day) {
if (month < 1 || month > 12) {
return 0;
}
if (day < 1) {
return 0;
}
if (month == 2) {
if (((year % 4 == 0 && year % 100!= 0) || year % 400 == 0) && day > 29) {
return 0;
}
else if (day > 28) {
return 0;
}
}
return 1;
}
// 判断是否为闰年
int isLeapYear(int year) {
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
}
// 获取指定月份的天数
int getDaysInMonth(int month, int year) {
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2 && isLeapYear(year)) {
return 29;
}
return days[month - 1];
}
// 输出日历头部(月份和星期)
void printCalendarHeader(int month, int year) {
const char* months[] = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
if (year == 1582 && month == 10) {
printf("\n十月 1582 (Special Month)\n");
}
else {
printf("\n%s %d\n", months[month - 1], year);
}
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
}
// 输出日历主体(日期部分)
void printCalendarBody(int month, int year, int format,int day) {
int daysInMonth = getDaysInMonth(month, year);
if (month < 3) {
year--;
month += 12;
}
int k = year % 100;
int j = year / 100;
int firstDay =(day + 13 * (month + 1) / 5 + k + k / 4 + j / 4 + 5 * j) % 7-1;
if (format == 1) { // 单列格式输出逻辑
if (year == 1582 && month == 10) {
for (int day = 1; day <=4; day++) {
printf(" %.2d ", day);
if ((firstDay + day) % 7 == 0) {
printf("\n");
}
}
for (int day = 15; day <= daysInMonth; day++) {
printf(" %.2d ", day);
if ((firstDay + day) % 7 == 0) {
printf("\n");
}
}
}else {
for (int i = 0; i < firstDay; i++) {
printf(" ");
}
for (int day = 1; day <= daysInMonth; day++) {
printf(" %.2d ",day);
if((firstDay + day) % 7 == 0){
printf("\n");
}
}
}
}else { //双列格式输出逻辑
if (year == 1582 && month == 10) {
for (int day = 1; day <=4; day++) {
printf(" %.2d ", day);
}
for (int day = 15; day <= daysInMonth; day++) {
printf(" %.2d ", day);
if ((firstDay + day) % 7 == 0) {
printf("\n");
}
}
if ((firstDay + daysInMonth) % 7!= 0) {
printf("\n");
}
}
else {
for (int i = 1; i < firstDay; i++) {
printf(" ");
}
for (int day = 1; day <= daysInMonth; day++) {
printf(" %.2d ", day);
if ((firstDay + day) % 7 == 6) {
printf("\n");
}
}
if ((firstDay + daysInMonth) % 7!= 6) {
printf("\n");
}
}
}
}
void showMenu()
{
putchar('\n');
print(' ', 10);
print('*', 60);
putchar('\n');
print(' ', 20);
printf("1--查询某年某月某日的日期是周几\n");
print(' ', 20);
printf("2--该年是否为闰年\n");
print(' ', 20);
printf("3--输入年份,输出这一年的日历\n");
print(' ', 10);
print('*', 60);
putchar('\n');
}
int main()
{
int choice;
char ifcontinue;
int year, month, day;
showMenu();
// 选择菜单。
while (1) {
printf("\n请选择一个菜单(1-3): ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份:");
scanf("%d", &month);
printf("请输入日期:");
scanf("%d", &day);
if (isDateValid(year, month, day)) {
int weekday = getWeekday(year, month, day);
switch (weekday) {
case 0:
printf("%d年%d月%d日是星期日\n", year, month, day);
break;
case 1:
printf("%d年%d月%d日是星期一\n", year, month, day);
break;
case 2:
printf("%d年%d月%d日是星期二\n", year, month, day);
break;
case 3:
printf("%d年%d月%d日是星期三\n", year, month, day);
break;
case 4:
printf("%d年%d月%d日是星期四\n", year, month, day);
break;
case 5:
printf("%d年%d月%d日是星期五\n", year, month, day);
break;
case 6:
printf("%d年%d月%d日是星期六\n", year, month, day);
break;
default:
printf("计算出现错误\n");
}
}
else {
printf("输入的日期不合法,请重新输入正确的日期\n");
}
break;
case 2:
printf("请输入一个年份: ");
scanf("%d", &year);
if (isLeapYear(year)) {
printf("%d年是闰年\n", year);
}
else {
printf("%d年不是闰年\n", year);
}
break;
case 3:
printf("请输入年份: ");
scanf("%d", &year);
int format;
printf("请选择日历输出格式1表示单列2表示双列: ");
scanf("%d", &format);
for (int m = 1; m <= 12; m++) {
printCalendarHeader(m, year);
printCalendarBody(m, year, format,day);
}
break;
default:
printf("\n无效\n");
}
printf("\n返回请输入6:");
getchar(); // 处理scanf输入后的换行符
ifcontinue = getchar();
if (ifcontinue!= '6') {
break;
}
}
return 0;
}

View File

@ -0,0 +1,202 @@
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int menu() {
char g;
int h;
printf("1. 查询星期\n");
printf("2. 打印日历\n");
printf("输入x退出\n");
printf("请输入选项:");
scanf(" %c", &g);
if (g >= '1' && g <= '2') {
h = g - '0'; // 将字符 '1' 或 '2' 转换为整数 1 或 2
}
else if (g == 'x' || g == 'X') {
h = -2; // 表示退出程序
}
else {
h = -1; // 表示无效输入
}
return h;
}
//------------------------------------------------------
int main() {
int n;
int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //一年的月份
for (;;) { //无限循环程序
mjq:;
n = menu();//用n替换h的值
if (n == -2)
break; //退出程序
else if (n == 1)
{
int year, a = 0, b, i, j;
printf("输入年份 月份 日期\n输入-1返回上一级\n");
scanf("%d", &year);
if (year == -1)
goto mjq;//返回首页
if (year < 0 || year>9999)//检测输入合法 万年历真的只有一万年哇!
printf("输入错误\n\n");
else {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //判断闰年 是的话将月份中的二月换成29天
m[2] = 29;
scanf("%d", &m[0]);
scanf("%d", &b);
if (year == 1582 && m[0] == 10 && b > 4 && b < 15) //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过
printf("输入错误\n1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过。\n\n");
else if (year < 0 || m[0] < 0 || m[0]>12 || b < 0 || b>31) { //检查年份、月份和日期是否在有效范围内
printf("输入错误\n\n");
}
else if (m[2] == 28 && b > 28 || m[2] == 29 && b > 29)//检查日期是否超过了该月的天数 闰年29天
printf("输入错误\n\n");
else if ((m[0] == 1 || m[0] == 3 || m[0] == 5 || m[0] == 7 || m[0] == 8 || m[0] == 10 || m[0] == 12) && b > 31)//如果这些月份是输入值大于31天则错误
printf("输入错误\n\n");
else {
j = b;
if (year == 1582) {
m[10] -= 10; //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过 减去
if (b >= 15) //调整当月的日期
b -= 10;
}
if (year >= 2000)
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;//计算从公元1年到year-1年包括year年如果它是闰年的话之间的闰年总数 %7计算当天是星期几
else a = (year / 100) / 4 - 2 * (year / 100) + year % 100 + (year % 100) / 4 + (13 * 12 / 5);
for (i = 1; i < m[0]; i++) {
b += m[i];
}
a += b - 1;
a = a % 7;
if (a == 0)
a = 7; //如果a=0 a就是星期天
if (year == 1582) {
if (b >= 15) //同上
b -= 10;
}
printf("%d年%d月%d日是星期%d\n", year, m[0], j, a);
if (m[2] == 29)
printf("%d年是闰年\n\n", year);
else printf("%d年不是闰年\n", year);
}
}
}
else if (n == 2)
{
int year, a = 0, i, j, b, f;
cxk:;
printf("输入年份\n输入-1返回上一级\n");
scanf("%d", &year);
if (year == -1)
goto cxk;
if (year < 0 && year > 9999)
printf("输入错误\n\n");
else {
printf("1.单列输出\n2.双列输出\n输入-1返回上一级\n输入需要的序号\n");
scanf("%d", &n);
if (n == -1)
goto cxk;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
m[2] = 29;
if (year >= 2000)
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
else a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
if (a == 0)
a = 7;
if (n == 1)
{
printf("======================%.4d======================\n\n\n", year); //输出查询年份表头
for (i = 1; i <= 12; i++) {
printf("=======================%.2d=======================\n", i); //单列输出
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n");
for (b = 1; b < a; b++) //输出每个月空着的天数
printf(" ");
for (j = 1; j <= m[i]; j++) {
if (year == 1582 && i == 10) {
if (j == 5) //将5跳到15号
j = 15;
}
printf(" %.2d ", j);
a++;
if (a > 7) {
printf("\n");
a = 1;
}
}printf("\n");
}
}
else if (n == 2) {
int x1, x2, x3, x4;
printf("===============================================%.4d===============================================\n\n\n", year);
for (i = 1; i <= 12; i += 2) {
x2 = 1, x3 = 1;
printf("=======================%.2d======================= ", i); //双列输出
printf("=======================%.2d=======================\n", i + 1);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天 ");
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n");
for (b = 1; b < a; b++)
printf(" ");
f = (a + m[i]) % 7;
if (f == 0)
f = 7;
x1 = 1;
for (j = 1; j <= 40; j++) {
if (j <= m[i])
printf(" %.2d ", j);
else if (x3 > m[i + 1]) {
break;
}
else printf(" ");
a++;
if (a > 7) {
if (x1 == 1) {
for (b = 1; b < f; b++)
printf(" ");
x1 = 0;
x2 = f, x4 = f;
}
for (x2; x2 <= 38; x2++) {
if (year == 1582 && (i + 1) == 10) {
if (x3 == 5)
x3 = 15;
}
if (x3 <= m[i + 1]) {
printf(" %.2d ", x3);
x3++;
}
x4++;
if (x4 > 7) {
printf("\n");
a = 1;
x2++;
x4 = 1;
break;
}
}
}
}
if (year == 1582 && (i + 1) == 10) {
m[10] -= 10;
}
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
int x5;
for (x5 = 1; x5 <= i + 1; x5++)
a += m[x5];
a = a % 7;
if (a == 0)
a = 7;
printf("\n");
}
}
else {
printf("输入错误\n\n");
}
}
}
else { printf("\n\n"); }
}
}

View File

@ -0,0 +1,211 @@
#include<stdio.h>
void printfMenu ()
{
printf("1.单列输出\n");
printf("2.双列输出\n");
}
//判断是否为闰年
int isLeapyear(int y)
{
if(y%4==0&&y%100!=0 || y%400==0)
return 1;
else
return 0;
}
//这个函数用于计算返回该月的天数
int daysInMonth(int y, int m)
{
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
if(y==1582)
{
days=21;
}
}
case 12:days = 31;break;
case 4:
case 6:
case 9:
case 11:days = 30;break;
case 2:{
if(((year%4) == 0) && ((year%100)!=0) || ((year%400) == 0)){
days = 29;
}else{
days = 28;
}
}
}
return days;
}
//判断指定日期是星期几
int dayOfWeek(int y, int m, int d)
{
if(y>1852 && m>10 && d>4)//1582.10.4之后
{
if (m < 3)
{
m += 12;
y--;
}
int h = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
return h + 1;
}
else
{
int K,J,h;
K=y%100;
J=y/100;
switch(m)
{
case 1:
m=3;
break;
case 2:
m=4;
break;
case 3:
m=5;
break;
case 4:
m=6;
break;
case 5:
m=7;
break;
case 6:
m=8;
break;
case 7:
m=9;
break;
case 8:
m=10;
break;
case 9:
m=11;
break;
case 10:
m=12;
break;
case 11:
m=13;
break;
case 12:
m=14;
break;
}
h=(d+(13*(m+1)/5)+K+K/4+5-J)%7;
switch(h)
{
case 0:
h=6;
break;
case 1:
h=7;
break;
case 2:
h=1;
break;
case 3:
h=2;
break;
case 4:
h=3;
break;
case 5:
h=4;
break;
case 6:
h=5;
break;
}
return h;
}
}
//显示指定年月的月历
void MonthCalendar(int y, int m, int d)
{
printf("\t\t\t\t\t\t")//\t制表符
int ofday=DaysInMonth(y,m);//获取每个月有多少天
int first_day = dayOfWeek(y, m, 1); //获取每月1号是周几
int ofday = daysInMonth(y, m); //获取一个月有多少天
int count = first_day;
for (int i = 0; i <= ofday; i++)
{
//使日期能对齐对应的星期
if (i == 0)
{
for (int j = 0; j < count % 7; j++)
{
printf("\t");
}
}
else
{
printf("%2d\t", i);
count++;
}
//循环打印一周后换行
if (count % 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
//这个函数用于显示指定年份 year 的全年日历
void YearCalendar(int y)
{
int i = 0;
for (i = 1; i <= 12; i++)
{
MonthCalendar(y, i, day);
printf("\n");
}
}
//这个函数用于验证给定的日期是否有效
int isTureDate(int y, int m, int day)
int main(void)
{
int y,m,d,a;
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
scanf("%d",&a);
switch(a)
case 1:
scanf("%d",&y);
YearCalendar(y);
case 2:
scanf("%d %d %d",&y,&m,&d);
dayOfWeek(y,m,d);
case 3:
scanf("%d",&y);
isLeapyear(y);
case 4:
default :
printf("输入错误请重新输入。")
}

View File

@ -0,0 +1,173 @@
#include<stdio.h>
#include<stdlib.h>
int fangbao()
{
int i;
char x;
printf("1.查询日期所对应的星期\n2.查询该年份日历并竖向输出\n3.查询该年份日历并以2*6格式输出\n4.查询该年是否为闰年\n5.退出程序\n");
scanf(" %c",&x);
if(x=='1')
x=1;
else if(x=='2')
x=2;
else if(x=='3')
x=3;
else if(x=='4')
x=4;
else if(x='5')
x=5;
else
x=6;
return x;
}
int runnian(int year,int month)
{
int md[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year%4==0&&year%100!=0||year%400==0)&&month==2)
return 29;
else
return md[month];
}
int date(int year,int month,int day)
{
int c;
if(month<3)
{
month+=12;
year--;
}
if(year!=1582)
{
int a,b;
a=year/100;
b=year%100;
c=(a/4-2*a+b+b/4+13*(month+1)/5+day-1)%7;
if(c<0)
c+=7;
}
else if(year==1582&&month<=10&&day<=4)
c=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7;
else if(year==1582&&month>=10&&day>=15)
c=(day+1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
return c;
}
void yeartb(int year,int month)
{
int h,j,i;
h=runnian(1582,month);
j=date(1582,month,1);
for(i=0;i<j;i++)
printf(" ");
for(i=1;i<=h;i++)
{
if(month==10&&i==5)
{
i+=10;
}
printf("%3d",i);
if(month==10&&i>=5&&(i-10+j)%7==0)
printf("\n");
else if(month!=10&&(i+j)%7==0)
printf("\n");
}
printf("\n");
}
void monthtwo(int year, int month)
{
int w,k,e;
w=runnian(year,month);
k=date(year,month,1);
for(e=0;e<k;e++)
printf(" ");
for(e=1;e<=w;e++)
{
printf("%3d",e);
if((e+k)%7==0)
printf("\n");
}
printf("\n");
}
int main(void)
{
for(;;)
{
int year,month,day,d,e;
d=fangbao();
if(d==6)
{
printf("输入错误请从新输入\n\n");
}
if(d==5)
break;
if(d==1)
{
int year,month,day,m;
printf("请输入日期:\n");
scanf("%d%d%d",&year,&month,&day);
if(year<0||month>12||(month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31||(month==4||month==6||month==9||month==11)&&day>30)
printf("输入错误\n");
if((year%4==0&&year%100!=0||year%400==0)&&month==2&&day>29||(year%4!=0&&year%100==0||year%400!=0)&&day>28)
printf("输入错误\n");
if(year==1582)
{
if(month==10&&day>4&&day<15)
printf("输入错误\n\n");
}
m=date(year,month,day);
if(m==0)
printf("该日期为星期日\n");
else
printf("该日期为星期%d\n",m);
}
if(d==2)
{
int f,g;
printf("请输入年份:\n");
scanf("%d",&year);
if(year<0)
printf("输入错误\n");
printf("%4d年的日历为:\n",year);
for(month=1;month<=12;month++)
{
printf("%d月\n",month);
printf(" 日 一 二 三 四 五 六\n");
if(year!=1582)
monthtwo(year,month);
else
yeartb(year,month);
if(month!=12)
printf("\n");
}
}
if(d==3)
{
printf("请输入年份:\n");
scanf("%d",&year);
if(year<0)
printf("输入错误\n");
printf("%4d年的日历为:\n",year);
for(month=1;month<=12;month+=2)
{
printf("%d月",month);
printf("%d月\n",month+1);
printf(" 日 一 二 三 四 五 六");
printf(" 日 一 二 三 四 五 六\n");
monthtwo(year,month);
}
}
if(d==4)
{
int year;
printf("请输入年份:\n");
scanf("%d",&year);
if(year<0)
printf("输入错误\n");
if(year%4==0&&year%100!=0||year%400==0)
printf("该年份为闰年\n");
else
printf("该年份不是闰年\n");
}
}
return 0;
}

View File

@ -0,0 +1,389 @@
#include<iostream>
using namespace std;
int year, month, day,allday,wannian,con,b,c=0,firstday;
int wannain_month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//判断闰年并返回一年的天数
int runyear(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 366;
}
else
{
return 365;
}
}
// 蔡勒公式
int week(int y, int m, int d)
{
if (y < 1582 || y == 1582) { if (m < 10 || (m == 10 && d < 5))d += 3; else if (m == 10 && (4 < d && d < 15))return -1; }
if (m < 3) { y--; m += 12; }return ((d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 + 1) % 7;
}
void clprintf(int year, int shuchu) {
int yearfirstday, b, con = 0;
int c = 0;
int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
yearfirstday = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
if (year <= 1582) {
yearfirstday = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 11) % 7;
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
monthday[2] = 29;
if (shuchu == 1)
{
for (int i = 1; i < 13; i++) {
printf("------------------------%2d-------------------------\n", i);
printf("SUM\tMON\tTUE\tWEN\tTHU\tFRI\tSAT\n");
if (yearfirstday != 0){
for (int x = 1; x <= yearfirstday; x++)
{
printf("\t");
}
}
for (int j = 1; j <= monthday[i]; j++)
{
if (year == 1582 && i == 10 && (j > 4 && j < 15))
{
continue;
}
con += 1;
printf("%d\t", j);
if ((con + yearfirstday) % 7 == 0 || j == monthday[i])
printf("\n");
}
yearfirstday = (monthday[i] + yearfirstday) % 7;
con = 0;
printf("\n");
}
}
else if (shuchu == 2)
{
con = 0;
int q, m;
for (int i = 1; i < 13; i += 2)
{
printf("------------------------%d月------------------------\t", i);
printf("------------------------%d月------------------------\n", i + 1);
printf("SUM\tMON\tTUE\tWEN\tTHU\tFRI\tSAT\tSUM\tMON\tTUE\tWEN\tTHU\tFRI\tSAT\n");
b = (monthday[i] + yearfirstday) % 7;
q = 7 - b + 1;
m = 7 - yearfirstday + 1;
if (yearfirstday != 0)
{
for (int x = 1; x <= yearfirstday; x++)
{
printf("\t");
}
}
for (int x = 1; x <= 7 - yearfirstday; x++)
{
printf("%d\t", x);
}
if (year == 1582 && i + 1 == 10)
{
printf("\t1\t2\t3\t4\t15\t16\t");
q = 17;
}
else
{
if (b != 0)
{
for (int x = 1; x <= b; x++)
{
printf("\t");
}
}
for (int y = 1; y <= 7 - b; y++)
{
printf("%d\t", y);
}
}
printf("\n");
for (int j = m; j <= monthday[i]; j++)
{
printf("%d\t", j);
if (j == monthday[i] && (j + yearfirstday) % 7 != 0)
{
for (int g = 0; g <= 7 - b - 1; g++)
{
printf("\t");
}
}
if ((j + yearfirstday) % 7 == 0 || j == monthday[i])
{
for (int y = q; y <= monthday[i + 1]; y++)
{
printf("%d\t", y);
if (year == 1582 && (i + 1) == 10)
{
if (y == 23 || y == 30 || y == 31)
{
q = y + 1;
printf("\n");
break;
}
else
continue;
}
else
{
if (((y + b) % 7 == 0 || y == monthday[i + 1]) && j!=monthday[i])
{
q = y + 1;
printf("\n");
break;
}
else if (j == monthday[i] && (y + b) % 7 == 0 && y != monthday[i + 1])
{
q = y + 1;
printf("\n\t\t\t\t\t\t\t");
continue;
}
}
}
}
if (j == monthday[i] && q != monthday[i + 1])
{
/*for (int flag = q; flag <= monthday[i + 1]; flag++)
{
printf("%d\t", flag);
break;
}*/
printf("\n");
}
if (year == 1582 && i == 9 && j == 29)
printf("\n");
}
yearfirstday = (monthday[i + 1] + b) % 7;
printf("\n");
}
}
}
#include <stdio.h>
#include <stdbool.h>
void checkFestival(int year, int month, int day) {
// 元旦
if (month == 1 && day == 1) {
printf("元旦\n");
return;
}
// 春节简单假设大致在公历1月21日至1月27日实际应根据农历准确判断
if (month == 1 && (21 <= day && day <= 27)) {
printf("春节\n");
return;
}
// 清明节一般在公历4月4日至4月6日之间这里以4月5日为例
if (month == 4 && day == 5) {
printf("清明节\n");
return;
}
// 劳动节5月1日
if (month == 5 && day == 1) {
printf("劳动节\n");
return;
}
// 端午节简单假设大致在公历6月10日左右实际应根据农历准确判断
if (month == 6 && day == 10) {
printf("端午节\n");
return;
}
// 中秋节简单假设大致在公历9月17日左右实际应根据农历准确判断
if (month == 9 && day == 17) {
printf("中秋节\n");
return;
}
// 国庆节10月1日
if (month == 10 && day == 1) {
printf("国庆节\n");
return;
}
printf("\n");
}
int main()
{
cout << "\033[1;31;47m输入1查询输入天数的信息 \033[0m" << '\n' << "\033[1;32;47m输入2查询输入年份的日历 \033[0m" << '\n' << "\033[1;30;47m输入3查询输入年份是否为闰年 \033[0m" << '\n' << "\033[1;34;47m输入4退出 \033[0m" << '\n';
int a; cin >> a;
if (cin.fail() || a < 1 || a > 4)
{
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
switch (a)
{
case 1:
{
cout << "输入查询的天数(年 月 日,例如:2024 11 11) :";
cin >> year >> month >> day;
if (cin.fail() || month < 1 || month > 12)
{
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
if (cin.fail() || day < 1 || (month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31 || (month==4||month==6||month==9||month==11)&&day>30||(runyear(year)==366)&&(month==2)&&day>29|| (runyear(year) == 365) && (month == 2) && day > 28)
{
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
if (cin.fail() || year==1582&&month==10&&(day>4&&day<15))
{
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
if (cin.fail() || year < 0 || year > 999999)
{
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
int cinday;
cinday = week(year, month, day);
switch (cinday)
{
case 0: cout << year << "" << month << "" << day << "日是" << "星期日" << '\n' << '\n'; break;
case 1: cout << year << "" << month << "" << day << "日是" << "星期一" << '\n' << '\n'; break;
case 2: cout << year << "" << month << "" << day << "日是" << "星期二" << '\n' << '\n'; break;
case 3: cout << year << "" << month << "" << day << "日是" << "星期三" << '\n' << '\n'; break;
case 4: cout << year << "" << month << "" << day << "日是" << "星期四" << '\n' << '\n'; break;
case 5: cout << year << "" << month << "" << day << "日是" << "星期五" << '\n' << '\n'; break;
case 6: cout << year << "" << month << "" << day << "日是" << "星期六" << '\n' << '\n'; break;
}
cout << '\n' << '\n';
main();
}
case 2:
{
cout << "1.单列输出" << '\n' << "2.双列输出" << '\n';
int b; cin >> b;
if (cin.fail() || b < 1 || b > 2) {
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
switch (b)
{
case 1:
{
cout << "输入查询的年份 :";
cin >> wannian;
if (cin.fail() || wannian < 0 || wannian > 99999) {
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
clprintf(wannian, 1);
break;
}
case 2:
{
cout << "输入查询的年份 :";
cin >> wannian;
if (cin.fail() || wannian < 0 || wannian > 10000) {
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
clprintf(wannian, 2);
break;
}
}
main();
}
case 3:
{
cout << "输入查询的年份 :";
cin >> year;
if (cin.fail() || year < 0 || year > 99999) {
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
cout << "\033[31m输入非法请重新输入\033[0m" << '\n';
main();
}
if (runyear(year) == 366)
cout << year << "年是闰年" << '\n' << '\n';
else
cout << year << "年不是闰年" << '\n' << '\n';
}
main();
case 4:
{
int y, m, d;
cout << "查询节假日" << '\n';
cin >> y >> m >> d;
checkFestival(y, m, d);
}
case 5:
cout << "\033[31m退出请输出uit最帅的人的名字首字母\033[0m" << '\n';
string shuai;
cin >> shuai;
if (shuai == "lxm" || shuai == "tl" || shuai == "zsk")
{
cout << "\033[33m哈哈\033[0m" << '\n'; return 0;
}
else if (shuai == "gxk")
{
cout << "\033[33m我高哥就是帅怎么了\033[0m" << '\n'; return 0;
}
else if (shuai == "yxx")
{
cout << "\033[33m我小小哥就是帅怎么了\033[0m" << '\n'; return 0;
}
else if (shuai == "mzn")
{
cout << "\033[33m我马哥就是帅怎么了\033[0m" << '\n'; return 0;
}
else if (shuai == "lcm")
{
cout << "\033[33m我陆哥就是帅怎么了\033[0m" << '\n'; return 0;
}
else if (shuai == "djy")
{
cout << "\033[33m请输入他的真名(s开头\033[0m" << '\n';
cin >> shuai;
if (shuai == "sys")
cout << "\033[33m哈哈\033[0m" << '\n'; return 0;
}
else
{
cout << "\033[33m再想想\033[0m" << '\n';
main();
}
return 0;
}
return 0;
}

View File

@ -0,0 +1,368 @@
#include <stdio.h>
void Monthhead(int month)
{
printf("%s\n",(month==1)?"Jan":(month==2)?"Feb":(month==3)?"Mar":(month==4)?"Apr":(month==5)?"May":(month==6)?"Jun":(month==7)?"Jul":(month==8)?"Aug":(month==9)?"Sep":(month==10)?"Oct":(month==11)?"Nov":"Dec");
return;
}
void dayHead()
{
printf(" Sun Mon Tue Med Thu Fri Sat\n");
return;
}
int firstDay(int year)
{
int b=(year-1)*365+(year-1)*400+(year-1)*4-(year-1)*100+1;
return b%7;
}
int Week6(int year,int month)
{
int w,c,y;
int day=1;
if(month<3)
{
month+=12;
year--;
}
c=year/100;
y=year%100;
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
return w;
}
int Week(int year,int month,int day)
{
int w,c,y;
if(year<=1582&&month<=10&&day<15)
{
if(month<3)
{
month+=12;
year--;
}
day-=4;
c=year/100;
y=year%100;
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
}else{
if(month<3)
{
month+=12;
year--;
}
c=year/100;
y=year%100;
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
}
return w;
}
int isLeapYear(int year)
{
return (year%4==0&&year%100!=0)||year%400==0;
}
int DayMonth(int year,int month)
{
if(month==2)
{
if(isLeapYear(year))
{
return 29;
}else{
return 28;
}
}else if(month==4||month==6||month==9||month==11){
return 30;
}else{
return 31;
}
}
void printCalendar3(int year)
{
int first=firstDay(year);
int month,day;
for(month=1;month<=9;month++)
{
printf("\n");
Monthhead(month);
dayHead();
for(day=1;day<=first;day++)
printf(" ");
int dayMonth=DayMonth(year,month);
for(day=1;day<=dayMonth;day++)
{
printf("%4d",day);
if((day+first)%7==0)
{
printf("\n");
}
}
if((day+first)%7!=0)
{
printf("\n");
}
first=(first+dayMonth)%7;
}
for(month=10;month<=12;month++)
{
int i;
day=1;
if(month==10)
{
int a[21]={1,2,3,4,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
Monthhead(month);
dayHead();
int first2=Week(year,month,day);
for(i=1;i<=first2;i++)
printf(" ");
for(i=0;i<21;i++)
{
printf("%4d",a[i]);
if((i+first2+1)%7==0)
{
printf("\n");
}
}
if((i+first2)%7!=0)
{
printf("\n");
}
first2=(first2+21)%7;
continue;
}
printf("\n");
int first3=Week(year,month,day);
Monthhead(month);
dayHead();
for(i=1;i<=first3;i++)
printf(" ");
int dayMonth;
if(month==11){
dayMonth=30;
}else if(month==12){
dayMonth=31;
}
for(i=1;i<=dayMonth;i++)
{
printf("%4d",i);
if((i+first3)%7==0)
{
printf("\n");
}
}
if((i+first3)%7!=0)
{
printf("\n");
}
first3=(first3+dayMonth)%7;
}
printf("\n");
}
void printCalendar(int year)
{
int first=firstDay(year);
int month,day;
for(month=1;month<=12;month++)
{
Monthhead(month);
dayHead();
for(day=1;day<=first;day++)
printf(" ");
int dayMonth=DayMonth(year,month);
for(day=1;day<=dayMonth;day++)
{
printf("%4d",day);
if((day+first)%7==0)
{
printf("\n");
}
}
if((day+first)%7!=0)
{
printf("\n");
}
first=(first+dayMonth)%7;
}
}
long int f(int year,int month)
{
if(month<3) return year-1;
else return year;
}
long int g(int month)
{
if(month<3) return month+13;
else return month+1;
}
long int n(int year,int month,int day)
{
return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{
return(int) ((n(year,month,day)%7-621049L%7+7)%7);
}
int date[12][6][7];
int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
int Double(int year)
{
int sw,leap,i,j,k,wd,day;
char title[]="SUM MON TUE WED THU FRI SAT";
sw=w(year,1,1);
leap=(year%4==0&&year%100!=0)||year%400==0;
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;
for(i=0;i<12;i++)
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
{
date[i][wd][sw]=day;
sw=++sw%7;
if(sw==0) wd++;
}
printf("\n================== The Calendar of Year %d==================\n",year);
for(i=0;i<6;i++)
{
for(wd=0,k=0;k<7;k++)
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s\n",i+1,title,i+7,title);
for(j=0;j<6;j++)
{
/*printf(" ");*/
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%5d",date[i][j][k]);
else printf(" ");
printf(" ");
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%5d",date[i+6][j][k]);
else printf(" ");
printf("\n");
}
}
}
void choiceCalendar(int year)
{
int choose;
while(1){printf("1.单列\n2.双列\n");
scanf("%d",&choose);
switch(choose){
case 1: if(year!=1582)
{
printCalendar(year);
}else if(year==1582){
printCalendar3(year);
}
break;
case 2:Double(year);
break;
default:
printf("输入有错误\n");
break;
}break;
}
}
int main()
{
int choice,year,month,day;
while(1)
{
printf("1.某年日历\n2.星期几\n3.闰年判断\n4.退出程序\n");
printf("选哪个!\n");
scanf("%d",&choice);
switch(choice){
case 1:printf("输入年份:\n");
scanf("%d",&year);
choiceCalendar(year);
break;
case 2:printf("输入某年某月某日(空格隔开):\n");
scanf("%d %d %d",&year,&month,&day);
int w=Week(year,month,day);
printf("%d\n",w);
break;
case 3:printf("输入年份:\n");
scanf("%d",&year);
if(isLeapYear(year)){
printf("YES\n");
}else{
printf("NO\n");
}
break;
case 4: return 0;
break;
default:printf("无效选择\n");
break;
}
}
return 0;
}

View File

@ -0,0 +1,601 @@
#include<bits/stdc++.h>
using namespace std;
#include<math.h>
#include<string>
#include<iostream>
int run (int n)
{
if(n%400==0||(n%4==0&&n%100!=0))
{
return 1;
}
return 0;
}
int rq (int n,int y,int r)
{
if (y <= 2)
{
y += 12;
n--;
}
int k = n % 100;
int j = n / 100;
int h = (r + 13 * (y + 1) / 5 + k + k / 4 + j / 4 + 5 * j) % 7;
if (y > 12)
{
y -= 12;
n++;
}
h--;
if(h==-1)
{
h=6;
}
if((n==1582&&y==10&&r<=4)||(n==1582&&y<10)||(n<1582))
{
switch(h)
{
case 6:h=2;break;
case 5:h=1;break;
case 4:h=0;break;
case 3:h=6;break;
case 2:h=5;break;
case 1:h=4;break;
case 0:h=3;break;
}
}
return h;
}
int dy (int n,int y)
{
if(y==1||y==3||y==5||y==7||y==8||y==10||y==12)
{
return 31;
}else if(y==2)
{
if(run(n))
{
return 29;
}
return 28;
}else
return 30;
}
int main()
{
while(1)
{
for(int f=1000;f>=0;f--)
{
cout<<endl;
}
cout<<endl;
wen1:
cout<<"1.查询日期:"<<endl;
cout<<"2.判断闰年:"<<endl;
cout<<"3.查看某年日历:"<<endl;
cout<<"4.退出:"<<endl<<endl<<endl;
string a;
cin>>a;
if(a=="1")
{
int year, month, day;
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout <<endl<< "请输入年、月、日:" << endl;
cin >> year >> month >> day;
if(month>12||day>31)
{
goto wen;
}
char week[8][10] = {"周日","周一","周二","周三","周四","周五","周六"};
int h=rq(year,month,day);
for(int f=1000;f>=0;f--)
{
cout<<endl;
}
cout<<endl<<year<<""<<month<<""<<day<<"日是"<<week[h]<<endl;
}else if(a=="2")
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<endl<<"请出入你想查询的年份:"<<endl;
int n ;
cin>>n;
cout<<endl;
if(run(n))
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<n<<"年是闰年"<<endl;
goto wen;
}else
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<n<<"年不是闰年"<<endl<<endl;
goto wen;
}
}else if(a=="3")
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
wen2:
cout<<"1.单行输出"<<endl;
cout<<"2.双行输出"<<endl;
string e;
cin>>e;
if(e=="1")
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<"请输入你想查询的年份:"<<endl;
int year1;
cin>>year1;
if(year1!=1582){
char week1[8][10] = {"周日","周一","周二","周三","周四","周五","周六"};
char yue[20][20] = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
for(int i=0;i<12;i++)
{
cout<<" "<<yue[i]<<endl;
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<endl;
int test=rq(year1,i+1,1);
int t2=1;
for(int j=0;j<7;j++)
{
if(j==test)
{
cout<<"0"<<t2<<" ";
t2++;
test++;
}else
{
cout<<" ";
}
}
cout<<endl;
int t3=1;
for(int j=t2;j<=dy(year1,i+1);j++,t2++)
{
if(t3==8)
{
cout<<endl;
t3=1;
}
if(j<10)
{
cout<<"0"<<t2<<" ";
}else
{
cout<<t2<<" ";
}
t3++;
}
cout<<endl;
}
cout<<endl;
}else
{
cout<<"请输入你想查询的年份:"<<endl;
int year1=1582;
char week1[8][10] = {"周日","周一","周二","周三","周四","周五","周六"};
char yue[20][20] = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
for(int i=0;i<12;i++)
{
cout<<" "<<yue[i]<<endl;
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<endl;
int test=rq(year1,i+1,1);
int t2=1;
for(int j=0;j<7;j++)
{
if(i==9&&j==5)
{
t2=15;
}
if(j==test)
{
if(t2<10)
{
cout<<"0"<<t2<<" ";
}else
{
cout<<t2<<" ";
}
t2++;
test++;
}else
{
cout<<" ";
}
}
cout<<endl;
int t3=1;
for(int j=t2;j<=dy(year1,i+1);j++,t2++)
{
if(t3==8)
{
cout<<endl;
t3=1;
}
if(j<10)
{
cout<<"0"<<t2<<" ";
}else
{
cout<<t2<<" ";
}
t3++;
}
cout<<endl;
}
cout<<endl;
}
}else if(e=="2")
{
for(int f=1000;f>=0;f--)
{
cout<<endl;
}
cout<<"请输入你想要查询的年份:"<<endl;
int year1;
cin>>year1;
if(year1!=1582){
char week1[8][10] = {"周日","周一","周二","周三","周四","周五","周六"};
char yue[20][20] = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
for(int i=0;i<12;i+=2)
{
int ttt;
cout<<" "<<yue[i]<<" "<<yue[i+1]<<endl;
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<" ";
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<endl;
int test1=rq(year1,i+1,1),test2=rq(year1,i+2,1);
int t2=1,t22=1;
for(int j=0;j<7;j++)
{
if(j==test1)
{
cout<<"0"<<t2<<" ";
t2++;
test1++;
}else
{
cout<<" ";
}
}
cout<<" ";
for(int j=0;j<7;j++)
{
if(j==test2)
{
cout<<"0"<<t22<<" ";
t22++;
test2++;
}else
{
cout<<" ";
}
}
cout<<endl<<endl;
int t3=1,t33=1;
int j1=t22;
for(int j=t2;j<=dy(year1,i+1);j++,t2++)
{
if(t3==8)
{
nb:
cout<<" ";
for(j1;j1<=dy(year1,i+2);j1++,t22++)
{
if(t33==8)
{
cout<<endl;
t33=1;
break;
}
if(j1<10)
{
cout<<"0"<<t22<<" ";
}else
{
cout<<t22<<" ";
}
t33++;
if(t22==dy(year1,i+2))
{
if(j==dy(year1,i+1)&&(t3!=8||rq(year1,i+1,t2)==6))
{
goto nb111;
}else
{
cout<<endl<<endl;
break;
}
}
if(j==dy(year1,i+1)&&(t22!=dy(year1,i+2))&&t33==8)
{
cout<<endl<<" ";
t2++;
t33=1;
continue;
}
}
cout<<endl;
t3=1;
}
if(j<10)
{
cout<<"0"<<t2<<" ";
}else if(j>=10)
{
cout<<t2<<" ";
}
t3++;
if(j==dy(year1,i+1))
{
for(int m=1;m<8-t3;m++)
{
cout<<" ";
}
if(t3!=8)
{
cout<<" ";
}
if(j1!=dy(year1,i+2))
{
goto nb;
}
}
}
nb111:
cout<<endl<<endl;
}
}else
{
int year1=1582;
char week1[8][10] = {"周日","周一","周二","周三","周四","周五","周六"};
char yue[20][20] = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
for(int i=0;i<12;i+=2)
{
int ttt;
cout<<" "<<yue[i]<<" "<<yue[i+1]<<endl;
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<" ";
for(int j=0;j<7;j++)
{
cout<<week1[j]<<" ";
}
cout<<endl;
int test1=rq(year1,i+1,1),test2=rq(year1,i+2,1);
int t2=1,t22=1;
for(int j=0;j<7;j++)
{
if(j==test1)
{
cout<<"0"<<t2<<" ";
t2++;
test1++;
}else
{
cout<<" ";
}
}
cout<<" ";
for(int j=0;j<7;j++)
{
if(i+1==9&&j==5)
{
t22=15;
}
if(j==test2)
{
if(t22<10)
{
cout<<"0"<<t22<<" ";
}else
{
cout<<t22<<" ";
}
t22++;
test2++;
}else
{
cout<<" ";
}
}
cout<<endl<<endl;
int t3=1,t33=1;
int j1=t22;
for(int j=t2;j<=dy(year1,i+1);j++,t2++)
{
if(t3==8&&t22!=dy(year1,i+2))
{
nb44:
cout<<" ";
for(j1;j1<=dy(year1,i+2);j1++,t22++)
{
if(t33==8)
{
cout<<endl;
t33=1;
break;
}
if(j1<10)
{
cout<<"0"<<t22<<" ";
}else
{
cout<<t22<<" ";
}
t33++;
if(t22==dy(year1,i+2))
{
if(j==dy(year1,i+1)&&(t3!=8||rq(year1,i+1,t2)==6))
{
goto nb1;
}else
{
cout<<endl<<endl;
break;
}
}
if(j==dy(year1,i+1)&&(t22!=dy(year1,i+2))&&t33==8)
{
cout<<endl<<" ";
t2++;
t33=1;
continue;
}
}
cout<<endl;
t3=1;
}
if(i==8&&(t2==23||t2==30))
{
cout<<endl<<endl<<endl;
}
if(j<10)
{
cout<<"0"<<t2<<" ";
}else if(j>=10)
{
cout<<t2<<" ";
}
t3++;
if(j==dy(year1,i+1))
{
for(int m=1;m<8-t3;m++)
{
cout<<" ";
}
if(t3!=8)
{
cout<<" ";
}
if(j1!=dy(year1,i+2))
{
goto nb44;
}
}
}
nb1:
cout<<endl<<endl;
}
}
}else{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<"输入错误,请重新选择:";
goto wen2;
}
}else if(a=="4")
{
break;
}else
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<"输入错误,请重新选择:";
goto wen1;
}
wen:
cout<<"1.继续查询:"<<endl;
cout<<"2.退出"<<endl;
string b;
cin>>b;
if(b=="1")
{
continue;
}else if(b=="2")
{
break;
}else
{
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout<<"输入错误,请重新选择:"<<endl;
goto wen;
}
}
for(int i=1000;i>=0;i--)
{
cout<<endl;
}
cout << " ******** ******** "<< endl;
cout << " *********** ************ "<< endl;
cout << "************* *************" << endl;
cout << " ************************* "<< endl;
cout << " ******谢谢!!!******** "<< endl;
cout << " ******************** "<< endl;
cout << " ****************** "<< endl;
cout << " **************** "<< endl;
cout << " ************ "<< endl;
cout << " ******** "<< endl;
cout << " **** "<< endl;
cout << " 谢谢!!! "<< endl;
cout << " **** "<< endl;
cout << " ******** "<< endl;
cout << " ************ "<< endl;
cout << " **************** "<< endl;
cout << " ****************** "<< endl;
cout << " ******************** "<< endl;
cout << " *******谢谢!!!****** "<< endl;
cout << " ************************ "<< endl;
cout << " ************* ************ "<< endl;
cout << " *********** *********** "<< endl;
cout << " ******** ******** "<< endl;
return 0;
}

View File

@ -0,0 +1,272 @@
#include<stdio.h>
int main(void)
{
int x;
int j;
printf("1.查询某年某月是星期几,并判断是否为闰年\n");
printf("2.打印单列日历\n");
printf("3.打印双列日历\n");
printf("4.退出\n");
scanf("%d",&x);
int year;
int month;
int day;
int week;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int c;
int y;
int k=1;
int a=2;
int dayss=1;
switch(x)
{
case 1:
scanf("%d-%d-%d",&year,&month,&day);
if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
days[2]=29;
printf("闰年\n");
} else printf("平年\n");
if((month==1&&day<=31)||(days[2]==29&&month==2&&day<=29)||(days[2]==28&&month==2&&day<=28)||(month==3&&day<=31)||(month==4&&day<=30)||
(month==5&&day<=31)||(month==6&&day<=30)||(month==7&&day<=31)||(month==8&&day<=31)||(month==9&&day<=30)||(year!=1582&&month==10&&day<=31)||(month==11&&day<=30)||
(month==12&&day<=31)||(year==1582&&month==10&&day!=5&&day!=6&&day!=7&&day!=8&&day!=9&&day!=10&&day!=11&&day!=12&&day!=13&&day!=14))
{
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else
week=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
switch (week)
{
case 1:printf("星期一\n"); break;
case 2:printf("星期二\n"); break;
case 3:printf("星期三\n"); break;
case 4:printf("星期四\n"); break;
case 5:printf("星期五\n"); break;
case 6:printf("星期六\n"); break;
case 0:printf("星期天\n"); break;
}break;
}
else printf("输入错误");
case 2:
scanf("%d-%d-%d",&year,&month,&day);
if((month==1&&day<=31)||(days[2]==29&&month==2&&day<=29)||(days[2]==28&&month==2&&day<=28)||(month==3&&day<=31)||(month==4&&day<=30)||
(month==5&&day<=31)||(month==6&&day<=30)||(month==7&&day<=31)||(month==8&&day<=31)||(month==9&&day<=30)||(year!=1582&&month==10&&day<=31)||(month==11&&day<=30)||
(month==12&&day<=31)||(year==1582&&month==10&&day!=5&&day!=6&&day!=7&&day!=8&&day!=9&&day!=10&&day!=11&&day!=12&&day!=13&&day!=14))
{
for( j=1;j<=12;j++)
{
month=j;
printf("\n");
printf("%d 月\n",month);
printf("周日 周一 周二 周三 周四 周五 周六\n");
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else
week=(1+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(year==1582&&month==10)
week=1;
switch (week)
{
case 1:printf(" "); break;
case 2:printf(" "); break;
case 3:printf(" "); break;
case 4:printf(" "); break;
case 5:printf(" "); break;
case 6:printf(" "); break;
}
for(day=1;day<=days[j];day++)
{
month=j;
while((year==1582&&month==10)&&(day==5||day==6||day==7||day==8||day==9||day==10||day==11||day==12||day==13||day==14))
day++;
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else
week=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(week==6)
printf("%2d\n",day);
else
printf("%2d ",day);
}
}break;
}else printf("输入错误");
case 3:
scanf("%d-%d-%d",&year,&month,&day);
if((month==1&&day<=31)||(days[2]==29&&month==2&&day<=29)||(days[2]==28&&month==2&&day<=28)||(month==3&&day<=31)||(month==4&&day<=30)||
(month==5&&day<=31)||(month==6&&day<=30)||(month==7&&day<=31)||(month==8&&day<=31)||(month==9&&day<=30)||(year!=1582&&month==10&&day<=31)||(month==11&&day<=30)||
(month==12&&day<=31)||(year==1582&&month==10&&day!=5&&day!=6&&day!=7&&day!=8&&day!=9&&day!=10&&day!=11&&day!=12&&day!=13&&day!=14))
{
for( j=1;j<=12;j+=2)
{day=1;
month=j;
printf("\n");
printf("%d 月 %d月\n",month,month+1);
printf("周日 周一 周二 周三 周四 周五 周六 周日 周一 周二 周三 周四 周五 周六\n");
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else
week=(1+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(year==1582&&month==10)
week=1;
switch (week)
{
case 1:printf(" "); break;
case 2:printf(" "); break;
case 3:printf(" "); break;
case 4:printf(" "); break;
case 5:printf(" "); break;
case 6:printf(" "); break;
}
for(;day<=days[k];day++)
{
month=k;
while((year==1582&&month==10)&&(day==5||day==6||day==7||day==8||day==9||day==10||day==11||day==12||day==13||day==14))
day++;
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
else
week=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(week!=6)
printf("%2d ",day);
else
{
printf("%2d ",day);
for( ;a<=12;a+=2)
{
month=a;
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + 1 - 1;
else
week=(1+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(year==1582&&month==10)
week=1;
switch (week)
{
case 1:printf(" "); break;
case 2:printf(" "); break;
case 3:printf(" "); break;
case 4:printf(" "); break;
case 5:printf(" "); break;
case 6:printf(" "); break;
}}
for(;dayss<=days[a];dayss++)
{
month=a;
while((year==1582&&month==10)&&(dayss==5||dayss==6||dayss==7||dayss==8||dayss==9||dayss==10||dayss==11||dayss==12||dayss==13||dayss==14))
dayss++;
if (month == 1 || month == 2)
year--, month += 12;
c = year / 100;
y = year - c * 100;
if(year>1582)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + dayss - 1;
else if(year==1582&&month>10)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + dayss - 1;
else if((year==1582&&month==10)&&day>4)
week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + dayss - 1;
else
week=(dayss+1+2*month+3*(month+1)/5+year+year/4+5)%7;
if(month==13||month==14)
year++;
while(week < 0)
week += 7;
week %= 7;
if(week==6)
{printf("%2d\n",dayss);continue;}
else
printf("%2d ",dayss);
}
}
}
}
break;
case 4:
break;
default: printf("输入错误");
break;
}
}
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,454 @@
#include<stdio.h>
int run (int y);
void search (void);
int pand(int a,int b,int c);
void input(int *a,int *b,int *c);
void rls(void);
void rld (void);
void choice(void);
int main ()
{
int xz;
printf("请选择所需要的功能:\n");
printf("1.查询某年某月某日为星期几,并判断是否为闰年\n");
printf("2.输出这一年的日历\n");
printf("请输入1 or 2\n");
scanf("%ld",&xz);
if (xz==1)
search();
else if (xz==2)
choice();
else
printf("输入有误请重开");
}
//输入年月日并判断
void input( int *pa,int *pb,int *pc)
{
printf("请输入年:\n");
scanf("%ld",pa);
printf("请输入月:\n");
scanf("%ld",pb);
printf("请输入日:\n");
scanf("%ld",pc);
}
//((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7
int run(int x)
{
if((x%4)==0&&(x%100)!=0||(x%400)==0)
return 1;
else
return 0;
}
//判断输入是否有误
int pand(int a,int b,int c)
{
int i=0;
int j[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(a>0&&a<99999)
i=0;
else
i=-1;
if(b>=1&&b<=12)
i=0;
else
i=-1;
if(run(a))
j[2]=29;
if(j[b-1]>=c&&j[b-1]>=1)
i=0;
else
i=-1;
return i;
}
//查询某年某月某日为星期几,并判断是否为闰年
void search()
{
int year,mouth,day;
input(&year,&mouth,&day);
int a,b,c;
b=mouth;
c=day;
char s[10];
a=pand(year,mouth,day);
if(a==-1)
printf("输入有误,请重开");
else
{
int i=0,j=year/100,y=year%100;
if(year<1582||year==1582&&mouth<10||year==1582&&mouth==10&&c<3)
{
if(mouth==1||mouth==2)
{
mouth+=12;
y--;
}
i=(y+(y/4)+(j/4)-2*j+(13*(b+1)/5)+c+2)%7;
}
else
{
if(mouth==1||mouth==2)
{
mouth+=12;
y--;
}
i=((j/4)-2*j+y+(y/4)+(13*(b+1)/5)+c-1)% 7;
}
switch(i)
{
case 0:printf("是星期日");break;
case 1:printf("是星期一");break;
case 2:printf("是星期二");break;
case 3:printf("是星期三");break;
case 4:printf("是星期四");break;
case 5:printf("是星期五");break;
case 6:printf("是星期六");
}
if(run(year))
printf("\n今年是闰年");
else
printf("\n今年不是闰年");
}
return ;
}
void choice()
{
int s;
printf("请选择输出格式\n");
printf("1.单列 or 2.双列 :");
scanf("%ld",&s);
printf("\n");
if(s==1)
rld();
else if(s==2)
rls();
else
printf("输入有误请重开");
}
//输出这一年的日历
void rld()
{
int year,mouth,day;
input(&year,&mouth,&day);
//printf("请选择")
int u=pand(year,mouth,day);
if(u==-1)
printf("输入有误,请重开");
else
{
int i,j,n=0,leap;
leap=(year%4==0&&year%100!=0)||(year%100==0);
int k=year/100,y=(year%100)-1;
if(year<=1582)
{
n=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7;
}
else
{
n=((k/4)-2*k+y+(y/4)+(13*14/5))% 7;
}
//printf("%d",n);
for(mouth=1;mouth<=12;mouth++)
{
switch(mouth)
{
case 1:
day=31;
printf("一月\t\t%d\n",year);
break;
case 2:
if(leap)
day=29;
else
day=28;
printf("二月\t\t%d\n",year);
break;
case 3:
day=31;
printf("三月\t\t%d\n",year);
break;
case 4:
day=30;
printf("四月\t\t%d\n",year);
break;
case 5:
day=31;
printf("五月\t\t%d\n",year);
break;
case 6:
day=30;
printf("六月\t\t%d\n",year);
break;
case 7:
day=31;
printf("七月\t\t%d\n",year);
break;
case 8:
day=31;
printf("八月\t\t%d\n",year);
break;
case 9:
day=30;
printf("九月\t\t%d\n",year);
break;
case 10:
day=31;
printf("十月\t\t%d\n",year);
break;
case 11:
day=30;
printf("十一月\t\t%d\n",year);
break;
case 12:
day=31;
printf("十二月\t\t%d\n",year);
break;
}
printf("----------------------------------------------------\n");
printf(" SUN MON TUE WED THD FRI SAT\n");
switch(n)
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
for(i=1,j=n;i<=day;i++,j++)
{
printf("%5d",i);
if(j%7==6)
printf("\n");
}
n=(n+day)%7;
printf("\n----------------------------------------------------");
printf("\n");
}
}
}
void rls()
{
int year,mouth,day;
input(&year,&mouth,&day);
int u=pand(year,mouth,day);
if(u==-1)
printf("输入有误,请重开");
else
{
int i,j,n1=0,leap;
leap=(year%4==0&&year%100!=0)||(year%100==0);
int day1,day2;
int k=year/100,y=(year%100)-1;
if(year<=1582)
{
n1=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7;
}
else
{
n1=((k/4)-2*k+y+(y/4)+(13*14/5))% 7;
}
for(mouth=1;mouth<=12;mouth+=2)
{
switch(mouth)
{
case 1:
day1=31;
printf("一月\t\t%d",year);
if(leap)
day2=29;
else
day2=28;
printf("\t\t\t\t\t二月\t\t%d\n",year);
break;
case 3:
day1=31;
printf("三月\t\t%d",year);
day2=30;
printf("\t\t\t\t\t四月\t\t%d\n",year);
break;
case 5:
day1=31;
printf("五月\t\t%d",year);
day2=30;
printf("\t\t\t\t\t六月\t\t%d\n",year);
break;
case 7:
day1=31;
printf("七月\t\t%d",year);
day2=31;
printf("\t\t\t\t\t八月\t\t%d\n",year);
break;
case 9:
day1=30;
printf("九月\t\t%d",year);
day2=31;
printf("\t\t\t\t\t十月\t\t%d\n",year);
break;
case 11:
day1=30;
printf("十一月\t\t%d",year);
day2=31;
printf("\t\t\t\t\t十二月\t\t%d\n",year);
break;
}
printf("--------------------------------------------------------------------------------------------------------\n");
printf(" SUN MON TUE WED THD FRI SAT\t\t SUN MON TUE WED THD FRI SAT\n");
int n2=(n1+day1)%7;
switch(n1)
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
int x=1,y=n2;
for(i=1,j=n1;i<=50;i++)
{
if(i<=day1)
printf("%5d",i);
if(i==day1)
{
switch((n1+day1)%7)
{
case 1:
printf("%30c",'\40');
break;
case 2:
printf("%25c",'\40');
break;
case 3:
printf("%20c",'\40');
break;
case 4:
printf("%15c",'\40');
break;
case 5:
printf("%10c",'\40');
break;
case 6:
printf("%5c",'\40');
break;
}
}
if(j%7==6||i==day1&&x!=day2)
{
printf("\t\t");
if(j==6)
{
switch(n2)
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
}
while(x<=day2)
{
printf("%5d",x);
if(y%7==6)
{
x+=1;
y+=1;
break;
}
x++;
y++;
}
printf("\n");
}
j++;
}
int temp=n1;
n1=(n2+day)%7;
n2=(temp+day)%7;
printf("\n--------------------------------------------------------------------------------------------------------\n");
}
}
}

View File

@ -0,0 +1,326 @@
#include<stdio.h>
#include<stdlib.h>
int main(){
int a;
printf("1:查看日期为星期几,该年是否为闰年\n");
printf("2:单列输出该年日历\n");
printf("3:双列输出该年日历\n");
printf("0:输出0退出程序\n");
printf("请输出你想查询的序号\n");
scanf("%d",&a);
switch(a){
case(0):break;
case(1):
while(1){
//星期计算方法公元元年1月1日至指定日期总天数%7
int year,month,day;
printf("请输入年(格式0000年)\n");
scanf("%d",&year);//输入年份
if(year==0)
break;
if(year==1582&&month==10&&day>4&&day<15){
printf("输入有误,请重新输入\n\n\n");
continue;}
//判断年的天数
int sumyear1=0;//表示从公元元年开始 ,表示闰年总数
if(year>1582){
for(int i=1;i<=year-1;i++){
if((i%4==0&&i%100!=0)||i%400==0)//公历判断闰年方法
sumyear1++;
}
}
else{
for(int i=1;i<=year-1;i++){
if(i%4==0){
sumyear1++;
}
//儒略历判断闰年方法
}
sumyear1+=5;//儒略历1582年公元元年是星期六所以加上五天
}
int sumday;//统计总天数
sumday=(year-1)*365+sumyear1;//统计至去年的总天数
// 判断公历与儒略历二月天数
int feb;
if(year>1582){
if((year%4==0&&year%100!=0)||year%400==0){
printf("%d年是闰年\n\n",year);
feb=29;}
else{
printf("%d年是平年\n\n",year);
feb=28;}
}
else{
if(year%4==0){
feb=29;
printf("%d年是闰年\n\n",year);}
else{
printf("%d年是平年\n\n",year);
feb=28;}
}
int a[13]={0,31,feb,31,30,31,30,31,31,30,31,30,31};
printf("请输入月(格式00月)\n");
scanf("%d",&month);
if(month==0)
break;//输入月份
//统计公元元年至去年总天数加本年一月至上月总天数
for(int i=1;i<=month-1;i++)
sumday+=a[i];//统计完成
if(year==1582&&(month==11||month==12))
sumday+=11;
printf("请输入日(格式00日)\n\n");
scanf("%d",&day);//输入日
if(day==0)
break;
if(year==1582&&month==10&&day>4&&day<15){
printf("输入有误,请重新输入\n");
continue;
}
//从公元元年开始求星期
int week;
if(year==1582&&month==10&&day>=15){
week=(sumday+day-10)%7;
}
else week=(sumday+day)%7;
if(week!=0){
printf("%d年%d月%d日是星期%d\n\n",year,month,day,week);
}
else{
printf("%d年%d月%d日是星期日\n\n",year,month,day);
}
}
break;
case(2):
while(1){/////////////重复 单列输出
//星期计算方法公元元年1月1日至指定日期总天数%7
int year,month;
printf("请输入年(格式0000年)\n");
scanf("%d",&year);//输入年份
if(year==0)
break;
//判断年的天数
int sumyear1=0;//表示从公元元年开始 ,表示闰年总数
if(year>1582){
for(int i=1;i<=year-1;i++){
if((i%4==0&&i%100!=0)||i%400==0)//公历判断闰年方法
sumyear1++;
}
}
else{
for(int i=1;i<=year-1;i++){
if(i%4==0){
sumyear1++;
}
//儒略历判断闰年方法
}
sumyear1+=5;//儒略历1582年公元元年是星期六所以加上五天
}
int sumday;//统计总天数
sumday=(year-1)*365+sumyear1;//统计至去年的总天数
// 判断公历与儒略历二月天数
int feb;
if(year>1582){
if((year%4==0&&year%100!=0)||year%400==0){
feb=29;}
else{
feb=28;}
}
else{
if(year%4==0){
feb=29;}
else{
feb=28;}
}
int a[13]={0,31,feb,31,30,31,30,31,31,30,31,30,31};
for(month=1;month<=12;month++){
//统计公元元年至去年总天数加本年一月至上月总天数
for(int i=1;i<=month-1;i++)
sumday+=a[i];//统计完成
if(year==1582&&(month==11||month==12))
sumday+=11;
int day=1,week;
week=(sumday+day)%7;
printf("\n------------------ %d 年 %d 月 ---------------------\n\n",year,month);
printf("日 一 二 三 四 五 六\n\n");
///放入1号
for(int j=1;j<=week;j++){
printf(" ");
}
//放入其他日期 当天日期加1号>=7
if(year==1582&&month==10){
for(int j=1;j<=a[month];j++){
printf("%d ", j);
if((week+j)>=7){
printf("\n\n");
week-=7;
}
if(j==4){//单独判断1582
j+=10;
week-=10;
}
}
}
else{
for(int j=1;j<=a[month];j++){
printf("%d ", j);
if((week+j)>=7){
printf("\n\n");
week-=7;
}
}
}
}
}
case(3):
while(1){/////////////重复 双列输出
//星期计算方法公元元年1月1日至指定日期总天数%7
int year,month;
printf("请输入年(格式0000年)\n");
scanf("%d",&year);//输入年份
if(year==0)
break;
//判断年的天数
int sumyear1=0;//表示从公元元年开始 ,表示闰年总数
if(year>1582){
for(int i=1;i<=year-1;i++){
if((i%4==0&&i%100!=0)||i%400==0)//公历判断闰年方法
sumyear1++;
}
}
else{
for(int i=1;i<=year-1;i++){
if(i%4==0){
sumyear1++;
}
//儒略历判断闰年方法
}
sumyear1+=5;//儒略历1582年公元元年是星期六所以加上五天
}
int sumday;//统计总天数
sumday=(year-1)*365+sumyear1;//统计至去年的总天数
// 判断公历与儒略历二月天数
int feb;
if(year>1582){
if((year%4==0&&year%100!=0)||year%400==0){
feb=29;}
else{
feb=28;}
}
else{
if(year%4==0){
feb=29;}
else{
feb=28;}
}
int a[13]={0,31,feb,31,30,31,30,31,31,30,31,30,31};
for(month=1;month<=12;month++){
//统计公元元年至去年总天数加本年一月至上月总天数
for(int i=1;i<=month-1;i++)
sumday+=a[i];//统计完成
if(year==1582&&(month==11||month==12))
sumday+=11;
int day=1,week;
week=(sumday+day)%7;
printf("\n--------------------------------------------\n\n");
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六 \n\n");
for(month=1;month<=12;month+=2){
///放入1号
for(int j=1;j<=week;j++){
printf(" ");
}
//放入其他日期 当天日期加1号>=7
for(int j=1;j<=a[month+2];j++){
printf("%d ", j);
if((week+j)>=7){
printf("\n\n");
week-=7;
}
}
}
for(month=2;month<=12;month+=2){
for(int j=1;j<=week;j++){
printf(" ");
}
//放入其他日期 当天日期加1号>=7
if(year==1582&&month==10){
for(int j=1;j<=a[month];j++){
printf("%d ", j);
if((week+j)>=7){
printf("\n\n");
week-=7;
}
if(j==4){//单独判断1582
j+=10;
week-=10;
}
}
}
else{
for(int j=1;j<=a[month];j++){
printf("%d ", j);
if((week+j)>=7){
printf("\n\n");
week-=7;
}
}
}
}
}
}
}
return 0;
}

View File

@ -0,0 +1,254 @@
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void arr(long long int year,int month,int day)//判断星期几
{
int w;
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" **************************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎使用万年历!! *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **************************************\n");
printf(" *请输入所查日期:");
while(scanf("%lld %d %d",&year,&month,&day)!=EOF)
{
int c=year/100;
int y=year%100;
if(month<0||month>12||day>31)
{
printf(" *请重新输入所查日期:");
}
else
{
if(year<1582||(year==1582&&month<10)||(year==1582&&month==10&&day<=4))
{
if(month==1||month==2)
{
y--;
month+=12;
}
w=(y+y/4+c/4-2*c+(13*(month+1))/5+day+2)%7;
}
else
{
if(month==1||month==2)
{
y--;
month+=12;
}
w=(y+y/4+c/4-2*c+(13*(month+1))/5+day-1)%7;
}
if(year==1582&&month>10)
{
w -=3;
}
switch(w)
{
case 1:
printf("星期一\n");break;
case 2:
printf("星期二\n");break;
case 3:
printf("星期三\n");break;
case 4:
printf("星期四\n");break;
case 5:
printf("星期五\n");break;
case 6:
printf("星期六\n");break;
case 0:
printf("星期日\n");
}
}
}
return ;
}
void add(long long int year)//判断闰年
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" **************************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎使用万年历!! *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **************************************\n");
printf(" *请输入年份:");
scanf("%lld",&year);
if((year%4==0&&year%100!=0)||(year%100==0))
printf(" 闰年");
else
printf(" 平年");
return ;
}
void abb(long long int year,int month,int day)//日历
{
int i,j,n,leap;
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" **************************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎使用万年历!! *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **************************************\n");
printf(" *请输入年份:");
scanf("%lld",&year);
printf("\n\n");
leap=(year%4==0&&year%100!=0)||(year%100==0);
n=((year-1)*365+ (year-1)/4-(year-1)/100+(year-1)/400+1) % 7;
for(month=1;month<=12;month++)
{
switch(month)
{
case 1:
day=31;
printf("一月(%d)\t\t%lld\n",month,year);
break;
case 2:
if(leap)
day=29;
else
day=28;
printf("二月(%d)\t\t%lld\n",month,year);
break;
case 3:
day=31;
printf("三月(%d)\t\t%lld\n",month,year);
break;
case 4:
day=30;
printf("四月(%d)\t\t%lld\n",month,year);
break;
case 5:
day=31;
printf("五月(%d)\t\t%lld\n",month,year);
break;
case 6:
day=30;
printf("六月(%d)\t\t%lld\n",month,year);
break;
case 7:
day=31;
printf("七月(%d)\t\t%lld\n",month,year);
break;
case 8:
day=31;
printf("八月(%d)\t\t%lld\n",month,year);
break;
case 9:
day=30;
printf("九月(%d)\t\t%lld\n",month,year);
break;
case 10:
day=31;
printf("十月(%d)\t\t%lld\n",month,year);
break;
case 11:
day=30;
printf("十一月(%d)\t\t%lld\n",month,year);
break;
case 12:
day=31;
printf("十二月(%d)\t\t%lld\n",month,year);
break;
}
printf("----------------------------------------------------\n");
printf(" SUN MON TUE WED THD FRI SAT\n");
switch(n)
{
case 1:
printf("%5c",'\40');
break;
case 2:
printf("%10c",'\40');
break;
case 3:
printf("%15c",'\40');
break;
case 4:
printf("%20c",'\40');
break;
case 5:
printf("%25c",'\40');
break;
case 6:
printf("%30c",'\40');
break;
}
for(i=1,j=n;i<=day;i++,j++)
{
printf("%5d",i);
if(j%7==6)
printf("\n");
}
n=(n+day)%7;
printf("\n----------------------------------------------------\n");
}
return ;
}
void mean_main(long long int year,int month,int day)//菜单
{
int a;
while(1)
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" **************************************\n");
printf(" * 欢迎使用万年历!! *\n");
printf(" * 1.查阅闰年 *\n");
printf(" * 2.输出日历 *\n");
printf(" * 3.查询对应的日期 *\n");
printf(" * 4.退出系统 *\n");
printf(" **************************************\n");
printf(" *请输入1~4:");
do
{
scanf("%d",&a);
if(a>0&&a<5)
break;
else
printf(" *请重新输入:");
}while(1);
system("cls");
switch(a)
{
case 1:add(year);break;
case 2:abb(year,month,day);break;
case 3:arr(year,month,day);break;
case 4:break;
}
}
return ;
}
int main()
{
long long int year;
int month,day;
mean_main(year,month,day);
}

View File

@ -0,0 +1,183 @@
#include <stdio.h>
#include <stdlib.h>
int isLeapYear(int year) {
if ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0)) {
return 1;
}
return 0;
}
int getDaysInMonth(int year,int month){
scanf("%d%d",&year,&month);
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
printf("31");
else if(month==4||month==6||month==9||month==11)
printf("30");
else{
if((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0))
printf("29");
else
printf("28");
}
return 0;
}
int getDayOfWeek(int year, int month, int day) {
if (month < 3) {
month += 12;
year--;
}
int c = year / 100;
int y = year % 100;
int week = (day + 2 * month + 3 * (month + 1) / 5 + y + y / 4 + c / 4 - 2 * c + 7) % 7;
return week;
}
/*单月日历*/
void x(int year, int month) {
printf("%d%d\n", year, month);
printf("日 一 二 三 四 五 六\n");
int dayOfWeek = getDayOfWeek(year, month, 1);
for (int i = 0; i < dayOfWeek; i++) {
printf(" ");
}
int daysInMonth;
int getDaysInMonth;
for (int i = 1; i <= daysInMonth; i++) {
printf("%2d ", i);
if ((i + dayOfWeek) % 7 == 0) {
printf("\n");
}
}
if ((daysInMonth + dayOfWeek) % 7!= 0) {
printf("\n");
}
}
void z(int year, int month) {
printf(" %d%d%d%d\n", year, month, year, month + 1);
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
int dayOfWeek1 = getDayOfWeek(year, month, 1);
int dayOfWeek2 = getDayOfWeek(year, month + 1, 1);
for (int i = 0; i < dayOfWeek1; i++) {
printf(" ");
}
int daysInMonth1 ;
int daysInMonth2 ;
int i1 = 1, i2 = 1;
while (i1 <= daysInMonth1 || i2 <= daysInMonth2) {
if (i1 <= daysInMonth1) {
printf("%2d ", i1);
i1++;
} else {
printf(" ");
}
if ((i1 + dayOfWeek1 - 1) % 7 == 0 && i1 <= daysInMonth1) {
printf(" ");
}
if (i2 <= daysInMonth2) {
printf("%2d ", i2);
i2++;
} else {
printf(" ");
}
if ((i2 + dayOfWeek2 - 1) % 7 == 0 && i2 <= daysInMonth2) {
printf("\n");
}
}
if ((daysInMonth1 + dayOfWeek1) % 7!= 0 || (daysInMonth2 + dayOfWeek2) % 7!= 0) {
printf("\n");
}
}
void showMenu() {
printf("菜单:\n");
printf("1. 查询某年某月某日的日期是周几及该年是否为闰年\n");
printf("2. 输入年份,输出这一年的单月日历\n");
printf("3. 输入年份,输出这一年的双月日历(并排显示两个月)\n");
printf("4.");
}
int main() {
int choice;
int year, month, day;
int m;
do {
showMenu();
scanf("%d",&choice);
switch (choice) {
case 1:
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&month);;
printf("请输入日期:");
scanf("%d",&day);
if (year < 1583 && year == 1582 && month == 10 && day >= 5 && day <= 14) {
printf("1582年10月5日 - 14日不存在请重新输入。\n");
continue;
}
printf("%d%d%d", year, month, day);
switch (getDayOfWeek(year, month, day)) {
case 0:
printf("\n");
break;
case 1:
printf("\n");
break;
case 2:
printf("\n");
break;
case 3:
printf("\n");
break;
case 4:
printf("\n");
break;
case 5:
printf("\n");
break;
case 6:
printf("\n");
break;
}
if (is LeapYear){
printf("%d\n", year);
} else {
printf("%d年不是闰年\n", year);
}
break;
case 2:
printf("请输入年份:");
scanf("%d",&year);
for (month = 1; month <= 12; month++) {
x(year, month);
printf("\n");
}
break;
case 3:
printf("请输入年份:");
scanf("%d",&year);;
for (month = 1; month <= 11; month += 2) {
z(year, month);
printf("\n");
}
break;
default:
printf("无效的选择,请重新输入。\n");
}
} while (choice!= 0);
return 0;
}

View File

@ -0,0 +1,249 @@
#include<stdio.h>
void fun(void);
int year;
int shiji;
int yue;
int ri;
int w;//星期
int y; //年份后两位
void getday(int first_day[],int y);
void shuchurili(int days[],int first_day[]);
int main()
{{
int a;
printf("查询某年某月某日的日期是周几,该年是否为闰年 请输入1\n");
printf("输入年份,输出这一年的日历,要求能够单列输出和双列输出 请输入2\n");
scanf("%d",&a);
if(a==1)
{
scanf("%d-%d-%d",&year,&yue,&ri);
if((year<=0||yue<=0||ri<=0)||(year==1582&&yue==10&&(ri==5||ri==6||ri==7||ri==8||ri==9||ri==10||ri==11||ri==12||ri==13||ri==14))
{{
printf("输入错误,请重新输入:");
scanf("%d-%d-%d",&year,&yue,&ri);
} }else {
if(yue<3)
{
year--;
yue+=12;
}
shiji=(year/100);
y=year%100;
w=shiji/4-2*shiji+y+y/4+13*(yue+1)/5+ri-1;
if(w%7==0)
printf("星期7");
else
printf("星期%d ",w%7);
if((year%4==0&&year%100!=0)||(year%400==0))
printf("闰年");
else
printf("非闰年");
}
}}
//第二部分
if(a==2)
{
//单双列输出选择
printf("请选择您要输出的格式\n");
printf("单列输出请按1\n");
printf("双列输出请按2\n");
int b;
scanf("%d",&b);
if(b==1)
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int first_day[12]={0};
int year=0;
int i=0;
int a=1;
while(a)
{
printf("请输入年份:");
scanf("%d",&year);
//报错
if(year<=0)
{
printf("输入错误,请重新输入:");
scanf("%d",&year);
}
--a;
}
//获取该年每个月所属星期
getday(first_day,year);
if((year%4==0&&year%100!=0)||(year%400==0))
days[1]=29;
//输出日历
shuchurili(days,first_day);
return 0;
}else
//双列输出
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int first_day[12]={0};
int year=0;
int i=0;
int a=1;
while(a)
{
printf("请输入年份:");
scanf("%d",&year);
//报错
if(year<=0)
{
printf("输入错误,请重新输入:");
scanf("%d",&year);
}
--a;
}
//获取该年每个月所属星期
getday(first_day,year);
if((year%4==0&&year%100!=0)||(year%400==0))
days[1]=29;
//输出日历
shuchurili(days,first_day);
return 0;
}
}
return 0;
}
void getday(int first_day[],int y)
{
int m=0;
int d=1;
int w=0;
for(m=3;m<=12;m++)
{
w=(d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
first_day[m-1]=w;
}
y-=1;
for (m=13;m<=14;m++)
{
w = (d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
first_day[m-13] = w;
}
}
void shuchurili(int days[],int first_day[])
{
int dyt=0;
int d=0,i=0,j=0;
for(i=0;i<12;i++)
{
dyt=first_day[i];
printf(" %2d 月 \n", i+1);
printf(" 日 一 二 三 四 五 六 \n");
//1号前的空格
//改后
for(j=0;j<dyt;j++)
printf(" ");
for(d=1;d<=days[i];d++)
{
printf(" %2d",d);
if((d+dyt)%7==0)
printf("\n");
}
printf("\n");
}
}
/*
//第二部分
#include<string.h>
//判断闰年的函数
int isleapyear(int year)
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
//计算每月天数的函数
int month(int year,int yue)
{
int run[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(yue==2&&isleapyear(year))
{
return 29;
}
return run[yue];
}
//计算给定日期是星期几(蔡勒公式)
int week(int year,int yue,int ri)
{
if(yue<3)
{
year--;
yue+=12;
}
shiji=(year/100);
y=year%100;
w=shiji/4-2*shiji+y+y/4+13*(yue+1)/5+ri-1;
return (w%7+7)%7;
}
//输出日历函数
void rili(int year)
{
char *week[]={"","","","","","",""};
scanf("&d-%d-%d",&year,&yue,&ri);
for(yue=1;yue<=12;yue++)
{
int i;
printf("%d ",yue);
for(i=0;i<7;i++)
printf("%s",week[i]);
printf("\n");
int w=week(year,yue,1);//w为每月第一日是星期几
int jx=month(year,yue);
char a[w]={"0"};
char b[][7];//输出日期的数组
if((year%4==0&&year%100!=0)||(year%400==0))
{
for(int n=0;n<7;n++)
{
for(int m=1;m<jx;m++)
{
for(int e=1;e<jx;e++)
b[m][n]='e';
}
}
for(int m=0;m<6;m++)
{
for(int n=0;n<7;n++)
printf("%d",a[m][n]);
printf("\n");
}
}
}
}
*/

View File

@ -0,0 +1,96 @@
#include<stdio.h>
#include<stdlib.h>
int year,month,day;
int run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int ping[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char weekday[7][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
char yuefen[12][20]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
int leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
}
int nian(int year,int month,int day,int run[],int ping[])
{
int i,sum=0;
for(i=1900;i<year;i++)
{
if(leap(i)==1)
{
sum+=366;
}
else
{
sum+=365;
}
}
for(i=0;i<month-1;i++)
{
if(leap(year)==1)
{
sum+=run[i];
}
else
{
sum+=ping[i];
}
}
return sum;
}
void dy(int sum,int year,int month)
{
int result,temp,i;
result=sum%7;
for(i=0;i<result;i++)
{
printf("\t");
}
temp=7-result;
if(leap(year)==1)
{
for(i=1;i<=run[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
else
{
for(i=1;i<=ping[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
}
int main()
{
printf("请输入年月:");
scanf("%d%d",&year,&month);
for(int i=0;i<12;i++)
{
printf("%s\n",yuefen[i]);
for(int j=0;j<=7;j++)
{
printf("%s\t",weekday[j]);
}
printf("\n");
int sum=nian(year,month,day,run,ping);
dy(sum,year,month);
}
return 0;
}

View File

@ -0,0 +1,186 @@
#include<bits/stdc++.h>
// 判断是否为闰年 (考虑1582年前后差异
int isLeapYear(int year) {
if (year >= 1582) {
if ((year%4 ==0 && year%100!=0) || year%400==0) {
return 1;
}
return 0;
} else {
if (year % 4 == 0) {
return 1;
}
return 0;
}
}
// 检查输入是否为数字
int isnumber(char input[]) {
int i = 0;
while (input[i]!= '\0') {
if (input[i] < '0' || input[i] > '9') {
return 0;
}
i++;
}
return 1;
}
// 检查日期是否有效
int Dateisture(int year, int month, int day) {
if (year == 1582 && month == 10 && (day > 4 && day <= 14)) {
return 0;
}
int daysInMonth[] = {0, 31, 28, 31, 32, 30, 31, 30, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
if(year>=1 && month>=1 && month<=12 && day>=1 && day<=daysInMonth[month]){
return 1;
}
return 0;
}
// 计算给定日期是星期几考虑1582年前后差异
int dayOfWeek(int year, int month, int day) {
if (year >= 1582) {
if (month < 3) {
year--;
month += 12;
}
int c = year / 100;
int y = year % 100;
int week = (c / 4 - 2 * c + y + y / 4 + 13 * (month + 1) / 5 + day - 1) % 7;
if (week < 0) {
week += 7;
}
return week;
} else {
int a = (14 - month) / 12;
int y = year - a;
int m = month + 12 * a - 2;
int week = (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7;
return week;
}
}
// 输出(单列)
void Single(int year) {
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
printf("%d年的日历(单列):\n", year);
int dayOfWeekJan1 = dayOfWeek(year, 1, 1);
for (int month = 1; month <= 12; month++) {
printf("Mon Tue Wed Thu Fri Sat Sun\n");
for (int day = 1; day <= daysInMonth[month]; day++) {
printf("%3d ", day);
if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) {
printf("\n");
}
}printf("\n");
}
printf("\n");
}
// 输出(双列)
void Double(int year) {
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
printf("%d年的日历(双列):\n", year);
int dayOfWeekJan1 = dayOfWeek(year, 1, 1);
for (int month = 1; month <= 12; month++) {
printf("Mon Tue Wed Thu Fri Sat Sun \t Mon Tue Wed Thu Fri Sat Sun");
for (int day = 1; day <= daysInMonth[month]; day++) {
printf("%3d ", day);
if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) {
printf("\n");
}
}printf("\n");
}
printf("\n");
}
int main() {
char choice[10];
int zh;
do{
printf("1. 我想查询某年某月某日是星期几,该年是否为闰年\n");
printf("2. 我想查询某年的日历\n");
printf("3. 上个厕所\n");
printf("请选择: ");
scanf("%9s",choice);
if(!isnumber(choice)){
printf("输入错误,请重新输入\n");
continue;
}
zh=choice[0]-'0';
switch(zh){
case 1: char years[10], months[10], days[10];
int year, month, day;
while (1) {
printf("请输入年份: ");
scanf("%s", years);
if (!isnumber(years)) {
printf("错误,重新开始\n");
continue;
}
year = atoi(years);
printf("请输入月份: ");
scanf("%s", months);
if (!isnumber(months)) {
printf("请误,重新开始\n");
continue;
}
month = atoi(months);
printf("请输入日期: ");
scanf("%s", days);
if (!isnumber(days)) {
printf("请误,重新开始\n");
continue;
}
day = atoi(days);
if (!Dateisture(year, month, day)) {
printf("输入错误,请重新输入\n");
continue;
}
int weekDay = dayOfWeek(year, month, day);
char weekDayNames[][10] = {"周一", "周二", "周三", "周四", "周五", "周六", "周天"};
printf("%d-%02d-%02d是%s\n", year, month, day, weekDayNames[weekDay]);
if (isLeapYear(year)) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
break;
}
case 2:
char yearss[10];
while (1) {
printf("请输入年份: ");
scanf("%s", yearss);
if (!isnumber(yearss)) {
printf("请输入正确的年份\n");
continue;
}
year = atoi(yearss);
Single(year);
Double(year);
break;
}
case 3:printf("不行");break;
default:printf("请选择正确选项\n");
continue;
}
}while(zh!=3);
}

View File

@ -0,0 +1,195 @@
#include<stdio.h>
#include<time.h>
#include<stdbool.h>
void Menu1()
{
printf("请输入一个数字来表示你要进行的操作:\n");
printf("1.让我看看这一年的日历(单行)\n");
printf("2.让我看看这一年的日历(双行)\n");
printf("3.让我看看这天是周几\n");
printf("4.让我看看这一年是不是闰年\n");
}//构建菜单
int main() {
int menu, year;
Menu1(); // 显示菜单
scanf("%d", &menu);
if (menu == 1) {
printf("让我看看这一年的日历(单行)\n");
printf("请输入年份:");
scanf("%d", &year);
// 清除输入缓冲区中的换行符
while (getchar() != '\n');
if (year <= 0) {
printf("您输入的年份有误!\n");
return 1; // 使用返回值表示错误
}
}
int runnian(int n)//记录闰年月份日期
{
switch(n)
{
case 1:return 31;
case 2:return 29;
case 3:return 31;
case 4:return 30;
case 5:return 31;
case 6:return 30;
case 7:return 31;
case 8:return 31;
case 9:return 30;
case 10:return 31; }
}
int pingnian(int year,int month)//记录平年月份日期
{
if (year==1582&&month==10)
{
return 21;//1582年10月只有21天
}
switch(month)
{
case 1:return 31;
case 2:return 28;
case 3:return 31;
case 4:return 30;
case 5:return 31;
case 6:return 30;
case 7:return 31;
case 8:return 31;
case 9:return 30;
case 10:return 31;
case 11:return 30;
case 12:return 31;
}
}
void run(int week)//闰年日历输出
{
int n=0;//记录换行次数
int w=week;
int i,j,k;
for(i=1;i<=12;i++)
{
printf("%d月\n",i);
printf("日 一 二 三 四 五 六\n") ;
for(k=0;k<w;k++)//空格对齐
{
printf(" ");
n++;
}
for(j=1;j<=runnian(i);j++){//输出每月的天
if(n%7==0){
printf("\n");
}
printf("%d ",j);
n++;
}
w=(w+runnian(i))%7;//周数
n=n-w;
printf("\n\n");
}
}
void ping(int year)//平年日历输出
{
int n=0;//记录换行
int w=getFirstDayOfYear(year);//获取该年第一天是星期几
int i,j,k;
for(i=1;i<=12;i++)
{
printf("%d月\n", i);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for (k=0;k<w;k++)
{
printf(" ");
n++;
}
for (j=1;j<=pingnian(year,i);j++)
{//输出每月的天
if(n%7==0) // 七天换行
{
printf("\n");
}
printf("%d ",j);
n++;
}
w=(w+pingnian(year,i))%7;
n=n-w;
printf("\n\n");
}
}
// 获取某个月的天数
int getDaysInMonth(int year, int month) {
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
return 31;
case 4: case 6: case 9: case 11:
return 30;
case 2:
return isLeapYear(year) ? 29 : 28;
default:
return 0; // 不会发生,只是为了完整性
}
}
int main() {
int year;
printf("Enter the year: ");
scanf("%d", &year);
printCalendar(year);
}
if(menu==3)
{
int weekday=week(year,month,day);
else if(menu==3)
{
int year,month,day;
{printf("查询某年某月某日的日期是周几\n");
scanf("%d %d %d",&year,&month,&day);
if(month<3)
{
year--;
month+=12;
printf("%d",year);//一年中前两个月较为特殊归入前一年内计算1月—— 13月2 月—— 14月
}
else
scanf("%d %d %d",&year,&month,&day);
do
{
int y,c;
int week;
y=year/100;
c=year%100;
if(year<1582&&month<10&&day<4)
week=(day+1+2*month+3*(month+1)/5+y+y/4+5) % 7;
else
week=(day+1+2*month+3*(month+1)/5+y+y/4-y/100+y/400)%7;//利用蔡乐公式计算某年某月某日的日期是周几
do{
switch(week)
{
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;
case 7:printf("Sunday");break;
default:break;
}
}while(week>0&&week<8);//利用循环得到某年某月某日的日期是周几
}
if (menu == 4) {
printf("4.让我看看这一年是不是闰年\n");
{
int year,month,day;
printf("请输入一个年份,判断该年是否为闰年");
if((year%4==0&&year%100!=0)||(year%400==0))//判断是闰年还是平年
{printf("是闰年");}
else
{printf("不是闰年");}
}
return 0;
}

View File

@ -0,0 +1,147 @@
#include<stdio.h>
#include<stdlib.h>
int runYear(int n); //日历不会写痛苦
int RunYear(int year);
void printMonth(int year, int month);
int dayOfWeek(int year, int month, int day);
void printMonth(int year, int month)
{
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int startDay = dayOfWeek(year, month, 1);
int days = daysInMonth[month - 1];
if (month == 2 && RunYear(year))
{
days = 29;
}
else if (year == 1582 && month == 10)
{
days = 21;
}
printf("\n%d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
// 打印空格直到第一天
for (int i = 0; i < startDay; i++)
{
printf(" ");
}
// 打印日期
for (int day = 1; day <= days; day++)
{
printf("%2d ", day);
if ((day + startDay) % 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
int dayOfWeek(int year, int month, int day)
{
if (month < 3)
{
month += 12;
year -= 1;
}
int k = year % 100;
int j = year / 100;
int h = day + 13 * (month + 1) / 5 + k + k / 4 + j / 4 + 5 * j; //zeller公式
h = h % 7;
return 0;
}
int RunYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int runYear(int n)
{
printf("请输入年份\n");
scanf("%d",&n);
if(n%4==0&&n%100!=0||n%400==0)
{
printf("是闰年\n");
}
else
{
printf("不是闰年\n");
}
}
int main()
{
int choice,n,year,month,day;
printf("1.查询对应的年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n");
printf("请选择序号=");
scanf("%d",&choice);
do
{
switch(choice)
{
case 1:
{
int year;
printf("请输入年份:");
scanf("%d", &year);
// 打印全年的日历
for (int month = 1; month <= 12; month++)
{
printMonth(year, month);
}
return 0;
}
case 2:
{
printf("请输日期(年 月 日)\n");
scanf("%d %d %d",&year,&month,&day);
int runYear(year);
if(0)
{
if (month < 3) //平年
{
month += 12;
year -= 1;
}
int c = year % 100;
int y = year / 100;
int h = day + 13 * (month + 1) / 5 + c + c / 4 + y / 4 + 5 * y; //zeller公式
h = h % 7;
printf("星期%d",h);
}
else
{
if (month < 3) //润年
{
month += 12;
year -= 1;
}
int c = year % 100;
int y = year / 100;
int h = day-1 + 13 * (month + 1) / 5 + c + c / 4 + y / 4 + 5 * y; //zeller公式
h = h % 7;
printf("星期%d",h);
}
return 0;
}
case 3:
{
runYear(n);
}
case 4:
return 0;
default:
{
printf("输入错误!请重新选择\n");
printf("请选择序号=");
scanf("%d",&choice);
}
}
} while(choice);
return 0;
}

View File

@ -0,0 +1,384 @@
#include<bits/stdc++.h>
//需求:
//1.设计判断闰年函数
//2.设计查询某年某日日期星期几,
//3.日历的输出(单双列)
//4.菜单选择要有纠错功能 ,也就是说每个菜单要有一个函数可供返回 ,即每个最好要有一个单独的函数来满足
//5.1528年少了十天,据查证是因为罗马教皇决定在1582年10月4日后使用格利戈里历法英国是在1752年9月3日后才接受使用格利戈里历法
//1.闰年判断函数,思路:常见判断闰年条件
int isLeapyear(int year)
{
return(year%400==0)||(year%4==0&&year%100!=0);//如果是闰年,则为真
}
int monthsday(int year,int month)
{
int monthsday[]={31,28,31,30,31,30,31,31,30,31,30,31};
if (month==2&&isLeapyear(year))//如果是闰年,二月有二十九天
{
return 29;
}
return monthsday[month-1];
}
int getFirstDayOfYear(int year)//今年的第一天是周几
{
int d=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400;
if (year>1582)
{
if (year==1583)
{
d-=10;
}
}
return d%7;
}
int getDaysInMonth(int year,int month)
{
int daysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(month==2&&isLeapyear(year))
{
return 29;//闰年二月有29天
}
if (year == 1582 && month == 10) {
return 21; // 1582年十月只有21天
}
return daysInMonth[month-1];//返回对应月份的天数
}
//计算给定日期是星期几0表示星期日1-6表示周一到周六
int getDayOfWeek(int year, int month, int day)
{
int t[]={0,3,2,5,0,3,5,1,4,6,2,4};//调整不同月在不同年中的偏移
if (month<3)
{
year--;
}
return(year+year/4-year/100+year/400+t[month-1]+day)%7;
}
//2.查询哪年哪月是周几
int week(int year,int month,int day)//运用泰勒公式
{
if(month<3)
{
month+=12;
year--;
}
if(year<1583)
{
int h=(day+1+2*month+3*(month+1)/5+year+year/4+5)%7;
return h; //h表示某时间是星期几
}
else{
int h=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;//蔡勒公式w=(d + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400(闰年调整))%
return h+1;//h+1是因为1582年以后蔡勒公式计算会少一天
}
}
//3.日历的输出
int runnian(int n)//记录闰年月份日期
{
switch(n)
{
case 1:return 31;
case 2:return 29;
case 3:return 31;
case 4:return 30;
case 5:return 31;
case 6:return 30;
case 7:return 31;
case 8:return 31;
case 9:return 30;
case 10:return 31;
case 11:return 30;
case 12:return 31;
}
}
int pingnian(int year,int month)//记录平年月份日期
{
if (year==1582&&month==10)
{
return 21;//1582年10月只有21天
}
switch(month)
{
case 1:return 31;
case 2:return 28;
case 3:return 31;
case 4:return 30;
case 5:return 31;
case 6:return 30;
case 7:return 31;
case 8:return 31;
case 9:return 30;
case 10:return 31;
case 11:return 30;
case 12:return 31;
}
}
void run(int week)//闰年日历输出
{
int n=0;//记录换行次数
int w=week;
for(int i=1;i<=12;i++)
{
printf("%d月\n",i);
printf("日 一 二 三 四 五 六\n") ;
for(int k=0;k<w;k++)//空格对齐
{
printf(" ");
n++;
}
for(int j=1;j<=runnian(i);j++){//输出每月的天
if(n%7==0){
printf("\n");
}
printf("%d ",j);
n++;
}
w=(w+runnian(i))%7;//周数
n=n-w;
printf("\n\n");
}
}
void ping(int year)//平年日历输出
{
int n=0;//记录换行
int w=getFirstDayOfYear(year);//获取该年第一天是星期几
for(int i=1;i<=12;i++)
{
printf("%d月\n", i);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for (int k=0;k<w;k++)
{
printf(" ");
n++;
}
for (int j=1;j<=pingnian(year,i);j++)
{//输出每月的天
if(n%7==0) // 七天换行
{
printf("\n");
}
printf("%d ",j);
n++;
}
w=(w+pingnian(year,i))%7;
n=n-w;
printf("\n\n");
}
}
//两个月的日历
void printTwoMonths(int year)
{
static int printed=0;//静态变量检测是否打印过日历
if(printed)
{
return;//如果打印过直接返回
}
int start_day[12];
start_day[0]=getFirstDayOfYear(year);
for (int month=1;month<12;month++)//计算每月起始星期几
{
start_day[month]=(start_day[month-1]+getDaysInMonth(year,month))%7;
}
const char *months[]={ "一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
for (int i=0;i<6;i++)
{
printf("\n");
for (int j=0; j < 2; j++)
{
int month=i*2+j+1;
printf(" %s %d ", months[month-1],year);
}
printf("\n");
for (int j=0;j<2;j++)
{
printf("Sun Mon Tue Wed Thu Fri Sat ");
}
printf("\n");
int max_days[2]={getDaysInMonth(year,i*2+1),getDaysInMonth(year,i*2+2)};//获取两个月的最大天数和起始星期几
int start_days[2]={start_day[i*2],start_day[i*2+1]};
//打印日期
int day[2]={1,1};//每个月的当前日期
int printed_anything=1;//标记是否有剩余日期可打印
while(printed_anything)
{
printed_anything=0;
for(int j=0;j<2;j++)
{
if(day[j]==1)//打印月初的空格
{
for(int k=0;k<start_days[j];k++)
{
printf(" ");
}
}
while(day[j]<=max_days[j]&&((day[j]+start_days[j]-1)%7)!=6) // 打印日期
{
printf(" %2d ",day[j]);
day[j]++;
printed_anything=1;
}
if(day[j] <= max_days[j]) // 打印最后一个日期,换行并跳到下一个月
{
printf(" %2d ",day[j]);
day[j]++;
printed_anything=1;
}
else
{
printf(" ");// 对齐
}
printf(" ");//每月之间的间隔
}
printf("\n");//换行到下一个星期
}
}
printed = 1; // 表示已经打印过日历
}
//4.菜单,设这个仅仅是为了能够返回,而且方便点。
void Menu1()
{
printf("请输入一个数字来表示你要进行的操作喵~\n");
printf("1.让我看看这年的日历吧~\n");
printf("2.我想看看这天是星期几捏?\n");
printf("3.我要看看这个年是不是闰年!\n");
printf("4.不看了nya\n");
}
int main()
{
int year,month,day,menu;
const char* week_days[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
while (1)
{
Menu1();//菜单选项
if(scanf("%d",&menu)!=1)//检查输入是否成功
{
while (getchar()!='\n');//清除输入缓冲区,这样输入中文就会返回了
printf("输入的格式不对,请重新输入:\n");
continue;
}
if(menu==1)
{
printf("你想看的形式是什么呢?输入以下数字查看相应方式。\n1.我要看单列输出!\n2.请给我看双列输出。\n");
int ds;
if(scanf("%d",&ds)!=1)//检查输入是否成功
{
while(getchar()!='\n');
printf("输入的格式不对,请重新输入:\n");
continue;
}
if(ds==1)//单列输出
{
printf("输入你想查询的年份吧:");
if (scanf("%d",&year)!=1)
{
while(getchar() != '\n');
printf("您输入的年份有误,请重新输入:\n");
continue;
}
if (year<1)
{
printf("您输入的年份有误,请重新输入:\n");
continue;
}
else
{
if (isLeapyear(year))
{
run(year);
}
else
{
if (year==1582)
{
ping(year);
}
else
{
ping(year);
}
}
}
}
else if(ds==2)//双列输出
{
printf("输入你想查询的年份吧: ");
if (scanf("%d",&year)!=1)//检查输入是否成功
{
while (getchar()!='\n');
printf("您输入的年份有误,请重新输入:\n");
continue;
}
if (year<=0)
{
printf("您输入的年份有误,请重新输入:\n");
continue;
}
int startDay=getFirstDayOfYear(year);
for (int i=1;i<12;i+=2)
{
printTwoMonths(year);
startDay=(startDay+(i==2?(isLeapyear(year)?29:28):(i==4||i==6||i==9?30:31)))%7;
}
}
else
{
printf("输入的格式不对,请重新输入:\n");
continue;
}
}
else if (menu == 2)
{
printf("请输入你想看的日期,格式是年-月-日哦:");
if (scanf("%d %d %d",&year,&month,&day)!=3)
{
while (getchar()!='\n');
printf("输入的日期有误,请重新输入:\n");
continue;
}
int weekday=week(year,month,day);
const char* week[]={"周日","周一","周二","周三", "周四","周五","周六"};
if (year<1||month<1||month>12||day<1||day>getDaysInMonth(year,month))
{
printf("输入的日期有误,请重新输入:\n");
continue;
}
else
{
printf("%d年%d月%d日是%s\n",year,month,day,week[weekday]);
}
}
else if (menu == 3)
{
printf("你想看看哪一年呢:");
if(scanf("%d", &year) != 1)
{
while(getchar() != '\n');
printf("输入的年份有误,请重新输入:\n");
continue;
}
if(year<1)
{
printf("输入的年份有误,请重新输入:\n");
continue;
}
else
{
printf("%d年%s是闰年哦\n",year,isLeapyear(year)?"":"");
}
}
else if(menu==4)
{
printf("加纳~\n");
return 0;//退出
}
else
{
printf("输入的格式不对,请重新输入:\n");
continue;
}
}
return 0;
}

View File

@ -0,0 +1,699 @@
#include<stdio.h>
#include<math.h>
#define ll long long
#define BUF 256//定义最大输入长度
//-----------------Press to continue函数--------------------------
int Press_to_continue()
{
printf("\n[按下任意健继续......]");
getch();//---------------等待按下按键
printf("\033c");
printf("\033[2J");
printf("\033[0m");//------------清屏函数
return 0;
}
//-----------------------------------------------------------------
//------将字符转换为数字的函数写这个是因为直接int转换好像会出问题)
int number(char n)//选择穷举!!!
{
if(n=='0')
return 0;
else if(n=='1')
return 1;
else if(n=='2')
return 2;
else if(n=='3')
return 3;
else if(n=='4')
return 4;
else if(n=='5')
return 5;
else if(n=='6')
return 6;
else if(n=='7')
return 7;
else if(n=='8')
return 8;
else if(n=='9')
return 9;
}
//------------------------------------------------------------------
//------------------------输入判断函数--------------------------------
int input()
{
int flag=0;
int i=0;
char c[BUF];
ll int num=0;
do//------------判断输入是否合法(仅含数字为合法)
{
flag=0;
scanf("%s",c);
while(c[i]!='\0')
{
if(c[i]!='1' && c[i]!='2' && c[i]!='3' && c[i]!='4' && c[i]!='5' && c[i]!='6' && c[i]!='7' && c[i]!='8' && c[i]!='9' && c[i]!='0')
{
flag=1;
break;
}
i++;
}
if(flag)
{
printf("\n[输入有误!请重新输入]:");
}
}while(flag);
// printf("%s",c);
// printf("\n%d",flag);
i=0;
while(c[i]!='\0')
{
num=num*10+number(c[i]);
i++;
}
// printf("%lld",num);//-----调试用代码
return num;
}
//------------------------------------------------------------------
//------------------------判断平年闰年函数--------------------------
int is_Ryear(ll int year)
{
if(year%4==0&&year%100!=0||year%400==0){
return 1;
}
else{
return 0;
}
}
//------------------------------------------------------------------
//--------------------------检测日期是否合法--------------------------
int rule(ll int y,int m,int d)
{
if((y<0||m<0||d<0)||(m>12)||((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)||((m==4||m==6||m==9||m==11)&&d>30)||is_Ryear(y)&&(m==2)&&(d>29)||(y==1582&&m==10&&(d>=5&&d<=14)))
{
return 1;
}
else{
return 0;
}
}
//-------------------------------------------------------------------
//--------------------------计算星期_返回星期几-----------------------
int week(ll int y,int m,int d)
{
int w=0,y2;
ll int c;
// ll int c=y%100;
if(m==1||m==2)
{
m+=12;
y-=1;
}
y2=y%100;
c=y/100;
//网上查的公式......
if(y==1582&&m==10&&d<=4||y==1582&&m<=9||y<=1581)
{
//
// 儒略历计算公式W = (5-C) + y + [y/4] + [13 * (M+1) / 5] + d - 1
w=(y2+y2/4+c/4-2*c+(26*(m+1))/10+d-1+10)%7;
}
else//----1582年之后
{
// w=(d+1+2*m+3*(m+10)/5+y+y/4+7)%7;
// w=(y2+(y2/4)+(c/4)-2*c+(26*(m+1)/10)+d-1)%7;
//蔡勒公式w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
w=(y2+y2/4+c/4-2*c+(26*(m+1))/10+d-1)%7;
}
return w;
}
//-------------------------------------------------------------------
//---------------------------返回月份对应天数-------------------------
int month(ll int y,int m)
{
int d;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
d=31;
}
else if(m==4||m==6||m==9||m==11)
{
d=30;
}
else if(m==2&&is_Ryear(y))
{
d=29;
}
else
{
d=28;
}
return d;
}
//-------------------------------------------------------------------
//-----------------------画日历函数__单列-----------------------------
int pic_s(ll int y,int m,int w,int d)
{
int k=0;
int f=0;
printf("\n|***************************************************|");
printf("\n|%lld年%d月|",y,m);
printf("\n\t\t\t\t\t\t\n ");
// printf(" ");
f=0;
for(int i=0;i<w;i++)
{
printf("\t");
f++;
}
if(f!=0)
{
printf(" ");
}
k=0;
// f=0;
while(k<d)
{
k++;
if(rule(y,m,k))
{
continue;
}
printf("%2d",k);
f++;
// if((w+f)%7==0)//-----判断第二天是否为周日
if(f%7==0)
{
printf("\n ");
}
else
{
printf("\t ");
}
}
}
/*旧版代码(与新版格式不统一)
int pic_s(ll int y,int m,int w,int d)
{
int k=0;
int f=0;
printf("\n|*****************************************|");
printf("\n|%lld年%d月|",y,m);
printf("\n 日 一 二 三 四 五 六 \n");
printf(" ");
f=0;
for(int i=0;i<w;i++)
{
printf(" ");
f++;
}
k=0;
// f=0;
while(k<d)
{
k++;
if(rule(y,m,k))
{
continue;
}
printf("%2d",k);
f++;
// if((w+f)%7==0)//-----判断第二天是否为周日
if(f%7==0)
{
printf("\n ");
}
else
{
printf(" ");
}
}
}
*/
//-------------------------------------------------------------------
//-----------------------画日历函数__双列-----------------------------
int pic_d(ll int y,int m,int w_1,int d_1,int d_2)
{
int w_2;
if(y==1582&&m==9)
{
w_2=(w_1+d_1-10)%7;
}
else
{
w_2=(w_1+d_1)%7;
}
int i = 0;
int j = 0;
int days[6][15] = {0};// 初始化一个6行15列全为0的数组
//days 是所有需要打印的日期表最极端情况会有6周前面7列为单数月份中间一列间隔列后面7列为 双数月份
//打印的时候把0的位置用tab 制表符替换打印出来也就是(\t
printf("\n");
//单数月处理
for(i = 0; i < d_1; i++)
{
int row = (w_1 + i) / 7;//行
int col = (w_1 + i) % 7;//列
days[row][col] = i + 1;//需要注意i从0开始日期从1开始所以要+1
}
//双数月处理
for(i = 0; i < d_2; i++)
{
int row = (w_2 + i) / 7;//行
int col = (w_2 + i) % 7 + 8 ;//列计算出来的星期数需要向右移动8个位置
days[row][col] = i + 1;//需要注意i从0开始日期从1开始所以要+1
}
printf("\n|***************************************************|\t\t|***************************************************|");
printf("\n|%lld年%d月|\t\t\t\t\t\t\t|%lld年%d月|",y,m,y,m+1);
printf("\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
for (i = 0; i < 6; i++)
{
for (j = 0; j < 15; j++)
{
if(days[i][j] == 0 )
{
//0 的位置输出制表符
printf("\t");
}
else
{
//非0的位置打印数字并将光标移到下一个制表符位置
printf("%2d \t", days[i][j]);
}
}
printf("\n");
}
}
/*旧版代码(有bug)
int pic_d(ll int y,int m,int w_1,int d_1,int d_2)
{
int k=0;
int f=0;
int f_2=0;
int w_2;
if(y==1582&&m==9)
{
w_2=(w_1+d_1-10)%7;
}
else
{
w_2=(w_1+d_1)%7;
}
printf("\n|*****************************************| |*****************************************|");
printf("\n|%lld年%d月| |%lld年%d月|",y,m,y,m+1);
printf("\n 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
printf(" ");
f=0;
f_2=0;
for(int i=0;i<w_1;i++)
{
printf(" ");
f++;
}
k=0;
int k_2=0;//-----右列日期置0
// f=0;
while(k<=d_1)
{
k++;
if(rule(y,m,k))
{
continue;
}
printf("%2d",k);
f++;
// if((w+f)%7==0)//-----判断第二天是否为周日
if(f%7==0||(k-1>=d_1)&&(k_2<d_2))
{
if((k-1>=d_1)&&(k_2<d_2))
{
for(int q=0;q<(7-(f+w_1-1)%7)%7;q++)
{
printf(" ");
}
}
printf(" ");
f_2=0;
for(int j=0;j<w_2;j++)
{
printf(" ");
f_2++;
}
w_2=0;
// f=0;
while(k_2<d_2)
{
k_2++;
if(rule(y,m+1,k_2))
{
continue;
}
printf("%2d",k_2);
f_2++;
// if((w+f)%7==0)//-----判断第二天是否为周日
if(f_2%7==0)
{
break;
}
else
{
printf(" ");
}
}
printf("\n ");
}
else
{
printf(" ");
}
}
}
*/
//-------------------------------------------------------------------
//------------------------------功能一--------------------------------
int fun_1()
{
ll int y=1,m=1,d=1;
int flagf=1;
int w;//星期变量||0--周日||1--周一||2--周二||3--周三||4--周四||5--周五||6--周六||
//char X,Y;
while(flagf)
{
flagf=0;
printf("\n|****************星期查询*****************|");
// printf("\n请输入您要查询的日期\n[格式YYYY MM DD]");
printf("\n[请输入查询日期所在的年份]:");
y=input();
printf("\n[请输入查询日期所在的月份]:");
m=(int)input();
printf("\n[请输入查询日期所在日]:");
d=(int)input();
//-----------旧版输入有BUG
// scanf("%lld%lld%lld",&y,&m,&d);//<-----------------年月日的输入
//输入的判断
if(rule(y,m,d))
{
printf("\n[输入有误!请重新输入!]");
flagf=1;
}
}
printf("\n|*****************************************|");
printf("\n您输入的是:%lld年%lld月%lld日",y,m,d);
if(is_Ryear(y)){
printf("\n 这一年是闰年,");
}
else{
printf("\n 这一年是平年,");
}
w=week(y,m,d);
switch(w)
{
case 0: printf("这一天是星期日。");break;
case 1: printf("这一天是星期一。");break;
case 2: printf("这一天是星期二。");break;
case 3: printf("这一天是星期三。");break;
case 4: printf("这一天是星期四。");break;
case 5: printf("这一天是星期五。");break;
case 6: printf("这一天是星期六。");break;
}
printf("\n|*****************************************|");
Press_to_continue();
return 0;
}
//-------------------------------------------------------------------
//---------------------------功能二菜单--------------------------------
int fun_2_menu()
{
ll int y;
int w,flag;
printf("\n|****************星期查询*****************|");
printf("\n|*****************************************|");
printf("\n| 请选择功能: |");
printf("\n| 1.单列显示 |");
printf("\n| 2.双列显示 |");
printf("\n|*****************************************|");
printf("\n[请输入您要使用的功能]");
flag=(int)input();
// scanf("%d",&flag);
// while(!(flag==1||flag==2))//--------------判断输入是否正确
// {
// printf("\n[输入有误!请重新输入!]");
// scanf("%d",&flag);
// }
printf("\n[请输入您要查询的年份]");
// scanf("%lld",&y);
y=input();
w=week(y,1,1);
if(flag==1)
{
printf("\033c");//------------清屏函数
// printf("\033[2J");//------------清屏函数
// printf("\033[0m");//------------结束状态函数
fun2_s(y,w);
}
else
{
printf("\033c");//------------清屏函数
// printf("\033[2J");//------------清屏函数
// printf("\033[0m");//------------结束状态函数
fun2_d(y,w);
}
return 0;
//start_10k();
}
//-------------------------------------------------------------------
//-------------------------功能二__单列-----------------------------
int fun2_s(ll int y,int w)
{
int m,d,flag=0;
printf("\033c");
// printf("\033[2J");//-------清屏函数
// printf("\033[0m");//------结束指示符
// printf("\n|*****************************************|");
printf("\n----|*****公元%lld年历*****|----",y);
for(m=1;m<=12;m++)
{
d=month(y,m);
pic_s(y,m,w,d);
if(y==1582&&m==10)
{
w=(w+d-10)%7;
}
else
{
w=(w+d)%7;
}
flag+=1;
if(flag>=4&&m!=12)
{
flag=0;
printf("\n[按下任意健继续......]");
getch();
}
}
Press_to_continue();
}
//-------------------------------------------------------------------
//-------------------------功能二__双列-----------------------------
int fun2_d(ll int y,int w)
{
int m,d1,d2,flag=0,w_2;
printf("\033c");
printf("\033[2J");
printf("\033[0m");
printf("\n|*****************************************|");
printf("\n|*****公元%lld年历*****|",y);
for(m=1;m<=11;m+=2)
{
d1=month(y,m);
d2=month(y,m+1);
pic_d(y,m,w,d1,d2);
if(y==1582&&m==9)
{
w_2=(w+d1-10)%7;
}
else
{
w_2=(w+d1)%7;
}
w=(w_2+d2)%7;
flag+=1;
if(flag>=4&&m!=12)
{
flag=0;
printf("\n[按下任意健继续......]");
getch();
}
}
Press_to_continue();
}
//-------------------------------------------------------------------
//---------------------------菜单函数---------------------------------
int start_10k()
{
// int flagm=1;
printf("\033c");//-------------清屏函数
// printf("\033[2J");//-------------清屏函数
// printf("\033[0m");//------------结束状态函数
// while(flagm==1)
// {
// flagm=1;
int p;
printf("\n|*************欢迎使用万年历**************|");
printf("\n|*****************************************|");
printf("\n| 请选择功能: |");
printf("\n| 1.星期查询 |");
printf("\n| 2.年历查询 |");
printf("\n| |");
printf("\n| 0.退出程序 |");
printf("\n|*****************************************|");
printf("\n[请输入您要使用的功能]:");
p=(int)input();
//------旧版输入,输入字母后会无限循环(有BUG)
// scanf("%d",&p);
// while(!(p==0||p==1||p==2))
// {
// printf("\n[输入有误!请重新输入]");
// printf("\n[请输入您要使用的功能]:");
// scanf("%d",&p);
// }
switch(p)
{
case 1: printf("\033c");
// printf("\033[2J");//------------清屏函数
// printf("\033[0m\n");//------------结束状态函数
fun_1();
return 1;
break;
case 2: printf("\033c");
// printf("\033[2J");//------------清屏函数
// printf("\033[0m\n");//------------结束状态函数
fun_2_menu();
return 1;
break;
case 0: return 0;
// flagm=0;
break;
}
// }
// printf("\n|***************感谢您的使用**************|\n");
return 1;
}
//-------------------------------------------------------------------
//-----------------------------主函数-----------------------------------
int main()
{
int flag;
printf("万年历\n 制作者:吕亦杰");
Press_to_continue();
do
{
flag=start_10k();
}while(flag);
printf("\n|***************感谢您的使用**************|\n");
}

View File

@ -0,0 +1,342 @@
#include<stdio.h>
int main(){
int flag=0;
while(flag==0){
printf("menu \n");
printf("1:查询某年某月某日的日期是周几\n");
printf("2:该年是否为闰年\n");
printf("3:输出这一年的日历\n");
printf("4:退出\n");
char x[1];
scanf("%s",&x[1]);
if(x[1]!=49&&x[1]!=50&&x[1]!=51&&x[1]!=52)
printf("输入有误,请重新输入\n");
if(x[1]==49){
int w,d,m,y;
printf("请输入年 月 日\n");
scanf("%d%d%d",&y,&m,&d);
if(y<0||m<0||d<0||m>12||((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)||((m==2||m==4||m==9||m==11)&&d>30)||((y%4==0&&y%100!=0||y%400==0)&&m==2&&d>29)||(y==1582&&m==10&&(d==5||d==6||d==7||d==8||d==9||d==10||d==11||d==12||d==13||d==14))){
printf("日期不存在,请重新输入\n");
}
else{
if(y<=1582&&m<=10&&d<=4){
if(m==1||m==2){
y--;
m+=12;
}
w = (d+1+2*m+3*(m+1)/5+y+y/4+5) % 7;
}
else{
if(m==1||m==2){
y--;
m+=12;
}
w = (d + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;}
switch(w){
case 0:printf("星期日\n");break;
case 1:printf("星期一\n");break;
case 2:printf("星期二\n");break;
case 3:printf("星期三\n");break;
case 4:printf("星期四\n");break;
case 5:printf("星期五\n");break;
case 6:printf("星期六\n");break;
}
}
}
if(x[1]==50){
int n;
printf("请输入年份\n");
scanf("%d",&n);
if(n%4==0&&n%100!=0||n%400==0){
printf("%d年是闰年\n",n);
}
else{
printf("%d年不是闰年\n",n);
}
}
if(x[1]==51){
int y;
printf("请输入年份\n");
scanf("%d",&y);
if(y<=0){
printf("输入有误,请重新输入\n");
}
else{
printf("1:单列输出\n2:双列输出\n");
int n,m,w,j,d,s,m1,m2,w1,w2,s1,s2,d1,d2,j1,j2;
scanf("%d",&n);
if(n==1){
printf("%d年\n",y);
for(m=1;m<=12;m++){
printf("%d月\n",m);
if(y<=1582&&m<=10){
if(m==1||m==2){
y--;
m+=12;
}
w = (1+1+2*m+3*(m+1)/5+y+y/4+5) % 7;
}
else{
if(m==1||m==2){
y--;
m+=12;
}
w = (1 + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;}
if(m==13||m==14){
y++;
m-=12;
}
int month_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(y%4==0&&y%100!=0||y%400==0){
month_days[2]=29;
}
s=month_days[m];
printf(" sum mon tue wed thu fri sat\n");
for(j=0;j<w;j++){
printf(" ");
}
for(d=1;d<=s;d++){
if(y==1582&&m==10&&d>=5&&d<=14)
continue;
printf("%4d",d);
if(y==1582&&m==10){
if(d==16||d==23||d==30){
printf("\n");
}
}
else if((d+w)%7==0){
printf("\n");
}
}
if((s+w)%7!=0){
printf("\n");
}
}
}
else if(n==2){
printf("%d年\n",y);
for(m1=1,m2=2;m1<=11,m2<=12;m1+=2,m2+=2){
int aaa=1,cnt=1;
printf("%d月 %d月\n",m1,m2);
if(y<=1582&&m1<=10){
if(m1==1||m1==2){
y--;
m1+=12;
}
w1 = (1+1+2*m1+3*(m1+1)/5+y+y/4+5) % 7;
}
else{
if(m1==1||m1==2){
y--;
m1+=12;
}
w1 = (1 + 1+ 2*m1+3*(m1+1)/5+y+y/4-y/100+y/400)%7;}
if(m1==13||m1==14){
y++;
m1-=12;
}
if(y<=1582&&m2<=10){
if(m2==1||m2==2){
y--;
m2+=12;
}
w2 = (1+1+2*m2+3*(m2+1)/5+y+y/4+5) % 7;
}
else{
if(m2==1||m2==2){
y--;
m2+=12;
}
w2 = (1 + 1+ 2*m2+3*(m2+1)/5+y+y/4-y/100+y/400)%7;}
if(m2==13||m2==14){
y++;
m2-=12;
}
int month_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(y%4==0&&y%100!=0||y%400==0){
month_days[2]=29;
}
s1=month_days[m1];
s2=month_days[m2];
printf(" sum mon tue wed thu fri sat sum mon tue wed thu fri sat\n");
for(j1=0;j1<w1;j1++){
printf(" ");
}
for(d1=1;d1<=s1;d1++){
if(y==1582&&m1==10&&d1>=5&&d1<=14)
continue;
printf("%4d",d1);
if(y==1582&&m1==10){
if(d1==16||d1==23||d1==30){
printf(" ");
}
}
else if((d1+w1)%7==0){
printf(" ");
while(aaa){
for(j2=0;j2<w2;j2++){
printf(" ");
}
aaa--;
}
for(d2=cnt;d2<=s2;d2++){
if(y==1582&&m2==10&&d2>=5&&d2<=14)
continue;
printf("%4d",d2);
if(y==1582&&m2==10){
if(d2==16||d2==23||d2==30){
printf("\n");
}
}
else if((d2+w2)%7==0){
cnt=d2+1;
printf("\n");
break;
if(cnt!=d2){
printf("\n");}
}
}
}
}
if((s1+w1)%7!=0){
for(j1=0;j1<7-(s1+w1)%7;j1++){
printf(" ");
}
printf(" \n");
if((s2+w2)%7!=0){
printf("\n");
}
}
}
printf("\n");
}
}
}
if(x[1]==52){
flag++;
}
}
}

View File

@ -0,0 +1,125 @@
#include <stdio.h>
// 判断闰年
int isLeapYear(int year) {
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
}
// 计算给定日期是周几(蔡氏公式)
int dayOfWeek(int year, int month, int day)
{
if (month < 3) {
year--;
month += 12;
}
int c = year / 100;
int y = year % 100;
int d = (day + (13 * (month + 1) / 5) + y + (y / 4) + (c / 4) + (5 * c)) % 7;
return d;
}
// 输出单列日历
void printSingleColumnCalendar(int year) {//printSingleColumnCalendar打印单个月日历空间
char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//储存一年每月的天数
if (isLeapYear(year)) {
daysInMonth[1] = 29;//特殊年份
}
for (int m = 0; m < 12; m++) {//输出一年的月份
printf("%s %d\n", months[m], year);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
int weekDay = dayOfWeek(year, m + 1, 1);
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
for (int d = 1; d <= daysInMonth[m]; d++) {
printf("%3d ", d);
if ((weekDay + d) % 7 == 0) {
printf("\n");
}
}
printf("\n\n");
}
}
// 输出双列日历
void printDoubleColumnCalendar(int year) {//printDoubleColumnCalendar打印并排月的日历
char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[1] = 29;
}
for (int m = 0; m < 12; m++) {
printf("%s %d\t\t", months[m], year);
if (m % 2 == 0) {
printf("\n");
}
printf("Sun Mon Tue Wed Thu Fri Sat\t\tSun Mon Tue Wed Thu Fri Sat\n");
int weekDay = dayOfWeek(year, m + 1, 1);
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
for (int d = 1; d <= daysInMonth[m]; d++) {
printf("%3d ", d);
if ((weekDay + d) % 7 == 0) {
printf("\n");
}
}
printf("\n\n");
}
}
// 菜单显示
void menu() {
int choice, year,a;
printf("1.输出对应年份全年的日历:\n");
printf("2.判断输入年份是否为闰年:\n");
printf("3.对应日期为周几:\n");
printf("4.退出:\n");
scanf("%d",&a);
if(a==1)
{
printf("1. 输出单列日历\n2. 输出双列日历\n3. 退出\n: ");
scanf("%d", &choice);
if (choice == 1 || choice == 2) {
printf("请输入年份: ");
scanf("%d", &year);
if (year < 1900 || year > 2100) {//报错范围
printf("年份超出范围,请重新输入\n");
menu();
return;
}
if (choice == 1) {
printSingleColumnCalendar(year);//选择单列
} else {
printDoubleColumnCalendar(year);//选择双列
}
} else if (choice == 3) {
return;
} else {
printf("无效选择,请重新选择\n");
menu();
}
}
else if(a==2)
{
printf("请输入年份:\n");
scanf("%d",&year);
if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0)
printf("闰年");
else
printf("平年");
}
else if(a==3)
{
}
}
int main() {
menu();
return 0;
}

View File

@ -0,0 +1,171 @@
#include<stdio.h>
//台历(没有实现双列输出 和 1582年的少十天
void k( int x,int year,int month)
{ int i,day=0,j;
for(i=0;i<year;i++)
if(i%4==0&&i%100!=0||i%400==0)
day=day+366;
else
day=day+365;
for(i=1;i<month;i++)
{ switch(i)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day=day+31;
break;
case 4: case 6: case 9: case 11:
day=day+30;
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0)
day=day+29;
else
day=day+28;
break;
}}
j=day%7+1;
if(j!=7)
{
for(i=1;i<=j;i++)
printf("\t");
}
for(i=1;i<=x;i++)
{
if(i==(7-j)||(i-(7-j))%7==0)
{
printf("%d\n\n",i);
continue;}
printf("%d\t",i);
}
printf("\n\n");
}
void weed( int month,int year)
{ int i;
char a[7][19]={"","","","","","",""};
printf("--------------------%d年 %d月--------------------\n\n",year,month);
for(i=0;i<7;i++)
printf("%s\t",a[i]);
printf("\n\n");
}
int main()
{
int num,year,month,day;
int a,week;
while(1)
{
printf(" 菜单 \n1.查询年份是否为闰年\n2.查询星期几\n3.展示日历\n0.退出\n");
printf("输入您想应用的功能对应的数字");
scanf("%d",&num);
switch(num)
{
case 0:
printf("感谢使用");
return 0;
case 1:
printf("输入年份");
scanf("%d",&year);
if((year%4==0)&&(year%100!=0)||(year%400==0))
a=0;
else
a=1;
switch(a)
{
case 0:printf("该年为闰年\n");break;
case 1:printf("该年不是闰年\n");break;
}break;
case 2:
printf("输入年份");
scanf("%d",&year);
printf("输入月份");
scanf("%d",&month);
printf("请输入日期");
scanf("%d",&day);
if(month==1||month==2)
{ month=month+=12;
year--;
week=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
}
else if(month==3||month==4||month==5||month==6||month==7||month==8||month==9||month==10||month==11||month==12)
week=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
switch(week)
{
case 0:printf("星期一\n");break;
case 1:printf("星期二\n");break;
case 2:printf("星期三\n");break;
case 3:printf("星期四\n");break;
case 4:printf("星期五\n");break;
case 5:printf("星期六\n");break;
case 6:printf("星期天\n");break;
}
break;
case 3:
printf("1.只写了单列排列\n2.只写了单列排列\n");
int year,month=0;
int x;
printf("请输入要查询的年份:");
scanf("%d",&year);
if(year==1582&&month==10&&day>=5&&day<=14)
{
printf("\n");
while(month++<=12)
{
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
x=31;
weed(month,year);
k(x,year,month);
break;
case 4: case 6: case 9: case 11:
x=30;
weed(month,year);
k(x,year,month);
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0)
x=29;
else
x=28;
weed(month,year);
k(x,year,month);
}
}
}
else
printf("\n");
while(month++<=12)
{
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
x=31;
weed(month,year);
k(x,year,month);
break;
case 4: case 6: case 9: case 11:
x=30;
weed(month,year);
k(x,year,month);
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0)
x=29;
else
x=28;
weed(month,year);
k(x,year,month);
break;
}
}
}
}
}

View File

@ -0,0 +1,565 @@
#include<stdio.h>
char *mmmm[13]={" ","January","February","March","April","May","June","July","August","September","October","November","December"};
int xingqi(int year,int month)
{
if (month==1||month==2)
{
month=month+12;
year=year-1;
}
int a=year%100;
int b=year/100;
int day=1;
int h=(day+13*(month+1)/5+a+a/4+b/4+5*b)%7;
int d=(h+6)%7;
return d;
}
int xingqi2(int year,int month,int d)
{
if (month==1||month==2)
{
month=month+12;
year=year-1;
}
int c=year/100;
int y=year%100;
int a=(c/4-2*c+y+y/4+13*(month+1)/5+d-1)%7;
if(a==0)
a=7;
return a;
}
int main(void)
{
int s;
do{
int qwe;
printf("*********************************************************\n");
printf("菜单:\n");
printf("功能1查询对应年份的日历\n");
printf("功能2:查询对应日期的星期\n");
printf("功能3:查询对应年份是否为闰年\n");
printf("功能4:查询输入的月份用英语怎么表达\n");
printf("*********************************************************");
printf("\n\n");
while(2)
{
printf("你想进行的功能编号为:\n");
scanf("%d",&qwe);
if(qwe>0&&qwe<5)
break;
else
printf("暂未开发到该功能 请重新输入\n\n");
}
if(qwe==1)
{
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n[13]={0,1,2,3,4,5,6,7,8,9,10,11,12};
int year,a,b,c;
while(2)
{
printf("请输入你想查询的年份:\n");
scanf("%d",&year);
if(year>0)
break;
else
printf("输入错误 请重新输入\n");
}
if(year%4==0&&year%100!=0||year%400==0)
m[2]=29;
if(year==1582)
m[10]=21;
a=year/100;
b=year%100;
int ds;
while(2)
{
printf("单行输出按1\n双行输出按2\n");
scanf("%d",&ds);
if(ds==1||ds==2)
break;
else
printf("输错了 请重新输入\n");
}
if(year!=1582)
{
if(ds==2)
{
for(int nn=1;nn<13;nn=nn+2)
{
int day1=1,day2=1;
int ll;
int c,d,e,f,g;
c=xingqi(year,nn);
d=xingqi(year,nn+1);
f=(m[nn]+c-1)/7+1;
g=(m[nn+1]+d-1)/7+1;
if(f>g)
e=f;
else
e=g;
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
printf("%d月 %d月\n",n[nn],n[nn+1]);
for(ll=0;ll<e;ll++)
{
for(int i=0;i<7;i++)
{
if(ll==0&&i<c)
printf(" ");
else if(day1<=m[nn])
printf("%2d ",day1++);
else
printf(" ");
}
printf(" ");
for(int i=0;i<7;i++)
{
if(ll==0&&i<d)
printf(" ");
else if(day2<=m[nn+1])
printf("%2d ",day2++);
else
printf(" ");
}
printf("\n");
}
}
printf("\n");
}
else
{
for(int nn=1;nn<13;nn++){
printf("日 一 二 三 四 五 六\n");
printf("%d月\n",n[nn]);
c=xingqi(year,nn);
for(int aa=0;aa<c;aa++)
printf(" ");
for(int day=1;day<=m[nn];day++)
{
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
printf("\n");
}
}
}
else
{
if(ds==2)
{
for(int nn=1;nn<13;nn=nn+2)
{
int day1=1,day2=1;
int ll;
int c,d,e,f,g;
c=xingqi(year,nn);
d=xingqi(year,nn+1);
f=(m[nn]+c-1)/7+1;
g=(m[nn+1]+d-1)/7+1;
if(f>g)
e=f;
else
e=g;
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
printf("%d月 %d月\n",n[nn],n[nn+1]);
if(nn!=11)
{
for(ll=0;ll<e;ll++)
{
for(int i=0;i<7;i++)
{
if(ll==0&&i<c)
printf(" ");
else if(day1<=m[nn])
printf("%2d ",day1++);
else
printf(" ");
}
printf(" ");
for(int i=0;i<7;i++)
{
if(nn!=9)
{
if(ll==0&&i<d)
printf(" ");
else if(day2<=m[nn+1])
printf("%2d ",day2++);
else
printf(" ");
}
else
{
if(ll==0&&i<d)
printf(" ");
else if(day2<=4)
printf("%2d ",day2++);
else if(day2<=m[nn+1]&&day2>4)
{
printf("%2d ",day2+10);
day2++;
}
else
printf(" ");
}
}
printf("\n");
}
}
if(nn==11)
{
f=(m[nn]+c+4-1)/7+1;
g=(m[nn+1]+d+4-1)/7+1;
if(f>g)
e=f;
else
e=g;
for(ll=0;ll<e;ll++)
{
for(int i=0;i<7;i++)
{
if(ll==0&&i<c+4)
printf(" ");
else if(day1<=m[nn])
printf("%2d ",day1++);
else
printf(" ");
}
printf(" ");
for(int i=0;i<7;i++)
{
if(nn!=9)
{
if(ll==0&&i<d-3)
printf(" ");
else if(day2<=m[nn+1])
printf("%2d ",day2++);
else
printf(" ");
}
else
{
if(ll==0&&i<d+4)
printf(" ");
else if(day2<=4)
printf("%2d ",day2++);
else if(day2<=m[nn+1]&&day2>4)
{
printf("%2d ",day2+10);
day2++;
}
else
printf(" ");
}
}
printf("\n");
}
}
}
printf("\n");
}
else
{
if(year!=1582)
{
for(int nn=1;nn<13;nn++){
printf("日 一 二 三 四 五 六\n");
printf("%d月\n",n[nn]);
c=xingqi(year,nn);
for(int aa=0;aa<c;aa++)
printf(" ");
for(int day=1;day<=m[nn];day++)
{
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
printf("\n");
}
}
else
{
for(int nn=1;nn<13;nn++){
if(nn!=11&&nn!=12){
printf("日 一 二 三 四 五 六\n");
printf("%d月\n",n[nn]);
c=xingqi(year,nn);
for(int aa=0;aa<c;aa++)
printf(" ");
for(int day=1;day<=m[nn];day++)
{
if(nn!=10){
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
else{
if(day<=4){
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
else{
printf("%2d ", day+10);
if ((c+day)%7==0)
printf("\n");
}
}
}
}
else if(nn==11){
printf("日 一 二 三 四 五 六\n");
printf("%d月\n",n[nn]);
c=xingqi(year,nn)+4;
for(int aa=0;aa<c;aa++)
printf(" ");
for(int day=1;day<=m[nn];day++)
{
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
}
else{
printf("日 一 二 三 四 五 六\n");
printf("%d月\n",n[nn]);
c=xingqi(year,nn)-3;
for(int aa=0;aa<c;aa++)
printf(" ");
for(int day=1;day<=m[nn];day++)
{
printf("%2d ", day);
if ((c+day)%7==0)
printf("\n");
}
}
printf("\n");
}
}
}
}
}
else if(qwe==2)
{
int year;
while(2)
{
printf("你想查询的年份为:\n");
scanf("%4d",&year);
while(getchar()!='\n');
if(year>0)
break;
else
printf("请输入公元后年份\n\n");
}
int c;
while(2)
{
printf("你想查询的月份为:\n");
scanf("%2d",&c);
while(getchar()!='\n');
if(c>0&&c<13)
break;
else
printf("请输入正确月份\n\n");
}
int d;
while(2)
{
printf("你想查询的号数为:\n");
scanf("%2d",&d);
while(getchar()!='\n');
if(year!=1582)
{
if(c==2)
{
if(year%4==0&&year%100!=0||year%400==0)
{
if(d>0&&d<30)
break;
else
printf("请输入正确号数\n\n");
}
else
{
if(d>0&&d<29)
break;
else
printf("请输入正确号数\n\n");
}
}
else if(c==1||c==3||c==5||c==7||c==8||c==10||c==12)
{
if(d>0&&d<32)
break;
else
printf("请输入正确号数\n\n");
}
else
if(d>0&&d<31)
break;
else
printf("请输入正确号数\n\n");
}
if(year==1582)
{
if(c==2)
{
if(year%4==0&&year%100!=0||year%400==0)
{
if(d>0&&d<30)
break;
else
printf("请输入正确号数\n\n");
}
else
{
if(d>0&&d<29)
break;
else
printf("请输入正确号数\n\n");
}
}
else if(c==1||c==3||c==5||c==7||c==8||c==12)
{
if(d>0&&d<32)
break;
else
printf("请输入正确号数\n\n");
}
else if(c==10)
{
if(d>0&&d<5||d>14&&d<32)
break;
else
printf("请输入正确号数\n\n");
}
else
if(d>0&&d<31)
break;
else
printf("请输入正确号数\n\n");
}
}
int e;
e=xingqi2(year,c,d);
if(e==0)
e==7;
if(year!=1582){
printf("你查询的日期为星期%d\n",e);
}
else
{
if(c!=10&&c!=11&&c!=12)
printf("你查询的日期为星期%d\n",e);
else if(c==10)
{
if(d<5)
printf("你查询的日期为星期%d\n",e);
else
printf("你查询的日期为星期%d\n",e-3);
}
else if(c==11)
{
int e;
e=xingqi2(year,c,d)+4;
if(e==0)
e=7;
if(e==8)
e=1;
if(e==9)
e=2;
if(e==10)
e=3;
if(e==11)
e=4;
printf("你查询的日期为星期%d\n",e);
}
else {
int e;
e=xingqi2(year,c,d)-3;
if(e==-1)
e=6;
if(e==-2)
e=5;
if(e==0)
e=7;
printf("你查询的日期为星期%d\n",e);
}
}
}
else if(qwe==3)
{
int year;
while(2)
{
printf("请输入想要查询的年份:\n");
scanf("%d",&year);
if(year>0)
break;
else
printf("请输入公元后年份\n\n");
}
if(year%4==0&&year%100!=0||year%400==0)
printf("%d是闰年",year);
else
printf("%d不是闰年",year);
}
else
{
int yuefen;
do{
printf("请输入想查询的月份,用阿拉伯数字:\n");
scanf("%d",&yuefen);
}while(yuefen<1||yuefen>12);
printf("%d用英语表示为 %s\n",yuefen,mmmm[yuefen]);
}
printf("是否继续程序?\n 继续程序请按1 结束程序请按除1外任意阿拉伯数字\n");
scanf("%d",&s);
}while(s==1);
return 0;
}

View File

@ -0,0 +1,143 @@
#include <stdio.h>
#include <stdlib.h>
// 判断是否为闰年
int runnian(int year) {
return ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0));
}
// 计算某日期是周几(基姆拉尔森计算公式)
int howweek(int year, int month, int day) {
if (month < 3) {
month += 12;
year--;
}
int week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
return week+1;
}
// 输出单个月份日历(单列输出)
void dl(int year, int month) {
int dym;
if (month == 2) {
dym = runnian(year)? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
dym = 30;
} else {
dym = 31;
}
int weekDay = howweek(year, month, 1);
if(weekDay==7)
weekDay=0;
printf(" %d年%d月\n", year, month);
printf(" 日 一 二 三 四 五 六\n");
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
for (int i = 1; i <= dym; i++) {
printf("%2d ", i);
if ((i + weekDay) % 7 == 0) {
printf("\n");
}
}
printf("\n");
}
// 输出整年日(单列输出)
void dl(int year) {
if(year<=10000&&year>0){
for (int month = 1; month <= 12; month++) {
dl(year, month);
}
}
else
printf("错误");
}
// 显示菜单
void cd() {
printf("1. 查询日期是周几及是否闰年\n");
printf("2. 输出单年日历(单列)\n");
printf("3. 输出单年日历(双列)\n");
printf("4. 退出\n");
printf("请选择操作:");
}
int getValidIntInput() {
int input;
while (1) {
if (scanf("%d", &input) == 1) {
break;
} else {
printf("输入错误,请重新输入整数:");
while (getchar()!= '\n');
}
}
return input;
}
int main() {
int choice;
int year, month, day;
do {
cd();
choice = getValidIntInput();
switch (choice) {
case 1:
printf("请输入年份:");
year = getValidIntInput();
printf("请输入月份:");
month = getValidIntInput();
printf("请输入日期:");
day = getValidIntInput();
printf("%d年%d月%d日是星期", year, month, day);
switch (howweek(year, month, day)) {
case 0:
printf("");
break;
case 1:
printf("");
break;
case 2:
printf("");
break;
case 3:
printf("");
break;
case 4:
printf("");
break;
case 5:
printf("");
break;
case 6:
printf("");
break;
}
printf("");
if (runnian(year)) {
printf("该年是闰年\n");
} else {
printf("该年不是闰年\n");
}
break;
case 2:
printf("请输入年份:");
year =getValidIntInput();
dl(year);
break;
case 4:
printf("退出程序\n");
break;
default:
printf("无效的选择,请重新选择\n");
break;
}
} while (choice!= 4);
return 0;
}

View File

@ -0,0 +1,382 @@
#include<bits/stdc++.h>
using namespace std;
bool run(int year) {
if (year >= 1582)
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
else
return (year % 4 == 0);
}
bool Y(int year) {
if (year > 0 && year < 10000)
return true;
else
return false;
}
bool M(int month) {
if (month > 0 && month < 13)
return true;
else
return false;
}
bool D(int year, int month, int day) {
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
if (year == 1582 && month == 10 && day >= 5 && day < 15)
return false;
if (!(day > 0 && day <= m[month]))
return false;
return true;
}
int shu(char a[100]) {
int c, t = strlen(a);
for (int i = 0; i < t; i++) {
if (a[i] >= '0' && a[i] <= '9') {
c++;
} else {
return false;
}
}
if (c == t)
return true;
}
int zhou(int year, int month, int day) {
int a, b = 0;
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
if (year <= 1582) {
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 11) % 7;
}
if (run(year))
m[2] = 29;
if (year == 1582) {
m[10] = 21;
}
for (int i = 1; i < month; i++) {
a = (a + m[i]) % 7;
}
if (year == 1582 && month == 10 && day >= 15) {
b = (day - 10) % 7;
} else
b = (a + day - 1) % 7;
return b;
}
void one(int year, int month) {
printf("%6d年%6d月\n", year, month);
cout << "日 一 二 三 四 五 六\n";
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
int d1 = zhou(year, month, 1);
int day = 1;
for (int i = 1; i <= d1; i++) {
cout << " ";
}
while (day <= m[month]) {
if (year == 1582 && month == 10 && day == 5) {
day += 10;
d1 += 11;
}
cout << setw(2) << day << " ";
if ((day + d1 ) % 7 == 0 && day != m[month]) {
cout << "\n";
}
day++;
}
cout << "\n";
}
//双列
void two2(int year, int month, int *n) {
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
int i;
if (*n == 1) {
int z = zhou(year, month, 1);
//if(z==0)z=7;
for (i = 1; i <= z ; i++) {
cout << " ";
}
}
for (i = *n ; i <= m[month]; i++) {
printf ("%3d ", i);
if ((i + zhou(year, month, 1) ) % 7 == 0 || i == m[month] ) {
cout << "\n";
*n = i + 1;
break;
}
}
}
void two(int year, int month) {
int i, n = 1;
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
printf("%9d年%6d月", year, month);
printf("%35d年%6d月\n", year, month + 1);
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六 \n");
int z = zhou(year, month, 1);
//if (z == 0)z = 7;
for (i = 1; i <= z; i++) {
printf(" ");
}
for (i = 1; i <= m[month]; i++) {
printf("%3d ", i);
if ((i + zhou(year, month, 1) ) % 7 == 0 || i == m[month]) {
if (i == m[month]) {
int w;
w = 7 - ( (i + zhou(year, month, 1) ) % 7 );
if (w != 7) {
for (int i = 1; i <= w; i++)
printf(" ");
}
}
cout << " ";
two2(year, month + 1, &n);
}
}
printf(" ");
two2(year, month + 1, &n);
}
//菜单
int screen() {
char a[10000];
int b = 9;
cout << "万年历菜单:\n";
cout << "1.查询某年某月某日的日期是周几,该年是否为闰年\n";
cout << "2.输入年份,单列输出这一年的日历\n";
cout << "3.输入年份,双列输出这一年的日历\n";
cout << "4.输入 0 以结束程序\n";
cout << "请输入你的选择:";
cin >> a;
if (strlen(a) > 1) {
return b;
} else {
if (a[0] <= '9' && a[0] >= '0') {
system("cls");
b = a[0] - '0';
return b;
} else {
system("cls");
return b;
}
}
}
int main() {
int c;
char y[100] = {0}, m[100] = {0}, d[100] = {0};
do {
c = screen();
switch (c) {
case 1: {
int year, month, day;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
cout << "请输入月份:";
cin >> m;
if (strlen(m) > 2) {
cout << "月份输入错误,请重新输入。\n";
continue;
}
if (shu(m));
else {
cout << "月份输入错误,请重新输入。\n";
continue;
}
if (strlen(m) == 2)
month = (10 * (m[0] - '0') + (m[1] - '0'));
if (strlen(m) == 1)
month = (m[0] - '0');
if (!M(month)) {
cout << "月份输入错误,请重新输入。\n";
continue;
}
cout << "请输入日期:";
cin >> d;
if (strlen(d) > 2) {
cout << "日期输入错误,请重新输入。\n";
continue;
}
if (shu(d));
else {
cout << "日期输入错误,请重新输入。\n";
continue;
}
if (strlen(d) == 2)
day = (10 * (d[0] - '0') + (d[1] - '0'));
if (strlen(d) == 1)
day = (d[0] - '0');
if (!D(year, month, day)) {
cout << "日期输入错误,请重新输入。\n";
continue;
}
int z = zhou(year, month, day);
if (zhou(year, month, day) == 0)
z = 7;
cout << year << "" << month << "" << day << "日是星期"
<< z << "\n";
if (run(year)) {
cout << year << "年是闰年。\n";
break;
} else {
cout << year << "年不是闰年。\n";
break;
}
}
case 2: {
int year;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
for (int month = 1; month <= 12; month++) {
one(year, month);
}
break;
}
case 3: {
int year;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
for (int month = 1; month <= 12; month += 2) {
if (year == 1582 && month == 9) {
month = 11;
cout << " 1582年 9月 1582年 10月\n 日 一 二 三 四 五 六 日 一 二 三 四 五 六 \n";
cout << " 1 1 2 3 4 15 16\n";
cout << " 2 3 4 5 6 7 8 17 18 19 20 21 22 23\n";
cout << " 9 10 11 12 13 14 15 24 25 26 27 28 29 30\n";
cout << " 16 17 18 19 20 21 22 31\n";
cout << " 23 24 25 26 27 28 29\n 30\n";
}
two(year, month);
printf("\n\n");
}
break;
}
case 0: {
return 0;
}
default:
cout << "请重新输入。\n";
}
} while (true);
}

View File

@ -0,0 +1,157 @@
#include<stdio.h>
//判断闰年还是平年
int isleapyear(int year){
if(year%400==0&&year%4==0&&year%100!=0)
return 0;//闰年
else
return 1;//平年
}
//表示指定日期对应的星期几,蔡乐公式
int getDayOfweek(int year,int month,int day){
if(month<3){
year--;
month+=12;}
int k = year % 100;
int j = year / 100;
int h = (j/ 4 - 2 * j + k + k / 4 + 13 * (month + 1) / 5 + day - 1);
h= h % 7;
if (h < 0)
h += 7;
return h;
}
//单列输出
//表示输出指定年的日历
void sureyearcarlender(int year,int isdoubleline){
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
printf("这是%d年的日历\n",year);
for(int month=1;month<=12;month++){
printf("\n%d月\n",month);
printf(" 日 一 二 三 四 五 六\n");
//判断月的1号是周几
int empty,dateweek=getDayOfweek(year,month,1);
//1号以前的空格输出
for(empty=0;empty<dateweek;empty++){
printf(" ");
}// 对后面日期的输出
for(int datenum=1;datenum<=monthday[month];datenum++){
printf("%3d",datenum);
if((datenum+dateweek)%7==0)//考虑换行时机
printf("\n");
}
}
}
void onedoublelineture(int year){
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
for(int month=1;month<=12;month+=2){
printf("\n%d月\n",month);
printf(" 日 一 二 三 四 五 六\n");
//判断月的1号是周几
int empty,dateweek=getDayOfweek(year,month,1);
//1号以前的空格输出
for(empty=0;empty<dateweek;empty++){
printf(" ");
}// 对后面日期的输出
for(int datenum=1;datenum<=monthday[month];datenum++){
printf("%3d",datenum);
if((datenum+dateweek)%7==0)//考虑换行时机
printf("\n");}
}
}
void twodoublelineture(int year)
{
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
for(int month=2;month<=12;month+=2){
printf("\n%d月\n",month);
printf(" 日 一 二 三 四 五 六\n");
//判断月的1号是周几
int empty,dateweek=getDayOfweek(year,month,1);
//1号以前的空格输出
for(empty=0;empty<dateweek;empty++){
printf(" ");
}// 对后面日期的输出
if(month%2==0);
for(int datenum=1;datenum<=monthday[month];datenum++){
printf("%3d",datenum);
if((datenum+dateweek)%7==0)//考虑换行时机
printf("\n");}
}
}
void definewhatyearanddate(int year,int month,int day)
{
int c=getDayOfweek(year,month,day);
if(isleapyear(year))
{printf("\n%d年%d月%d日为闰年\n",year,month,day);}
else
{printf("\n%d年%d月%d日为平年\n",year,month,day);}
printf("%d年%d月%d日为周%d\n",year,month,day,c);
}
int main(){
int s,year,month,day,m;
printf("\n1.查询某月某日时周几(空隔)\n");
printf("\n2.查询某一年的日历(单列输出)\n");
printf("\n3.查询某一年的日历(双列输出)\n");
printf("\n4.退出\n");
scanf("%d",&s);
if(s!=1&&s!=2&&s!=3&&s!=4)
{
printf("\n选项错误,请重新输入\n");
return m=main();}
//根据s进行菜单选择
int c;
if(s==1)
{
c=scanf("%d %d %d",&year,&month,&day);
if(!day)
;
{
printf("\n输入错误,请重新输入\n");
return c;}
definewhatyearanddate(year,month,day);
}
if(s==2)
{
scanf("%d",&year);
sureyearcarlender(year,1);//单列
}
if(s==3)
{
scanf("%d",&year);
onedoublelineture(year);
printf(" \n");
twodoublelineture(year);
//双列
}
if(s==4)
{
printf("\n已退出\n\n");
}
}

View File

@ -0,0 +1,218 @@
#include<stdio.h>
#include<stdlib.h>
void caidan(void)
{
printf("1.查询对应年份的日历\n");
printf("2.查询对应日期的星期\n");
printf("3.查询对应年份是否为闰年\n");
printf("4.退出\n\n");
}
int fang()
{
int t;
while(scanf("%d",&t)!=1)
{
printf("请重新输入\n");
while(getchar()!='\n');
}
return t;
}
void riqi()
{
int y,m,d,q,xingqi;
printf("请输入日期:");
scanf("%d",&y);
scanf("%d",&m);
scanf("%d",&d);
if(y<1||y>10000||m<1||m>12||d<1||((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)||((m==4||m==6||m==9||m==11)&&d>30)||(m==2&&d>29))
{
printf("请重新输入\n");
while(scanf("%d",&y)!=1||scanf("%d",&m)!=1||scanf("%d",&d)!=1)
{
printf("请重新输入\n");
while(getchar()!='\n');
}
}
xingqi=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
xingqi++;
switch(xingqi)
{
case 1:printf("星期一");break;
case 2:printf("星期二");break;
case 3:printf("星期三");break;
case 4:printf("星期四");break;
case 5:printf("星期五");break;
case 6:printf("星期六");break;
case 7:printf("星期日");break;
}
}
int runnian()
{
int year;
printf("请输入查询的年份:");
year=fang();
if(year<0||year>100)
{
printf("请重新输入\n");
year=fang();
}
if((year%4==0&&year%100!=0)||year%400==0)
printf("%d年是闰年",year);
else
printf("%d年不是闰年",year);
return year;
}
int yihao(int year,int month)
{
if(month<3)
{
year--;
month+=12;
}
int d=(1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
d++;
return d;
}
int danrili(int year)
{
int month;
int x,n,s;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year%100!=0&&year%4==0)||year%400==0)
{
a[2]=29;
}
for(month=1;month<=12;month++)
{
printf("%2d月\n",month);
printf(" 日 一 二 三 四 五 六\n");
x=yihao(year,month);
if(year==1582&&month==10)
x=1;
for(int i=0;i<x;i++)
{
if(x!=7)
printf(" ");
}
for(int j=1;j<=a[month];j++)
{
printf("%3d",j);
if(year==1582)
{
if(month==10)
{
if(j==4)
j+=10;
if(j==16||j==23||j==30||j==a[month])
{
printf("\n");
}
}
else if((j+x)%7==0||j==a[month])
{
printf("\n");
}
}
else if((j+x)%7==0||j==a[month])
{
printf("\n");
}
}
printf("\n");
printf("\n");
}
}
int shuangrili(int year)
{
int month;
int z,x,c,v,b,k,j;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year%100!=0&&year%4==0)||year%400==0)
{
a[2]=29;
}
for(month=1;month<=12;month+=2)
{
int y1=1,y2=1;
z=yihao(year,month);
x=yihao(year,month+1);
c=(a[month]+z-1)/7+1;
v=(a[month+1]+x-1)/7+1;
if(z==7)
z=0;
if(x==7)
x=0;
if(c>v)
b=c;
else
b=v;
printf(" %2d月 %2d月\n",month,month+1);
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
for(j=0;j<b;j++)
{
for(int i=0;i<7;i++)
{
if(j==0&&i<z)
printf(" ");
else if(y1<=a[month])
printf("%3d",y1++);
else
printf(" ");
}
printf(" ");
for(int i=0;i<7;i++)
{
if(j==0&&i<x)
printf(" ");
else if(y2<=a[month+1])
printf("%3d",y2++);
else
printf(" ");
}
printf("\n");
}
}
printf("\n");
return b;
}
int rili()
{
int p,o;
printf("请输入年份:");
while(scanf("%d",&p)!=1||p<0||p>10000)
{
printf("请重新输入\n");
while(getchar()!='\n');
}
printf("单列输出1\n双列输出2\n");
while(scanf("%d",&o)!=1||o<1||o>2)
{
printf("请重新输入\n");
while(getchar()!='\n');
}
switch(o)
{
case 1:danrili(p);break;
case 2:shuangrili(p);break;
}
}
int main()
{
int n,year,month,day;
caidan();
while(scanf("%d",&n)!=1||n<1||n>4)
{
printf("请重新输入\n");
while(getchar()!='\n');
}
switch(n)
{
case 1:rili();break;
case 2:riqi();break;
case 3:runnian();break;
case 4:break;
}
return 0;
}

View File

@ -0,0 +1,106 @@
#include<stdio.h>
int year1(int y)
{
if((y%4==0)&&(y%100!=0)||y%400==0)
return 366;
else
return 365;
}
int main(void){
int command;
printf("|-----------欢迎使用------------|\n");
printf("|1.查询对应的星期 |\n");
printf("|2.判断是否为闰年 |\n");
printf("|3.查询对应的日历 |\n");
printf("|4.退出 |\n");
printf("|-------------------------------|\n");
do{
printf("请输入您选择的功能:");
scanf("%d",&command);
switch(command)
{
case 1:
int year,month,day,week;
printf("请输入年月日(中间用空格分隔开):");
scanf("%d%d%d",&year,&month,&day);
if(month==1||month==2){
month+=12;
year--;}
week=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
switch(week){
case 0:
printf("星期一\n");
break;
case 1:
printf("星期二\n");
break;
case 2:
printf("星期三\n");
break;
case 3:
printf("星期四\n");
break;
case 4:
printf("星期五\n");
break;
case 5:
printf("星期六\n");
break;
case 6:
printf("星期日\n");
break;
}
break;
case 2:
int x;
printf("请输入年份");
scanf("%d",&x);
if(x%4==0&&x%100!=0||x%400==0)
printf("闰年\n");
else
printf("不是闰年\n");
break;
case 3:
{
int y,i,j,sum=0,z;
int begin,week;
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("请输入年份:");
scanf("%d",&y);
printf("1.单列输出 2.双列输出\n");
printf("请输入:",z);
scanf("%d",&z) ;
if(z==1)
for(i=1;i<y;i++)
sum+=year1(i);
week=(sum+1)%7;
if(year1(y)==366)
days[1]=29;
printf("\n%d年日历如下:\n\n",y);
for(i=0;i<12;i++)
{
printf(" %d月 \n",i+1);
printf("周日 周一 周二 周三 周四 周五 周六\n");
printf("==================================\n");
begin=1;
for(j=0;j<week;j++)
printf("");
while(begin<=days[i])
{
printf("%5d",begin);
begin++;
week=(week+1)%7;
if(week%7==0)
printf("\n");
}
printf("\n\n");}
break;}
case 4:
printf("感谢您的使用,再见");
break;
default:
printf("无此功能,请再次输入\n");}
}
while(command!=4);
return 0;
}

303
yyw.cpp Normal file
View File

@ -0,0 +1,303 @@
//designed by yyw
//
#include <iostream>
#include<iomanip>
//setfill() 填充
//setw() 宽
//setprecision()显示数字位数
using namespace std;
class calendar
{
public:
void Menu_present()
{
cout<<"This is a calendar"<<endl;
cout<<endl;
cout<<" Menu"<<endl;
cout<<"1.Search the date is which day of the week"<<endl;
cout<<"2.Check the calendar for a certain year"<<endl;
cout<<endl;
cout<<"Exit: input 88 with \"ENTER\""<<endl;
}// 菜单显示
void open_calendar()// 主菜单
{
// Menu_present();
int menu_number=0;
while(menu_number!=88)
{
Menu_present();
cout<<"Please input the number before the option "<<endl;
while(1) {
cin >> menu_number;
if (!cin.fail())break;
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
}
switch(menu_number)
{
case 1: M_Search();
break;
case 2: Check();
break;
// case 3:
// break;
case 88:
cout<<"Good bye,have a good day!"<<endl;
break;
default:
cout<<"Invalid input"<<endl;
cout<<"please input the number correctly,and input it again"<<endl;
}// case 2
}
}
void M_Search()
{
int i=1,j=1,k=1;
int year;
int month;
int day;
cout<<"Please input the year "<<endl;
while(1) {
cin >> year;
// if(year<0){
// //cin.clear();
// cin.sync();
// cout<<"year wrong"<<endl;
// continue;
// }
if(!cin.fail()){
if(year<0){
cin.clear();
cin.sync();
cout<<"year wrong"<<endl;
continue;
}
break;
}
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
//if(year<1){cin.clear();cin.sync();cout<<"year wrong"<<endl;continue;}
}
cout<<"Please input the month "<<endl;
while(1) {
cin >> month;
if(!cin.fail()){
if(month<1||month>12){
cin.clear();
cin.sync();
cout<<"month wrong"<<endl;
continue;
}
break;
}
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
}
cout<<"Please input the day "<<endl;
while(1) {
cin >> day;
// if(day<1||day> month_judge(year,month)){cin.clear();cin.sync();cout<<"day wrong"<<endl;continue;}
if(!cin.fail()){
if(day<1||day> month_judge(year,month)){cin.clear();cin.sync();cout<<"day wrong"<<endl;continue;}
break;
}
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
}
if(year==1582&&month==10&&(day>4&&day<15))cout<<"This is none day"<<endl;
else cout<<day_of_week (year,month,day)<<endl;
if(year_judge(year))cout<<"This year is Leap year"<<endl;
else cout<<"This year is Non-leap year"<<endl;
}// 查某一天是星期几 写完了
void Check()
{
int i=1,j=1;
int year;
cout<<"Please input the year "<<endl;
while(1) {
cin >> year;
if(!cin.fail()){
if(year<0){
cin.clear();
cin.sync();
cout<<"year wrong"<<endl;
continue;
}
break;
}
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
}//cin year
int c;
aaa:
cout<<"Please select the way you want view"<<endl;
cout<<"1.send out every month with 1*12"<<endl;
cout<<"2.send out every month with 2*6"<<endl;
cout<<"Input the number before the option"<<endl;
while(1) {
cin >> c;
if(!cin.fail())break;
if (cin.fail()) {
cin.clear();
cin.sync();
cout << "Your input is illegal" << endl;
cout << "please input the number correctly" << endl;
cout << "other char is not allowed" << endl;
continue;
}
}//cin 选择
switch(c)
{
case 1:
send1_12(year);
break;
case 2:
send2_6(year);
break;
default:
cout<<"Invalid input"<<endl;
cout<<"Please Input the number before the option correctly"<<endl;
goto aaa;
break;
}
}// 输出那一年的日期
private:
int year_judge(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
return 0;
}// 1润 0平
int month_judge(int year,int month){
if(!(year==1582&&month==10)) {
if (month == 2) {
if (year_judge(year) == 1) {
return 29;
} else return 28;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}else{return 31;}
}// 返回多少天
int day_of_week(int year,int month,int day){
if(month<3)month+=12,year-=1;
int f;
if(year>1582||((year==1582&&month>10)||(year==1582&&month==10&&day>4)))//geli
{
f=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
if(f==0)f=7;
return f;
}else//ruli
{
f=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+4)%7;
if(f==0)f=7;
return f;
}
}// 返回星期几
void send1_12(int year){
for(int i=1;i<=12;i++)// 12个月
{
cout<<setw(20)<<"month "<<i<<endl;
cout<<"Sun Mon Tue Wed Thu Fri Sat "<<endl;
int k1=1-day_of_week(year,i,1);
for(int r=1;r<=6;r++){
for(int j=1;j<=7;j++,k1++){
if(k1<=0){
cout<<" ";
}else{
if(k1<= month_judge(year,i)) {
if(year==1582&&i==10&&k1==5)k1+=10;
cout << setw(3) << k1 << " ";
}else{
cout<<" ";
}
}
}
cout<<endl;
}
}
};//完成
void send2_6(int year){
cout<<setw(33)<<"Happy "<<year<<'!'<<endl;
for (int i = 1; i <= 12; i += 2)// 12个月
{
cout << setw(20) << "month " << i << setw(35) << "month" << i + 1 << endl;
cout << "Sun Mon Tue Wed Thu Fri Sat " << "Sun Mon Tue Wed Thu Fri Sat " << endl;
int k1 = 1 - day_of_week(year, i, 1), k2 = 1 - day_of_week(year, i + 1, 1);
for (int j = 1; j <= 6; j++) {
for (int r = 1; r <= 7; r++, k1++) {
if (k1 <= 0)cout << " ";
else {
if (k1 <= month_judge(year, i)) {
cout << setw(3) << k1 << " ";
} else cout << " ";
}
}
cout<<" ";
for (int r = 1; r <= 7; r++, k2++) {
if (k2 <= 0)cout << " ";
else {
if (k2 <= month_judge(year, i + 1)) {
if(year==1582&&(i+1)==10&&k2==5)k2+=10;
cout << setw(3) << k2 << " ";
} else cout << " ";
}
}
cout << endl;
}
}
};// 完成
};
int main() {
class calendar r;
r.open_calendar();
return 0;
}