• Апреля 19, 2019, 10:10:15 am
• Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Новости: Вебинар о выборе IT профессии и руководство для новичков: http://bit.ly/2HG2vFp

Автор Тема: Java start (online) Пархоменко Александр (Вопросы)  (Прочитано 987 раз)

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #45 : Января 25, 2019, 01:07:23 am »
MegaStack
Ну, что по порядку.
Как я уже и говорил в лекции двух мерные массивы, это одномерные массивы каждым элементом которого является ссылка на одномерные массивы. Обращаясь в двух мерном массиве по первому индексу мы получаете по сути ссылку на другой одномерный массив.
Т.е.
аrray[0] — вернет вам ссылку на одномерный массив, который и представляет собой 0-ю строку этого массива. А уже когда вы переходите по этой ссылке там вы и обнаружите другой   одномерный массив.
Таким образом аrray[0] — не может быть в двух мерном массиве 5, в принципе.
Другой вопрос что вы так не делали и оно заработало, а вот это наоборот очень странно. Работать так оно явно не должно. Такой код как вы привели сработает только в одном случае, если количество строк в массиве равно количеству столбцов в остальных случаях это работать не будет.

Акцентировал внимание что бы было понимание что у двухмерного массива длинна это сколько в нем ссылок на одномерные массивы, что в принципе одно и тоже что сколько в нем строк.

Вопрос 2.
Так на i — месте массива b т. е. b уже лежит ссылка на одномерный массив, вот она то и выступает в качестве имени

Вопрос 3.
Эта строка кода присваевает ссылке на  i — индексе одномерный массив длинной i

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #46 : Февраля 04, 2019, 09:57:30 pm »
MegaStack

Другой вопрос что вы так не делали и оно заработало, а вот это наоборот очень странно. Работать так оно явно не должно. Такой код как вы привели сработает только в одном случае, если количество строк в массиве равно количеству столбцов в остальных случаях это работать не будет.


У меня почему-то работает. И количество столбцов не соответствует количеству строк!!!! Вот код:

package com.gmail.oastro36;

import java.util.Arrays;

public class Main {

public static void main(String[] args) {

int[][] array = new int[4][5];

for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
array[i][j] = (int) (Math.random() * 10);
System.out.print(array[i][j] + "\t");
}
System.out.println();
}

}

}

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #47 : Февраля 05, 2019, 12:24:51 am »
MegaStack

Нее не работает :).

Тут вам опять повезло что столбцов больше чем строк. А вы наоборот попробуйте например так:

int[][] array = new int[4][3];

for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
array[i][j] = (int) (Math.random() * 10);
System.out.print(array[i][j] + "\t");
}
System.out.println();
}

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #48 : Февраля 11, 2019, 08:55:41 pm »
Добрый вечер. Вроде бы полностью разобрался с двухмерными массивами. Но у меня возник вопро. В видеолекции был такой код:

package com.gmail.oastro36;

import java.util.Arrays;

public class ArrayMain {

public static void main(String[] args) {

int[][] array = new int[4][5];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
array[i][j] = (int) (Math.random() * 10);
System.out.print(array[i][j] + "\t");
}
System.out.println();

}

for (int[] row : array) {
System.out.println(Arrays.toString(row));
}

}

}

Вопрос связан с работой цикла foreach. Я правильно понимаю смысл его работы: за одну итерацию цикла foreach выводится одна строка??? То есть за одну итерацию перебираются все 5 j-х элементов каждого i-го элемента. То есть не каждый j-й элемент за одну итерацию, а все в строке. Так или не так????

И еще был в видеолекции такой код (практическая задача) Там где нужно было считать с клавиатуры целое положительное число (n), сформировать массив с одинаковым количеством строк и столбцов равным введенному число, и заполнить масив цифрами по возрастанию от 1 до n. Вывести массив на экране и вычислить сумму цифр по главной диагонали. Вы в своем решении подсчитали суму цифр по диагонали через цикл, а я это сделал через условный оператор if, а именно:

package com.gmail.oastro36;

import java.util.Arrays;
import java.util.Scanner;

