循环和效率Java程序

时间:2016-02-24 02:39:51

标签: java

以下是我正在上课的项目。此赋值的目的是采用后缀表达式并将其转换为汇编语言指令。第一次运行后,我无法让循​​环打印出正确的指令。有人可以向我解释我做错了什么,因为我已经调试了一段时间而且我被卡住了?此外,由于我是java的新手,任何关于如何使我的程序更有效的评论或任何你想要指出的解释,我将不胜感激。我相信有更多的方法可以做到这一点,但请记住我是新的,我还没有学到的东西。

.txt输入文件上有什么:

AB + C- //循环1

ABC + - //循环2

AB-C + DEF - + $ //循环3

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;


public class PostfixConverter{

static int top = 0;
static  String [] mainStack = new String [100];

public static void main(String args[]) throws Exception{
 String string = null;
 String asterisk = "*";
 String divisor = "/";
 String plus = "+";
 String minus = "-";
 int temp =0;
 int directionCounter = 0;
 String load = "LD ";
 String multiply = "ML ";
 String add = "AD ";
 String div = "DV ";
 String subtract = "SB ";
 String store = "ST TEMP";
 String tempString = "TEMP";
 String [] directions = new String [100];
 String example = "AB+C-";
 PostfixConverter s = new PostfixConverter();

 try{
 //file reader code
 FileReader file = new FileReader     ("/Users/ChristopherSchubert/Desktop/PostfixMachineLangInput(1).txt");
 BufferedReader reader = new BufferedReader(file);


 String text = "";
 String line = reader.readLine();
 while (line!= null)
 {
    text += line;
    line = reader.readLine();
    example = text;

  //for loop to print directions 
  for (int i=0; i<example.length(); i++) {


     //get letter entered by user 1 by 1
     char letter  = example.charAt(i);

     //convert char to string
     String convertedChar = java.lang.String.valueOf(letter);

     //finds operands in order or priority
     //multiply character
     if (convertedChar.equals(asterisk)){
        String outcome;
        String multiplyReturn = PostfixConverter.multiply(string);
        String loadmulReturn = PostfixConverter.multiply(string);
        directions[directionCounter] = load + loadmulReturn;
        directionCounter++;
        directions[directionCounter] = multiply + multiplyReturn;
        directionCounter++;
        temp++;
        outcome = tempString + java.lang.String.valueOf(temp);
        directions[directionCounter] = store +     java.lang.String.valueOf(temp);
        directionCounter++;
        s.push(outcome);
        }


        //division character
        else if (convertedChar.equals(divisor)){
           String outcome;
           String divisionReturn = PostfixConverter.addition(string);
           String loaddivReturn = PostfixConverter.addition(string);
           directions[directionCounter] = load + loaddivReturn;
           directionCounter++;
           directions[directionCounter] = div + divisionReturn;
           directionCounter++;
           temp++;
           outcome = tempString + java.lang.String.valueOf(temp);
           directions[directionCounter] = store + java.lang.String.valueOf(temp);
           directionCounter++;
           s.push(outcome);
        }

        //addition character
        else if (convertedChar.equals(plus)){
           String outcome;
           String additionReturn = PostfixConverter.addition(string);
           String loadAddReturn = PostfixConverter.addition(string);
           directions[directionCounter] = load + loadAddReturn;
           directionCounter++;
           directions[directionCounter] = add + additionReturn;
           directionCounter++;
           temp++;
           outcome = tempString + java.lang.String.valueOf(temp);
           directions[directionCounter] = store + java.lang.String.valueOf(temp);
           directionCounter++;
           s.push(outcome);
        }

        //subtraction character
        else if (convertedChar.equals(minus)){
           String outcome;
           String subtractionReturn = PostfixConverter.addition(string);
           String loadsubReturn = PostfixConverter.addition(string);
           directions[directionCounter] = load + loadsubReturn;
           directionCounter++;
           directions[directionCounter] = subtract + subtractionReturn;
           directionCounter++;
           temp++;
           outcome = tempString + java.lang.String.valueOf(temp);
           directions[directionCounter] = store +  java.lang.String.valueOf(temp);
           directionCounter++;
           s.push(outcome);
        }

        //letter character
        else {
           s.push(convertedChar);
        }

  }

  //print out the instructions
  System.out.println("Assembly Directions are as follows: ");
  int printDirections = 0;
  for (int i=0; i< directionCounter; i++){
        System.out.println(directions[printDirections]);
        printDirections++;
  }
  printDirections=0;
  directionCounter=0;
  System.out.println("This is the end of the directions.");
  System.out.println("");
  directionCounter = 0;
  temp = 0;
  top = 0;

 }
}
 catch (FileNotFoundException exception)
 {
     System.out.println("The file was not found.");
   }
 }


 //multiply method
 public static String multiply(String a){
    String multVariable = PostfixConverter.pop(mainStack[top]);
    top--;
    return multVariable;
 }

 //addition method
 public static String addition(String a){

    String addVariable = PostfixConverter.pop(mainStack[top]);
    top--;
    return addVariable;
 }

 //subtraction method
 public static String subtraction(String a){
  String subVariable = PostfixConverter.pop(mainStack[top]);
  top--;
  return subVariable;
 }

 //division method
 public static String division(String a){
  String divVariable = PostfixConverter.pop(mainStack[top]);
  top--;
  return divVariable;
  }

 public static boolean empty(){
  if (top == -1)
     return true;
  else 
     return false;

 }

 public static String pop(String j){
  if (empty()){
     System.out.println("Stack Underflow");
     System.exit(1);
    }
   return mainStack[top - 1];
 }

