Смекни!
smekni.com

Программирование на Object Pascal в среде Delphi

Лабораторнаяработа №1

Программированиелинейных алгоритмов

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

1.1.Визуальнаясреда DELPHI

Призапуске DELPHI наэкране появляетсяпанель интерфейса,показаннаяна рис. 1.1. СредаDELPHI визуальнореализуетсяв виде несколькиходновременнораскрытых наэкране монитораокон. Количество,расположение,размер и видокон можетизменятьсяпрограммистом.


Главноеокно всегдаприсутствуетна экране ипредназначенодля управленияпроцессомсоздания приложения.

Главноеменю содержитвсе необходимыесредства дляуправленияпроектом.

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

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

ОкноИнспектораОбъектовпредназначенодля изменениясвойств выбранныхкомпонентови состоит издвух страниц.Страница Properties(Свойства)предназначенадля изменениянеобходимыхсвойств компонента.Страница Events(События) – дляопределенияреакции компонентана то или иноесобытие (например,щелчок кнопки“мыши ”).

ОкноФормы представляетсобой интерфейспроектируемогоWindows-приложения.В это окно наэтапе проектированияприложенияпомещаютсянеобходимыекомпоненты,которые разработчикберет из ПалитрыКомпонентов.Каждой Формепроекта соответствуетмодуль (Unit),текст которого на языке Object Pascalразмещаетсяв окне РедактораКода.

ОкноРедактора Кодапредназначенодля просмотра,создания иредактированиятекстов модулейпроекта. Припервоначальнойзагрузке в окне Редактора Коданаходится текстмодуля, содержащийминимальныйнабор операторовдля нормальногофункционированияпустой Формыв качествеWindows-приложения.При размещениинекоторогокомпонентав окне Формы,текст модуляавтоматическидополняетсянеобходимымиоператорами.

Обовсех происходящихв системе событиях,таких как созданиеФормы, нажатиекнопки мышиили клавиатурыи т.д., ядро Windowsинформируетокна путемпосылки соответствующихсообщений.Среда DELPHIпринимает иобрабатываетсообщения спомощью обработчиковсобытий (например,щелчок кнопки“мыши” – событиеOnClick, созданиеФормы – OnCreate).Наиболее частоприменяемыесобытия представленыв табл. 1.1.


Таблица1.1

Событие

Описаниесобытия

OnActivate Возникаетпри активизацииФормы

OnCreate


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

OnKeyPress


