2017-01-15 5 views
0

Я пытаюсь создать программу, которая неоднократно запрашивает уровень воды, который должен постоянно повышаться, и моя программа должна обнаружить, когда в строке было обнаружено три уменьшающихся показания. Вот что печатается на консоли:Пример ввода/вывода Java Пример

Каков уровень воды в настоящее (в мм): 20
Что такое уровень воды на сейчас (в мм): 21
Каков уровень воды в теперь (в мм): 23
Каков уровень воды в настоящее время (в мм): 25
Каков уровень воды в настоящее время (в мм): 27
Каков уровень воды сейчас (в мм) : 27
Каков уровень воды в настоящее время (в мм): 34
Каков уровень воды в настоящее время (в мм): 22
Что уровень воды на сейчас (в мм): 25
Что уровень воды на сейчас (в мм): 26
Что уровень воды на сейчас (в мм): 28
Что такое вода уровень в настоящее время (в мм): 27
Каков уровень воды в настоящее время (в мм): 26
Каков уровень воды в настоящее время (в мм): 25
Похоже, что наводнение ослабевает.

В настоящее время я знаю, что должен его зацикливать, но я работал с python, поэтому не уверен, как продолжить работу с java. Как я могу сохранить ввод вопроса, чтобы сравнить его с предыдущим ответом? Любая помощь будет принята с благодарностью.

import java.util.Scanner; 


public class waterLevelProgram { 

    public static void main(String[] args) { 

     double waterLevel, initialWaterLevel; 
     waterLevel = 0; 
     System.out.print("What is the water level at now (in mm): "); 
     initialWaterLevel = new Scanner(System.in).nextDouble(); 

     while (waterLevel > 0){ 
      System.out.println("What is the water level at now (in mm): "); 
      waterLevel = new Scanner(System.in).nextDouble(); 
      if (waterLevel > initialWaterLevel){ 
      } 
     } 
    } 
} 
+1

Используйте Arraylist –

+0

, и если вам не нужно хранить все показания, просто сохраните несколько за раз в очереди. – synchronizer

+0

Поделитесь с нами, как вы это сделаете в Python, и если есть определенный бит, с которым вам трудно перевести на Java, мы сможем помочь с этим. –

ответ

1

Проблема здесь состоит в том, что вы сравниваете текущую waaterLevel с первого Waterlevel initialWaterLevel т.е. каждый раз, так что вы получаете неожиданный выход. Вы должны обновить initialWaterLevel до текущего уровня в конце цикла, чтобы вы могли сравнить его в следующем цикле.

public static void main(String[] args) { 

    double waterLevel, initialWaterLeve; 
    waterLevel = 0; 
    initialWaterLeve = 0; 
    int count=0; 
    Scanner sc = new Scanner(System.in); 

    while (waterLevel > 0){ 
     System.out.println("What is the water level at now (in mm): "); 
     waterLevel = sc.nextDouble(); 
     if (waterLevel < initialWaterLevel){ 
       count++; 
     } 
     else{ 
       count=0; 
     } 

     if(count>=3){ 
      System.out.println("It appears that the flood is subsiding."); 
      break; // if you want to come out of loop. 
     } 
     initialWaterLevel = waterLevel; 
    } 
} 

Там нет необходимости ArrayList или очереди, потому что ваша цель состоит в том, чтобы проверить, происходит ли три снижения подряд или нет, которые можно легко сделать с помощью int переменных. (Помните, такие фокусы)

+0

Почему вы создаете новый сканер на каждой итерации? – synchronizer

+0

@synchronizer Я внес изменения для этого. Thankyou –

+0

Спасибо! Пришлось изменить счет до 4, но кроме этого, это то, чего мне не хватало! Я забыл счет! – coding101

0

Простой пример того, как хранить ценности в вашей программе с помощью ArrayList:

import java.util.Scanner; 

public class waterLevelProgram { 

    ArrayList<double> waterLevels = new ArrayList<double>(); 

    public static void main(String[] args) { 

     Scanner scanner = new Scanner(System.in); 

     while (true){ 
      System.out.println("What is the water level at now (in mm): "); 
      currentWaterLevel = scanner.nextDouble(); 
      waterLevels.add(currentWaterLevel); 
      if (isFloodSubsiding()) 
       System.out.println("Flood is subsiding"); 
     } 
    } 

    public static boolean isFloodSubsiding(){ 
     if (waterLevels.size() >= 3) 
     { 
      return 
      (
      waterLevels.get(waterLevels.size()-1) < waterLevels.get(waterLevels.size()-2) 
     && waterLevels.get(waterLevels.size()-2) < waterLevels.get(waterLevels.size()-3) 
      ); 
     } 
     else 
      return false; 
    } 
} 

Но, как заявил @jack вы на самом деле не нужно хранить, если вы должны работать только с предупреждение, когда WaterLevel уменьшается три раза подряд. Если вам нужны более сложные операции (например, статистический отчет), это может стать советом о том, как работать с ArrayList.

+0

Я думаю, что если условие никогда не работает, поскольку последний элемент в 'waterLevels' будет' currentWaterLevel'. –

+0

спасибо, что ты прав, отредактировал – salvolds

+0

еще проблема @ coding101 не решена. –