第五次上机作业改

本文由用户“ajhbw”分享发布 更新时间:2021-10-29 13:23:36 举报文档

以下为《第五次上机作业改》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

实验目的:

通过例子更深入理解接口名作为入参或返回值的使用方法

读懂程序,体会接口的作用,体会面向接口编程思想

学会按照例子,用抽象编程思路(封装、继承、多态)完成编码要求。

实验内容:

列子

需求:设计一个展厅,希望可以根据不同厂家的产品布置不同的主题会场。

①分析:如果我们设计的展厅的类中用某个***类声明了对象,那么我们的展厅就缺少弹性,因为一旦展厅要展示***产品,就需要修改展厅类的代码。

如果每当用户有新的需求,就会导致修改类的某部分代码,那么就应当将这部分代码从该类中分割出去,使它和类中其他稳定的代码制剂室松耦合关系,即将每种可能的变化对应地交给实现接口的类去负责完成。

②设计接口

首先设计一个接口Product,该接口有两个方法:showProduct()和getCorpName(),那么实现接口的类必须重写这两个方法。即要求***给出具体的展出产***的名称。

③设计展厅Exhibition类(展厅展示***的什么产品),该类有一个show(Product pro)方法,该方法的入参是接口Product类型。

代码实现:

interface Product{ //接口定义

public void showProduct();

public void getCorpName();

}

class Exhibition{ //展示类及方法,注意方法入参为接口类型??需要传入什么呢??没错,需要传入接口实现类的变量名。想想怎么编码完成接口实现类????????关键字,类体里要完成哪些内容?????

public void show(Product pro) {

System.out.println(pro.getCorpName()+"展示的产品是:");

pro.showProduct();

}

}

实现类:

class HuaWei implements Product{

public void showProduct() {

System.out.println("HUAWEI Prosche");

};

public String getCorpName() {

return "HW";

};

}

class Baidu implements Product{

public void showProduct() {

System.out.println("Baidu Driverless car");

};

public String getCorpName() {

return "Baidu";

};

}

对应知识点:5.2章某某

测试类:

public class Demo {

public static void main(String[] args) {

Product pro1 = new HuaWei();

Product pro2 = new Baidu();

Exhibition exhib = new Exhibition();

exhib.show(pro1); //重点理解

exhib.show(pro2);

}

}

执行结果:

HW展示的产品是:

HUAWEI Prosche

Baidu展示的产品是:

Baidu Driverless car

上机编程题

①小明现在想点外卖,美团外卖的优惠R倒嬖蚴牵郝?0随机生成15以内的随机优惠R担?00两张,以此类推),配送费5元;饿了吗的优惠R倒嬖颍郝?00随机生成25以内的优惠R狄徽牛渌头?0元。

小明点餐KFC:

类型

单价

购买的个数



鸡腿汉堡

30

3



奥尔良烤翅

12

3



薯条

13

2



cafe

15

3





要求:

接口,包含两个方法优惠金额计算, 总费用计算;

实现两个外卖平台的类

Demo类中计算小明点餐分别需要付钱的总数。

package a; import java.util.Arrays; import java.util.Scanner; public class Purchase { public static int [] showmenu(){ Scanner input = new Scanner(System.in); boolean flag=true; int arr[] = new int[100]; int i=0; while(flag){ System.out.println("KFC的品种如下:"); System.out.println("---------------------------"); System.out.println("1.鸡腿汉堡: 单价(30元)"); System.out.println("2.奥尔良烤翅: 单价(12元)"); System.out.println("3.薯条: 单价(13元)"); System.out.println("4.cafe: 单价(15元)"); System.out.println("---------------------------"); String array[][]={{"1","鸡腿汉堡","单价(30)元)"},{"2","奥尔良鸡翅","单价(12元)"},{"3","薯条","单价(13元)"},{"4","cafe","单价(15元)"}}; System.out.println("请输入序号选择购买的品种:"); int ch = input.nextInt(); System.out.println(Arrays.toString(array[ch-1])); System.out.println("请输入购买的数量:"); arr[i]=input.nextInt(); System.out.println("输入5字返回菜单,输入0退出菜单"); int[] exit=new int[100]; exit[i]=input.nextInt(); if(exit[i]==0) flag=false; if(exit[i]==5) flag=true; i++; } return arr; } }

