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

Пример8.1

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

Блок-схема алгоритма решения пред-ставлена на рис. 8.2. После ввода коэффи-циентадомноженияkустанавливаютсяначальныезначениясчётчикаотрицатель-ных элементовhи индекса элементаi. Вцикле после вводаi-го элемента в памятькаждый проверяется на знак. Если текущийэлемент отрицательный, то он умножаетсянаk, это значение «затрёт» старое, а счёт-чикhувеличит своё значение на единицу. Впротивном случае эти две операции пропу-стятся. Независимо от этого условия в телецикла выводитсяi-ый элемент и осуществ-ляетсяпереходкследующемупономеруэлементу. Процесс продолжается, пока ин-декс не превысит число элементов в масси-ве. Значение счётчика отрицательных чиселвыводитсяужепослеокончанияцикличе-скогопроцесса,т.к.это значениеодно.

Реализуемалгоритмвпроекте.Длявводамассивасформыудобноиспользо-ватькомпонентMemo,расположиввнёмпо

одномуэлементувстроке.Свойстваком-

Рис.8.2

понентаописанывработе1.

procedureTForm1.Button1Click(Sender:TObject);

constm=100;

varx: array[1..m]ofreal;i,n,h:byte;

k:real;

begin

k:=StrToFloat(Edit1.Text);h:=0;

Рис.8.3

n:=Memo1.Lines.Count;//определениечислаэлементоввмассиве

fori:=1tondo

begin//началотелацикла

x[i]:=StrToFloat(Memo1.Lines[i-1]);{считываниеi-гоэлементавпамятьизi1-ойстрокикомпонентаMemo1,т.к.нумерациястроквMemoотнуля}

ifx[i]<0then begin//началодействийвслучаеотрицательногоэлемента

x[i]:=k*x[i];h:=h+1;

end;//конецдействийдляотрицательногоэлемента

Label3.Caption:=Label3.Caption+#13+FloatToStr(x[i]);{выводi-гоэлементанаотдельнойстрокессохранениемвыведенныхранее элементов}

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

Label4.Caption:='отриц.эл-ов'+IntToStr(h);

end;

В случае вывода элементов в компонентMemo2нужно записатьMemo2.Lines[i-1]:=FloatToStr(x[i])+#10;

Отметим, что при работе приложения (рис. 8.3) память была от-ведена при компиляции под сто элементов массива, а реально исполь-зоваласьтолько под девять,что нерационально.

Динамическиемассивы

При написании программы для обработки массива часто заранеенеизвестно реальное будущее количество элементов в нём. Но приобъявленииобычного(статического)массивавразделеописанийнеобходимо указывать число элементов, под это число при компиля-ции будет выделена память для хранения массива. Исходя из логики,можно ориентироваться на какое-то предельное число. Однако еслиреальное число элементов окажется больше, то приложение исполь-зовать уже нельзя. А если меньше, то программа работать будет, нозанятопамятибудетменьше,чемвыделено,чтонеэффективно.

Для рационального использования памяти при работе с масси-вами используют динамические массивы. В отличие от обычных (ста-тических),приобъявлениидинамическогомассиванеуказываютчисло элементов. Кроме того, память под такой массив выделяется нево время компиляции, а по ходу работы программы, когда число эле-ментов становится известно. Для выделения памяти вызывают проце-дуруSetLength(имя_массива,числоэлементов);например,

varx:arrayofreal;//объявляетсядинамическийвеществ.массив

n:byte;

begin//разделоператоров

…………//какие-товычислениядоработыс массивом

n:=…..//вычислениеколичестваэлементовпоходуработыпрограммы

SetLength(x,n);//выделениепамятиподмассивсколькоикогданужно

………….//вводэлементовикакие-тодействиясмассивом

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

…………..//какие-товычисления,программаещёработает

end;

Под эффективным использованием памяти понимают, что памя-ти выделяется ровно столько, сколько нужно, и ровно в те моментыработыпрограммы,когдаэто нужно.

Нижнийиндексдинамическогомассивавсегдаравеннулю,верхнийможно определить функцией High(имя_массива), её зна-чениеравно числу элементоввмассивеминусединица.