Инструкционные карты занятий
  • Регистрация
1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса)

ИНСТРУКЦИОННАЯ КАРТА № 9

На выполнение практического занятия по учебной практике

«Программирование»

Тема: Циклический алгоритм. Табулирование функции и поиск экстремумов.

Цель работы

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

- определить максимальное и минимальное значения в заданном диапазоне методом перебора.

Норма времени: 2 часа.

Оснащение рабочего места:

Инструкционные карты, конспект, ПК, среда Delphi.

ХОД РАБОТЫ

I.  Теоретические сведения

Алгоритм циклической структуры – это вычислительный процесс,

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

Каждый алгоритм циклической структуры содержит такие элементы:

А) подготовка цикла – определение начальных значений параметров цикла;

Б) тело цикла – действия, что повторяются многократно для разных значений параметров цикла;

В) модификация цикла – смена значений параметров цикла;

Г) управление циклом – проверка условия выхода из цикла.

Табулирование функции – это формирование и вывод на экран или принтер таблицы значений функции для значений аргумента (х), изменяющихся от некоторого начального значения (хn) до конечного (хк) с некоторым шагом (h). Для этого используется цикл. При подготовке цикла аргументу присваивается начальное значение (х = хn), в теле цикла вычисляются и выводятся значения функции для текущего значения аргумента х.

Модификация заключается в увеличении аргумента на величину h (х:= х + h). Цикл завершается, когда после очередного изменения значение аргумента превысит конечное значение (х>хк).

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

Компонент Таблица строк (TStringGrid)

Результат табулирования функции представляет собой некоторую

Таблицу, состоящую из двух колонок: значения аргумента (х) и соответствующего ему значения функции (y). Количество строк в таблице определяется интервалом (xk - xn) и шагом (h) табулирования. Для оформления такой таблицы удобно использовать компонент типа TStringGrid (таблица строк) из страницы Additional.

Этот компонент предоставляет мощные средства создания и обслуживания табличных структур данных (сеток), обеспечивает двумерное представление данных, упорядоченных по строкам и столбцам. В ячейках создаваемых таблиц могут располагаться произвольные текстовые строки. Таблица делится на две части: фиксированную (может отсутствовать) и рабочую. Фиксированная служит для показа заголовков. Если рабочая область не помещается на экране – появляются полосы прокрутки. При прокрутке фиксированная область не исчезает, изменяется только ее содержимое. Ячейки фиксированной области выделяются цветом.

Основные свойства компонента типа TstringGrid:

Cells [ACol, ARow: integer] – двумерный массив, определяющий содержимое ячейки с табличными координатами (ACol, ARow). Это свойство позволяет обращаться к содержимому ячеек и изменять их содержимое.

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

ColCount, RowCount – задают, соответственно, общее количество столбцов и строк в таблице.

FixedCols, FixedRows – задают, соответственно, количество столбцов и строк в фиксированной зоне. Фиксированные элементы могут выделяться цветом и при прокрутке информации в таблице остаются неподвижными. Остальные столбцы и строки таблицы не являются фиксированными и при прокрутке могут изменяться.

FixedColor – определяет цвет фиксированной зоны. Это свойство имеет тип TColor.

DefaultColWidth, DefaultRowHeight – задают, соответственно, умалчиваемую ширину колонок и высоту столбцов в пикселях. Значения этих свойств распространяются на все ячейки таблицы, кроме тех, для которых установлены свои значения.

ColWidths[i] – содержит ширину конкретного i-го столбца. Это массив, хранящий ширину в пикселях каждого столбца. Установка этого свойства для любого столбца отменяет действие свойства DefaultColWidth на один (i-й) столбец.

RowHeights[i] – содержит высоту конкретной i–й строки в пикселях. Установка этого свойства отменяет действие свойства

DefaultRowHeight на одну (i-ю) строку.

GridWidth и GridHeight – содержат, соответственно, ширину и высоту таблицы в пикселях.

Options – задает параметры таблицы. Это свойство имеет тип «множество», т. е. может содержать сразу несколько параметров.

Некоторые из них:

DoRowSizing – разрешено ручное изменение высоты строк;

DoColSizing – разрешено ручное изменение ширины столбца;

DoRowMoving – разрешено ручное перемещение рядов;

DoColMoving – разрешено ручное перемещение столбцов;

