Java实验报告

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);//对特定的year1month1的日历输出

       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];//经查找,190111日是星期二

       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%的分数。

相关推荐