zoukankan      html  css  js  c++  java
  • 201772020113李清华《面向对象程序设计(java)》第十周学习总结

     

    1、实验目的与要求

    (1) 理解泛型概念;

    (2) 掌握泛型类的定义与使用;

    (3) 掌握泛型方法的声明与使用;

    (4) 掌握泛型接口的定义与实现;

    (5)了解泛型程序设计,理解其用途。

    2、实验内容和步骤

    实验1 导入第8章示例程序,测试程序并进行代码注释。

    测试程序1:

    编辑、调试、运行教材311312 代码,结合程序运行结果理解程序;

    在泛型类定义及使用代码处添加注释;

    掌握泛型类的定义及使用。 

     1 package pair1;
     2 
     3 /**
     4  * @version 1.00 2004-05-10
     5  * @author Cay Horstmann
     6  */
     7 public class Pair<T>//Pair类引入了一个类型变量T,用尖括号括起来
     8  
     9 {
    10    private T first;
    11    private T second;
    12    //指方法的返回类型以及域和局部变量的类型
    13    public Pair() { first = null; second = null; }
    14    public Pair(T first, T second) { this.first = first;  this.second = second; }
    15 
    16    public T getFirst() { return first; }
    17    public T getSecond() { return second; }
    18 
    19    public void setFirst(T newValue) { first = newValue; }
    20    public void setSecond(T newValue) { second = newValue; }
    21 }
     1 package pair1;
     2 
     3 /**
     4  * @version 1.01 2012-01-26
     5  * @author Cay Horstmann
     6  */
     7 public class PairTest1
     8 {
     9    public static void main(String[] args)
    10    {
    11       String[] words = { "Mary", "had", "a", "little", "lamb" };
    12       Pair<String> mm = ArrayAlg.minmax(words);
    13       System.out.println("min = " + mm.getFirst());
    14       System.out.println("max = " + mm.getSecond());
    15    }
    16 }
    17 
    18 class ArrayAlg
    19 {
    20    /**
    21     * Gets the minimum and maximum of an array of strings.
    22     * @param a an array of strings
    23     * @return a pair with the min and max value, or null if a is null or empty
    24     */
    25    public static Pair<String> minmax(String[] a)//使用静态方法来用泛型方法
    26    {
    27       if (a == null || a.length == 0) return null;
    28       String min = a[0];
    29       String max = a[0];
    30       for (int i = 1; i < a.length; i++)
    31       {
    32          if (min.compareTo(a[i]) > 0) min = a[i];
    33          if (max.compareTo(a[i]) < 0) max = a[i];
    34       }
    35       return new Pair<>(min, max);
    36    }
    37 }

     

    测试程序2:

    编辑、调试运行教材315 PairTest2,结合程序运行结果理解程序;

    在泛型程序设计代码处添加相关注释;

    掌握泛型方法、泛型变量限定的定义及用途。

     1 package pair2;
     2 
     3 import java.time.*;
     4 
     5 /**
     6  * @version 1.02 2015-06-21
     7  * @author Cay Horstmann
     8  */
     9 public class PairTest2
    10 {
    11    public static void main(String[] args)
    12    {
    13       LocalDate[] birthdays = 
    14          { 
    15             LocalDate.of(1906, 12, 9), // G. Hopper
    16             LocalDate.of(1815, 12, 10), // A. Lovelace
    17             LocalDate.of(1903, 12, 3), // J. von Neumann
    18             LocalDate.of(1910, 6, 22), // K. Zuse
    19          };
    20       Pair<LocalDate> mm = ArrayAlg.minmax(birthdays);
    21       System.out.println("min = " + mm.getFirst());
    22       System.out.println("max = " + mm.getSecond());
    23    }
    24 }
    25 
    26 class ArrayAlg
    27 {
    28    /**
    29       Gets the minimum and maximum of an array of objects of type T.
    30       @param a an array of objects of type T
    31       @return a pair with the min and max value, or null if a is 
    32       null or empty
    33    */
    34    public static <T extends Comparable> Pair<T> minmax(T[] a) 
    35    {
    36       if (a == null || a.length == 0) return null;
    37       T min = a[0];
    38       T max = a[0];
    39       for (int i = 1; i < a.length; i++)
    40       {
    41          if (min.compareTo(a[i]) > 0) min = a[i];
    42          if (max.compareTo(a[i]) < 0) max = a[i];
    43       }
    44       return new Pair<>(min, max);
    45    }
    46 }
    package pair2;
    
    /**
     * @version 1.00 2004-05-10
     * @author Cay Horstmann
     */
    public class Pair<T> 
    {
       private T first;
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }
    
       public T getFirst() { return first; }
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }
       public void setSecond(T newValue) { second = newValue; }
    }

    测试程序3:

    用调试运行教材335 PairTest3,结合程序运行结果理解程序;

    了解通配符类型的定义及用途。

    package pair3;
    
    /**
     * @version 1.01 2012-01-26
     * @author Cay Horstmann
     */
    public class PairTest3
    {
       public static void main(String[] args)
       {
          Manager ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15);
          Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15);
          Pair<Manager> buddies = new Pair<>(ceo, cfo);      
          printBuddies(buddies);
    
          ceo.setBonus(1000000);
          cfo.setBonus(500000);
          Manager[] managers = { ceo, cfo };
    
          Pair<Employee> result = new Pair<>();
          minmaxBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
          maxminBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
       }
    
       public static void printBuddies(Pair<? extends Employee> p)
       {
          Employee first = p.getFirst();
          Employee second = p.getSecond();
          System.out.println(first.getName() + " and " + second.getName() + " are buddies.");
       }
    
       public static void minmaxBonus(Manager[] a, Pair<? super Manager> result)
       {
          if (a.length == 0) return;
          Manager min = a[0];
          Manager max = a[0];
          for (int i = 1; i < a.length; i++)
          {
             if (min.getBonus() > a[i].getBonus()) min = a[i];
             if (max.getBonus() < a[i].getBonus()) max = a[i];
          }
          result.setFirst(min);
          result.setSecond(max);
       }
    
       public static void maxminBonus(Manager[] a, Pair<? super Manager> result)
       {
          minmaxBonus(a, result);
          PairAlg.swapHelper(result); // OK--swapHelper captures wildcard type
       }
       // Can't write public static <T super manager> ...
    }
    
    class PairAlg
    {
       public static boolean hasNulls(Pair<?> p)
       {
          return p.getFirst() == null || p.getSecond() == null;
       }
    
       public static void swap(Pair<?> p) { swapHelper(p); }
    
       public static <T> void swapHelper(Pair<T> p)
       {
          T t = p.getFirst();
          p.setFirst(p.getSecond());
          p.setSecond(t);
       }
    }
    package pair3;
    
    /**
     * @version 1.00 2004-05-10
     * @author Cay Horstmann
     */
    public class Pair<T> 
    {
       private T first;
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }
    
       public T getFirst() { return first; }
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }
       public void setSecond(T newValue) { second = newValue; }
    }
    package pair3;
    
    import java.time.*;
    
    public class Employee
    {  
       private String name;
       private double salary;
       private LocalDate hireDay;
    
       public Employee(String name, double salary, int year, int month, int day)
       {
          this.name = name;
          this.salary = salary;
          hireDay = LocalDate.of(year, month, day);
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {  
          return salary;
       }
    
       public LocalDate getHireDay()
       {  
          return hireDay;
       }
    
       public void raiseSalary(double byPercent)
       {  
          double raise = salary * byPercent / 100;
          salary += raise;
       }
    }
    package pair3;
    
    public class Manager extends Employee
    {  
       private double bonus;
    
       /**
          @param name the employee's name
          @param salary the salary
          @param year the hire year
          @param month the hire month
          @param day the hire day
       */
       public Manager(String name, double salary, int year, int month, int day)
       {  
          super(name, salary, year, month, day);
          bonus = 0;
       }
    
       public double getSalary()
       { 
          double baseSalary = super.getSalary();
          return baseSalary + bonus;
       }
    
       public void setBonus(double b)
       {  
          bonus = b;
       }
    
       public double getBonus()
       {  
          return bonus;
       }
    }

    实验2编程练习:

    编程练习1:实验九编程题总结

    l 实验九编程练习1总结(从程序总体结构说明、模块说明,目前程序设计存在的困难与问题三个方面阐述)。

      1 package test1;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.File;
      5 import java.io.FileInputStream;
      6 import java.io.FileNotFoundException;
      7 import java.io.IOException;
      8 import java.io.InputStreamReader;
      9 import java.util.ArrayList;
     10 import java.util.Collections;
     11 import java.util.Scanner;
     12 
     13 public class Main{
     14     private static ArrayList<Student> studentlist;
     15     public static void main(String[] args) {
     16         studentlist = new ArrayList<>();
     17         Scanner scanner = new Scanner(System.in);
     18         File file = new File("F:\身份证号.txt");
     19         try {
     20             FileInputStream fis = new FileInputStream(file);
     21             BufferedReader in = new BufferedReader(new InputStreamReader(fis));
     22             String temp = null;
     23             while ((temp = in.readLine()) != null) {
     24                 
     25                 Scanner linescanner = new Scanner(temp);
     26                 
     27                 linescanner.useDelimiter(" ");    
     28                 String name = linescanner.next();
     29                 String number = linescanner.next();
     30                 String sex = linescanner.next();
     31                 String age = linescanner.next();
     32                 String province =linescanner.nextLine();
     33                 Student student = new Student();
     34                 student.setName(name);
     35                 student.setnumber(number);
     36                 student.setsex(sex);
     37                 int a = Integer.parseInt(age);
     38                 student.setage(a);
     39                 student.setprovince(province);
     40                 studentlist.add(student);
     41 
     42             }
     43         } catch (FileNotFoundException e) {
     44             System.out.println("学生信息文件找不到");
     45             e.printStackTrace();
     46         } catch (IOException e) {
     47             System.out.println("学生信息文件读取错误");
     48             e.printStackTrace();
     49         }
     50         boolean isTrue = true;
     51         while (isTrue) {
     52             System.out.println("选择你的操作,输入正确格式的选项");
     53             System.out.println("A.按姓名字典排序");
     54             System.out.println("B.输出年龄最大和年龄最小的人");
     55             System.out.println("C.寻找老乡");
     56             System.out.println("D.寻找年龄相近的人");
     57             System.out.println("F.退出");
     58             String m = scanner.next();
     59             switch (m) {
     60             case "A":
     61                 Collections.sort(studentlist);              
     62                 System.out.println(studentlist.toString());
     63                 break;
     64             case "B":
     65                  int max=0,min=100;
     66                  int j,k1 = 0,k2=0;
     67                  for(int i=1;i<studentlist.size();i++)
     68                  {
     69                      j=studentlist.get(i).getage();
     70                  if(j>max)
     71                  {
     72                      max=j; 
     73                      k1=i;
     74                  }
     75                  if(j<min)
     76                  {
     77                    min=j; 
     78                    k2=i;
     79                  }
     80                  
     81                  }  
     82                  System.out.println("年龄最大:"+studentlist.get(k1));
     83                  System.out.println("年龄最小:"+studentlist.get(k2));
     84                 break;
     85             case "C":
     86                  System.out.println("老家?");
     87                  String find = scanner.next();        
     88                  String place=find.substring(0,3);
     89                  for (int i = 0; i <studentlist.size(); i++) 
     90                  {
     91                      if(studentlist.get(i).getprovince().substring(1,4).equals(place)) 
     92                          System.out.println("老乡"+studentlist.get(i));
     93                  }             
     94                  break;
     95                  
     96             case "D":
     97                 System.out.println("年龄:");
     98                 int yourage = scanner.nextInt();
     99                 int near=agenear(yourage);
    100                 int value=yourage-studentlist.get(near).getage();
    101                 System.out.println(""+studentlist.get(near));
    102                 break;
    103             case "F":
    104                 isTrue = false;
    105                 System.out.println("退出程序!");
    106                 break;
    107                 default:
    108                 System.out.println("输入有误");
    109 
    110             }
    111         }
    112     }
    113         public static int agenear(int age) {      
    114         int j=0,min=53,value=0,k=0;
    115          for (int i = 0; i < studentlist.size(); i++)
    116          {
    117              value=studentlist.get(i).getage()-age;
    118              if(value<0) value=-value; 
    119              if (value<min) 
    120              {
    121                 min=value;
    122                 k=i;
    123              } 
    124           }    
    125          return k;         
    126       }
    127 
    128 }
     1 package test1;
     2 
     3 public class Student implements Comparable<Student> {
     4 
     5     private String name;
     6     private String number ;
     7     private String sex ;
     8     private int age;
     9     private String province;
    10    
    11     public String getName() {
    12         return name;
    13     }
    14     public void setName(String name) {
    15         this.name = name;
    16     }
    17     public String getnumber() {
    18         return number;
    19     }
    20     public void setnumber(String number) {
    21         this.number = number;
    22     }
    23     public String getsex() {
    24         return sex ;
    25     }
    26     public void setsex(String sex ) {
    27         this.sex =sex ;
    28     }
    29     public int getage() {
    30 
    31         return age;
    32         }
    33         public void setage(int age) {
    34             // int a = Integer.parseInt(age);
    35         this.age= age;
    36         }
    37 
    38     public String getprovince() {
    39         return province;
    40     }
    41     public void setprovince(String province) {
    42         this.province=province ;
    43     }
    44 
    45     public int compareTo(Student o) {
    46        return this.name.compareTo(o.getName());
    47     }
    48 
    49     public String toString() {
    50         return  name+"	"+sex+"	"+age+"	"+number+"	"+province+"
    ";
    51     }    
    52 }

    总体结构:

    程序有一个主类和一个子类。

    模块说明:

    主类涉及到对文件的读入操作,所以要用try...catch语句进行异常处理。还有选择语句。

    子类是对接口Comparable的实现。主要用来返回学生的信息。

    目前程序设计的困难:

    对文件的读写操作不熟悉,不知道如何进行排序以及查找。

    l 实验九编程练习2总结(从程序总体结构说明、模块说明,目前程序设计存在的困难与问题三个方面阐述)。

     1 package shiyan;
     2 import java.util.Scanner;
     3 import java.io.PrintWriter;
     4 
     5 public class Main {
     6     public static void main(String[] args) throws Exception{
     7         Scanner in=new Scanner(System.in);
     8         PrintWriter output=new PrintWriter("E:/test.txt");
     9         int sum=0;
    10         jisuanji js=new jisuanji();
    11         for (int i = 0; i < 10; i++) {
    12             int a = (int) Math.round(Math.random() * 100);
    13             int b = (int) Math.round(Math.random() * 100);
    14             int n = (int) Math.round(Math.random() * 3);
    15             
    16             switch(n)
    17                {
    18                case 1:
    19                    System.out.println(a+"/"+b+"=");
    20                    while(b==0){  
    21                        b = (int) Math.round(Math.random() * 100); 
    22                        }
    23                    double c = in.nextDouble();
    24                    output.println(a+"/"+b+"="+c);
    25                    if (c == js.chu(a,b)) {
    26                        sum += 10;
    27                        System.out.println("答案正确");
    28                    }
    29                    else {
    30                        System.out.println("答案错误");
    31                    }
    32                 
    33                    break;
    34                 
    35                case 2:
    36                    System.out.println(a+"*"+b+"=");
    37                    int c1 = in.nextInt();
    38                    output.println(a+"*"+b+"="+c1);
    39                    if (c1 == js.chen(a, b)) {
    40                        sum += 10;
    41                        System.out.println("答案正确");
    42                    }
    43                    else {
    44                        System.out.println("答案错误");
    45                    }
    46                    break;
    47                case 3:
    48                    System.out.println(a+"+"+b+"=");
    49                    int c2 = in.nextInt();
    50                    output.println(a+"+"+b+"="+c2);
    51                    if (c2 == js.jia(a, b)) {
    52                        sum += 10;
    53                        System.out.println("答案正确");
    54                    }
    55                    else {
    56                        System.out.println("答案错误");
    57                    }
    58                    
    59                    break ;
    60                case 4:
    61                    System.out.println(a+"-"+b+"=");
    62                    int c3 = in.nextInt();
    63                    output.println(a+"-"+b+"="+c3);
    64                    if (c3 == js.jian(a,b)) {
    65                        sum += 10;
    66                        System.out.println("答案正确");
    67                    }
    68                    else {
    69                        System.out.println("答案错误");
    70                    }
    71                    break ;
    72 
    73                    } 
    74         
    75               }
    76             System.out.println("成绩"+sum);
    77             output.println("成绩:"+sum);
    78             output.close();
    79         }
    80     }
    View Code
     1 package shiyan;
     2 
     3 public class jisuanji {
     4     private int a;
     5     private int b;
     6     public int jia(int a,int b)
     7     {
     8         return a+b;
     9     }
    10     public int jian(int a,int b)
    11     {
    12         return a-b;
    13     }
    14     public int chen(int a,int b)
    15     {
    16         return a*b;
    17     }
    18     public int chu(int a,int b)
    19     {
    20         if(b==0) 
    21         {
    22             return 0;
    23         }
    24         else 
    25             return a/b;
    26     }
    27 }
    View Code

    总体结构:有一个主类和一个子类。

    模块说明:主类里涉及文件的输出和异常处理,子类是实现计算器功能的算法。

    困难:不熟悉写出到文件的操作,导致程序编写困难。生成的减法和除法运算题不适应小学生的能力。

    编程练习2:采用泛型程序设计技术改进实验九编程练习2,使之可处理实数四则运算,其他要求不变。

     1 package shiyan;
     2 import java.util.Scanner;
     3 import java.io.FileNotFoundException;
     4 import java.io.PrintWriter;
     5 
     6 public class Main {
     7     public static void main(String[] args) {
     8         Scanner in=new Scanner(System.in);
     9         PrintWriter output = null;
    10         try {
    11             output = new PrintWriter("E:/test.txt");
    12         } catch (FileNotFoundException e) {
    13             // TODO 自动生成的 catch 块
    14             System.out.println("文件输出失败");
    15             e.printStackTrace();
    16         }
    17         int sum=0;
    18         jisuanji js=new jisuanji();
    19         for (int i = 0; i < 10; i++) {
    20             int a = (int) Math.round(Math.random() * 100);
    21             int b = (int) Math.round(Math.random() * 100);
    22             int n = (int) Math.round(Math.random() * 4 );
    23             
    24             switch(n)
    25                {
    26                case 1:
    27                    System.out.println(a+"/"+b+"=");
    28                    while(b==0){  
    29                        b = (int) Math.round(Math.random() * 100); 
    30                        }
    31                    while(a%b!=0) {
    32                        a = (int) Math.round(Math.random() * 100);
    33                        b = (int) Math.round(Math.random() * 100);
    34                    }
    35                    double c = in.nextDouble();
    36                    output.println(a+"/"+b+"="+c);
    37                    if (c == js.chu(a,b)) {
    38                        sum += 10;
    39                        System.out.println("答案正确");
    40                    }
    41                    else {
    42                        System.out.println("答案错误");
    43                    }
    44                 
    45                    break;
    46                 
    47                case 2:
    48                    System.out.println(a+"*"+b+"=");
    49                    int c1 = in.nextInt();
    50                    output.println(a+"*"+b+"="+c1);
    51                    if (c1 == js.chen(a, b)) {
    52                        sum += 10;
    53                        System.out.println("答案正确");
    54                    }
    55                    else {
    56                        System.out.println("答案错误");
    57                    }
    58                    break;
    59                case 3:
    60                    System.out.println(a+"+"+b+"=");
    61                    int c2 = in.nextInt();
    62                    output.println(a+"+"+b+"="+c2);
    63                    if (c2 == js.jia(a, b)) {
    64                        sum += 10;
    65                        System.out.println("答案正确");
    66                    }
    67                    else {
    68                        System.out.println("答案错误");
    69                    }
    70                    
    71                    break ;
    72                case 4:
    73                    System.out.println(a+"-"+b+"=");
    74                    while(a<b) {
    75                        a = (int) Math.round(Math.random() * 100);
    76                        b = (int) Math.round(Math.random() * 100);
    77                    }
    78                    int c3 = in.nextInt();
    79                    output.println(a+"-"+b+"="+c3);
    80                    if (c3 == js.jian(a,b)) {
    81                        sum += 10;
    82                        System.out.println("答案正确");
    83                    }
    84                    else {
    85                        System.out.println("答案错误");
    86                    }
    87                    break ;
    88 
    89                    } 
    90         
    91               }
    92             System.out.println("成绩"+sum);
    93             output.println("成绩:"+sum);
    94             output.close();
    95         }
    96     }
    View Code
     1 package shiyan;
     2 
     3 public class jisuanji<T> {
     4     private T a;
     5     private T b;
     6     public jisuanji() {
     7         a=null;
     8         b=null;
     9     }
    10     public jisuanji(T a,T b) {
    11         this.a=a;
    12         this.b=b;
    13     }
    14     public int jia(int a,int b)
    15     {
    16         return a+b;
    17     }
    18     public int jian(int a,int b)
    19     {
    20         return a-b;
    21     }
    22     public int chen(int a,int b)
    23     {
    24         return a*b;
    25     }
    26     public int chu(int a,int b)
    27     {
    28         if(b!=0&&a%b==0) 
    29             return a/b;
    30         else 
    31             return 0;
    32     }
    33 }
    View Code

    实验总结:

    这次实验加深了对实验9编程题的理解,改进了其中的错误。学会了泛型类的设计,但是通配符还是有些不理解的地方。

  • 相关阅读:
    Codeforces 700A As Fast As Possible(二分答案)
    BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
    Codeforces 701C They Are Everywhere(Two pointers+STL)
    Codeforces 430B Balls Game(Two Pointers)
    CSU 1812 三角形和矩形
    CSU 1804 有向无环图
    CSU 1803 2016
    CSU 1808 地铁
    CodeForces 707B Bakery
    CodeForces 707A Brain's Photos
  • 原文地址:https://www.cnblogs.com/bmwb/p/9904095.html
Copyright © 2011-2022 走看看