冯志霞201771010107《面向对象程序设计(java)》第十八周学习总结

实验十八  总复习

实验时间 2018-12-30

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.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;



public class A extends JFrame{
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;
    private JPanel panel4;
    //private JLabel label;
    private  JComboBox jComboBox;
    private JTextField jTextField;
    private JTextArea textArea;
    private JCheckBox checkBox1;
    private JCheckBox checkBox2;
    private JCheckBox checkBox3;
    private JRadioButton radioButton1;
    private JRadioButton radioButton2;
    private JButton button1;
    private JButton button2;
    private  ButtonGroup buttonGroup;
    private Object submit;
    public A(){
        //初始化
        this.setVisible(true);
        this.setSize(800, 450);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        panel1=new JPanel();
        panel2=new JPanel();
        panel3=new JPanel();
        panel4=new JPanel();
        setPanel1(panel1);
        setPanel2(panel2);
        setPanel3(panel3);
        setPanel4(panel4);
        
        FlowLayout flowLayout = new FlowLayout();
        this.setLayout(flowLayout);
        
        
        this.add(panel1);
        this.add(panel2);
        this.add(panel3);
        this.add(panel4);
        
    }
    
    private void setPanel1(JPanel panel) {
        
        panel.setLayout(new GridLayout(1, 4));
        panel.setPreferredSize(new Dimension(700, 45));
        
        JLabel label1= new JLabel("Name:",JLabel.CENTER);
        
        jTextField = new JTextField(" ");
    
        JLabel jLabel2 = new JLabel("Qualification:",JLabel.CENTER);
        //jLabel2.setSize(80, 40);
        jComboBox=new JComboBox();
        jComboBox.addItem("本科");
        
        jComboBox.addItem("研究生");
        jComboBox.addItem("博士生");
        
        
        panel.add(label1);
        panel.add(jTextField);
        panel.add(jLabel2);
        
        panel.add(jComboBox);
        
    }
    
    

    private void submit() {
        // TODO Auto-generated method stub
        String s1=jTextField.getText().toString().trim();
        String s2=textArea.getText().toString().trim();
        String s3=jComboBox.getSelectedItem().toString().trim();
        String s4=" ";
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
         if(radioButton1.isSelected()) {
             System.out.println("boy");
             
         }
         if(radioButton2.isSelected()) {
             System.out.println("gril");
         }
        if(checkBox1.isSelected()) {
            
            s4+="Sing ";
            
        }
        if(checkBox2.isSelected()) {
            s4+="Dance ";
            
        }
         if(checkBox3.isSelected()) {
             s4+="Draw ";
            
         }
         System.out.println(s4);
        
    }

    private void setPanel3(JPanel panel) {
        // TODO Auto-generated method stub
        //String sex = new JLabel(sex, JLabel.CENTER);
    panel.setPreferredSize(new Dimension(700, 150));
        //panel.setLayout(new GridLayout(1, 2));
        JLabel sex = new JLabel("sex:", JLabel.CENTER);
        JPanel selectBox = new JPanel();
        selectBox.setPreferredSize(new Dimension(300, 100));
        FlowLayout flowLayout = new FlowLayout();
        panel.setLayout(flowLayout);
        
        selectBox.setBorder(BorderFactory.createTitledBorder(""));
        selectBox.setLayout(new GridLayout(2, 1));
     buttonGroup = new ButtonGroup();
        radioButton1=new JRadioButton("boy");
        radioButton2=new JRadioButton("gril");
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);
        selectBox.add(radioButton1);
        selectBox.add(radioButton2);
        panel.add(sex);
        panel.add(selectBox);
    
        
        
    }
    private void setPanel2(JPanel panel) {
        // TODO Auto-generated method stub
        panel.setPreferredSize(new Dimension(700, 80));
        panel.setLayout(new GridLayout(1, 4));
        JLabel jLabel = new JLabel("Address:",JLabel.CENTER);
        textArea=new JTextArea();
        //textArea.setPreferredSize(new Dimension(80, 60));
        Label label2 = new Label("              Hobby: ", JLabel.CENTER);
        JPanel selectBox = new JPanel();
        selectBox.setBorder(BorderFactory.createTitledBorder(""));
        selectBox.setLayout(new GridLayout(3, 1));
        checkBox1=new JCheckBox("Sing");
        checkBox2=new JCheckBox("Dance");
        checkBox3=new JCheckBox("Draw");
        selectBox.add(checkBox1);
        selectBox.add(checkBox2);
        selectBox.add(checkBox3);
        
        panel.add(jLabel);
        panel.add(textArea);
        
        panel.add(label2);
        panel.add(selectBox);
    }
    
    private void setPanel4(JPanel panel) {
        // TODO Auto-generated method stub
        panel.setPreferredSize(new Dimension(750, 50));
        button1=new JButton("submit");
        button2=new JButton("reset");
        FlowLayout flowLayout = new FlowLayout();
    //panel.set
        panel.setLayout(flowLayout);
        panel.add(button1);
        panel.add(button2);
        button1.addActionListener((e) -> submit());
        button2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                jTextField.setText(null);
                textArea.setText(null);
                jComboBox.setSelectedIndex(0);
                checkBox1.setSelected(false);
                checkBox2.setSelected(false);
                checkBox3.setSelected(false);
                buttonGroup.clearSelection();
                
            }
        });
    }
    
    
}

  

