zoukankan      html  css  js  c++  java
  • 软件工程个人作业03

    1.设计思想:

    ① 在程序的开头询问需要的条件: 

    1>是否有乘除法;

    2>是否有括号(最多可以支持十个数参与计算);

    3>数值范围;

    4>加减有无负数;

    5>除法有无余数(若前面询问的有无乘除法为无,则不再询问);

    6>一共有多少个式子;

    ② 设定一个二维数组,大小为number(总式子数量)X 10;

    ③ 设定一个循环来监测有多少次有效的循环,当循环达到number时,结束程序;

    否则,对各个位进行随机取值,并保存在数组里,随机产生一个数字来判定式子是有几个数字组成的,并随机产生每两个数字之间的运算符号,并且输出,之后计算结果,并保存在变量result中,并予以输出。

    ④与此同时进行结果的运算,运用栈来进行运算,并进行输出,记录运算结果。

    2.源程序代码:

      1 import java.util.*;
      2 
      3 public class ThirdCalculate
      4 {
      5     int Operate(int a,char b,int c)
      6     {
      7         int d=0;
      8         
      9         if(b=='+')
     10         {
     11             d=a+b;
     12         }
     13         else if(b=='-')
     14         {
     15             d=a-b;
     16         }
     17         else if(b=='*')
     18         {
     19             d=a*b;
     20         }
     21         else if(b=='/')
     22         {
     23             d=a/b;
     24         }
     25         
     26         return d;
     27     }
     28     
     29     char Precede(char a,char b)
     30     {
     31         int x = 0,y = 0;
     32         char OPSET[]={')','+','-','*','/','('};
     33         
     34         for(int j=0;j<6;j++)
     35         {
     36             if(a==OPSET[j])
     37             {
     38                 x=j;
     39             }
     40             if(b==OPSET[j])
     41             {
     42                 y=j;
     43             }
     44         }
     45         
     46         if(x==0&&y==5)
     47         {
     48             return '$';
     49         }
     50         else if(x<y)
     51         {
     52             return '<';
     53         }
     54         else if(x>y)
     55         {
     56             return '>';
     57         }
     58         else
     59         {
     60             return '=';
     61         }
     62     }
     63     
     64     public static void main(String args[])
     65     {
     66         @SuppressWarnings("resource")
     67         Scanner in=new Scanner(System.in);
     68 //---------------要求规定---------
     69         System.out.print("请输入打印运算式的数量:");
     70         int number=in.nextInt();
     71         
     72         char symbollist[]=new char[4];
     73         System.out.print("①请问是否有乘除法(1:是 2:不是):");
     74         int flag=in.nextInt();
     75         if(flag==1)
     76         {
     77             symbollist[0]='+';
     78             symbollist[1]='-';
     79             symbollist[2]='*';
     80             symbollist[3]='/';
     81         }
     82         else
     83         {
     84             symbollist[0]='+';
     85             symbollist[1]='-';
     86             symbollist[2]='+';
     87             symbollist[3]='-';
     88         }
     89         
     90         System.out.print("②请问是否有括号(1:是 2:不是):");
     91         int boolbracket=in.nextInt();
     92         
     93         System.out.print("③请问需要数据范围是(先输入下界,后输入上界):");
     94         double min=in.nextDouble();
     95         double max=in.nextDouble();
     96         
     97         System.out.print("④请问加减有无负数(1:有 2.无):");
     98         int negative=in.nextInt();
     99         if(negative==2)
    100         {
    101             if(min<0)
    102             {
    103                 min=0;
    104             }
    105         }
    106         
    107         if(flag==1)
    108         {
    109             System.out.print("⑤除法有无余数(1:是 2:不是):");
    110             @SuppressWarnings("unused")
    111             int boolremainder=in.nextInt();
    112         }
    113         System.out.println();
    114         
    115         
    116         int space[][]=new int [number][10];
    117         int symtime,time,correctNumber=0;
    118         ThirdCalculate T=new ThirdCalculate ();
    119         
    120         for(time=0;time<number;)
    121         {
    122             for(int i=0;i<10;i++)
    123             {
    124                 space[time][i]=(int)(Math.random()*(max-min+1)+min);
    125             }
    126             
    127             //判断所生成的数组中是否和之前产生的数组完全一致
    128             int flag1=1;
    129             for(int i=0;i<time;i++)
    130             {
    131                 for(int j=0;j<10;j++)
    132                 {
    133                     if(space[time][j]==space[i][j])
    134                     {
    135                         flag1=0;
    136                     }
    137                     else
    138                     {
    139                         flag1=1;
    140                     }
    141                 }
    142             }
    143             
    144             //随机决定下面要产生的式子是由几个数字构成的
    145             int s=(int)(Math.random()*(10-2+1)+2);
    146             
    147             //随机运算符
    148             char p[]=new char [s-1];
    149             for(int i=0;i<s-1;i++)
    150             {
    151                 symtime=(int)(Math.random()*(3-0+1)+0);
    152                 p[i]=symbollist[symtime];
    153             }
    154 
    155             //除号后不能有0的存在
    156             for(int i=0;i<s-1;i++)
    157             {
    158                 if(p[i]=='/'&&space[time][i+1]==0)
    159                 {
    160                     flag1=0;
    161                     break;
    162                 }
    163             }
    164             
    165             if(flag1==1)
    166             {
    167                 if(boolbracket==1&&s!=2)
    168                 {
    169                     System.out.print("(");
    170                 }
    171                 
    172                 //若出现连续的除号,则在相应位置输出括号}
    173                 int br1[]=new int [s];
    174                 int br2[]=new int [s];
    175                 for(int i=0;i<s-1;i++)
    176                 {
    177                     br1[i]=0;
    178                     br2[i]=0;
    179                 }
    180                 for(int i=1;i<s-1;i++)
    181                 {
    182                     if(p[i-1]=='/'&&p[i]=='/')
    183                     {
    184                         br1[i-1]=1;
    185                         br2[i]=1;
    186                     }
    187                 }
    188                 
    189                 //使用栈来完成结果的运算
    190                 Stack<Integer> OPND=new Stack<Integer> ();
    191                 Stack<Character> OPTR=new Stack<Character> ();
    192                 OPTR.push('#');
    193                 
    194                 if(br1[0]==1)
    195                 {
    196                     System.out.print('(');
    197                     OPTR.push('(');
    198                 }
    199                 System.out.print(space[time][0]);
    200                 OPND.push(space[time][0]);
    201                 
    202                 for(int i=1;i<s;i++)
    203                 {
    204                     System.out.print(p[i-1]);
    205                     if(T.Precede(OPTR.peek(),p[i-1])=='<')
    206                     {
    207                         OPTR.push(p[i-1]);
    208                     }
    209                     else if(T.Precede(OPTR.peek(),p[i-1])=='>'||T.Precede(OPTR.peek(),p[i-1])=='=')
    210                     {
    211                             char c;
    212                             int a,b;
    213                             c=OPTR.pop();
    214                             a=OPND.pop();
    215                             b=OPND.pop();
    216                             OPND.push(T.Operate(a, c, b));
    217                     }
    218                     else if(T.Precede(OPTR.peek(),p[i-1])=='$')
    219                     {
    220                         OPTR.pop();
    221                     }
    222                     
    223                     if(br1[i]==1)
    224                     {
    225                         System.out.print('(');
    226                     }
    227                     
    228                     if(space[time][i]<0)
    229                     {
    230                         System.out.print('(');
    231                         System.out.print(space[time][i]);
    232                         OPND.push(space[time][i]);
    233                         System.out.print(')');
    234                     }
    235                     else
    236                     {
    237                         System.out.print(space[time][i]);
    238                         OPND.push(space[time][i]);
    239                     }
    240                     
    241                     if(br2[i]==1)
    242                     {
    243                         System.out.print(')');
    244                     }
    245                     
    246                     if(boolbracket==1&&i==(s-1)/2&&s!=2)
    247                     {
    248                         System.out.print(')');
    249                         if(T.Precede(OPTR.peek(),')')=='<')
    250                         {
    251                             OPTR.push(')');
    252                         }
    253                         else if(T.Precede(OPTR.peek(),')')=='>'||T.Precede(OPTR.peek(),')')=='=')
    254                         {
    255                                 char c;
    256                                 int a,b;
    257                                 c=OPTR.pop();
    258                                 a=OPND.pop();
    259                                 b=OPND.pop();
    260                                 OPND.push(T.Operate(a, c, b));
    261                         }
    262                         else if(T.Precede(OPTR.peek(),p[i-1])=='$')
    263                         {
    264                             OPTR.pop();
    265                         }
    266                     }
    267                 }
    268                 
    269                 int realResult=OPND.peek();
    270                 System.out.print("=");
    271                 System.out.print("  请输入您认为正确的结果:");
    272                 int yResult=in.nextInt();
    273                 
    274                 if(yResult==realResult)
    275                 {
    276                     System.out.println("结果正确");
    277                     correctNumber++;
    278                 }
    279                 else
    280                 {
    281                     System.out.println("  结果错误,正确答案为:"+realResult);
    282                 }
    283                 
    284                 time++;
    285             }
    286         }
    287         System.out.println("您答对的题数为"+correctNumber);
    288     }
    289 }

    3.运行结果截图 :

    4.工作照片

    5.编程总结分析:

      经过这次编程,我感觉到了数据结构的作用,最然当时学的时候感觉用处不大,但是现在才发现,在实际编程序当中,其中的一些结构还是非常有用的,如栈、链表、二叉树,用好这些结构可以使我们的程序变得更加条理清楚,思路清晰,也更易实现。

    6.项目计划总结:

      听课 编写程序 阅读课本 准备考试 日总结
    周日     60   60
    周一 120 60     180
    周二          
    周三   120     120
    周四          
    周五     60   60
    周六   420     420
    周总结 120 600 120   840

    7.时间记录日志:

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/20 16:00 17:00   60 读书 构建之法
    3/21 8:00 10:10 20 100 上课  
      14:00 15:00     写程序 想大概思路
    3/23 16:00 18:00   120 写程序  
    3/25 15:00 15:30   30 读书  
    3/26 9:30 19:00 120 420 写程序  
                 
                 

    8.缺陷记录日志:

    日期 编号 引入阶段 排除阶段 描述
    3/26 01 编码 编码 java中栈的使用和分析
      02 编码 编码 变量类型使用错误,前后不符合
      03 编码 编码 计算结果时没有进行整体上的分析
      04 设计 设计 分类讨论时出现错误,没考虑完全
  • 相关阅读:
    bzoj1014: [JSOI2008]火星人prefix
    bzoj1934: [Shoi2007]Vote 善意的投票&&bzoj2768:[JLOI2010]冠军调查
    bzoj2705: [SDOI2012]Longge的问题
    bzoj4653: [Noi2016]区间
    bzoj2456: mode
    bzoj5018: [Snoi2017]英雄联盟
    关于树论【左偏树】
    caioj1522: [NOIP提高组2005]过河
    caioj1421&&hdu2167: [视频]【状态压缩】选数
    Linux下全局安装composer方法
  • 原文地址:https://www.cnblogs.com/Daddy/p/5323866.html
Copyright © 2011-2022 走看看