- •Д.С.Ситкин
- •Информатика.
- •Программированиев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
Пример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-гоэлементавпамятьизi1-ойстрокикомпонента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(имя_массива), её зна-чениеравно числу элементоввмассивеминусединица.