Возникаетпри нажатииклавиши наклавиатуре.Параметр Keyимеет тип Charи содержитASCII-код нажатойклавиши (клавишаEnter клавиатурыимеет код #13,клавиша Esc - #27и т.д.). Обычноэто событиеиспользуетсяв том случае,когданеобходимареакция нанажатие однойиз клавиш.
OnKeyDown Возникаетпри нажатииклавиши наклавиатуре.Обработчикэтого событияполучаетинформациюо нажатой клавишеи состоянииклавиш Shift,Alt и Ctrl, а такжео нажатой кнопкемыши.

Длясоздания обработчикасобытия программистунеобходимораскрыть списоккомпонентовв верхней частиокна ИнспектораОбъектов ивыбрать необходимыйкомпонент.Затем, на страницеEvents ИнспектораОбъектов, нажатиемлевой клавишимыши выбратьназвание обработчикаи дважды щелкнутьпо его правой(белой) части.В ответ DELPHIактивизируетокно РедактораКода модуляи покажет заготовкупроцедурыобработкивыбранногособытия. Длякаждого обрабатываемогособытия в текстемодуля организуетсяпроцедура(procedure), междуключевымисловами beginи end которойпрограммистна языке Object Pascalзаписываеттребуемыйалгоритм обработкисобытия.

Переключениемежду окномФормы и окномРедактора Кодаосуществляетсякнопкой главногоменю с пиктограммой

или клавишейF12.

1.2. Примерсоздания приложения

Задание:создать Windows-приложениедля вычислениявыражения

.

Численныезначения данныхx, y и z занестис клавиатурыв соответствующиеполя панелиинтерфейса.Один из возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан на рис.1.2.

1.2.1. Сохранениепроекта

ВпроцессепроектированияприложенияDELPHI создаетнесколькофайлов - проект.Каждый проектцелесообразнохранить в отдельной,заранее созданнойпапке. С помощьюподходящегоприложенияWindows создадимпапку и назовемее, например,LAB1.

Длясохраненияпроекта откройтев главном менюпункт Fileи щелкните“мышью”на опции SaveProject As…(Сохранитьпроект как…).Сначала DELPHIоткроет панельдиалога SaveUnit1 As (Сохранитьмодуль как)для сохранениямодуля проекта.В этой панелинайдем созданнуюпапку LAB1 исохраним в неймодуль подименем, например,UnLinAlg. Обратитевнимание нато, что DELPHI поумолчаниюприсвоит этомуфайлу тип Delphiunit c расширением*.pas. Затемоткроетсяпанель диалогаSave Project1 As . Назовемнаш проект,например, PrLinAlgи сохранимего в этой жепапке. ЗдесьDELPHI даст файлутип Delphi project и расширение*.dpr. Убедитесьв том, что главноеокно DELPHI теперьназываетсяPrLinAlg, окно главногофайла проекта-PrLinAlg.dpr, а окномодуля проекта-UnLinAlg.pas.

Старайтесьдавать файлам осмысленныеимена вместооднообразныхUnit1 и Project1, предлагаемыхDELPHI.

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

главного менюили опциюSave All вменю File.

1.2.2. Настройкаокон

Чтобыработать сокном, необходимосделать егоактивным, щелкнув“мышью”в любом местеокна. У активногоокна заголовокстановитсявыделенным,например, нарис. 1.1 активнымявляется окноРедактора Кода.

ОкнаФормы и РедактораКода модуляв правом верхнемуглу имеюткнопки управления,которые предназначены:

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

Спомощью “мыши”,захватываяодну из кромококна или выделеннуюстроку заголовка,отрегулируетенужные размерыокон Формы,Редактора Кода,ИнспектораОбъектов и ихположение наэкране.

1.2.3.Изменениезаголовка Формы

НоваяФорма имеетодинаковыеимя (Name) и заголовок(Сaption) - FORM1. Начинающимпрограммистамимя Формы менятьне рекомендуется,т.к. оно используетсяв тексте модуля.

Дляизменениязаголовкаактивизируйтеокно ИнспектораОбъектов и настранице Propertiesв свойствеCaption заменитезаголовок Form1на Лаб. работа №1-Линейныйалгоритм.Убедитесь, чтоодновременноизменилсязаголовок окнаФормы.

1.2.4.Размещениекомпонентовна Форме

Будемразмещатькомпонентына Форме так,чтобы онисоответствовалипанели, показаннойна рис 1.2.


Рис.1.2


Длянанесениянадписей наФорму используетсякомпонентLabel. Выберитев Палитре Компонентовна страницеStandard пиктограмму

компонентаLabel и щелкнитена ней “мышью”.Затем в нужномместе Формыщелкните “мышью”- появитсянадпись Label1. Всвойстве CaptionИнспектораОбъектов заменитенадпись Label1на Введитезначение X:.В свойстве Fontподберитешрифт. Аналогичнонанесите наФорму остальныенадписи. Щелкнув“мышью”на любом изразмещенныхкомпонентов,отрегулируйтеего местоположениена Форме и размер.

Дляввода/выводаданных в простейшихслучаях используютсякомпонентыEdit и Memo. КомпонентEdit применяетсяв тех случаях,когда данныепредставляютсяодной строкой.Если данныепредставляютсобой несколькострок, то используетсякомпонент Memo.

Длясоздания полейввода численныхзначений переменных x, yи z используемкомпонентEdit. Выберитев Палитре Компонентовна страницеStandard пиктограмму

и разместитекомпонент Editв нужных местахФормы так же,как Вы это делалис компонентомLabel.

Длявывода результатовиспользуемкомпонент Memo.Выберите вПалитре Компонентовна страницеStandard пиктограмму

,поместитекомпонент Memoна Форму иоткорректируйтеего местоположениеи размеры.

1.2.5.Написаниепроцедурыобработкисобытия созданияФормы (FormCreate)

Еслипрограммистжелает, чтобыпри появлениипанели интерфейсана экране всоответствующихполях находилисьначальныезначения данных,он должен учесть,что при запускеприложениявозникаетсобытие - созданиеФормы (OnCreate). Создадимпроцедуруобработки этогособытия, котораязанесет начальныезначения переменныхx, y, z вполя Edit1, Edit2и Edit3 соответственно,а в поле Memo1поместит строкуЛабораторнаяработа №1 – Линейныйалгоритм. Дляэтого дваждыщелкните мышьюна любом свободномместе Формы.На экране появитсятекст модуляUnLinAlg, в которомDELPHI автоматическисоздает заготовкупроцедуры-обработчикасобытия созданияФормы:Procedure TForm1.FormCreate(Sender:TObject).Между операторамиbegin и end этойпроцедурывставьте операторы,которые выполняютнеобходимыедействия (текст модуля приведен вп.1.2.7).

1.2.6.Написаниепроцедурыобработкисобытия нажатиякнопки Button1(Button1Click)

Поместимна Форму кнопку,нажатие которойприведет квычислениювыражения.Выберите вПалитре Компонентовна страницеStandart пиктограмму

компонентаButton. В свойствеCaption ИнспектораОбъектов заменитенадпись накнопке Button1на Вычислить.В свойстве Fontподберитешрифт. Отрегулируйтеположение иразмер кнопки.Затем дваждыщелкните “мышью”на кнопке, послечего курсорустановитсяв текстепроцедуры-обработчикасобытия нажатия кнопкиButton1 : ProcedureTForm1.Button1Click(Sender:TObject).Внимательнонаберитеоператоры этойпроцедуры,используятекст модуляUnLinAlg.

1.2.7.Текст модуляUnLinAlg

UnitUnLinAlg;


interface


uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;


type

TForm1 =class(TForm)

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

Label4: TLabel;

Memo1: TMemo;

Button1:TButton;

procedureFormCreate(Sender: TObject);

procedureButton1Click(Sender: TObject);

private

{ Privatedeclarations }

public

{ Publicdeclarations }

end;


var

Form1: TForm1;


implementation


{$R *.DFM}

//Процедураобработкисобытия созданияФормы:

procedureTForm1.FormCreate(Sender: TObject);

begin

Edit1.Text:='0.4'; //начальноезначение X

Edit2.Text:='8.75e-2'; //начальноезначение Y

Edit3.Text:='-19.63'; //начальноезначение Z

Memo1.Clear; //очистка Memo1

// Выводстроки в Memo1:

Memo1.Lines.Add('Лабораторнаяработа №1 - Линейныйалгоритм');

end;

//Процедураобработкисобытия нажатиякнопки Button1:

procedureTForm1.Button1Click(Sender: TObject);

var

x,y,z,a,b,c,u: extended; //объявлениелокальныхпеременных

begin

x:=StrToFloat(Edit1.Text); //X присваиваетсясодержимоеEdit1

y:=StrToFloat(Edit2.Text); //Y присваиваетсясодержимоеEdit2

z:=StrToFloat(Edit3.Text); //Z присваиваетсясодержимоеEdit3

// Вычисляется выражение

a:=sqrt(x)-y*y*y;

b:=sin(a)/cos(a);

c:=Exp(5*Ln(b));

u:=c+exp(y/z)*sin(z*z);

Memo1.Lines.Add('X='+Edit1.Text+' Y='+Edit2.Text+

' Z='+Edit3.Text); //контрольныйвывод X, Y, Z в Memo1

//Вывод результатав Memo1:

Memo1.Lines.Add('U ='+FloatToStrF(u,ffFixed,8,3));

end;


end.

Данные,с которымиработают компонентыEdit и Memo, имеют типString. Поэтому впроцедуреTForm1.Button1Click приприсваиваниисодержимогополей Edit1,Edit2,Edit3переменнымX,Y,Z c помощьюфункции StrToFloatосуществляетсяпреобразованиеданных типаString в действительныезначения сплавающейточкой типаExtended. Еслинеобходимоработать сданными целоготипа, используетсяфункция StrToInt.

Привыводе данныхв Memo1 используется метод Add свойстваLines, причемдля преобразованияданных издействительногозначения встроковое и управленияформой представлениявыводимогорезультатаиспользуетсяфункция FloatToStrF.


1.2.8.Работа с приложением

Длязапуска созданногоприложениянажмите пиктограмму

главного менюили клавишуF9. При этомпроисходиткомпиляциямодулей и, еслинет ошибок,компоновкапроекта и созданиевыполняемогофайла PrLinAlg.exe.На экране появляетсяпанель интерфейсаприложения(рис.1.2).

Щелкните“мышью”на кнопке “Вычислить”и в поле Memo1появляетсярезультат.Измените исходныезначения x,y, z в поляхEdit и снованажмите кнопку”Вычислить”.Убедитесь, чтов поле Memo1отображаютсяновые результаты.Завершитьработу приложенияможно нажатиемкнопки

в правом верхнемуглу панелиинтерфейса.

Вслучае нештатногофункционированияприложениявосстановитьпервоначальныйрежим работыс проектомможно путемвыбора в менюRun опции ProgramReset илинажать клавишиCtrl+F2.

1.3. Выполнениеиндивидуальногозадания

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


Индивидуальныезадания

1.

Приx=14.26, y=-1.22, z=3.5

t=0.564849.

2.

Приx=-4.5,y=0.75

,z=0.845
u=-55.6848.

3.

Приx=3.74

,y=-0.825, z=0.16
v=1.0553.

4.

Приx=0.4

,y=-0.875, z=-0.475
w=1.9873.

5.

Приx=-15.246, y=4.642

,z=20.001
=-182.036.

Лабораторнаяработа №2

Программированиеразветвляющихсяалгоритмов

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

2.1. Примерсоздания приложения

Задание:создать Windows-приложениедля вычислениявыражения

Z=

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

Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан на рис.2.1.

2.1.1.Размещениекомпонентовна Форме

Будемразмещатькомпонентына Форме так,чтобы онисоответствовалипанели, показаннойна рис 2.1.

Рис. 2.1


Присоздании приложенийв DELPHI частоиспользуютсякомпонентыв виде кнопок-переключателей.Состояние такойкнопки (включено- выключено)визуальноотражаетсяна Форме. Напанели (рис.2.1) представленыкнопки-переключателидвух типов:CheckBox и RadioGroup .

КомпонентCheckBox организуеткнопку независимогопереключателя,с помощью которойпользовательможет указатьсвое решениетипа “да/нет”.КомпонентRadioGroupорганизуетгруппу кнопок- зависимыхпереключателей.При нажатииодной из кнопокгруппы всеостальныекнопки выключаются.

Поместите на Форму компонентыLabel, Edit и Memoв соответствиис рис.2.1. Выберитев Палитре Компонентовна страницеStandard пиктограмму

компонентаCheckBox и разместитеее в нужномместе Формы.. В свойствеCaption ИнспектораОбъектов заменитенадпись CheckBox1на Контрольныйвывод данных.. Чтобы призапуске приложениякнопка CheckBoxоказаласьвключена,cвойство Checked установитеравным True.

Выберитев Палитре КомпонентовStandard пиктограмму

компонентаRadioGroup и поместитеее в нужноеместо Формы.В свойствеCaption изменитезаголовокRadioGroup1 наf(x). Дляразмещениякнопок в одинстолбец, свойствоColumns установитеравным 1. Дваждыщелкните “мышью”по правойчасти свойстваItems - появитсястрочный редакторсписка наименованийкнопок. Наберите2 строкис именами:в первой строке- sin(x), во второй- cos(x) и нажмитеОК. После этогона Форме появитсягруппа из двухкнопок - переключателейс соответствующиминадписями.Чтобы при запускеприложенияпервая кнопкаRadioGroup оказаласьвключена,cвойство ItemIndexустановитеравным 0.

2.1.2. Созданиепроцедур обработкисобытий FormСreateи Button1Сlick

Технологиясоздания процедуробработкисобытий FormСreate иButton1Сlick ничемне отличаетсяот предыдущейработы. Внимательнонаберитеоператоры этихпроцедур, используятекст модуляUnRazvAlg.

2.1.3.Текст модуляUnRazvAlg

UnitUnRazvAlg;


interface


uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls,ExtCtrls;


type

TForm1= class(TForm)

Label1:TLabel;

Edit1:TEdit;

Label2:TLabel;

Edit2:TEdit;

Label4:TLabel;

Memo1:TMemo;

Button1:TButton;

RadioGroup1:TRadioGroup;

CheckBox1:TCheckBox;

procedureFormCreate(Sender: TObject);

procedureButton1Click(Sender: TObject);

private

{Private declarations }

public

{Public declarations }

end;


var

Form1:TForm1;


implementation

{$R*.DFM}

//Процедураобработкисобытия созданияФормы:

procedureTForm1.FormCreate(Sender: TObject);

begin

Edit1.Text:='0.5'; // начальноезначение X

Edit2.Text:='1.8'; //начальноезначение Y

Memo1.Clear; //очистка Memo1

//Вывод строкив Memo1:

Memo1.Lines.Add(Лабораторнаяработа №2 - Разветвляющийсяалгоритм);

end;

//Процедураобработкисобытия нажатиякнопкиButton1:

procedureTForm1.Button1Click(Sender:TObject);

var

x,y,z,fx: extended; //объявлениелокальныхпеременных

begin

x:=StrToFloat(Edit1.Text); //X присваиваетсясодержимоеEdit1

y:=StrToFloat(Edit2.Text); //Y присваиваетсясодержимоеEdit2

fx:=sin(x); //fx присваиваетсяначальноезначение

//Выбор функции,соответствующейнажатой кнопке:

caseRadioGroup1.ItemIndex of

0:fx:=sin(x);

1:fx:=cos(x);

end;

//Вычислениевыражения:

ifxthen

z:=fx

else

z:=y;

//Проверка состояниякнопки CheckBox1:

ifCheckBox1.Checked then

Memo1.Lines.Add('X= '+Edit1.Text+

' Y = '+Edit2.Text); //контрольныйвывод X, Y в Memo1

//Вывод результатав Memo1:

Memo1.Lines.Add('Z = '+FloatToStrF(z,ffFixed,8,3));

end;

end.


Еслинажата перваякнопка RadioGroup1,в переменнуюцелого типаRadioGroup1.ItemIndex заноситсянуль, если вторая– единица. Есликнопка CheckBox1 нажата,логическаяпеременная CheckBox1.Checked имеетзначение True,если нет –False.

2.1.4.Работа с приложением

Запуститесозданноеприложение.Используя всеуправляющиекомпонентыпанели интерфейса,убедитесь вправильномфункционированииприложенияво всех предусмотренныхрежимах работы.

2.2. Выполнениеиндивидуальногозадания

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

Индивидуальныезадания

Длязаданий №1-№15 на панели интерфейсапредусмотретьвозможностьвыбора однойиз трех функцийf(x): sh(x), x2,eX.



1.


2.


3.


4.


5.


6.


7.


8.




Лабораторнаяработа №3

Программированиециклическихалгоритмов

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

3.1. Отладка модулей проекта

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

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

3.1.1. Отладка синтаксическихошибок

Синтаксическиеошибки состоятв нарушенииформальныхправил использованияоператоров.Эти ошибкипоявляютсяв результатенедостаточногознания разработчикомязыка программированияи невнимательностипри набореоператоровна экране дисплея.

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

  1. компиляторраспознаетне все ошибки;

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

  3. ошибкав одном местемодуля можетповлечь засобой сериюдиагностическихсообщенийкомпиляторав других местахмодуля;

  4. из-занекоторыхошибок компиляциямодуля можетвообще прекращатьсяи проверкапоследующихоператоровне производится.

Информацияобо всех ошибках,найденных вмодуле, выводитсяв специальноеокно, котороепоявляетсяв нижней частиэкрана. Каждаястрока этогоокна содержитимя файла, номерстроки, в которойобнаруженаошибка и характерошибки. Еслидважды щелкнуть“мышью”на строке сописаниемошибки, курсорустановитсяв той строкемодуля, гдеобнаруженаошибка. Следуетисправлятьошибки последовательно,сверху внизи после исправлениякаждой ошибкикомпилироватьпрограммузаново. С цельюсокращениявремени компиляциирекомендуетсяосуществлятьпроверку наличияошибок в режимахSyntax Check иCompileменю Project.Для полученияболее полнойинформациио характереошибки можнообратится кHELP нажатиемклавиши F1.

Отладкасинтаксисасчитаетсязавершенной,когда послеочереднойкомпиляциив режиме BuildAll меню Projectотсутствуютдиагностическиесообщения обошибках.

3.1.2. Отладка логическихошибок

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

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

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

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

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

Длялокализацииместа ошибкирекомендуетсяпоступатьследующимобразом. В окнеРедактора Кодаустановитекурсор в строкеперед подозрительнымучастком инажмите клавишуF4 (выполнитьдо курсора).Выполнениеприложениябудет остановленона той строкемодуля, в которойбыл установленкурсор. Текущеезначение любойпеременнойможно увидеть,если накрытькурсоромидентификатор переменнойна 1-2 сек. Нажимаяклавишу F8 (пошаговоевыполнение),можно построчновыполнятьпрограмму,контролируясодержимоепеременныхи правильностьвычислений.

3.2. Примерсоздания приложения

Задание:создать Windows-приложение,которое выводиттаблицу значенийфункции

и ее разложенияв ряд в видесуммы

длязначений xот xnдо xkc шагом h=(xk- xn)/10.

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

Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.3.1.


3.2.1.Размещениекомпонентовна Форме


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


Рис. 3.1



КомпонентSpinEdit находитсяна страницеSamples ПалитрыКомпонентов.В тех случаях,когда объемвыводимойинформациипревышаетразмер полякомпонентаMemo, целесообразноснабдить еголинейкамипрокрутки. Всвойстве ScrollBars компонентаMemo1 установимзначение ssVertical– появитсявертикальнаялинейка прокрутки.Присвоим модулю имяUnCiklAlg.


3.2.2. Текст модуляUnCiklAlg


UnitUnCiklAlg;

interface

uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls,ExtCtrls, Spin;

type

TForm1= class(TForm)

Memo1:TMemo;

Button1:TButton;

Label1:TLabel;

Label2:TLabel;

Label3:TLabel;

Edit1:TEdit;

Edit2:TEdit;

SpinEdit1:TSpinEdit;

CheckBox1:TCheckBox;

CheckBox2:TCheckBox;

CheckBox3:TCheckBox;

procedureFormCreate(Sender: TObject);

procedureButton1Click(Sender: TObject);

private

{Private declarations }

public

{Public declarations }

end;

var

Form1:TForm1;

implementation

{$R*.DFM}

procedureTForm1.FormCreate(Sender: TObject);

begin

SpinEdit1.text:='3';// начальноезначение N

Edit1.text:='0.1'; // начальноезначение Xn

Edit2.text:='2.0'; // начальноезначение Xk

Memo1.Clear;

Memo1.Lines.Add('Лабораторнаяработа №3 - Циклическийалгоритм');

end;

procedureTForm1.Button1Click(Sender: TObject);

varxn,xk,x,h,c,s,y,al,del:extended;

n,k:integer;

begin

n:=StrToInt(SpinEdit1.Text);

xn:=StrToFloat(Edit1.Text);

xk:=StrToFloat(Edit2.Text);

ifCheckBox1.Checked then

Memo1.Lines.Add(‘Исходныеданные: n=’+IntToStr(n)+

' Xn='+FloatToStrF(xn,ffFixed,6,1)+

' Xk='+FloatToStrF(xk,ffFixed,6,1));

h:=(xk-xn)*0.1; // шагh

x:=xn;

repeat // циклпо x

c:=-x*x*0.5;

S:=1;

fork:=1 to n do

begin

s:=s+c*(2*k*k+1);

c:=-c*x*x/((2*k+1)*(2*k+2));

end;

y:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);

