class primer_arr2_2

{

static Scanner reader = new Scanner(System.in);

static final int n=6; //Объяснение этой записи, встречающейся впервые – ниже!

public static void main(String[] args)

{

int [] []a=new int[n][n];

for (int i=0;i<a.length;i++)

{

a[i][i]=1;

a[i][n-i-1]=2;

}

for(int i=0;i<a.length;i++)

System.out.println(Arrays.toString(a[i]));

}

}

Одна "диагональ" заполняется значениями 1, а вторая – значениями 2. На экран это будет выводиться вот в таком виде:

[1, 0, 0, 0, 0, 2]

[0, 1, 0, 0, 2, 0]

[0, 0, 1, 2, 0, 0]

[0, 0, 2, 1, 0, 0]

[0, 2, 0, 0, 1, 0]

[2, 0, 0, 0, 0, 1]

Обратите внимание еще на одну строку в классе:

static final int n=6;

Она не просто устанавливает значение переменной n равным 6, но еще и описывает эту переменную как "недопустимую к изменениям значения" (final). Это ограничение связано с уже опоминавшимся правилом: размер массива можно устанавливать гибко, но после установления нельзя менять.

Мы приведем еще несколько примеров для методов, использующих в качестве параметра (или, по крайней мере, одного из параметров) "прямоугольный" двумерный массив (массив, в котором во всех строках одинаковое количество ячеек). Дело в том, что "прямоугольные" двумерные массивы фактически являются стандартными таблицами данных – а работа с такими таблицами является (и еще долго будет оставаться) одной из главных потребностей современных информационных систем.

"Напишите метод, который принимает в качестве параметра "прямоугольный" двумерный массив и возвращает сумму значений в этом массиве."

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

public static int sum_arr(int [][] t)

{

int s=0;

for(int i=0;i<t.length;i++)

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

s+=t[i][j];

return s;

}

Обратите внимание, как с помощью t.length определяется количество "строк", а с помощью t[i].length – количество ячеек в "строке". Напомним: двумерный массив по сути является массивом массивов.

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

Написать этот метод можно двумя способами: либо создать метод типа void, который будет выводить на экран нужные значения – либо использовать вспомогательный метод для вычисления сумм, а нужный нам метод будет только выводить на экран требуемые значения.

Приведем решение по первому способу.

public static void print_sum(int [][] t)

{

int s;

for(int i=0;i<t.length;i++)

{

s=0;

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

s+=t[i][j];

System.out.print(s+" ");

}

}

"Напишите метод, который принимает в качестве параметра "прямоугольный" двумерный массив и выводит на печать индексы всех ячеек, которые содержат максимум массива."

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

public static void max_pos(int [][] t, int max)

{

for(int i=0;i<t.length;i++)

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

if (t[i][j]==max)

System.out.print(i+" & "+j+": ");

}

}

"Напишите метод, который принимает в качестве параметра "прямоугольный" двумерный массив и проверяет, являются ли все его нечетные строки упорядоченными по возрастанию. Метод должен возвращать одно из значений, true или false, в зависимости от результатов проверки."

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

public static boolean is_up(int [][] t)

{

boolean res=true;

//Устанавливаем исходное значение возвращаемой переменной

for(int i=1;i<t.length;i+=2)

{

int [] b=new int[t[1].length];

// Создаем вспомогательный массив размером, равным размеру строки

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

b[j]=t[i][j];

// Копируем строку во вспомогательный массив

Arrays.sort(b);

// Сортируем вспомогательный массив

if(t[i].equals(b)==false)

res=false;

/*

Если строка и вспомогательный массив неодинаковы, значит строка не упорядочена по возрастанию, и возвращаемая переменная получает соответствующее значение

*/

}

return res;

}

"Напишите метод, который принимает в качестве параметров "прямоугольный" двумерный массив и две пары чисел, каждая из которых указывает на одну из ячеек. Метод должен возвратить среднее арифметическое значений из всех ячеек, расположенных "построчно" между указанными."

Поясним пример рисунком, на котором закрашены фоном те ячейки, среднее арифметическое которых следует найти. Для приведенного ниже рисунка первая пара чисел должна быть 1 и 3 (строка №1 и в ней ячейка №3), а вторая пара чисел – 3 и 1.

           
           
           
           
           

public static double sum_part_arr(int [][] t, int row1, int col1, int row2, int col2)

{

double s=0;

int count=0;

return s;

}

Одним из частных случаев "прямоугольного" двумерного массива является массив "квадратный" – в котором количество строк равно количеству столбцов. Особенностью такого типа двумерных массивов является существование в нем "диагоналей": "главная" – из левой верхней ячейки в правую нижнюю, "вторичная" – из правой верхней ячейки в левую нижнюю. Эта особенность "квадратных" двумерных массивов порождает дополнительную группу задач. Разберем некоторые из них.

"Напишите метод, который принимает в качестве параметра двумерный "квадратный" массив и возвращает сумму элементов, находящихся на главной диагонали."

В методе использован факт, что индексы ячеек, находящихся на главной диагонали, являются парами одинаковых чисел.

public static int sum_diag(int [][] t)

{

int s=0,n=t[0].length;

for(int i=0;i<n;i++)

s+=t[i][i];

return s;

}

"Напишите метод, который принимает в качестве параметров двумерный "квадратный" массив и целое число Х. Метод возвращает количество ячеек, которые содержат значение Х и находятся на одной из диагоналей."

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

public static int count_diags(int [][] t, int x)

{

int count=0,n=t[0].length;

for(int i=0;i<n;i++)

if(t[i][i]==x) count++;

for(int i=0;i<n;i++)

if(t[i][n-i-1]==x) count++;

return count;

}

"Напишите метод, который принимает в качестве параметра двумерный "квадратный" массив и проверяет, содержат ли все ячейки над главной диагональю одно и то же значение. Метод должен возвращать одно из значений, true или false, в зависимости от результатов проверки."

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

public static boolean allow(int [][] t)

{

boolean res=true;

int x=t[0][1], n=t[0].length;

for(int i=0;i<t.length-1;i++)

for(int j=i+1;j<n;j++)

if(t[i][j]!=x) return false;

return res;

}

"Напишите метод, который принимает в качестве параметров двумерный "квадратный" массив М и три целых числа – row, col, long. Метод должен проверить, существует в массиве М квадратный под-массив, верхняя левая ячейка которого расположена в позиции [row, col] и размер которого long X long. Метод должен возвращать одно из значений, true или false, в зависимости от результатов проверки."

public static boolean is_found(int [][] m, int row, int col, int long)

{

boolean res=true;

n=t[0].length;

if (row+long>n) return false;

if (col+long>n) return false;

return res;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: