判短算式表达式正错

package compiling;
import java.util.Random;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.lang.StringBuilder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;

/**
 *
 * @author weifeng
 */
public class Compiling {
    
    //private static LinkedList<String> operators=new LinkedList<>(); //用于记录操作符
    //private static LinkedList<String> output=new LinkedList<>();//用来记录输出
    //private static StringBuilder sb=new StringBuilder();//用来记录后缀表达式

    /**
     * @param args the command line arguments
     */
    static String path1 = "C:\\Users\\weifeng\\Desktop\\结果.txt";
    static String path = "C:\\Users\\weifeng\\Desktop\\算术表达式.txt";
    static String path2 = "C:\\Users\\weifeng\\Desktop\\错误.txt";
    static String path3 = "C:\\Users\\weifeng\\Desktop\\检查结果.txt";
    static int n=0;
    
    public static void main(String[] args) throws IOException {
        while(true){
            System.out.println("                          ");
            System.out.println("请做出以下选择:");
            System.out.println("1,生成40道正确的算术表达式");
            System.out.println("2,生成40道错误的算术表达式");
            System.out.println("3,将算术表达式中缀转后缀");
            System.out.println("4,判断错误的正确表达式");
            System.out.println("0,退出");
            System.out.println("                          ");
            int x;
            System.out.print("你的选择是:");
            Scanner input = new Scanner(System.in);
            x = input.nextInt();
            switch(x){
                case 1:
                {
                    FileWriter fc =new FileWriter(path);
                    //FileWriter fcc =FileWriter(fc);
                    //BufferedWriter fccc =BufferedWriter(fcc);
                    int i =0;
                    while(i<=40){
                        i++;
                        String CC ="";
                        String DD =getnumberset(CC);
                        System.out.println(DD);
                        fc.write(DD+"\r\n");
                        //fccc.flush();
                    }
                    fc.close();
                    break;
                }
                case 2:
                    {
                    FileWriter fe =new FileWriter(path2);
                    int i =0;
                    while(i<=40){
                        i++;
                        String MM ="";
                        String NN =wrong(MM);
                        System.out.println(NN);
                        fe.write(NN+"\r\n");
                        //fccc.flush();
                    }
                    fe.close();
                    break;
                }
                    
                case 3:
                    changefirst();
                    break;
                case 4:
                    analysefirst();
                    break;
                case 0:
                    return;
                default:
                    break;
            }
        
        }
       
        //analysefirst();
                
    }

