Может кто-нибудь объяснить мне этот код? О пользовательском вводе, сканере и т. Д. - PullRequest
0 голосов
/ 24 октября 2019

Может кто-нибудь объяснить мне, как работает этот код?

Позволяет пользователю вводить числа вплоть до 1000, затем печатает исходные введенные числа, четные и нечетные, все в отдельном массиве. Но я просто не понимаю части, где есть gem++ и gem1++, когда он выводит четное и нечетное число четных и нечетных чисел.

И после помещения этого

double even[] = new double[gem];
double odd[] = new double [gem1]; 

зачем нужно повторять gem=0 и gem1=0 снова? Мне очень жаль, если я задаю слишком много вопросов, я просто запутался, я только что выучил Java на прошлой неделе.

public class wutt {
    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        System.out.print("Enter no. of elements you want in array : ");
        int n = s.nextInt();

        if (1 <= n && n <= 1000) {

            double a[] = new double[n];
            int gem = 0, gem1 = 0;

            System.out.println("Enter all the elements : ");
            for (int i = 0; i < n; i++) {
                a[i] = s.nextInt();
                if (a[i] % 2 == 0)
                    gem++;
                else
                    gem1++;
            }

            double even[] = new double[gem];
            double odd[] = new double[gem1];

            gem = 0;
            gem1 = 0;

            for (int i = 0; i < a.length; i++) {
                if (a[i] % 2 == 0) {
                    even[gem] = a[i];
                    gem++;
                } else {
                    odd[gem1] = a[i];
                    gem1++;
                }
            }

            System.out.println("Original: " + Arrays.toString(a));
            System.out.println("Odd: " + Arrays.toString(odd));
            System.out.println("Even: " + Arrays.toString(even));

        } else
            System.out.print("Invalid input");
    }
}

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

код перед double even[] = new double[gem]; double odd[] = new double [gem1]; пытается получить число произошедших шансов и число четных и поместить все введенные элементы в массив a. после всего этого теперь мы получили массив чисел с именем a, содержащий все введенные элементы. и два числа, называемые gem и gem1, которые содержат число произошедших шансов и число четных. поэтому мы получаем gem (numberOfEvens), gem1 (numberOfOdds) и список a

, затем нам нужно поместить все коэффициенты из a в новый массив с именем odd [] с размером gem1 и поместить всеevens от a до нового массива, называемого even [] с размером gem. на этом этапе обязанность переменной gem1 и gem выполнена. они становятся бесполезными.

Теперь нам нужно пройти по списку, выбрать нечетные и четные и последовательно поместить их в массив последовательно. Вот почему нам нужны две новые переменные с инициализированными 0. в этом случае, поскольку gem и gem1 бесполезны, они переназначаются, чтобы помочь манипулировать массивами деревьев a, odd[] и even[]

0 голосов
/ 24 октября 2019

Таким образом, пользователь вводит количество элементов, которое он / она хочет в массиве (n)

double a[] = new double[n];   // a is the array that is initialised to accommodate n elements
int gem = 0, gem1 = 0;        // gem is the counter for "even" numbers and "gem1" the counter for odd numbers, and like every good counter, they start at 0

System.out.println("Enter all the elements : ");
for (int i = 0; i < n; i++) {     // so we ask the user to input n elements
    a[i] = s.nextInt();           // here we read every input and put it in the a array
    if (a[i] % 2 == 0)            // if the new number is even
        gem++;                    // we increase the even counter "gem"
    else                          // otherwise, when it is an odd number
        gem1++;                   // we increase the odd counter
}

double even[] = new double[gem];  // now we create a new array where we want to hold all the even numbers, we do that by telling it how many even numbers we have counted before (gem)
double odd[] = new double[gem1];  // and a new array for all odd numbers (gem1 was our counter)

gem = 0;                          // now we reinitialise the counters, because we want to start from the beginning
gem1 = 0;

