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