Java数组与对象实验报告.docx
《Java数组与对象实验报告.docx》由会员分享,可在线阅读,更多相关《Java数组与对象实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
Java数组与对象实验报告
实验六Java对象和数组
一实验目的
1.掌握Java中对象和引用变量的概念
2.掌握Java数组的使用和本质
3.掌握数组相关常用算法
二实验内容
1.类的定义和对象创建
定义类MyPoint用以包含属性x,y表示一个点的坐标。
在类中编写main()方法,在其中声明两个MyPoint类型的对象start和end,分别创建对象并赋值给对象名start和end。
将对象start的成员x和y分别赋值为10,将对象end的成员x和y分别赋值为20。
【程序代码】
packageexp6;
publicclassMyPoint{
intx,y;
publicMyPoint(intx,inty){
this.x=x;
this.y=y;
}
publicstaticvoidmain(String[]args){
MyPointstart;
MyPointend;
start=newMyPoint(10,10);
end=newMyPoint(20,20);
}
}
1.1输出两个对象的字符串表示。
用两种方法实现
(1)System.out.println("StartMyPoint=x:
"+start.x+"y"+start.y);
(2)通过改写toString()方法来实现,然后使用System.out.println(start);
【写出toString()方法的全部代码】
publicStringtoString(){
return"x="+x+""+"Y="+y;
}
1.2在main()方法中增加代码,以完成下列操作:
声明一个新的MyPoint类型对象stray。
将对象end的赋值给stray,随后输出end和stray变量的成员x和y的值。
将对象stray的成员x和y赋任意新值,输出end和stray的成员的值。
将start对象的成员x和y赋予新的值(任意),再次输出start和end的成员值。
分析程序输出结果,得出相应结论。
【程序代码和分析:
填写增加部分的代码即可】
MyPointstart=newMyPoint(10,10);
MyPointend=newMyPoint(20,20);
MyPointstray;
stray=end;
System.out.println(end);
System.out.println(stray);
stray=end;
stray.x=30;
stray.y=30;
System.out.println(end);
System.out.println(stray);
start.x=50;
start.y=50;
System.out.println(end);
System.out.println(start);
运行结果:
x=20Y=20
x=20Y=20
x=30Y=30
x=30Y=30
x=30Y=30
x=50Y=50
分析程序:
(1)、将对象end的赋值给stray,则将引用变量end的内存地址赋给stray,两者指向同一数组。
所以输出X=20Y=20
(2)、将对象stray的成员x和y赋任意新值,则将引用变量stray指向新的内存,输出X=30Y=30
(3)、将start对象的成员x和y赋予新的值(任意),则将引用变量start指向新的内存,输出X=50Y=50
2.一维数组的使用
2.1定义一个BasicArray类,在main()方法中声明(非创建)两个整型数组,thisArray和thatArray。
创建一个数组,它的初值是1至10。
将这个数组的引用赋值给变量thisArray。
使用for循环输出thisArray数组的所有值。
如何控制循环的次数?
编译并运行程序,记下输出结果。
【程序代码和分析】
packageexp6;
publicclassBasicArray{
publicstaticvoidmain(String[]args){
intthisArray[];
intthatArray[];
intarrayNew[]={1,2,3,4,5,6,7,8,9,10};
thisArray=arrayNew;
for(inti=0;iSystem.out.println(thisArray[i]);
}
}
}
运行结果:
12345678910
分析程序:
声明数组thisArray,thatArray,声明数组arrayNew并初始化。
将arrayNew赋给thisArray,则将arrayNew的内存地址赋给thisArray,两者指向同一数组。
最后用for循环输出thisArray指向的数组。
2.2对每个thisArray的元素,把它的值赋值为下标值的阶乘。
并输出数组的所有元素。
重新编译并运行程序。
【程序代码和分析:
填写增加部分的代码即可】
for(inti=0;iintj;
for(j=1,thisArray[i]=1;j<=i;j++){
thisArray[i]*=j;
}
System.out.println("thisArray["+i+"]="+thisArray[i]);
}
运行结果:
thisArray[0]=1
thisArray[1]=1
thisArray[2]=2
thisArray[3]=6
thisArray[4]=24
thisArray[5]=120
thisArray[6]=720
thisArray[7]=5040
thisArray[8]=40320
thisArray[9]=362880
分析程序:
因为将thisArray的赋值为下标的阶乘,所以thisArray指向的数组其元素将被重新赋值。
2.3将thisArray赋值给thatArray。
输出thatArray的所有元素。
编译并运行程序,分析程序运行结果。
【程序代码和分析:
填写增加部分的代码即可】
thatArray=thisArray;
intlength=thatArray.length;
for(i=0;iSystem.out.println("thatArray[i]"+thatArray[i]);
运行程序:
thatArray[0]=1
thatArray[1]=1
thatArray[2]=2
thatArray[3]=6
thatArray[4]=24
thatArray[5]=120
thatArray[6]=720
thatArray[7]=5040
thatArray[8]=40320
thatArray[9]=362880
分析程序:
因为thisArray赋值给thatArray,所以thisArray,thatArray将指向同一数组。
2.4任意修改thisArray数组的某些元素,输出thatArray数组的值。
编译并运行程序,分析运行结果。
【程序代码和分析:
填写增加部分的代码即可】
thisArray[4]=4444;
thatArray=thisArray;
intlength=thatArray.length;
for(i=0;iSystem.out.println("thatArray[i]"+thatArray[i]);
2.5创建一个长度为20个元素的整型数组。
将新数组的引用给变量thatArray,输出thatArray的值。
编译并运行程序,记录输出结果并分析原因。
【程序代码和分析:
填写增加部分的代码即可】
int[]otherArray=newint[20];
thatArray=otherArray;
for(inti=0;iSystem.out.print(thatArray[i]+"");
}
运行结果:
00000000000000000000
分析程序:
因为创建了一个数组但是没有初始化,所以输出的时候输出的是该数组的数据类型的默认值
2.6使用arraycopy方法将thisArray数组的值给thatArray数组。
输出thatArray数组中元素的值。
编译并运行程序。
分析程序运行结果。
【程序代码和分析:
填写增加部分的代码即可】
intthisArray[];
intthatArray[];
intarraynew[]={1,2,3,4,5,6,7,8,9,10};
thisArray=arraynew;
int[]otherArray=newint[20];
thatArray=otherArray;
System.arraycopy(thisArray,0,thatArray,1,thisArray.length);
for(inti=0;iSystem.out.print(thatArray[i]+"");
}
运行结果:
012345678910000000000
分析程序:
使用arraycopy()方法将thisArray的值赋给thatArray,arraycopy()方法中的参数的意思是:
将thisArray数组从下标为0的元素开始,复制到thatArray数组的下标为1的元素,一共复制thisArray.length个元素,其余的元素不变。
2.7改变thatArray数组中某些元素的值,输出thisArray和thatArray数组的所有元素。
编译并运行程序。
分析程序运行结果。
【程序代码和分析:
填写增加部分的代码即可】
thatArray[15]=15;
System.out.print("thisArray:
");
for(inti=0;iSystem.out.print(thisArray[i]+"");
}
System.out.println("");
System.out.print("thatArray:
");
for(inti=0;iSystem.out.print(thatArray[i]+"");
}
运行结果:
thisArray:
12345678910
thatArray:
01222345678910000000000
3.在文本文件中存放着一系列的整数,整数与整数之间用逗号分隔。
编写程序将这些整数读入程序,然后对数组进行特定处理后输出。
提示:
可以使用Scanner类的nextLine()方法得到一个字符串line,其中存放着所有的整数。
然后用Stringarr[]=line.split(“,”);可将逗号作为分隔符分离出一个数组,数组的长度即为整数的个数,每一个数组元素可通过Integer.parseInt()转换为整型数据存放到新创建的整型数组中(数组长度即为arr的长度)。
3.1将数据读取分析功能单独设计为一个方法
publicstaticint[]readData();
【写出方法代码】
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.BufferedWriter;
importjava.io.IOException;
importjava.util.Scanner;
publicstaticint[]readData()throwsFileNotFoundException{
Scannersc=newScanner(newBufferedReader(newFileReader("E:
\\实验备份\\XX云同步盘\\Java\\workspace\\source.txt")));
Stringst=sc.nextLine();
Stringarr[]=st.split(",");
intarrLength=arr.length;
intintArr[]=newint[arrLength];
inti;
for(i=0;iintArr[i]=Integer.parseInt(arr[i]);
}
returnintArr;
}
3.2将读取到的整数使用冒泡排序法按升序排序,写出方法代码。
方法原型为
publicstaticvoidbubbleSort(inta[],intn);//n为元素个数
publicstaticvoidbubbleSort(inta[],intn)throwsFileNotFoundException{
intj;
for(j=0;jbooleanflag=true;
for(inti=0;iif(a[i]>a[i+1]){
inttemp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=false;
}
}
if(flag==true)break;
}
for(j=0;jSystem.out.print(a[j]+"");
}
}
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
bubbleSort(readData(),readData().length);
}
运行结果:
98949190898988787560
3.2将读取到的整数使用选择排序法按升序排序,写出方法代码。
方法原型为
publicstaticvoidselectSort(inta[],intn);//n为元素个数
publicstaticvoidselectSort(inta[],intn)throwsFileNotFoundException{
inti;
for(i=0;iintlowIndex=i;
for(intj=i+1;jif(a[j]>a[lowIndex]){
lowIndex=j;
}
}
inttemp=a[i];
a[i]=a[lowIndex];
a[lowIndex]=temp;
}
for(i=0;iSystem.out.print(a[i]+"");
}
}
运行结果:
60757888898990919498
3.3将读取到的整数使用Arrays类中的sort方法进行排序,写出方法代码。
publicstaticvoidArraySort(intx[])throwsFileNotFoundException{
Arrays.sort(x);
for(inti=0;i}
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
ArraySort(readData());
}
3.4对读取到的整数进行分析,求出最大值、最小值、平均值并输出。
同样设计为一个单独的方法。
publicstaticvoidaboutArray(inta[],intn){
intmax=0,min=100,sum=0;
inti;
floatave;
for(i=0;iif(a[i]>max)
max=a[i];
if(a[i]sum+=a[i];
//System.out.print("最大值"+max+""+"最小值"+min);
}
ave=sum/(float)n;
System.out.println("最大值:
"+max+""+"最小值:
"+min+""+"平均值:
"+ave);
}
4.定义MyDate类,包含year,month,day三个成员。
在MyDate类中改写toString()方法,equals方法并实现Compareable接口。
在大小比较时,返回两个日期相差的天数。
为了计算相差的天数,设计方法intorder()返回日期在该年的序号,设计函数intdiff(MyDatead)计算本日期和ad日期之间相差的天数。
packageexp6;
publicclassMyData{
intyear;
intmonth;
intday;
publicMyData(intx,inty,intz){
year=x;
month=y;
day=z;
}
publicvoidsetYear(intx){
year=x;
}
publicvoidsetMonth(inty){
month=y;
}
publicvoidsetDay(intz){
day=z;
}
publicintgetYear(){
returnyear;
}
publicintgetMonth(){
returnmonth;
}
publicintgetDay(){
returnday;
}
publicStringtoString(){//重写toString()
returnyear+"年"+month+"月"+day+"日";
}
publicbooleanisLeapYear(){
if((year%4==0&&year%100!
=0)||year%400==1)
returntrue;
elsereturnfalse;
}
publicintorder(){
intj=0;
intnumOfMonth[]={0,0,31,28,31,30,31,30,31,31,30,31,30};
intnumOfMonth2[]={0,0,31,29,31,30,31,30,31,31,30,31,30};
if(isLeapYear()){//计算这天在这年中的次序
for(inti=1;i<=month;i++)//闰年的计算方法
j+=numOfMonth2[i];
}
else
for(inti=1;i<=month;i++)//平年的计算方法
j+=numOfMonth[i];
returnj+day;
}
publicintnumOfYear(MyDatamd){
if(md.isLeapYear())
return366;
elsereturn365;
}
publicstaticintdiff(MyDatamd1,MyDatamd2){
intsd=md1.getYear()-md2.getYear();
intnumOfLeap=(sd-2)/4;//两个日期之间的闰年个数
intdifferent;
different=numOfLeap*366+(sd-numOfLeap-1)*365+md1.order()+(md2.numOfYear(md2)-md2.order());
returndifferent;
}
publicstaticvoidmain(String[]args){
MyDatamd=newMyData(2008,3,1);
MyDatamd2=newMyData(2004,3,1);
System.out.println(diff(md,md2));
}
}
【实验小结】
实验准备和过程
实验结果
实验报告
总分