面向对象程序设计实训——万年历

article/2025/10/21 13:54:34

设计内容:

1.运用程序设计基础基本知识,使用C、Java或Python等面向对象程序设计语言,按以下要求编程实现万年历的功能:

(1)输入任一年,判断该年是否为闰年;

(2)输入年月日计算该日为星期几,为该年的第几天;

(3)输入任一年,显示该年的日历,日历包括星期、阳历、农历、节气;

2. 要求:

(1)界面简洁大方;

(2)操作简单方便;

(3)程序模块划分合理,注释完整,可读性强;

代码 Lunar.javapackage myCalendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;import java.util.Date;
public class Lunar {private int year;private int month;private int day;private boolean leap;final static String chineseNumber[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd日");final static long[] lunarInfo = new long[]{0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0};//====== 传回农历 y年的总天数final private static int yearDays(int y) {int i, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {if ((lunarInfo[y - 1900] & i) != 0) sum += 1;}return (sum + leapDays(y));}//====== 传回农历 y年闰月的天数final private static int leapDays(int y) {if (leapMonth(y) != 0) {if ((lunarInfo[y - 1900] & 0x10000) != 0)return 30;elsereturn 29;} elsereturn 0;}//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0final private static int leapMonth(int y) {return (int) (lunarInfo[y - 1900] & 0xf);}//====== 传回农历 y年m月的总天数final private static int monthDays(int y, int m) {if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)return 29;elsereturn 30;}//====== 传回农历 y年的生肖final public String animalsYear() {final String[] Animals = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};return Animals[(year - 4) % 12];}//====== 传入 月日的offset 传回干支, 0=甲子final private static String cyclicalm(int num) {final String[] Gan = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};final String[] Zhi = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};return (Gan[num % 10] + Zhi[num % 12]);}//====== 传入 offset 传回干支, 0=甲子final public String cyclical() {int num = year - 1900 + 36;return (cyclicalm(num));}public static String getChinaDayString(int day) {String chineseTen[] = {"初", "十", "廿", "卅"};int n = day % 10 == 0 ? 9 : day % 10 - 1;if (day > 30)return "";if (day == 10)return "初十";elsereturn chineseTen[day / 10] + chineseNumber[n];}/** *//*** 传出y年m月d日对应的农历.* yearCyl3:农历年与1864的相差数              ?* monCyl4:从1900年1月31日以来,闰月数* dayCyl5:与1900年1月31日相差的天数,再加40      ?** @param cal* @return*/public String getLunarDate(int year_log, int month_log, int day_log) {//@SuppressWarnings("unused") int yearCyl, monCyl, dayCyl;int leapMonth = 0;String nowadays;Date baseDate = null;Date nowaday = null;try {baseDate = chineseDateFormat.parse("1900年1月31日");} catch (ParseException e) {e.printStackTrace();  //To change body of catch statement use Options | File Templates.}nowadays = year_log + "年" + month_log + "月" + day_log + "日";try {nowaday = chineseDateFormat.parse(nowadays);} catch (ParseException e) {e.printStackTrace();  //To change body of catch statement use Options | File Templates.}//求出和1900年1月31日相差的天数int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);dayCyl = offset + 40;monCyl = 14;//用offset减去每农历年的天数// 计算当天是农历第几天//i最终结果是农历的年份//offset是当年的第几天int iYear, daysOfYear = 0;for (iYear = 1900; iYear < 10000 && offset > 0; iYear++) {daysOfYear = yearDays(iYear);offset -= daysOfYear;monCyl += 12;}if (offset < 0) {offset += daysOfYear;iYear--;monCyl -= 12;}//农历年份year = iYear;yearCyl = iYear - 1864;leapMonth = leapMonth(iYear); //闰哪个月,1-12leap = false;//用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天int iMonth, daysOfMonth = 0;for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {//闰月if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {--iMonth;leap = true;daysOfMonth = leapDays(year);} elsedaysOfMonth = monthDays(year, iMonth);offset -= daysOfMonth;//解除闰月if (leap && iMonth == (leapMonth + 1)) leap = false;if (!leap) monCyl++;}//offset为0时,并且刚才计算的月份是闰月,要校正if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {if (leap) {leap = false;} else {leap = true;--iMonth;--monCyl;}}//offset小于0时,也要校正if (offset < 0) {offset += daysOfMonth;--iMonth;--monCyl;}month = iMonth;day = offset + 1;//System.out.println(year+"\t"+month+"\t"+day);if (((month) == 1) && day == 1) {return "春节";} else if (((month) == 1) && day == 15) {return "元宵";} else if (((month) == 5) && day == 5)return "端午";else if (((month) == 8) && day == 15)return "中秋";else if (day == 1)return chineseNumber[month - 1] + "月";elsereturn getChinaDayString(day);}public String toString() {if (chineseNumber[month - 1] == "一" && getChinaDayString(day) == "初一")return "农历" + year + "年";else if (getChinaDayString(day) == "初一")return chineseNumber[month - 1] + "月";elsereturn getChinaDayString(day);}
}
代码   SolarTerm.javapackage myCalendar;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class SolarTerm {private static final double D = 0.2422;private final static Map<String, Integer[]> INCREASE_OFFSETMAP = new HashMap<String, Integer[]>();// +1偏移private final static Map<String, Integer[]> DECREASE_OFFSETMAP = new HashMap<String, Integer[]>();// -1偏移/*** 24节气**/private static enum SolarTermsEnum {LICHUN, // --立春YUSHUI, // --雨水JINGZHE, // --惊蛰CHUNFEN, // 春分QINGMING, // 清明GUYU, // 谷雨LIXIA, // 立夏XIAOMAN, // 小满MANGZHONG, // 芒种XIAZHI, // 夏至XIAOSHU, // 小暑DASHU, // 大暑LIQIU, // 立秋CHUSHU, // 处暑BAILU, // 白露QIUFEN, // 秋分HANLU, // 寒露SHUANGJIANG, // 霜降LIDONG, // 立冬XIAOXUE, // 小雪DAXUE, // 大雪DONGZHI, // 冬至XIAOHAN, // 小寒DAHAN;// 大寒}static {DECREASE_OFFSETMAP.put(SolarTermsEnum.YUSHUI.name(),new Integer[]{2026});// 雨水INCREASE_OFFSETMAP.put(SolarTermsEnum.CHUNFEN.name(),new Integer[]{2084});// 春分INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOMAN.name(),new Integer[]{2008});// 小满INCREASE_OFFSETMAP.put(SolarTermsEnum.MANGZHONG.name(),new Integer[]{1902});// 芒种INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAZHI.name(),new Integer[]{1928});// 夏至INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOSHU.name(), new Integer[]{1925, 2016});// 小暑INCREASE_OFFSETMAP.put(SolarTermsEnum.DASHU.name(),new Integer[]{1922});// 大暑INCREASE_OFFSETMAP.put(SolarTermsEnum.LIQIU.name(),new Integer[]{2002});// 立秋INCREASE_OFFSETMAP.put(SolarTermsEnum.BAILU.name(),new Integer[]{1927});// 白露INCREASE_OFFSETMAP.put(SolarTermsEnum.QIUFEN.name(),new Integer[]{1942});// 秋分INCREASE_OFFSETMAP.put(SolarTermsEnum.SHUANGJIANG.name(),new Integer[]{2089});// 霜降INCREASE_OFFSETMAP.put(SolarTermsEnum.LIDONG.name(),new Integer[]{2089});// 立冬INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOXUE.name(),new Integer[]{1978});// 小雪INCREASE_OFFSETMAP.put(SolarTermsEnum.DAXUE.name(),new Integer[]{1954});// 大雪DECREASE_OFFSETMAP.put(SolarTermsEnum.DONGZHI.name(), new Integer[]{1918, 2021});// 冬至INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(),new Integer[]{1982});// 小寒DECREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(),new Integer[]{2019});// 小寒INCREASE_OFFSETMAP.put(SolarTermsEnum.DAHAN.name(),new Integer[]{2082});// 大寒}// 定义一个二维数组,第一维数组存储的是20世纪的节气C值,第二维数组存储的是21世纪的节气C值,0到23个,依次代表立春、雨水...大寒节气的C值private static final double[][] CENTURY_ARRAY = {{4.6295, 19.4599, 6.3826, 21.4155, 5.59, 20.888, 6.318, 21.86,6.5, 22.2, 7.928, 23.65, 8.35, 23.95, 8.44, 23.822, 9.098,24.218, 8.218, 23.08, 7.9, 22.6, 6.11, 20.84},{3.87, 18.73, 5.63, 20.646, 4.81, 20.1, 5.52, 21.04, 5.678, 21.37,7.108, 22.83, 7.5, 23.13, 7.646, 23.042, 8.318, 23.438,7.438, 22.36, 7.18, 21.94, 5.4055, 20.12}};/*** @param year 年份* @param name 节气的名称* @return 返回节气是相应月份的第几天*/public static int getSolarTermNum(int year, String name) {double centuryValue = 0;// 节气的世纪值,每个节气的每个世纪值都不同name = name.trim().toUpperCase();int ordinal = SolarTermsEnum.valueOf(name).ordinal();int centuryIndex = -1;if (year >= 1901 && year <= 2000) {// 20世纪centuryIndex = 0;} else if (year >= 2001 && year <= 2100) {// 21世纪centuryIndex = 1;} else {throw new RuntimeException("不支持此年份:" + year+ ",目前只支持1901年到2100年的时间范围");}centuryValue = CENTURY_ARRAY[centuryIndex][ordinal];int dateNum = 0;/*** 计算 num =[Y*D+C]-L这是传说中的寿星通用公式* 公式解读:年数的后2位乘0.2422加C(即:centuryValue)取整数后,减闰年数*/int y = year % 100;// 步骤1:取年分的后两位数if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年if (ordinal == SolarTermsEnum.XIAOHAN.ordinal()|| ordinal == SolarTermsEnum.DAHAN.ordinal()|| ordinal == SolarTermsEnum.LICHUN.ordinal()|| ordinal == SolarTermsEnum.YUSHUI.ordinal()) {// 注意:凡闰年3月1日前闰年数要减一,即:L=[(Y-1)/4],因为小寒、大寒、立春、雨水这两个节气都小于3月1日,所以// y = y-1y = y - 1;// 步骤2}}dateNum = (int) (y * D + centuryValue) - (int) (y / 4);// 步骤3,使用公式[Y*D+C]-L计算dateNum += specialYearOffset(year, name);// 步骤4,加上特殊的年分的节气偏移量return dateNum;}/*** 特例,特殊的年分的节气偏移量,由于公式并不完善,所以算出的个别节气的第几天数并不准确,在此返回其偏移量** @param year 年份* @param name 节气名称* @return 返回其偏移量*/private static int specialYearOffset(int year, String name) {int offset = 0;offset += getOffset(DECREASE_OFFSETMAP, year, name, -1);offset += getOffset(INCREASE_OFFSETMAP, year, name, 1);return offset;}private static int getOffset(Map<String, Integer[]> map, int year,String name, int offset) {int off = 0;Integer[] years = map.get(name);if (null != years) {for (int i : years) {if (i == year) {off = offset;break;}}}return off;}private static int mYear;private static List<String> mSolarData = new ArrayList<String>();private static List<String> mSolarName = new ArrayList<String>();/*** 判断一天是什么节气** @param year* @param data 月份占两位,日不确定,如一月一日为:011,五月十日为0510* @return* @data2015-12-2下午2:49:32*/public static String getSolatName(int year, String data) {for (int i = 0; i < mSolarData.size(); i++) {//System.out.println(mSolarData.get(i));}if (year != mYear) {solarTermToString(year);}if (mSolarData.contains(data)) {return mSolarName.get(mSolarData.indexOf(data));} else {return null;}}private static void solarTermToString(int year) {mYear = year;if (mSolarData != null) {mSolarData.clear();} else {mSolarData = new ArrayList<String>();}if (mSolarName != null) {mSolarName.clear();} else {mSolarName = new ArrayList<String>();}// 1mSolarName.add("立春");mSolarData.add("2"+ getSolarTermNum(year, SolarTermsEnum.LICHUN.name()));// 2mSolarName.add("雨水");mSolarData.add("2"+ getSolarTermNum(year, SolarTermsEnum.YUSHUI.name()));// 3mSolarName.add("惊蛰");mSolarData.add("3"+ getSolarTermNum(year, SolarTermsEnum.JINGZHE.name()));// 4mSolarName.add("春分");mSolarData.add("3"+ getSolarTermNum(year, SolarTermsEnum.CHUNFEN.name()));// 5mSolarName.add("清明");mSolarData.add("4"+ getSolarTermNum(year, SolarTermsEnum.QINGMING.name()));// 6mSolarName.add("谷雨");mSolarData.add("4" + getSolarTermNum(year, SolarTermsEnum.GUYU.name()));// 7mSolarName.add("立夏");mSolarData.add("5" + getSolarTermNum(year, SolarTermsEnum.LIXIA.name()));// System.out.println(year);//System.out.println(getSolarTermNum(year, SolarTermsEnum.LIXIA.name()));// 8mSolarName.add("小满");mSolarData.add("5"+ getSolarTermNum(year, SolarTermsEnum.XIAOMAN.name()));// 9mSolarName.add("芒种");mSolarData.add("6"+ getSolarTermNum(year, SolarTermsEnum.MANGZHONG.name()));// 10mSolarName.add("夏至");mSolarData.add("6"+ getSolarTermNum(year, SolarTermsEnum.XIAZHI.name()));// 11mSolarName.add("小暑");mSolarData.add("7"+ getSolarTermNum(year, SolarTermsEnum.XIAOSHU.name()));// 12mSolarName.add("大暑");mSolarData.add("7" + getSolarTermNum(year, SolarTermsEnum.DASHU.name()));// 13mSolarName.add("立秋");mSolarData.add("8" + getSolarTermNum(year, SolarTermsEnum.LIQIU.name()));// 14mSolarName.add("处暑");mSolarData.add("8"+ getSolarTermNum(year, SolarTermsEnum.CHUSHU.name()));// 15mSolarName.add("白露");mSolarData.add("9" + getSolarTermNum(year, SolarTermsEnum.BAILU.name()));// 16mSolarName.add("秋分");mSolarData.add("9"+ getSolarTermNum(year, SolarTermsEnum.QIUFEN.name()));// 17mSolarName.add("寒露");mSolarData.add("10"+ getSolarTermNum(year, SolarTermsEnum.HANLU.name()));// 18mSolarName.add("霜降");mSolarData.add("10"+ getSolarTermNum(year, SolarTermsEnum.SHUANGJIANG.name()));// 19mSolarName.add("立冬");mSolarData.add("11"+ getSolarTermNum(year, SolarTermsEnum.LIDONG.name()));// 20mSolarName.add("小雪");mSolarData.add("11"+ getSolarTermNum(year, SolarTermsEnum.XIAOXUE.name()));// 21mSolarName.add("大雪");mSolarData.add("12"+ getSolarTermNum(year, SolarTermsEnum.DAXUE.name()));// 22mSolarName.add("冬至");mSolarData.add("12"+ getSolarTermNum(year, SolarTermsEnum.DONGZHI.name()));// 23mSolarName.add("小寒");mSolarData.add("01"+ getSolarTermNum(year, SolarTermsEnum.XIAOHAN.name()));// 24mSolarName.add("大寒");mSolarData.add("01" + getSolarTermNum(year, SolarTermsEnum.DAHAN.name()));}}
代码 MainFrame.javapackage myCalendar;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;class MainFrame extends JFrame {/****/private static final long serialVersionUID = 1L;JPanel panel = new JPanel(new BorderLayout());JPanel panel1 = new JPanel();JPanel panel2 = new JPanel(new GridLayout(7, 7));JPanel panel3 = new JPanel();JLabel[] label = new JLabel[49];JLabel y_label = new JLabel("年份");JLabel m_label = new JLabel("月份");JComboBox com1 = new JComboBox();JComboBox com2 = new JComboBox();JButton but1 = new JButton("上个月");JButton but2 = new JButton("下个月");JButton but4 = new JButton("查询");int re_year, re_month;int x_size, y_size;String year_num;Calendar now = Calendar.getInstance(); // 实例化CalendarMainFrame() {super("万年历");setSize(600, 700);x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());setLocation((x_size - 300) / 2, (y_size - 350) / 2);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);panel1.add(but1);panel1.add(y_label);panel1.add(com1);panel1.add(m_label);panel1.add(com2);panel1.add(but2);
//        panel1.add(but3);panel1.add(but4);for (int i = 0; i < 49; i++) {label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中panel2.add(label[i]);}panel.add(panel1, BorderLayout.NORTH);panel.add(panel2, BorderLayout.CENTER);panel.add(panel3, BorderLayout.SOUTH);panel.setBackground(Color.white);panel1.setBackground(Color.white);panel2.setBackground(Color.white);panel3.setBackground(Color.gray);Init();but1.addActionListener(new AnAction());but2.addActionListener(new AnAction());com1.addActionListener(new ClockAction());com2.addActionListener(new ClockAction());setContentPane(panel);setVisible(true);setResizable(false);}class AnAction implements ActionListener {public void actionPerformed(ActionEvent e) {int c_year, c_month, c_week;c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11c_year = Integer.parseInt(com1.getSelectedItem().toString()) - 1; // 得到当前所选年份if (e.getSource() == but1) {if (c_month == 0) {c_year = c_year - 1;c_month = 11;} elsec_month = c_month - 1;}if (e.getSource() == but2) {if (c_month == 11) {c_year = c_year + 1;c_month = 0;} elsec_month = c_month + 1;}com1.setSelectedIndex(c_year);com2.setSelectedIndex(c_month);c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11c_week = use(c_year, c_month); // 调用函数use,得到星期几Resetday(c_week, c_year, c_month); // 调用函数Resetday}}/* class NextAction implements ActionListener {public void actionPerformed(ActionEvent arg0){int c_year, c_month,c_week;c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份if(c_month==11){c_year=c_year+1;c_month=0;}c_week = use(c_year, c_month); // 调用函数use,得到星期几Resetday(c_week, c_year, c_month); // 调用函数Resetday}}*/class ClockAction implements ActionListener {public void actionPerformed(ActionEvent arg0) {int c_year, c_month, c_week;c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11c_week = use(c_year, c_month); // 调用函数use,得到星期几Resetday(c_week, c_year, c_month); // 调用函数Resetday}}public void Init() {int year, month_num, first_day_num;String log[] = {"日", "一", "二", "三", "四", "五", "六"};for (int i = 0; i < 7; i++) {label[i].setText(log[i]);}for (int i = 0; i < 49; i = i + 7) {label[i].setForeground(Color.blue); // 将星期日的日期设置为红色}for (int i = 6; i < 49; i = i + 7) {label[i].setForeground(Color.blue);// 将星期六的日期设置为hong色}for (int i = 1; i < 10000; i++) {com1.addItem("" + i);}for (int i = 1; i < 13; i++) {com2.addItem("" + i);}month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份com1.setSelectedIndex(year - 1); // 设置下拉列表显示为当前年???????????com2.setSelectedIndex(month_num); // 设置下拉列表显示为当前月first_day_num = use(year, month_num);Resetday(first_day_num, year, month_num);}public int use(int reyear, int remonth) {int week_num;now.set(reyear, remonth, 1); // 设置时间为所要查询的年月的第一天week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期return week_num;}public void Resetday(int week_log, int year_log, int month_log) {int month_day_score; // 存储月份的天数int count;Lunar lunar;int month_day;String[] LunarDate = new String[49];month_day_score = 0;count = 1;for (int i = 1; i < 49; i++) {for (int j = 0; j < 49; j = j + 7) {if (i != j && i != j + 6)label[i].setForeground(Color.black);}}Date date = new Date(year_log, month_log + 1, 1); // now MONTH是从0开始的, 对于一月第几天来说,DAY_OF_MONTH第一天就是1. 对于一年第几个月来说,MONTH一月份是0,二月份是1...Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.MONTH, -1); // 前个月month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天month_day = month_day_score;for (int i = 7; i < 49; i++) { // 初始化标签label[i].setText("");}week_log = week_log + 6; // 将星期数加6,使显示正确month_day_score = month_day_score + week_log;lunar = new Lunar();for (int i = 0; i < month_day; i++) {LunarDate[i] = lunar.getLunarDate(year_log, month_log + 1, i + 1);}for (int i = week_log; i < month_day_score; i++, count++) {//System.out.println(count);if (month_log == 9 && count == 1) {label[i].setText(count + "国庆");label[i].setForeground(Color.red);} else if (month_log == 0 && count == 1) {label[i].setText(count + "元旦");label[i].setForeground(Color.red);} else if (month_log == 11 && count == 24) {label[i].setText(count + "平安夜");label[i].setForeground(Color.red);} else if (month_log == 11 && count == 25) {label[i].setText(count + "圣诞");label[i].setForeground(Color.red);} else if (month_log == 1 && count == 14) {label[i].setText(count + "情人节");label[i].setForeground(Color.red);} else if (month_log == 4 && count == 1) {label[i].setText(count + "劳动节");label[i].setForeground(Color.red);} else if (LunarDate[i - week_log].equals("春节") || LunarDate[i - week_log].equals("元宵") || LunarDate[i - week_log].equals("端午") || LunarDate[i - week_log].equals("中秋")) {label[i].setText(count + LunarDate[i - week_log]);label[i].setForeground(Color.red);} else {label[i].setText(count + LunarDate[i - week_log]);}String solarTerm = SolarTerm.getSolatName(year_log, (month_log + 1) + "" + count);if (solarTerm != null) {label[i].setText(label[i].getText() + solarTerm);}}}/*** 判断给定的年份是否为闰年** @param year:给定的年份* @return true:闰年;false:平年*/public static boolean isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}/*** 判断哪一天*/public static void isDay() {// 实例化ScannerScanner scan = new Scanner(System.in);// 声明年份,月份,日期int year, month, day;// 提示用户输入年份System.out.println("请输入年份:");
// 接受用户输入的年份year = scan.nextInt();// 提示用户输入月份System.out.println("请输入月份:");
// 接受用户输入的月份month = scan.nextInt();// 提示用户输入日期System.out.println("请输入日期:");
// 接受用户输入的日期day = scan.nextInt();// 判断月份(注意break位置)switch (month - 1) {case 11:// 日期加上11月的全天数day += 30;case 10:// 日期加上10月的全天数day += 31;case 9:// 日期加上9月的全天数day += 30;case 8:// 日期加上8月的全天数day += 31;case 7:// 日期加上7月的全天数day += 31;case 6:// 日期加上6月的全天数day += 30;case 5:// 日期加上5月的全天数day += 31;case 4:// 日期加上4月的全天数day += 30;case 3:// 日期加上3月的全天数day += 31;case 2:/** 日期加上2月的全天数* 闰年判断*/if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {// 是// 天数加29day += 29;} else {// 不是// 天数加28day += 28;}case 1://日期加上1月的全天数day += 31;default:// 错误提示System.out.println("请输入正确月份");break;}// 判断月份是否有误if (month >= 1 && month <= 12) {// 打印判断结果System.out.println("今天是" + year + "年的第" + day + "天");}}public static void main(String[] args) {while (true) {System.out.println("输入数字实现功能");System.out.println("请输入数字:");System.out.println("0:判断闰年");System.out.println("1:判断为第几天");System.out.println("2:日历显示");Scanner scan = new Scanner(System.in);int i = 5;i = scan.nextInt();switch (i) {case 0:System.out.println("请输入年份:");// 提示用户输入年份// 接受用户输入的年份int year = scan.nextInt();boolean a = isLeapYear(year);if (a == true) System.out.println("是的");else System.out.println("不是");break;case 1:isDay();break;case 2:JFrame.setDefaultLookAndFeelDecorated(true);new MainFrame();;break;default:JFrame.setDefaultLookAndFeelDecorated(true);new MainFrame();break;}}}
}

 运行结果

 


http://chatgpt.dhexx.cn/article/wpnvKYcW.shtml

相关文章

Qt项目简单贪吃蛇代码

目录 第一个界面 第二个界面 第一个界面 在.pro文件里添加sql QT core gui sql 点击.ui文件添加组件 类和对象如图所示&#xff0c;右键MianWindow->改变样式表&#xff0c;在编辑样式表里添加代码改变按钮样式 QPushButton{border:2px solid #7b7b7b; //按钮…

贪吃蛇php代码下载,C语言贪吃蛇代码

C语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码&#xff0c;附txt代码和源代码程序。 相关软件软件大小版本说明下载地址 c语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码。如果你正在学习c语言&#xff0c;就来下载吧。很经典的…

Html/Javascript snake game 贪吃蛇游戏(附全部代码)

以前用pyhton 做了贪吃蛇游戏&#xff0c; 这里发表的是html/javascript 版本。难度差不多&#xff0c; 区别是python 主要用class, 而javascript 主要用function &#xff0c; 他们的功能很相似&#xff0c; 写法稍微有些不同。内容大致是&#xff1a; 1. 蛇由蛇头&#xff0…

实验二.贪吃蛇的设计

目录 一.实验内容&#xff1a; 二.贪吃蛇的代码实现 &#xff08;1&#xff09;类的声明 &#xff08;2&#xff09;初始化界面 &#xff08;3&#xff09;游戏界面 &#xff08;4&#xff09;蛇的位置 &#xff08;5&#xff09;键盘监听 &#xff08;6&#xff09;更…

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

文章目录 代码运行截图笔记补充参考博客&#xff08;阿里嘎多&#xff01;&#xff09; 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&am…

k-means聚类算法及matlab实现(简单实现)

k-means简介 k-means算法也称k均值算法&#xff0c;是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。   聚类试图将数据集中的样本划分为若干个通常是不相交的子集&#xff0c;每个子集称为一个“簇”。通过这样的划分&#xff0c;每个簇里的样本可…

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…

K-means聚类算法及其MATLAB实现

参考&#xff1a; http://www.csdn.net/article/2012-07-03/2807073-k-means http://www.cnblogs.com/zhzhang/p/5437778.html http://blog.csdn.net/qll125596718/article/details/8243404/ K-means属于无监督学习方法 K表示类别数&#xff0c;Means表示均值&#xff0c;K…

基于MATLAB的K-means聚类算法

实验数据说明 Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集。通过花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度4个属性预测鸢尾花卉属于&#xff08;Setosa(山鸢尾)&#xff0c;Versicolour(杂色鸢尾)&#xff0c;Virginica(维吉尼…

k-means聚类算法(matlab实现)

k-means聚类算法 文章目录 k-means聚类算法前言一、k-means聚类算法简介二、k-means聚类算法步骤三、代码实现总结 前言 k-means聚类算法是硬聚类算法的一种&#xff0c;即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本&#xf…

Kmeans聚类算法——Matlab

聚类算法 原理步骤代码绘图选取四个迭代步骤进行可视化&#xff08;散点图&#xff0c;条形图&#xff09;聚类结果可视化&#xff08;散点图&#xff09; 原理 聚类算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对距离他们最近的对象进行归类。通过迭…

matlab实现聚类算法

simulate2020625数据集 clear;clc load simulate2020625;kmax(subcluster(:,3));%设置聚类数目 data subcluster(:,1:2); cata subcluster; [m,n]size(data); c1subcluster(:,3); c1c1;%% 实际聚类图 figure(1); plot(cata(cata(:,3)1,1),cata(cata(:,3)1,2),r*) hold on pl…

K-means++聚类算法(matlab实现)

K-means聚类算法 文章目录 K-means聚类算法前言一、算法简介二、K-means算法步骤三、K-means算法matlab实现总结 前言 K-means算法&#xff1a;K-means算法是K-means算法的改进版&#xff0c;其在选择初始质心时采用了一种更加聪明的方法&#xff0c;能够有效地避免局部最优解…

MATLAB聚类分析(Cluster Analysis)

使用环境&#xff1a;MATLAB2016a、MATLAB2010a 聚类分析是一种无监督式学习&#xff0c;不像回归分析等需要Inputs 和 Targets &#xff0c;聚类分析是只通过提供一组数据实现分类的算法。下面给出本人在学习聚类分析的MATLAB程序 x15*[randn(500,1)5,randn(500,1)5]; x25*[…

matlab统计与机器学习工具箱中的7种聚类算法

1. matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法&#xff0c;并给出了其聚类函数。在使用过程中&#xff0c;直接调用该函数即可&#xff0c;十分方便&#xff0c;不得不感慨matlab的强大。 聚类分析&#xff0c;又称分割分析或分类分…

K-mean(多维度)聚类算法(matlab代码)

申明: 仅个人小记。 Email: officeforcsdn163.com 目录 效果演示二维度三维度 k-mean 算法思想简要说明代码分析二维度k-mean代码三维度k-mean代码多维度k-mean代码功能使用示范后期函数接口改造 (借助matlab中cell结构实现)新的函数接口使用范例 小结 效果演示 二维度 (1) K…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

MATLAB K-means聚类的介绍与使用

K-means算法是硬聚类算法 &#xff0c;是典型的基于原型的目标函数 聚类方法的代表&#xff0c;它是数据点到原型的某种距离作为优化的目标函数&#xff0c;利用函数求极值的方法得到迭代运算的调整规则。K-means算法以偶是距离 作为相似度测度&#xff0c;它是求对应某一初…

MatLab Kmeans聚类

机器学习以及人工智能的学习需要扎实的数学功底才能走的更远&#xff0c;爬的更高&#xff0c;所以打好数学基础是关键&#xff0c;但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了&#xff0c;这里我建议大家找几个比较靠谱入门的机器学习或者人工智能学习平…

聚类分析(二)k-means及matlab程序

1.介绍 k-means是一种常见的基于划分的聚类算法。划分方法的基本思想是&#xff1a;给定一个有N个元组或者记录的数据集&#xff0c;将数据集依据样本之间的距离进行迭代分裂&#xff0c;划分为K个簇&#xff0c;其中每个簇至少包含一条实验数据。 2.k-means原理分析 2.1工作原…