最近因为一个题目,然后然后就让用java写一个万年历。然后老夫上午两节课居然没写出来。然后下午就花了一节课写算法。然后逃课进实验室用C++写了一遍。嗯~满满的成就感,开心!
1.C++版万年历
//
// main.cpp
// printData
//
// Created by Ivan小黄 on 18/9/27.
// Copyright (c) 2018年 ivan. All rights reserved.
//
#include <iostream>
using namespace std;
bool isRun(int year);
void MatchDays(bool isrun);
int WeekFirstday(int year);
void PrintData(int days[], int startDay);
int * days = new int[12];
int main(int argc, const char * argv[]) {
int year;
cout << "请输入一个年份:" << endl;
cin >> year;
MatchDays(isRun(year));
cout << WeekFirstday(year);
PrintData(days, WeekFirstday(year));
return 0;
}
void PrintData(int * days, int startDay) // 打印日历
{
int index = 0;
int startday = startDay;
while (index < 12) {
cout << "\n\t\t\t第";
cout <<(index+1);
cout << "个月\n";
cout << "星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期天\n";
for (int i = 0; i< startday; i++)
{
cout << "\t";
}
for (int j = 1; j <= days[index]; j++) {
cout << j << "\t";
startday++;
if(startday >= 7)
{
cout << endl;
startday = 0;
}
}
index++;
}
}
int WeekFirstday(int year) // 判断年份开始的星期几
{
int startDay = 0;
int days = 0;
int curYear = 1900;
for (; curYear < year; curYear++) {
if(isRun(curYear))
days += 366;
else
days += 365;
}
startDay = days % 7;
return startDay;
}
bool isRun(int year) // 判断是否为闰年
{
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
}
void MatchDays(bool isrun) // 根据是否为闰年匹配每个月的天数
{
for (int i = 1; i <= 12; i++) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days[i-1]=31;
break;
case 4:
case 6:
case 9:
case 11:
days[i-1]=30;
break;
case 2:
if(isrun)
days[i-1]=29;
else
days[i-1]=28;
break;
default:
break;
}
}
}
2.Java版万年历
算法是一致的。
package javaExcercise_5;
import java.util.Scanner;
public class printData {
/**
* 1900年1月1日是星期一
* 打印任意整年的日历
* @param args
*/
static int[] days = new int[12];
public static void main(String[] args){
int year;
System.out.println("请输入一个年份:");
Scanner input = new Scanner(System.in);
year = input.nextInt();
MatchDays(isRun(year));
PrintData(days, WeekFirstday(year));
}
static void PrintData(int[]days, int startDay)
{
int index = 0;
int startday = startDay;
while (index < 12) {
System.out.print("\n\t\t\t第"+(index + 1)+"个月\n");
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期天");
for (int i = 0; i < startday; i++)
{
System.out.print("\t");
}
for (int j = 1; j <= days[index]; j++) {
System.out.print(j + "\t");
startday++;
if (startday >= 7)
{
System.out.println();
startday = 0;
}
}
index++;
}
}
static int WeekFirstday(int year)
{
int startDay = 0;
int days = 0;
int curYear = 1900;
for (; curYear < year; curYear++) {
if (isRun(curYear))
days += 366;
else
days += 365;
}
startDay = days % 7;
return startDay;
}
static boolean isRun(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
}
static void MatchDays(boolean isrun)
{
for (int i = 1; i <= 12; i++) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days[i - 1] = 31;
break;
case 4:
case 6:
case 9:
case 11:
days[i - 1] = 30;
break;
case 2:
if (isrun)
days[i - 1] = 29;
else
days[i - 1] = 28;
break;
default:
break;
}
}
}
}