ifCheckBox2.Checked then

ifCheckBox3.Checked then

begin

al:=s-y; // абсолютнаяпогрешность

del:=abs((s-y)/y)*100;// относительнаяпогрешность

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+FloatToStrF(s,ffFixed,6,3)+

' Y='+FloatToStrF(y,ffFixed,6,3)+

' A='+FloatToStrF(al,ffFixed,6,3)+

' D='+FloatToStrF(del,ffFixed,6,0)+'%');

end

else

begin

al:=s-y;

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+FloatToStrF(s,ffFixed,6,3)+

' Y='+FloatToStrF(y,ffFixed,6,3)+

' A='+FloatToStrF(al,ffFixed,6,3));

end

else

ifCheckBox3.Checked then

begin

del:=abs((s-y)/y)*100;

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+FloatToStrF(s,ffFixed,6,3)+

' Y='+FloatToStrF(y,ffFixed,6,3)+

' D='+FloatToStrF(del,ffFixed,6,0)+'%');

end

else

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+FloatToStrF(s,ffFixed,6,3)+

' Y='+FloatToStrF(y,ffFixed,6,3));

x:=x+h;

untilx>xk;

end;

end.


3.3.Выполнениеиндивидуальногозадания

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

Индивидуальныезадания

Взаданиях с №1по №15 необходимовывести наэкран таблицузначений функцииY(x) и ее разложенияв ряд S(x) для значенийx от

