Файл: Практикум по информатике рекомендовано в качестве учебного пособия.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 30.11.2023

Просмотров: 726

Скачиваний: 14

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

116
(точка Р на рисунке), если же точка лежит вне многоугольника, то сум- ма углов не равна 2π (точка Q).
Таким образом, для решения надо перебрать в цикле последова- тельно все вершины многоугольника и найти сумму углов между векто- рами PA
i
и PA
i
+1
,
i
=
1, 2, …,
N.
Не забудьте добавить угол между векто- рами PA
N
и PA
1
. Для определения величины угла между векторами нам потребуется формула скалярного произведения.
Так как стороны многоугольника должны рассматриваться после- довательно, в порядке обхода вершин, то при нахождении суммарного угла следует учитывать взаимное расположение векторов. Угол, под ко- торым сторона видна из исследуемой точки, может быть как положи- тельным, так и отрицательным. Для определения знака угла воспользу- емся векторным произведением. Знак векторного произведения и определит знак конкретного угла в общей сумме.
Задача 5. «Пересечение отрезков».
Дано n отрезков. Реализовать программу, находящую все их пересечения между собой. Отобразить решение графически.
На плоскости заданы два отрезка a и b, a – точками A
1
(A
1
x
,A
1
y
) и A
2
(A
2
x
,A
2
y
), b – точками B
1
(B
1
x
,B
1
y
) и B
2
(B
2
x
,B
2
y
). Найти и напечатать возможную точку их пересечения C(C
x
,C
y
). Рассмотрим первый отрезок a. Уравнение прямой, на которой он лежит, можно записать так: x
a
= A
1
x
+ t a
(A
2
x
– A
1
x
) y
a
= A
1
y
+ t a
(A
2
y
– A
1
y
)
Здесь A
1
x
,A
1
y
,A
2
x
,A
2
y
– константы, x a
,y a
– точки, принадлежащие отрезку, при t a изменяющемся от 0 до 1. Аналогично для отрезка b: x
b
= B
1
x
+ t b
(B
2
x
– B
1
x
) y
b
= B
1
y
+ t b
(B
2
y
– B
1
y
)
Таким образом, приравнивая соответствующие координаты, полу- чаем задачу нахождения параметров t a
, t b
, при которых бы выполнялись равенства:
A
1
x
+ t a
(A
2
x
– A
1
x
) = B
1
x
+ t b
(B
2
x
– B
1
x
)
A
1
y
+ t a
(A
2
y
– A
1
y
) = B
1
y
+ t b
(B
2
y
– B
1
y
)
После разрешения системы относительно t a
,t b
получаем: t
a
(A
1
x
– A
2
x
) + t b
(B
2
x
– B
1
x
) = A
1
x
– B
1
x t
a
(A
1
y
– A
2
y
) + t b
(B
2
y
– B
1
y
) = A
1
y
– B
1
y
А это есть система из двух линейных уравнений относительно t a
, t b
Известно, что система: a
1
x + b
1
y = c
1 a
2
x + b
2
y = c
2 имеет следующее решение:

117 x = d x
/d y = d y
/d, где d – определитель матрицы, d = a
1
b
2
– a
2
b
1
, d
x
= c
1
b
2
– c
2
b
1
, d
y
= a
1
c
2
– a
2
c
1
В нашей системе относительно t a
,t b
: a
1
= A
1
x
– A
2
x b
1
= B
2
x
– B
1
x c
1
= A
1
x
– B
1
x a
2
= A
1
y
– A
2
y b
2
= B
2
y
– B
1
y c
2
= A
1
y
– B
1
y откуда легко находится d,d x
,d y
. Если d отличен от нуля, то система име- ет единственное решение. Правда, следует помнить, что искомые t a
, t b
параметрически задают отрезки, только если они лежат в диапазоне
[0,1], в противном случае – точка пересечения прямых, на которых ле- жат отрезки, находится вне этих самых отрезков.
Если d равен нулю, а хотя бы один из d x
,d y
отличен от нуля, то от- резки лежат на параллельных прямых, или, как говорят математики, они коллинеарны. Если же все три d,d x
,d y
равны нулю, то это значит, что от- резки лежат на одной и той же прямой, где опять возможны три слу- чая – либо отрезки не перекрываются, либо перекрываются в одной точ- ке, либо перекрываются в бесконечном множестве точек.
Решение ряда задач повышенной сложности опирается на методы, рассмотренные в комбинаторике, а именно на возможность генерации: сочетаний, перестановок, размещений и перечислений элементов.
Одним из важных элементов комбинаторики являются
переста-
новки
Перестановки без повторений
– комбинаторные соединения, которые могут отличаться друг от друга лишь порядком входящих в них элементов. Число таких перестановок определяется как n!.
Для числа 3 количество перестановок будет равно 3!
=
3 * 2 * 1
=
6.
Для четырех: 4! = 4 * 3 * 2 * 1 = 24.
Часто для генерации перестановок используется алгоритм Дейкстры для получения всех перестановок по алфавиту. Разберем этот алгоритм.
Пусть у нас есть первая перестановка (например, 1234). Для нахо- ждения следующей перестановки выполняем три шага.
1. Двигаясь с предпоследнего элемента перестановки, ищем эле- мент a[i], удовлетворяющий неравенству a[i] < a[i + 1]. Для перестанов- ки 1234, это число 3, т. к. (3 < 4).


