2016-10-06 4 views
2

я переписал свою любопытное»первую программу в Java, и теперь он выглядит следующим образом:Еще одна проблема с do..while

import java.util.*; 
import static java.lang.Math.*; 

public class FirstApp { 
public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 
    double a = 0; 
    double b = 0; 
    double c = 0; 
    double delta; 
    double x1 = 0, x2 = 0; 
    boolean repeat = false; 
    boolean decision = false; 


    System.out.println("Calculator 2.0"); 
    System.out.println("Bartosz Kubacki 6.10.2016"); 
    System.out.println("-------------------------------"); 
    System.out.println("Welcome in Calculator 2.0 which helps you solve Ax^2 + Bx + C = 0."); 

    do 
    { 
     do 
     { 
      System.out.println("Enter A param (different from 0: "); 

      if(input.hasNextDouble()) 
      { 
       a = input.nextDouble(); 
       if(a == 0) 
       { 
        System.out.println("Param A needs to be different from 0!"); 
       } 
      } else 
      { 
       input.nextLine(); 
       System.out.println("Param A must be a number!"); 
      } 
     } while(a == 0); 

     do 
     { 
      System.out.println("Enter B param: "); 

      if(input.hasNextDouble()) 
      { 
       b = input.nextDouble(); 
       repeat = false; 
      } else 
      { 
       input.nextLine(); 
       System.out.println("Param B must be a number!"); 
       repeat = true; 
      } 
     } while(repeat); 

     do 
     { 
      System.out.println("Enter C param: "); 

      if(input.hasNextDouble()) 
      { 
       c = input.nextDouble(); 
       repeat = false; 
      } else 
      { 
       input.nextLine(); 
       System.out.println("Param C must be a number!"); 
       repeat = true; 
      } 
     } while(repeat); 

     // Counting.. and showing results 

     delta = pow(b, 2) - (4 * a * c); 
     if(delta == 0) 
     { 
      x1 = (0 - b)/2 * a; 
      System.out.printf("There is one solution: %.2f\n", x1); 
     } else if(delta > 0) 
     { 
      x1 = ((0 - b) - sqrt(delta))/2 * a; 
      x2 = (b + sqrt(delta))/2 * a; 
      System.out.printf("There are two solutions: %.2f and %.2f\n", x1, x2); 
     } else 
     { 
      System.out.println("There is no solution."); 
     } 

     // Decyzja o kolejnych działaniach 

     do 
     { 
      System.out.println("Want make another eqation? [Y/N] "); 
      String dec = null; 

      if(input.hasNext("Y") || input.hasNext("N") || input.hasNext("y") || input.hasNext("n")) 
      { 
       dec = input.nextLine(); 
       if(dec.equalsIgnoreCase("Y")) 
        decision = true; 
       else 
        decision = false; 

       repeat = false; 
      } else 
      { 
       input.nextLine(); 
       repeat = true; 
      } 
     } while(repeat); 
    } while(decision); 

    input.close(); 
} 
} 

Все идет хорошо на самом деле, кроме:

  1. Когда я положил (только 1 предупреждение)

  2. Когда я отвечаю на Y или N, программа заканчивается, НО если я войду в систему,что-нибудь еще, как «g» «2» «w» и т. д., затем программа снова спрашивает меня (дважды и в первый раз), а затем, когда я вхожу в Y или N, он отлично работает.

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

Спасибо за все ответы. :)

+1

Ваш код очень пригодится * если вы создадите вспомогательный метод, например. 'promptDouble()', поэтому эти первые 3 в основном идентичные петли могут быть устранены. – Andreas

+0

Ниже приведен пример метода, который подсказывает http://stackoverflow.com/questions/39882635/how-to-find-out-which-variable-is-throwing-an-exception/39882790#39882790, как предлагает Андреас – weston

ответ

1
// Decyzja o kolejnych działaniach 
      String dec = null; 
      input.nextLine(); 
      do 
      { 
       System.out.println("Want make another eqation? [Y/N]: "); 

       dec = input.nextLine(); 

       if(dec.equalsIgnoreCase("Y")) { 
        decision = true; 
        repeat = false; 
       } 
       else if(dec.equalsIgnoreCase("n")){ 
        decision = false; 
        repeat = false; 
       } else 
        repeat = true; 
      } while(repeat); 

Я отредактировал ваш код по мере необходимости. Я лично не буду кодировать его таким образом, но я предпочел бы внести минимальные изменения.

Вы последний цикл делали новый String dec каждый раз, когда он зацикливался. Это нормально, но не рекомендуется. Я переместил его выше цикла.

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

Я тогда удалил ваш hasNext() условен, и просто читать вход, потому что это не имеет значения, что они собираются, чтобы войти, вы только заботиться, если это Y или N, я добавил соответствующее if заявления.

Это будет сделано. Работы вроде бы должны.

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

  • Нет связанных вопросов^_^