实
验
报
告
课 课
程
名
称
Java 技术
专 专
业 业
班 班
级
13 -计算机科学与技术-1 班 班
学生姓名及学号
2013217 098 潘汀
指 指
导
教
师
钟华刚
实 实
验 验
地 地
点
计算中心
20 15 5
~ 2016 6
学年第
一
学期
实验一
类得封装、继承、多态
一、实验目得
1。复习、理解OOP 得特征—-封装、继承与多态。
2。学会使用 Java编写简单得类。理解类得属性与方法。
3。掌握关键字 private, protected, public 得作用.
4。掌握多态得概念。
二、实验内容
1.分别编写两个类Point2D,Point3D 来表示二维空间与三维空间得点,使之满足下列要求: (1)
Point2D 有两个整型成员变量 x, y (分别为二维空间得 X,Y方向坐标),Point2D得构造方法要实现对其成员变量x, y 得初始化。
(2) Point2D 有一个 void型成员方法offset(int a, int b),它可以实现 Point2D得平移。
(3)
Point3D 就是Point2D得直接子类,它有有三个整型成员变量x,y,z (分别为三维空间得X,Y,Z方向坐标),Point3D有两个构造方法:Point3D(int x,int y,int z)与 Point3D(Point2D p,int z),两者均可实现对 Point3D 得成员变量x, y,z 得初始化。
(4) Point3D 有一个 void 型成员方法 offset(int a, int b,int c),该方法可以实现 Point3D得平移。
(5)
在 Point3D中得主函数 main()中实例化两个 Point2D 得对象p2d1,p2d2,打印出它们之间得距离,再实例化两个Point3D得对象p3d1,p3d2,打印出她们之间得距离。
提示:java、lang、Math、sqrt()方法 2.创建一个数组,随机生成 Point2D 或者 Point3D 得对象放于其中。最后依次调用数组中每个对象得“打印方法” ,显示数组中存储得对象就是什么。
提示:java、lang、Math、random()方法
或者 java、util、Ran
dom 类 三、 实验代码
pa ckag e exp1; i mport java、util、Random; c la ss Point2D {
int x,y; tni(D2tnioPﻩ nt x,int y){this、x=x;t hi s、y=y;} i,a tni(tesffo diovﻩ int b)
{t his、x+=a;t his、y+=b;}
void print()
{System、 o u t 、printf(”Point2D:(%d,%d)\n",x,y);} } cla ss Point3D ex tends Point2D {
in t z; ni(D3tnioPﻩ nt x, i nt y, int z) { super(x, y);thi s、z=z;} ovﻩ oid offset(int a,int b,i nt c) { this、x+=a;this、y+=b;t his、z+=c;}
vo id print()
{System、o u t、printf(”Point3D:(%d,%d,%d)\n”,x,y,z);} } p ub lic c lass Main {
stati c double distance(Point2D a,Point2D b){
terﻩ eturn java、lang、Math、sqr t (((a、x—b、x)*(a、x-b、x)+(a、y—b、y)*(a、y—b、y)));
}ﻩ stati c double distance(Point3D a,Point3D b){ erﻩﻩ ret urn java、lang、Math、s q rt (((a、x—b、x)*(a、x-b、x)+(a、y-b、y)*(a、y-b、y)+(a、z-b、z)*(a、z-b、z)));}
publ ic static v oi d main(String args[])
{
Point2D p2d1=new Point2D(1,1),p2d2=new Point2D(2,2);
ﻩ Point3D p3d1=ne w Point3D(1,1,1),p3d2=new Point3D(2,2,2);
、metsySﻩ ou t、printf("%f %f\n”,di st a n ce(p2d1,p2d2),di sta n c e(p3d1,p3d2));
ﻩ in t T=10;
ﻩ Point2D arr[]=new Point2D[T];
rofﻩ r(int i=0;i<T;i++){
ﻩ r、htaM、gnal、avaj()tni(=epyt tniﻩ a ndom()*2);
int x=(in t)(java、lang、Math、r an do m ()*100),
y=( int)(java、lang、Math、r a ndom()*100),
r、htaM、gnal、avaj()tni(=zﻩﻩ a ndom()*100);
if(type==0)
arr[i]=new Point2D(x,y);
leﻩ lse arr[i]=new Point3D(x,y,z);
ﻩ }
for(int i=0;i〈T;i++){arr[i]、print();}
}ﻩ} 四 、思考题
1.您对面向对象得理解. 答:面向对象最重要得三大特性:封装、继承、多态。围绕这三个核心特性, 面向对象程序设计方法给软件工程带来得全新得程序结构设计模式. 面向对象与核心概念就就是理解【类】、与【对象】。
具体来讲,首先我对【类】一词得理解如下:
类就就是一组有共性得对象。它描述一个特定得抽象并提供创建对象得模板,如果类不具备某中特性,那么它得对象也不能具备该特性.
类就就是分类,比如人类,就就是关于人得定义,包括一些属性与操作这些属性得动作,就是对一个实体得抽象得描述。因为就是一个抽象概念,在使用得时候必须进行实例化,即将类具体为一个具体得实体。
由类牵扯出【对象】得理解: 对象,就是一个类得具体实现,比如某人 Jack,就就是拥有一个名字属性为Jack得人类,她可以有其她得属性,具有人类里得所有方法(可以简单得理解为行为与操作属性得)。
对象需要有状态,用以描述对象得特征与当前得状态.对象还需要有行为,定义其她对象对该对象所施加得动作.行为可能需要依赖于对象得状态。在某种情 况下,对象可以有某种行为,而在另外一些情况下,则不能。每一个对象都必须被唯一得标识(对象得名字不能相同,至少在一个场景中)。
对象通过协作,通信来完成一个比较完整得分工,这些分工整合起来,就就是整个软件系统.
2.什么就是多态?Java 中如何实现多态? 【概念理解】
多态就就是说,比较低层次得抽象得实体可以被支持比较高层次抽象得一些操作得实体所支持。实现这些概念需要得工具,或者说描述方式,关于多态得描述有一个比较传统得例子:一个比较高层次得抽象,称为形状,然后从形状继承而来得有圆,长方形(也可以有由长方形继承而来正方形),三角形等低层次抽象,有这样一个外部实体,它支持对形状得操作,比如计算形状得面积(不用考虑怎么计算,也不用 考虑计算得形状就是那种),由于它支持得就是形状(比较高层次得抽象),那么不论就是圆,长方形,三角形它就都支持。而具体到每个低层次得抽象得实际计算时,各自使用各自得计算方法,最终返回结果就可以了.
这样做得一个明显得好处就是,如果以后发现新得比较低层次得抽象后,直接加入系统即可,无需考虑上层使用者得修改。在运行时,编译器会知道需要计算哪个。
【Java 实现机制】
Java中实现多态得机制靠得就是父类或者接口定义得引用变量可以指向子类或者具体得实现类得实例对象,而程序调得方法在运行期才动态绑定,就就是引用变量所指向得具体实例对象得方法,也就就是内存里正在运行得那个对象得方法,而不就是引用变量得类型中定义得方法. 二 实验二 统系理管销进物货ﻩ 货物进销管理系统
一、实验目得
1.掌握 Java 中文件得读写操作。
.2 功得定特成完来)tsiLyarrA ,rotceV(类用实得供提 avaJ用使会学ﻩ能。
3.掌握字符串类(String, StringBuffer)得使用。
。4
。题问杂复决解与析分法方得象对向面用握掌ﻩ二、实验内容
编写一个 Inventory、java 完成以下功能(没有学过 Java 文件处理之前,各位同学可以使用硬编码将数据放进两个Vector 变量里。等学过Java 文件处理之后,再补充数据文件读取部分):
。1 rT 取读后然,录记存库有所得录记中 tad、yrotnevnI 取读并开打先首序程ﻩansactions、dat,处理这个文件中包含得事务,记录发货记录到Shipping、dat,并记录错误信息到 Errors、dat 中。最后更新库存到另外一个文件NewInventory、dat 中. .2 ,录记货存个一含包行每得 tad、yrotnevnIweN与tad、yrotnevnI件文ﻩ没条记录包含下面一些字段息,这些字段之间用一个 tab分开(见后面得文件格式): 字段 格式与含义 Item number 字符串型,货物编号 Quantity 整型,货物数量 Supplier 字符串型,供应商编号 Description 货物描述
3.字段 Items 按照从小到大得顺序写如文件得。注意 Item 号不必连续,如Item 号为 752 得后面可能就是 800。
4.文件Transactions、dat 包含几个不同得事务处理记录(每行一条记录)。每条记录前面以一个大写字母开头,表示这条记录就是什么类型得事务.在不同得大写字母后面就是不同得信息格式。所有得字段也就是以 tab 键分开得(见Transactions、dat 文件格式)。
5。以’O"开头得事务表示这就是一个发货,即某一种货物应该发给特定得客户。Item号与数量 Quantity 得格式如上面表格定义。Custom编号与上面得 Supplier编号一致。处理一条定单记录(以"O"开头得事务)意味着从减少库存记录中相应货物得数量(减少得数量=发货单中得数量),记录发货信息到Shipping、
dat 中。注意:Inventory、dat 中得 quantity不应该小于 0,如果对于某一种货物,库存得数量小于发货单得数量得话,系统应该停止处理发货单,并记录出错信息到Errors、dat。如果对于某一种货物有多个发货单,而且库存总量小于这些发货单得总与得话,系统应该按照发货单中得数量从小到大得有限原则满足客户.也就就是说,对于某一种货物如果一个数量 Quantity少得发货单没有处理之前,数量 Quantity 多得发货单永远不会被处理。(这种处理原则不受发货单记录在 Transactions、dat得先后顺序影响) 6.以'R’开头得事务表示这就是一个到货单记录,在’R'后面就是Item号与它得数量。处理一条到货单意味着增加库存中相应货物得数量(增加得数量=到货单中得数量)。注意如果在 Transactions、dat文件中,到货单出现在发货单之后,到货单中得货物数量可以用来填补发货单中得数量(可以理解成在 Transactions、dat 中,优先处理到货单)。
7.以’A'开头得事务表示向库存中增加一种新得货物(即这种货物以前库存中没有),在’A'后面就是Item 号,供应商 supplier以及货物得描述 description。处理一个新增货物记录意味着向库存中增加一个数量 Quantity为 0 得新得 Item.您可以假设在一个 Transactions、dat 中,新增货物记录总就是出现在第一个到货单之前。
8.以"D"开头得事务表示从库存中删除一种货物,在"D'后面就是 Item 号.删除操作总就是在所有得事物处理之后才被处理,以保证对于可能出现得同一种货物得发货单得操作能在删除之前被正确处理。如果要删除得某种货物得库存量 Quantity 不为 0 得话,系统应该向 Errors、dat记录出错信息。
9.文件 Shipping、dat中得每一行代表给某一客户得发货信息.Shipping、dat 中得每一行分别就是客户编号、Item 号、货物数量,它们之间用tab 键分隔。如果发货单中有两条客户编号与 Item 编号一样得记录,在Shipping、dat中应该将这两条发货信息合并(即将它们得数量相加)。
10.Errors、dat文件包含未发送得发货记录与库存量大于0得删除记录。Errors、dat 每一行包含 Custom 编号、Item 编号以及发货单上得数量Quantity。对于删除操作,Custom 编号为0,数量 Quntity 为库存中得 Quantity、 11。实验测试数据:
三、 实验代码
class Item {
;noitpircsed,reilppus,rebmun gnirtSﻩ ;ytitnauq tniﻩtni,rebmun gnirtS(metIﻩ t quantity,String supplier,String description){
ﻩ t hi s、number=number;
;ytitnauq=ytitnauq、sihtﻩﻩ tﻩ thi s、supplier=supplier;
ﻩ this、description=description;
} } class Transpare i mp le men ts parator {
publi c int pare(Object o1, Object o2) {
;1o)metI(=1e metIﻩ
Item e2=(Item)o2;
if(e1、quantity > e2、quantity)
ret urn 1;
e lse if(e1、quantity〈e2、quantity) re tur n -1;
e lse retu rn 0;
} } p ubl ic class Main {
pu blic sta tic vo id main(String args[]) throws IOException{
wen=niﻩﻩ w ("Inventory、txt”);
n=1tuoﻩ ne w ("Shipping、txt");
en=2tuoﻩﻩ ew ("Errors、txt”);
ﻩ BufferedWriter shipping=new BufferedWriter(out1);
BufferedWriter errors=new BufferedWriter(out2);
ﻩ Scanner scan=ne w Scanner(in);
String number = null,supplier,description;
niﻩﻩ nt quantity;
ﻩ Map<String,Item〉 map=new HashMap<String,Item>();
ﻩ Map<String,Item〉 transHash= new HashMap<String,Item〉();
Vector<Item> trans=new Vector<Item〉(),del=new Vector〈Item〉(),
rec=new Vector<Item>(),add=new Vector<Item〉();
//记录生成
))(txeNsah、nacs(elihwﻩﻩ
{ ﻩ;)(txen、nacs=rebmunﻩﻩ;)(tnItxen、nacs=ytitnauqﻩ
;)(txen、nacs=reilppusﻩﻩﻩ;)(txen、nacs=noitpircsedﻩ
;))noitpircsed,reilppus,ytitnauq,rebmun(metI wen ,rebmun(tup、pamﻩﻩ
}ﻩ ﻩ String type;
wen=niﻩ w (”Transactions、txt");
;)ni(rennacS wen=nacsﻩ ﻩ //数据读入—离线存储
while (scan、hasNext())
{ ﻩ;)(txen、nacs = epytﻩ ﻩ
if (type、equals("0")) {
ﻩﻩ number = scan、next();
;)(tnItxen、nacs = ytitnauqﻩﻩ
;)(txen、nacs = reilppusﻩﻩﻩ
;reilppus+"###”+rebmun=txeThsah gnirtSﻩﻩ
ﻩ if(!transHash、containsKey(hashText)){
//Hash 发货单
ﻩ
tup、hsaHsnartﻩﻩ
(hashText, new Item(number,quantity,supplier,”None"));
ﻩ
}
eﻩﻩ el se transHash、get(hashText)、quantity+=quantity;
}ﻩﻩeﻩ else if (type、equals(”R”)) {
ﻩ;)(txen、nacs = rebmunﻩ ﻩ
quantity = scan、nextInt();
wen(dda、cerﻩﻩ w Item(number,quantity,"None”,"None”));
}esleﻩﻩ se if (type、equals("D”)) {
ﻩ
;)(txen、nacs = rebmunﻩﻩ ﻩn(dda、ledﻩ ne w Item(number,-1,”",""));
ﻩ
} else if (type、equals("A”)) {
ﻩﻩ number = scan、next();
supplier = scan、next();
;)(txen、nacs = noitpircsedﻩﻩﻩ
;))noitpircsed,reilppus,0,rebmun(metI wen(dda、ddaﻩﻩ ﻩ
}ﻩ ﻩ }
//ﻩ ﻩ for (Map、Entry<String,Item> entry :
transHash、entrySet())
{ﻩﻩ
、yrtne,rebmun、)(eulaVteg、yrtne(metI wen(dda、snartﻩgetValue()、quantity,entry、getValue()、supplier,”None”));
ﻩ
//合并发货单写入
shipping、write(entry、getValue()、number + " ");
、gnirtS(etirw、gnippihsﻩﻩ v a l ueO f (entry、getValue()、quantity) + " ”);
;)reilppus、)(eulaVteg、yrtne(etirw、gnippihsﻩ
;)(eniLwen、gnippihsﻩ
}
Collections、 so r t (trans, ne w Transpare());
//按发货数量升序排序
加添//
)++i;)(ezis、dda<i;0=i tni(rofﻩ
{ﻩ ﻩ
;)i(teg、dda=meti metIﻩ
;)meti,rebmun、meti(tup、pamﻩﻩ 、metsySﻩﻩ ou t、printf ("添加存种:%s 供应商:%s 描述:
%s\n",item、number,item、supplier,item、description);
}ﻩ ﻩ for( int i=0;i<rec、size();i++)
//收货
{ﻩ ﻩ
;)rebmun、meti(teg、pam=ter,)i(teg、cer=meti metIﻩ
ret、quantity+=item、quantity;
;)ter,rebmun、ter(tup、pamﻩ
ﻩ System、o ut 、printf ("收货:%s 数量:%d 剩余:%d\n”,item、number,item、quantity,ret、quantity);
}
for( int i=0;i<trans、size();i++)
//发货
{ﻩ
Item item=trans、get(i),ret=map、get(item、number);
ﻩ
{)ytitnauq、meti<ytitnauq、ter(fiﻩ
、metsySﻩﻩ out 、printf("发货%s 给%s 失败,剩余:%d 需求:%d\n",item、number,item、supplier,ret、quantity,item、quantity); ;)” "+reilppus、meti(etirw、srorreﻩﻩ
ﻩ
;)" "+rebmun、meti(etirw、srorreﻩ
;)))ytitnauq、meti((fOeulav、gnirtS(etirw、srorreﻩﻩ
;)(eniLwen、srorreﻩﻩ
cﻩﻩ co nt inue;
ﻩ }
ret、quantity—=item、quantity; ﻩ;)ter,rebmun、meti(tup、pamﻩ
ﻩ System、o u t、printf(”发货%s 给%s 成功, 剩余:%d 需求:%d\n”,item、number,item、supplier,ret、quantity,item、quantity);
}ﻩﻩofﻩﻩ for(int i=0;i<del、size();i++)
//删除
{
;)rebmun、meti(teg、pam=ter,)i(teg、led=meti metIﻩ ﻩ
if(ret==nul l)
c ontinue; //去除无效
{)0=!ytitnauq、ter(fiﻩﻩ ﻩftnirp、tuo、metsySﻩ(”删除%s 失败 ,数量剩余:%d\n",item、number,ret、quantity);
ﻩ
;)" 0"(etirw、srorreﻩﻩ;)” ”+rebmun、meti(etirw、srorreﻩﻩ
ﻩ av、gnirtS(etirw、srorreﻩ l u e Of((ret、quantity)));
ﻩ
ﻩ errors、newLine();
ﻩﻩ cont inue;
} ﻩﻩ ﻩ
System、ou t 、printf("删除%s 成功,\n”,item、number);
;)rebmun、meti(evomer、pamﻩ
ﻩ }
ﻩ shipping、flush();
ﻩ errors、flush();
}ﻩ} 四、 实验结果
五 、思考题
、1
.得心验实出写,结总行进验实个整对ﻩ【摘要】
该实验本质就就是一个模拟题。要求模拟一个进货发货系统。
注意关键点:数据不能在线处理. 体现在两个方面:
①读入操作顺序与实际工作顺序不符 ②读入操作需要Hash 与合并 因此,只能采取离线保存+处理得手段. 由于数据主键并非整型值,如果就是用数组来保存,需要手写一个 Hash 表来 Hash. 考虑到基于红黑树实现得关联 Map 容器,所以使用 Map 来Hash 与模拟数据库。
【数据结构设计】
Map〈String,Item> map
——作为中心数据库 Map〈String,Item> transHash
—-用于发货单Hash Vector<Item〉 trans,del,rec,add;
-—最终操作序列 【流程简述】
①Inventory 文件读入 ②Transactions 文件读入
★-——〉在读入发货单时,进行 Hash 处理,去重合并
★—--〉对于其它操作,直接扔入最终操作序列 ③对 Hash 过得 transHash ,按数量升序排序,生成最终操作序列,同时写入 ShippingBuffer
④对四个操作序列,循环模拟。
★--—>先处理库存添加,更新 map 中心数据库
★--->再处理收货操作,更新 map 中心数据库
★—-—>再处理发货操作,如果库存不足,向 errorBuffer 写入信息
★—-—〉再处理删除操作,如果库存>0,向 errorBuffer 写入信息 ⑤★★★(不能遗忘)将缓冲区写入文件,生成 Shipping、dat、Errors、txt
版权所有:格斯文档网 2010-2024 未经授权禁止复制或建立镜像[格斯文档网]所有资源完全免费共享
Powered by 格斯文档网 © All Rights Reserved.。浙ICP备19042928号