计科1101JavaExp3左子娟.docx
- 文档编号:25626973
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:43
- 大小:244.54KB
计科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;i System.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;i System.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="请输入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1101 JavaExp3 左子娟