- •Работает
- •1.1. История создания эвм.
- •1.3. Размещение данных и программ в памяти пэвм.
- •1.4.Файловая система хранения информации
- •1.5.Операционная система.
- •Лекция 2. Как составляются и выполняются программы в системе delphi
- •2.1. Понятие алгоритма и способы его записи
- •2.2. Общая характеристика языка Паскаль
- •2.3. Как составляется программа в системе Delphi
- •2.4. Наша первая программа реализует линейный алгоритм
- •3.1. Данные и их типы.
- •3.2. Операции над переменными основных скалярных типов
- •Алгоритмов
- •4.1. Понятие разветвляющегося алгоритма
- •4.2. Оператор условия if
- •4.3. Оператор выбора Case
- •4.4. Некоторые возможности, предоставляемые Delphi для организации разветвлений
- •Лекция 5. Составление и програмирование циклических алгоритмов
- •5.1. Понятие цикла
- •5.2. Оператор Repeat...Until
- •5.3. Оператор While...Do
- •5.4. Оператор For...Do
- •5.5. Вложенные циклы
- •5.6. Примеры некоторых часто встречающихся циклических алгоритмов Вычисление заданного члена рекуррентной последовательности
- •Вычисления сумм с использованием рекуррентной последовательности
- •6.1. Ошибки на этапе компиляции
- •6.4. Защищенные блоки
- •6.5. Некоторые стандартные типы исключительных ситуаций
- •6.6. Инициирование собственных исключительных ситуаций
- •6.7. Примеры фрагментов программ
- •Лекция 7. Составление программ с использованием массивов
- •7.1. Понятие массива
- •7.2. Некоторые возможности ввода-вывода в Delphi
- •7.3. Примеры часто встречающихся алгоритмов работы с массивами Сумма n элементов одномерного массива:
- •Произведение диагональных элементов квадратной матрицы:
- •Нахождение максимального элемента одномерного массива:
- •8.1. Статическое и динамическое распределение оперативной памяти
- •8.2. Понятие указателя
- •8.3. Наложение переменных
- •8.4. Динамическое распределение памяти
- •8.5. Организация динамических массивов
- •9.1. Понятие подпрограммы
- •9.2. Описание подпрограмм
- •9.3. Передача данных между подпрограммой и вызывающей ее программой
- •9.4. Оформление подпрограмм в библиотечный модуль
- •9.5. Примеры подпрограмм, оформленных в отдельные библиотечные модули
- •Пример программы, использующей модуль RabMas:
- •Множества
- •10.1. Понятие множества
- •10.2. Операции над множествами
- •10.3. Примеры работы с множествами
- •Interface
- •11.1. Зачем нужны строки
- •11.2. Описание переменных строкового типа «Короткие строки»
- •11.3. Основные операции над переменными строкового типа
- •11.4. Некоторые процедуры и функции обработки строк
- •11.5. Примеры алгоритмов обработки строк
- •Лекция 12. Программирование с использованием записей
- •12.1. Понятие записи
- •12.2. Операции над записями
- •12.3. Использование записей для работы с комплексными числами
- •13.1. Понятие файла
- •13.2. Операции над файлами
- •13.2.1. Типизированные файлы
- •13.2.2. Текстовые файлы
- •13.3. Подпрограммы работы с файлами
- •13.4. Компоненты tOpenDialog и tSaveDialog
- •Лекция 14. Программирование с отображением графической информации
- •14.1. Как рисуются изображения
- •14.2. Построение графиков с помощью компонента tChart
- •Лекция 15. Программирование с использованием рекурсии
- •15.1. Понятие рекурсии
- •15.2. Примеры рекурсивных вычислений
- •16.1. Организация работы с базами данных
- •16.2. Поиск в массиве записей
- •16.3. Сортировка массивов
- •16.3.1. Метод пузырька
- •16.3.2. Метод прямого выбора
- •16.3.3. Метод Шелла
- •16.3.4. Метод Хоара (Hoare)
- •17.1. Работа со списками
- •17.2. Добавление нового элемента в список на заданную позицию
- •17.3. Удаления элемента с заданным номером
- •17.4. Пример программы
- •Лекция 18. Связанные списки на основе рекурсивных данных
- •18.1. Что такое стек и очередь
- •18.2. Понятие рекурсивных данных и однонаправленные списки
- •18.3. Процедуры для работы со стеками
- •18.4. Процедуры для работы с односвязными очередями
- •18.5. Работа с двухсвязными очередями
- •18.6. Процедуры для работы с двусвязными очередями
- •19.1. Основные понятия и определения
- •19.2. Прямые методы решения слау
- •19.3. Итерационные методы решения слау
- •20.1. Зачем нужна аппроксимация функций?
- •20.3. Какие бывают многочлены и способы интерполяции?
- •20.4. Что такое среднеквадратичная аппроксимация?
- •20.5. Метод наименьших квадратов (мнк)
- •21.1. Формулы численного дифференцирования
- •21.2. Формулы численного интегрирования
- •22.1. Как решаются нелинейные уравнения
- •22.2. Итерационные методы уточнения корней
- •22.2.2. Метод Ньютона
- •23.1. Постановка задач оптимизации, их классификация
- •23.2. Методы нахождения минимума функции одной переменной
- •24.1. Задачи для обыкновенных дифференциальных уравнений
- •24.2. Основные положения метода сеток для решения задачи Коши
- •24.3. Многошаговые схемы Адамса
- •Литература
8.2. Понятие указателя
Для организации динамического распределения памяти используются переменные специального типа - указатели, которые обеспечивают работу непосредственно с адресами ячеек памяти. Под каждую переменную типа указатель отводится ячейка объемом 4 байта, в которой можно поместить адрес любой переменной.
Вводятся указатели следующим образом:
Type
Рк=Атип;
Pi=Aarray[1..20] of integer; Pb=Abyte;
Ps=AString [20];
Var
p,q:pointer; a,b:Pk;
i:Pi k:Pb;
S1,S2:Ps;
Здесь р, q - нетипизированные указатели; а, b, i, k, S1, S2 - типизированные указатели, т.е. они указывают, что, например, в ячейках начиная с адреса а размещается переменная указанного типа Pk.
Значениями указателей являются адреса переменных, размещенных в памяти. Значение одного указателя можно передать другому с помощью оператора присваивания, например:
p:=q;
a:=b;
При этом надо помнить, что в операторе присваивания типизированные указатели должны быть одного типа.
Используя нетипизированные указатели, можно передать адрес между указателями разного типа, например, так:
p:=i; k:=p;
С типизированными указателями можно работать как с обычными переменными следующим образом:
S1A:=,Иванов,; // по адресу S1 разместить строку iA[11]:=88;
kA:=25;
m:=iA[9]+kA; // m - целого типа
Указатели одного типа можно сравнить на предмет равенства = и неравенства < >, например: if a=b then ... или if a<>b then...
Следует заметить, что такие действия возможны лишь после того, как самим указателям S1, i, k, a, b будут присвоены конкретные значения (адреса).
Адрес указателю можно присвоить следующим образом: Если m, n - обычные статические переменные, то ее адрес можно получить с помощью специальной функции p:=Addr(m); a:=Addr(n);
Очистка адреса из указателя осуществляется с помощью специальной функции nil: p:=nil; a:=nil, при этом довольно часто используется проверка условия if p<>nil then ...
8.3. Наложение переменных
Использование указателей позволяет «накладывать» переменные разных типов друг на друга, интерпретируя по-разному данные, расположенные по некоторому адресу. Например:
Var Ch:Char; k:Abyte;
k:=Addr(ch);
Ch:='A';
Write(Ch,kA);
Будет выведен сам символ 'А' и его номер в кодовой таблице 65. Следующий пример иллюстрирует наложение одномерного массива на двухмерный:
Var a:Aarray[1..4] of integer;
b:array[1..2,1..2] of integer;
a:=Addr(b);
for i=1 to 4 do aA[i]:=i;
Write('b[1,2]=',b[1,2]); // будет выведен): b[1,2]=2 Такое наложение может быть полезно использовано, например, при вводе матрицы иногда удобнее использовать один индекс, а при вычислениях работать с двумя индексами.
8.4. Динамическое распределение памяти
Вся свободная от программ память компьютера представляет собой массив байтов, который называется кучей. Когда возникает необходимость использования программой дополнительной памяти, это осуществляется одной из процедур New или GetMem.
Процедура
New(a:<типизированный указатель>);
находит в куче свободный участок памяти, размер которого позволяет разместить тип данных а и присваивает указателю а значение адреса первого байта этого участка. После этого данный участок памяти закрепляется за программой и с ним можно работать через возникшую в программе переменную aA. Такие переменные называются динамическими. После того, как необходимость работы с этой переменной отпала, данный участок памяти освобождается с помощью процедуры Dispose(a);
При работе как с типизированными, так и с нетипизированными указателями аналогичные действия выполняют процедуры GetMem(P:pointer; size:Word); FreeMem(P:pointer; size:Word); здесь size - количество байтов выделяемой памяти, начиная с адреса, помещаемого в указатель Р. Следует помнить, что память под указатель выделяется 8-байтными порциями. В результате возможна нежелательная фрагментация.