做做Java


前言

Java基础练习题,欢迎更好的方法交流


1. 遍历字符串string

蹭的题,非常基础,但是学到了方法charAt():用于返回指定索引处的字符,索引范围为从 0 到 length() - 1。

public class Ergodic {
    public static void main(String[] args) {
        String s = "abc123"; 
        int l = s.length();
        for(int i=0;i < l;i++)
        {
            System.out.println(s.charAt(i));
        }
    }
}

编程小白同时也在学习C#,所以有些用法一不小心会混淆了,比如:
1.String 数据类型在java中一定要大写S,而string不可以
一开始写的时候就因此一直无法调用出length方法;
2.变量要先定义并且初始化初始化,再用。


2. 万年历

通用万年历
给定某年某月某日是星期几,能给出任何一年(12个月)的输出。
该方法以行为单位,输出各个月的相应行的数据。控制过程比较复杂,要求把每月需控制的参数用结构体定义。结构体中的属性大致包含:每月天数、一号周几。
int daysOfMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
实验步骤:
1.只按给定的daysOfMonth等数组(假定已知)来打印出对应年份的年历即可;
2.学习第四章类与对象后,自学Calendar类后,计算所用数组中的数据,完成整个程序。体会面向对象中类库的益处。

//Main
public class Main {
    public static void main(String[] args) {

        int year;

        Scanner in = new Scanner(System.in);

        System.out.println("请输入年:");
        year = in.nextInt();


        CalendarGet calendarGet = new CalendarGet(year);
        calendarGet.getData();  //getDate

    }
}


//Calendar
public class CalendarGet {
    private int day;
    private int month;
    private  int year;


    public CalendarGet(int year){

        this.year = year;
    }

    public  void getData(){
        CalendarBean calendarBean = new CalendarBean();
        calendarBean.setYear(year);
        for(int i = 0;i<12;i++){
            calendarBean.setMonth(i+1);
            String[] calendar =calendarBean.getCalendar();
            System.out.println("\n======================================");
            System.out.printf("\t\t     %d 月\t\t\n",i+1);    //printf:"%d"是一个int值的占位符,这个变量的参数在后面提供
            System.out.println("  日  一   二   三  四  五  六");  //println用法些许不同
            for(int j = 0; j < calendar.length; j++){
                if(j % 7 == 0)
                    System.out.println("");   //7个换行
                System.out.printf("%4s",calendar[j]);
            }
        }
    }

    //访问修饰符....封装性
    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }
}


//Calendar
public class CalendarBean {

