Лабораторнаяработа №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.Задание:создать 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 активнымявляется окноРедактора Кода.
ОкнаФормы и РедактораКода модуляв правом верхнемуглу имеюткнопки управления,которые предназначены:
-для свертыванияокна в пиктограмму, -для разворачиванияокна на весьэкран и возвращенияк исходномуразмеру , -для закрытияокна.Спомощью “мыши”,захватываяодну из кромококна или выделеннуюстроку заголовка,отрегулируетенужные размерыокон Формы,Редактора Кода,ИнспектораОбъектов и ихположение наэкране.
НоваяФорма имеетодинаковыеимя (Name) и заголовок(Сaption) - FORM1. Начинающимпрограммистамимя Формы менятьне рекомендуется,т.к. оно используетсяв тексте модуля.
Дляизменениязаголовкаактивизируйтеокно ИнспектораОбъектов и настранице Propertiesв свойствеCaption заменитезаголовок Form1на Лаб. работа №1-Линейныйалгоритм.Убедитесь, чтоодновременноизменилсязаголовок окнаФормы.
Будемразмещатькомпонентына Форме так,чтобы онисоответствовалипанели, показаннойна рис 1.2.
Длянанесениянадписей наФорму используетсякомпонентLabel. Выберитев Палитре Компонентовна страницеStandard пиктограмму
компонентаLabel и щелкнитена ней “мышью”.Затем в нужномместе Формыщелкните “мышью”- появитсянадпись Label1. Всвойстве CaptionИнспектораОбъектов заменитенадпись Label1на Введитезначение X:.В свойстве Fontподберитешрифт. Аналогичнонанесите наФорму остальныенадписи. Щелкнув“мышью”на любом изразмещенныхкомпонентов,отрегулируйтеего местоположениена Форме и размер.Дляввода/выводаданных в простейшихслучаях используютсякомпонентыEdit и Memo. КомпонентEdit применяетсяв тех случаях,когда данныепредставляютсяодной строкой.Если данныепредставляютсобой несколькострок, то используетсякомпонент Memo.
Длясоздания полейввода численныхзначений переменных x, yи z используемкомпонентEdit. Выберитев Палитре Компонентовна страницеStandard пиктограмму
и разместитекомпонент Editв нужных местахФормы так же,как Вы это делалис компонентомLabel.Длявывода результатовиспользуемкомпонент Memo.Выберите вПалитре Компонентовна страницеStandard пиктограмму
,поместитекомпонент Memoна Форму иоткорректируйтеего местоположениеи размеры.Еслипрограммистжелает, чтобыпри появлениипанели интерфейсана экране всоответствующихполях находилисьначальныезначения данных,он должен учесть,что при запускеприложениявозникаетсобытие - созданиеФормы (OnCreate). Создадимпроцедуруобработки этогособытия, котораязанесет начальныезначения переменныхx, y, z вполя Edit1, Edit2и Edit3 соответственно,а в поле Memo1поместит строкуЛабораторнаяработа №1 – Линейныйалгоритм. Дляэтого дваждыщелкните мышьюна любом свободномместе Формы.На экране появитсятекст модуляUnLinAlg, в которомDELPHI автоматическисоздает заготовкупроцедуры-обработчикасобытия созданияФормы:Procedure TForm1.FormCreate(Sender:TObject).Между операторамиbegin и end этойпроцедурывставьте операторы,которые выполняютнеобходимыедействия (текст модуля приведен вп.1.2.7).
Поместимна Форму кнопку,нажатие которойприведет квычислениювыражения.Выберите вПалитре Компонентовна страницеStandart пиктограмму
компонентаButton. В свойствеCaption ИнспектораОбъектов заменитенадпись накнопке Button1на Вычислить.В свойстве Fontподберитешрифт. Отрегулируйтеположение иразмер кнопки.Затем дваждыщелкните “мышью”на кнопке, послечего курсорустановитсяв текстепроцедуры-обработчикасобытия нажатия кнопкиButton1 : ProcedureTForm1.Button1Click(Sender:TObject).Внимательнонаберитеоператоры этойпроцедуры,используятекст модуля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.
Длязапуска созданногоприложениянажмите пиктограмму
главного менюили клавишуF9. При этомпроисходиткомпиляциямодулей и, еслинет ошибок,компоновкапроекта и созданиевыполняемогофайла PrLinAlg.exe.На экране появляетсяпанель интерфейсаприложения(рис.1.2).Щелкните“мышью”на кнопке “Вычислить”и в поле Memo1появляетсярезультат.Измените исходныезначения x,y, z в поляхEdit и снованажмите кнопку”Вычислить”.Убедитесь, чтов поле Memo1отображаютсяновые результаты.Завершитьработу приложенияможно нажатиемкнопки
в правом верхнемуглу панелиинтерфейса.Вслучае нештатногофункционированияприложениявосстановитьпервоначальныйрежим работыс проектомможно путемвыбора в менюRun опции ProgramReset илинажать клавишиCtrl+F2.
Поуказаниюпреподавателявыберите своеиндивидуальноезадание. Уточнитеусловие задания,количествои типы исходныхданных. В соответствиис этим оформитедизайн панелиинтерфейсапроектируемогоприложения,установитенеобходимоеколичествополей 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
Цельлабораторнойработы: освоитьиспользованиепростейшихкомпонентов-переключателейи создать приложение, которое использует разветвляющийсяалгоритм.
Задание:создать Windows-приложениедля вычислениявыражения
Z=
, где по желаниюпользователя.В панели интерфейсапредусмотретьвозможностьуправленияконтрольнымвыводом исходныхданных.Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан на рис.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.Технологиясоздания процедуробработкисобытий FormСreate иButton1Сlick ничемне отличаетсяот предыдущейработы. Внимательнонаберитеоператоры этихпроцедур, используятекст модуля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;
//Вычислениевыражения:
ifx
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.
Запуститесозданноеприложение.Используя всеуправляющиекомпонентыпанели интерфейса,убедитесь вправильномфункционированииприложенияво всех предусмотренныхрежимах работы.
Поуказаниюпреподавателявыберите своеиндивидуальноезадание. Создайтеприложениеи протестируйтеего работу.
Длязаданий №1-№15 на панели интерфейсапредусмотретьвозможностьвыбора однойиз трех функцийf(x): sh(x), x2,eX.
1. | 2. | ||
3. | 4. | ||
5. | 6. | ||
7. | 8. |
Лабораторнаяработа №3
Цельлабораторнойработы: освоитьпростейшиесредства отладкимодулей проектаи создать приложение,которое используетциклическийалгоритм.
Отладкапредставляетсобой процессобнаружения,локализациии устраненияошибок в проекте.Она занимаетзначительнуючасть рабочеговремени программиста,нередко большую,чем разработкапроекта.
Практическилюбой нетривиальныйпроект передначалом отладкисодержит хотябы одну синтаксическуюили логическую ошибку.
Синтаксическиеошибки состоятв нарушенииформальныхправил использованияоператоров.Эти ошибкипоявляютсяв результатенедостаточногознания разработчикомязыка программированияи невнимательностипри набореоператоровна экране дисплея.
Поисксинтаксическихошибок в модуляхпроекта осуществляетсякомпилятором.Чтобы датьпрограммистукак можно большеинформацииоб ошибках,допущенныхв модуле, компиляторотмечает ошибкии продолжаетработу до техпор, пока небудут обработанывсе операторымодуля. Следуетиметь в виду,что:
компиляторраспознаетне все ошибки;
некоторыеошибки могутповлечь засобой то, чтоправильныеоператорыбудут восприниматьсякомпиляторомкак ошибочные,и наоборот –ошибочныеоператорыкомпиляторвоспримет какверные;
ошибкав одном местемодуля можетповлечь засобой сериюдиагностическихсообщенийкомпиляторав других местахмодуля;
из-занекоторыхошибок компиляциямодуля можетвообще прекращатьсяи проверкапоследующихоператоровне производится.
Информацияобо всех ошибках,найденных вмодуле, выводитсяв специальноеокно, котороепоявляетсяв нижней частиэкрана. Каждаястрока этогоокна содержитимя файла, номерстроки, в которойобнаруженаошибка и характерошибки. Еслидважды щелкнуть“мышью”на строке сописаниемошибки, курсорустановитсяв той строкемодуля, гдеобнаруженаошибка. Следуетисправлятьошибки последовательно,сверху внизи после исправлениякаждой ошибкикомпилироватьпрограммузаново. С цельюсокращениявремени компиляциирекомендуетсяосуществлятьпроверку наличияошибок в режимахSyntax Check иCompileменю Project.Для полученияболее полнойинформациио характереошибки можнообратится кHELP нажатиемклавиши F1.
Отладкасинтаксисасчитаетсязавершенной,когда послеочереднойкомпиляциив режиме BuildAll меню Projectотсутствуютдиагностическиесообщения обошибках.
Логическиеошибки условноможно разделитьна ошибки алгоритмаи семантическиеошибки. Причинамитаких ошибокмогут бытьнесоответствиеалгоритмапоставленнойзадаче, неправильноепониманиепрограммистомсмысла (семантики)операторовязыка программирования,нарушениедопустимыхпределов иправил представленияданных, невнимательностьпри техническойподготовкепроекта к обработкена компьютере.
Длявыявленияошибок служаттесты. Тест– это такойнабор исходныхданных, которыйдает результат,не вызывающийсомнений.Промежуточныеи конечныерезультатытеста используютсядля контроляправильностивыполненияприложения.
Составлениетестов – непростаязадача. Тестыдолжны бытьс одной стороны,достаточнопростыми, чтобырезультат легкопроверялся,с другой стороны– достаточносложными, чтобыкомплекснопроверитьалгоритм.
Тестысоставляютсяпо схеме алгоритмадо программирования,так как составлениетестов помогаетвыявить многиеошибки в алгоритмизации.
Количествотестов и ихсложностьзависят оталгоритма.Комплекс тестовдолжен бытьтаким, чтобывсе ветви схемыалгоритма былипройдены, покрайней мере,по одномуразу.Несовпадениерезультатов,выдаваемыхприложениемс результатамитестов – признакналичия ошибок.Эти ошибкипроявляютсяв том, что результатрасчета оказываетсяневерным либопроисходитпереполнение,деление на 0 идр.
Длялокализацииместа ошибкирекомендуетсяпоступатьследующимобразом. В окнеРедактора Кодаустановитекурсор в строкеперед подозрительнымучастком инажмите клавишуF4 (выполнитьдо курсора).Выполнениеприложениябудет остановленона той строкемодуля, в которойбыл установленкурсор. Текущеезначение любойпеременнойможно увидеть,если накрытькурсоромидентификатор переменнойна 1-2 сек. Нажимаяклавишу F8 (пошаговоевыполнение),можно построчновыполнятьпрограмму,контролируясодержимоепеременныхи правильностьвычислений.
Задание:создать 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.
Поуказаниюпреподавателявыберите своеиндивидуальноезадание. Создайтеприложениеи протестируйтеего работу.
Взаданиях с №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 и создатьприложение,в которомиспользуютсямассивы.
Задание:создать 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.
Приработе с массивамиввод и выводинформациина экран удобноорганизовыватьс помощью компонента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.
События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и создать приложение,в которомиспользуютсястроки.
Задание:создать Windows-приложениедля подсчетаколичестваслов в произвольнойстроке. Словав строке разделяютсялюбым количествомпробелов. Вводстроки заканчиватьнажатием клавишиEnter. Работаприложениядолжна завершатьсянажатием кнопкиClose.
Один из возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.5.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 закрываетглавное окнои завершаетработу программы.
В моментзапуска приложения,когда панельинтерфейсапоявляетсяна экране, дляпользователяудобно чтобыкурсор уженаходился вполе редакторакомпонента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.
Для проверкифункционированияприложения подготовитьнесколькотестов.
1. Данастрока, состоящаяиз групп нулейи единиц. Каждаягруппа отделяетсядруг от другаодним или несколькимипробелами.Найти количествогрупп с пятьюсимволами.
2. Дана строка,состоящая изгрупп нулейи единиц. Каждаягруппа отделяетсядруг от другаодним или несколькимипробелами.Найти и вывестина экран самуюкороткую группу.
3. Дана строка,состоящая изгрупп нулейи единиц. Каждаягруппа отделяетсядруг от другаодним или несколькимипробелами.Подсчитатьколичествосимволов всамой длиннойгруппе.
4. Дана строка,состоящая изгрупп нулейи единиц. Каждаягруппа отделяетсядруг от другаодним или несколькимипробелами.Найти и вывестина экран группыс четным количествомсимволов.
Лабораторнаяработа №6
Цельлабораторнойработы:создатьприложение,в которомиспользуются данные типазапись.
Задание:создать Windows-приложениедля обработкиведомости обуспеваемостиучащихся вколичестве9 человек. Каждаязапись должнасодержатьфамилию, инициалы, а также оценкипо физике, математикеи сочинению.Вывести списокучащихся,отсортированныйв порядке уменьшенияих среднегобалла.
Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.6.1.
Рис. 6.1
Вэтом заданиидля нанесениясоответствующихнадписей вколонках истроках используетсяфиксированнаязона компонентаStringGrid, поэтомув ИнспектореОбъектов значениясвойств FixedColsи FixedRows установитеравными 1. Всоответствиис заданиемустановитезначение свойстваColCount=6, а значениесвойства RowCount=10.Для возможностипросмотра всегосписка учащихсяв компонентеStringGrid удобноиспользоватьвертикальнуюлинейку прокрутки,поэтому установитесвойство ScrollBarsв состояниеssVertical. Откройтесписок опцийсвойства +Optionsи установитезначение goEditingв True – этодаст возможностьредактироватьинформациюв компонентеStringGrid с помощьюклавиатурыи “мыши”.
Двойнымнажатием клавиши“мыши” наФорме и кнопкеButton1 создайтесоответствующиепроцедурыобработкисобытий. Используятекст модуля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].srbal
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.
Поуказаниюпреподавателявыберите своеиндивидуальноезадание. Создайтеприложениеи протестируйтеего работу.
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и создатьприложение,в которомиспользуются файлы.
Задание:создать Windows-приложениедля записи вфайл и чтенияиз файла ведомостиоб успеваемостиучащихся вколичестве10 человек. Каждаязапись файладолжна содержатьфамилию, инициалы,а также оценкипо физике, математикеи сочинению.Вывести списокучащихся,отсортированныйв алфавитномпорядке и записатьэту информациюв текстовойфайл.
Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.7.1.
Приработе с файламичтение и записьинформацииудобно организовыватьс помощью компонентовOpenDialog и SaveDialog.
BitBtn
Рис. 7.1
ДляустановкикомпонентовOpenDialog и SaveDialog наФорму необходимона страницеDialogs ПалитрыКомпонентовщелкнуть “мышью”соответственнопо пиктограмме
или и разместитьее в любом свободномместе Формы.При выполненииприложенияв момент вызовакомпонентапоявляетсядиалоговоеокно, с помощьюкоторого пользовательвыбирает имяфайла и маршрутк нему. В случаеуспешногозавершениядиалога имявыбранногофайла и маршрутпоиска содержитсяв свойствеFileName.Рис.7.2
Маска*.dat означаетчто, будут видныфайлы данныхс любым именеми с расширениемdat, а маска*.* - что будут виднывсе файлы (слюбым именеми с любым расширением).
Длятого, чтобыфайл автоматическизаписывалсяс расширениемdat в свойствеDefaultExt запишемтребуемоерасширение- dat.
Аналогичнымобразом настроимкомпонентSaveDialog1 длятекстовогофайла (расширениеtxt).
Дляудобства работыс несколькимиразличнымипроцедурамиобработкисобытий в свойствеName каждогокомпонентаBitBtn заменитепрограммныеимена кнопок:BitBtn1 – на BitBtnNew,BitBtn2 – на BitBtnOpen,BitBtn3 – на BitBtnSort,BitBtn4 – на BitBtnSave.Двойным нажатиемклавиши “мыши”на кнопкахBitBtn создайтесоответствующиепроцедурыобработкисобытий. Пользуясьтекстом модуля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.
Запуститесозданноеприложение.Занесите всоответствующиеполя панелиинтерфейсаинформациюоб успеваемостиучащихся.Кнопкой “New”сохранитеданные в файле.Завершитевыполнениеприложения.
Вновьзапуститеприложениеи кнопкой “Open”откройтетолько чтосозданный файл.Убедитесь, чтоинформацияне содержитошибок. Принеобходимостиобнаруженныеошибки можноисправить, атакже дополнитьведомость новойинформацией.Для сортировкиведомости валфавитномпорядке воспользуйтеськнопкой “Sort”и сохранитеотсортированнуюинформациюкнопкой “New”.
Ещераз завершитеи вновь запуститеприложение.
Кнопкой“Open откройтефайл и убедитесь,что в нем теперьсодержитсяведомость,отсортированнаяв алфавитномпорядке. Кнопкой“Save”сохранитеинформациюв текстовомфайле. Для просмотрасодержимоготекстовогофайла воспользуйтесь,например, приложением“Microsoft Word”.
Используя всеуправляющиекомпонентыпанели интерфейса,убедитесь вправильномфункционированииприложенияво всех предусмотренныхрежимах работы.
Вовсех заданиях предусмотретьсохранениевводимых данныхв файле и возможностьчтения из ранеесозданногофайла. Результатывыводить впанель интерфейсаи в текстовыйфайл.
1.Ведомостьабитуриентов,сдавших вступительныеэкзамены вуниверситетсодержит:Ф.И.О.абитуриента,оценки.Определитьсредний баллпо университетуи вывести списокабитуриентов,средний баллкоторых вышесреднего баллапо университету.Первыми в спискедолжны идтистуденты,сдавшие всеэкзамены на5.
2.В радиоательехранятся квитанциио сданной времонт радиоаппаратуре.Каждая квитанциясодержит следующуюинформацию:наименованиегруппы изделий(телевизор,радиоприемники т.п.), маркаизделия,дата приемкив ремонт,состояниеготовностизаказа (выполнен,не выполнен).Вывести информациюо состояниизаказов натекущие суткипо группамизделий.
3.У администраторажелезнодорожныхкасс хранитсяинформацияо свободныхместах в поездахдальнего следованияна ближайшуюнеделюв следующемвиде:дата выезда,пункт назначения,время отправления,число свободныхмест. Оргкомитетмеждународнойконференцииобращаетсяк администраторус просьбойзарезервироватьmмест до городаNна k-йдень неделис временемотправленияпоезда не позднееtчасоввечера.Вывестивремя отправленияили сообщениео невозможностивыполнить заказв полном объеме.
4.Разработатьпрограммуформированияведомости обуспеваемостистудентов.Каждая записьэтой ведомостидолжна содержать:номер группы,Ф.И.О.студента,оценки за последнююсессию.Вывести спискистудентов погруппам. В каждойгруппе Ф.И.О.студентовдолжны бытьрасположеныв порядке убываниясреднего балла.
Лабораторнаяработа №8
Цельлабораторнойработы: освоитьметодику созданиямодулей, содержащихпроцедуры ифункции, ииспользованияих в проекте.
Задание:создать Windows-приложениекоторое выводиттаблицу значенийфункции
и ее разложенияв ряд в видесуммы для значений x от xnдо xkc шагом h=(xk- xn)/10.Создать модуль,в котором вычислениезначений оформить ввиде функции,а вычисление - в виде процедуры.Подключитьмодуль к проектуи выполнитьсозданноеприложение.Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.8.1.
8.1.1.Размещениекомпонентовна Форме
Label
Edit
Button
Р
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.
Поуказаниюпреподавателявыберите изтаблицы двавариантаиндивидуальныхзаданий. Создайтемодуль, в которомвычислениезначений
реализуйтев виде подпрограммы-процедуры,а вычислениезначений - в виде подпрограммы-функции.На панели интерфейсаустановитекомпонент, спомощью которогореализуйтевозможностьвыбора соответствующеговарианта заданияи вывод таблицызначений ,где 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
Цельлабораторнойработы:освоить методикусоздания приложений,в которыхиспользуютсядинамическиеструктурыданных.
Задание:создать приложениедля вычислениянаименьшегои наибольшегоиз всех значенийэлементовцелочисленнойматрицы 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
Рис. 9.1
Сохраниммодуль подименемUnDinMas (текст модуляприведен вп.9.1.3).
Двойнымнажатием клавиши“мыши”на Форме и кнопкеButton1 создайтесоответствующиепроцедурыобработкисобытий. Пользуясьтекстом модуляUnDinMas, внимательнонаберите операторыэтих процедур.
Прижелании можносоздать процедуру,которая будетвыделять заданнымцветом границыячеек с наименьшими наибольшимзначениямив компонентеStringGrid.Для созданиятакой процедурысделайте активнымкомпонентStringGridи на страницеEvents(события)ИнспектораОбъектов дваждыщелкните “мышью”в правой частисобытия OnDrawCell. Вответ Delphi создастобработчикэтого события– процедуруprocedureTForm1.StringGrid1DrawCellиустановиткурсор междуоператорамиbeginиendэтой процедуры.Используятекст модуляUnDinMas, внимательнонаберите операторыпроцедурыTForm1.StringGrid1DrawCell.
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]
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.
Задание2:создать приложениедля формированиястека, которыйзаполняетсяпутем вводацелых положительныхчисел с клавиатуры.Как толькобудет введенопервое отрицательноечисло, содержимоестека выводитсяна панель интерфейса,а память занимаемаяего элементамиосвобождается.
Одиниз возможныхвариантовпанели интерфейсасоздаваемогоприложенияпоказан нарис.9.2.
9.2.1.Размещениекомпонентовна Форме
Разместимна Форме компонентыLabel, Edit, Button и Memo.
Label
Memo
Edit
Button
Рис. 9.2
Сохраниммодуль подименем UnStek(текст модуляприведен вп.9.2.3).
Двойнымнажатием клавиши“мыши”на Форме и кнопкеButton1 создайтесоответствующиепроцедурыобработкисобытий. Используятекст модуля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.
По указаниюпреподавателявыберите двавариантаиндивидуальныхзаданий. В заданиях№1-№15 необходимоиспользоватьдинамическиемассивы, а взаданиях №16-№30– динамическиесписки. Во всехзаданиях необходимопредусмотретьконтрольныйвывод исходныхданных.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,меняет местамиэлементы снаибольшими наименьшимзначениямисреди четныхи выводит полученныймассив.
Создатьприложение,которое осуществляетвводmстрок и nстолбцовдвумерногомассива с клавиатурыи выводит номерстроки и номерстолбца наименьшегоиз всех значенийего элементов.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит порядковыйномер элементас наименьшимзначениемсреди нечетных.
Создатьприложение,которое осуществляетвводзначенийэлементовдвумерногомассива n-гопорядка с клавиатурыи выводит значениенаибольшегоиз элементовглавной диагонали.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,изменяет порядокследованияэлементов напротивоположныйи выводит полученныймассив.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит порядковыйномер элементас наибольшимзначениемсреди четных.
Создатьприложение,которое осуществляетвводзначенийэлементовдвумерногомассива n-гопорядка с клавиатурыи выводит значениесуммы элементовглавной диагонали.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,меняет местамиэлементы сминимальными максимальнымзначениямии выводит полученныймассив.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит порядковыйномер элементас наименьшимзначениемсреди положительных.
Создатьприложение,которое осуществляетвводзначенийэлементовдвумерногомассива n-гопорядка склавиатуры,изменяет порядокследованияэлементовглавной диагоналина противоположныйи выводитпреобразованныймассив.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,меняет местамиэлементы сминимальными максимальнымзначениямисреди положительныхи выводит полученныймассив.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит порядковыйномер элементас наибольшимзначениемсреди отрицательных.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,меняет местамиэлементы снаибольшимзначениемсреди отрицательныхи наименьшимсреди положительныхи выводит полученныймассив.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива с клавиатурыи выводит среднееарифметическоезначение элементовмассива.
Создатьприложение,которое осуществляетвводkзначений элементоводномерногомассива склавиатуры,меняет местамиэлементы снаименьшимзначениемсреди четныхи наибольшимсреди нечетныхи выводит полученныймассив.
Создатьприложение,которое заноситв стек целыеположительныечисла с клавиатуры,выводит содержимоестека и среднееарифметическоезначение егоэлементов.
Создатьприложение,которое заноситв стек символыс клавиатуры,выводит содержимоестека и сообщениео том, содержитсяили нет в стекезаданный символ.
Создатьприложение,которое заноситв каждый элементстека английскоеслово с клавиатурыи, как толькобудет введенослово “end”,выводит содержимоестека.
Создатьприложение,которое заноситв стек произвольныецелые числас клавиатуры,выводит содержимоестека и сообщениео том, содержитсяили нет в стекезаданное число.
Создатьприложение,которое заноситв стек символыс клавиатуры,выводит содержимоестека и сообщениео том, упорядоченыли элементыстека по алфавитуили нет.
Создатьприложение,которое заноситв стек положительныецелые числас клавиатурыи, как толькобудет введеночисло, равноесумме введенныхчисел, выводитсодержимоестека.