判短算式表达式正错

2018-08-01  本文已影响0人  王古
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
上一篇下一篇

猜你喜欢

热点阅读