#java
#java
Вопрос:
Я пишу программу, которая предложит пользователю ввести значение temp в виде целого числа, а затем предложит пользователю выбрать, в каком масштабе находится эта температура: в градусах Фаренгейта, Цельсия или Кельвина. Затем пользователю предлагается выбрать, в какую температуру они хотели бы преобразовать, из 3 вариантов масштаба, затем вычисляет преобразование и отображает конечную температуру. В настоящее время моя программа работает, но неправильно, и я смотрю на это уже пару дней, и я не уверен, почему она компилируется так, как есть. Я все еще новичок в кодировании, это назначение класса, над которым я работал, просто ища несколько советов.
package tempconverter; импорт java.util.*;
открытый класс TempConverter {
public static void main(String[] args)
{
double temp1;
double convertTo;
double finalTemp;
double currScale;
char cont='E';
char process='P';
int scale1=0;
int scale2=0;
do
{
//input
getTemp();
scaleOne(scale1);
toScale(scale2);
//process
System.out.print("Your final temp is: " convert() toScale(scale2));
}while(cont=='N');
}
private static double getTemp()
{
double temp;
double currentTemp;
Scanner userIn= new Scanner(System.in);
System.out.print("Enter a temperature to convert ");
while(!userIn.hasNextDouble())
{
System.out.println("That is not a valid temperature!");
System.out.print("Re-enter a temperature: ");
userIn.next();
}
temp=userIn.nextDouble();
return temp;
}
private static String scaleOne(int userChoice)
{
Scanner userIn= new Scanner(System.in);
System.out.print("What scale is your temp currently in?"
"1: Fahrenheit"
"2: Celsius"
"3: Kelvin"
"Please enter 1, 2, or 3: ");
String scale="";
switch(userChoice)
{
case 1:
{scale= "Fahrenheit";
break;}
case 2:
{scale="Celsius";
break;}
case 3:
{scale="Kelvin";
break;}
default:
{scale= "There was an error in your choice!";}
}
return scale;
}
private static String toScale(int userChoice)
{
Scanner userIn= new Scanner(System.in);
System.out.print("What scale would you like to convert to?"
"1: Fahrenheit"
"2: Celsius"
"3: Kelvin"
"Please enter 1, 2, or 3: ");
String scale2="";
switch(userChoice)
{
case 1:
{scale2= "Fahrenheit";
break;}
case 2:
{scale2="Celsius";
break;}
case 3:
{scale2="Kelvin";
break;}
default:
{scale2= "There was an error in your choice!";}
}
return scale2;
}
public static double convert()
{
double farToKel;
double farToCel;
double celToKel;
double celToFar;
double kelToFar;
double kelToCel;
int scale1=0;
double converts;
if(scaleOne(scale1)=="Fahrenheit" amp;amp; toScale(scale1)=="Kelvin")
{
converts=farToKel=(getTemp() 459.67)* 5/9;
}
else if(scaleOne(scale1)=="Fahrenheit" amp;amp; toScale(scale1)=="Celsius")
{
converts=farToCel=(getTemp()-32)*5/9;
}
else if(scaleOne(scale1)=="Celsius" amp;amp; toScale(scale1)=="Kelvin")
{
converts=celToKel=getTemp() 273.15;
}
else if(scaleOne(scale1)=="Celsius" amp;amp; toScale(scale1)=="Fahrenheit")
{
converts=celToFar=getTemp()*9/5 32;
}
else if(scaleOne(scale1)=="Kelvin" amp;amp; toScale(scale1)=="Fahrenheit")
{
converts=kelToFar=getTemp()*9/5-459.67;
}
else
{
converts=kelToCel=getTemp()-276.15;
}
return converts;
}
}
И вот что он компилирует
выполнить: Введите температуру для преобразования 100 В каком масштабе в данный момент находится ваша температура?1: Фаренгейт2: Цельсии3: Кельвинпожалуйста, введите 1, 2 или 3: В какой масштаб вы хотели бы преобразовать?1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент? 1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvinпожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvinпожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3:: Kelvin Пожалуйста, введите 1, 2 или 3: Введите температуру для преобразования 2 В какую шкалу вы хотели бы преобразовать?1: Фаренгейт2: Цельсии3: Кельвинпожалуйста, введите 1, 2 или 3: ваша конечная температура: -274.15В вашем выборе была ошибка!СБОРКА ВЫПОЛНЕНА УСПЕШНО (общее время: 33 секунды)
Похоже, что он не компилируется в правильном порядке или получает правильную информацию в правильном порядке и получает некоторую информацию снова и снова. Как только вы вводите числовое значение temp, оно запрашивает масштаб, но не только один раз, когда оно выводит его несколько раз, затем вы вводите свой выбор для первого масштаба, и он просто проходит весь путь до завершения без ввода вашего выбора для toScale.
Комментарии:
1. Что вы подразумеваете под неправильным?
2. Извините, я собираюсь отредактировать свой исходный пост, чтобы включить то, что он компилирует.
3. Ну, сначала вы очистили множество локальных переменных внутри метода main, даже не используя их.
4. Вы, очевидно, студент. (Я надеюсь, или, по крайней мере, не программист). Итак, я собираюсь сказать пару вещей, которые, надеюсь, помогут. Ваш дизайн излишне сложен, и пересмотр его поможет прояснить проблемы. В принципе, вам не нужны отдельные методы для сбора пользовательского ввода. Вам также нужно захватить только две части ввода. Это подсказка. Удачи в выполнении домашнего задания.
Ответ №1:
Смотрите Вставленные комментарии и исправления, внесенные в ваш код ниже.
public class TempConverter {
// variables that are needed in more than one method must be declared outside the methods
// (static since the methods are static; not recommended, but let it be for now)
static double temp1;
static String scale1;
static String scale2;
public static void main(String[] args) {
// get rid of unused variables
char cont = 'E';
do {
// input
// save all inputs to variables
temp1 = getTemp();
// Java parameters are pass by value, so to get a value out of the method, use the returned value
// then you don’t need the parameter
scale1 = scaleOne();
scale2 = toScale();
// process
// don’t call toScale() again, or the user will be prompted again,
// instead, use the value already stored in scale2
System.out.print("Your final temp is: " convert() ' ' scale2);
// you should set cont to something if you want the loop to repeat
} while (cont == 'N');
}
private static double getTemp() {
double temp;
Scanner userIn = new Scanner(System.in);
System.out.print("Enter a temperature to convert ");
while (!userIn.hasNextDouble()) {
System.out.println("That is not a valid temperature!");
System.out.print("Re-enter a temperature: ");
userIn.next();
}
temp = userIn.nextDouble();
return temp;
}
private static String scaleOne() {
Scanner userIn = new Scanner(System.in);
// n is a line break for readability
System.out.print("What scale is your temp currently in?"
"n1: Fahrenheit"
"n2: Celsius"
"n3: Kelvin"
"nPlease enter 1, 2, or 3: ");
// read a value from the user
int userChoice = userIn.nextInt();
String scale = "";
switch (userChoice) {
case 1: {
scale = "Fahrenheit";
break;
}
case 2: {
scale = "Celsius";
break;
}
case 3: {
scale = "Kelvin";
break;
}
default: {
scale = "There was an error in your choice!";
}
}
return scale;
}
private static String toScale() {
Scanner userIn = new Scanner(System.in);
System.out.print("What scale would you like to convert to?" "1: Fahrenheit" "2: Celsius" "3: Kelvin"
"Please enter 1, 2, or 3: ");
String scale2 = "";
int userChoice = userIn.nextInt();
// ideally should not accept the same scale as scale1 (from scale)
switch (userChoice) {
case 1: {
scale2 = "Fahrenheit";
break;
}
case 2: {
scale2 = "Celsius";
break;
}
case 3: {
scale2 = "Kelvin";
break;
}
default: {
scale2 = "There was an error in your choice!";
}
}
return scale2;
}
public static double convert() {
// need only one variable for result
double converts;
// don’t call methods again, use variables
// don’t use == for comparing strings, use .equals
// typo: the second scale corrected to scale2
if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Kelvin")) {
// don’t call getTemp() again
converts = (temp1 459.67) * 5 / 9;
}
else if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Celsius")) {
converts = (temp1 - 32) * 5 / 9;
}
else if (scale1.equals("Celsius") amp;amp; scale2.equals("Kelvin")) {
converts = temp1 273.15;
}
else if (scale1.equals("Celsius") amp;amp; scale2.equals("Fahrenheit")) {
converts = temp1 * 9 / 5 32;
}
else if (scale1.equals("Kelvin") amp;amp; scale2.equals("Fahrenheit")) {
converts = temp1 * 9 / 5 - 459.67;
}
else { // Kelvin to Celsius
converts = temp1 - 276.15;
}
return converts;
}
}
Я считаю, что это в основном работает сейчас.
Комментарии:
1. Мне нравится идея из нескольких других ответов передать scale1 и scale2 в качестве аргументов
convert()
вместо статических полей, я должен был сделать то же самое, вероятно, и с temp1.
Ответ №2:
public static void main(String[] args)
{
String scaleOne;
String scaleTwo;
System.out.println("What scale is your temp currently in?n"
"1: Fahrenheitn"
"2: Celsiusn"
"3: Kelvinn"
"Please enter 1, 2, or 3: n");
scaleOne = getScale();
System.out.println("What scale would you like to convert to?n"
"1: Fahrenheitn"
"2: Celsiusn"
"3: Kelvinn"
"Please enter 1, 2, or 3:n ");
scaleTwo = getScale();
System.out.print("Your final temp is: " convert(scaleOne,scaleTwo));
}
private static double getTemp()
{
double temp;
Scanner userIn= new Scanner(System.in);
System.out.print("Enter a temperature to convert ");
while(!userIn.hasNextDouble())
{
System.out.println("That is not a valid temperature!");
System.out.println("Re-enter a temperature: ");
userIn.next();
}
temp=userIn.nextDouble();
return temp;
}
private static String getScale()
{
Scanner userIn= new Scanner(System.in);
String scale="";
switch(userIn.nextInt())
{
case 1:
scale= "Fahrenheit";
break;
case 2:
scale="Celsius";
break;
case 3:
scale="Kelvin";
break;
default:
scale= "There was an error in your choice!";
}
return scale;
}
Соответствующим образом измените функцию main, а также функции scaleone() и toScale() . В вашем коде много проблем, которые невозможно решить по отдельности. Не стесняйтесь запрашивать какие-либо разъяснения по ответу
Ответ №3:
Вы должны верить, что компилятор выполняет свою работу правильно. Ошибка заключается в вашей логике. Я предполагаю, что вы пытаетесь создать программу для преобразования температуры из одного из 3 форматов в другой формат.
-
При вызове
scaleOne(scale1);
метода вы указали жестко закодированное значение0
в качестве аргумента и никогда не меняли его внутри метода. в то же время вы пытаетесь получить ввод от пользователя. Для получения пользовательского ввода вам необходимо добавитьint userChoice = userIn.nextInt();
внутри тела вашего метода. Это вернет значение sting, которое вам нужно сохранить вsacle1
переменной в вашем основном методе. -
Аналогично для
toScale()
метода вам нужно сделать его непараметризованным и принимать входные данные от пользователя внутри метода. Это снова вернет значение sting, которое вам нужно сохранить вsacle2
переменной в вашем основном методе. -
Теперь при вызове вашего метода convert вам нужно передать
scale1
andscale2
в качестве аргументов. Я не понимаю, какова логика повторного вызоваscaleOne()
иtoScale()
методов в каждом случае, если условия. Это причина, по которой ваш код снова и снова запрашивает выбор типа температуры. Я удалил их сscale1
scale2
помощью переменных и в своем решении. Всегда помните, никогда не используйте==
operator дляString
сравнения. Всегда используйтеequals()
equalsEgnoreCase()
метод or класса string.
Я внес изменения в ваш код и попытался получить более конкретное решение по мере необходимости. Надеюсь, это поможет. Не забудьте проголосовать.
public class TempConverter {
public static void main(String[] args)
{
String scale1;
String scale2;
//input
scale1 =scaleOne();
scale2 = toScale();
//process
System.out.print("Your final temp is: " convert(scale1, scale2));
}
private static double getTemp()
{
double temp;
Scanner userIn= new Scanner(System.in);
System.out.print("Enter a temperature to convert ");
while(!userIn.hasNextDouble())
{
System.out.println("That is not a valid temperature!");
System.out.print("Re-enter a temperature: ");
userIn.next();
}
temp=userIn.nextDouble();
return temp;
}
private static String scaleOne() {
Scanner userIn= new Scanner(System.in);
System.out.print("What scale is your temp currently in?"
"1: Fahrenheit"
"2: Celsius"
"3: Kelvin"
"Please enter 1, 2, or 3: ");
int userChoice = userIn.nextInt();
String scale="";
switch(userChoice)
{
case 1:
{scale= "Fahrenheit";
break;}
case 2:
{scale="Celsius";
break;}
case 3:
{scale="Kelvin";
break;}
default:
{scale= "There was an error in your choice!";}
}
return scale;
}
private static String toScale(){
Scanner userIn= new Scanner(System.in);
System.out.print("What scale would you like to convert to?"
"1: Fahrenheit"
"2: Celsius"
"3: Kelvin"
"Please enter 1, 2, or 3: ");
String scale2="";
int userChoice = userIn.nextInt();
switch(userChoice)
{
case 1:
{scale2= "Fahrenheit";
break;}
case 2:
{scale2="Celsius";
break;}
case 3:
{scale2="Kelvin";
break;}
default:
{scale2= "There was an error in your choice!";}
}
return scale2;
}
public static double convert(String scale1, String scale2)
{
double converts;
if(scale1.equalsIgnoreCase("Fahrenheit") amp;amp; scale2.equalsIgnoreCase("Kelvin"))
{
converts=(getTemp() 459.67)* 5/9;
}
else if(scale1.equalsIgnoreCase("Fahrenheit") amp;amp; scale2.equalsIgnoreCase("Celsius"))
{
converts=(getTemp()-32)*5/9;
}
else if(scale1.equalsIgnoreCase("Celsius") amp;amp; scale2.equalsIgnoreCase("Kelvin"))
{
converts=getTemp() 273.15;
}
else if(scale1.equalsIgnoreCase("Celsius") amp;amp; scale2.equalsIgnoreCase("Fahrenheit"))
{
converts=getTemp()*9/5 32;
}
else if(scale1.equalsIgnoreCase("Kelvin") amp;amp; scale1.equalsIgnoreCase("Fahrenheit"))
{
converts=getTemp()*9/5-459.67;
}
else
{
converts=getTemp()-276.15;
}
return converts;
}}
Ответ №4:
после того, как все сказано и сделано, я завершил его, и он работает правильно и в соответствии с запросом в классе. Спасибо за обратную связь!
package tempconverter;
import java.util.Scanner;
public class TempConverter
{
static double temp1;
static String scale1;
static String scale2;
static double conv;
public static void main(String[] args)
{
char cont='N';
do
{ menueOne();
menueCatch();
cont=contOption();
}while(cont=='Y');
}
private static void menueOne()
{
System.out.print("Please make a selection."
"n1: Begin"
"n2: Exit"
"n");
}
private static void menueCatch()
{
Scanner userIn= new Scanner(System.in);
int userChoice=userIn.nextInt();
String input="";
switch(userChoice)
{
case 1:
{
temp1=getTemp();
scale1=scaleOne();
scale2=toScale();
conv=convert();
displayConversion();
break;
}
case 2:
{
break;
}
}
}
private static double getTemp()
{
double temp;
double currentTemp;
Scanner userIn= new Scanner(System.in);
System.out.print("Enter a temperature to convert as a digit(ex: 100, 32, 10, 0): ");
while(!userIn.hasNextDouble())
{
System.out.println("That is not a valid temperature!");
System.out.print("Re-enter a temperature: ");
userIn.next();
}
temp=userIn.nextDouble();
return temp;
}
private static String scaleOne()
{
Scanner userIn= new Scanner(System.in);
System.out.print("What scale is your temp currently in?"
"n1: Fahrenheit"
"n2: Celsius"
"n3: Kelvin"
"nPlease enter 1, 2, or 3: ");
int userChoice = userIn.nextInt();
String scale="";
switch(userChoice)
{
case 1:
{scale= "Fahrenheit";
break;}
case 2:
{scale="Celsius";
break;}
case 3:
{scale="Kelvin";
break;}
default:
{scale= "There was an error in your choice!";}
}
return scale;
}
private static String toScale()
{
Scanner userIn= new Scanner(System.in);
System.out.print("What scale would you like to convert to?"
"n1: Fahrenheit"
"n2: Celsius"
"n3: Kelvin"
"nPlease enter 1, 2, or 3: ");
int userChoice = userIn.nextInt();
String scale2="";
switch(userChoice)
{
case 1:
{scale2= "Fahrenheit";
break;}
case 2:
{scale2="Celsius";
break;}
case 3:
{scale2="Kelvin";
break;}
default:
{scale2= "There was an error in your choice!";}
}
return scale2;
}
public static double convert()
{
double converts;
if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Kelvin")) {
converts = (temp1 459.67) * (5.0 / 9.0);
}
else if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Celsius")) {
converts = (temp1 - 32) * (5.0 / 9.0);
}
else if (scale1.equals("Celsius") amp;amp; scale2.equals("Kelvin")) {
converts = temp1 273.15;
}
else if (scale1.equals("Celsius") amp;amp; scale2.equals("Fahrenheit")) {
converts = temp1 * (9.0 / 5.0) 32;
}
else if (scale1.equals("Kelvin") amp;amp; scale2.equals("Fahrenheit")) {
converts = temp1 * (9.0 / 5.0) - 459.67;
}
else { // Kelvin to Celsius
converts = temp1 - 276.15;
}
return converts;
}
private static void displayConversion()
{
System.out.print("Your final temp is: " conv ' ' scale2 ' ');
}
private static char contOption()
{
char answer;
Scanner userIn=new Scanner(System.in);
System.out.print("nDo you wish to convert another temp?(Y/N): ");
answer=userIn.next().toUpperCase().charAt(0);
return answer;
}
}