天天看點

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);
        }
    }