DoEditing– разрешено редактирование ячеек;

doTabs – разрешен переход по Tab (Shift + Tab).

Col – содержит номер столбца сфокусированной ячейки.

Row – содержит номер строки сфокусированной ячейки.

ScrollBars – определяет наличие в окне вертикальной (ssVertical), горизонтальной (ssHorisontal) или обеих (ssBoth) полос прокрутки текста. Если ScrollBars = ssNone, полосы прокрутки отсутствуют.

Основные события компонента типа TstringGrid: Компонент TstringGrid способен автоматически отображать в своих ячейках текстовую информацию. Однако иногда возникает необходимость программной прорисовки, например, для выделения каких-то ячеек цветом, рамкой и т. п. В этом случае можно определить обработчик события OnDrawCell, которое возникает при необходимости прорисовать ячейку. Для прорисовки используется табличное свойство Canvas, являющееся объектом класса TCanvas. С помощью обработчика OnDrawCell в ячейки можно выводить и графическую информацию. Координаты ячейки передаются через параметры Acol и Arow (нумерация с нуля).

Для контроля выбора пользователем конкретной ячейки можно использовать событие OnSelectCell. В этот обработчик по ссылке передается параметр CanSelect. При выходе из обработчика в него можно занести значение false, чтобы запретить выделение данной ячейки.

Другие события – OnGetEditText и OnSetEditText – возникают при редактировании текста в ячейке. Первое – перед началом, второе – при завершении. В первом случае обработчик должен вернуть текст для редактирования, во втором – обработчик получает текст, являющийся результатом ввода или редактирования. Адрес редактируемой ячейке передается в параметрах ARow и ACol. Методы компонента TstringGrid практического значения не имеют. Часто используются методы его свойств, являющихся объектами. Например, методы канвы (для прорисовки содержимого ячеек).

Пример выполнения работы

1 В личной папке создать папку для проекта практической работы № 9. Присвоить ей имя ПР 9.

2 Войти в папку с практической работой ПР 6 и сделать двойной щелчок на файле проекта практической работы № 6. При этом автоматически загрузится Delphi, и откроется проект практической работы № 6.

3 Изменить имя формы применительно к практической работе № 9.

Например, PR9_Ivanov_Form1.

4 Сохранить форму (модуль) в папке размещения проекта практической работы (ПР 9). Для этого вызвать команду File ® Save As…, в окне диалога выбрать папку ПР 9 и ввести новое имя, например PR9_Ivanov_Unit1.

5 Сохранить проект в папке размещения проекта ПР 9. Для этого вызвать команду File®Save Project As…, в окне диалога выбрать папку ПР 9 и ввести новое имя, например PR9_Ivanov_Project1. Вся дальнейшая работа по практической работе 9 ведется в папке ПР 9.

6 В свойство Caption компонента Edit0 занести новый текст, соответствующий новой работе «Табулирование функции».

7 Внести изменения в исходную форму и привести ее к виду, показанному на рис. 1. Для этого поместить на форму (добавить) однострочное окно редактирования с именем Edit4 и метку Label4. Надписи в метках изменить в соответствии с рис. 1. Очистить свойства Text всех однострочных окон редактирования, а лучше ввести в них некоторые числовые значения – значения по умолчанию.

8 В Элементе управления Button1 изменить значение свойства Caption на «Показать (скрыть) таблицу». Подобрать удобный для просмотра размер шрифта (Font®Size).

9 В компонент Image из палитры Additional, отображающий исследуемую функцию, загрузить новый рисунок, соответствующий варианту задания (см. Задания для самостоятельного выполнения)

10 Создать новую форму File®New Form. Дать ей имя в соответствии с требованиями, изложенными в разделе 1. В поле свойства Caption написать «Таблица значений». Значение свойства BorderStyle принять bsSingle. Сохранить форму.

11 Взаимно связать обе формы, поместив в их модули ссылки друг на друга. Это проще всего сделать с помощью команды File®Use Unit…

12 Поместить на новую форму компонент StringGrid1 из палитры Additional для создания текстовых таблиц. Будем выводить в него формируемую таблицу значений функции. Свойству ColCount (количество колонок) присвоить значение 2. Количество строк RowCount задать 2. Это, впрочем, не имеет никакого значения, т. к. реальное количество строк в таблице будет определено и уточнено в процессе выполнения программы в зависимости от количества точек табуляции в таблице. Ширина столбцов по умолчанию DefaultColWidth равна 64. Высота строки по умолчанию DefaultRowHeight равна 24. Свойство ScrollBars установить равным ssVertical (только вертикальная полоса прокрутки).