public class ArrayMain {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
System.out.println("Введите размер массива(целое число): ");
int n = sc.nextInt();

int[][] array = new int[n][n];
int num = 0;

for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {

array[i][j] = j + 1;

if (i == j) {
num = num + array[i][j];
}
}

}

for (int[] row : array) {
System.out.println(Arrays.toString(row));
}
System.out.println("Сумма цифр по диагонали: " + num);

}

}

Вопрос. Можно ти так через if?


« Последнее редактирование: Февраля 11, 2019, 09:58:39 pm от megaStack »

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #49 : Февраля 11, 2019, 11:57:27 pm »
MegaStack

Вопрос о цикле for — each для двух мерного массива. Так как каждым элементом двумерного массива является ссылка на одномерный массив, то за каждую итерацию переменной цикла присваивается сразу целая строка.


Вопрос о решении через if. Так решать можно но вы выполните много лишних итераций. Но решение будет работоспособно.

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #50 : Февраля 12, 2019, 10:13:06 am »
А поясните, почему через if будет много лишних итераций?

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #51 : Февраля 12, 2019, 01:49:41 pm »
МegaStack

Ну смотрите обычно вам массивы уже будут приходить готовые (например по сети), что бы проссумировать диагональные элементы массива вашим способом (с использованием if для массива 5х5 = 25 действий) в тоже время для перебора диагональных элементов циклом всего 5 действий. Вроде небольшая разница, но для массива 1000х1000 (средненькая фотография ) ваш способ должен выполнить 1_000_000 действий, а просто циклом по диагонали 1000 действий, что уже весьма и весьма существенно.

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #52 : Февраля 25, 2019, 10:30:32 pm »
У меня возник вопро по одной из старой задачке. "Про высокосный год". В свое время я решил эту задачу правильно, но мой код был очень громоздкий, и я подсмотрел решение у других, и код оказался очень простым и коротким:

package com.gmail.oastro36;

import java.util.Scanner;

public class Main1 {

public static void main(String[] args) {
// количество дней в году

Scanner sc = new Scanner(System.in);

System.out.println("Введите год:");

int year = sc.nextInt();

if ((year % 4 / 400 == 0 && year % 4 == 0) || year % 4 / 100 != 0) {
System.out.println("Год высокосный");
} else {
System.out.println("Год невысокосный");
}
}

}

Вопрос: Поясните, зачем мы в if-е остаток от деления года на 4 делим на 400??? и потом, остаток от деления года на 4 делим на 100 ???? Поясните подробно что это нам дает???


Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #53 : Февраля 26, 2019, 01:20:48 am »
МegaStack

Да это не совсем правильное решение так как оно не учитывает того что 100 и 200 и т.д. не высокостные годы. Так что не стоит его брать во внимание.

Присмотритесь лудше к такому решению:

package com.gmail.tsa;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int year;
System.out.println("Input year");
year = sc.nextInt();
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println(year + " is leap year");
} else {
System.out.println(year + " is not leap year");
}
sc.close();
}

}

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #54 : Февраля 26, 2019, 09:55:34 am »
Понял. Просто не совсем понятно зачем остатки еще делить на что-то. Вобщем суть я понял. А можете рассказать, что делает строка: sc.close()

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #55 : Февраля 26, 2019, 11:27:39 am »
МegaStack

А это сила привычки :). Это я сканер закрываю. При работе с клавиатурой это делать не обязательно. Это когда из файла читаешь, то обязательно закрывать.

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #56 : Марта 03, 2019, 10:56:42 pm »
Очередной вопрос. В видеолекции про массивы был такой код:

package com.gmail.oastro36;

import java.util.Arrays;

public class Main {

public static void main(String[] args) {

int[][] array = new int[4][5];

for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
array[i][j] = (int) (Math.random() * 10);
}
}
int[] a = { 4, 2, 9, 0 };
for (int element : a) {
System.out.println("element = " + element);
element = 1;
}
System.out.println(Arrays.toString(a));
}

}

