- •Д.С.Ситкин
- •Информатика.
- •Программированиевdelphi
- •Лабораторныйпрактикум
- •Содержание
- •Введение
- •Основныепонятияпрограммирования
- •Этапыпрограммирования
- •Средаdelphi.Созданиепростейшегопроекта
- •Формаиеёсвойства
- •Компонентыформыиихсвойства
- •КомпонентLabeledEdit
- •Событиеипроцедураобработкисобытия
- •Пример1.1
- •Компиляцияизапускпроектанаисполнение
- •Структураисохранениепроекта
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Линейныйалгоритм
- •Типыданных
- •Константыипеременные
- •Арифметическиеоперации
- •Правилазаписитиповыхдействий
- •Структурапроцедурыобработкисобытия
- •Пример2.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Подпрограммы
- •Классификацияиструктураподпрограмм
- •Механизмработыподпрограммыиобменапараметрами
- •Пример3.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Структурамодуля
- •Созданиеиподключениемодуля
- •Пример4.1
- •Условныйоператор.Неполнаяформа
- •Условныйоператор.Полнаяформа
- •IfусловиеthenоператорS1elseоператорS2
- •Пример5.1
- •Пример5.2
- •Операторвыбора
- •Пример5.3
- •Содержаниеотчёта
- •Контрольныевопросы
- •Контрольсинтаксисавводимыхданных
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Алгоритмыповторений
- •Операторцикласпредварительнымусловием
- •Пример7.1
- •Операторцикласпараметром(сосчётчиком)
- •Пример7.2
- •Пример7.3
- •Операторцикласпоследующимусловием
- •Пример7.4
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Массивы
- •Объявлениемассива
- •Обработкамассивов
- •Пример8.1
- •Динамическиемассивы
- •Подпрограммасоткрытымпараметром-массивом
- •Пример8.2
- •Целесообразностьвыделенияпамятиподмассивы
- •Контрольсинтаксисаэлементовмассива
- •Задание
- •Обработкамногомерныхмассивов
- •Пример9.1
- •КомпонентStringGrid
- •Пример9.2
- •Сортировкамассивов
- •Пример9.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Внешниефайлы
- •Физическиеилогическиефайлы
- •Классификациялогическихфайлов
- •Процедурыифункцииобработкифайлов
- •Пример 10.1
- •КомпонентыOpenDialog иSaveDialog
- •Пример 10.2
- •Пример 10.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Олабораторнойработе
- •Информатика. Программированиев delphi
Пример9.3
Разработаемпроектдляпострочнойсортировкиповозрастанию
элементов
двумерного массива пе-ременнойдлины
строк.
выделить па-мять подmэлементов
Разделим
задачу на две части.В первой части
щелчком по кнопкеButton1сформируем
таблицуString-Gridдля
ввода элементов, которуюизначальносделаемневидимой.
Длязаданияпользователемчисла
элементовкаждойстрокиразме-
стим на форме компонентMemo,темсамымбудетопределеноичислострокдвумерногомассива(таблицы). На рис. 9.10 изображенаблок-схема алгоритма первой части(обработкасобытияButton1Click).ПочислузаполненныхстроквMemoвыделяется память под мас-сивхранениядлинстроктаблицы.
В теле цикла, контролируя синтак-сисидлину,вводятсяразмерыстроквмассив,ипараллельноопределяется максимальное значе-ние массива. Вне тела формируетсяразмер таблицы по числу строк вMemoимаксимальномучислуэле-
ментоводнойизстрок.Саматаблицастановитсявидимой,акнопкасортировкистрокButton2
(изначальнонедоступная)до-ступной.Нарушениедопусти-мостиразмералюбойизстрокприводитквыводусообщенияобошибке,высвобождениюпа-
мятииз-подмассивахранениядлинстрокинедоступностикнопкиButton2.
Вовторойчастизадачи(обработка событияButton2Click),рис. 9.11, во внешнем цикле вы-деляетсяпамятьподэлементытекущейстроки таблицы. Затемв первом вложенном цикле онизаписываютсяводномерныймассив(еслинетошибок),внетелаэтогоцикласортируютсяпроцедуройSort_obmen(сот-крытым массивом, т.к. строк не-сколько и они разных длин) и вовтором вложенном цикле выво-дятся в компонентLabel. Затемвсё повторяется для следующейстрокиит.д.
IMPLEMENTATION
{$R*.dfm}
varm:byte;//глобальнаяпеременная,т.к.используетсявдвухпроцедурах
y:array ofbyte; //глобальный динамический массив длин строкProcedureSort_obmen(vart:array ofreal); //пользовательская процедураvarbuf:real; k:byte; f:boolean;
Begin
repeat
f:=false;
fork:=0tohigh(t)-1doift[k]>t[k+1]thenbegin
buf:=t[k];t[k]:=t[k+1]; t[k+1]:=buf;f:=true;
end;
untilnotf;
End;//конецпользовательскойпроцедурысортировкиодномерногомассива
ProcedureTForm1.Button1Click(Sender:TObject);
vari,max:byte;Cod:integer;
Begin
m:=Memo1.Lines.Count; //определение числа строк вMemoSetLength(y, m); //выделение памяти под массив хранения длин строкfori:=0tom-1do//циклпереборастроквMemo
begin//началотелацикла
Val(Memo1.Lines[i],y[i],Cod);//вводвмассивдлиныi-ойстроки
if(Cod<>0)or(y[i]<2)then//еслисинт.ошибкаилинедопуст.длина
begin//то
Button2.Enabled:=False; //кнопка сортировки строк недоступнаShowMessage('ошибка длины строки'); //вывод сообщенияSetLength(y,0);Exit;//высвободитьпамятьидосрочныйвыход
end;//конецдействийдляслучаяошибки
ifi=0thenmax:=y[0];//пустьнулеваястрокамаксимальнойдлины
ify[i]>maxthenmax:=y[i];//поисксамойдлинной строки
end;//конецтелацикла
withStringGrid1dobegin//формированиетаблицыдлявводазначений
RowCount:=m;ColCount:=max;Visible:=True;
end;
Button2.Enabled:=True;//кнопкасортировкистрокдоступна
End;//конецпроцедурыформированиятаблицы
ProcedureTForm1.Button2Click(Sender:TObject);
vari,j:byte;Cod:integer;z:arrayofreal;
Begin
Label2.Caption:=''; //очистка поля вывода при повторном щелчкеfori:=0tom-1do//внешний цикл – перебор строк таблицыbegin//началотелавнешнегоцикла
SetLength(z,y[i]);//выделениепамятиподi-уюстроку
forj:=0toy[i]-1do//первыйвложенныйцикл–вводi-ой строкитаблицы
begin//началотелапервоговложенногоцикла
Val(StringGrid1.Cells[j,i],z[j],Cod);//вводj-гоэлементаi-ойстроки
ifCod<>0thenbegin//еслисинтаксическаяошибка
Label2.Caption:='';//очисткаполявывода
ShowMessage('ошибкасинтаксисавтаблице');
SetLength(z,0);Exit;//высвоб.памятьидоср.выход
end;//конецдействийдляслучаясинтаксич.ошибки
end;//конецтелапервоговложенногоцикла
Sort_obmen(z);//сортировкаэлементовi-ойстрокитаблицы
forj:=0toy[i]-1do//второйвлож.цикл–вывод отсортиров-ойстроки
Label2.Caption:=Label2.Caption+#9+FloatToStr(z[j]);
Label2.Caption:=Label2.Caption+#13;//переводстрокивывода
end;//конецтелавнешнегоцикла
SetLength(z,0);//высвобождениепамятииз-подмассивазначенийтаблицы
end;END.//конецпроцедурыпострочной сортировкииконецмодуля
Память из-под массиваyдлин строк не высвобождалась, т.к. онавыделяется во второй процедуре, а массив используется и в третьей,кроме того, возможен повторный щелчок пользователем по кнопкеButton2безщелчкапоButton1,поэтомуивтретьейпроцедуреосвобо-
дить
память нельзя. В данномпримере
представляет интересвопрос выделения
памяти, по-этомуонотражёнвблок-схемах,чтонеобычно.Нарис.
9.12представленпримеррабо-
тыприложения.
Рис.9.12