13 Изменить размеры второй формы таким образом, чтобы большую часть ее площади занимала полученная таблица (рисунок 2).

Рисунок 1 – Примерный вид проектируемой формы

14 На вторую форму поместить компоненты Label1 и Label2,

В свойство Caption которых занести «Максимум» и «Минимум», соответственно.

15 На вторую форму поместить также однострочные окна редактирования Edit1 и Edit2. Они будут использованы только для вывода максимального и минимального значений функции, вычисленных в процессе работы приложения. Ввод данных пользователем в эти окна не допускается. Поэтому свойству ReadOnly каждого компонента присвоить значение true (запрет ввода информации). Значение свойства BorderStyle принять bsNone для обоих компонентов. Цвет компонентов установить таким же, как и у формы, на которую выводится таблица значений. Значение свойства Text можно очистить. Вместо компонентов типа TEdit для вывода результатов можно использовать компоненты типа Tlabel.

Рисунок 2 – Примерный вид формы для вывода таблицы значений

16 Отредактировать программный код для модуля первой формы. Подпрограмму-функцию f (x), осуществляющую вычисление значения функции, изменить в соответствии со своим вариантом (табл. 1.). Однако, чтобы эта функция была доступна в модуле второй формы, где она и будет использована, в интерфейсный раздел модуля первой формы (interface) необходимо добавить объявление этой функции:

Function f(x, a:real):real;

В обработчиках событий OnExit однострочных окон редактирования Edit1 и Edit2, перешедших из предыдущей практической работы, подкорректировать текст сообщения об ошибке в соответствии с новым назначением окон. Для измененного однострочного окна редактирования Edit3 и нового однострочного окна редактирования Edit4 создать обработчики событий OnExit, аналогичные соответствующим обработчикам для окон редактирования Edit1 и Edit2. Обработчик события OnClick для командной кнопки Button1 («скрыть/показать таблицу») переписать заново. В этом обработчике сначала делается проверка наличия исходных данных. Если какой-то параметр не задан или конечное значение диапазона табулирования окажется меньше начального, об этом выводится сообщение, и фокус передается на соответствующий компонент для ввода недостающих (неверных) данных. Если все данные введены, значение свойства Visible второй формы изменяется на противоположное. Таким образом, при каждом щелчке на кнопке Button1 состояние формы попеременно изменяется: она то показывается, то скрывается. Расчет таблицы значений выполняется непосредственно при показе второй формы (формы с таблицей), именно перед появлением этой формы на экране

//---------------------------------------------------

Procedure TПР 9_Ivanov_Form1.Button1Click(Sender: TObject);

//Обработчик события Щелчок на кнопке Button1 (показать/скрыть

//таблицу).

//Проверяем, все ли заполнено. И если все ОК - показываем/

//скрываем форму 2.

Begin

If (Edit1.Text='') Then

Begin

ShowMessage('Отсутствует значение A');

Edit1.SetFocus;

End

Else If (Edit2.Text='') Then

Begin

ShowMessage('Отсутствует начальное значение X');

Edit2.SetFocus;

End

Else If (Edit3.Text='') Then

Begin

ShowMessage('Отсутствует конечное значение X');

Edit3.SetFocus;

End

Else If (Edit4.Text='') Then

Begin

ShowMessage('Отсутствует шаг H');

Edit4.SetFocus;

End

Else if (StrToFloat(Edit3.Text))<=

(StrToFloat(Edit2.Text)) Then

Begin

ShowMessage('Начальное значение X должно быть' + ' меньше конечного!');

Edit3.SetFocus;

End;

Else

PR9_Ivanov_Form2.Visible:= not PR9_Ivanov_Form2.Visible

End;

17 Создать программный код для второго модуля второй формы (Unit2). Этот код содержит единственную процедуру – процедуру обработки события OnShow (показ формы), в которой и осуществляется расчет таблицы значений. Организуется цикл для расчета каждого значения.

