Ввод отрицательных чисел на java

Как вы позволяете пользователю вводить отрицательные числа в массив и изменять начальный индекс?

Недавно я сделал приложение, которое считывает количество целых чисел в диапазоне от 0 до 50 и подсчитывает, сколько раз вводится каждое из них. Я также сделал так, чтобы он считал, сколько раз было введено каждое целое число. Теперь мне нужно изменить диапазон с 0 до 50 на -25 до 25. Однако, когда я ввожу отрицательные числа, я получаю ошибку «За пределами границы».

Я экспериментировал с объявлениями массивов. Мне просто нужно знать, что мне нужно сделать, чтобы изменить диапазон. Вот мой код:

import java.util.Scanner; public class SixTwo < public static void main(String[] args) < Scanner sc = new Scanner(System.in); //int[] nums = new int[51]; int[]occur = ; int[] nums = ; System.out.println("Enter an integer (00 to quit)"); int integer = sc.nextInt(); //for(int index = 0; index 25) < continue; >if(n == 00) < break; >occur[n] += 1; nums[n] = n; > System.out.println("All Numbers entered:"); for(int i = -25; i < nums.length; i++)< System.out.print(nums[i] + " "); >System.out.println(); System.out.println("All Occurrences: "); for(int i = -25; i < occur.length; i++)< System.out.print(occur[i] + " "); >sc.close(); > > 

4 ответа

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

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

Затем вам нужно принять ввод как String, иначе вы не сможете определить, вводит ли пользователь 00 для выхода из программы. После этой проверки String можно преобразовать в int с помощью Integer.valueOf(input) .

Читайте также:  Php цикл на примерах

Затем вам нужно изменить начальные параметры цикла for с 0 на длину возникновения. Вы не можете использовать минусовые значения для индексов в массиве. Я считаю, что вы сможете понять другую логику в коде.

Вы можете пройти через обновленный код

import java.util.Scanner; public class SixTwo < public static void main(String[] args) < Scanner sc = new Scanner(System.in); // int[] nums = new int[51]; //You need to change the initial data of the occur array to zero int[] occur = < 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 >; int[] nums = < -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 >; for (;;) < System.out.println("Enter an integer between -25 to 25 (00 to quit)"); //You need to take input as String other wise you will not be able to find whether user enter 00 String input = sc.next(); if(input.equals("00"))< break; >int n = 0; try < n=Integer.valueOf(input); >catch (Exception e) < continue; >//You need to add check whether entered number out of range if (n > 25 || n <-25) < System.out.println("Out of range"); continue; >occur[25+n] = occur[25+n]+1; > System.out.println("All Occurrences: "); for (int i = 0; i < nums.length; i++) < System.out.println(nums[i] + ":"+occur[i]); >System.out.println(); sc.close(); > > 

Тогда давайте предположим, что если вы вошли, то 1,3,4,4, -25,0,0,00

All Occurrences: -25:1 -24:0 -23:0 -22:0 -21:0 -20:0 -19:0 -18:0 -17:0 -16:0 -15:0 -14:0 -13:0 -12:0 -11:0 -10:0 -9:0 -8:0 -7:0 -6:0 -5:0 -4:0 -3:0 -2:0 -1:0 0:2 1:1 2:0 3:1 4:2 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:0 15:0 16:0 17:0 18:0 19:0 20:0 21:0 22:0 23:0 24:0 25:0 