    //初始化年月日月末
    int day = 0;
    int month = 0;
    int year = 0;
    int daysOfMonth[] = {31,28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


    public void setYear(int year) {
        this.year = year;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String[] getCalendar()
    {   //输出格式6*7=42
        String[] data = new String[42];
        Calendar calendar = Calendar.getInstance();
        calendar.set(year,month-1,1);

        //计算1号的星期
        int first = calendar.get(Calendar.DAY_OF_WEEK)-1;
        if (month == 2)
            if(((year%4 == 0) && (year%100 !=0)) || (year %400 == 0))
                day = daysOfMonth[month-1]+1;
            else
                day = daysOfMonth[month-1];
         else
             day = daysOfMonth[month-1];

         //把1号之前的利用空格存上
        for (int i =0;i<first;i++)
            data[i] = " ";

        //日期存入
        for (int i = first,n=1;i<first+day;i++){
            data[i] = String.valueOf(n);
            n++;
        }

        //剩余数组填满
        for (int i = first+day;i<data.length;i++)
            data[i] = " ";
        return data;
    }
}


输入2020运行界面
在这里插入图片描述

原来这道作业题重点在样式的显示实现上
在这里插入图片描述
在这里插入图片描述

//代码是室友的,我还没写想着有空再重看这题
class MyCalendar{
            int[] daysOfMonth =new int[12];
            int[] aOutputControl =new int[12];
            int[] ctlofMaxHeight ={6,6,6,6};
            public void prtCalendar(int year){
                for(int i=0;i<12;i++){
                    daysOfMonth[i]=getNumberOfDaysInMonth(year,i+1);
                    if((getStartDay(year,i+1)+1-7)<=-6)
                        aOutputControl[i]=getStartDay(year,i+1)+1;
                    else aOutputControl[i]=getStartDay(year,i+1)+1-7;
                }
                int col=0,week,nmonth,roe=0;
                for(roe=0;roe<4;roe++){
                    for(int t=0;t<3;t++){
                        System.out.print("----------------------------- ");
                    }
                    System.out.println();
                    for(int t=0;t<3;t++){
                        System.out.print(" Sun Mon Tue Wed Thu Fri Sat  ");
                    }
                    System.out.println();
                    for(int i=0;i<ctlofMaxHeight[roe];i++){
                        for(col=0;col<3;col++){
                            nmonth=roe*3+col;
                            for(week=0;week<7;week++){
                                if(aOutputControl[nmonth]<=0||aOutputControl[nmonth]>daysOfMonth[nmonth])
                                    System.out.printf("%4c",' ');
                                else
                                    System.out.printf("%4d",aOutputControl [nmonth]);
                                aOutputControl[nmonth]++;
                            }
                            System.out.print("  ");
                        }
                        System.out.println();
                    }
                }
            }
            public static int getStartDay(int year, int month) {
                final int START_DAY_FOR_JAN_1_1800 = 3;
                int totalNumberOfDays = getTotalNumberOfDays(year, month);
                return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
            }
            public static int getTotalNumberOfDays(int year, int month) {
                int total = 0;
                for (int i = 1800; i < year; i++)
                    if (isLeapYear(i))
                        total = total + 366;
                    else
                        total = total + 365;
                for (int i = 1; i < month; i++)
                    total = total + getNumberOfDaysInMonth(year, i);
                return total;
            }
            public static int getNumberOfDaysInMonth(int year, int month) {
                if (month == 1 || month == 3 || month == 5 || month == 7 ||
                        month == 8 || month == 10 || month == 12)
                    return 31;
                if (month == 4 || month == 6 || month == 9 || month == 11)
                    return 30;
                if (month == 2) return isLeapYear(year) ? 29 : 28;
                return 0;
            }
            public static boolean isLeapYear(int year) {
                return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
            }
        }
        class Test {
            public static void main(String args[]){
                Scanner input = new Scanner(System.in);
                System.out.print("请输入查询的年份:\n");
                int year = input.nextInt();
                MyCalendar objCalendar;
                objCalendar=new MyCalendar();
                objCalendar.prtCalendar(year);
            }
        }

输出:
在这里插入图片描述


3. 打印九九乘法表

package struct;

public class ForDemo01 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j =1;j<=i;j++){
                System.out.print(j+"*"+i+"="+(j*i)+"\t");
            }
            System.out.println();
        }
    }
}

输出
在这里插入图片描述


4. static,System的理解

在这里插入图片描述

  1. 内部类对象通过外部类的实例对象调用其内部类构造方法产生
public class Test {
    class Pri{
        void fPrint(){
            System.out.println("Hello,world");
        }

    }
    public static void main(String[] args) {
        System.out.println("Say What?");
        Pri pri = new Test().new Pri();
        pri.fPrint();
    }
}

运行结果:
result

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。

  1. main()方法中调用另一类的static方法
public class Test {

    public static void main(String[] args) {
        System.out.println("Say What?");
        Pri pri = new Pri();
        pri.fPrint();
    }
}
class Pri{
    public static void fPrint(){
        System.out.println("Hello,world");
    }

}
  1. System在lang包,java.lang包是提供利用java编程语言进行程序设计的基础类,在项目中使用的时候不需要import。
    图源该博客
    在这里插入图片描述>包package就是文件夹的作用
    在这里插入图片描述