package a; public class Demo { public static void main(String [] args){ Purchase purchase=new Purchase(); int[] array=Purchase.showmenu(); ElmaPlatform elmaPlatform=new ElmaPlatform(array); elmaPlatform.show(); MeituanPlatform meituanPlatform=new MeituanPlatform(array); meituanPlatform.show(); } }

package a; public interface Discount_rules { public int getPreferntial_amount();//优惠价格 public int getTotal_cost();//最终总费用 }

package a; import java.util.Random; import java.util.Arrays; public class ElmaPlatform implements Discount_rules{ int d; int []arry; ElmaPlatform(int[]array){ this.arry=array; } public int sum(int []array){ int ary[]=array; int sum; sum= (ary[0] * 30) + (ary[1] * 12) + (ary[2] * 13) + (ary[3] * 15); return sum; } public int getPreferntial_amount(){ if((sum(arry)/100)>0){ Random random = new Random(); d=random.nextInt(26); } return d; } public int getTotal_cost(){ return (sum(arry)-d+10); } public void show(){ System.out.println("饿了么平台的优惠金额是:"+getPreferntial_amount()+"饿了么平台的最终费用是:"+getTotal_cost()); } }

package a; import java.util.Arrays; import java.util.Random; public class MeituanPlatform implements Discount_rules { int sum; int max; int d[] = new int[100]; int[] arry; public int sum(int[] array) { int ary[] = array; sum = (ary[0] * 30) + (ary[1] * 12) + (ary[2] * 13) + (ary[3] * 15); return sum; } MeituanPlatform(int[] array) { this.arry = array; } public int getPreferntial_amount() { int count = (sum(arry)) / 50; for (int i = 0; i < count; ) { Random random = new Random(); d[i] = random.nextInt(16); i++; if (count - 1 == i) Arrays.sort(d); max = d[count - 1]; } return max; } public int getTotal_cost() { return sum(arry) - max + 5; } public void show() { System.out.println("美团外卖的优惠卷是:" + getPreferntial_amount() + "美团外卖的最终费用是:" + getTotal_cost()); } }







总结:

这题写了一段时间,虽然结果能出来,但是我并不是很满意,因为没做成我喜欢的样子,并且我出现语义错误,或者说逻辑错误,就是编译器报错不了,但是我最后的结果有问题,中间不断的下断点来调试,时间搞得很久,人也搞得很烦,而且我这个菜单感觉做的不好,不知道老师你有没有更好的方法,而且其中的输入的数量,必须要对应,比如说我第一个买的是汉堡,第二个就必须是鸡翅,如果返回菜单后第二次买的也是汉堡,那么也会出问题,所以这个我认为是一个缺陷,但我并没有很好的思路,然后我的代码里面还是判断了随机生成的最大的那个卷,这个我认为还是比较符合实际的.然后我觉得不是很好,但也不知道那些地方值得改进,还是希望老师看看!

整体思路是对的,关于菜单的问题,主要是在数据结构上的设计不是很好,用一个String array[][]来存储菜单这种做法不是很合理,再设计程序时,要考虑需求背后的隐含的逻辑,尤其是面向对象的程序设计,要找出背后一些关键的对象,这类对象我们叫实体(entity)。

上面的作业用String array[][]来存储菜单,虽然在数据结构上简单,但这样做会给程序处理菜单时带来麻烦,例如在选择菜单上食物时的困难。所以我们应该看到需求背后的一些逻辑,例如这里明显有食物(Food)这个概念(同时食物还有数量的概念,所以设计了一个NumFood),还有菜单(Menu)这个概念,还有订单(Order)概念,我们引入这些概念可以让我们的代码在处理逻辑上更自然,也更符合现实场景,附件的代码可以参考,但没有经过测试;

② 实现一个异常类,当输入的数字为7的倍数或末尾是7时,提示“你出错了”,写测试类对该异常类进行测试,随机或者从屏幕输入数字。

package b; public class Shuru_abnormal extends Exception{ public Shuru_abnormal(String message){ super(message); } }

package b; import java.util.Scanner; public class Demo1 { public static void main(String [] args){ int num1; System.out.println("请输入一个数字:"); Scanner input=new Scanner(System.in); int num=input.nextInt(); try { feiQ(num); } catch (Shuru_abnormal e) { e.printStackTrace(); System.out.println("请马上重新输入:"); } } public static void feiQ(int num)throws Shuru_abnormal{ if((num%7)==0||(num-7)/10==0){ throw new Shuru_abnormal("输入的数据错误,请重新输入:"); } System.out.println("输入正常!"); } }



总结: 这题我是仿造书上的例题来写的,其中的一些具体的实现原理还是不是很清楚,比如e.printStackTrace,还有我的public Shuru_abnormal(String message),我开始想的是int num,但是后来发现不行,所以就改成和书上的一样的了。

e.printStackTrace的作用是用来打印异常堆栈,看方法的名字就知道了;

关于public Shuru_abnormal(String message)改成int num抱错的原因,可以往上找一下java构造函数的知识,一般每个java类都会有一个默认的构造函数,同时子类在继承父类时,如果要重写构造函数,那么子类的第一行必须时调用父类的构造函数(或者子类的其他构造函数,但最终还是要调用父类的),有时没有写为什么不抱错?因为是编译器默认添加了(这个过程在代码编译时会添加),当改成int的时候,编译器找不到父类中有参数为int的构造函数,无法默认添加所以抱错,这个异常是编译时发生的;解决方法有两种,改成和父类一样的参数或者自己显示的调用父类的String的构造函数,还有更多构造函数的知识,可以网上找一下;

常用类知识点题

String 与 StringBuffer

①String a = “abc”;

String b = “abc”

问:a 与 b 是否相等?为什么?

a和b相等,因为a和b均在同一个堆内存中,此时找不到直接赋值方式变量a和变量b的地址,因为a和b由jvm所维护,存放在jvm的常量池某某。



package a; public class a { public static void main(String [] args) { String a="abc"; String b="abc"; if(a==b) System.out.println("a和b相等"); else System.out.println("a和b不相等"); System.out.println("a的哈希码值为"+a.hashCode()); System.out.println("b的哈希码值为"+b.hashCode()); System.out.println("a和b相等,因为a和b的哈希码值相同"); } }



②String a = “ab”+”c”;

String b = “abc”;

问:a 与 b 是否相等?为什么?

相等

package a; public class a { public static void main(String [] args) { String a="ab"+"c"; String b="abc"; if(a==b) 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 System.out.println("a的地址为"+"@"+a.hashCode()); } }



String对象有两种,一种叫直接值,一种叫包装类型;首选要理解这两个概念;

String a = “abc”//直接值,String a = new String(“abc”)//包装类型;

直接值是直接存储在常量池某某的,new String(“abc”)其实是创建了两个对象,一个是直接值abc在常量池,一个是new String在堆内存中,new String包含一个abc的直接值;

关于java的变量地址,一般是不能访问,但是有另外一个方法,可以查询对象地址的方法System.identityHashCode(),这个获取对象内存地址并计算的hashcode,而string的hashcode其实是被重写过的,这个可以看一下string的源码就知道了,所以你认为的很多地址没有变化,其实是错误的,例如String a = “abc” 和 String a = new String(“abc”),两个对象的hashcode是相同的,但他们的内存地址是不同的

[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]

以上为《第五次上机作业改》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览