Вы не можете получить доступ к числу с отрицательным индексом. Попробуйте nums[n + 25] для подсчета повторов. Также итерация от -25 до occur.length не имеет смысла, так как у вас всего 50 чисел, а occur.length — 50 (так что это будет означать, что длина массива равна 75. Вы должны начать с 0.

Причина ошибки довольно проста: Java допускает только положительные целые числа и 0 в качестве индексов массива, и вы не можете это изменить. Однако вы можете использовать Map вместо массива. Карта — это в основном массив, но индекс может быть любым, например. г. String или отрицательные целые числа, действительно что угодно.

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

import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class SixTwo < public static void main(String[] args) < Scanner sc = new Scanner(System.in); Mapoccur = new HashMap<>(); // initialize the map with zeros for (int i = -25; i for (; ; ) < // Java does not differentiate between the integers 00 and 0 so better use anything else that is not a // valid value, like the word 'quit' System.out.println("Enter an integer (Enter quit to quit)"); // We need to read the input as a String now to recognize the word quit String input = sc.nextLine(); // input=="quit" wouldn't work because Strings are not a primitive datatype if (input.equals("quit")) < break; >// Now convert the input to int int n = Integer.parseInt(input); // Don't forget to check against -25 too if (n > 25 || n < -25) < System.out.println("Number was out of range, ignoring. "); continue; >occur.put(n, occur.get(n) + 1); > System.out.println("All Numbers entered:"); for (int i = -25; i 0; spc--) < System.out.print(" "); >System.out.print(i); > System.out.println(); System.out.println("All Occurrences: "); for (Map.Entry entry : occur.entrySet()) < // print the right number of spaces to get a perfect table for (int spc = 4 - entry.getValue().toString().length(); spc >0; spc--) < System.out.print(" "); >System.out.print(entry.getValue()); > sc.close(); > > 

Почему вы используете массив? Просто используйте карту:

Затем для каждого ввода числа:

int n; // input by user counts.merge(n, 1, (a, b) -> a + b); 

После всех вводов у вас будет количество каждого числа, которое вы выведете следующим образом:

counts.forEach(System.out::println); 

Обратите внимание, что это будет работать для любых целочисленных значений.

Источник

Как не допустить ввода отрицательного числа для

Я пробовал Math.abs и оператор if, и ничего не работает. Я немного смущен. Как я могу не принимать отрицательные числа с помощью цикла for в Java, пользователь не может вводить отрицательные числа в качестве защитного программирования? Возьмите следующий фрагмент кода:

прочитайте ввод в переменной, добавьте цикл while, который перечитывает ввод, пока ввод

Как и это, просто удалите часть, в которой проверяется, больше ли входное значение 100.

как вы думаете, что 0 меньше, чем 0?

Но таким образом с помощью while я не смогу сделать это с массивом, и поэтому я не смогу заставить пользователя вводить столько информации, сколько он хочет.

конечно, вы сможете сделать это с массивом. и, конечно же, вы сможете позволить пользователю вводить столько, сколько он хочет. Я не предлагал вам заменить for на некоторое время, я сказал, что вы должны вложить некоторое время в свой цикл for

Вы хотите либо 1) игнорировать отрицательные числа, либо 2) убедиться, что вы получаете как минимум array.length числа > 0, или 3) преобразовать отрицательные числа в положительные?

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

Управление транзакциями JDBC — это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно.

WebClient — это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.

Ответы 2

Оберните чтение значения в цикле. Не выходите из цикла, пока пользователь не введет неотрицательное значение. Например..

for (int i=0; i= 0) < break; >System.out.println("Value cannot be negative"); > > 

почему пока правда? все, что должно быть в то время, это input.nextDouble(); сохраните это в переменной: while (input < 0 ) будет работать нормально

@Stultuske Я решил избегать временной переменной в своем примере. YMMV

Я полагаю, вы новичок в Java. Добро пожаловать в волшебный мир Java 🙂

В зависимости от того, как выглядит ваш код, более «профессиональным» способом является создание исключения: вы можете немного поискать в Google и попытаться настроить свой код и то, как он будет реагировать на исключение.

С другой стороны, это кажется простым проектом, поэтому что-то вроде

 Double a = input.nextDouble(); if (a > 0)< System.out.println("No negative values allowed"); >else

Да, я новичок в Java, и я действительно восхищаюсь этим языком. Я хотел бы спросить, можем ли мы сделать то же самое, когда у нас нет массива?

` while (true) < double a = input.nextDouble(); если (а >0) < перерыв; >else System.out.println(«отрицательные значения не допускаются»); > System.out.println(); System.out.println(«дать значение: «); в то время как (истина) < двойной b = input.nextDouble(); если (b>0) < перерыв; >else System.out.println(«отрицательные значения не допускаются»); > `

мой код, я не могу сделать то же самое, потому что использую double a = input.nextDouble(); внутри цикла while, и я не могу использовать его вне его, когда хочу вычислить что-то еще

извините за мой код в комментариях, я пытаюсь узнать, как это исправить

Источник

Ввод отрицательных чисел в массив

