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

Пример9.2

Разработаемпроектдляудвоенияэлементовглавнойдиагоналиитранспонированияквадратнойматрицызадаваемого размера.

Разобьём задачу на две части: ввод размера матрицы (компонентEdit1) с формированием в соответствии с ним таблицы для ввода зна-ченийэлементовмассива(событиеButton1Click)иегообработкусвы-водом результатов (событиеButton2Click). Разместим на форме компо-нентStringGrid, число фиксированных строк и столбцов назначим понулям. Для возможности ввода и редактирования значений элементовво время работы приложения установим значениеTrueсвойстваOp-tions.goEditing. НазначимзначенияFalseсвойствVisibleдляStringGridиEnabledдляButton2.Этозначит,чтопослезапускаприложения,табли-

цаStringGridна форме будет визуальноотсутствовать, а кнопкаButton2недо-ступна.Этоисключитвозможностьвводаэлементовмассиваиегообра-ботки до программного изменения этихзначенийнаTrue.Произведёмихпо-

слевводапользователемдопустимого

размера матрицы вEdit1и щелчка поButton1.Нарис.9.4представленаблок-схемаалгоритмавыполненияпервойчастизадачи(событиеButton1Click).

Рис.9.5

Вовторойчасти(событиеBut-ton2Click)введённые в компонентStringGridэлементывконструкциивложенныхцикловсчитываютсявпамять после проверки синтаксисакаждогоэлементавовложенномцикле (рис. 9.5). Затем происходитудвоение элемента, если он лежитнаглавнойдиагонали,выводэле-мента,например,вкомпонентLabel2,длякоторогоустановимзначениеTrueсвойстваAutoSize,т.к. заранее размер матрицы неиз-вестен. После выхода из вложенно-го цикла, при переходе к следую-щейстроке,выполнимпереводстроки выводав компонентеLabel2длясохраненияматричнойструк-турыпредставлениярезультата.Поскольку значение переменнойn,содержащейразмерматрицы,ис-пользуется в обеих процедурах, еёследуетобъявитькакглобальную,т.е.внепроцедур.Нарис.9.6и9.7

представленыпримерыработыприложения.

IMPLEMENTATION

{$R*.dfm}

varn:integer;//объявленакакглобальная(внутримодуля)переменная

ProcedureTForm1.Button1Click(Sender:TObject);

varCod:integer;

Begin

Val(Edit1.Text, n, Cod); //проверка синт-са и вводnif(Cod < > 0)or(n<2)then//если ошибка, - тоbegin

Button2.Enabled:=False;//блокировкакнопки2

ShowMessage('ошибкаразмераматрицы');

Exit;//досрочноезавершениепроцедуры

end;

withStringGrid1do//операторприсоединения-

begin//вып-е неск. действий с одним компонентомRowCount:=n; //установлениечисластрокColCount:=n; //установлениечисластолбцовVisible:=True; //сделатьStringGrid1видимым

end;//конецдействий,выполняемыхскомпонентом

Button2.Enabled:=True;//активациякнопки2

End;//конецпервойпроцедуры

ProcedureTForm1.Button2Click(Sender:TObject);varx:array of array ofreal;i, j:byte;Cod:integer;Begin

Label2.Caption:='';//очисткаполявыводаприповт.щелчке

SetLength(x, n, n); //выделение памяти под матрицуfori:=0ton1do//внешний цикл (перебор строк)begin//началотелавнешнего цикла

forj:=0ton1do//вложенныйцикл(переборстолбцов)

begin//начало тела вложенного циклаVal(StringGrid1.Cells[i,j],x[i,j],Cod);//вводxijifCod<>0thenbegin//еслиошибкасинтаксиса,то

Рис.9.6

Рис.9.7

Label2.Caption:='';//очисткаполявывода

ShowMessage('ошибкасинтаксисавматрице');

SetLength(x,0,0); Exit;//высвоб.памятиивыход

end;//конецдействийдляслучаясинтакс.ошибки

ifi=jthenx[i,j]:=2*x[i,j];//удв-е элемента,еслионнаглавнойдиагон.

Label2.Caption:=Label2.Caption+#9+FloatToStr(x[i, j]); //выводxijend;//конецтелавложенногоциклаLabel2.Caption:=Label2.Caption+#13;//переводстрокивывода

end;//конецтелавнешнегоцикла

SetLength(x,0,0);//высвобождениепамятихраненияэлементовматрицы

End;END.//конецвторойпроцедурыи конецмодуляпроекта