до
сшагом
.Близость значенийS(x) и Y(x) во всемдиапазонезначений x указываетна правильностьвычисленияS(x) и Y(x).

S(x) n Y(x)

1


0.1


1


16



2


0.1


1


10


3


0.1


1


12


4


0.1


1


8



5


0.1


1


14


6


0.1



1

8


7


0.1


1


12


8


0.1


1


10



9


0.1


1


14


10


0.1


0.5


15



11


0.1


0.8


10



12


0.1


1


8





Лабораторнаяработа №4

ПрограммированиеАЛГОРИТМОВс использованиеммассивов

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

4.1. Примерсоздания приложения

Задание:создать Windows-приложениедля вычислениявектораx={x1,x2,…,xm},равногоp-й строкематрицы A={aij}(xj=apj,j=1,2,…,m) и вектораy={y1,y2,…,yn},равного q-мустолбцу матрицыA={aij}(yi=aiq,i=1,2,…,n) (n6,m8).В панели интерфейсапредусмотретьвозможностьуправленияразмерностьюмассивов.

Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.4.1.


4.1.1. Размещениекомпонентовна Форме

Приработе с массивамиввод и выводинформациина экран удобноорганизовыватьс помощью компонентаStringGrid.


Рис. 4.1



КомпонентStringGrid используетсядля отображенияинформациив виде таблицы.Таблица содержитдве зоны –фиксированнуюи рабочую.Фиксированнаязона служитдля выводанаименованийстрок и столбцов рабочей зоныи управленияих размерамис помощью “мыши”.Фиксированнаязона выделенадругим цветоми в нее запрещенввод информациис клавиатуры.Количествострок и столбцовфиксированнойзоны устанавливаетсяв свойствахFixedRows и FixedCols, соответственно.

Рабочаязона содержитRowCount строк и ColCountстолбцов информации,которую можноизменять какпрограммно,так и с помощью“мыши”или клавиатуры.

Доступк информациив программеосуществляетсяс помощью свойства Cells[ACol, ARow: integer]: string, гдеACol-номерстолбца, а ARow –номер строкитаблицы, причемнумерацияначинаетсяс нуля.

Пиктограмма

компонентаStringGrid находитсяна страницеAdditional ПалитрыКомпонентов.Так как в нашемзадании длявсех компонентовStringGrid фиксированнаязона не используется,в ИнспектореОбъектов значениясвойств FixedCols иFixedRows установитеравными 0. Всоответствиис заданиемустановитепредельныезначения количествастрок n истолбцовm для компонентаStringGrid1: ColCount=8, а RowCount=6(восемь столбцови шесть строк).Для компонентаStringGrid2 ColCount=1, RowCount=8, а длякомпонентаStringGrid3 ColCount=1, RowCount=6.