Я запускаю массив, основанный на вводе числа. Он использует рекурсию, чтобы найти минимальное число в массиве. Если пользователь вводит 0, программа заканчивается. Он отлично работает, пока я не обработаю отрицательные числа, скажем, я ввожу 0 2 3 5 3. Возврат приходит правильно, самое низкое число будет 0. Однако если я вхожу 2 9 92 2 -1 0. Программа не заканчивается, как только я введите 0, поэтому оно не отображает -1 в качестве минимального числа. Любые предложения или помощь.

 import java.io.*; import java.text.*; public class Assignment9 < public static void main (String args[]) throws IOException < int i = 0; double[] NumArray; NumArray = new double[100]; // input stream reader reads in keyboard inputs, while buffered reader // reads in the line as a string15. InputStreamReader inRead = new InputStreamReader(System.in); BufferedReader buffRead = new BufferedReader(inRead); String line = buffRead.readLine(); // if the string is equal to 0 and is false AND i is less than22. // 100, parse string into double.23. try < while (line.equals("0") == false && i<100) < i++; line = buffRead.readLine(); NumArray[i]=Double.parseDouble(line); >> catch(IOException e) < System.out.println("Array index out of bound"); >double min = findMin(NumArray, 0, NumArray.length - 1); System.out.print ("The minimum number is " + min + ('\n')); public static double findMin(double[] NumArray, int startIndex, int endIndex) < if (startIndex == endIndex) < return NumArray[startIndex]; >else if(findMin(NumArray, startIndex, endIndex - 1) < NumArray[endIndex]) < return findMin(NumArray, startIndex, endIndex -1 ); >else < return NumArray[endIndex]; >> 

Во-первых, вы не сохраняете первый номер, который вы ввели в массив. Храните его, если оно не 0 .

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

Наконец, вы вызываете findMin из findMin дважды, если не в базовом случае. В массиве есть 100 элементов, поэтому вы будете называть findMin до 2^100 раз!

Сохраните результат рекурсивного вызова, поэтому вы вызываете его только один раз за рекурсию. + Изменить

if (startIndex == endIndex) < return NumArray[startIndex]; >else if(findMin(NumArray, startIndex, endIndex - 1)
double min; if (startIndex == endIndex)

Проблема в том, что ваш рекурсивный метод вызывает себя дважды. Если вы вызываете его с массивом из 100 элементов, то он будет вызывать себя дважды с под-массивом из 99 элементов; который будет вызывать себя дважды с подматрицей из 98 элементов, каждый раз, когда он вызывал, в общей сложности 4 раза; и так далее. В результате метод будет называться 2 ^ 100 раз (от 2 до 100-й мощности) !! Или, может быть, это 2 ^ 99 или 2 ^ 101, я не проверял. Но это много. Поэтому ваша программа не останавливается, если в массиве есть отрицательное число.

Чтобы решить эту проблему, перестройте свой код, чтобы вызвать findMin только один раз, и назначьте ему переменную, а затем используйте значение переменной.

Другие проблемы. Когда main вызовы findMain , он вызывает его с 0 и 99 в качестве границ, даже если вы не ввели столько чисел. Верхняя граница должна быть исправлена. Наконец, если вы NumArray[0] через код, вы увидите, что main никогда не устанавливает NumArray[0] ; первым элементом, который он устанавливает, является NumArray[1] . Но значение (неинициализированное) все еще используется при поиске минимума. (Я думаю, что он всегда будет 0, на Java, но на других языках выполнение чего-то подобного приведет к случайному значению мусора).

Источник

Не проходит проверку на отрицательные числа

Компилятор пишет: «Проверь, что программа правильно работает с отрицательными числами». Ребята, объясните пожалуйста, что не так. Какие еще отрицательные числа ? 1) Переменной int max уже присвоено самое максимально (вниз) отрицательное число из возможных, т.е. Integer.MIN_VALUE; 2) Каково бы ни было значение переменной max: — либо отрицательное (по умолчанию Integer.MIN_VALUE), если сканеру не подкинули на считывание положительное число; — либо положительное, если таковое было введено; в итоге все равно будет выведено значение переменной max. Так какой еще проверки на отрицательные числа просит компилятор ? Я скорее интуитивно ждал, что мне выдаст ошибку о невыводе Integer.MIN_VALUE в случае если сканер наткнется на символ или строку. Думал для этого прописать else для символа или строки. Но потом подумал, что никаких else на символ и строку не нужно, т.к. у меня и так System.out.println(max) стоит за рамками цикла и так или иначе выведет первичное значение max (т.е. Integer.MIN_VALUE) в случае если цикл даже не начнется, если hasNextInt не обнаружит во вводе цифр.

Программа должна считывать целые числа с клавиатуры до тех пор, пока не будет введено что-то другое: например, строка или символ. Выведи на экран максимальное четное число из введенных. Если введено несколько таких чисел, необходимо вывести любое из них.

Если среди введенных символов нет четного числа или введен только один не числовой символ, то вывести на экран минимальное значение числа типа int.

Источник

Оцените статью