5. Fan风扇

题目描述:9.8(Fan类)设计一个名为 Fan 的类来表示一个风扇。这个类包括:
三个名为 SLOW、MEDIUM 和 FAST 而值为 1、2 和 3 的常量,表示风扇的速度。
一个名为 speed 的 int 类型私有数据域,表示风扇的速度(默认值为 SLOW)。
一个名为 on 的 boolean 类型私有数据域,表示风扇是否打开(默认值为 false)。
一个名为 radius 的double 类型私有数据域,表示风扇的半径(默认值为 5)。
一个名为 color 的 String 类型数据域,表示风扇的颜色(默认值为 blue)。
这四个数据域的访问器和修改器。
一个创建默认风扇的无参构造方法。
一个名为 toString() 的方法返回描述风扇的字符串。如果风扇是打开的,那么该方法在一个组合的字符串中返回风扇的速度、颜色和半径。如果风扇没有打开,该方法就返回一个由 “fan is off” 和风扇颜色及半径组合的字符串。
画出该类的UML图并实现这个类。编写一个测试程序,创建两个 Fan 对象。将第一个对象设置为最大速度、半径为 10、颜色为 yellow 、状态为打开。将第二个对象设置为中等速度、半径为 5、颜色为 blue 、状态为关闭。通过调用它们的 toString 方法显示这些对象。

public class Fan {
    //main方法
    public static void main(String[] args) {
        Fan fan1 = new Fan();
        Fan fan2 = new Fan();
        fan1.setSpeed(FAST);
        fan1.setRadius(10);
        fan1.setColor("yellow");
        fan1.setOn(true);
        //第二个风扇只有速度需要调整,其他为默认值
        fan2.setSpeed(MEDIUM);
        System.out.println("fan1: " + fan1.toString());
        System.out.println("fan2: " + fan2.toString());
    }
    //常量与默认值
    final static int SLOW = 1,MEDIUM = 2,FAST = 3;
    private int speed = SLOW;
    private boolean on = false;
    private double radius = 5;
    private String color = "blue";
    //访问器get与修改器set
    public int getSpeed(){
        return speed;
    }
    public int setSpeed(int newspeed){
        this.speed = newspeed;
        return speed;
    }
    public boolean getOn(){
        return on;
    }
    public boolean setOn(boolean newon){
        this.on = newon;
        return on;
    }
    private double getRadius(){
        return radius;
    }
    private double setRadius(double newradius){
        this.radius = newradius;
        return radius;
    }
    private String getColor(){
        return color;
    }
    private String setColor(String newcolor){
        this.color = newcolor;
        return color;
    }
    //无参构造方法
    public Fan() {
        getSpeed();
        getColor();
        getRadius();
        getOn();
    }
    public String toString(){
        String str = "";//str必须要手动赋初值
        if (getOn())
        {
            str = "风速:" + getSpeed() +" 颜色:"+ getColor() + " 半径:" + getRadius();
        }
        else {
            str = "fan is off " +" 颜色:"+ getColor() +" 半径:" + getRadius();
        }
        return str;
    }
}

运行结果:
运行结果9.8


6. Queue类

题目描述:10.6节给出了一个Stack类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素以“后进先出”的方式获取。在队列中,元素以“先进先出”的方式 获取。该类包含:
一个名为element的int[]类型的数据域,保存队列中的int值。
一个名为size的数据域,保存队列中的元素个数。
一个构造方法,以默认容量为8来创建一个Queue对象。
方法enqueue(int v),用于将v加入队列中。
方法dequeue(),用于从队列中移除元素并返回该元素。
方法empty(),如果队列为空,该方法返回true。
方法getSize(),返回队列的大小。
画出该类的UML图并实现这个类,初始数组的大小为8.一旦元素个数超过了数组大小,数组大小将会翻倍。如果一个元素从数组的开始部分移除,你需要将数组中的所有元素往左边移动一个位置。编写一个测试程序,添加1到20的20个数字到队列中,然后将这些数字移除并显示它们。

