perpetual calendar(万年历及其它上机练习)

该程序集成了三个功能:1) 用户输入年月,程序输出对应月份的日历;2) 实现会员注册,要求用户名长度不小于3,密码长度不小于6,且两次输入的密码需一致;3) 商品批发,用户输入商品编码和批发数量,程序计算总金额。程序中包含了日期计算、字符串操作及条件判断等核心功能。
摘要由CSDN通过智能技术生成
上机练习:实现万年历
import java.util.Scanner;

public class Assignment {
    public static void main(String[] args) {
        //思路:
        //1、构建Scanner扫描器类的对象
        Scanner input = new Scanner(System.in);

        //2、从控制台接收用户录入的年份、月份
        System.out.println("输入年");
        int year = input.nextInt();
        System.out.println("输入月");
        int month = input.nextInt();
        //获取1900s距当前年份的上一年的总天数
        int totalDays = getFromLastYearTo1900TototalDays(year);
        //获取当前年份经过的总天数
        int totalDaysNowYear = getNowYearPassedTototalDays(year, month);
        //获取给定月份的第一天的星期数
        int week = (totalDays+totalDaysNowYear + 1) % 7;//一周有7天所以%7
        //格式化输出日历:
        formatCalendarOutput(week, year, month);
    }
    public static void formatCalendarOutput(int week,int year,int month){
        int count=0;//计算空格和日期数的和
        //打印表头:
        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        //打印空格(星期之间空格个数的规律)
        for (int i = 1; i <=week ; i++) {
        System.out.println("\t\t");
        count++;
    }
        //打印日历
        for (int i = 1; i <=getNowMonthTototalDays(year,month) ; i++) {
            System.out.print(i+"\t\t");
            count++;
            if (count%7==0){
                System.out.println();
            }
        }
}
//判断给定的年份是否是闰年
    //闰年为true,否则为false
public static boolean isLeapYear(int year){
        return(year%4==0)&&(year%400==0&&year%100!=0);
    }
    //根据参数指定的年份,月份,求出当前月的总天数
    public static int getNowMonthTototalDays(int year,int month){
        switch (month){
            case 2:
                return isLeapYear(year)?29:28;
            case 4:
            case 6:
            case 9:
            case 11: return 30;
            default:
                return 31;
        }
    }
    //获得当前年份的上一年距离1900年所经过的总天数
    public static  int getFromLastYearTo1900TototalDays(int year){
        int totalDays=0;
        for (int i = 1900; i <year ; i++) {
           totalDays+=isLeapYear(i)?366:365;
        }
        return totalDays;
    }
    //求出当前年份经过的总天数(从当前年的1月1日到给定月份的上一个月最末一天)
    public static int getNowYearPassedTototalDays(int year,int month){
        int totalDays=0;
        for (int i = 1; i <month ; i++) {
                totalDays+=getNowMonthTototalDays(year,i);
        }
        return totalDays;
    }
}
Show Running result(展示运行结果):
------------------------------------------------------
输入年
2022
输入月
3
星期日	星期一	星期二	星期三	星期四	星期五	星期六
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		
Process finished with exit code 0

上机练习 会员登录
//训练要点:String类的使用,带参方法的定义和使用.
//需求说明:实现会员注册,要求:用户名长度不小于3,密码长度不小于6
//注册时两次输入密码必须相同
public class Register {
    public static void main(String[] args) {
        System.out.println("*****欢迎进入注册系统******");
        boolean flag=true;//设置一个boolean类型的值
        Scanner sc = new Scanner(System.in);
        while (flag) {//进入循环,如果满足下面代码块中的条件,直到flag为true的时候,停止循环,否则继续循环,末尾的时候必须要加break结束循环,满足所有需求后即可break结束循环
            System.out.println("请输入用户名:");
            String name = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            System.out.println("请再次输入密码:");
            String passwordTwo = sc.nextLine();
            if (name.length() < 3 && password.length() < 6) {
                System.out.println("用户名长度不能小于3,密码长度不能小于6!");
            } else if (!password.equals(passwordTwo)) {
                System.out.println("两次密码输入不相同,请重新输入!");
            } else if (name.length() >= 3 && password.length() >= 6 && password.equals(passwordTwo)) {
                System.out.println("恭喜您!注册成功!请牢记用户名和密码");
                break;
            }
        }
    }
}

