Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sitkin_Informatika_Programmirovanie_v_DELPHI.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
600.56 Кб
Скачать

Пример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