Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab03_2010

.pdf
Скачиваний:
29
Добавлен:
07.06.2015
Размер:
1.72 Mб
Скачать

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

Рис. 79. Метод changeMatrix()

Последний метод, имеющий отношение к решению пункта г) задачи – метод печати (измененного) двумерного массива (рис. 80). Обратите внимание на то, что первый элемент каждой строки выводится вне внутреннего цикла (и объясните, зачем это сделано). Вывод результата осуществляется в файл d.txt.

Рис. 80. Печать массива

Добавьте методы changeMatrix() и printMatrix() к методу main() главного класса (рис. 81), сохраните проект и запустите его на выполнение.

41

Рис. 81. Метод main() дополнен методами для решения последней части задачи

В результате будет сформирован файл d.txt (рис. 82). Убедитесь, что все элементы, которые удовлетворяли условию пункта г) задачи, заменены суммой своих соседей, и что эта сумма подсчитана правильно.

Рис. 82. Файл d.txt с измененным массивом

Пожалуй, единственная претензия к выведенному файлу – его не слишком «аккуратный» вид: числа расположены не в столбиках, а с «произвольным смещением». Исправить это можно, использовав метод printf() класса PrintWriter. Это очень мощный инструмент, и в данной лабораторной работе мы не будем заниматься его подробным изучением. Общий принцип работы printf() – сформировать из данных, которые ему переданы, на основе локали и форматирующей строки требуемое представление.

С понятием локали Вы уже сталкивались при изучении класса Scanner. Для вывода десятичной точки, а не запятой, для разделения целой и дробной части числа, будем, как обычно, использовать Locale.US. Что касается форматирующей строки, то она обычно содержит указание на тип форматируемых данных (в нашем случае – числа с плавающей точкой, которые обозначаются как f, от float) и параметры форматирования для этого типа. Например, форматирующая строка "% 8.3f" означает, что вещественное число должно быть выведено как минимум в 8 позициях, из которых три будут отведены на знаки после запятой (десятичной точки), положительным значениям будет предшествовать дополнительный пробел (который позволит выровнять вывод положительных и отрицательных чисел по десятичной точке). Отметим также, что по умолчанию числа выводятся «прижатыми» к правому краю заданной границы.

Форматирующая строка %n обеспечивает переход на следующую строку, какихлибо дополнительных параметров передавать при этом в метод printf не требуется.

42

Переделывать уже существующий метод printMatrix() мы не будем, напишем новый метод printFormatMatrix() (рис. 83), в котором и будет использован вывод с помощью метода printf().

Рис. 83. Метод printFormatMatrix()

Добавьте этот метод в метод main() главного класса (рис. 84). Прежний метод вывода результатов также оставим, чтобы можно было сравнить файлы d.txt и df.txt. Сохраните проект и запустите его на выполнение.

Рис. 84. Вновь модифицированный метод main()

Полученный файл df.txt (рис. 85) выглядит куда более «читабельно».

Рис. 85. Файл с форматированным выводом

43

На этом описание решения задачи будем считать завершенным. Придумайте несколько тестовых массивов, на которых можно проверить работоспособность программы. Обоснуйте свой выбор тестовых данных. Сохраните файлы с этими массивами в папке test Вашего проекта под именами input.01, input.02 и т.д. (пока мы будем рассматривать эту папку как «простое хранилище файлов»).

Внимание! Для выполнения индивидуальных заданий следует создавать новые проекты (на каждое задание – отдельный). Массив и методы работы с ним должны быть оформлены в виде отдельного класса. В проекте обязательно должны присутствовать комментарии. Также следует разработать комплект тестов (не менее 5, сохраните каждый из них в отдельном текстовом файле в папке test проекта), который нужно будет предъявить и использовать при сдаче задания.

Индивидуальные задания (по одному из каждой части)

Часть I

1.Для данного вещественного квадратного (двумерного) массива порядка n рассмотрим последовательность его квадратных подмассивов порядка 1, 2, …, n–1, левый верхний угол которых совпадает с верхним левым углом данного массива. Ради общности будем считать сам массив его же собственным подмассивом порядка n. Напишите программу, которая

1.1.вычисляет сумму максимальных элементов указанных подмассивов

1.2.вычисляет среднее арифметическое минимальных элементов указанных подмассивов

1.3.получает последовательность из n элементов, каждый из которых является вторым по величине (больше него только максимальный) в своем подмассиве

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

2.Для данного вещественного квадратного (двумерного) массива порядка 2n + 1 рассмотрим последовательность квадратных (двумерных) массивов порядка 1, 3, …, 2n

– 1, имеющих общий центральный элемент с данным массивом. Ради общности будем также считать исходный массив включенным в описанную последовательность. Напишите программу, которая

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

2.2.вычисляет сумму разностей между максимальным и минимальным элементом в каждом подмассиве

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

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

44

3.Назовем допустимым преобразованием массива перестановку двух любых строк или двух любых столбцов. Дан вещественный квадратный (двумерный) массив порядка n. Получить последовательность допустимых перестановок, которая

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

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

4.Дан целочисленный двумерный массив размера n × m. Получить по нему массив логических величин соответствующего размера по следующему правилу:

4.1.элемент массива логических величин № k – истина, если все элементы столбца с номером k в исходном массиве нулевые

4.2.элемент массива логических величин № k – истина, если элементы столбца с номером k в исходном массиве упорядочены по возрастанию

4.3.элемент массива логических величин № k – истина, если строка исходного массива с номером k симметрична

