天天看点

JAVA模拟题编程大题解析JAVA模拟题编程大题解析

目录

JAVA模拟题编程大题解析

第一道大题

第二道大题

第三道大题

第四道大题

第五道大题

JAVA模拟题编程大题解析

第一道大题

利用图形界面做一个计算素数的功能,类名为MyFrame。具体要求如下:
界面至少具有一文本输入框(JTextField),用于输入一个数字。
界面有一个按钮(JButton),用于计算输入数字以内的所有素数。
界面具有一个文本区(JTextArea),用于显示计算出来的所有素数。
在main函数中,创建MyFrame的对象frame,设置frame的大小为600X400,显示出frame。
​
本题主要考察图形界面中的流式布局,ActionListener监听器,以及Swinng中的几个基本组件,还有如何计算素数,list集合基本内容.版本程序不熟练的同学可以复习以上内容
           
  • 代码
    package programming;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    ​
    public class MyFrameTest {
        public static void main(String[] args) {
            MyFrame myFrame=new MyFrame();
            myFrame.setVisible(true);
        }
    }
    //新建一个MyFrame类来继承JFrame类
    class MyFrame extends JFrame {
        private static final int DEFAULT_WIDTH = 600;//设置一个常量来表示窗体高度
        private static final int DEFAULT_HEIGHT = 400;//设置一个常量来表示窗体宽度
        //也可以不用设置常量,直接在setSize()方法中输入高度和宽度
        private JPanel panel;//panel是面板
        private JTextField input;//一文本输入框(JTextField),用于输入一个数字。
        private JButton button;//一个按钮,作用是计算输入数字以内的所有素数
        private JTextArea result;//一个文本区(JTextArea),显示计算出来的素数
        public MyFrame() {//窗体的构造方法。
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//setSize()方法设置窗体的高度和宽度
            setVisible(true);//setVisible()方法设置窗体是否可见
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置用户在此窗体上发起close时默认执行的操作,这里EXIT_ON_CLOSE表示隐藏并释放该窗体的资源。
            panel = new JPanel();//创建一个JPanel对象,来放组件
            add(panel);//将面板panel加入窗体中。
    ​
            input = new JTextField(10);//创建一个JTextField对象,列数为10,来输入数字
            panel.add(input);//将文本输入框放入面板中
    ​
            button = new JButton("计算");//创建一个按钮,内容为计算
            //下面就要在按钮中实现计算素数这个功能,通过ActionListener监听器来实现
            button.addActionListener(new ActionListener() {//对按钮实现监听功能
                @Override
                public void actionPerformed(ActionEvent e) {
                    String snumber = input.getText();//输入一个数字,但形式为字符串形式
                    int n = Integer.parseInt(snumber);//将字符串形式的数字转化为整数形式
                    int count = 0;
                    List list = new ArrayList();//用list集合来存计算出来的素数
                    for (int i = 2; i <= n; i++) {
                        boolean flag = true;// 默认一开始都是素数
                        for (int j = 2; j <= Math.sqrt(i); j++) {// 除了1和本身外如果还能被除就说明不是素数
                            if (i % j == 0) {
                                flag = false;//说明该数不是素数
                            }
                        }
                        if (flag) {//flag为true说明该数为素数
                            list.add(i);//将数加到集合中去
                        }
                    }
                    result.setText(list.toString());//输入10,显示:[2,3,5,7]
                }
            });
            panel.add(button);//将按钮加到面板中
            result = new JTextArea(1, 10);
            panel.add(result);
        }
    }
               

第二道大题

  • 利用InputStreamReader从键盘读入一批字符,并保存到一个字符数组中cbuf中,然后将这个字符数组转变成一个字符串,并输出该字符串。最后利用Character类的方法来判断数组cbuf中的每一个字符是数字还是字符或者是其他特殊字符,并输出判断的结果。
    解析:使用InputStreamReader.read(cbuf);Character类的相关方法
    ​
    本题主要考察了InputStreamReader转换流的内容,在课本157页,Character类的相关方法在课本12页
               
  • 代码:
    package programming;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class InputStreamReaderTest {
        public static void main(String[] args) throws IOException {
            test2();
        }
        public static void test2() throws IOException {//read()和close()方法会抛出异常
            char[] cbuf = new char[1024];//设置一个字符数组,将字符流中的字符读入该数组中
            InputStreamReader reader = new InputStreamReader(System.in);//将输入的一行字符和数字序列转化为字符流对象。
            System.out.println("请使用键盘输入一行字符和数字序列:");
            int count = reader.read(cbuf);//将字符流中的字符读入字符数组cbuf中,会抛出异常IOException
            reader.close();//关闭该流,释放与之关联的所有资源
            for (int i = 0; i < count-1; i++) {//这里count-1的原因是count最小值为1,而数组下标是从开始的
                if (Character.isDigit(cbuf[i])) {//isDigit()方法判断cbuf[i]是不是数字
                    System.out.println(cbuf[i] + "是数字");
                } else if (Character.isLetter(cbuf[i])) {//isDigit()方法判断cbuf[i]是不是字符
                    System.out.println(cbuf[i] + "是字符");
                } else {
                    System.out.println(cbuf[i] + "是其他特殊字符");
                }
            }
        }
    }
               