118 2. Меняем местами элемент a[i] с наименьшим элементом, который: а) находится правее a[i]; б) больше, чем a[i].
В нашем случае меняем 3 и 4.
3. Все элементы, стоящие за a[i], сортируем. В нашем случае нужно отсортировать число 4, но это единственный элемент, следовательно, так его и оставляем.
В результате выполнения этих трех шагов получаем следующую по алфавиту перестановку 1243.
Выполнять эти шаги нужно циклически до тех пор, пока в переста- новке не будет находиться искомый в первом шаге элемент a[i], т. е. по- ка перестановка не станет отсортированной по убыванию: 4321.
Перестановки с повторениями
– комбинаторные соединения, в которых среди образующих элементов имеются одинаковые. В таких соединениях участвуют несколько типов объектов, причем имеется не- которое количество объектов каждого типа. Поэтому в выборках встре- чаются одинаковые элементы.
Рис. 16.7. Иллюстрация к задаче «Гномики»
Задание 6. Гномики.
Гномики решили встречать гостей с разно- цветными шарами. Раздай шарики гномикам так, чтобы цвет шарика не был такой же, как цвет колпачка, и чтобы у гномиков в одинаковых

119 по цвету колпачках были шарики разного цвета и разной формы. Напи- шите программу, выводящую все возможные варианты раздачи шариков.
Задание 7.
Имеются цифры от 1 до 9, расположенные по возраста- нию (убыванию). Требуется расставить между ними произвольное ко- личество знаков <<плюс>> и <<минус>>, чтобы получилось выражение со значением 100. Например,
123
+
4

5
+
67

89 = 100 9

8
+
76

5
+
4
+
3
+
21 = 100
Найти все возможные варианты таких выражений.
Задача 8.
Дан двумерный массив, заполненный нулями и единицами.
Найти прямоугольник наибольшей площади, заполненный единицами.
Площадь прямоугольников изменяется от максимальной (весь мас- сив) до минимальной (прямоугольник, состоящий из одной 1). Каждый прямоугольник конкретной площади может быть построен множеством способов. Для площади S допустимый прямоугольник – это такой, про- изведение сторон которого равно S. Мы должны для каждого значения площади перебрать все допустимые способы построения прямоугольни- ков. Каждый прямоугольник конкретной площади и формы может рас- полагаться в массиве различным образом. Точнее сказать, его левая верхняя вершина может находиться в разных точках массива. Следова- тельно, для прямоугольника определенной площади и формы мы долж- ны перебрать все возможные расположения.
Может показаться, что программа для большого массива будет ра- ботать слишком долго, но есть серьезные возможности для ее ускоре- ния. А именно:
1.
Если площадь перебирать от максимальной к минимальной, то пер- вый найденный прямоугольник и будет искомым.
2.
Прямоугольник конкретной площади и формы не поместится в лю- бом положении в массив.
Учет этих утверждений ведет к очень серьезному ускорению про- граммы.
Задание 9. «Вирус».
Колония клеток представляет собой квадрат- ную матрицу порядка N (N < 500). В колонию проникает M (M < 11) ви- русов, которые поражают клетки с координатами (X1, Y1), … (Xm, Ym).
За одну единицу времени вирус проникает в клетки, соседние с зара- женными (соседними считаются клетки, имеющие общую сторону).
Требуется написать программу, которая определит время заражения всей колонии. Графически показать процесс заражения.