4.4.элемент массива логических величин № k – истина, если сумма элементов строки с номером k исходного массива не превосходит заранее заданной величины S

5.Дан целочисленный двумерный массив размера n × m. Преобразовать его следующим образом:

5.1.в каждой строке заменить нулями все элементы, следующие (по номеру) за максимальным элементом в этой строке

5.2.в каждом столбце заменить минимальным элементом массива все элементы, предшествующие (по номеру) минимальному элементу в этом столбце

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

5.4.если в столбце сумма элементов верхних n/2 строк превосходит сумму нижних n/2 строк, поменять местами эти «половинки» столбца (первый элемент верхней «половинки» при этом меняется местами с первым элементом нижней «половинки», второй – со вторым и т.д.; в случае нечетного n средний элемент следует оставить на месте). Выполнить эту операцию для каждого столбца

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

7.Целочисленный квадратный (двумерный) массив порядка n, заполненный числами 1, 2, …, n^2, называется магическим квадратом, если суммы элементов во всех строках и столбцах одинаковы. Напишите программу, которая проверяет, является ли заданный квадратный массив магическим квадратом

45

8.Целочисленный квадратный (двумерный) массив порядка n называется латинским квадратом, если каждая его строка и каждый столбец содержат все числа от 1 до n. Напишите программу, проверяющую, является ли заданный квадратный массив латинским квадратом.

Часть 2.

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

9.Будем рассматривать подмассивы Aij некоторого вещественного двумерного массива A размером n × m, левый верхний угол которых совпадает с верхним левым углом массива A, а правый нижний – с элементом aij массива A (0 <= i < n, 0 <= j < m). Преобразовать исходный массив по следующему правилу:

9.1.каждый элемент aij заменить максимальным элементом Aij

9.2.каждый элемент aij заменить минимальным элементом Aij

9.3.каждый элемент aij заменить средним арифметическим элементов Aij

9.4.каждый элемент aij заменить суммой всех элементов Aij

10.Назовем соседями элемента aij (целочисленного) двумерного массива A такие элементы apq, у которых ровно один из индексов (p или q) отличается по абсолютной величине от соответствующего ему индекса (i или j) на 1. Напишите программу, которая:

10.1.находит в массиве A все элементы (распечатывает их индексы и значения), превосходящие сумму своих соседей

10.2.находит в массиве A все элементы, которые превосходят двух своих соседей по вертикали или двух своих соседей по горизонтали и при этом меньше двух других своих соседей

10.3.заменяет в массиве A все элементы средним геометрическим абсолютных значений их соседей

10.4.заменяет в массиве A значения всех соседей данного элемента нулями, если данный элемент больше любого из них

11.Назовем k-окружением элемента aij (целочисленного) двумерного массива A такие элементы apq, у которых по крайней мере один из индексов (p или q) отличается по абсолютной величине от соответствующего ему индекса (i или j) ровно на k, а другой – не более, чем на k. Напишите программу, которая

11.1.подсчитывает в массиве A количество элементов, которые меньше любого элемента из своего 1-окружения

11.2.заменяет в исходном массиве A каждый элемент суммой его 1-окружения

46

11.3.подсчитывает в массиве A количество элементов, которые больше любого элемента из своего 1-окружения, но при этом меньше любого элемента из своего 2-окружения.

11.4.заменяет в исходном массиве A каждый элемент минимальным элементом его 2- окружения

11.5.в квадратном массиве порядка 2n+1 выполняет поворот k-окружения центрального элемента (ann) на один элемент по часовой стрелке, если k – четное, и против часовой стрелки, если k – нечетное

11.6.в массиве размера n × m заполняет для заданного элемента apq элементы, составляющие его 1-окружение числом 1, элементы, составляющие его 2-окружение, числом 2 и так далее, пока весь массив не будет заполнена полностью

12.Назовем 1-слоем (целочисленного) двумерного массива размером n × m элементы, составляющие (последовательно) его первую строку, крайний правый столбец, последнюю строку, крайний левый столбец. Назовем 2-слоем массива 1-слой подмассива, получающегося в результате удаления 1-слоя из исходного массива. Аналогичным образом определим 3-слой, 4-слой, …, k-слой (k <= min (n/2, m/2)). Напишите программу, которая

12.1.в массиве, имеющем p слоев, выполняет поворот по часовой стрелке 1-слоя на p элементов, 2-слоя на p–1 элементов, и т.д.

12.2.в массиве, имеющем p слоев, заполняет все элементы 1-слоя числом 1, 2-слоя – числом 2 и т.д.

12.3.по массиву, имеющему p слоев, строит одномерный массив из p элементов, в котором элемент № j содержит сумму элементов слоя № j.

12.4.по массиву, имеющему p слоев, строит одномерный массив из p элементов, в котором элемент № j содержит разность между максимальным и минимальным элементом слоя № j.

13.Даны два двумерных массива размера n × m, заполненные нулями и единицами. Определить, возможно ли «совмещение» (точное наложение) всех единиц в обоих массивах при условии, что

13.1.допускается сдвиг одного массива относительно другого по горизонтали

13.2.допускается сдвиг одного массива относительно другого по вертикали

13.3.допускаются сдвиги одного массива относительно другого как по горизонтали, так и по вертикали

13.4.допускаются повороты массивов вокруг собственной оси на угол 900 и кратные ему

13.5.допускаются все перечисленные выше сдвиги и повороты

13.6.допускаются отражения массивов относительно вертикальной и горизонтальной осей симметрии

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

13.8.допускаются все вышеперечисленные преобразования массивов

47

Соседние файлы в предмете Программирование на Java