第三道大题

  • 编写一个EmployeeManage类,具有一个Map类型的成员变量mapEmployee,其中的关键字(key)表示员工编号,值(value)表示员工工资。请完成以下功能:
    (1)在无参数的构造方法中,将mapEmployee实例化为HashMap;
    (2)编写public  void addEmployee(String employeeID,float wage)方法,用于将员工的编号和工资保存到mapEmployee中。
    (3)编写public float sumWage()方法,用于计算mapEmployee中所有员工的工资总额。
    (4)编写main方法,在main方法中创建EmployeeManage类的对象employeeManage,然后从键盘读入3个员工的员工编号和工资,并调用employeeManage的addEmployee方法将读入的数据存入mapEmployee中。然后调用employeeManage的sumWage方法计算出所有员工的工资总额,并输出到显示器上。最后利用ObjectOutputStream类将employeeManage保存到文件d:\myemployee.txt中
    ​
    ​
    本题主要考察Map、HashMap的使用和遍历,ObjectOutputStream类,本程序不熟练的同学可复习以上内容。
               
  • 代码
    package programming;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    public class EmployeeManage implements Serializable {
        private Map mapEmployee;//一个Map类型的成员变量mapEmployee
        
        
        public EmployeeManage() {
            mapEmployee = new HashMap();//在无参数的构造方法中,将mapEmployee实例化为HashMap
        }
        
        
        public void addEmployee(String employeeID, float wage) {//用于将员工的编号和工资保存到mapEmployee中
            mapEmployee.put(employeeID, wage);
        }
        
        
        
        public float sumWage() {//用于计算mapEmployee中所有员工的工资总额
            float sum = 0.0f;
            Collection values = mapEmployee.values();//将mapEmployee中的wage放入集合values中
            for (Float f : values) {//遍历values集合中的wage
                sum += f;//将values集合中的wage相加
            }
            return sum;
        }
        
        //主程序中
        public static void main(String[] args) {
            EmployeeManage employeeManage = new EmployeeManage();//创建EmployeeManage类的对象employeeManage
            Scanner sc = new Scanner(System.in);
            for (int i =0; i < 3; i++) {//从键盘读入3个员工的员工编号和工资
                System.out.println("请输入第" + (i + 1) + "个员工的编号:");
                String employeeID = sc.next();
                System.out.println("请输入第" + (i + 1) + "个员工的工资:");
                float wage = sc.nextFloat();
                employeeManage.addEmployee(employeeID, wage);//调用employeeManage的addEmployee方法将读入的数据存入mapEmployee
            }
            sc.close();
            System.out.println(employeeManage.sumWage());//调用employeeManage的sumWage方法计算出所有员工的工资总额,并在显示器上显示
            try {//利用ObjectOutputStream类将employeeManage保存到文件d:\myemployee.txt中
                ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d:\\myemployee.txt"));
                os.writeObject(employeeManage);
            } catch (IOException e) {
                return;
            }
        }
    }
               