for (int i = 0; i < a.length; i++) { // in order to copy all numbers from the a array into the two other arrays for even and odd numbers, we iterate over the whole length of the a array. i is the index for the "a" array
    if (a[i] % 2 == 0) {             // ever even number we encounter
        even[gem] = a[i];            // we put in the even array
        gem++;                       // while gem, the "even numbers counter" is our index for the "even" array
    } else {
        odd[gem1] = a[i];            // odd numbers are for the odd array
        gem1++;                      // while the former "odd numbers counter" now serves as our "odd" array index
    }
}

, и это почти все. Сначала пользователь вводит все числа в одном массиве и просто подсчитывает, сколько нечетных и сколько четных чисел было введено,

, затем создаются два новых массива, один для четного и один для нечетных чисел, и так как мыпосчитав их, мы знаем, насколько большими должны быть эти два новых массива.

И, наконец, все числа снова повторяются и помещаются в соответствующий им массив. В конце у вас есть 3 массива, один из которых содержит все чисел, один из которых содержит четные числа и один содержит только нечетные числа.

РЕДАКТИРОВАТЬ

Вот несколько незначительных изменений, которые вы можете сделать, не меняя природу этого метода:

double allNumbers[] = new double[n];  // "allNumbers" is way more specific than "a"
int oddCounter = 0;                   // "oddCounter" instead of "gem"
int evenCounter = 0;                  // numbers in variables like "gem1" is really bad practice, because numbers don't say anything about the nature of the variable

System.out.println("Enter all the elements : ");

for (int i = 0; i < n; i++) {
    allNumbers[i] = s.nextInt();
    if (allNumbers[i] % 2 == 0) {
        evenCounter++;
    } else {
        oddCounter++;
    }
}
// until here nothing changes but the names

double even[] = new double[evenCounter];
double odd[] = new double[oddCounter];

int oddIndex = 0;                   // and here we create new variables, instead of reusing old ones
int evenIndex = 0;                  // there is absolutely no performance gain in reusing primitives like this - it's just confusing
for (int i = 0; i < allNumbers.length; i++) {
    if (allNumbers[i] % 2 == 0) {
        even[evenIndex++] = allNumbers[i];   // the "++" can be done directly in the first expression. that's just to make it shorter.
    } else {
        odd[oddIndex++] = allNumbers[i];     // it is not more performant nor easier to read - just shorter
    }
}

РЕДАКТИРОВАТЬ (снова)

Вот так выглядят массивы, скажем, когда вы вводите 4 цифры:

gem = 0
gem1 = 0
n = 4               // user said 4 
a = [ , , , ]       // array a is empty but holds the space for 4 numbers

a = [1, , , ]       // user enters 1
     ^
    i=0

gem1 = 1            // 1 is an odd number -> gem1++

a = [1,4, , ]       // user entered "4"
       ^
      i=1
gem = 1             // 4 is an even number -> gem++

a = [1,4,2, ]       // user entered "2"
         ^
        i=2
gem = 2             // 24 is an even number -> gem++

a = [1,4,2,7]       // user entered "7"
           ^
          i=3
gem1 = 2             // 7 is an odd number -> gem1++


then we fill the other arrays

even = [ , ]          // gem is 2, so we have 2 even numbers
odd  = [ , ]          // gem1 is 2, so we have 2 odd numbers

a = [1,4,2,7]
     ^ 
    i=0

odd[1, ]    // for i=0, a[i] is 1, which is an odd number

a = [1,4,2,7]
       ^ 
      i=1

even = [4, ]    // for i=1, a[i] is 4, which is an even number

a = [1,4,2,7]
         ^ 
        i=2

even = [4,2]    // for i=2, a[i] is 2, which is an even number

a = [1,4,2,7]
           ^ 
          i=3

odd = [1,7]    // for i=3, a[i] is 7, which is an odd number

and in the end you have

a    = [1,4,2,7]
even = [4,2]
odd  = [1,7]
0 голосов
/ 24 октября 2019

Если вы хотите, чтобы программа остановилась после того, как пользователь введет число больше 1000 или меньше 0, вам нужно добавить оператор break в ваше условие if.

if (size < 0 || size > 1000) {
    System.out.println("Size must be between 0 and 1000");
    break;
}
...