Поумолчанию вкомпонентStringGrid запрещенввод информациис клавиатуры,поэтому длякомпонентаStringGrid1 необходимов ИнспектореОбъектов дваждыщелкнуть “мышью”на символе +свойства +Options ив открывшемсясписке опцийустановитьзначение goEditing вTrue.

Дляудобства работыс компонентамиSpinEdit установитедля компонентаSpinEdit1 значениясвойств:MinValue=1, MaxValue=6, а длякомпонентаSpinEdit2: MinValue=1, MaxValue=8.

4.1.2. Созданиепроцедур обработкисобытий SpinEdit1Changeи SpinEdit2Change

СобытияSpinEdit1Change и SpinEdit2Changeвозникаютпри любом изменениизначения в полередактораSpinEdit1 и SpinEdit2соответственно.Создадим процедурыобработки этихсобытий, в которыхприсвоим значенияn и m,полученныеиз полей редакторовSpinEdit, свойствамColCount иRowCount компонентовStringGrid. Это позволитуправлятьразмерамитаблиц StringGridс помощью компонентовSpinEdit бездополнительныхкнопок, таккак изменениезначений в полередактораSpinEdit сразу приведетк изменениюразмера таблицStringGrid. Дваждыщелкните “мышью”на компонентеSpinEdit1 – курсорустановитсяв текстепроцедуры-обработчикасобытия SpinEdit1Change:procedure TForm1.SpinEdit1Change(Sender:TObject). Внимательнонаберите операторыэтой процедуры,используя текстмодуля UnMas(см.п.4.1.3). Аналогичнымобразом создайте процедуру-обработчиксобытия SpinEdit2Change:procedure TForm1.SpinEdit2Change(Sender: TObject).


4.1.3. Текстмодуля UnMas

UnitUnMas;

interface

uses

Windows, Messages,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Spin,Grids;


type

TForm1 =class(TForm)

Label1: TLabel;

SpinEdit1:TSpinEdit;

SpinEdit2:TSpinEdit;

Label8:TLabel;

StringGrid1:TStringGrid;

StringGrid2:TStringGrid;

StringGrid3:TStringGrid;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

SpinEdit3:TSpinEdit;

SpinEdit4:TSpinEdit;

Label6: TLabel;

Label7: TLabel;

Button1:TButton;

procedureFormCreate(Sender: TObject);

procedureSpinEdit1Change(Sender: TObject);

procedureSpinEdit2Change(Sender:TObject);

procedureButton1Click(Sender: TObject);

private

{Private declarations }

public

{ Publicdeclarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

var

A:array[1..6,1..8]of extended;// объявлениедвумерногомассива A

X:array[1..8]of extended; // объявлениеодномерногомассива X

Y:array[1..6]of extended; // объявлениеодномерногомассива Y

n,m,p,q:integer; // объявлениеглобальныхпеременных

procedureTForm1.FormCreate(Sender: TObject);

begin

SpinEdit1.Text:='4'; //начальноезначение n

SpinEdit2.Text:='6'; // начальноезначение m

SpinEdit3.Text:='2'; // начальноезначение p

SpinEdit4.Text:='3'; // начальноезначение q

StringGrid1.RowCount:=4; // количествострок массиваA

StringGrid1.ColCount:=6; //количествостолбцов массиваA

StringGrid2.RowCount:=6; // количествострок массиваX

StringGrid3.RowCount:=4; //количествострок массиваY

end;

procedureTForm1.SpinEdit1Change(Sender: TObject);

begin

n:=StrToInt(SpinEdit1.Text);//nприсваиваетсясодержимоеполя редактора

StringGrid1.RowCount:=n; // устанавливаетсяколичествострок массиваA

StringGrid3.RowCount:=n; // устанавливаетсяколичествострок массиваY

end;

procedureTForm1.SpinEdit2Change(Sender: TObject);

begin

m:=StrToInt(SpinEdit2.Text);//mприсваиваетсясодержимоеполя редактора

StringGrid1.ColCount:=m;//устанавливаетсяколичествостолбцов массиваA

StringGrid2.RowCount:=m; //устанавливаетсяколичествострок массиваX

end;

procedureTForm1.Button1Click(Sender:TObject);

var

i,j:integer; // объявлениелокальныхпеременных

begin

n:=StrToInt(SpinEdit1.Text);

StringGrid1.RowCount:=n;

StringGrid3.RowCount:=n;

m:=StrToInt(SpinEdit2.Text);

StringGrid1.ColCount:=m;

StringGrid2.RowCount:=m;

p:=StrToInt(SpinEdit3.Text);

q:=StrToInt(SpinEdit4.Text);

// Вводзначений изтаблицы в массивA

for i:=1 to n do

for j:=1 to m do

A[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);

forj:=1 to m do //формированиемассива X и выводего значенийв таблицу

begin

X[j]:=A[p,j];

StringGrid2.Cells[0,j-1]:=FloatToStrF(X[j],ffFixed,3,1);

end;

fori:=1 to n do //формированиемассива Y и выводего значенийв таблицу

begin

Y[i]:=A[i,q];

StringGrid3.Cells[0,i-1]:=FloatToStrF(Y[i],ffFixed,3,1);

end;

end;

end.


4.1.4.Работа сприложением

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

4.2.Выполнениеиндивидуальногозадания

Изучитев приложении2 описаниекомпонентовStringGrid и DrawGrid.

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

Индивидуальныезадания

1. Заданацелочисленнаяматрица Aразмером NxM.Получить массивB, присвоивего k-му элементузначение 0,если все элементыk-го столбцаматрицы нулевые,и значение 1в противномслучае(k=1,2,…,M).

2. ЗаданацелочисленнаяматрицаA размеромNxM. Получитьмассив B, присвоивего k-му элементузначение 1,если элементыk–й строкиматрицы упорядоченыпо убыванию,и значение 0в противномслучае(k=1,2,…,N).

3. Заданацелочисленнаяматрица AразмеромNxM. Получитьмассив B, присвоивего k-му элементузначение 1,если k-я строкаматрицы симметрична,и значение 0в противномслучае(k=1,2,…,N)..

4. Заданацелочисленнаяматрица размеромNxM. Определитьk–количество“особых”элементовматрицы, считаяэлемент “особым”,если он большесуммы остальныхэлементовсвоего столбца.

5. Заданацелочисленнаяматрица размеромNxM. Определитьk–количество“особых”элементовматрицы, считаяэлемент “особым”,если в его строкеслева от негонаходятсяэлементы, меньшиеего, а справа– большие.

6. Заданасимвольнаяматрица размеромNxM. Определитьk-количестворазличныхэлементовматрицы (т.е.повторяющиесяэлементы считатьодин раз).

7. Данавещественнаяматрица размеромNxM. Упорядочитьее строки понеубываниюих первых элементов.

8. Данавещественнаяматрица размеромNxM. Упорядочитьее строки понеубываниюсуммы их элементов.

9. Данавещественнаяматрица размеромNxM. Упорядочитьее строки понеубываниюих наибольшихэлементов.

10. Определитьявляется лизаданная квадратнаяматрица n-гопорядка симметричнойотносительнопобочной диагонали.

11. Длязаданной целойматрицы размеромNxM вывести наэкран все ееседловые точки.Элемент матрицыназываетсяседловой точкой,если он являетсянаименьшимв своей строкеи одновременнонаибольшимв своем столбцеили, наоборот,является наибольшимв своей строкеи наименьшимв своем столбце.

12. Вматрице n-гопорядка переставитьстроки так,чтобы на главнойдиагоналиматрицы былирасположеныэлементы, наибольшиепо абсолютнойвеличине.



Лабораторнаяработа №5

ПРОГРАММИРОВАНИЕАлгоритмовС ИСПОЛЬЗОВАНИЕМстрок

Цель лабораторнойработы:освоить применениекомпонентовListBox и СomboBoxи создать приложение,в которомиспользуютсястроки.

5.1.Пример созданияприложения

Задание:создать Windows-приложениедля подсчетаколичестваслов в произвольнойстроке. Словав строке разделяютсялюбым количествомпробелов. Вводстроки заканчиватьнажатием клавишиEnter. Работаприложениядолжна завершатьсянажатием кнопкиClose.

Один из возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.5.1.

5.1.1. Размещениекомпонентовна Форме

При работесо строкамиввод и выводинформациина экран удобноорганизовыватьс помощью компонентовListBox и ComboBox.


Рис.5.1



КомпонентListBoxпредставляетсобой список,элементы котороговыбираютсяпри помощиклавиатурыили “мыши”.Список элементовзадается свойствомItems, методыAdd, Delete и Insertкоторого используютсядля добавления,удаления ивставки строк,соответственно.Для определенияномера выделенногоэлемента используетсясвойство ItemIndex.

КомпонентComboBoxпредставляетсобой комбинациюсписка ListBoxи редактораЕdit, поэтомупрактическивсе свойствазаимствованыу этих компонентов.Для работы сокном редактированияиспользуетсясвойство Textкак в Edit,а для работысо спискомвыбора используетсясвойство Items какв ListBox. Cуществует5 модификацийкомпонента,определяемыхего свойствомStyle. В модификацииcsSimple список всегдараскрыт, в остальныхон раскрываетсяпосле нажатиякнопки справаот редактора.

КомпонентыListBox и ComboBoxнаходятся настранице StandardПалитры Компонентов.

КомпонентBitBtn расположенна страницеAdditional ПалитрыКомпонентови представляетсобой разновидностьстандартнойкнопки Button.Его отличительнаяособенность– наличие растровогоизображенияна поверхностикнопки, котороеопределяетсясвойствомGlyph. Крометого, имеетсясвойство Kind,которое задаетодну из 11 стандартныхразновидностейкнопок. Нажатиелюбой из них,кроме bkCustom иbkHelp закрываетмодальное окно.Кнопка bkClose закрываетглавное окнои завершаетработу программы.

5.1.2. Созданиепроцедур обработкисобытий

В моментзапуска приложения,когда панельинтерфейсапоявляетсяна экране, дляпользователяудобно чтобыкурсор уженаходился вполе редакторакомпонентаComboBox. При активизацииФормы возникаетсобытие OnActivate,которое можноиспользоватьдля передачифокуса вводакомпонентуComboBox. Для созданияпроцедуры-обработчикаэтого событиянеобходимов ИнспектореОбъектов выбратькомпонентForm1, на страницеEvents найти событиеOnActivate и дваждыщелкнуть “мышью”по его правой(белой) части.Курсор установитсяв текстепроцедуры-обработчикасобытия активизацииФормы:procedure TForm1.FormActivate(Sender: TObject). В этомместе процедуры наберите операторпередачи фокусаввода компонентуComboBox1 (см. текстмодуля UnStr,который приведенв п. 5.1.3).

Всоответствиис заданиемнеобходимо,чтобы при нажатииклавиши Enter строкасимволов, которуюпользовательнабрал в полередактирования,переносиласьв список выборакомпонентаComboBox. Для созданияпроцедуры-обработчикаэтого событиянеобходимов ИнспектореОбъектов выбратькомпонентComboBox1, настранице Eventsнайтисобытие OnKeyPressидважды щелкнуть“мышью”по его правойчасти. Курсорустановитсяв текстепроцедуры-обработчикасобытия нажатияклавиши наклавиатуре:procedureTForm1.ComboBox1KeyPress(Sender:TObject;varKey:Char).В этом местепроцедуры,пользуясьтекстом модуляUnStr, наберитеоператоры,которые принажатии клавишиEnterпереносятстроку из поляредактированияв список выбораи очищают полередактирования.

Процесссозданияпроцедуры-обработчикасобытия нажатияклавиши “мыши”в списке выбораprocedureTForm1.ComboBox1Click(Sender:TObject) выполняетсяаналогичнодля событияOnClick компонента

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


5.1.3. Текстмодуля UnStr

UnitUnStr;

interface

uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls,Buttons;

type

TForm1= class(TForm)

Label2:TLabel;

Label3:TLabel;

BitBtn1:TBitBtn;

ComboBox1:TComboBox;

Label1:TLabel;

procedureComboBox1KeyPress(Sender: TObject; var Key: Char);

procedureComboBox1Click(Sender:TObject);

procedureFormActivate(Sender: TObject);

private

{Private declarations }

public

{Public declarations }

end;

var

Form1:TForm1;


Implementation

{$R*.DFM}


//Обработкасобытия активизацииФормы

procedureTForm1.FormActivate(Sender:TObject);

begin

ComboBox1.SetFocus; //передачафокуса вводаComboBox1

end;


//Обработкасобытия вводасимвола и нажатияклавиши Enter

procedureTForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);

begin

ifkey=#13 then //если нажатаклавиша Enter то

begin //строка из поляредактированиязаносится

ComboBox1.Items.Add(ComboBox1.Text);//в список выбора

ComboBox1.Text:=''; //очистка окнаредактирования

end;

end;


//Обработкасобытия нажатияклавиши "мыши"в списке выбора

procedureTForm1.ComboBox1Click(Sender: TObject);

var

st : string;

n,i,nst,ind:integer;

begin

n:=0; //n содержит количествослов

ind:=0;

nst:=ComboBox1.ItemIndex; //определениеномера выбраннойстроки

st:=ComboBox1.Items[nst];//st присваиваетсявыбраннаястрока

fori:=1 to Length(st) do //просмотр всехсимволов строки

caseind of

0: ifst[i]' ' then //если встретилсясимвол

begin

ind:=1;

n:=n+1; //количествослов увеличиваетсяна единицу

end;

1: ifst[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

UnitUnZap;

interface

uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons,Grids;

type

TForm1 =class(TForm)

StringGrid1:TStringGrid;

Button1:TButton;

procedureFormCreate(Sender: TObject);

procedureButton1Click(Sender: TObject);

private

{ Privatedeclarations }

public

{ Publicdeclarations }

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]ofzap; //объявление массива записей

procedureTForm1.FormCreate(Sender: TObject);

var

i:integer;

begin

withStringGrid1 do

begin //занесениеинформациив ячейки StringGrid1

Cells[0,0]:='№пп’;

Cells[1,0]:='Фамилия,инициалы';

Cells[2,0]:='Математика';

Cells[3,0]:='Физика';

Cells[4,0]:='Сочинение';