120
Задание 10. «Сундук Билли Бонса».
Билли Бонс положил в сун- дук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке два года назад.
Требуется написать программу, определяющую количество монет в сундуке в первый и во второй года, если в X-м году там оказалось ровно Y монет. (3
<
=
X
<
=
20) и Y (1
<
=
Y
<
=
32767).
Пояснение: если в первый год положить 5 монет, а во второй год вынуть 3 монеты, то, начиная с первого года, в сундуке будет 5, 2, 7, 9,
16, 25, … монет.

121
ПРИЛОЖЕНИЕ 1. СВОЙСТВА ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
Многие стандартные визуальные элементы управления имеют оди- наковые свойства. Поэтому имеет смысл рассмотреть их отдельно.
Name
Возвращает или задает имя элемента управления. Значе- ние этого свойства используется в программе для обраще- ния к объекту по его имени.
Size
Возвращает или задает размер элемента управления. Это свойство позволяет одновременно установить высоту и ширину (в точках) вместо того, чтобы устанавливать по отдельности свойства
Height и
Width
Height
Возвращает или задает высоту элемента управления.
Width
Возвращает или задает ширину элемента управления.
Location
Возвращает или задает координаты левого верхнего угла элемента управления относительно левого верхнего угла контейнера.
Dock
Используется для определения способа автоматического изменения размеров элемента управления при изменении размеров родительского элемента управления. Например, задание для свойства
Dock значения
DockStyle.Left приво- дит к выравниванию самого элемента управления по лево- му краю его родительского элемента управления и к изме- нению размеров при изменении размеров родительского элемента управления.
Внимание: свойства
Anchor и
Dock являются взаимоисклю- чающими. Одновременно может быть задано только одно из них, которое и получает преимущество.
Anchor
Возвращает или задает границы контейнера, с которым связан элемент управления, и определяет способ измене- ния размеров элемента управления при изменении разме- ров его родительского элемента. Элемент управления можно привязать к одной или нескольким границам кон-

122 тейнера. Например, если имеется объект
Form с объектом
Button
, для свойства
Anchor которого заданы значения
Top и
Bottom
, то объект
Button растягивается, чтобы сохранить закрепленное расстояние до верхней и нижней границ объекта
Form при увеличении значения свойства
Height объекта
Form
Внимание: Свойства
Anchor и
Dock являются взаимоис- ключающими. Одновременно может быть задано только одно из них, которое и получает преимущество.
Margin
Возвращает или задает пустое пространство между элемен- тами управления. Элементы управления получают для свой- ства
Margin значения по умолчанию, которые достаточно близки к рекомендациям по пользовательскому интерфейсу
Windows. Для конкретных приложений по-прежнему могут быть необходимы некоторые корректировки.
BackColor
Возвращает или задает цвет фона для элемента управле- ния. Свойство
BackColor является внешним свойством.
ForeColor
Получает или задает основной цвет элемента управления.
Свойство
ForeColor является внешним свойством.
Font
Возвращает или задает шрифт текста, отображаемого эле- ментом управления. Нельзя поменять отдельные элементы свойства
Font
– можно только создать новый объект
Font с требуемыми параметрами и назначить его свойству
Font
Свойство
Font является внешним свойством. Внешнее свойство – это свойство элемента управления, которое (ес- ли оно не задано) получается из родительского элемента управления.
Text
Получает или задает текст, сопоставленный с этим эле- ментом управления. Свойство
Text элемента управления по-разному используется каждым производным классом.
Например, свойство
Text объекта
Form отображается в за- головке окна в верхней части формы, содержит небольшое количество символов и, как правило, отображает имя при- ложения или документа. Однако свойство
Text объекта
RichTextBox может быть большим и включать в себя мно- гочисленные невидимые символы, применяемые для фор-


