”千辛万“苦计算器

  1 import java.util.Scanner;
  2 import java.math.*;
  3 public class jisuanqi {
  4     public static void main(String[] args) {
  5         jisuanqi ca=new jisuanqi();
  6         System.out.println("请在下面输入计算内容:\n按#退出");
  7         ca.shuru();
  8         System.out.println("\n\n\n---------------------------------谢谢使用!-------------------------------");
  9     }
 10     void shuru(){     //输入控制
 11         String shi="",temp;
 12         Scanner ss=new Scanner(System.in);
 13         while(true){
 14             shi="";
 15             while(true){
 16                 temp=ss.next();
 17                 shi+=temp;
 18                 if(temp.indexOf(‘#‘)!=-1 )return;
 19
 20                 if(temp.indexOf(‘=‘)!=-1){                //有等号
 21                     jiancha(shi);
 22                     System.out.println("------------------------------------------------------------------------\n请在下面输入计算内容:\n按#退出");
 23                     break;
 24                 }
 25             }
 26         }
 27     }
 28
 29     void jiancha(String s){   //表达式处理及检查
 30
 31         s=s.replaceAll(" |    ", "");               //移除空格、tab符
 32
 33         if(s.charAt(s.length()-1)!= ‘=‘){         //等号位置不正确
 34             System.out.println("表达式不正确,等号后面有多余表达项");
 35             return;
 36         }
 37
 38         if(s.length()!=           //保证只有一个=
 39             (s.replaceAll("=","")).length()+1){
 40             System.out.println("表达式不正确,含多个等号");
 41             return;
 42         }
 43         s=s.replaceAll("=", "");      //此处移除等号,形成表达式
 44
 45         char a;
 46         for(int i=0;i<s.length();i++){
 47             a=s.charAt(i);
 48
 49             if(  (a>‘9‘|a<‘0‘)&&a!=‘+‘&&a!=‘-‘    //表达式之外意外字符
 50                  &&a!=‘*‘&&a!=‘/‘&&a!=‘(‘&&a!=‘)‘
 51                     &&a!=‘.‘){
 52                 System.out.println("表达式不正确,含意外字符  \""+String.valueOf(a)+"\"!!!");
 53                 return;
 54             }
 55         }
 56
 57         if( (s.replaceAll("\\)", "").length()) !=                //保证括号有效对数  ,注意转义字符
 58             (s.replaceAll("\\(", "").length())    ){
 59             System.out.println("表达式不正确,括号不是有效对数!!!");
 60             return;
 61         }
 62
 63         if(s.replaceAll("    | ", "").length()==0){
 64             System.out.println("没有输入表达式");
 65             return;
 66         }
 67         String jg=cixu(s);
 68         if(jg.equals("#")) return;
 69         if(jg.charAt(0)==‘+‘){
 70             jg+=‘ ‘;
 71             jg=jg.substring(1, jg.length()-1);
 72         }
 73         System.out.println("结果为:   "+jg);
 74
 75     }
 76
 77     String cixu(String s){     //表达式计算优先级处理
 78         int d1,d2,k1=-1,k2=-1;
 79         String subs;
 80         boolean iskuo=false;
 81
 82         while(true){
 83             if( (k2=s.indexOf(‘)‘)  )!=-1   ){              //定位后括号位置
 84                 k1=k2;
 85                 while(k1>=0&s.charAt(k1)!=‘(‘ ){
 86                     k1--;
 87                     if(k1<0)break;
 88                 }
 89                 //定位前括号位置
 90                 if(k1==-1){        //  )(的情况
 91                     System.out.println("括号被没有被匹配");  //  )括号被没有匹配
 92                     return "#";
 93                 }
 94
 95
 96                 if(k1+1==k2){     //空括号情况
 97                     System.out.println("括号内不能为空");
 98                     return "#";
 99                 }
100                 if(     k1+2==k2&&(              //括号内只有操作符情况
101                         s.charAt(k1+1)==‘*‘|
102                         s.charAt(k1+1)==‘/‘|
103                         s.charAt(k1+1)==‘+‘|
104                         s.charAt(k1+1)==‘-‘|
105                         s.charAt(k1+1)==‘.‘
106                         )
107                 ){
108                     System.out.println("括号内不能没有数字");
109                     return "#";
110                 }
111                 subs=s.substring(k1+1, k2);
112                 if( subs.replaceAll("[+]|-|[*]|/", "").length()==subs.length()){
113                     if(k1==0&k2==s.length()-1)    s=subs;
114                     else if(k1==0)s=subs+s.substring(k2+1,s.length());
115                     else if(k2==s.length()-1)s=s.substring(0, k1)+subs;
116                     else s=s.substring(0, k1)+subs+s.substring(k2+1, s.length());
117                     continue;
118                 }
119                 iskuo=true;
120             }
121             else  {
122                 subs=s;
123                 //仅为某一无符数字时
124                 if( subs.replaceAll("[+]|-|[*]|/", "").length()==subs.length())return s;
125                 iskuo=false;
126             }
127
128             if(subs.indexOf(‘*‘)==0|subs.indexOf(‘/‘)==0){   //首部异常检查
129                 System.out.println("不能出现像  *或 /开头的数字  这样的表达");
130                 return "#";
131             }
132             if(   ( subs.charAt(subs.length()-1)<‘0‘|              //尾部异常检查
133                     subs.charAt(subs.length()-1)>‘9‘  )&&
134                     subs.charAt(subs.length()-1)!=‘.‘
135                     ){
136                 System.out.println("不能出现像  表达式 操作符  这样以操作符结尾的的表达");
137                 return "#";
138             }
139             //错误操作符组合检查
140             if( subs.replaceAll("[+][*]", "").length()!=subs.length() |
141                 subs.replaceAll("[-][*]", "").length()!=subs.length() |
142                 subs.replaceAll("[*][*]", "").length()!=subs.length() |
143                 subs.replaceAll("[/][*]", "").length()!=subs.length()  |
144                 subs.replaceAll("[+][/]", "").length()!=subs.length()  |
145                 subs.replaceAll("[-][/]", "").length()!=subs.length() |
146                 subs.replaceAll("[*][/]", "").length()!=subs.length() |
147                 subs.replaceAll("[/][/]", "").length()!=subs.length())
148             {
149                 System.out.println("不能出现像**、+*、//这样的表达");
150                 return "#";
151             }
152             //表达式为某一数值时不参与调用函数jisuan()
153             if(subs.replaceAll("[+]|-|[*]|/","").length()+1==subs.length()&&
154                 (subs.charAt(0)==‘+‘|subs.charAt(0)==‘-‘))
155             {
156                 if(iskuo){
157                     if(k1==0&k2==s.length()-1)s=subs;
158                     else if(k1==0)s=subs+s.substring(k2+1);
159                     else if(k2==s.length()-1)s=s.substring(0, k1)+subs;
160                     else s=s.substring(0, k1)+subs+s.substring(k2+1);
161                 }
162                 else s=subs;
163                 //判断总表达式是否仅仅为某一数值
164                 if(s.replaceAll("[+]|-", "").length()+1==s.length()
165                         && (s.charAt(0)==‘+‘|
166                             s.charAt(0)==‘-‘)
167                    )break;
168                 else continue;
169             }
170             if((subs.charAt(0)<=‘9‘&subs.charAt(0)>=‘0‘)|subs.charAt(0)==‘.‘)
171                 subs=‘+‘+subs;  //式子首部进行处理
172
173             d1=1;//定位第一个操作数最后一位,第一次取1
174             while(true){                            //对表达式的遍历处理
175                 while(  (subs.charAt(d1)>=‘0‘&      //定位第一个操作数最后一位
176                         subs.charAt(d1)<=‘9‘)|
177                         subs.charAt(d1)==‘.‘)
178                 {
179                     if(subs.length()-1==d1)break;
180                     else if( (subs.charAt(d1+1)<‘0‘|
181                             subs.charAt(d1+1)>‘9‘)&
182                             subs.charAt(d1+1)!=‘.‘  )break;
183                     else d1++;
184                 }
185
186                 d2=d1+1;//定位第二个操作符首位
187                 int i;
188                 for(i=d2;i<subs.length();i++){
189                     if((subs.charAt(i)<=‘9‘&subs.charAt(i)>=‘0‘)|subs.charAt(i)==‘.‘)break;
190                 }
191                 d2=i;
192
193                 if(d2-d1>3){
194                     System.out.println("在两数之间可能出现多个乘除或三个以上加减");
195                     return "#";
196                 }
197
198                 //标明数值正负
199                 if((subs.charAt(d1+2)<=‘9‘&&subs.charAt(d1+2)>=‘0‘)
200                         |subs.charAt(d1+2)==‘.‘){
201                     subs=insretplus(subs,d1+2);
202                     d2++;
203                 }
204
205                for(i=d2;i<subs.length();i++){
206                     if((subs.charAt(i)>‘9‘|subs.charAt(i)<‘0‘)&&subs.charAt(i)!=‘.‘)break;
207                }
208                if(  i>=subs.length()-1)break;
209                 d1=d2;
210             }
211             //以上保证了操作符与操作数的正确连接·
212             subs=jisuan(subs);
213             if(subs==""){
214                 System.out.println("不能出现除0的情况");
215                 return "#";    //出现除0的情况
216             }
217
218             if(iskuo){
219                 if(k1==0&k2==s.length()-1)s=subs;
220                 else if(k1==0)s=subs+s.substring(k2+1);
221                 else if(k2==s.length()-1){
222                     if(s.charAt(k1-1)==‘-‘&&           //考虑到去括号多出正负表示符
223                             (s.charAt(k1-2)==‘+‘|
224                             s.charAt(k1-2)==‘-‘|
225                             s.charAt(k1-2)==‘*‘|
226                             s.charAt(k1-2)==‘/‘)
227                         ){
228                             if(subs.charAt(0)==‘+‘){
229                                   subs+=‘ ‘;
230                                   s=s.substring(0, k1)+subs.substring(1, subs.length()-1);
231                             }
232                             else {
233                                  subs+=‘ ‘;  //防止出错
234                                  s=s.substring(0, k1-1)+‘+‘+subs.substring(1, subs.length()-1);
235                               }
236                     }
237                     else if( s.charAt(k1-1)==‘+‘&&           //考虑到去括号多出正负表示符
238                             (s.charAt(k1-2)==‘+‘|
239                              s.charAt(k1-2)==‘-‘|
240                              s.charAt(k1-2)==‘*‘|
241                              s.charAt(k1-2)==‘/‘)
242                         )s=s.substring(0, k1-1)+subs;
243                     else s=s.substring(0, k1)+subs;
244                 }
245                 else {
246                     if(s.charAt(k1-1)==‘-‘&&
247                             (s.charAt(k1-2)==‘+‘|
248                             s.charAt(k1-2)==‘-‘|
249                             s.charAt(k1-2)==‘*‘|
250                             s.charAt(k1-2)==‘/‘)
251                         ){
252                               if(subs.charAt(0)==‘+‘){
253                                      subs+=‘ ‘;
254                                      s=s.substring(0, k1)+subs.substring(1, subs.length()-1)+s.substring(k2+1,s.length()-1 );
255                               }
256                               else {
257                                   subs+=‘ ‘;  //防止出错
258                                   s=s.substring(0, k1-1)+‘+‘+subs.substring(1, subs.length()-1)+s.substring(k2+1,s.length()-1 );
259                               }
260                      }
261                     else if( s.charAt(k1-1)==‘+‘&&           //考虑到去括号多出正负表示符
262                             (s.charAt(k1-2)==‘+‘|
263                              s.charAt(k1-2)==‘-‘|
264                              s.charAt(k1-2)==‘*‘|
265                              s.charAt(k1-2)==‘/‘)
266                         )s=s.substring(0, k1-1)+subs+s.substring(k2+1,s.length() );
267                     else s=s.substring(0, k1)+subs+s.substring(k2+1,s.length() );
268                 }
269             }
270             else s=subs;
271             if(s.replaceAll("[+|-]", "").length()+1==s.length()
272                     &&(s.charAt(0)==‘+‘|s.charAt(0)==‘-‘)    )break;
273         }
274         return s;
275     }
276
277     String jisuan(String s){      //计算标准表达式
278         int you,p,b;
279         double pp,bb,jg;
280         String s1,s2,s3;
281
282         while((you=s.indexOf(‘*‘))!=-1){//乘优先级
283             p=you;     //获取前后两操作数在字符串的定位
284             b=you+2;
285             //定位前后操作数的位置
286             while(s.charAt(p)!=‘+‘&s.charAt(p)!=‘-‘)p--;
287             while(‘0‘<=s.charAt(b)&‘9‘>=s.charAt(b)|s.charAt(b)==‘.‘){
288                 if(b==s.length()-1)break;      //达到最后一位时,注意不要超限
289                 if(s.charAt(b+1)!=‘.‘&(s.charAt(b+1)<‘0‘|s.charAt(b+1)>‘9‘)) break;
290                 b++;
291             }
292
293             s1=s.substring(p,you);
294             s2=s.substring(you+1,b+1);
295
296             pp=Double.parseDouble(s1);    //第一个操作数
297             bb=Double.parseDouble(s2);     //第二个操作数
298             jg=pp*bb;
299             s3=s1+"*"+s2;
300             s3=s3.replaceAll("[+]", "[+]");  //此处用法特别注意,正则表达式用法
301             s3=s3.replaceAll("[*]", "[*]");
302             if(jg<0)s=s.replaceFirst(s3,String.valueOf(jg));
303             else s=s.replaceFirst(s3, "+"+String.valueOf(jg)); //正负号标准化
304         }
305
306         while((you=s.indexOf(‘/‘))!=-1){//乘优先级
307             p=you;
308             b=you+2;
309
310             while(s.charAt(p)!=‘+‘&s.charAt(p)!=‘-‘)p--;
311             while(‘0‘<=s.charAt(b)&‘9‘>=s.charAt(b)|s.charAt(b)==‘.‘){
312                 if(b==s.length()-1)break;
313                 if(s.charAt(b+1)!=‘.‘&(s.charAt(b+1)<‘0‘|s.charAt(b+1)>‘9‘)) break;
314                 b++;
315             }
316
317             s1=s.substring(p,you);
318             s2=s.substring(you+1,b+1);
319
320             pp=Double.parseDouble(s1);
321             bb=Double.parseDouble(s2);
322             if(bb==0) return "";
323
324             jg=pp/bb;
325             s3=s1+"/"+s2;
326             s3=s3.replaceAll("[+]", "[+]");
327             s3=s3.replaceAll("[/]", "[/]");
328             if(jg<0)s=s.replaceFirst(s3,String.valueOf(jg));
329             else s=s.replaceFirst(s3, "+"+String.valueOf(jg));
330         }
331
332         //加减运算
333         while(s.length()>s.replaceAll("[+]|[-]", "").length()+1){
334             p=0;
335             you=1;
336             while(‘0‘<=s.charAt(you)&‘9‘>=s.charAt(you)|s.charAt(you)==‘.‘){
337                 if(you==s.length()-1)break;
338                 if(s.charAt(you+1)!=‘.‘&(s.charAt(you+1)<‘0‘|s.charAt(you+1)>‘9‘)) break;
339                 you++;
340             }
341             you+=1;     //注意一第二个操作数提取的不同点
342             b=you+2;
343             while(‘0‘<=s.charAt(b)&‘9‘>=s.charAt(b)|s.charAt(b)==‘.‘){
344                 if(b==s.length()-1)break;
345                 if(s.charAt(b+1)!=‘.‘&(s.charAt(b+1)<‘0‘|s.charAt(b+1)>‘9‘)) break;
346                 b++;
347             }
348             s1=s.substring(p,you);
349             s2=s.substring(you+1,b+1);
350
351
352             pp=Double.parseDouble(s1);
353             bb=Double.parseDouble(s2);
354
355             if(s.charAt(you)==‘+‘){
356                 jg=pp+bb;
357                 s3=s1+"+"+s2;
358             }
359             else {
360                 jg=pp-bb;
361                 s3=s1+"-"+s2;
362             }
363             s3=s3.replaceAll("[+]", "[+]");
364             if(jg<0)s=s.replaceFirst(s3,String.valueOf(jg));
365             else s=s.replaceFirst(s3, "+"+String.valueOf(jg));
366         }
367         if(s.length()>10)s=s.substring(0, 11);
368
369         return s;
370     }
371
372     String insretplus(String s,int stratid){   //在指定位置前插入‘+’
373         String s1,s2;
374         s1=s.substring(0, stratid);
375         s2=s.substring(stratid, s.length());
376         return s1+‘+‘+s2;
377     }
378 }
时间: 2024-08-08 01:28:58

”千辛万“苦计算器的相关文章

个、十、百、千、万、亿、兆、京、垓、秭、穰、沟、涧、正、载

个.十.百.千.万.亿.兆.京.垓.秭.穰.沟.涧.正.载 他们的数值 个. 十.数字后1个0 百.数字后2个0 千.数字后3个0 万.数字后4个0 亿.数字后8个0 兆.数字后12个0 京.数字后16个0 垓.数字后20个0 秭.数字后24个0 穰.数字后28个0 沟.数字后32个0 涧.数字后36个0 正.数字后40个0 载.数字后44个0

千朵万朵,只为一人&mdash;&mdash;刘创

一 1948年元旦,天刚蒙蒙亮,鞭炮便连续不断地炸响在南京城的里里外外.一片喜气祥和的新年氛围中,谭祥面带愁容,轻轻地下了车,在瑟瑟寒风中挺直了身. 谭祥是来见干娘宋美龄的.昨晚与干娘通了电话,宋美龄在电话里说:"明天元旦,什么事非要大清早过来?"谭祥带着哭腔说:"不敢再拖了,再拖,辞修恐怕命都保不住了--" 辞修是她的丈夫,当时声名显赫的国民革命军陆军一级上将.国防部参谋总长.蒋介石的同乡--陈诚. 5个月前,蒋介石任命陈诚为东北行辕主任,调派70万大军进驻东北.

千兆/万兆网络自动切换脚本

需求:现在IDC需要改造万兆网络,由于是单链路,前期需要利用现有的千兆网络来做冗余,当万兆网络出问题以后自动切换到千兆环境,确保网络自动恢复: #!/bin/bash # * ******************************************************************************************************* # * Date: 2015-10-16 # * Author: Created by Ctry # * Email

千兆/万兆单向传输网卡

单向传输网卡一种计算机网络的单向传输网关,属于计算机网络技术领域.它包括发送方以太网光纤卡.接收方以太网光纤卡以及连接它们的网络光纤线.发送方以太网光纤卡的模块只有发送端口.接收方以太网光纤卡的模块只有接收口.发送卡的发送口与接收卡的接收口采用单条光纤连接.它既实现了计算机内部网络与外部网络之间的物理隔离,又能够保证数据在内外网络之间实时.可靠.安全地单向传输.配合软件使用,可广泛应用于公安.政务系统.军队等要害部门以及其它需要保密的计算机网络中. 主要功能 跨网域数据迁移 应用于内外网分离的企

千呼万呼使出来Gogland (jetBrains发布的golang IDE)

由于之前一直在用PyCharm在开发, 已经习惯了这个IDE. 转golang开发后一直没找到合适的debug功能的IDE,忽然听说jetBrains发布测试版golang IDE: Gogland带有debug功能还支持1.8, 马上下载来试试 1.安装 下载地址:https://www.jetbrains.com/go/download/#section=windows 点击上面"DOWNLOAD" 下载exe  ,  默认文件名为gogland-163.12024.32.exe

千找万找,终于找到错误了

HDU1102 (最小生成树) RE-栈溢出 了5遍: 1 int find_set(int x) 2 { 3 if(F[x] == x) 4 return x; 5 else 6 return find_set(F[x]); 7 } 8 int main() 9 { 10 ........... 11 repu(i,1,n+1) 12 F[i] = i;///本来是f[i] = -1,结果暴栈了,这不应该非法访问内存吗 13 ........... 14 } 百度之星1002,开始是RE-非法

推荐一篇关于java 学习的文章,感觉写的很不错

---恢复内容开始---    很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!     要想学好Java,首先要知道Java的大致分类.我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三块:J2SE,J2ME和J2EE, 这也就是SunONE(OpenNetEnvironment)体系.J2SE就是Java2的标准版,主要用于桌面应

黑皮切蛋糕

描述 众所周知,黑皮出生与1000年01月01日,那天乌云密布,电闪雷鸣,在黑光划破夜空的一瞬间,黑皮准确无误的生成了男孩.不妨给大家说声:由于他天生体黑,故取名为黑皮.^-^     为了庆祝黑皮的1006岁生日,也就是2006年01月01日.校长为他在学校里举行一个名为{天造奇才}的大型庆祝活动.邀请全校的师生及其家属们都参加.考虑到当时人数相当庞大,黑皮的好友小佳佳特地为他从美国进口了个超级无敌五香麻辣阴阳五行令万千饿鬼为之绝倒的巨无霸大蛋糕1号.供到场的所有人享用.     黑皮也考虑到

【原创】80后的痛有谁懂!

 路途拾荒 在这充满希望的年代,我们都在荒芜的岁月中追逐着梦想,尽管梦想很遥远,但在拾荒的路途中,我们痛并快乐着. 从呱呱坠地起,我们注定是被历史抛弃的一代.当我们辛辛苦苦小学六年,勤勤恳恳初中三年,废寝忘食高中三年,却赶上国家扩招,任他猫猫狗狗也都能混个大学文凭:当我们稀里糊涂大学混了四年,使尽浑身解数拿到英语四级证.计算机等级证.毕业证,却怎么也找不到如意的工作,有的连工作都找不到:当我们千心万苦进了外商独资企业当白领,才发现原来中国现在遍地都是外企,500强有499家在中国有分号:当我们福