import java.awt.EventQueue;

import javax.swing.JFrame;



public class b {
    public static void main(String[] args) {
          
          EventQueue.invokeLater(() ->{
              
            
              A page=new A();
          });
    }
    
}

  

练习2:采用GUI界面设计以下程序:

l  编制一个程序,将身份证号.txt 中的信息读入到内存中;

l  按姓名字典序输出人员信息;

l  查询最大年龄的人员信息;

l  查询最小年龄人员信息;

l  输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

l  查询人员中是否有你的同乡。

l  输入身份证信息,查询所提供身份证号的人员信息,要求输入一个身份证数字时,查询界面就显示满足查询条件的查询结果,且随着输入的数字的增多,查询匹配的范围逐渐缩小。

import java.io.BufferedReader;
 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
//import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.util.TimerTask;
 
//import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
 
public class c extends JFrame {
    private static ArrayList studentlist;
    private static ArrayList<Student> list;
    private JPanel buttonPanel;
 //   private JPanel panel;
     
    Scanner scanner = new Scanner(System.in);
    
    public c() {
         studentlist = new ArrayList<>();
            
             
   //    Timer timer=new Timer();
         JTextArea jt = new JTextArea();
         jt.setBounds(300, 100, 800, 600);
         buttonPanel = new JPanel();
        
         JButton jButton = new JButton("字典排序");
         JButton jButton1 = new JButton("年龄最大和年龄最小");
         JLabel lab = new JLabel("猜猜你的老乡");
         JTextField jt1 = new JTextField();
         JLabel lab1 = new JLabel("找找同龄人(年龄相近):");
         JTextField jt2 = new JTextField();
         JLabel lab2 = new JLabel("输入你的身份证号码:");
         JTextField jt3 = new JTextField();
         JButton jButton2 = new JButton("退出");
        buttonPanel. setLayout(null);
         jButton.setBounds(0, 50, 100, 30);
         jButton1.setBounds(0, 100, 160, 30);
         lab2.setBounds(0, 200, 100, 30);
         lab.setBounds(0, 150, 150, 30);
         jt1.setBounds(150, 150, 100, 30);
         lab1.setBounds(0, 250, 150, 30);
         jt2.setBounds(100, 250, 160, 30);
         jt3.setBounds(100, 200, 160, 30);
         jButton2.setBounds(0, 300, 60, 30);
         buttonPanel.add(jButton);
         buttonPanel.add(jButton1);
         buttonPanel.add(lab);
         buttonPanel.add(jt1);
         buttonPanel.add(lab1);
         buttonPanel.add(jt2);
         buttonPanel.add(lab2);
         buttonPanel.add(jt3);
         buttonPanel.add(jButton2);
         add(buttonPanel);
         buttonPanel.add(jt);
        
        try {
             
            BufferedReader in = new BufferedReader(new FileReader("身份证号.txt"));
            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();
        }
    
         
    jButton.addActionListener(new ActionListener() {
              
          public void actionPerformed(ActionEvent e) {
                 jt.setText(null);
                Collections.sort(studentlist);
               jt.setText(studentlist.toString());
               // jt.append(studentlist.toString());
            }
              
        });
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int max = 0, min = 100;
                int j, k1 = 0, k2 = 0;
                for (int i = 1; i < studentlist.size(); i++) {
                    j = ((Student) studentlist.get(i)).getage();
                    if (j > max) {
                        max = j;
                        k1 = i;
                    }
                    if (j < min) {
                        min = j;
                        k2 = i;
                    }
 
                }
                jt.setText("年龄最大:" + studentlist.get(k1) + "年龄最小:" + studentlist.get(k2));
            }
        });
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
                System.exit(0);
            }
        });
        jt1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String find = jt1.getText();
                String text="";
                String place = find.substring(0, 3);
                for (int i = 0; i < studentlist.size(); i++) {
                    if (((Student) studentlist.get(i)).getprovince().substring(1, 4).equals(place)) {
                        text+="\n"+studentlist.get(i);
                        jt.setText("老乡:" + text);
                    }
                }
            }
        });
        jt2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String yourage = jt2.getText();
                int a = Integer.parseInt(yourage);
                int near = agenear(a);
                int value = a - ((Student) studentlist.get(near)).getage();
                jt.setText("年龄相近:" + studentlist.get(near));
            }
        });
        jt3.addKeyListener(new KeyAdapter() {
          
            
                public void keyTyped(KeyEvent e) {
                list = new ArrayList<>();
                Collections.sort(studentlist);
                String key = jt3.getText();
                for (int i = 1; i < studentlist.size(); i++) {
                    if (((Student) studentlist.get(i)).getnumber().contains(key)) {                        
                        list.add((Student) studentlist.get(i));                        
                        jt.setText("你可能是:\n" + list);
                         
                         
                    }                    
                }
            }
 
        });
       
       
         
         
      
    }
 
    public static int agenear(int age) {
        int min = 53, value = 0, k = 0;
        for (int i = 0; i < studentlist.size(); i++) {
            value = ((Student) studentlist.get(i)).getage() - age;
            if (value < 0)
                value = -value;
            if (value < min) {
                min = value;
                k = i;
            }
        }
        return k;
    }
    
 
    }

  

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

  