    public static String getnumberset(String AA){     //随机生成算术表达式
        
        String numberset="";
        String BB="";
        String[] A ={"+","-","*","/"};
        //生成最简单的运算式子
        int max=1000;
        int min=0;
        Random random =new Random();
        //随机生成1000以内的数字
        n++;
        if(n<6){
        boolean flag =random.nextBoolean();
        int number =random.nextInt(max)%(max-min+1)+min;
        //int number2 =random.nextInt(max)%(max-min+1)+min;
        int rand =(int)(Math.random()*A.length);
        if (flag==true){
            numberset ="("+String.valueOf(number)+String.valueOf(A[rand])+getnumberset(BB)+")";
            return numberset;
        }
        else{
            numberset =String.valueOf(number)+String.valueOf(A[rand])+getnumberset(BB);
            return numberset;   
        }}
        else{
            n=0;
            int rands =(int)(Math.random()*A.length);
            int number1 =random.nextInt(max)%(max-min+1)+min;
            int number2 =random.nextInt(max)%(max-min+1)+min;
            boolean flag1 =random.nextBoolean();
            if(flag1==true){
            numberset =String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2);
            return numberset;}
            else{
                numberset ="("+String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2)+")";
                return numberset;              
            }
                    }
        //number1=String.valueOf(rands);                             
    }
       
    public static void changefirst() throws FileNotFoundException, IOException{  //从文件中读取并将中缀转后缀写入新的文件
        FileWriter fw = new FileWriter(path1);
        File file = new File(path);
        FileReader reader = new FileReader(file);
        BufferedReader breader = new BufferedReader(reader);
        String C = "";
        while((C = breader.readLine())!=null){
            System.out.println(C);    
            System.out.print("中缀转后缀为:");
            System.out.println(changesecond(C));
            fw.write("中缀:"+C+"\r\n");
            fw.write("后缀:"+changesecond(C)+"\r\n");
        }
        breader.close();
        fw.close();
    }

  
    
    public static String wrong(String EE){//随机生成错误的正确表达式
        String numberset="";
        String FF="";
        String[] A ={"+","-","*","/","(",")","++","+-","**","/*","+*"};
        //生成最简单的运算式子
        int max=1000;
        int min=0;
        Random random =new Random();
        //随机生成1000以内的数字
        n++;
        if(n<6){
        boolean flag =random.nextBoolean();
        int number =random.nextInt(max)%(max-min+1)+min;
        //int number2 =random.nextInt(max)%(max-min+1)+min;
        int rand =(int)(Math.random()*A.length);
        if (flag==true){
            numberset ="("+String.valueOf(number)+String.valueOf(A[rand])+wrong(FF)+")";
            return numberset;
        }
        else{
            numberset =String.valueOf(number)+String.valueOf(A[rand])+wrong(FF);
            return numberset;   
        }}
        else{
            n=0;
            int rands =(int)(Math.random()*A.length);
            int number1 =random.nextInt(max)%(max-min+1)+min;
            int number2 =random.nextInt(max)%(max-min+1)+min;
            boolean flag1 =random.nextBoolean();
            if(flag1==true){
            numberset =String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2);
            return numberset;}
            else{
                numberset ="("+String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2)+")";
                return numberset;              
            }
                    }
    }
    
    public static void analysefirst() throws FileNotFoundException, IOException{   //分析错误的算术表达式
        File a =new File(path2);
        FileReader areader = new FileReader(a);
        BufferedReader abreader = new BufferedReader(areader);
        String W ="";
        while(( W= abreader.readLine())!=null){
            int rcount =0; //右括号数
            int lcount =0; // 
            System.out.println(W);
            System.out.println("判断:");
            for(int i=0;i<W.length();i++){
                if(i<W.length()-1){
                if(W.charAt(i)=='('){
                    lcount=lcount +1;
                    if(W.charAt(i+1)==')'){System.out.println("第 "+i+" 字符 ( 后缺少运算表达式");}}
                if(W.charAt(i)==')'){
                    rcount=rcount +1;
                    if(rcount>lcount){System.out.println("第 "+i+" 字符括号 ) 与前面括号不匹配");}
                    if(W.charAt(i+1)!='-'&& W.charAt(i+1)!='+'&& W.charAt(i+1)!='/'&& W.charAt(i+1)!='*'&&W.charAt(i+1)!='('&& W.charAt(i+1)!=')'){
                        System.out.println("第 "+i+" 个字符 ) 后不能直接出现数字");
                    }
                    if(W.charAt(i+1)=='('){System.out.println("第 "+i+" 个字符 ) 后不能直接出现 (");}
                }
                if(W.charAt(i)=='+'||W.charAt(i)=='-'||W.charAt(i)=='/'||W.charAt(i)=='*'||W.charAt(i)=='('){
                    if(W.charAt(i+1)=='+'||W.charAt(i+1)=='-'||W.charAt(i+1)=='/'||W.charAt(i+1)=='*'){
                        System.out.println("第 "+i+"  字符运算符号后缺少运算值");
                    }
                }
                if(W.charAt(i)!='-'&& W.charAt(i)!='+'&& W.charAt(i)!='/'&& W.charAt(i)!='*'&&W.charAt(i)!='('&& W.charAt(i+1)!=')'){
                    if(W.charAt(i+1)=='(')
                        System.out.println("第 "+i+" 数值后面不能直接添加 ( ");
                }
            }
                if(i==W.length()-1){
                    if(W.charAt(i)=='('){lcount++;}
                    if(W.charAt(i)==')'){rcount++;}
                    if(W.charAt(i)=='+'||W.charAt(i)=='-'||W.charAt(i)=='/'||W.charAt(i)=='*'){
                        System.out.println("最后一个运算符号右边缺少运算值");
                    }
                    
                    if(lcount!=rcount)
                        System.out.println("最后一个括号与前面不匹配");
                }
            }
            
            }
             
        abreader.close();
    }
    
    
    public static String changesecond(String exp) throws IOException{
        Stack<Character> s = new Stack<Character>(); // 要输出的后缀表达式字符串
        String suffix = "";
        int length = exp.length(); // 输入的中缀表达式的长度
        for (int i = 0; i < length; i++) {
            
            char temp;
            char ch = exp.charAt(i);
            switch (ch) {
                case ' ':
                    break;
                case '(':
                    s.push(ch);
                    break;
 
                case '+':
                case '-':
                    while (s.size() != 0) {
                        temp = s.pop();
                        if (temp == '(') {
                            s.push('(');
                           break;
                        }
                        suffix += temp;                     
                    }
                    s.push(ch);
                    break;
                    
                case '*':
                case '/':
                    while (s.size() != 0) {
                        temp = s.pop();
                        if (temp == '+' || temp == '-' || temp == '(') {
                            s.push(temp);
                            break;
                        } 
                        else {suffix += temp; }
                    }
                    s.push(ch);
                    break;
                    
                case ')':
                    while (!s.isEmpty()) {
                        temp = s.pop();
                        if (temp == '(') {
                            break;
                        } 
                        else { suffix += temp;}
                    }
                    break;
                    
                default:
                    suffix +=ch;
                    if(i+1<exp.length()){
                    char nu=exp.charAt(i+1);
                    if(nu == '-'||nu=='+'||nu=='/'||nu=='*'){
                        suffix +=" ";break;}
                    else break;
                    }                      
            }
        }
        while (s.size() != 0) {
            suffix += s.pop();
        }
        return suffix;
    }   
}

运行结果:

图片1.png
图片2.png
图片3.png
图片4.png
图片5.png
图片6.png
图片7.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • 第一:新三板在未来将会成为中国的主要资本市场。总市值将超越主板。可以选择标的多。大量优质企业,将会成为中国股权资本...
    孟斌阅读 196评论 0 1
  • 陌陌一生阅读 132评论 0 0
  • 你对别人好,别人未必领情。相反的,他们把这当做理所当然。于是你就一直处在“被欺负中”,终于,你忍无可忍,而他们就认...
    罗掌柜real阅读 290评论 0 0