上机练习:实现商品货物
public class Goods {
    static String[] goods = {"电风扇", "洗衣机", "电视机", "冰箱", "空调机"};
    static double[] price = {123.23, 4500.0, 8800.9, 5000.88, 4456.0};
    public static void main(String[] args) {
 
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("TOM");
        System.out.println("请输入用户名:" + stringBuffer);
        stringBuffer.delete(0, 3);
        stringBuffer.append(123);
        System.out.println("请输入密码:" + stringBuffer);
        stringBuffer.delete(0, 3);
        stringBuffer.append("登录成功!");
        System.out.println(stringBuffer);
        show();
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您批发的商品编码:");
        int num=sc.nextInt();
        System.out.println("请输入批发数量:");
        int count=sc.nextInt();
        double sum=0;//这里定义一个存储总金额的变量。
        switch (num){//进行switch循环,通过传入的编号来获取相应的金额。
            case 1://例如这里的case 1:就是匹配相应的num商品编号1,我们已经有了相应编号的商品价格,所以这里只需要用商品的价格乘以批发的数量就是总的金额了。
                sum=price[0]*count;//上面的price已经被我们定义为了数组,所以用sum=count*price[下标]就可以了。这里的switch(num){}循环,就是通过输入相应的num编号,然后去获取这里编号商品的批量购买的总金额。
            case 2:
                sum=price[1]*count;
            case 3:
                sum=price[2]*count;
            case 4:
                sum=price[3]*count;
            case 5:
                sum=price[4]*count;
                break;
            default:
                System.out.println("您输入的商品不存在!");
                break;
        }
        System.out.println("您需要付款"+change(sum));//这里的change()方法中传入总金额sum,就是输出最后被格式化后的总金额,因为change方法在下面我们已经做出了初始化的操作,所以这里只需要在change()方法中传入变量即可。
    //最后输出change方法传入sum变量,就得到了被格式化后我们需要付款的总金额了。下面的change方法已经被我们进行了格式化的操作,所以这里只需要调用change格式化方法传入相应的变量就可以输出被格式化后的总的金额了。
    }
    public static void show(){
        System.out.println("************欢迎进入商品批发城**************");
        System.out.println("编号\t\t商品\t\t价格");
        for (int i = 0; i <goods.length ; i++) {
            System.out.print(+(i+1)+"\t\t\t"+goods[i]+"\t\t");//这里的(i+1)就是商品的编码,商品的总的下标数为4,所以i起始为0,用i+1最后循环遍历刚好编号为5,依次进行输出
            System.out.println(change(price[i]));//使用StringBuff change()格式化金额,这里输出change(price[i]),就是输出被格式化的金额,因为price在上面已经被定义成了数组,这里又进行了fori循环,所以只需要传入i进行循环就可以依次进行输出了。
        }
        System.out.println("*******************************************");
 
    }
    //格式化金额:
    public static StringBuffer change(double price){
        StringBuffer str=new StringBuffer(String.valueOf(price));//把double类型的数组用valueOf包装成String类型
        int i=str.indexOf(".");//indexOf方法,查找指定内容,第一次出现的索引,如果没有则返回为-1,有就返回为第一次出现的下标.
        for (int j =i-3 ; j >0 ; j-=3) {//可以看到金额的显示形式为,4,,500.0。就是从第一次出现的.的位置然后再减去3个位置的时候插入","所以这里的forj循环起始从j=i-3开始,后面的j-=3,也是跟前面的规律一样,都是·出现的位置向后移3位插入逗号,所以后面的条件为j-=3也就是j=j-3,前面的j已经初始化为i-3了,所以这里j-=3,进行循环输出就可以了。
            str.insert(j,",");//insert方法在指定索引的位置进行插入
        }
        return str;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值