import java.awt.*;
import javax.swing.*;
  
/**
 * @version 1.34 2015-06-12
 * @author Cay Horstmann
 */
public class e
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(() -> {
         JFrame frame = new c();
         frame.setTitle("查询");
         frame.setBounds(50, 50, 500, 500);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setVisible(true);
      });
   }
}

  

练习3:采用GUI界面设计以下程序

l  编写一个计算器类,可以完成加、减、乘、除的操作

l  利用计算机类,设计一个小学生100以内数的四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;

l  将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt。

import java.awt.Button;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Scanner;
 
import javax.swing.*;
 
import java.math.*;
 
 
public class jisuanqi extends JFrame {
     
    private String[] c=new String[10];
    private String[] c1=new String[10];
    private int[] list=new int[10];
    int i=0,i1=0,sum = 0;
    private PrintWriter out = null;
    private JTextArea text,text1;
    private int counter;
     
    public jisuanqi()  {
        JPanel Panel = new JPanel();
        Panel.setLayout(null);
        JLabel JLabel1=new JLabel("");
        JLabel1.setBounds(500, 800, 400, 30);
        //JLabel1.setFont(new Font("Courier",Font.PLAIN,35));
        JButton Button = new JButton("生成题目");
        Button.setBounds(50,150,150,50);
      //  Button.setFont(new Font("Courier",Font.PLAIN,20)); 
        Button.addActionListener(new Action());
        JButton Button2 = new JButton("确定答案");
        Button2.setBounds(300,150,150,50);
       // Button2.setFont(new Font("Courier",Font.PLAIN,20));
        Button2.addActionListener(new Action1());
        JButton Button3 = new JButton("读出文件");
        Button3.setBounds(500,150,150,50);
        Button3.setFont(new Font("Courier",Font.PLAIN,20));
        Button3.addActionListener(new Action2());
         text=new JTextArea(30,80);text.setBounds(30, 50, 200, 50);
         text.setFont(new Font("Courier",Font.PLAIN,35));
         text1=new JTextArea(30,80);
         text1.setBounds(270, 50, 200, 50);
         text1.setFont(new Font("Courier",Font.PLAIN,35));
 
         Panel.add(text);
         Panel.add(text1);
 
         Panel.add(Button);
         Panel.add(Button2);
         Panel.add(Button3);
         Panel.add(JLabel1);
         add(Panel);
          
          
          
 
 
            
                   
    }
     
