Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_tekctumk.pdf
Скачиваний:
22
Добавлен:
16.02.2016
Размер:
2.53 Mб
Скачать

выводит картинку битового образа Ris на поверхность компонента Image1 (параметры х и у определяют положение левого верхнего угла картинки на поверхности компонента).

Если перед применением метода Draw свойству Transparent (прозрачность) объекта TBitMap присвоить значение True, то фрагменты рисунка, окрашенные цветом, совпадающим с цветом левого нижнего угла картинки, не будут выведены — через них будет как бы проглядывать фон. Если в качестве "прозрачного" нужно использовать цвет, отличный от цвета левой нижней точки рисунка, то свойству Transparentcolor следует присвоить значение символьной константы, обозначающей необходимый цвет.

Вопросы для самопроверки

1.В чем состоит разница между выводом рисунка в виде растра и его построением с помощью инструкций машинной графики?

2.Какую роль играет свойство Canvas для вывода изображений?

3.Являются ли свойства Canvas и Image эквивалентными понятиями?

4.Перечислите графические примитивы, с помощью которых строятся рисунки.

5.Каковы основные правила построения изображения с помощью графических команд?

3.3. Лабораторные работы

Общие требования

Работы выполняются в среде C++Builder5. Если студент выполняет их в другом месте и в другой среде, он должен самостоятельно обеспечить переносимость программы в данное окружение.

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

После отладки программ студент должен подготовить отчёт по лабораторным работам.

Состав отчёта:

Краткое описание предмета изучения: что рассматривается, для чего служит, на что влияет.

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

Описание основных алгоритмов, использованных в программе для нестандартных решений.

Описание полученных результатов.

На зачете студент должен отвечать на вопросы следующих типов:

1.Объяснить в словесной форме с числовыми примерами, какой алгоритм реализуется по любому фрагменту программы.

2.Объяснить на уровне устройств машины, какие действия выполняет машина по любой строке представленного программного текста.

3.Указать обработчик события по любому элементу интерфейса.

4.Указать элемент интерфейса по любому обработчику событий.

Работа 1. Обработка скалярных данных

Цель: исследование допустимых значений для данных различных типов. Работа подразумевает 2 этапа:

обработка плавающих чисел типа float;

обработка целых чисел типа int;

обработка строк типа AnsiString;

Плавающие числа

Цель – ознакомление с особенностями обработкой плавающих чисел.

Примерный интерфейс для арифметического калькулятора показан на рис 41. Обратите внимание на полученный результат, представленный в натуральной форме – десятичное число со многими знаками после разделительной точки.

Рис. 41. Арифметический калькулятор плавающих чисел

Спроектируйте собственный интерфейс и составьте программы – обработчики всех кнопок. На рис. 41 показан результат сложение чисел 6.05 и 3. Обратите внимание, что результат не точен, объясните причину. Представьте результат в форме с фиксированной точкой и получите изображение такого типа, как на рис. 42.

Рис. 42. Арифметический калькулятор плавающих чисел

Проанализируйте обработку плавающих чисел. Ознакомьтесь с функцией преобразования числа типа float в строковую форму с фиксированной точкой. Например, если компонент TEdit для вывода результата имеет имя Edit3, а самим числом является переменная X, то оператор:

Edit3->Text=FloatToStrF(X,ffFixes,7,2);

выведет число 9.05.

Убедитесь, что числа, не превосходящие 6 десятичных знаков, изображаются в формате с фиксированной точкой в обычной бытовой форме, тогда как значения, превышающие 10-11 знаков, представляются в форме с плавающей точкой.

Целые числа

Цель – ознакомление с особенностями целочисленной арифметики. Примерный интерфейс для арифметического калькулятора целых чисел представлен на рис 43.

Рис. 43. Арифметический калькулятор целых чисел

Показаны результат целочисленного деления ( 1 ) и остаток от деления ( 9999999 )

Спроектируйте собственный интерфейс и составьте программы - обработчики всех кнопок. Изучите особенности обработки целых чисел. Убедитесь, что при выходе за разрядную сетку в результате, например, сложения чисел 1 000 000 000 и 2 000 000 000 , результат получается непредсказуемым, тогда как ни компилятор, ни сама машина во время выполнения не обнаруживают ошибок. Объясните эту особенность. Обратите внимание на особенности целочисленного деления. Например, операторы: float a,b,c;

