201771010135 楊蓉慶《面對物件程式設計(java)》第十八週學習總結
1、實驗目的與要求
(1) 綜合掌握java基本程式結構;
(2) 綜合掌握java面向物件程式設計特點;
(3) 綜合掌握java GUI 程式設計結構;
(4) 綜合掌握java多執行緒程式設計模型;
(5) 綜合程式設計練習。
2、實驗內容和步驟
任務1:填寫課程課後調查問卷,網址:https://www.wjx.cn/jq/33108969.aspx。
任務2:綜合程式設計練習
練習1:設計一個使用者資訊採集程式,要求如下:
(1) 使用者資訊輸入介面如下圖所示:
1)使用者點選提交按鈕時,使用者輸入資訊顯示控制檯介面;
(2)使用者點選重置按鈕後,清空使用者已輸入資訊;
(3)點選視窗關閉,程式退出。
import java.awt.EventQueue; import javax.swing.JFrame; public class Main { public static void main(String[] args) { EventQueue.invokeLater(() -> { DemoJFrame page = new DemoJFrame(); }); } }Main
import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Window; public class WinCenter { public static void center(Window win){ Toolkit tkit = Toolkit.getDefaultToolkit(); Dimension sSize = tkit.getScreenSize(); Dimension wSize = win.getSize();WinCenterif(wSize.height > sSize.height){ wSize.height = sSize.height; } if(wSize.width > sSize.width){ wSize.width = sSize.width; } win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2); } }
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class DemoJFrame extends JFrame { public DemoJFrame() { JPanel panel1 = new JPanel(); panel1.setPreferredSize(new Dimension(700, 45)); panel1.setLayout(new GridLayout(1, 4)); JLabel label1 = new JLabel("Name:"); JTextField j1 = new JTextField(""); JLabel label2 = new JLabel("Qualification:"); JComboBox<Object> j2 = new JComboBox<>(); j2.addItem("chuzhong"); j2.addItem("gaozhong"); j2.addItem("undergraduate"); panel1.add(label1); panel1.add(j1); panel1.add(label2); panel1.add(j2); JPanel panel2 = new JPanel(); panel2.setPreferredSize(new Dimension(700, 65)); panel2.setLayout(new GridLayout(1, 4)); JLabel label3 = new JLabel("Address:"); JTextArea j3 = new JTextArea(); JLabel label4 = new JLabel("Hobby:"); JPanel p = new JPanel(); p.setLayout(new GridLayout(3, 1)); p.setBorder(BorderFactory.createLineBorder(null)); JCheckBox c1 = new JCheckBox("Reading"); JCheckBox c2 = new JCheckBox("Singing"); JCheckBox c3 = new JCheckBox("Dancing"); p.add(c1); p.add(c2); p.add(c3); panel2.add(label3); panel2.add(j3); panel2.add(label4); panel2.add(p); JPanel panel3 = new JPanel(); panel3.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout1 = new FlowLayout(FlowLayout.LEFT, 70, 40); panel3.setLayout(flowLayout1); JLabel label5 = new JLabel("Sex:"); JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(2,1)); p1.setBorder(BorderFactory.createLineBorder(null)); ButtonGroup bu = new ButtonGroup(); JRadioButton jr1 = new JRadioButton("Male"); JRadioButton jr2 = new JRadioButton("Female"); bu.add(jr1); bu.add(jr2); p1.add(jr1); p1.add(jr2); panel3.add(label5); panel3.add(p1); add(panel1); add(panel2); add(panel3); JPanel panel4 = new JPanel(); panel4.setPreferredSize(new Dimension(700, 150)); JButton b1 = new JButton("Validate"); panel4.add(b1); JButton b2 = new JButton("Reset"); panel4.add(b2); add(panel4); FlowLayout flowLayout = new FlowLayout(); this.setLayout(flowLayout); this.setTitle("Students Detail"); this.setBounds(300, 300, 800, 400); this.setVisible(true); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 String xueli = j2.getSelectedItem().toString(); System.out.println("Name:" + j1.getText()); System.out.println("Qualification:" + xueli); String hobbystring = "Hobby:"; if (c1.isSelected()) { hobbystring += "Reading"; } if (c2.isSelected()) { hobbystring += "Singing"; } if (c3.isSelected()) { hobbystring += "Dancing"; } System.out.println("Address:" + j3.getText()); if (jr1.isSelected()) { System.out.println("Sex:Male"); } if (jr2.isSelected()) { System.out.println("Sex:Female"); } System.out.println(hobbystring); } }); b2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 j1.setText(null); j3.setText(null); j2.setSelectedIndex(0); c1.setSelected(false); c2.setSelected(false); c3.setSelected(false); bu.clearSelection(); } }); } public static void main(String args[]) { new DemoJFrame(); } }DemoJFrame
結果如下:
練習2:採用GUI介面設計以下程式:
l 編制一個程式,將身份證號.txt 中的資訊讀入到記憶體中;
l 按姓名字典序輸出人員資訊;
l 查詢最大年齡的人員資訊;
l 查詢最小年齡人員資訊;
l 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l 查詢人員中是否有你的同鄉。
l 輸入身份證資訊,查詢所提供身份證號的人員資訊,要求輸入一個身份證數字時,查詢介面就顯示滿足查詢條件的查詢結果,且隨著輸入的數字的增多,查詢匹配的範圍逐漸縮小。
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main{ private static ArrayList<Student> studentlist; public static void main(String[] args) { studentlist = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("D:\\text"); try { FileInputStream fis = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(fis)); String temp = null; while ((temp = in.readLine()) != null) { Scanner linescanner = new Scanner(temp); linescanner.useDelimiter(" "); String name = linescanner.next(); String number = linescanner.next(); String sex = linescanner.next(); String age = linescanner.next(); String province =linescanner.nextLine(); Student student = new Student(); student.setName(name); student.setnumber(number); student.setsex(sex); int a = Integer.parseInt(age); student.setage(a); student.setprovince(province); studentlist.add(student); } } catch (FileNotFoundException e) { System.out.println("學生資訊檔案找不到"); e.printStackTrace(); } catch (IOException e) { System.out.println("學生資訊檔案讀取錯誤"); e.printStackTrace(); } boolean isTrue = true; while (isTrue) { System.out.println("選擇你的操作,輸入正確格式的選項"); System.out.println("A.字典排序"); System.out.println("B.輸出年齡最大和年齡最小的人"); System.out.println("C.尋找老鄉"); System.out.println("D.尋找年齡相近的人"); System.out.println("F.退出"); String m = scanner.next(); switch (m) { case "A": Collections.sort(studentlist); System.out.println(studentlist.toString()); break; case "B": int max=0,min=100; int j,k1 = 0,k2=0; for(int i=1;i<studentlist.size();i++) { j=studentlist.get(i).getage(); if(j>max) { max=j; k1=i; } if(j<min) { min=j; k2=i; } } System.out.println("年齡最大:"+studentlist.get(k1)); System.out.println("年齡最小:"+studentlist.get(k2)); break; case "C": System.out.println("老家?"); String find = scanner.next(); String place=find.substring(0,3); for (int i = 0; i <studentlist.size(); i++) { if(studentlist.get(i).getprovince().substring(1,4).equals(place)) System.out.println("老鄉"+studentlist.get(i)); } break; case "D": System.out.println("年齡:"); int yourage = scanner.nextInt(); int near=agenear(yourage); int value=yourage-studentlist.get(near).getage(); System.out.println(""+studentlist.get(near)); break; case "F": isTrue = false; System.out.println("退出程式!"); break; default: System.out.println("輸入有誤"); } } } public static int agenear(int age) { int j=0,min=53,value=0,k=0; for (int i = 0; i < studentlist.size(); i++) { value=studentlist.get(i).getage()-age; if(value<0) value=-value; if (value<min) { min=value; k=i; } } return k; } }main
public class Student implements Comparable<Student> { private String name; private String number ; private String sex ; private int age; private String province; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getnumber() { return number; } public void setnumber(String number) { this.number = number; } public String getsex() { return sex ; } public void setsex(String sex ) { this.sex =sex ; } public int getage() { return age; } public void setage(int age) { // int a = Integer.parseInt(age); this.age= age; } public String getprovince() { return province; } public void setprovince(String province) { this.province=province ; } public int compareTo(Student o) { return this.name.compareTo(o.getName()); } public String toString() { return name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n"; } }Student
j結果如下:
練習3:採用GUI介面設計以下程式
l 編寫一個計算器類,可以完成加、減、乘、除的操作
l 利用計算機類,設計一個小學生100以內數的四則運算練習程式,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程式檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;
l 將程式中測試練習題及學生答題結果輸出到檔案,檔名為test.txt。
package 答題; import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.Random; import javax.swing.*; public class Exam extends JFrame { JPanel p=new JPanel(); JLabel timeLabel=new JLabel(); JLabel[] label1=new JLabel[10]; JLabel[] label2=new JLabel[10]; JLabel[] label3=new JLabel[10]; JLabel[] label4=new JLabel[10]; JLabel[] label5=new JLabel[10]; JTextField[] field=new JTextField[10]; JLabel[] label6=new JLabel[10]; String[] btn_name= {"開始","重置","提交","重考"}; JButton[] btn=new JButton[4]; Panel2 panel2=null; int ExamCount=0; JLabel examLabel=new JLabel(); double[] result=new double[10]; public static void main(String[] args) { new Exam("測試").setVisible(true); } public Exam(String title) { setTitle(title); setLocationRelativeTo(null); setDefaultCloseOperation(3); setSize(400,500); setResizable(false); setForeground(Color.blue); add(new Panel1(),BorderLayout.NORTH); panel2=new Panel2(); add(new JScrollPane(panel2)); add(new Panel3(),BorderLayout.WEST); } int rightResultCount=0; public void startExam() { int num1=0; int num2=0; String[] quots= {"+","-","*","/"}; String quot=null; Random ran=null; ran=new Random(System.currentTimeMillis()); Box box=Box.createVerticalBox(); for(int i=0;i<10;i++) { num1=ran.nextInt(100)+1; num2=ran.nextInt(100)+1; int n=ran.nextInt(4); quot=new String(quots[n]); switch(quot) { case "+": result[i]=num1+num2; break; case "-": result[i]=num1-num2; break; case "*": result[i]=num1*num2; break; case "/": result[i]=num1/(num2*1.0); result[i]=Math.round(result[i]*100)/100.0; break; } label1[i]=new JLabel("第"+(i+1)+"題:"); label2[i]=new JLabel(num1+""); label3[i]=new JLabel(quot); label4[i]=new JLabel(num2+""); label5[i]=new JLabel("="); field[i]=new JTextField(); field[i].setPreferredSize(new Dimension(60,20)); field[i].addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent ee) { if((ee.getKeyChar()>'9' || ee.getKeyChar()<'0') && ee.getKeyChar()!=45 && ee.getKeyChar()!='.') { ee.consume(); } } }); label6[i]=new JLabel(""); Box hbox=Box.createHorizontalBox(); hbox.add(label1[i]); hbox.add(Box.createHorizontalStrut(20)); hbox.add(label2[i]); hbox.add(Box.createHorizontalStrut(5)); hbox.add(label3[i]); hbox.add(Box.createHorizontalStrut(5)); hbox.add(label4[i]); hbox.add(Box.createHorizontalStrut(5)); hbox.add(label5[i]); hbox.add(Box.createHorizontalStrut(5)); hbox.add(field[i]); hbox.add(Box.createHorizontalStrut(20)); hbox.add(label6[i]); box.add(hbox); box.add(Box.createVerticalStrut(20)); } panel2.add(box); panel2.validate(); } int submitCount=0; class Listener implements ActionListener{ public void actionPerformed(ActionEvent e) { JButton button=(JButton)e.getSource(); if(button==btn[0]) { startExam(); ExamCount++; btn[0].setEnabled(false); for(int i=1;i<4;i++) { btn[i].setEnabled(true); } } if(button==btn[1]) { for(int i=0;i<10;i++) { field[i].setText(""); } } if(button==btn[2] ) { rightResultCount=0; btn[2].setEnabled(false); double yourResult=0; for(int i=0;i<10;i++) { try { yourResult=Double.parseDouble(field[i].getText().trim()); }catch(Exception ee) {} if(yourResult==result[i]) { rightResultCount++; label6[i].setText("V"); label6[i].setForeground(Color.BLUE); }else { label6[i].setText("X"); label6[i].setForeground(Color.RED); } } examLabel.setText("你答對了 "+rightResultCount+ " 道題,答錯了"+(10-rightResultCount)+" 道題!"+ "考試得分是: "+rightResultCount*10+" 分!"); } if(button==btn[3]) { btn[2].setEnabled(true); panel2.removeAll(); startExam(); ExamCount++; btn[3].setEnabled(false); for(int i=0;i<10;i++) { field[i].setText(""); label6[i].setText(""); } panel2.repaint(); } if(btn[2].isEnabled()==false && btn[3].isEnabled()==false) { btn[1].setEnabled(false); } } } class Panel1 extends JPanel{ public Panel1() { setPreferredSize(new Dimension(350,120)); setLayout(new GridLayout(3,1,10,10)); JTextArea area=new JTextArea("點選“開始”開始答題,答案中有小數的,保留2位!"); area.setLineWrap(true); area.setEditable(false); add(area); add(examLabel); p.add(timeLabel); add(p); } } class Panel2 extends JPanel{ public Panel2() { setPreferredSize(new Dimension(400,600)); } } class Panel3 extends JPanel{ public Panel3() { setPreferredSize(new Dimension(50,100)); setBackground(Color.LIGHT_GRAY); for(int i=0;i<4;i++) { btn[i]=new JButton(btn_name[i]); btn[i].addActionListener(new Listener()); add(btn[i]); if(i>0) { btn[i].setEnabled(false); } } } } }Exam
任務3:本學期課程已結束,請彙總《面向物件程式設計課程學習進度條》的資料,統計個人專業能力提升的資料。並從學習內容、學習方法、學習心得幾個方面進行課程學習總結,也希望你對課程的不足提出建議和意見。
學習總結:
1、OOPS主要優點:
- 封裝:封裝提供了物件之間的一種合約,這種合約確定物件自身內部隱藏什麼,向彼此暴露什麼。在Java中,我們可以使用private訪問修飾符來隱藏方法和變數,從而制約來自外部世界的訪問。 Java也提供了不同的訪問修飾符如public(預設),protected和private,在不同的隱藏水平使用,但目標是封裝一些不需要改變的東西。按照最佳實踐 - 一個類應該只有一個理由去改變,封裝實現的“一個理由”的設計原則。
封裝意味著隱藏預期會經常改變的一些東西,以避免這種改變破壞其它類。 - 繼承:繼承的主要優點是,它提供了程式碼重用和避免重複繼承的正式機制,這也會導致緊耦合的設計,因為如果你要更改的超類,你必須知道子類的所有細節。
好處:提高了可複用性
- 建立了邏輯上的"is a"關係,如 Dog is a animal
- 模組化程式碼
- 避免重複
~多型性:多型性是一種(程式設計時)對於不同基礎形式(資料型別)呈現相同介面的能力。這意味著類有不同的功能,同時共享一個通用的介面,可以通過傳遞特定類別的參考動態呼叫。典型的例子是Shape類和所有可以繼承它(方形,圓形,十二面體,不規則的多邊形,圖示等)的類。每個類都有一個 Draw ()方法。
好處如下:
- 建立可重用的程式碼:多型性意味著一旦類被建立 實現和測試,它就能容易地被使用,而無需關注類的內部寫的是什麼
- 它提供更多泛型和鬆耦合程式碼
- 編譯時間更少,且允許更快地開發
- 動態繫結:
- 一些介面能夠使用不同實現方式建立。
- 能夠使用同樣的方法簽名完全替代實現。
- 抽象:
基類的行為(即方法)和狀態(即變數)可以在其派生子類中訪問。繼承的主要優點是,它提供了程式碼重用和避免重複繼承的正式機制,這也會導致緊耦合的設計,因為如果你要更改的超類,你必須知道子類的所有細節。
好處:
提高了可複用性
-
建立了邏輯上的"is a"關係,如 Dog is a animal
-
模組化程式碼
-
避免重複
回顧我們的學習任務條,上面的資料顯示我們每次作業程式碼的增加量和學習的進度,感覺一學期下來,且不說實實在在掌握了多少,但也下了功夫在上面,看著每週自己讀譯的程式碼漸漸變多,內心有著充實感,在複習階段也可以去翻翻以前的作業來加固知識。一學期快結束了,在老師和學長的幫助下,我們也對java這門課有了瞭解和掌握,希望以後也可以去自己學習這方面的知識,不要丟了忘了。最後,再次感謝我們的老師!(送花^-^)