И Вы говорили, что в цикле for-each изменение переменной element не влияет на массив (так и говорили....). Вопрос: А почему он вообще должен влиять на массив, если мы нигде не указываем , что нужно что-то менять в массиве. Мы в коде указали только то, что хотим в переменную element поочередно поместить каждое значение индекса из массива - "а", далее мы выводим содержимое переменной element поочередно и тут же меняем значение переменной на 1. Может Вы имели ввиду, что попытка измененить содержимое переменной element в цикле, не изменит её содержимое??????

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #57 : Марта 03, 2019, 11:23:24 pm »
МegaStack

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

megaStack

  • Пользователи
  • *
  • Сообщений: 67
  • мой ник на сайте lms.prog.kiev.ua: Coffe-Java
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #58 : Марта 11, 2019, 10:58:31 pm »
Вопрос по поводу методов. Был такой код:

package com.gmail.oastro36;

import java.util.Arrays;

public class Main {

public static void main(String[] args) {

int[] arr = new int[] { 3, 5, 7, 9 };

System.out.println("arr в методе main: " + Arrays.toString(arr));

int sum = getSum(arr);

System.out.println(sum);

System.out.println("arr в методе main: " + Arrays.toString(arr));
}

static int getSum(int[] arr) {
arr[0] += 3;
arr = new int[] { 3, 5, 7, 8, 9, 10 };
int sum = 0;
System.out.println("arr в методе getSum: " + Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}

}

Вопросы:
1) Зачем мы в строке:
int[] arr = new int[] { 3, 5, 7, 9 };справа указываем: new int[] ? Ведь на сколько я помню, Вы объясняли, что если нам известно количество элементов массива и их значения, то можно записать просто:
int[] arr = { 3, 5, 7, 9 };.
Я ради интереса убрал справой стороны new int[] и у меня код работал в виде:
int[] arr = { 3, 5, 7, 9 };.

2) Так же не совсем понятно, какую роль играет arr в методе getSum когда мы писали такую строку:
arr = new int[] { 3, 5, 7, 8, 9, 10 };
arr – это переменная, или ссылка, или имя ссылки, или что это??? И если это переменная, то почему мы не указываем её тип (напирмер – int).

3) И еще не понятен один момент в видео. Если Вы откроете видео в момент времени (32 минуты до окончании), Вы говоритие: "а если мы попытаемся изменить надпись на табличке, то есть взять и вот этому arr-у присвоить новый какой-то массив...." Вопрос: что имелось ввиду под Вашими словами: "изменить надпись на табличке"????

И последний вопрос. Я правильно понимаю суть передачи параметров: Если Мы в главном методе объявили массив допустим дали ему имя array, и из любого другого метода будем пытаться менять значения элементов массива array, то значение элементов поменяются и в главном методе. Но если мы, в каком-то методе к тому же имени array присвоим другой массив, и будем его менять в пределах метода в котором мы сделали новое присвоение с тем же самым именем array, то это никак не повлияет на массив главного метода, то есть получится два разных массива с именем array? в двух разных методах. Я правильно понимаю??????


« Последнее редактирование: Марта 11, 2019, 11:28:52 pm от megaStack »

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 11495
    • Просмотр профиля
    • E-mail
Re: Java start (online) Пархоменко Александр (Вопросы)
« Ответ #59 : Марта 12, 2019, 01:41:47 am »
МegaStack

Вопрос 1.
Ну тут вы правы будет работать и так и так.
Вопрос 2.
Обратите внимание на параметры метода:
        static int getSum(int[] arr) {Как вы видите arr это ссылка на массив типа int.
И этой строкой
arr = new int[] { 3, 5, 7, 8, 9, 10 };
Мы пытаемся присвоить этой ссылке ссылку на новый объект (массив)

Вопрос 3.
Чуть раньше в видео я проводил аналогию ссылки с картонной табличкой на которой написано адрес здания (так я пытаюсь упростить понимание ссылок). И под словами изменить надпись на табличке имелось в виду что при присвоении друг другу ссылок вторая ссылка будет указывать туда же куда и первая, т. е. Текст на 2-х табличках станет одинаковым.

Да вы правы будет 2 массива с именем array в двух разных методах.