Java流程控制练习--万年历

标签: Java入坑之旅


0x01. 打印倒三角和正三角

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i;
        int j;

        /**
         *  要求:打印一个倒三角以及一个正三角
         *  方法:双层循环
         **/
        for(i=3;i>0;i--) {
            for(j=1;j<=i;j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        for(i=1;i<4;i++) {
            for(j=1;j<=i;j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
Output:
***
**
*
*
**
***

0x02. 九九乘法表1(正立)

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /**
         *  要求:打印九九乘法表
         *  方法:双层循环
         **/
        for(int i = 1;i<=9;i++) {
            for(int j = 1;j<=i;j++) {
                System.out.printf("%d*%d=%-2d\t",j,i,i*j);
            }
            System.out.println();
        }
    }
Output:
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

0x03. 九九乘法表2(倒立)

    public static void main(String[] args) {
        for (int i = 1;  i <= 9; ++i) {
            for (int j = 1; j <= 9; j++) {
                if(j < i) {
                    //输出的空格由"%2d*%2 =%-2d "决定
                    System.out.print("        ");
                }
                else {
                    System.out.printf("%d*%d=%-2d\t", i ,j , i*j);
                }
            }
            System.out.println();
        }
    }
Output:
1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   1*6=6   1*7=7   1*8=8   1*9=9
        2*2=4   2*3=6   2*4=8   2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
                3*3=9   3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
                        4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
                                5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
                                        6*6=36  6*7=42  6*8=48  6*9=54
                                                7*7=49  7*8=56  7*9=63
                                                        8*8=64  8*9=72
                                                                9*9=81
                                                                

0x04. 万年历 calendar

4.1 求解思路

例1:1900年02月。

  1. 1900年为平年,02月为28天。
  2. 02月01日距离01月01日有(30+1=31)31天。
  3. 每7天为1周,(31%7=3)所以02月01日就是星期三(date[0]为星期日)。
  4. 从01号开始循环输出到28即可;

例2:1900年04月。

  1. 1900年为平年,02月有28天。
  2. 04月01日距离01月01日有(30+28+31+1=90)90天。
  3. 每7天为1周,(90%7=6)所以04月01日就是星期六(date[0]为星期日)。
  4. 从01号开始循环输出到30即可;

4.2 算法思路

  1. 确认输入年份是否为闰年。如果是闰年,则2月天数为29,否则为28天。
  2. 求解输入的月份距离1900年1月1日的天数;
  3. 确定这个月的01号是星期几;
  4. 从01号开始输出到这个月的最后一天即可。

4.3 Java代码

package com.ryanjie.test0727;

import java.util.Scanner;
public class Calendar {

    /**
     *
      * @title: leapYear
      * @description:判断输入年是否为闰年
      * @author: Ryanjie
      * @date 2018年7月30日 下午8:35:30
      * @param year
      * @return
      *
     */
    static boolean leapYear(int year){
        if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            // 是闰年
            return true;
        }

        else {
            //是平年
            return false;
        }
    }

    /* 用N表示起始年份 */
    static final int N = 1900;

    /**
     *
      * @title: monthCalendar
      * @description:首先确认当前月距离1900年1月1日的天数,之后判断出这个月的01号为星期几,
      *              之后控制输出日历
      * @author: Ryanjie
      * @date 2018年7月30日 下午8:32:26
      * @param currentYear
      * @param currentMonth
      *
     */
    static void monthCalendar(int currentYear,int currentMonth) {

        // sumdays 用来存储一共有多少天
        int sumdays = 0;

        // 存储12个月的天数( 没有0月,所以month[0]=0 )
        int month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 

        // 存储1900-11969中的每一年的01月01号是星期几 year[0] = 1代表1970年01月01日为星期一
        for(int i = N;i < currentYear;i ++) {

            // days用来存储前一年一共多少天(366/365)
            int days = 365;
            if(leapYear(i)) {
                days ++;
                sumdays = sumdays + days;
            }
            else{
                sumdays = sumdays + days;
            }
        }

        // 如果是闰年,2月改为29号
        if(leapYear(currentYear)){
            month[2] = 29;
        }

        for(int i=1;i<currentMonth;i++){
            sumdays = sumdays + month[i];
        } 

        // week 用来存储当前月01号是星期几
        int week;
        week = (sumdays + 1) % 7;

        System.out.println("星期日\t" + "星期一\t" + "星期二 \t" + "星期三 \t" + "星期四 \t" + "星期五 \t" + "星期六 \t");
        System.out.println();

        // 输出控制
        for(int i = 0;i < week; i++) {
            System.out.print(" \t");
        }
        for(int i = 1; i <= month[currentMonth]; i ++) {
            System.out.printf(" %-2d \t",i);
            if ((week) % 7 == 6) {
                System.out.println();
            }
            week ++;
        }

    }

    public static void main(String[] args){

        while(true) {
            int month ,year;
            Scanner in = new Scanner(System.in);
            System.out.println();
            System.out.println("********欢迎您使用万年历!********");
            System.out.println("请输入年份<1900~11900>:");
            year = in.nextInt();
            if(year < 1900){
                System.out.println("输入年份不合法,请重新输入!");
                year = in.nextInt();
            }
            System.out.println("请输入月份<1~12> :");
           month = in.nextInt();
            if(month < 1  ||  month > 12){
                System.out.println("输入月份不合法,请重新输入!");
                month = in.nextInt();
            }
            monthCalendar(year,month);
            System.out.println();
            System.out.println("********感谢您使用万年历!********");
        }
    }
}
Output:

********欢迎您使用万年历!********
请输入年份<1900~11900>:
2018
请输入月份<1~12> :
7
星期日 星期一 星期二     星期三     星期四     星期五     星期六     

  1       2       3       4       5       6       7
  8       9       10      11      12      13      14
  15      16      17      18      19      20      21
  22      23      24      25      26      27      28
  29      30      31
********感谢您使用万年历!********

emmmm...格式是对的,但是一复制到markdown就会错位....

Java流程控制练习--万年历的更多相关文章

  1. JAVA流程控制

    JAVA流程控制 example1: --输出九九乘法表 public class chengfabiao { public static void main (String[] args){     ...

  2. Java学习笔记之:Java流程控制

    一.介绍 Java流程控制包括顺序控制.条件控制和循环控制. 顺序控制,就是从头到尾依次执行每条语句操作.条件控制,基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条件成立,则执行操 ...

  3. Java 流程控制

                                   Java    流程控制 Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支 ...

  4. JAVA 流程控制之选择语句

    在程序设计时,有三种基本技术可以改变程序的流程控制: 调用方法: 选择: 循环. 在这里,我们主要来讲讲选择语句. JAVA中的选择语句与C语言中的基本相同,包括: if 语句: if/else 语句 ...

  5. 《快乐编程大本营》java语言训练班-第4课:java流程控制

    <快乐编程大本营>java语言训练班-第4课:java流程控制 第1节. 顺序执行语句 第2节. 条件分支语句:if条件语句 第3节. 条件分支语句:switch 条件语句 第4节. 条件 ...

  6. Java流程控制,for,switch,while.break,continue,return

    Java流程控制,for,switch,while.break,continue,return

  7. 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结

    053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...

  8. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  9. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

随机推荐

  1. PHP 验证IP的合法性

    php验证IP的合法性! function get_ip(){ //判断服务器是否允许$_SERVER if(isset($_SERVER)){ if(isset($_SERVER[HTTP_X_FO ...

  2. Java反射的用法

    Class类 在Java中,每个class都有一个相应的Class对象.也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息. 反射 ...

  3. 微信小程序填坑之旅一(接入)

    一.小程序简介 小程序是什么? 首先“程序”这两个字我们不陌生.看看你手机上的各个软件,那就是程序.平时的程序是直接跑在我们原生的操作系统上面的.小程序是间接跑在原生系统上的.因为它嵌入在微信中,受微 ...

  4. JXOI2017颜色 解题报告

    JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...

  5. suoi31 最近公共祖先2 (倍增lca)

    根为r时x.y的公共祖先,就是lca(x,r),lca(x,y),lca(r,y)中深度最大的那一个,不要再在倍增的时候判来判去还判不对了... #include<bits/stdc++.h&g ...

  6. 解题:SDOI 2011 消耗战

    题面 本身求答案是简单的树上DP,只需要求出根到每个点路径上的最小值,然后考虑割连父亲的边还是割所有儿子即可,但是每次都这样做一次显然不能通过,考虑优化 用虚树来优化:虚树是针对树上一些点建出来的一棵 ...

  7. E. The Supersonic Rocket Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)

    http://codeforces.com/contest/1017/problem/E 凸包模板+kmp #include <cstdio> #include <cstdlib&g ...

  8. Python(3)---从迭代器到异步IO

    whenif 关注 2017.02.13 23:48* 字数 1750 阅读 250评论 0喜欢 8 目录 1. 迭代(iteration)与迭代器(iterator) 1.1 构建简单迭代器 1.2 ...

  9. sublime代码对齐

    来源于:Sublime 自动缩进怎么设置? - 郭缔的回答 - 知乎 https://www.zhihu.com/question/22987174/answer/90874465 { "k ...

  10. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...