Реферат: Программирование на Object Pascal в среде Delphi
begin
ind:=1;
n:=n+1; // количество слов увеличивается на единицу
end;
1 : if st[i]=' ' then // если встретился пробел
ind:=0;
end;
Label3.Caption:=IntToStr(n); // вывод количества слов в Label3
end;
end.
5.2. Выполнение индивидуального задания
Во всех заданиях исходные данные вводить с помощью компонента Edit в компонент ListBox, либо с помощью свойства Text в свойство Items компонента ComboBox. Результат выводить c помощью компонента Label. Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
Для проверки функционирования приложения подготовить несколько тестов.
Индивидуальные задания
1. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти количество групп с пятью символами.
2. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран самую короткую группу.
3. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Подсчитать количество символов в самой длинной группе.
4. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов.
Лабораторная работа №6
Программирование АЛГОРИТМОВ с использованием записей
Цель лабораторной работы: создать приложение, в котором используются данные типа запись.
6.1.Пример создания приложения
Задание: создать Windows-приложение для обработки ведомости об успеваемости учащихся в количестве 9 человек. Каждая запись должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в порядке уменьшения их среднего балла.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.6.1.
6.1.1. Размещение компонентов на Форме
При работе с записями ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid.
Рис. 6.1
В этом задании для нанесения соответствующих надписей в колонках и строках используется фиксированная зона компонента StringGrid, поэтому в Инспекторе Объектов значения свойств FixedCols и FixedRows установите равными 1. В соответствии с заданием установите значение свойства ColCount=6, а значение свойства RowCount=10. Для возможности просмотра всего списка учащихся в компоненте StringGrid удобно использовать вертикальную линейку прокрутки, поэтому установите свойство ScrollBars в состояние ssVertical. Откройте список опций свойства +Options и установите значение goEditing в True – это даст возможность редактировать информацию в компоненте StringGrid с помощью клавиатуры и “мыши”.
6.1.2 Создание процедур обработки событий FormCreate и Button1Click
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Используя текст модуля UnZap, внимательно наберите операторы этих процедур.
6.1.3 Текст модуля UnZap
Unit UnZap;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
zap=record // объявление записи
fio :string[20];
mat,fiz,soch:integer;
srbal :extended
end;
var
MZap:array[1..9] of zap; // объявление массива записей
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:='№пп’;
Cells[1,0]:='Фамилия,инициалы';
Cells[2,0]:='Математика';
Cells[3,0]:='Физика';
Cells[4,0]:='Сочинение';
Cells[5,0]:='Ср.балл';
for i:=1 to 9 do
Cells[0,i]:=IntToStr(i);
Cells[1,1]:='Первый П.П.'; Cells[2,1]:='3'; Cells[3,1]:='3'; Cells[4,1]:='3';
Cells[1,2]:='Второй В.В.'; Cells[2,2]:='3'; Cells[3,2]:='3'; Cells[4,2]:='4';
Cells[1,3]:='Третий Т.Т.'; Cells[2,3]:='3'; Cells[3,3]:='4'; Cells[4,3]:='4';
Cells[1,4]:='Четвертый Ч.Ч.'; Cells[2,4]:='4'; Cells[3,4]:='4'; Cells[4,4]:='4';
Cells[1,5]:='Пятый П.П.'; Cells[2,5]:='3'; Cells[3,5]:='4'; Cells[4,5]:='5';
Cells[1,6]:='Шестой Ш.Ш.'; Cells[2,6]:='5'; Cells[3,6]:='4'; Cells[4,6]:='4';
Cells[1,7]:='Седьмой С.С.'; Cells[2,7]:='5'; Cells[3,7]:='5'; Cells[4,7]:='4';
Cells[1,8]:='Восьмой В.В.'; Cells[2,8]:='5'; Cells[3,8]:='5'; Cells[4,8]:='5';
Cells[1,9]:='Девятый Д.Д.'; Cells[2,9]:='3'; Cells[3,9]:='5'; Cells[4,9]:='5';
for i:=1 to 9 do
with MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
srbal:=(mat+fiz+soch)/3; // вычисление значения ср. балла
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2); // вывод значения ср.балла
end; // в последнюю колонку StringGrid1
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to 9 do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
srbal:=(mat+fiz+soch)/3;
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2);
end;
for i:=2 to 9 do // сортировка методом "пузырька"
for j:=9 downto i do
if
MZap[j-1].srbal
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to 9 do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2);
end;
end;
end.
6.2 Выполнение индивидуального задания
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
Индивидуальные задания
1. Поля шахматной доски характеризуются записью
Type
Pole=record
Ver: 1..8; {вертикальные координаты}
Hor: (a,b,c,d,e,f,g,h); {горизонтальные координаты}
end;
Вывести шахматную доску, пометив крестиками все поля, которые «бьет» ферзь, стоящий на поле с координатами Veri и Hori, и ноликами все остальные поля.
2. Поля шахматной доски характеризуются записью (см. задание 1)
Var Figura:Pole;
Вывести сообщение может ли конь за один ход перейти с поля Figurai на поле Figuraj.
3. Type
Karta=record
m: (piki,trefi,bubni,chervi); {масть}
d:(shest,sem,vosem,devjat,desjat,valet,dama,korol,tuz); {достоинство}
end;
Var k1,k2:Karta;
Вывести сообщение «бьет» ли карта k1, карту k2, с учетом того, что масть mi является козырной.
В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя Ф.И.О. и домашний адрес.
Лабораторная работа №7
Программирование алгоритмов с использованием файлов
Цель лабораторной работы: освоить применение компонентов OpenDialog и SaveDialog и создать приложение, в котором используются файлы.
7.1. Пример создания приложения
Задание: создать Windows-приложение для записи в файл и чтения из файла ведомости об успеваемости учащихся в количестве 10 человек. Каждая запись файла должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в алфавитном порядке и записать эту информацию в текстовой файл.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.7.1.
7.1.1. Размещение компонентов на Форме
При работе с файлами чтение и запись информации удобно организовывать с помощью компонентов OpenDialog и SaveDialog.
Компоненты
OpenDialog и SaveDialog находятся
на странице
Dialogs. Все компоненты
этой страницы
являются
невизуальными,
т.е. не видны в
момент выполнения
приложения.
Поэтому их
можно разместить
в любом удобном
месте Формы.
Оба рассматриваемых
компонента
имеют идентичные
свойства и
отличаются
только внешним
видом.
BitBtn
Рис. 7.1
Для установки компонентов OpenDialog и SaveDialog на Форму необходимо на странице Dialogs Палитры Компонентов щелкнуть “мышью” соответственно по пиктограмме или и разместить ее в любом свободном месте Формы. При выполнении приложения в момент вызова компонента появляется диалоговое окно, с помощью которого пользователь выбирает имя файла и маршрут к нему. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName.
Пользователь
имеет возможность
настроить
параметры окна
диалога по
своему усмотрению.
В частности,
изменить
заголовок окна
можно с помощью
свойства Title.
В свойстве
DefaultExt можно
указать расширение
файла, если оно
не задано
пользователем.
Свойство Filter
используется
для поиска
(фильтрации)
файлов, отображаемых
в окне. Установка
фильтра производится
следующим
образом.
Выделив
соответствующий
компонент,
необходимо
дважды щелкнуть
по правой
(белой) части
свойства Filter
Инспектора
Объектов. В
появившемся
окне редактора
фильтра-Filter
Editor необходимо
в колонке Filter
Name набрать текст,
характеризующий
соответствующий
фильтр, а в колонке
Filter–маску.
Для компонента
OpenDialog1 установим
значения масок
как показано
на рис. 7.2.
Рис.7.2
Маска *.dat означает что, будут видны файлы данных с любым именем и с расширением dat, а маска *.* - что будут видны все файлы (с любым именем и с любым расширением).
Для того, чтобы файл автоматически записывался с расширением dat в свойстве DefaultExt запишем требуемое расширение - dat.
Аналогичным образом настроим компонент SaveDialog1 для текстового файла (расширение txt).
7.1.2 Создание процедур обработки событий
Для удобства работы с несколькими различными процедурами обработки событий в свойстве Name каждого компонента BitBtn замените программные имена кнопок: BitBtn1 – на BitBtnNew, BitBtn2 – на BitBtnOpen, BitBtn3 – на BitBtnSort, BitBtn4 – на BitBtnSave. Двойным нажатием клавиши “мыши” на кнопках BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.
7.1.3 Текст модуля UnFile
Unit UnFile;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, Spin;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtnNew: TBitBtn;
BitBtnOpen: TBitBtn;
BitBtnSort: TBitBtn;
BitBtnSave: TBitBtn;
SaveDialog1: TSaveDialog;
SpinEdit1: TSpinEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
procedure TForm1.FormCreate(Sender: TObject);
procedure BitBtnSortClick(Sender: TObject);
procedure BitBtnNewClick(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure BitBtnOpenClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
type
zap=record // объявление записи
fio :string[20];
mat,fiz,soch:integer;
end;
var
MZap:array[1..25] of zap; // объявление массива записей
FileZap:file of zap; // объявление файла записей
FileText:TextFile; // объявление текстового файла
FileNameZap,FileNameText:string; // имена файла записей и текстового файла
n:integer; // текущее кол-во элементов массива записей
{ Обработчик события создания Формы }
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:=’№пп’;
Cells[1,0]:=’Фамилия,инициалы’;
Cells[2,0]:=’Математика’;
Cells[3,0]:=’Физика’;
Cells[4,0]:=’Сочинение’;
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
BitBtnSave.Hide; // спрятать кнопку “Save”
end;
{ Обработчик нажатия кнопки Sort }
procedure TForm1.BitBtnSortClick(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
{ сортировка методом "пузырька"}
for i:=2 to n do
for j:=n downto i do
if MZap[j-1].fio>MZap[j].fio then
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to n do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
end;
{ Создание нового файла записей}
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin // вывод на экран окна с предупреждающим сообщением
if MessageDlg('Содержимое существующего файла будет уничтожено. Вы уверены?',
mtConfirmation, mbYesNoCancel, 0)=mrYes then
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
with OpenDialog1 do
begin
Title:='Создание файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReWrite(FileZap); // открыть файл на запись
for i:=1 to n do
write(FileZap,MZap[i]); // запись в файл массива записей
CloseFile(FileZap); // закрытие файла записей
end;
end;
end;
end;
{Обработчик кнопки изменения размера}
procedure TForm1.SpinEdit1Change(Sender: TObject);
var
i,m:integer;
begin
m:=StrToInt(SpinEdit1.Text); // присвоить новое значение размера
with StringGrid1 do
begin
RowCount:=m+1; // пересчитать количество строк
if m>n then // если строки добавлены то
for i:=n+1 to m do // инициализировать новые ячейки
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
end;
end;
n:=m; // запомнить новое значение размера
end;
{ обработчик нажатия кнопки Open }
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var
i:integer;
begin
with OpenDialog1 do
begin
Title:='Открытие файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReSet(FileZap); // открыть файл на чтение
n:=0; // инициализация счетчика кол-ва прочитанных из файла элементов
while not EoF(FileZap) do
begin
n:=n+1; // увеличение счетчика
read(FileZap,MZap[n]); // чтение из файла n-го элемента массива записей
end;
SpinEdit1.Text:=IntToStr(n); // занести кол-во прочитанных записей в SpinEdit
StringGrid1.RowCount:=n+1; // присвоить кол-во строк
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // заполнение ячеек StringGrid1 полями массива записей
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
CloseFile(FileZap); // закрытие файла записей
end;
end;
BitBtnSort.Show; // показать кнопку “Sort”
BitBtnSave.Show; // показать кнопку “Save”
end;
{ Сохранение данных в текстовом файле}
procedure TForm1.BitBtnSaveClick(Sender: TObject);
var
i:integer;
begin
with SaveDialog1 do
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameText:=FileName; // присваивание имени файла
AssignFile(FileText,FileNameText); // назначить файлу FileText имя FileNameText
ReWrite(FileText); // открыть текстовый файл на запись
for i:=1 to n do
with MZap[i] do // запись в текстовый файл
writeln(FileText,i:3,fio:20,mat:5,fiz:5,soch:5);
CloseFile(FileText); // закрытие текстового файла по окончании записи
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
end;
end.
7.1.4 Работа с приложением
Запустите созданное приложение. Занесите в соответствующие поля панели интерфейса информацию об успеваемости учащихся. Кнопкой “New” сохраните данные в файле. Завершите выполнение приложения.
Вновь запустите приложение и кнопкой “Open” откройте только что созданный файл. Убедитесь, что информация не содержит ошибок. При необходимости обнаруженные ошибки можно исправить, а также дополнить ведомость новой информацией. Для сортировки ведомости в алфавитном порядке воспользуйтесь кнопкой “Sort” и сохраните отсортированную информацию кнопкой “New”.
Еще раз завершите и вновь запустите приложение.
Кнопкой “Open откройте файл и убедитесь, что в нем теперь содержится ведомость, отсортированная в алфавитном порядке. Кнопкой “Save” сохраните информацию в текстовом файле. Для просмотра содержимого текстового файла воспользуйтесь, например, приложением “Microsoft Word”.
Используя все управляющие компоненты панели интерфейса, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
7.2 Индивидуальные задания
Во всех заданиях предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее созданного файла. Результаты выводить в панель интерфейса и в текстовый файл.
1. Ведомость абитуриентов, сдавших вступительные экзамены в университет содержит: Ф.И.О. абитуриента, оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету. Первыми в списке должны идти студенты, сдавшие все экзамены на 5.
2. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов на текущие сутки по группам изделий.
3. У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать m мест до города N на k-й день недели с временем отправления поезда не позднее t часов вечера. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме.
4. Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию. Вывести списки студентов по группам. В каждой группе Ф.И.О. студентов должны быть расположены в порядке убывания среднего балла.
Лабораторная работа №8
Программирование алгоритмов с использованием функций и процедур. создание модулей
Цель лабораторной работы: освоить методику создания модулей, содержащих процедуры и функции, и использования их в проекте.
8.1. Пример создания приложения
Задание: создать Windows-приложение которое выводит таблицу значений функции и ее разложения в ряд в виде суммы для значений x от xn до xk c шагом h=(xk - xn)/10. Создать модуль, в котором вычисление значений оформить в виде функции, а вычисление - в виде процедуры. Подключить модуль к проекту и выполнить созданное приложение.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.8.1.
8.1.1. Размещение компонентов на Форме
Label
Edit
Button
Разместим на Форме компоненты Label, Edit, SpinEdit, Button и Memo.
Р
Memo
ис. 8.1Сохраним модуль под именем UnModul (текст модуля приведен в п.8.1.4).
8.1.2. Создание модуля и подключение его к проекту
В соответствии с заданием создадим модуль, в котором вычисление значений оформим в виде функции, а вычисление - в виде процедуры. Для создания модуля откроем в главном меню пункт File и щелкнем “мышью” на опции New…(Новый…). Delphi откроет панель New Items(Репозиторий), в которой сделаем активной пиктограмму Unit(Модуль) и нажмем кнопку OK. Откроется окно с “пустым” модулем Unit2. С помощью опции Save As… меню File сохраним модуль в папке c файлами проекта, присвоив ему имя, например, UnFuncProc.
В этом модуле операторы вычисления Y(x) в виде подпрограммы-функциии F и операторы вычисления S(x) в виде подпрограммы-процедуры Sum оформим по правилам создания модулей (текст модуля UnFuncProc приведен в п.8.1.3).
Для подключения модуля UnFuncProc к проекту необходимо сделать активным окно с текстом модуля UnModul, затем в меню File выбрать опцию Use Unit…и в открывшемся окне Use Unit указать имя используемого модуля – UnFuncProc. Убедитесь в том, что в разделе Implementation модуля UnModul появился оператор Uses UnFuncProc; , который Delphi вставила в текст модуля UnModul.
Откройте главный файл проекта и убедитесь в том, что проект не содержит посторонних модулей и файлов.
8.1.3. Текст модуля UnFuncProc
unit UnFuncProc;
interface
var
n:integer; // количество слагаемых в сумме S
Function F(x:extended):extended;
Procedure Sum(x:extended;Var s:extended);
Implementation
Function F(x:extended):extended;
begin
result:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
end;
Procedure Sum(x:extended;Var s:extended);
var
c:extended;
k:integer;
begin
c:=-x*x*0.5;
S:=1;
for k:=1 to n do
begin
s:=s+c*(2*k*k+1);
c:=-c*x*x/((2*k+1)*(2*k+2));
end;
end;
end.
8.1.4. Текст модуля UnModul
Unit UnModul;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin, Buttons;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
SpinEdit1: TSpinEdit;
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
func=function(x:extended):extended; // функциональный тип
proc=procedure(x:extended;Var s:extended); // процедурный тип
var
Form1: TForm1;
implementation
uses UnFuncProc; // Delphi подключает модуль UnFuncProc
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.text:='4'; // начальное значение N
Edit1.text:=’0.1’; // начальное значение Xn
Edit2.text:=’2.0’; // начальное значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная работа №8 - Создание модулей');
end;
{В процедуре Tablica вычисляется и выводится таблица значений x, S(x) и Y(x)}
procedure Tablica(Sum:proc;F:func;n:integer;xn,xk,h:extended);
var
x,y,s:extended;
begin
Form1.Memo1.Lines.Add(#9+'x'+#9+'S'+#9+'Y');// заголовок таблицы
x:=xn;
repeat // цикл по x
Sum(x,s); // вызов процедуры Sum для вычисления S(x)
y:=F(x); // обращение к функции F для вычисления Y(x)
Form1.Memo1.Lines.Add(#9+FloatToStrF(x,ffFixed,5,2) // вывод x
+#9+FloatToStrF(s,ffFixed,6,3) // вывод S
+#9+FloatToStrF(y,ffFixed,6,3)); // вывод Y
x:=x+h;
until x>xk;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
xn,xk,h:extended;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
h:=(xk-xn)*0.1; // шаг h
Tablica(Sum,F,n,xn,xk,h); // вызов процедуры Tablica для вычисления таблицы
end;
end.
8.2. Выполнение индивидуального задания
По указанию преподавателя выберите из таблицы два варианта индивидуальных заданий. Создайте модуль, в котором вычисление значений реализуйте в виде подпрограммы-процедуры, а вычисление значений - в виде подпрограммы-функции. На панели интерфейса установите компонент, с помощью которого реализуйте возможность выбора соответствующего варианта задания и вывод таблицы значений , где i-номер варианта. Созданный модуль подключите к проекту и выполните приложение.
Индивидуальные задания
В заданиях необходимо вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для значений x от до с шагом .
Близость значений S(x) и Y(x) во всем диапазоне значений x указывает на правильность вычисления S(x) и Y(x).
№ |
S(x) |
n |
Y(x) |
||
1 |
0.1 |
1 |
8 |
||
2 |
18 |
||||
3 |
6 |
||||
4 |
0.1 |
0.8 |
12 |
|
|
5 |
0.1 |
0.8 |
16 |
|
|
6 |
0.1 |
1 |
14 |
Лабораторная работа №9
Программирование алгоритмов с использованием динамических структур данных
Цель лабораторной работы: освоить методику создания приложений, в которых используются динамические структуры данных.
Примеры создания приложений
9.1 Использование динамических массивов
Задание: создать приложение для вычисления наименьшего и наибольшего из всех значений элементов целочисленной матрицы A={aij}, где i=1,2,…, m; j=1,2,…, n. Значения m и n задаются пользователем на панели интерфейса, а элементы матрицы A генерируются с помощью датчика случайных чисел и размещаются в памяти динамически.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.9.1.
9.1.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, SpinEdit, Button и StringGrid.
Label
SpinEdit
Label
StringGrid
Button
Label
Рис. 9.1
Сохраним модуль под именем UnDinMas (текст модуля приведен в п.9.1.3).
9.1.2 Создание процедур обработки событий FormCreate и Button1Click
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnDinMas, внимательно наберите операторы этих процедур.
При желании можно создать процедуру, которая будет выделять заданным цветом границы ячеек с наименьшим и наибольшим значениями в компоненте StringGrid. Для создания такой процедуры сделайте активным компонент StringGrid и на странице Events(события) Инспектора Объектов дважды щелкните “мышью” в правой части события OnDrawCell. В ответ Delphi создаст обработчик этого события – процедуру procedure TForm1.StringGrid1DrawCell и установит курсор между операторами begin и end этой процедуры. Используя текст модуля UnDinMas, внимательно наберите операторы процедуры TForm1.StringGrid1DrawCell.
9.1.3 Текст модуля UnDinMas
Unit UnDinMas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, Grids, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label8: TLabel;
StringGrid1: TStringGrid;
Label2: TLabel;
Label5: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
Label6: TLabel;
Label7: TLabel;
Label9: TLabel;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
Mas=array[1..1] of integer; // массив целочисленных значений
pMas=array[1..1] of ^mas; // массив указателей
var // объявление глобальных переменных
pA:^pMas; // указатель на массив указателей
m,n,max,min:integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
m:=6; // начальное значение m
n:=8; // начальное значение n
SpinEdit1.Text:='6';
SpinEdit2.Text:='8';
StringGrid1.RowCount:=m; // количество строк
StringGrid1.ColCount:=n; // количество столбцов
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit1.Text);// m присваивается содержимое поля редактора
StringGrid1.RowCount:=m;
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit2.Text);// n присваивается содержимое поля редактора
StringGrid1.ColCount:=n;
end;
procedure TForm1.Button1Click(Sender: TObject);
label 1;
var
i,j,k,l,r:integer;
begin
Randomize; // инициализация датчика случайных чисел
GetMem(pA,4*m); // выделение памяти для массива из m указателей
for i :=1 to m do
begin // формирование i-й строки массива
{ Выделение памяти для n элементов i-й строки}
GetMem(pA^[i],SizeOf(integer)*n);
pA^[1]^[1]:=Random(1000);// случайное целое число занести в массив
for j:=1 to n do
begin // формирование j-го элемента строки
1: r:=Random(1000); // генерирование случайного числа
for k:=1 to i do
for l:=1 to j do
if r=pA^[k]^[l] then // если такое число уже есть в массиве тогда...
goto 1;
pA^[i]^[j]:=r; // случайное число занести в массив
end;
end;
for i:=1 to m do // элементы массива занести в ячейки
for j:=1 to n do // компонента StringGrid1
StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);
{ Поиск min и max значений среди элементов массива}
max:=pA^[1]^[1];
min:=max;
for i:=1 to m do
for j:=1 to n do
if
pA^[i]^[j]
min:=pA^[i]^[j]
else
if pA^[i]^[j]>max then
max:=pA^[i]^[j];
Label7.Caption:=IntToStr(min); // вывод min значения
Label9.Caption:=IntToStr(max); // вывод max значения
for i:=1 to m do
{ Освобожение памяти, занимаемой n элементами i-й строки}
FreeMem(pA^[i],SizeOf(integer)*n);
{ Освобождение памяти, занимаемой массивом из m указателей}
FreeMem(pA,4*m);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do
if StringGrid1.Cells[Col,Row]=IntToStr(min) then // если элемент ячейки
begin // равен min тогда...
Brush.Color:=clGreen; // установить цвет кисти зеленый
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
else
if StringGrid1.Cells[Col,Row]=IntToStr(max) then // если элемент ячейки
begin // равен max тогда...
Brush.Color:=clRed; // установить цвет кисти красный
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
end;
end.
9.2 Использование динамических списков
Задание2: создать приложение для формирования стека, который заполняется путем ввода целых положительных чисел с клавиатуры. Как только будет введено первое отрицательное число, содержимое стека выводится на панель интерфейса, а память занимаемая его элементами освобождается.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.9.2.
9.2.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, Edit, Button и Memo.
Label
Memo
Edit
Button
Рис. 9.2
Сохраним модуль под именем UnStek (текст модуля приведен в п.9.2.3).
9.2.2 Создание процедур обработки событий FormCreate и Button1Click
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Используя текст модуля UnStek, внимательно наберите операторы этих процедур.
9.2.3 Текст модуля UnStek
Unit UnStek;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
PSt=^Zap;
Zap=record
inf:integer;
adr:PSt
end;
Var // объявление глобальных переменных:
PVer, // указатель вершины стека
PTek:PSt; // текущий указатель
ElSt:integer; // элемент стека
procedure TForm1.Button1Click(Sender: TObject);
begin
New(PTek); // выделить память
ElSt:=StrToInt(Edit1.Text);// в ElSt занести значение из Edit1
PTek^.inf:=ElSt; // в информационную часть стека занести ElSt
PTek^.adr:=PVer; // в адресную часть занести указатель на вершину
PVer:=PTek;// указатель вершины должен указывать на последний элемент
if ElSt>=0 then // если элемент стека неотрицательный тогда...
begin
Edit1.Text:='';// очистить окно редактора Edit1
Edit1.SetFocus;// передать фокус ввода редактору Edit1
end
else
begin
Memo1.Lines.Add('Элементы стека:'); // вывести заголовок
repeat
Memo1.Lines.Add(#9+IntToStr(PTek^.inf));// вывод элементов
PVer:=PTek^.adr;
Dispose(PTek); // освободить память
PTek:=PVer
until PTek=nil;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PVer:=nil; // инициализировать указатель вершины
ElSt:=0; // инициализировать элемент стека
end;
end.
9.3. Выполнение индивидуального задания
По указанию преподавателя выберите два варианта индивидуальных заданий. В заданиях №1-№15 необходимо использовать динамические массивы, а в заданиях №16-№30 – динамические списки. Во всех заданиях необходимо предусмотреть контрольный вывод исходных данных.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим и наименьшим значениями среди четных и выводит полученный массив.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива с клавиатуры и выводит номер строки и номер столбца наименьшего из всех значений его элементов.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди нечетных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение наибольшего из элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, изменяет порядок следования элементов на противоположный и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди четных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение суммы элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди положительных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры, изменяет порядок следования элементов главной диагонали на противоположный и выводит преобразованный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями среди положительных и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди отрицательных.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим значением среди отрицательных и наименьшим среди положительных и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит среднее арифметическое значение элементов массива.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наименьшим значением среди четных и наибольшим среди нечетных и выводит полученный массив.
Создать приложение, которое заносит в стек целые положительные числа с клавиатуры, выводит содержимое стека и среднее арифметическое значение его элементов.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданный символ.
Создать приложение, которое заносит в каждый элемент стека английское слово с клавиатуры и, как только будет введено слово “en или нет в стеке заданный символ.
Создать приложение, которое заносит в каждый элемент стека английское слово с клавиатуры и, как только будет введено слово “end”, выводит содержимое стека.
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданное число.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, упорядочены ли элементы стека по алфавиту или нет.
Создать приложение, которое заносит в стек положительные целые числа с клавиатуры и, как только будет введено число, равное сумме введенных чисел, выводит содержимое стека.
Структура рабочей сети Internet | |
Введение.. 3 1 Исследовательский раздел.. procedure TDBSearchEdit.onchange_(sender : tobject); else begin beep; beep; beep; beep; beep; beep; end; |
Раздел: Рефераты по информатике, программированию Тип: дипломная работа |
Информационная система расчетов по договорам | |
Белорусский национальный технический университет Международный институт дистанционного образования Кафедра ПОВТ и АС КУРСОВОЙ ПРОЕКТ по курсу ... - procedure LoadFromFiles - процедура загрузки данных из файлов в одномерные массивы. procedure TForm1.FormCreate(Sender: |
Раздел: Рефераты по информатике, программированию Тип: курсовая работа |
Обработка матриц | |
СОДЕРЖАНИЕ ВВЕДЕНИЕ 1.Постановка задачи 2. Разработка алгоритма 3. Разработка программы и пользовательского интерфейса 4.Отладка программы ВЫВОДЫ ... Тело подпрограммы - это логический блок begin/end, содержащий операторы и команды Паскаля и реализующий нужную логику работы. procedure TForm1.FormCreate(Sender: |
Раздел: Рефераты по информатике, программированию Тип: курсовая работа |
Графовые модели. Остов минимального веса | |
Основные понятия теории графов. Инструментальные программные средства. Блок-схема алгоритма моделирования. Операционная среда моделирования ... Так же в Delphi существует большая библиотека компонентов (командные кнопки, поля редактирования, переключатели и т.д.). С помощью компонентов обеспечиваются удобство интерфейса ... procedure TForm1.FormCreate(Sender: |
Раздел: Рефераты по математике Тип: реферат |
Разработка приложения для Windows, представляющего собой выполнение ... | |
1. Разработка эскизного и технического проектов программы Придержан стандарт ГОСТ 19.404-79 к содержанию и оформлению программного документа ... if (c=x [n+1, i]) and (c=x [i, n+1]) then k:=k+1; end; procedure TForm1.N1Click (Sender: |
Раздел: Рефераты по информатике, программированию Тип: курсовая работа |