123 матирования текста. Например, отображаемый в объекте
RichTextBox текст можно отформатировать, настроив свойства
Font либо добавив символы пробелов или табу- ляции для выравнивания текста.
TextAlign
Получает или задает выравнивание текста для элемента управления.
Enabled
Возвращает или задает значение, показывающее, сможет ли элемент управления отвечать на действия пользователя.
Значение true
, если элемент управления может отвечать на действия пользователя; в противном случае – значение false
. Значением по умолчанию является true
. С помо- щью свойства
Enabled можно включать или отключать элементы управления во время выполнения. Например, можно отключить элементы управления, не применяемые при данном состоянии приложения. Можно также отклю- чить элемент управления, чтобы ограничить его использо- вание. Например, возможно отключить кнопку, чтобы пользователь не смог ее нажать. Если элемент управления отключен, его невозможно выделить.
Visible
Получает или задает значение, указывающее, отображают- ся ли элемент управления и все его дочерние элементы управления. Значение true
, если элемент управления и все его дочерние элементы управления отображаются; в про- тивном случае – значение false
. Значение по умолчанию – true
. Обратите внимание, что даже если для
Visible зада- но значение true
, элемент управления может быть неви- димым для пользователя, если он находится позади других элементов управления.
Items
С помощью этого свойства можно получить ссылку на список элементов, хранящихся в настоящее время в эле- менте управления (например,
ListBox
). С помощью этой ссылки можно добавлять и удалять элементы, а также оп- ределять число элементов в коллекции.

124
1   ...   4   5   6   7   8   9   10   11   12

ПРИЛОЖЕНИЕ 2. СОБЫТИЯ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
Load
Происходит до первоначального отображения эле- мента управления (обычно формы).
Resize
Происходит при изменении размеров элемента управления (например, формы).
Move
Происходит при перемещении элемента управления.
Click
Происходит при щелчке элемента управления. Со- бытие
Click передает объект
EventArgs его обработ- чику событий, указывая только, что щелчок был вы- полнен. Если необходимы более точные сведения о мыши (кнопка, количество щелчков, вращение ко- лесика или положение), следует использовать собы- тие
MouseClick
. Однако событие
MouseClick не воз- никает, если щелчок был выполнен не с помощью мыши, а, например, при нажатии клавиши
Enter
DoubleClick
Происходит, когда элемент управления дважды щелкается. Двойной щелчок определяется пара- метрами мыши в операционной системе пользова- теля. Пользователь может задать время между на- жатиями кнопки мыши, которые будут считаться двойным щелчком, а не двумя отдельными щелч- ками. Событие
Click вызывается каждый раз, когда элемент управления дважды щелкается. Например, при наличии обработчиков для событий
Click и
DoubleClick объекта
Form события
Click и
DoubleClick вызываются, когда форма дважды щелкается и оба метода вызываются. Если элемент управления дважды щелкается и этот элемент управления не поддерживает событие
DoubleClick
, событие
Click может быть вызвано дважды.
MouseClick
Происходит при щелчке элемента управления мы- шью. Если нажать кнопку мыши, когда курсор на- ходится на элементе управления, обычно возникает

125 следующая последовательность событий, относя- щихся к этому элементу управления:
1.
Событие
MouseDown
2.
Событие
Click
3.
Событие
MouseClick
4.
Событие
MouseUp
MouseDoubleClick
Генерируется при двойном щелчке элемента управления мышью. Событие
MouseDoubleClick происходит, когда пользователь быстро дважды нажимает кнопку мыши, когда курсор находится на элементе управления. Интервал времени, позво- ляющий отличить два отдельных щелчка мыши от двойного щелчка, определяется параметрами мы- ши в операционной системе.
При выполнении пользователем такого действия элемент управления вызывает следующую после- довательность событий:
1.
Событие
MouseDown
2.
Событие
Click
3.
Событие
MouseClick
4.
Событие
MouseUp
5.
Событие
MouseDown
6.
Событие
DoubleClick
7.
Событие
MouseDoubleClick
8.
Событие
MouseUp
MouseDown
Происходит при нажатии кнопки мыши, если ука- затель мыши находится на элементе управления.
MouseUp
Происходит при отпускании кнопки мыши, когда указатель мыши находится на элементе управления.
MouseMove
Происходит при перемещении указателя мыши по элементу управления. Обычно использование со- бытия
MouseMove приводит к изменению цвета эле- мента управления или к прорисовке приподнятого прямоугольника вокруг элемента управления.
MouseLeave
Происходит, когда указатель мыши покидает эле- мент управления.