    private class Action implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
    
        {        
        text1.setText("");
        if(i<10) {
         
        int a = 1+(int)(Math.random() * 99);
        int b = 1+(int)(Math.random() * 99);
        int m= (int) Math.round(Math.random() * 3);
      switch(m)
      {
      case 0:
          while(a<b){  
              b = (int) Math.round(Math.random() * 100);
              a = (int) Math.round(Math.random() * 100); 
          }  
          c[i]=(i+":"+a+"/"+b+"=");
          list[i]=Math.floorDiv(a, b);
          text.setText(i+":"+a+"/"+b+"=");
          i++;   
          break; 
      case 1:
          c[i]=(i+":"+a+"*"+b+"=");
                list[i]=Math.multiplyExact(a, b);
                text.setText(i+":"+a+"*"+b+"=");        
           i++;
          break;
       case 2:
          c[i]=(i+":"+a+"+"+b+"=");
                list[i]=Math.addExact(a, b);
          text.setText(i+":"+a+"+"+b+"=");
          i++;
          break ;
      case 3:
          while(a<=b){  
              b = (int) Math.round(Math.random() * 100);
              a = (int) Math.round(Math.random() * 100); 
          }    
          c[i]=(i+":"+a+"-"+b+"=");
          text.setText(i+":"+a+"-"+b+"=");
          list[i]=Math.subtractExact(a, b);
          i++;
          break ;
          }
        }
      }
    }      
    private class Action1 implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {    
            if(i<10) {
                text.setText(null);        
                String daan=text1.getText().toString().trim();
                int a = Integer.parseInt(daan);
                if(text1.getText()!="") {
                    if(list[i1]==a) sum+=10;
                }        
                c1[i1]=daan;
                i1++; 
            }
        }
    }      
     
 
    private class Action2 implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
            {
          
            try {
                out = new PrintWriter("text.txt");
            } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for(int counter=0;counter<10;counter++)
            {
                out.println(c[counter]+c1[counter]);
            }
            out.println("成绩"+sum);
            out.close();
 
            }
 
    }   
}

  

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
 
import javax.swing.JFrame;
 
public class yunsuan {
 
     public static void main (String args[])
        {
             Toolkit t=Toolkit.getDefaultToolkit();
            Dimension s=t.getScreenSize(); 
            EventQueue.invokeLater(() -> {
                JFrame frame = new jisuanqi();
                frame.setBounds(0, 0,(int)s.getWidth()/2,(int)s.getHeight()/2);
                 
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
             });        
        }
  
}

  

任务3:本学期课程已结束,请汇总《面向对象程序设计课程学习进度条》的数据,统计个人专业能力提升的数据。并从学习内容、学习方法、学习心得几个方面进行课程学习总结,也希望你对课程的不足提出建议和意见。

Java 学习总结:

一二章:Java特点及其开发环境的配置

第三章:

  • 原始数据类型

整型(int),浮点型(double),布尔型(Boolean),字符型(char)
每个变量都有自己的类型并存储了一个合法的值
用+,-,*,/,!,&& ,||,^等运算符来实现对各种类型的操作。

  • 数组