Cells[5,0]:='Ср.балл';

fori:=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';

fori:=1 to 9 do

withMZap[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;

procedureTForm1.Button1Click(Sender: TObject);

var

i,j :integer;

vper:zap;

begin

fori:=1 to 9 do

withStringGrid1,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;

fori:=2 to 9 do //сортировкаметодом "пузырька"

forj:=9 downto i do

ifMZap[j-1].srbalthen


begin

vper:=MZap[j-1];

MZap[j-1]:=MZap[j];

MZap[j]:=vper;

end;

fori:=1 to 9 do //заполнениеячеек StringGrid1 полямимассива записей

withStringGrid1,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 являетсякозырной.

  1. Вмагазине формируетсясписок лиц,записавшихсяна покупкутовара повышенногоспроса. Каждаязапись этогосписка содержит:порядковыйномер, Ф.И.О.,домашний адреспокупателяи дату постановкина учет.Удалитьиз списка всеповторныезаписи,проверяя Ф.И.О.и домашнийадрес.



Лабораторнаяработа №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ИнспектораОбъектов. Впоявившемсяокне редакторафильтра-FilterEditor необходимов колонке FilterName набрать текст,характеризующийсоответствующийфильтр, а в колонке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

UnitUnFile;


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;

procedureTForm1.FormCreate(Sender: TObject);

procedureBitBtnSortClick(Sender: TObject);

procedureBitBtnNewClick(Sender: TObject);

procedureSpinEdit1Change(Sender: TObject);

procedureBitBtnOpenClick(Sender: TObject);

procedureBitBtnSaveClick(Sender: TObject);

private

{ Privatedeclarations }

public

{ Publicdeclarations }

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:fileof zap; //объявлениефайла записей

FileText:TextFile; //объявлениетекстовогофайла

FileNameZap,FileNameText:string;//имена файлазаписей и текстовогофайла

n:integer; //текущее кол-воэлементовмассива записей

{Обработчик события созданияФормы }

procedureTForm1.FormCreate(Sender: TObject);

begin

withStringGrid1 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}

procedureTForm1.BitBtnSortClick(Sender: TObject);

var

i,j :integer;

vper:zap;

begin

fori:=1 to n do

withStringGrid1,MZap[i] do

begin

fio:=Cells[1,i];

mat:=StrToInt(Cells[2,i]);

fiz:=StrToInt(Cells[3,i]);

soch:=StrToInt(Cells[4,i]);

end;

{сортировкаметодом "пузырька"}

fori:=2 to n do

forj:=n downto i do

ifMZap[j-1].fio>MZap[j].fio then

begin

vper:=MZap[j-1];

MZap[j-1]:=MZap[j];

MZap[j]:=vper;

end;

fori:=1 to n do //заполнениеячеек StringGrid1 полямимассива записей

withStringGrid1,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;


{Создание новогофайла записей}

procedureTForm1.BitBtnNewClick(Sender: TObject);

var

i:integer;

begin //вывод на экранокна с предупреждающимсообщением

ifMessageDlg('Содержимоесуществующегофайла будетуничтожено.Вы уверены?',

mtConfirmation,mbYesNoCancel, 0)=mrYes then

begin

fori:=1 to n do

withStringGrid1,MZap[i] do

begin //формированиеполей массивазаписей

fio:=Cells[1,i];

mat:=StrToInt(Cells[2,i]);

fiz:=StrToInt(Cells[3,i]);

soch:=StrToInt(Cells[4,i]);

end;

withOpenDialog1 do

begin

Title:='Созданиефайла';//заголовок окнадиалога

ifExecute then //выполнениестандартногодиалога выбораимени файла

begin

FileNameZap:=FileName;//присваиваниеимени файла

AssignFile(FileZap,FileNameZap);//назначить файлуFileZap имя FileNameZap

ReWrite(FileZap); //открыть файлна запись

fori:=1 to n do

write(FileZap,MZap[i]); //запись в файлмассива записей

CloseFile(FileZap); //закрытие файлазаписей

end;

end;

end;

end;


{Обработчик кнопки измененияразмера}

procedureTForm1.SpinEdit1Change(Sender: TObject);

var

i,m:integer;

begin

m:=StrToInt(SpinEdit1.Text);//присвоить новоезначение размера

withStringGrid1 do

begin

RowCount:=m+1;//пересчитатьколичествострок

ifm>n then //если строкидобавлены то

fori:=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 }

procedureTForm1.BitBtnOpenClick(Sender: TObject);

var

i:integer;

begin

withOpenDialog1 do

begin

Title:='Открытиефайла';//заголовок окнадиалога

ifExecute then //выполнениестандартногодиалога выбораимени файла

begin

FileNameZap:=FileName;//присваиваниеимени файла

AssignFile(FileZap,FileNameZap);//назначить файлуFileZap имя FileNameZap

ReSet(FileZap); //открыть файлна чтение

n:=0; //инициализациясчетчика кол-вапрочитанныхиз файла элементов

whilenot EoF(FileZap) do

begin

n:=n+1;//увеличениесчетчика

read(FileZap,MZap[n]);//чтение из файлаn-го элементамассива записей

end;

SpinEdit1.Text:=IntToStr(n);//занести кол-вопрочитанныхзаписей в SpinEdit

StringGrid1.RowCount:=n+1;//присвоитькол-во строк

fori:=1 to n do

withStringGrid1,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;


{Сохранениеданных в текстовомфайле}

procedureTForm1.BitBtnSaveClick(Sender:TObject);

var

i:integer;

begin

withSaveDialog1 do

ifExecute then //выполнениестандартногодиалога выбораимени файла

begin

FileNameText:=FileName;//присваиваниеимени файла

AssignFile(FileText,FileNameText);//назначить файлуFileText имя FileNameText

ReWrite(FileText); //открыть текстовыйфайл на запись

fori:=1 to n do

withMZap[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до xkc шагом 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 откроетпанель NewItems(Репозиторий),в которой сделаемактивной пиктограммуUnit(Модуль)и нажмем кнопкуOK. Откроетсяокно с “пустым”модулем Unit2.С помощьюопции Save As…меню Fileсохраним модульв папке cфайлами проекта,присвоив емуимя, например,UnFuncProc.

В этом модулеоператорывычисленияY(x) в видеподпрограммы-функциииF и операторывычисленияS(x) в видеподпрограммы-процедурыSum оформим поправилам созданиямодулей (текстмодуля UnFuncProcприведен вп.8.1.3).

Для подключениямодуля UnFuncProcк проекту необходимосделать активнымокно с текстоммодуля UnModul,затем в менюFile выбратьопцию UseUnit…и в открывшемсяокне Use Unit указатьимя используемогомодуля – UnFuncProc.Убедитесь втом, что в разделеImplementation модуляUnModul появилсяоператор UsesUnFuncProc; , которыйDelphi вставилав текст модуляUnModul.

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

8.1.3.Текст модуляUnFuncProc

unitUnFuncProc;


interface


var

n:integer; // количествослагаемых всумме S

FunctionF(x:extended):extended;

ProcedureSum(x:extended;Var s:extended);


Implementation


FunctionF(x:extended):extended;

begin

result:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);