 public void push (String x){
  if (top == 99){
     System.out.println("Stack Overflow");
     System.exit(1);
  }else
     mainStack[top] = x;
     top++;
 }//end push

}

以下是正在打印的内容:

循环1:

装配方向如下:

LD A

AD B

ST TEMP1

LD TEMP1

SB C

ST TEMP2

这是方向的结束。 //看起来是正确的

循环2:

装配方向如下:

LD A //从上面复制

AD B

ST TEMP1

LD TEMP1

SB C

ST TEMP2

LD B //第二个循环实际开始的地方

AD C

ST TEMP3

LD A

SB TEMP3

ST TEMP4

这是指示的结束。

1 个答案:

答案 0 :(得分:1)

我稍微改变了文件的读取方式,并包含了调整后的代码输出。如果这会产生预期结果,请告诉我:

 String line = "";

 while ((line = reader.readLine()) != null)
 {
    example = line;
    // Continue to process ...

编辑:这是一个更模块化的方法,它演示了我在评论中引用的内容(注意'processOperand()'的介绍,以及它如何使代码更具可读性)。它只是寻找公共代码并使其在各种情况下“可用”的一个示例(即每个操作调用相同的代码块传递唯一参数)

public class PostfixConverter {

    static int top = 0;
    static String[] mainStack = new String[100];

    final static String asterisk = "*";
    final static String divisor = "/";
    final static String plus = "+";
    final static String minus = "-";
    final static String store = "ST TEMP";

    static int temp = 0;
    static int directionCounter = 0;
    static String[] directions = new String[100];
    static PostfixConverter s = new PostfixConverter();
    static String tempString = "TEMP";

    public static void main(String args[]) throws Exception {

        String string = null;

        String load = "LD ";
        String multiply = "ML ";
        String add = "AD ";
        String div = "DV ";
        String subtract = "SB ";

        String example = "AB+C-";

        try {
            // file reader code
            FileReader file = new FileReader("....");
            BufferedReader reader = new BufferedReader(file);

            String line = "";

            while ((line = reader.readLine()) != null) {
                example = line;

                // for loop to print directions
                for (int i = 0; i < example.length(); i++) {

                    // get letter entered by user 1 by 1
                    char letter = example.charAt(i);

                    // convert char to string
                    String convertedChar = java.lang.String.valueOf(letter);

                    // finds operands in order or priority
                    // multiply character
                    if (convertedChar.equals(asterisk)) {

                        processOperand(PostfixConverter.multiply(string), PostfixConverter.multiply(string), load,
                                multiply);
                    }

                    // division character
                    else if (convertedChar.equals(divisor)) {
                        processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load, div);
                    }

                    // addition character
                    else if (convertedChar.equals(plus)) {
                        processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load, add);
                    }

                    // subtraction character
                    else if (convertedChar.equals(minus)) {
                        processOperand(PostfixConverter.addition(string), PostfixConverter.addition(string), load,
                                subtract);

                    }
                    // letter character
                    else {
                        s.push(convertedChar);
                    }

                }

                // print out the instructions
                System.out.println("Assembly Directions are as follows: ");
                int printDirections = 0;
                for (int i = 0; i < directionCounter; i++) {
                    System.out.println(directions[printDirections]);
                    printDirections++;
                }
                printDirections = 0;
                directionCounter = 0;
                System.out.println("This is the end of the directions.");
                System.out.println("");
                directionCounter = 0;
                temp = 0;
                top = 0;

            }
        } catch (FileNotFoundException exception) {
            System.out.println("The file was not found.");
        }
    }

    private static void processOperand(String postFileConverterOutput, String postFileConverterOutput2,
            String instruction1, String instruction2) {
        String outcome;
        String opReturn1 = postFileConverterOutput;
        String opReturn2 = postFileConverterOutput2;
        directions[directionCounter] = instruction1 + opReturn2;
        directionCounter++;
        directions[directionCounter] = instruction2 + opReturn1;
        directionCounter++;
        temp++;
        outcome = tempString + java.lang.String.valueOf(temp);
        directions[directionCounter] = store + java.lang.String.valueOf(temp);
        directionCounter++;
        s.push(outcome);
    }

    // multiply method
    public static String multiply(String a) {
        String multVariable = PostfixConverter.pop(mainStack[top]);
        top--;
        return multVariable;
    }

    // addition method
    public static String addition(String a) {

        String addVariable = PostfixConverter.pop(mainStack[top]);
        top--;
        return addVariable;
    }

    // subtraction method
    public static String subtraction(String a) {
        String subVariable = PostfixConverter.pop(mainStack[top]);
        top--;
        return subVariable;
    }

    // division method
    public static String division(String a) {
        String divVariable = PostfixConverter.pop(mainStack[top]);
        top--;
        return divVariable;
    }

    public static boolean empty() {
        if (top == -1)
            return true;
        else
            return false;

    }

    public static String pop(String j) {
        if (empty()) {
            System.out.println("Stack Underflow");
            System.exit(1);
        }
        return mainStack[top - 1];
    }

    public void push(String x) {
        if (top == 99) {
            System.out.println("Stack Overflow");
            System.exit(1);
        } else
            mainStack[top] = x;
        top++;
    }// end push

}

创建输出:

Assembly Directions are as follows: 
LD A
AD B
ST TEMP1
LD TEMP1
SB C
ST TEMP2
This is the end of the directions.

Assembly Directions are as follows: 
LD B
AD C
ST TEMP1
LD A
SB TEMP1
ST TEMP2
This is the end of the directions.

Assembly Directions are as follows: 
LD A
SB B
ST TEMP1
LD TEMP1
AD C
ST TEMP2
LD E
SB F
ST TEMP3
LD D
AD TEMP3
ST TEMP4
This is the end of the directions.