数组能够顺序存储相同类型的多个数据。
数组的起始索引是0。这个习惯来源于机器语言,计算一个数组元素的地址需要将数组的起始地址加上该元素的索引,第一个元素的地址 就是数组的起始地址。
过程:
1. 声明数组。数组名是整个数组的引用。
2. 创建数组。数组一经创建,大小就是固定的。
3. 初始化数组。int默认初始值为0,double默认初始值0.0,boolean默认初始值false。

  • 字符串

字符串是由一串字符(char)组成的。
在创建并赋值字符串时:

String s1, s2;
s1 = new String("abc");
s2 = "abc";123

  • 变量

实例变量:为该类的对象保存了数据类型的值。作用域是整个对象。
静态变量:由static修饰,该类的所有对象所共享,是类级别的变量。作用域为类的所有对象。
参数变量:由方法的签名定义,在方法被调用时参数方法会被初始化为调用者提供的值。作用域是整个方法。
局部变量:在方法的主体中定义。作用域是从被定义之后到方法结束。

  • 方法

方法封装了由一系列语句所描述的运算。
构造方法:名称与类名相同。作用是初始化实例变量,每个构造函数都将创建一个对象并向调用者返回一个该对象的应用。
实例方法:描述了对象的行为,可以访问和操作静态变量和实例变量。通过实例才能调用。
静态方法:由static修饰,是一组在被调用时会被顺序执行的语句。可以通过类直接调用,只能访问操作类中静态变量,不能访问实例变量。

库大多数是静态方法库,也有部分是数据类型的定义并包含了一些静态方法。
可以自己定义库,也可以使用外部库。
用import导入库。

  • 抽象数据类型

数据类型:一组值和一组对这些值的操作的集合。
数据抽象:定义和使用数据类型的过程。
Java编程的基础主要是使用class关键字构造被称为引用类型的数据类型。这种编程风格称为面向对象编程。
抽象数据类型:ADT,一种能够对使用者隐藏数据表示的数据类型。它将数据和函数的实现相关联,并将数据的表示方式隐藏起来。
数据类型定义的基础是一组值的集合,但在API可见的仅是对它们的操作,而非它们的意义。

使用Java的类(class)实现抽象数据类型。
首先要定义表示数据类型的值的实例变量。之后是实现对数据类型的值的操作的构造函数和实例方法。


第四五六章:类,继承,接口

 

接口的关键字:interface  

接口格式:interface  接口名  {    }

实现接口的关键字是:implements  表示

实现接口的格式:class  类名   implements   接口名  {   }

接口的作用:扩展功能、定义约束来规范、程序解耦合性。

  重点:

接口本身就是一个特殊的类;

接口不能实例化(不能new,但是可是使用多态去进行实例化);

接口的子类可以是抽象类,也可以是具体类(重写接口类里的所有方法);

接口的成员变量(默认是常量):

成员特点:只能是常量,并且是静态,因为默认情况下接口成员变量的修饰符是:public static final;

构造方法:接口没有构造方法;

 成员方法:只能是抽象方法,其中默认修饰符是:public abstract       

注意:

接口不能创建对象;

接口没有构造方法;

因为接口是提供给类使用,当非抽象类去实现一个接口时,必须把接口中所有方法都实现。

第13章

Java应用程序部署  

(第14章)

 — Java异常处理编程模型    —  Java GUI编程模型  Java并发程序设计) 

Thread的子类创建线程的关键操作 

设计Thread的子类,重写父类的run方法 

用Thread类或子类创建线程对象   

使用start方法启动线程 

通过Runnable接口实现多线程的关键操作:

 设计一个实现Runnable接口的类,重写run方法; 

以该类的对象为参数建立Thread类的对象; 

调用Thread类对象的start方法启动线程,将执行 权转交到run方法。 

本学期对java的学习也是蛮辛苦的,现在回头看看学习java的过程也是很丰富,老师找的助教给我们帮了很大的忙,就是上课过程挺枯燥的,要是上课不单单是听,而是去实验室上课老师边讲我们边做验证,可能效果好一点,也没有那么乏味。老师每周布置得作业也很有必要,虽然有时量有一点点大,但这些都是学习过程中不可让避免的。所以谢谢老师和助教的辛勤付出

猜你喜欢

转载自www.cnblogs.com/fzx201626/p/10199390.html