课上有点赶,下标的处理不是很正确,现在按照书上10-8的Stack来写一下,英文注释是因为避免因为中文注释编译错误

public class Test {
    public static void main(String[] args) {
        Queue que = new Queue();
        for(int s = 1;s <= 20;s++){
            que.enqueue(s);
        }
        while (!que.empty()){
            System.out.print(que.dequeue()+" ");
        }
        System.out.println("队列为空");
    }
}
class Queue{
    private int[] elements;
    private int size;
    public static final int DEFAULT_CAPACITY = 8;

    /**construct an queue with the default capacity 8*/
    public Queue(){
        this(DEFAULT_CAPACITY);
    }
    /**Generally, constructors with no or few parameters can call constructors with more parameters with this (Arg list)*/

    /**construct an queue with the specified capacity*/
    public Queue(int capacity){
        elements = new int[capacity];
    }
    public void enqueue(int v){
        if(size >= elements.length){
            int[] temp = new int[elements.length*2];
            System.arraycopy(elements,0,temp,0,elements.length);
            elements = temp;
        }
        elements[size] = v;
        size++;
    }

    /**Removes an element from the queue and returns it*/
    public int dequeue(){
        int key = elements[0];
        for(int i = 0;i < size;i++){
            elements[i] = elements[i+1];  /**Queue first in first out*/
        }
        size--;
        return key;
    }

    public boolean empty(){
        return size == 0;
    }
    public int getSize(){
        return size;
    }
}

运行结果;
result7


7. Person、Student、Employee、Faculty和Staff类

