2013-10-24 6 views
-2

Когда я делаю разные комбинации, такие как d-c + a + b, он дает мне число inccorect, например, 118.0. Может кто-нибудь сказать мне, где в моем коде мои расчеты не правы .. СпасибоОшибка ввода

ValVarPairs.txt содержит эти номера-> а = 100, B = 5, с = 10, d = 13 Это то, что я закодированы.

package com.ecsgrid; 

import java.io.*; 

public class testC { 

public static void main(String[] args) { 
    int i = 0,j = 0; 
    double result, values[] = new double[4]; 
    char k, operators[] = new char[3]; 
    for (i = 0; i <= 2; i++) 
    operators[i] = '+';  // default is to add the values 

    File myfile; 
    StreamTokenizer tok; 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    String InputText; 

    i = 0; 
    try { 
    myfile = new File("C:\\VarValPairs.txt"); 
    tok = new StreamTokenizer(new FileReader(myfile)); 
    tok.eolIsSignificant(false); 

    while ((tok.nextToken() != StreamTokenizer.TT_EOF) && (i <= 3)){ 
     if ((tok.ttype == StreamTokenizer.TT_NUMBER)) 
     values[i++] = tok.nval; 
     } 
    } 
    catch(FileNotFoundException e) { System.err.println(e); return; } 
    catch(IOException f) { System.out.println(f); return; } 

    System.out.println("Enter letters and operators:"); 

    try { 
    InputText = in.readLine(); 
    } 
    catch(IOException f) { System.out.println(f); return; } 

    for (i = 0; i < InputText.length(); i++) 
    { 
    k = InputText.charAt(i); 
    if ((k == '+') || (k == '-')) 
    { 
     if (j <= 2) operators[j++] = k; 
    } 
    } 

    result = values[0]; 
    for (i = 0; i <= 2; i++){ 
    if (operators[i] == '+') 
    result = result + values[i+1]; 
    else 
    result = result - values[i+1]; 
    } 
    System.out.println(result); 
} 
} 
+0

сделать некоторые отладки – Nishant

+0

научиться использовать отладчик – segfault

+0

Не размещать дубликаты, как это снова. –

ответ

1

Давайте это немного, добавьте несколько системных ауты ...

это то, что вы увидите на каждом этапе 100,0 - 5,0 95,0 + 10,0 105,0 + 13,0 118,0

ваш массив значений {100,5,10,13}, а ваш операторский массив - {-, +, +}

Вы не картировали a = 100, b = 5, c = 10, d = 13, если только вы сопоставьте те, которые затем анализируют операнды, используя сопоставление, основанное на ключах ввода не операндов, это не сработает.

Итак, если бы я использовал значения символа, я мог бы перевести его таким образом.

import java.io.*; 

public class TestC { 

    public static void main(String[] args) { 
     int i = 0, j = 0; 
     double result, values[] = new double[4]; 
     char k, operatorsAndOperands[] = new char[3]; 
     for (i = 0; i <= 2; i++) 
      operatorsAndOperands[i] = '+'; // default is to add the values 

     File myfile; 
     StreamTokenizer tok; 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String InputText; 

     i = 0; 
     try { 
      myfile = new File("C:\\VarValPairs.txt"); 
      tok = new StreamTokenizer(new FileReader(myfile)); 
      tok.eolIsSignificant(false); 

      while ((tok.nextToken() != StreamTokenizer.TT_EOF) && (i <= 3)) { 
       if ((tok.ttype == StreamTokenizer.TT_NUMBER)) 
        values[i++] = tok.nval; 
      } 
      for (int l = 0; l < values.length; l++) { 
       System.out.println(values[l]); 
      } 
     } catch (FileNotFoundException e) { 
      System.err.println(e); 
      return; 
     } catch (IOException f) { 
      System.out.println(f); 
      return; 
     } 

     System.out.println("Enter letters and operators:"); 

     try { 
      InputText = in.readLine().toUpperCase(); 
     } catch (IOException f) { 
      System.out.println(f); 
      return; 
     } 

     if(InputText.length() > 0){ 
      operatorsAndOperands = new char[InputText.length()]; 
     } else { 
      System.out.println("No Operations specified"); 
      return; 
     } 
     for (i = 0; i < InputText.length(); i++) { 
      k = InputText.charAt(i); 
      operatorsAndOperands[j++] = k; 
     } 

     result = 0; 
     for (i = 0; i < operatorsAndOperands.length; i++) { 
      System.out.println(operatorsAndOperands[i] + " " + (int)operatorsAndOperands[i]); 
      if(i+1<operatorsAndOperands.length) 
       System.out.println(operatorsAndOperands[i+1]); 
      switch(operatorsAndOperands[i]){ 
      case '+': 
       if(operatorsAndOperands[i+1] != '+' && operatorsAndOperands[i+1] != '-'){ 
        result+=values[(int)operatorsAndOperands[i+1] - (int)'A']; 
        i++; 
       } 
       break; 
      case '-': 
       if(operatorsAndOperands[i+1] != '+' && operatorsAndOperands[i+1] != '-'){ 
        result-=values[(int)operatorsAndOperands[i+1] - (int)'A']; 
        i++; 
       } 
       break; 
      default: 
       result = values[(int)operatorsAndOperands[i] - (int)'A']; 
       break; 
      }; 
      System.out.println(result); 
     } 
     System.out.println(result); 
    } 
} 
+0

Как мне его отобразить? – soupi7

+0

Одним из способов было бы использовать Hashmap для сопоставления от 100 до 5 и т. Д. Или использовать значения int для символов, чтобы получить значения оператора, см. Мое редактирование. –

+0

СПАСИБО ты так много миф, я решил это с вашей помощью .. – soupi7

2

Прямо сейчас вы будете получать тот же результат, если ваш вход был -++

Вы никогда не разобрать для того или а, Ь, с и й. Вы всегда принимаете порядок a-> b-> c-> d.

Так д-с + а + Ь будет: а-Ь + с + d, которая согласуется с выходом предоставленной вами (100-5 + 10 + 13 = 118)

OP CODE в

for (i = 0; i < InputText.length(); i++) 
    { 
    k = InputText.charAt(i); 
    if ((k == '+') || (k == '-')) 
    { 
     if (j <= 2) operators[j++] = k; 
    } 
    } 

/OP'S CODE

В этом цикле, когда к не является оператором, вы должны читать ш это письмо, и сохранить порядок, в котором появились буквы. Или создать какой-то другой вид отображения. В любом случае вы не можете просто игнорировать символы без оператора, потому что они являются частью ввода. отлаживать

+0

как выбрать, какой из них является оператором, если K не является – soupi7

+0

@ soupi7 k в какой-то момент будет каждый символ. Вы сейчас перебираете всю строку, находите операторы и помещаете их в массив. Пока вы это делаете. Если k не является оператором (иначе в этом операторе if), вам нужно будет реализовать некоторую логику, которая сохранит ее характер. на первой итерации k будет d. Поместите 'd' в массив, знаете ли вы, что это было первым. – Cruncher

+0

Я положил d в аранжировку и тот же номер еще – soupi7

Смежные вопросы