end;

ProcedureSum(x:extended;Var s:extended);

var

c:extended;

k:integer;

begin

c:=-x*x*0.5;

S:=1;

fork:=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


UnitUnModul;


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;

procedureFormCreate(Sender: TObject);

procedureBitBtn1Click(Sender: TObject);

private

{Private declarations }

public

{Public declarations }

end;


Type

func=function(x:extended):extended; //функциональныйтип

proc=procedure(x:extended;Vars:extended); // процедурныйтип

var

Form1:TForm1;


implementation


usesUnFuncProc; // Delphiподключаетмодуль UnFuncProc


{$R*.DFM}


procedureTForm1.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)}

procedureTablica(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;

untilx>xk;

end;

procedureTForm1.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 создастобработчикэтого события– процедуруprocedureTForm1.StringGrid1DrawCellиустановиткурсор междуоператорамиbeginиendэтой процедуры.Используятекст модуляUnDinMas, внимательнонаберите операторыпроцедурыTForm1.StringGrid1DrawCell.

9.1.3 Текстмодуля UnDinMas

UnitUnDinMas;


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;

procedureFormCreate(Sender: TObject);

procedureSpinEdit1Change(Sender: TObject);

procedureSpinEdit2Change(Sender: TObject);

procedureStringGrid1DrawCell(Sender: TObject; Col, Row: Integer;

Rect: TRect;State: TGridDrawState);

procedureButton1Click(Sender: TObject);

private

{ Privatedeclarations }

public

{ Publicdeclarations }

end;


var

Form1: TForm1;


implementation

{$R *.DFM}

Type

Mas=array[1..1]ofinteger; //массив целочисленныхзначений

pMas=array[1..1]of^mas; //массив указателей

var //объявлениеглобальныхпеременных

pA:^pMas; //указатель намассив указателей

m,n,max,min:integer;

procedureTForm1.FormCreate(Sender: TObject);

begin

m:=6; //начальноезначение m

n:=8; //начальноезначение n

SpinEdit1.Text:='6';

SpinEdit2.Text:='8';

StringGrid1.RowCount:=m; //количествострок

StringGrid1.ColCount:=n; //количествостолбцов

end;

procedureTForm1.SpinEdit1Change(Sender: TObject);

begin

m:=StrToInt(SpinEdit1.Text);//mприсваиваетсясодержимоеполя редактора

StringGrid1.RowCount:=m;

end;

procedureTForm1.SpinEdit2Change(Sender: TObject);

begin

n:=StrToInt(SpinEdit2.Text);//nприсваиваетсясодержимоеполя редактора

StringGrid1.ColCount:=n;

end;

procedureTForm1.Button1Click(Sender: TObject);

label 1;

var

i,j,k,l,r:integer;

begin

Randomize; //инициализациядатчика случайныхчисел

GetMem(pA,4*m); //выделениепамяти длямассива из mуказателей

fori :=1 to m do

begin //формированиеi-й строки массива

{ Выделениепамяти для nэлементов i-йстроки}

GetMem(pA^[i],SizeOf(integer)*n);

pA^[1]^[1]:=Random(1000);//случайноецелое числозанести в массив

forj:=1 to n do

begin //формированиеj-го элементастроки

1:r:=Random(1000); //генерированиеслучайногочисла

fork:=1 to i do

forl:=1 to j do

ifr=pA^[k]^[l] then//если такоечисло уже естьв массиве тогда...

goto1;

pA^[i]^[j]:=r;//случайное числозанести в массив

end;

end;

fori:=1 to m do //элементы массивазанести в ячейки

forj:=1 to n do//компонентаStringGrid1

StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);

{ Поискmin и max значенийсреди элементовмассива}

max:=pA^[1]^[1];

min:=max;

fori:=1 to m do

forj:=1 to n do

ifpA^[i]^[j]then

min:=pA^[i]^[j]

else

ifpA^[i]^[j]>max then

max:=pA^[i]^[j];

Label7.Caption:=IntToStr(min);//вывод min значения

Label9.Caption:=IntToStr(max);//вывод max значения

fori:=1 to m do

{ Освобожениепамяти, занимаемойn элементамиi-й строки}

FreeMem(pA^[i],SizeOf(integer)*n);

{ Освобождениепамяти, занимаемоймассивом изm указателей}

FreeMem(pA,4*m);

end;

procedureTForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;

Rect:TRect; State: TGridDrawState);

begin

withStringGrid1.Canvas do

ifStringGrid1.Cells[Col,Row]=IntToStr(min) then//если элементячейки

begin //равен min тогда...

Brush.Color:=clGreen;//установитьцвет кистизеленый

FrameRect(Rect); //выделить границыячейки заданнымцветом

end

else

ifStringGrid1.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

UnitUnStek;

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;

procedureButton1Click(Sender: TObject);

procedureFormCreate(Sender: TObject);

private

{ Privatedeclarations }

public

{ Publicdeclarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

Type

PSt=^Zap;

Zap=record

inf:integer;

adr:PSt

end;

Var //объявлениеглобальныхпеременных:

PVer, //указательвершины стека

PTek:PSt; //текущий указатель

ElSt:integer;//элемент стека

procedureTForm1.Button1Click(Sender: TObject);

begin

New(PTek); //выделить память

ElSt:=StrToInt(Edit1.Text);//вElSt занести значениеиз Edit1

PTek^.inf:=ElSt; //в информационнуючасть стеказанести ElSt

PTek^.adr:=PVer; //в адреснуючасть занестиуказатель навершину

PVer:=PTek;//указательвершины долженуказывать напоследнийэлемент

ifElSt>=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

untilPTek=nil;

end;

end;

procedureTForm1.FormCreate(Sender: TObject);

begin

PVer:=nil;//инициализироватьуказательвершины

ElSt:=0;//инициализироватьэлемент стека

end;

end.


9.3.Выполнениеиндивидуальногозадания

По указаниюпреподавателявыберите двавариантаиндивидуальныхзаданий. В заданиях№1-№15 необходимоиспользоватьдинамическиемассивы, а взаданиях №16-№30– динамическиесписки. Во всехзаданиях необходимопредусмотретьконтрольныйвывод исходныхданных.


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

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

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

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

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

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

  7. Создатьприложение,которое осуществляетвводзначенийэлементовдвумерногомассива n-гопорядка с клавиатурыи выводит значениесуммы элементовглавной диагонали.

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

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

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

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

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

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

  14. Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит среднееарифметическоезначение элементовмассива.

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

  16. Создатьприложение,которое заноситв стек целыеположительныечисла с клавиатуры,выводит содержимоестека и среднееарифметическоезначение егоэлементов.

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

  18. Создатьприложение,которое заноситв каждый элементстека английскоеслово с клавиатурыи, как толькобудет введенослово “end”,выводит содержимоестека.

  19. Создатьприложение,которое заноситв стек произвольныецелые числас клавиатуры,выводит содержимоестека и сообщениео том, содержитсяили нет в стекезаданное число.

  20. Создатьприложение,которое заноситв стек символыс клавиатуры,выводит содержимоестека и сообщениео том, упорядоченыли элементыстека по алфавитуили нет.

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