a=3;b=4;c=a/b;

обеспечат значение с=0.75,

тогда как после выполнение фрагмента int a,b,c;

a=3;b=4;c=a/b;

переменная станет равной нулю.

Строки

Цель – ознакомление с особенностями обработки строковых переменных типа AnsiString. Многочисленные функции обработки строк удобно изучать при помощи программы типа «строкового калькулятора», примерный интерфейс которого представлен на рис.44

Рис. 44. Интерфейс программы для изучения строковых функций (строковый калькулятор)

Идея предлагаемой программы состоит в том, чтобы студент запрограммировал наиболее распространённые функции обработки строк. Список функций в сокращенном виде приведён в данном пособии в главе «Обработка строк». Полный список строковых функций можно найти в :

[1], с.980

Встроенная в Builder справка (Help) в разделе String handling routines (подпрограммы обработки строк)

Записи команд, вызывающих функции, представлены на кнопках, в качестве образцов команд следует взять примеры из главы «Встроенные функции обработки строк».

Например, функция «соединение строк» (кнопка 1) осуществляет

соединение строки S1

(её окно ввода обведено овалом) со строкой S2;

результат выполнения

операции

записывается в окошко вывода,

обозначенного цифрой 1.

 

В окно 2 выведен

результат функции, соединенной с кнопкой 2, также

обведённой овалом – «определение длины строки» S1.

Вцелом эта работа несложная, но громоздкая, рекомендуется начать её

вклассе, а закончить самостоятельно. Все указанные в работе функции

студент должен освоить, поскольку на их базе будут

основаны

многочисленные примеры данного курса.

 

Работа 2. Логические выражения

Цель – ознакомление с особенностями построения и выполнения условных операторов.

В качестве примера можно использовать программу «Теннисный матч», которая определяет победителя матча на основе данных об игроках четверть финала.

Примерный интерфейс для программы «Теннисный матч» представлен на рис. 45.

Рис. 45. Логическая задача: победитель теннисного матча

Спроектируйте собственный интерфейс и составьте необходимые программы-обработчики.

Убедитесь, что логика работы программы соответствует смыслу проведения матча:

счет каждой пары игроков не может быть ничейным

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

Работа 3. Циклы с известным количеством повторений

Цель – ознакомление с особенностями оператора цикла for , предназначенного для описания циклов с известным количеством повторений. Поскольку к этому моменту массивы данных ещё не изучались,

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

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

Рис. 46. Сумма натурального ряда чисел от 1 до N

Вторая кнопка вычисляет факториал N! , то есть произведение натурального ряда чисел от 1 до N (рис. 47).

Рис. 47. Вычисление факториала N!

Третья кнопка вычисляет степень числа 2 (рис. 48)

Рис. 48. Вычисление степени двойки

Спроектируйте собственный интерфейс и составьте необходимые программы – обработчики. Убедитесь, что логика работы программы соответствует смыслу приведенных функций. Вводимое число N не должно быть дробным или отрицательным

Работа 4. Итерационные циклы.

В данной работе рассматривается три примера типичных итерационных алгоритмов:

вычисление синуса угла, представленного в радианах, как суммы сходящегося ряда Маклорена;

вычисление корня квадратного по итерационному алгоритму;

определения корня монотонно - возрастающей функции методом деления отрезка существования функции пополам.

Вычисление синуса

 

 

PageControl,

Для организации

интерфейса

использован

компонент

представляющий

многостраничный

блокнот с

вкладками.

Примерный

интерфейс программы представлен на рис.49. Здесь показана первая страница , на которой вычисляется синус угла

Рис. 49. Итерационные циклы, вычисление Sin(x)

В данном примере вычисляется значение синуса для угла 0.524 радиана при заданной точности 0.001. Программа показывает значение угла в градусах – 30.02292, вычисляет синус по встроенной в Builder функции Sin(x) – 0.50002 и по формуле Маклрена – 0.500347. Из примера видно, что заданная точность достигается всего за 3 итерации. Студентам следует рассмотреть, каким образом точность расчёта влияет на количество шагов вычислений.

Вычисление корня квадратного

Интерфейс модуля для вычисления квадратного корня приведен на второй странице компонента PageControl (рис. 50).

