软件工程个人作业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 设计 设计 分类讨论时出现错误,没考虑完全
原文地址:https://www.cnblogs.com/Daddy/p/5323866.html