1. 程式人生 > >201771010135 楊蓉慶《面對物件程式設計(java)》第十八週學習總結

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();
        
if(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); } }
WinCenter
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這門課有了瞭解和掌握,希望以後也可以去自己學習這方面的知識,不要丟了忘了。最後,再次感謝我們的老師!(送花^-^)