Рис. 50. Итерационные циклы, вычисление квадратного корня

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

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

программу кура «Прикладное программирование, часть 1», где и рассматриваются подробно.)

Определения корня функции методом деления пополам

Прежде всего, следует разобраться с работой алгоритма, так как подобные алгоритмические решения будут встречаться в дальнейшем, в частности при организации бинарного поиска в упорядоченных массивах. Алгоритм рассматривается на лабораторных работах. Страница с изображением интерфейса представлена на следующем рис. 51

Рис. 51. Итерационные циклы, решение уравнения методом деления пополам

В качестве примера рассматривается простейшая функция - квадратный трёхчленрешение которого аналитическим путём является тривиальным. Функция определяется заданием её коэффициентов и отрезка по оси X, на котором она определена. В качестве найденного решения приводятся как результат аналитического решения, так и корень, найденный

методом

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

совпадают,

число проделанных итераций также выведено на экран.

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

алгоритма является его универсальность. Это выражается

в

том, что

функция может быть любой сложности, в том числе и такой,

для

которой

не существует аналитического решения. Студент должен ввести в программу свой вариант более сложной функции, соблюдая только два условия:

-функция должна быть монотонно возрастающей;

-значение функции на левом конце отрезка должно быть отрицательным, а на правом – положительным.

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

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

Работа 5. Работа с числовыми массивами

В лабораторной работе №5 студент знакомится с алгоритмами и приемами программирования числовых массивов в таком порядке :

одномерные массивы

двумерные массивы

Одномерные массивы

На рис. 52 представлен интерфейс программы, для которого в качестве основного компонента выбран многостраничный блокнот PageControl:

Рис. 52. Обработка одномерных массивов

Здесь представлены типичные вычисления, производящиеся над рядами чисел, которые, в частности, можно рассматривать как результаты экспериментов: определение наибольшего и наименьшего элементов и их положение (индекс) в массиве, подсчёт суммы элементов, определение среднего значения и среднего квадратичного отклонения. Исходные данные в виде строк AnsiString записываются во время проектирования (Design Time) в свойство Lines компонента Memo. При выполнении программы, они прежде всего переписываются в глобальный вспомогательный массив, являющийся общедоступным для любых модулей данной программы; затем различные обработчики, связанные с кнопками, реализуют алгоритмы, соответствующие их надписям.

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

Двумерные массивы

Интерфейс программы представлен на рис. 53, это вторая страница предыдущего кадра.

Рис. 53. Обработка двумерных массивов

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

Поскольку во время Design Time заполнить клетки невозможно, разумно их заполнять программным путём при старте программы (по событию OnFormActivate), записывая в клетки какой-то типовой набор данных. Далее можно во время работы программы (во время Run Time) произвольно редактировать эти данные. После любого редактирования следует преобразовывать строки из клеток StringGrid в числовые значения и записывать их в соответствующие по координатам ячейки вспомогательного двумерного глобального массива.

Этот массив можно рассматривать как числовую матрицу и применять к ней нужные операции. Типовые вычисления над элементами матрицы - определение сумм элементов по строкам и столбцам - представлены на рис. 53.

Работа 6. Графические приемы построения изображений

Цель работы состоит в ознакомлении с приёмами построения графических изображений процедурными методами; представление картинок в виде растровых кадров, файлов формата jpeg и т.п. не рассматривается. Студент создает программу в соответствии с интерфейсом, представленным на рис. 54; суть работы программы изложена на рисунке в области компонента Memo .

Рис. 54. Приглашение графической программы

Начальную прорисовку этих трёх фигур следует связать с событием OnFormPaint . Когда данный кадр появится на экране, нажимают кнопку «Рисовать» и возникает чертёж, показанный на рис. 55:

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

Рис. 55. Начальная прорисовка фигур

Начальный рисунок вычерчивается в монохромных тонах. Чтобы показать, каким образом можно использовать диалог выбор цвета (компонент ColorDialog), надо щелкнуть по «чувствительным» словам Круг 1, Круг 2 и Треугольник. По природе – это простейшие кнопки типа BitBtn, но у них используется событие OnBitBtnClick, что не типично для этого компонента. При щелчке по этим словам пользователю предлагается диалог выбора цвета

(рис. 56).

Рис. 56. Выбор цвета фигур

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