第四道大题

  • 从键盘读入20个数字,计算读入的这20个数字的和,并输出,然后基于字节流,将这20个数字写入到文件d:\my.txt文件中,并用字节流读出d:\my.txt文件中的数据并输出到显示器。
    本题主要考察Scanner读入键盘数据;FileOutputStream实现将读入的数据写入文件;FileInputStream读取文件中的数据,本程序不熟练的同学可复习以上内容。
               
  • 代码
    package programming;
    ​
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Scanner;
    ​
    public class TestInput {
    ​
        public static void main(String[] args) {
            int[] iArray = new int[20];//存取从键盘读入的数字
            byte[] b = new byte[1024];//用于存取字节流中的字节
            int sum = 0, count = 0;
            Scanner sc = new Scanner(System.in);
            for (int i = 0; i < 20; i++) {//计算读入的这20个数字的和
                iArray[i] = sc.nextInt();
                sum = sum + iArray[i];
            }
            sc.close();
            System.out.println("sum=" + sum);
            FileOutputStream fout = null;//文件字节输入流
            FileInputStream fin = null;//文件字节输出流
            try {
                //实现将读入的数据写入文件
                fout = new FileOutputStream("d:\\my.txt");
                for (int i = 0; i < 20; i++) {//将读入的数字写入文件d:\\my.txt中
                    fout.write((String.valueOf(iArray[i])).getBytes());//valueOf()方法将数字转化为字符串,getBytes()方法用于获取iArray[i]的字节数
                }
                fout.close();
                
                
                //实现读取文件中的数据并输出到显示器上
                fin = new FileInputStream("d:\\my.txt");
                while ((count = fin.read(b)) != -1) {// fin.read(b)表示将输入流中的字节数据存到b数组中,此处不用while循环也可以实现预定效果,但read()返回的最大数据是int,如果输入流中的数据一旦过大,超过int范围,不写(count = fin.read(b)) != -1判断语句来判断是否读到文件尾,很容易造成文件内容遗漏
                    System.out.println(new String(b, 0, count));//打印
                }
                fin.close();
    ​
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {//关闭流的基本格式,背过,多敲几遍即可
                if (fout != null) {
                    try {
                        fout.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (fin != null) {
                    try {
                        fin.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
               

第五道大题

  • (1)编写一个工人Worker类,具有name(名字,String型)、birthday(生日,Date型)、wage(工资,float型)属性,都是私有属性;
    编写带有3个参数的构造方法和无参数的构造方法;
    编写3个属性对应的get和set方法;
    编写print方法,输出自己的name 、birthday和wage属性值;(注意输出birthday时要使用SimpleDateFormat类的format方法将birthday格式化为yyyy-mm-dd的格式)
    (2)编写一个WorkerManage类,在该类中编写一个方法public float getAverageWage(List集合对象list中。(注意读入的日期数据一般是字符串类型,需要用SimpleDateFormat类的parse方法转化为Date类型)
    创建一个新的Worker对象workerTemp,workerTemp的属性数据为:(name:张三,birthday:1996-8-22,wage:3000),将list集合中索引为2的元素替换为workerTemp。
    将list集合中的元素倒序排列(提示使用Collections.reverse方法)。
    循环遍历list,并输出list中每个元素的name、birthday和wage(可以调用每个Worker对象的print方法,也可以分别输出对象的这三个属性值)。
    调用getAverageWage方法来计算该list集合中所有工人的平均工资,并输出平均工资。
        
    本题考察了get、set方法的编写、构造方法的编写、SimpleDateFormat类(稍微了解即可)、list集合的遍历使用、Collections类相关的方法使用,SimpleDateFormat类。
               
  • 代码
    package programming;
    ​
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Scanner;
    ​
    public class WorkerManage {
        public float getAverageWage(List list) {//该方法的作用是计算list集合中所有工人的平均工资
            float averageWage = 0, sumWage = 0;//averageWage之平均工资,sumWage指总工资
            for (int i = 0; i < list.size(); i++)
                sumWage = sumWage + list.get(i).getWage();
            averageWage = sumWage / list.size();
            return averageWage;
        }
    ​
        public static void main(String[] args) throws ParseException {
            List list = new ArrayList();//List集合对象list
            //用循环语句从键盘读入5个工人的姓名、生日和工资数据,生成5个Worker对象,并把这5个对象保存到一个List集合对象list中
            Scanner sc = new Scanner(System.in);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
            for (int i = 0; i < 3; i++) {
                String name = sc.next();//读入姓名
                String birthday = sc.next();//读入生日
                float wage = sc.nextFloat();//读入工资数据
                list.add(new Worker(name, format.parse(birthday), wage));//把对象保存到List集合对象list中
            }
            sc.close();
            
            
            Worker workerTemp = new Worker("张三", format.parse("1996-8-22"), 3000);//创建一个新的Worker对象workerTemp
            list.set(2, workerTemp);//将list集合中索引为2的元素替换为workerTemp
            Collections.reverse(list);//将list集合中的元素倒序排列
            for (int i = 0; i < list.size(); i++)//循环遍历list,并输出list中每个元素的name、birthday和wage,利用之前写过的print方法
                list.get(i).print();
            
            
            //调用getAverageWage方法来计算该list集合中所有工人的平均工资,并输出平均工资
            WorkerManage workerManage = new WorkerManage();
            float averageWage = workerManage.getAverageWage(list);
            System.out.println("averageWage=" + averageWage);
    ​
        }
    ​
    }
    ​
    class Worker {//编写一个工人Worker类,具有name(名字,String型)、birthday(生日,Date型)、wage(工资,float型)属性,都是私有属性
        private String name;
        private Date birthday;
        private float wage;
    //编写3个属性对应的get和set方法;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public float getWage() {
            return wage;
        }
        public void setWage(float wage) {
            this.wage = wage;
        }
    ​
        
        //编写带有3个参数的构造方法和无参数的构造方法
        public Worker(String name, Date birthday, float wage) {
            this.name = name;
            this.birthday = birthday;
            this.wage = wage;
        }
        public Worker() {
            this.name =" ";
            this.birthday = null;
            this.wage = 0;
        }
        
        //编写print方法,输出自己的name 、birthday和wage属性值;(注意输出birthday时要使用SimpleDateFormat类的format方法将birthday格式化为yyyy-mm-dd的格式)
        public void print() {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
            System.out.println("name:" + name + "  birthday:" + format.format(birthday) + "  wage:" + wage);
        }
    }