计科1101JavaExp3左子娟.docx
《计科1101JavaExp3左子娟.docx》由会员分享,可在线阅读,更多相关《计科1101JavaExp3左子娟.docx(43页珍藏版)》请在冰豆网上搜索。
计科1101JavaExp3左子娟
《Java语言程序设计》实验报告
实验序号:
三
实验项目名称:
编程解题(1、2、3、4、5、6)
学 号
1109050119
姓 名
左子娟
专业、班
计科1101
实验地点
中四#612
指导教师
韩志农
时间
2013.4.20
1、实验目的及要求
1、进一步熟练Java语法和常用方法的使用;
2、进一步熟练Java程序结构;
3、进一步提高算法设计与实现的能力;
4、为后续章节的学习打下坚实的基础;
2、实验设备(环境)
1、硬件:
win7系统
2、软件:
MyEclipse8.5
3、实验内容与步骤
编程题目:
1、随机生成100个0到200的整数(包括0和200),用折半查找法(二分法)查找50是第几个数,并输出查找过程(即和什么数进行了比较)。
(输出排序之前的序号)
(折半查找是在已经排序的数据中做的查找,所以先要排序。
有可能找不到50,有可能找到多个50,这些情况都要考虑)
2、写一个斗地主的发牌程序(黑桃、红心、梅花和方块的对应Unicode值为\u2660\u2665\u2663\u2666,先生成一副按顺序排放的54张牌,放入字符串中,然后用随机方法取,取一张删一张)
3、显示任意一个月份的日历(年份>1900)(一周一行,要有月名、表头和横线。
按列右对齐,用String.format("%1$4d",intNumber)可以将任意整数intNumber格式化成前面补“空格”的4位定长字符串)
4、显示出任一年份的日历(年份>1900)
5、用数组模拟实现一个50个字符串的堆栈,并使这个堆栈有如下方法和参数:
myStack:
数组名,使用时不能直接对这个数组进行存取操作,存取操作都通过pop()和push()等方法完成。
实现pop():
弹出
实现push():
压入
实现isFull():
是否已满
实现isEmpty():
是否为空
实现length():
已有多少元素
要点:
要将代码设计成有通用性,也就是说要考虑各种可能的情况,考虑越多,你的程序就越稳定可靠,高可靠性的代码一直是一个开发人员追求的最高目标之一。
6、使用堆栈,将中缀算术表达式转换成后缀表达式。
A、表达式中只有+(加)、-(减)、×,/,%,(,)六种运算符
B、变量名为以英文字母开头的字母数字串
C、表达式中可以出现不带符号的常数
D、适当判断表达式中的语法错误
E、不计算结果
实验步骤:
1、题目分析
2、查找编程需要的资料
3、算法设计
4、程序代码编写
(1)题目1:
1、题目要求随机生成100个0~200的整数,并用折半查找50的位置
2、折半查找需首先对随机生成的200个随机数进行排序才能进行查找
3、程序用于折半查找的方法binarySearch()代码如下:
staticintbinarySearch(int[]myArray,intsearchkey)//二分查找
{
inthigh=myArray.length-1;//high记录比较的高位下标
intlow=0;//low记录比较的低位下标
intmid=0;//mid记录比较的中间下标,即需要进行与50进行比较的数的下标
while(high>=low)
{
mid=(high+low)/2;
if(myArray[mid]==searchkey)//找到返回mid+1,下标+1为50的位置
returnmid;
else
if(myArray[mid]<50)
low=mid+1;
else
high=mid-1;//找不到返回-1
}
return-1;
}
程序完整代码如下:
importjava.util.Arrays;
publicclassExp3_01{
publicstaticvoidmain(String[]args)
{
intsub=0;//记录随机生成数中50的位置
int[]myArray=newint[100];//存放100个随机数
myArray=getInts();//获取随机整数
Arrays.sort(myArray);//给随机数排序
sub=binarySearch(myArray,50);//用二分法找到50的位置并返回赋值给sub
System.out.print("排序后的随机数列:
");
disPlayArray(myArray);//输出100个随机数
displayKey(myArray,sub,50);
}
staticint[]getInts()//获取100个随机整数
{
int[]radomArray=newint[100];
for(inti=0;i<100;i++)
{
radomArray[i]=(int)(Math.random()*200);//获取的0~1之间的浮点数*200并转为整型
}
returnradomArray;//返回随机数数组
}
staticintbinarySearch(int[]myArray,intsearchkey)//二分查找
{
inthigh=myArray.length-1;//high记录比较的高位下标
intlow=0;//low记录比较的低位下标
intmid=0;//mid记录比较的中间下标,即需要进行与50进行比较的数的下标
while(high>=low)
{
mid=(high+low)/2;
if(myArray[mid]==searchkey)//找到返回mid+1,下标+1为50的位置
returnmid;
else
if(myArray[mid]<50)
low=mid+1;
else
high=mid-1;//找不到返回-1
}
return-1;
}
staticvoiddisPlayArray(int[]radomArray)//输出100个随机数
{
for(inti=0;i<100;i++)
{
if(i%5==0)
System.out.println();
System.out.print("radomArray["+i+"]="+radomArray[i]+""+"\t");
}
}
staticvoiddisplayKey(int[]myArray,intsub,intkey)//输出随机数中所有50的位置
{
inthigh=sub+1;
intlow=sub-1;
if(sub>0)//随机数中有50,则分两组分别向前和向后遍历并输出,直到找到一个不为50的数为止
{
System.out.println("\n\n随机生成的100个数中50是第"+(sub+1)+"个数!
");
while(myArray[low--]==key)//向前遍历
{
System.out.println("随机生成的100个数中50是第"+(low+2)+"个数!
");
}
while(myArray[high++]==key)//向后遍历
{
System.out.println("随机生成的100个数中50是第"+high+"个数!
");
}
}
else//随机数中没有50
System.out.println("\n\n随机生成的100个数中没有50!
");
}
}
(2)题目2:
1、题目要求编写斗地主的发牌程序
2、主要要解决的问题有:
54张牌的初始化、以及随机产生的三个玩家牌和底牌
3、经过各种分析设计,得到以下方法:
54张牌的初始化:
staticvoidgetcards(String[]cardbuffer)//获取54张扑克牌
{
for(inti=0;i<13;i++)//首先分13组获取52张牌,分别获取各花色的1~10以及J、Q、K
{
switch(i+1)
{case1:
//1~10各花色直接获取其花色+1~10
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
case10:
cardbuffer[4*i]=("黑桃"+(i+1));
cardbuffer[4*i+1]=("红桃"+(i+1));
cardbuffer[4*i+2]=("梅花"+(i+1));
cardbuffer[4*i+3]=("方块"+(i+1));
break;
case11:
cardbuffer[4*i]=("黑桃J");//11~13各花色获取其花色+J/Q/K
cardbuffer[4*i+1]=("红桃J");
cardbuffer[4*i+2]=("梅花J");
cardbuffer[4*i+3]=("方块J");
break;
case12:
cardbuffer[4*i]=("黑桃Q");
cardbuffer[4*i+1]=("红桃Q");
cardbuffer[4*i+2]=("梅花Q");
cardbuffer[4*i+3]=("方块Q");
break;
case13:
cardbuffer[4*i]=("黑桃K");
cardbuffer[4*i+1]=("红桃K");
cardbuffer[4*i+2]=("梅花K");
cardbuffer[4*i+3]=("方块K");
break;
}
}
cardbuffer[52]="Joker1";//最后获取大王小王,Joker1/Joker2
cardbuffer[53]="Joker2";
}
发牌:
staticvoiddealCards(String[]cardbuffer,String[]player1,String[]player2,String[]player3,String[]holeCards)
{//随机发牌
intrandom1=0;//三位玩家要发的牌的随机数
intrandom2=0;
intrandom3=0;
for(inti=0;i{
while(cardbuffer[random1]=="")random1=(int)(Math.random()*54);
player1[i]=cardbuffer[random1];//获取0~53的随机数,知道这个位置的牌不为空,发给玩家
cardbuffer[random1]="";//牌发给玩家后,将当前牌的值置为空
while(cardbuffer[random2]=="")random2=(int)(Math.random()*54);
player2[i]=cardbuffer[random2];
cardbuffer[random2]="";
while(cardbuffer[random3]=="")random3=(int)(Math.random()*54);
player3[i]=cardbuffer[random3];
cardbuffer[random3]="";
}
for(intj=0;j{
for(inti=0;i{
if(cardbuffer[i]!
="")
{
holeCards[j]=cardbuffer[i];
cardbuffer[i]="";
i=cardbuffer.length;
}
}
}
}
程序完整代码如下:
publicclassExp3_02{
publicstaticvoidmain(String[]args)
{
Stringcardbuffer[]=newString[54];//定义字符串型数组cardbuffer用来存放54张扑克牌
Stringplayer1[]=newString[17];//定义字符串型数组player1用来存放17张玩家1的扑克牌
Stringplayer2[]=newString[17];//定义字符串型数组player2用来存放17张玩家2扑克牌
Stringplayer3[]=newString[17];//定义字符串型数组player3用来存放12张玩家3扑克牌
StringholeCards[]=newString[3];//定义字符串型数组holeCards用来存放3张底牌
getcards(cardbuffer);//获取54张扑克牌
dealCards(cardbuffer,player1,player2,player3,holeCards);//随机发牌
System.out.println("玩家1的牌:
");//输出哥玩家的牌和底牌
showCards(player1);
System.out.println("玩家2的牌:
");
showCards(player2);
System.out.println("玩家3的牌:
");
showCards(player3);
System.out.println("底牌:
");
showCards(holeCards);
System.out.println();
}
staticvoidgetcards(String[]cardbuffer)//获取54张扑克牌
{
for(inti=0;i<13;i++)//首先分13组获取52张牌,分别获取各花色的1~10以及J、Q、K
{
switch(i+1)
{case1:
//1~10各花色直接获取其花色+1~10
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
case10:
cardbuffer[4*i]=("黑桃"+(i+1));
cardbuffer[4*i+1]=("红桃"+(i+1));
cardbuffer[4*i+2]=("梅花"+(i+1));
cardbuffer[4*i+3]=("方块"+(i+1));
break;
case11:
cardbuffer[4*i]=("黑桃J");//11~13各花色获取其花色+J/Q/K
cardbuffer[4*i+1]=("红桃J");
cardbuffer[4*i+2]=("梅花J");
cardbuffer[4*i+3]=("方块J");
break;
case12:
cardbuffer[4*i]=("黑桃Q");
cardbuffer[4*i+1]=("红桃Q");
cardbuffer[4*i+2]=("梅花Q");
cardbuffer[4*i+3]=("方块Q");
break;
case13:
cardbuffer[4*i]=("黑桃K");
cardbuffer[4*i+1]=("红桃K");
cardbuffer[4*i+2]=("梅花K");
cardbuffer[4*i+3]=("方块K");
break;
}
}
cardbuffer[52]="Joker1";//最后获取大王小王,Joker1/Joker2
cardbuffer[53]="Joker2";
}
staticvoiddealCards(String[]cardbuffer,String[]player1,String[]player2,String[]player3,String[]holeCards)
{//随机发牌
intrandom1=0;//三位玩家要发的牌的随机数
intrandom2=0;
intrandom3=0;
for(inti=0;i{
while(cardbuffer[random1]=="")random1=(int)(Math.random()*54);
player1[i]=cardbuffer[random1];//获取0~53的随机数,知道这个位置的牌不为空,发给玩家
cardbuffer[random1]="";//牌发给玩家后,将当前牌的值置为空
while(cardbuffer[random2]=="")random2=(int)(Math.random()*54);
player2[i]=cardbuffer[random2];
cardbuffer[random2]="";
while(cardbuffer[random3]=="")random3=(int)(Math.random()*54);
player3[i]=cardbuffer[random3];
cardbuffer[random3]="";
}
for(intj=0;j{
for(inti=0;i{
if(cardbuffer[i]!
="")
{
holeCards[j]=cardbuffer[i];
cardbuffer[i]="";
i=cardbuffer.length;
}
}
}
}
staticvoidshowCards(String[]cards)
{//输出扑克牌
for(inti=0;iSystem.out.print(cards[i]+"\t");
System.out.println();
System.out.println();
}
}
(3)题目3、4:
1、题目3要求是打印出月历,而题目4是年历,完成月历后,便可完成年历,故此将题目3、4一起做
2、日历的算法,是以1900年1月1日(星期一)为基数,在此基础上计算出所求日期离1900年1月1日(星期一)的天数推算出日历
4、经过各种分析设计,得到以下方法:
计算距离1900年1月1日(星期一)的天数:
staticlonggetTotledays(intyear,intmonth)//计算距离1900年1月1日的天数
{
longtotleDays=0;
for(inti=1900;i{
totleDays+=getYeardays(i);
}
for(inti=1;i{
totleDays+=getMonthdays(year,i);
}
returntotleDays;
}
打印出一个月的日历:
staticvoidcalendar(intyear,intmonth)//打印出一个月份的日历
{
intfirstday=1;//要打印日历的第一天,1900年1月1日作比较基点是星期一,firstday初始值是星期一
longtotleDays=getTotledays(year,month);
firstday=(int)(totleDays%7);//距离1900年1月1日的天数对7取模,所得即为第一天的星期数
System.out.println(""+year+"-"+month+"");
System.out.println("-----------------------------------");
System.out.println("SunMonTueWedThuFriSat");
for(inti=0;iSystem.out.print("");//在当月1号对应星期数之前的几天添加空格
for(inti=1;i<=getMonthdays(year,month);i++)//输出当月信息
{
System.out.print(String.format("%1$5d",i));
if((i+firstday)%7==0)
System.out.println();
}
}
程序完整代码如下:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassExp3_03{
publicstaticvoidmain(String[]args)
{
Stringstr1="请输入