Результаты выводятся в компонент StringGrid1 (таблица строк). Количество строк в таблице формируется динамически: после формирования очередной строки общее количество строк (свойство RowCount) увеличивается на 1. Первоначально устанавливается количество строк, равное 2, т. е. на 1 больше, чем надо (первая строка – заголовок, составляет фиксированную зону). Это вызвано тем, что таблица должна иметь хотя бы одну информационную строку. Поэтому по завершении цикла таблица усекается на одну строку.

//---------------------------------------------------

Procedure TPR9_Ivanov_Form2.FormShow(Sender: TObject);

// Процедура обработки события Показ формы.

// Осуществляется расчет таблицы значений функции и заполнение

// грида.

Var H, Xn, Xk, A,X, Y,Ymax, Ymin, Xmax, Xmin:Real;

Var s, s1:string;

Begin

// Формируем заголовок грида.

StringGrid1.Cells[0,0]:=' X';

StringGrid1.Cells[1,0]:=' f(X)';

// Толщина разграничительных линий.

// Можно было установить на этапе проектирования.

StringGrid1.GridLineWidth:=2;

// Количество строк устанавливаем 2, потом после добавления

// каждой строки будем наращивать по 1. В итоге получим

// на одну строку больше.

StringGrid1.RowCount:=2;

// Переносим параметры из формы в рабочие переменные.

A:=StrToFloat(PR9_Ivanov_Form1.Edit1.Text);

Xn:=StrToFloat(PR9_Ivanov_Form1.Edit2.Text);

Xk:=StrToFloat(PR9_Ivanov_Form1.Edit3.Text);

H:=StrToFloat(PR9_Ivanov_Form1.Edit4.Text);

// Присваиваем начальные значения для цикла.

X:=Xn;Ymax:=-MaxLong;Ymin:=MaxLong;

//Организуем цикл.

//В цикле вычисляем значение функции в очередной точке,

//Уточняем мах и min.

//Заносим данные в грид (таблицу) и увеличиваем счетчик строк.

While X<=Xk Do

Begin

Y:=f(X, A);

If Y>Ymax Then Begin Ymax:=Y;Xmax:=X; End;

If Y<Ymin Then Begin Ymin:=Y;Xmin:=X; End;

Str(X:6:2,s);

StringGrid1.Cells[0,StringGrid1.RowCount-1]:=s;

Str(y:10:4,s);

StringGrid1.Cells[1,StringGrid1.RowCount-1]:=s;

StringGrid1.RowCount:=StringGrid1.RowCount+1;

X:=X+H;

End;

// По концу цикла уничтожаем лишнюю строку.

StringGrid1.RowCount:=StringGrid1.RowCount-1;

// Выводим значения мах и min.

Str(Ymax:0:4,s);

Str(Xmax:0:3,s1);

Edit1.Text:='Y='+s+'при'+'X='+s1;

Str(Ymin:0:4,s);

Str(Xmin:0:3,s1);

Edit2.Text:='Y='+s+'при'+'X='+s1;

End;

18 Нажав клавишу F9, запустить приложение на выполнение. В случае необходимости выполнить отладку.

II.  Задания для самостоятельного выполнения

Создать приложение для вывода на экран в отдельную форму таблицы значений функции, описание которой приведено в практической работе № 6;

Значения функций взять из таблицы:

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

III. Контрольные вопросы

1. Какой вычислительный процесс называют циклическим?

2. Сколько раз выполняется оператор цикла с предусловием?

3. Как осуществляется выход из оператора цикла со счётчиком?

4. Объясните структуру оператора цикла с предусловием.

5. Объясните порядок выполнения оператора цикла с предусловием.

6. Объясните блок-схему оператора цикла с предусловием.

Согласовано

На заседании цикловой комиссии общеобразовательных дисциплин

Протокол №___ от «__» ________

Председатель _________________

Добавить комментарий


Защитный код
Обновить

По темам:

История Украины

Культурология

Высшая математика

Информатика

Охотоведение

Статистика

География

Военная наука

Английский язык

Генетика

Разное

Технологиеские темы

Украинский язык

Филология

Философия

Химия

Экология

Социология

Физическое воспитание

Растениевосдство

Педагогика

История

Психология

Религиоведение

Плодоводство

Экономические темы

Бухгалтерские темы

Маркетинг

Иностранные языки

Ветеринарная медицина

Технические темы

Землеустройство

Медицинские темы

Творчество

Лесное и парковое хозяйство