Как использовать переменную, добавленную в цикле, в основной части кода?
public class Practical {
public static void main(String[] args) {
int[]num={8,12,30};
int first=num[0];
int second=num[1];
int third=num[2];
if (first<second & first<third){
int **min**=first;
} else if (second<first & second<third) {
int **min**=second;
} else if (third<first & third<second){
int **min**=third;
}
if (first>second & first>third){
int **max**=first;
} else if (second>first & second>third) {
int **max**=second;
} else if (third>first & third>second){
int **max**=third;
}
int finish=max-min;
}
}
Ответы (3 шт):
В данном случае переменные min, max не добавляются в цикле (в данном коде вообще нет операторов цикла for, while, do/while), а объявляются в блоке кода в условном операторе if.
Как известно, область видимости переменной, объявленной в блоке кода, ограничена этим блоком кода, поэтому попытка обратиться к переменным min и max в теле метода main за пределами блоков, где они были объявлены, приводит к ошибкам компиляции:
Error:(24, 20) java: cannot find symbol
int finish=max-min;
^
symbol: variable max
location: class Practical
Error:(24, 24) java: cannot find symbol
int finish=max-min;
^
symbol: variable min
location: class Practical
Если нужно присваивать значения неким переменным внутри блока кода и использовать эти переменные после блока, такие переменные нужно объявлять до начала блока кода.
Но простое объявление переменных в нужном месте:
int min;
if (first<second & first<third) {
min=first;
} else if (second<first & second<third) {
min=second;
} else if (third<first & third<second) {
min=third;
}
int max;
if (first>second & first>third) {
max=first;
} else if (second>first & second>third) {
max=second;
} else if (third>first & third>second) {
max=third;
}
int finish=max-min;
вызовет другие ошибки компиляции:
Error:(25, 20) java: variable max might not have been initialized
Error:(25, 24) java: variable min might not have been initialized
так как всегда используются дополнительные условия else if (новое_условие) вместо однозначной альтернативы else, и компилятор не должен "предугадывать" результаты неоднозначной логики.
Также из-за использования оператора & в условных операторах обе части условия if (a < b & a < c) будут проверяться всегда (без короткого замыкания), поэтому выполняется много лишних проверок. Но и применение оператора && с коротким замыканием в данном случае излишне.
Значительно проще сразу определить минимум/максимум для первой пары чисел, а затем сравнивать полученные значения с третьим числом:
int min, max;
if (a < b) {
min = a;
max = b;
} else {
min = b;
max = a;
}
if (c < min) {
min = c;
} else if (c > max) {
max = c;
}
То есть, для определения минимума и максимума трёх чисел достаточно трёх операторов сравнения.
Предложу такое решение...
public class Test {
public static void main(String[] args) {
int[]num = {8,12,30};
int first = num[0];
int second = num[1];
int third = num[2];
int min = Math.min(Math.min(first, second), third);
int max = Math.max(Math.max(first, second), third);
System.out.println("Результат = " + (max - min));
}
}
Либо вообще вот так, если дело касается массива...
public class Test {
public static void main(String[] args) {
int[]num = {8,12,30};
if (num.length == 0) {
System.out.println("Результат не определен");
return;
}
int min = num[0];
int max = num[0];
for (int i = 1; i < num.length; i++) {
min = Math.min(min, num[i]);
max = Math.max(max, num[i]);
}
System.out.println("Результат = " + (max - min));
}
}
У вас есть массив типа int, можно просто пройтись циклом по нему
int[] nums = new int[]
{
8, 2, 1, 12, 30
};
// выставляем первое значение из массива
// для переменной min и max
int min = nums[0];
int max = nums[0];
for (int idx = 0; idx < nums.length; idx++)
{
// проверяем является ли значение nums[idx] > или <
int num = nums[idx];
if (max < num)
{
max = num;
}
if (num < min)
{
min = num;
}
}
int finish=max-min;
Такое решение будет более приемлемое с точки зрения читаемости кода и проще в понимание, чем большое количество условий if