题目描述:(Person、Student、Employee、Faculty和Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类。Employee类又有子类:教员类Faculty和职员类Staff。每个人都有姓名、地址、电话号码和电子邮件地址。学生有班级状态(大一、大二、大三或大四)。将这些状态定义为常量。一个雇员涉及办公室、工资和受聘日期。使用编程练习题10.14中定义的MyDate类为受聘日期创建一个对象。教员有办公时间和级别。职员有头衔。重写每个类中的toString方法,显示相应的类名和人名。
画出这些类的UML图并实现这些类。编写一个测试程序,创建Person、Studet、Employee、Faculty和Staff,并且调用他们的toString方法。

知识点:继承

import java.util.Date;

public class Test {
        public static void main(String[] args) {

            Person per1 = new Person("张三","初阳","10082314","123@qq.com");
            System.out.println(per1.toString());
            Student stu1 = new Student("李四","杏园","68761313","6865@163.com",Student.FRESHMAN);
            System.out.println(stu1.toString());
            Employee emp1 = new Employee("oiu","初阳","10082314","123@qq.com","21-202",2000,new Date());
            System.out.println(emp1.toString());
            Faculty fac1 = new Faculty("qwe","afga","577545","56456@34.com","22-101",5000,new Date(),new Date(),"jiaoshou");
            System.out.println(fac1.toString());
            Staff sta1 = new Staff("as","eqr","822496","5845@66","22-209",2360,new Date(),"nb");
            System.out.println(sta1.toString());
        }
    }

    class Person{
        private String name;
        private String address;
        private String phoneNumber;
        private String email;

        public Person(){

        }
        public Person(String name,String address,String phoneNumber,String email){
            this.name = name;
            this.address = address;
            this.phoneNumber = phoneNumber;
            this.email = email;
        }

        public String getName() {
            return name;
        }

        public String toString(){
            return ("Person:"+getName());
        }
    }
    class Student extends Person{
        final static int FRESHMAN = 1;
        final static int SOPHOMORE = 2;
        final static int JUNIOR = 3;
        final static int SENIOR = 4;
        private int grade;
        public Student(String name,String address,String phoneNumber,String email,int grade){
        /**子类在构造方法中使用super关键字调用父类的构造方法,且在第一行*/
            super(name, address, phoneNumber, email);
            this.grade = grade;
        }
        @Override
        public String toString(){
            return ("Student:"+this.getName());
        }

    }
    class Employee extends Person{
        private String office;
        private double salary;
        private Date date;
        public Employee(){

        }
        public Employee(String name, String address, String phoneNumber, String email, String office, double salary, Date date){
            super(name, address, phoneNumber, email);
            this.office = office;
            this.salary = salary;
            this.date = date;
        }
        @Override
        public String toString(){
            return ("Employee:"+this.getName());
        }
    }

 class Faculty extends Employee{
    private Date workTime;
    private String rank;
    public Faculty(String name, String address, String phoneNumber, String email, String office, double salary, Date date,Date workTime,String rank){
        super(name, address, phoneNumber, email, office, salary, date);
        this.workTime = workTime;
        this.rank = rank;
    }
    @Override
     public String toString(){
        return ("Faculty:"+this.getName());
    }

 }
 class Staff extends Employee{
    private String title;
    public Staff(String name, String address, String phoneNumber, String email, String office, double salary, Date date,String title){
        super(name, address, phoneNumber, email, office, salary, date);
        this.title = title;
    }
    @Override
     public String toString(){
        return ("Staff:"+this.getName());
    }
 }

运行结果:
在这里插入图片描述


8. ArrayList的最大元素

11.4(ArrayList的最大元素)编写以下方法,返回一个整数ArrayList的最大值。如果列表为null或者列表的大小为0,则方法返回null值。
public static Integer max(ArrayList list)
编写一个测试程序,提示用户输入一个以0结尾的数值序列,调用该方法返回输入的最大数值。

题目理解上,空则返回null值,但是0为序列的结尾,那么如果max返回值为零的话就说明是null。

package Chap11;

import java.util.ArrayList;
import java.util.Scanner;

public class Four {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Scanner input = new Scanner(System.in);
        System.out.print("请输入一个以0结尾的数值序列:");
        int num = input.nextInt();
        while (num != 0){
            list.add(num);
            /**下一个数字*/
            num = input.nextInt();
        }
        int ret = max(list);
        if (ret == 0)
            System.out.println("NULL");
        else System.out.println("最大值为"+ret);
    }
    public static Integer max(ArrayList<Integer> list){
        if(list.size()==0 || list==null)return 0;
        int max = 0;
        for(int i=0;i<list.size();i++){
            if(list.get(i)>max)max=list.get(i);
        }
        return max;
    }
}

运行结果:
result114


9. 合并两个列表

题目描述:使用下面的方法头编写一个方法,返回两个数组列表的并集。
public static ArrayList union(ArrayList list1,ArrayList list2)

输出格式没有完全按要求,加一个循环使其逐个输出数组中的数然后以空格隔开就行。

package Chap11;

import java.util.ArrayList;
import java.util.Scanner;

public class ThiFour {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        Scanner input = new Scanner(System.in);
        System.out.print("Enter five integers for list1: ");
        int num = input.nextInt();
        for (int i = 0;i < 5;i++){
            list1.add(num);
            if(i != 4){
                num = input.nextInt();
            }
        }
        /**System.out.println(list1);*/
        System.out.print("Enter five integers for list2: ");
        int nu = input.nextInt();
        for (int i = 0;i < 5;i++){
            list2.add(nu);
            if(i != 4){
                nu = input.nextInt();
            }
        }
        /**System.out.println(list2);*/
        System.out.println("The combined list is "+union(list1,list2));
    }
    public static ArrayList<Integer> union(ArrayList<Integer> list1,ArrayList<Integer> list2){
        ArrayList<Integer> unlit = new ArrayList<>();
        for(int i = 0;i < 5;i++)
        {
            unlit.add(list1.get(i));
        }
        for(int j = 0;j < 5;j++)
        {
            unlit.add(list2.get(j));
        }
        return unlit;
    }
}

运行结果:
result1114

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ca1m4n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值