《Java语言程序设计》实验报告
实验序号:3
实验项目名称: 熟练java语法、常用方法、程序结构
一、实验目的及要求
1、进一步熟练Java语法和常用方法的使用;
2、进一步熟练Java程序结构;
3、进一步提高算法设计与实现的能力;
4、为后续章节的学习打下坚实的基础;
二、实验设备(环境)
实验室计算机、windows xp系统、myeclipse
三、 实验内容与步骤
1.随机生成100个0到200的整数,用折半查找法(二分法)查找50是第几个数, 并输出查找过程(即和什么数进行了比较)。
(折半查找是在已经排序的数据中做的查找,所以先要排序)
2.显示任意一个月份的日历(>1900)(一周一行,要有月名、表头和横线。 按列右对齐, 用String.format("%1$ 4d",intNumber)可以将任意整数intNumber格式化成前面补“空格”的4位定长字符串)
3.显示出任一年份的日历(>1900)
4.用数组模拟实现一个50个字符串的堆栈,并使这个堆栈有如下方法和参数:
myStack:数组名,使用时不能直接对这个数组进行存取操作,存取操作都通过pop()和push()完成。
实现pop(): 弹出
实现push():压入
实现isFull():是否已满
实现isEmpty():是否为空
实现length():已有多少元素
要点:要将代码设计成有通用性,也就是说要考虑各种可能的情况,考虑越多,你的程序就越稳定可靠,高可靠性的代码一直是一个开发人员追求的最高目标之一。
5.使用堆栈,将中缀算术表达式转换成后缀表达式。
a) 表达式中只有+、-、×,/,%,(,)六种运算符
b) 变量名为以英文字母开头的字母数字串
c) 表达式中可以出现不带符号的常数
d) 适当判断表达式中的语法错误
e) 不计算结果
f) 参考:(算法描述)
1. 若遇到的是数字或小数点,则直接写入到strResult中 (strResult为结果字符串);
2. 若遇到的是左括号,则应把它压入到运算符栈中;
3. 若遇到的是右括号,把从栈顶直到保存着的对应左括号之间的运算符依次退栈并写入strResult串中;
4. 若遇到的是运算符:
4.1 当该运算符的优先级大于栈顶运算符的优先级时,进栈
4.2 若遇到的运算符的优先级小于或等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到strResult串中,应将栈顶运算符退栈并写入到strResult串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后让该运算符进栈即可。
四、实验结果与数据处理
程序代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class experiment_3{
static int intInputValue;
static String strInputValue;
static int length;
public static void main(String args[])
{
random();//第1题随机数排序查找的功能
calendar();//第二题日历的功能
String[] myString=new String[]{""};
System.out.print("请输入合法的中缀表达式:");
if(getStringInput(myString))
MidfixToSuffix(myString[0]);
}
static void random()
{
int[][] anArray;
anArray=new int[100][2];//二维数组,存取随机数和其固定编号
for(int i=0;i<100;i++)
{
anArray[i][0]=(int)(Math.random()*200)+1;//产生100个在1-200之间的随机数
anArray[i][1]=i+1;
}
System.out.println("随机产生的数为:");
for(int i=0;i<100;i++)//打印排序前的随机数
{
System.out.print(String.format("%1$ 5d",anArray[i][0]));
if((i+1)%20==0)
System.out.println();
}
BobbleSort(anArray);//调用排序函数对随机数进行排序
System.out.println("排序后的数为:");
for(int i=0;i<100;i++)
{
System.out.print(String.format("%1$ 5d",anArray[i][0]));
if((i+1)%20==0)
System.out.println();
}
int num=BinarySearch(anArray,50,anArray.length);//返回查找到的数的下标,没有则为-1
System.out.println();
if(num<0)
System.out.println("NO FOUND!");//输出查找失败信息
else
{
System.out.print("50是排序前的第");//输出该数为第几个数
int m=num;
for(int i=num;i>0;i--)
{
if(anArray[i][0]==50)
System.out.print(anArray[i][1]+" ");//输出该数为第几个数
}
for(int i=m+1;i<100;i++)
{
if(anArray[i][0]==50)
System.out.print(anArray[i][1]+" ");//输出该数为第几个数
}
System.out.println("个数");//输出该数为第几个数
}
}
static int BinarySearch(int[][] arr,int searchkey,int n)//二分查找算法
{
int low=0;
int high=n-1;
System.out.print("和50比较过的数依次为:");
while(low<=high)
{
int mid=(low+high)/2;
System.out.print(" "+arr[mid][0]);//每一次都是下标为mid的数和50比较
if(searchkey==arr[mid][0])
return mid;//如果找到,返回其编号
else
if(searchkey>arr[mid][0])
low=mid+1;
else
high=mid-1;
}
return -1;
}
static void BobbleSort(int[][] arr)//冒泡法排序
{
int i,j,change;
change=1;
j=arr.length-1;
while(j>0&&change==1)
{
change=0;
for(i=0;i<j;i++)
if(arr[i][0]>arr[i+1][0])//将随机数和其编号同时交换
{
int temp1=arr[i][0];
int temp2=arr[i][1];
arr[i][0]=arr[i+1][0];
arr[i][1]=arr[i+1][1];
arr[i+1][0]=temp1;
arr[i+1][1]=temp2;
change=1;
}
j--;
}
}
static void calendar()
{
int year1=0;
int month1=0;
if(getIntegerInput("请输入要查询日历的年月"+"\r"+"年份"))
year1=intInputValue;
if(getIntegerInput("月份"))
month1=intInputValue;
Output(year1,month1);//对特定的year1和month1的日历输出
int year2=0;
if(getIntegerInput("请输入要查询的全年日历的年份"))
year2=intInputValue;
for(int i=1;i<=12;i++)
Output(year2,i);//调用同一个函数,进20##年的12个月的日历输出
}
static void Output(int year,int month)//输出函数
{
int totalDays=0;
for(int y=1901;y<year;y++)
for(int m=1;m<=12;m++)
totalDays+=Day(y,m);
for(int m=1;m<month;m++)
totalDays+=Day(year,m);//在1991.1.1的基础上算当前日期是第几天
System.out.println(" "+year+"年"+month+"月");//打印表头和横线
System.out.println("----------------------------");
System.out.println(" 日 一 二 三 四 五 六");
int week=Week(totalDays);//表示当前月的第一天的星期
int day=Day(year,month);//当前月的天数
for(int i=0;i<week%7;i++)
System.out.print(" ");//打印1号前的空格
for(int i=1;i<=day;i++)
{
System.out.print(String.format("%1$ 4d",i));
if((i+week)%7==0) //依次打印出一个月的日期
System.out.println();
}
System.out.println("\r");
}
static int Week(int days)//计算某一天的星期
{
int week[]={1,2,3,4,5,6,7};
//int day_1991_1_1=week[1];//经查找,1901年1月1日是星期二
int theweek=week[(days+1)%7];
return theweek;
}
static int Day(int year,int month)//用来确定任意一年任意一月的天数
{
int numDays=0;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays=31;//大月的情况
break;
case 4:
case 6:
case 9:
case 11:
numDays=30;//小月的情况
break;
case 2://闰年的情况
if(((year%4==0)&&!(year%100==0))||(year%400==0))
numDays=29;
else
numDays=28;
break;
}
return numDays;
}
static boolean isEmpty(char[] stack)//判断栈是否为空
{
if (length==0)
return true;
return false;
}
static boolean isFull(char[] stack)//判断栈是否为满
{
if (length==50)
return true;
return false;
}
static int Length(char[] stack)//返回栈中元素个数
{
return length;
}
static char getTop(char[] stack) //返回栈顶元素
{
if (isEmpty(stack))
return '\0';
else
return stack[Length(stack) - 1];
}
static void pop(char[] stack) //出栈
{
if (isEmpty(stack))
return ;
length--;
return ;
}
static boolean push(char[] stack, char aChar)//入栈
{
if (isFull(stack))
return false;
stack[length++] = aChar;
return true;
}
static void MidfixToSuffix(String s)
{
char[] myStack=new char[50];
System.out.println("其后缀表达式为:");
for (int i = 0; i < s.length(); i++)
{
if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*'|| s.charAt(i) == '/'
|| s.charAt(i) == '%'|| s.charAt(i) == '(' || s.charAt(i) == ')')
{//如果是运算符则进一步判断
System.out.print(" ");
while (true) {
if (s.charAt(i) == '(') //是左括号则直接进栈
{
push(myStack,s.charAt(i));
break;
}
else if (s.charAt(i) == ')') //是右括号则栈中左括号上面的所有符号依次出栈
{
while (getTop(myStack) != '(')
{
System.out.print(getTop(myStack)+" ");
pop(myStack);
}
pop(myStack);
break;
}
else if (isEmpty(myStack)||getTop(myStack) == '(')
{
push(myStack, s.charAt(i));
break;
}
else if ((s.charAt(i) == '*' || s.charAt(i) == '/' || s.charAt(i) == '%')
&& (getTop(myStack) == '+' || getTop(myStack) == '-'))
{//根据运算符的优先级判断,如果是高优先级进栈
push(myStack, s.charAt(i));
break;
}
else
{
System.out.print(getTop(myStack));
pop(myStack);
}
}
}
else//运算变量直接输出
System.out.print(s.charAt(i));
}
while (!isEmpty(myStack)) //将栈中剩余的运算符直接输出
{
System.out.print(getTop(myStack));
pop(myStack);
}
}
static boolean getIntegerInput(String aPrompt) //返回值输入值
{//若返回false,则输入出错,输入的值不能用。若返回true,输入正确,输入值可以用
int anInteger=0;
String strInput=null;
try
{
System.out.print(aPrompt+": ");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
strInput=br.readLine();
anInteger=Integer.parseInt(strInput);
}
catch(IOException e)
{
System.out.println("IO错误!请重新运行程序。");
return false;
}
catch(NumberFormatException e)
{
System.out.println("你的输入可能有格式错误!请重新运行程序。");
return false;
}
intInputValue=anInteger;
return true;
}
static boolean getStringInput(String[] str)
{
// String strInput=null;
boolean isInputMistake = false;
try {
// System.out.print("请输入一个字符串: ");
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
str[0] = br.readLine();
} catch (IOException e) {
isInputMistake = true;
// System.out.println("IO错误!请重新运行程序。");
}
return !isInputMistake;
}
}
程序运行的结果: (复制到word中排版变混乱了)
随机产生的数为:
154 192 52 184 47 7 73 109 42 133 164 48 177 89 120 76 115 64 120 130
143 41 178 127 8 43 101 59 81 34 149 185 104 1 26 85 89 43 168 146
12 121 68 143 182 55 10 191 121 155 57 14 179 54 106 158 140 99 197 15
16 54 159 25 127 93 117 103 47 36 59 8 10 44 164 104 140 157 192 18
25 156 76 50 23 195 124 83 150 160 37 51 193 89 87 190 70 124 151 176
排序后的数为:
1 7 8 8 10 10 12 14 15 16 18 23 25 25 26 34 36 37 41 42
43 43 44 47 47 48 50 51 52 54 54 55 57 59 59 64 68 70 73 76
76 81 83 85 87 89 89 89 93 99 101 103 104 104 106 109 115 117 120 120
121 121 124 124 127 127 130 133 140 140 143 143 146 149 150 151 154 155 156 157
158 159 160 164 164 168 176 177 178 179 182 184 185 190 191 192 192 193 195 197
和50比较过的数依次为: 99 47 68 54 51 48 50
50是排序前的第85个数
请输入要查询日历的年月
年份: 2012
月份: 4
20##年4月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
请输入要查询的全年日历的年份: 2012
20##年1月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
20##年2月
----------------------------
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29
20##年3月
----------------------------
日 一 二 三 四 五 六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
20##年4月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
20##年5月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
20##年6月
----------------------------
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
20##年7月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
20##年8月
----------------------------
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
20##年9月
----------------------------
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
20##年10月
----------------------------
日 一 二 三 四 五 六
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
20##年11月
----------------------------
日 一 二 三 四 五 六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
20##年12月
----------------------------
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
请输入合法的中缀表达式:9+(8*5-6)%6-8/3
其后缀表达式为:9 8 5 *6 - 6 %+8 3/-
数据处理:
第1题:定义一个二维数组,用来存储产生的随机数和初始的编号,当用冒泡法排序的时候,其固定的编号也随之移动,再用二分查找法查找50的时候,将下标为mid的数输出即为依次比较过的数,如果找到50则将其编号输出即为其排序前所在的位置,如果没找到则输出提示信息。这道题的主要问题在于,如果产生了若干个50,如何都能打印出来,采用的方法是将二分查找出的第一个50的当前下标,再前后搜索还有没有50了,有就输出对应的原始下标。
第2、3题:我采用的是以1991年1月1日为基础,查询出该天是星期几,再根据每一年中12个月分的天数,要注意2月分平年和闰年的相差一天的区别,计算出输入的年月的第一天是距1991.1.1多少天,总天数mod7就可以得出第一天是周几,输出日历和时候就可以从计算出的星期几开始,依次打印出该月的所有天,第七个一行,第3题也就是将第2题的程序按照1-12月循环执行12次就可以得出最终的结果了。
第4、5题:这道题的关键是定义一个栈和一个数组,其中栈用来存放运算符,数组用来存放后缀表达式,从左到右扫描中缀表达式,是操作数就放进数组的末尾,如果是运算符的话,分为下面3种情况:1.如果是‘(’直接入栈。2.如果是‘)’,依次从栈中弹出运算符加到数组的末尾,直到遇到'('为止;3. 如果是非括号,比较扫描到的运算符,和栈顶的运算符。如果扫描到的运算符优先级高于栈顶运算符,则把运算符压入栈。否则的话,就依次把栈中运算符弹出加到数组的末尾,直到遇到优先级低于扫描到的运算符或栈空,并且把扫描到的运算符压入栈中。就这样依次扫描,直到结束为止。如果扫描结束,栈中还有元素,则依次弹出加到数组的末尾,就得到了后缀表达式。
五、 分析与讨论(体会、感想、意见、建议)
通过本次实验,对较大的程序的全局掌控有了一定的锻炼,进一步提升了在编程中分析问题,解决问题的能力。最大的感受就是要有耐心,面对一行行的代码,我们很容易浮躁,尤其是当没有思路难以下手的时候,非常而要一些恒心和毅力。这次实验,感觉在对一些数组的定义,使用方面还有更加待熟练,以前学的数据结构的知识,比如栈的使用有些遗忘了。这些还是多通过实验才能更好地掌握。编写了这几道题的代码,对养成变量命名以及代码的良好风格也有一定的帮助。总之在这次实验中收获颇多,也体会到了编程中细心、耐心、恒心的重要性,希望有今后的实验中有更多的进步。
说明:
1、 同学们可以直接在这个格式文件中填写你们的实验过程及结果;
2、 实验报告文件要统一命名格式:“电商0802_JavaExp1_姓名”,“计科0901_JavaExp1_姓名”,“电商0902_JavaExp1_姓名”,请注意,中间的分隔符是英文下划线。
3、 如果不按此格式命名,将拒收实验报告,改正后再上交;
4、 坚决杜绝抄袭,如果发现有抄袭者,实验报告为0分;(本课程最后成绩,实验占40%, 期末考试占60%
5、 按时完成报告,班干部收集,然后集中上交老师。请注意,一定不要直接交给老师,这样容易丢失。
7、“分析与讨论”部分通常会占10%至20%的分数。
河南省高等教育自学考试实验报告册计算机及应用专业(本科段)《JAVA》姓名所属地市实验地点实验日期实验总成绩指导教师签名实验单位(…
五子棋JAVA实验报告一实验目的和要求1能够用编程语言实现一个简单的五子棋程序2在实际系统中使用实现人工智能的相关算法3进一步加深…
信息工程学院Java程序设计实习报告JAVA图形用户界面实验六Java图形用户界面1实验目的1掌握图形用户界面基本组件2了解如何使…
北京联合大学信息学院“面向对象程序设计”课程上机实验报告题目:JAVA上机实验心得体会姓名(学号):专业:计算机科学与技术编制时间…
Java语言程序设计实验报告实验序号3一实验目的及要求1进一步熟练Java语法和常用方法的使用2进一步熟练Java程序结构3进一步…
石家庄学院习报告王荣传20xx0502027数学与信息科学系信息与计算科学专业本科一班崔永刚讲师姓名:学号:院系:专业:班级:指导…
java实训个人总结短短的一个月很快就过去了在这短短的一个月里我学到了很多了解了很多在这一个月里我学到了有关JAVA等方面的知识了…
辽宁建筑职业学院Java高级应用实训报告课题名称婚庆公司网站专业软件技术班级xxxxxxxxxx学号姓名xxxx指导教师xxx二O…
Java程序设计实训报告实训名称图书管理系统实训专业计算机应用技术班级学号090443220姓名高宇国指导教师侯丽敏20xx年12…
Java程序设计实训报告实训名称仓库管理系统实训专业计算机应用班级计算机10A1学号姓名指导教师侯丽敏20xx年12月8日实训成绩…
实验报告计算机与信息工程学院实验中心学期20xx20xx课程名称Java程序设计实验班级信息1202姓名方逸梅学号12121002…