Я недавно изучаю массивы, и я застрял на этом вопросе.
В основном я должен попросить пользователя ввести числа, которые войдут в массив, и должен распечатать процент четных чисел и должен напечатать все четные числа в следующем формате.
Even values are : 89,22,-8, 0
Мой код это
import java.util.*;
public class Change {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("How many numbers in the array?");
int num = input.nextInt();
int count=0;
int count1=0;
for (int i=1; i<=num; i++) {
System.out.println("Enter an integer: ");
count++;
int integer= input.nextInt();
if (integer%2==0) {
int list[]=new int[integer];
count1++;
}
}
System.out.println("There were "+((double)count1/count)*100+" percent of even numbers.");
System.out.println("Even values are "+Arrays.toString(list)+"");
}
}
Этот код заканчивается сообщением об ошибке, в котором говорится, что «список» не инициализирован.
Я знаю, что, поскольку «список» находится внутри цикла for, система не понимает, что он был инициализирован, но я понятия не имею, как заставить систему распознать «список».
Любая помощь или комментарии приветствуются. :)
Да, но затем он говорит, что не может распознать «целое число», потому что целое число также находится внутри цикла. Я хочу ввести «целое число» внутри массива, поэтому я не могу его вынуть. :(
Рассмотрите возможность использования отступов, чтобы сделать ваш код более читабельным.
"поэтому я не могу его вытащить" - да, вы можете. Объявление int[] list; и присвоение значения list = new int[integer]; не обязательно должны происходить вместе. Однако это оставит вас с существующими проблемами: (1) вы переназначаете значение list каждый раз в цикле и ничего не накапливаете от одного цикла к другому, и (2) вы никогда ничего не добавляете в список. Если я догадываюсь об ошибке в вашем мышлении, она касается значения new int[integer]. Это выделяет массив «целого» размера с неопределенным содержимым; он не помещает «целое число» в массив.




package com.inlet.ifserver;
import java.util.*;
public class x {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("How many numbers in the array?");
int num = input.nextInt();
int count1 = 0;
Integer[] evens = new Integer[num];
for (int i = 0; i < num; i++) {
System.out.println("Enter an integer: ");
int integer = input.nextInt();
if (integer % 2 == 0)
evens[count1++] = integer;
}
evens = Arrays.copyOfRange(evens, 0, count1);
System.out.println("There were " + ((double) count1 / num) * 100 + " percent of even numbers.");
System.out.println("Even values are " + Arrays.toString(evens) + "");
}
}
Можно ли не использовать что-то вроде List<integer> ? Я новичок и понятия не имею, что это такое.. Большое спасибо за вашу помощь.
Конечно. Проблема с использованием массива заключается в том, что вы заранее не знаете, насколько большим будет список четных значений, а размер массивов нельзя изменить. Списки — это то, что вы используете, когда не знаете, сколько предметов у вас будет. Затем вы можете превратить этот список в массив в конце.
почему бы не использовать список?
Я не знаю, что это.. :)
Поищи это. Вы должны знать о типах List и Map, если собираетесь хорошо разбираться в Java. Обычно вы создаете ArrayList и HashMap.
Просто задание не позволяет мне использовать что-то кроме того, что я выучил :(
Хорошо, я переработал свой ответ, используя только массивы. Это усекает исходный массив четов, как только он узнает, сколько у вас четов.
FWIW, count не используется (в оригинале он был излишним)
Хорошо, давайте сначала разобьем проблему на несколько небольших частей и решим их одну за другой. Во-первых, нам нужно создать и инициализировать наш массив пользовательским вводом. Сначала нам нужно указать размер нашего массива — это вы сделали.
Scanner input = new Scanner(System.in);
System.out.println("How many numbers in the array?");
int num = input.nextInt();
int evenCount = 0;
int[] list = new int[num]; //set array size to user input
Далее нам нужно заполнить наш массив числами из пользовательского ввода.
for (int i=0; i < list.length; i++){
System.out.println("Enter an integer: ");
int integer= input.nextInt();
list[i] = integer; //set array value at index to user input
}
Наконец, нам нужно перебрать каждое число в массиве и определить, является ли оно четным. Затем распечатайте его.
System.out.print("Evens: ");
for (int integer : list) {
if (integer % 2 == 0) { //check if even
evenCount++; //increment even number count
System.out.print(" " + integer); //print the even integers
}
}
Затем разделите количество четных чисел на общее количество чисел в массиве, чтобы получить процент четных чисел.
System.out.println("Even count: " + evenCount);
System.out.println("Percent even: " + (double)evenCount / list.length);
Полный код:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("How many numbers in the array?");
int num = input.nextInt();
int evenCount = 0;
int[] list = new int[num];
for (int i=0; i < list.length; i++){
System.out.println("Enter an integer: ");
int integer= input.nextInt();
list[i] = integer;
}
System.out.print("Evens: ");
for (int integer : list) {
if (integer % 2 == 0) {
evenCount++;
System.out.print(integer + " "); //print the even integers
}
}
System.out.println();
System.out.println("Even count: " + evenCount);
System.out.println("Percent even: " + (double)evenCount / list.length);
}
Я думаю, вы неправильно поняли мой вопрос. Я хочу, чтобы четные числа не учитывались :) Спасибо за помощь! Я узнал новую вещь, хотя
@user547075 user547075, пожалуйста, смотрите обновленный ответ, третий фрагмент кода включает печать четных чисел.
Я проголосовал за подход к объяснению «разбить его на шаги».
Я до сих пор не вижу, что вы делаете то, о чем просил ОП. Вы не показываете список четных чисел.
Я имел в виду, что хотел что-то вроде эвенов: 2,6,8,0,-8 :) Кроме того, не нужно ли его удваивать? Я думаю, что в противном случае он печатает 0.
@ user547075 это просто добавление оператора System.out.println перед циклом for - см. выше.
Вы объявляете
listвнутри цикла, так что это только внутри цикла. Переместите замедление за пределы цикла