
- •Утверждаю Зам.Директора по учебной работе
- •Основы Алгоритмизации и программирования учебно-методическое пособие
- •220301 Автоматизированные системы обработки информации и правления
- •Введение
- •Основные этапы решения задач на эвм
- •Глава 1 способы записи алгоритма
- •1.1 Алгоритм и его свойства
- •Схемы алгоритма
- •1.2 Структуры алгоритмов
- •1.2.1 Алгоритм линейной структуры
- •1.2.2 Алгоритм разветвляющейся структуры
- •1.2.3 Алгоритм циклической структуры
- •1.2.4 Алгоритм со структурой итерационных циклов
- •1.2.5 Алгоритм со структурой вложенных циклов
- •Глава 2 программа на языке высокого уровня
- •2.1 Системы программирования
- •2.2 Характеристика языка программирования Паскаль
- •2.3 Алфавит и структура программы на Паскале Алфавит программы
- •Структура программы
- •Глава 3 Стандартные типы данных
- •3.1 Данные. Типы
- •3.2 Вещественные типы
- •3.3 Целочисленные типы
- •3.4 Символьный тип
- •3.5 Логический тип
- •4 Представление основных структур программирования: итерация, ветвление, повторение
- •4.1 Линейная структура (следование)
- •Var X,y,f: real;
- •4.2 Разветвляющая структура (ветвление)
- •4.3 Циклическая структура (повторение)
- •4.3.1 Оператор цикла с параметром
- •I : Integrer; {номер числа }
- •4.3.2 Оператор цикла с постусловием
- •I,n: integer;
- •4.3.3 Оператор цикла с предусловием
- •4.3.4 Итерационные циклы
- •Var r,a:real;
- •Приближенное вычисление функций
- •Решение уравнений приближенными методами
- •Метод деления отрезка пополам
- •Xsl, Xpr, a, b, e, y1, y2, Lev, Prav, y: Real;
- •Метод Ньютона
- •Метод прохождения отрезка с переменным шагом
- •Вычисление определенных интегралов
- •1. Метод прямоугольников
- •X: Real;
- •2. Метод трапеций
- •X: Real;
- •Глава 5 Типы данных, определяемые пользователем
- •5.1 Пользовательский тип данных
- •5.1.1 Типизированные константы
- •5.1.2 Перечисляемый тип
- •I:1..6; loto: num;
- •5.2 Массивы
- •I : integer;
- •5.2.1. Работа с одномерными массивами
- •I,sum : integer;
- •Var a: array [1..N] of real;
- •Var I,s,r: integer;
- •I : list;
- •I : integer;
- •X : mass;
- •I, j, p, n, m, k:integer;
- •I, j, k, nd : integer;
- •Xmin : real;
- •X : mass;
- •Var I, j, nd : integer;
- •X : mass;
- •5.2.2 Работа с двумерными массивами( матицы)
- •Var I,j,n : integer;
- •I,j,n,m : integer;
- •5.2.3 Сортировка массивов
- •Сортировка методом "пузырька"
- •X : Array [1..Nmax] Of Real;
- •X : Array [1..Nmax] Of Real;
- •Сортировка выбором
- •Обменная сортировка
- •Var m:array[1..1000] of integer;
- •I,z,n:integer; Key:byte;
- •Сортировка слиянием
- •Var { Описание массивов и переменных}
- •X, y: array[1..1000] of integer;
- •5.3 Строковые типы
- •Var s: string[10];
- •5.3.1 Операции над строками
- •5.3.2 Стандартные процедуры и функции для строк
- •Функция Length
- •Функция Upcase
- •Функция Copy
- •Функция Роs
- •I, n, p: integer;
- •I: integer;
- •I: integer;
- •Insert (word2, text, I);
- •Insert (chr (k-32), t, I);
- •Insert (chr (k-80), t, I);
- •Insert (‘е’, t, I);
- •Глава 6 Процедуры и функции
- •6.1 Процедуры
- •I : Integer;
- •I, n: integer;
- •Input _ mas (k, n);
- •I,n : Integer;
- •I,k : Integer;
- •6.2 Функции
- •I:Integer;
- •2) Массивы;
- •I,n : Integer;
- •I : Integer;
- •I,tn,tk:Real;
- •Глава 7 Программирование рекурсивных алгоритмов
- •7.1 Понятие рекурсии
- •7.2 Техника построения рекурсивных алгоритмов
- •7.3 Формы рекурсий
- •If Prim(I) then
- •7.4 Рекурсия и итерация
- •7.5 Программирование с использованием рекурсии
- •Var p: Integer;
- •Var X, y: Integer; begin
- •Var z: Real; begin
- •Var I:integer; j:real;
- •Глава 8 Файлы
- •8.1 Текстовые файлы
- •I,n : Integer; {Вспомогательные переменные}
- •8.2 Типизированные файлы
- •X,m,s : Real;
- •8.3 Нетипизированные файлы
- •Глава 9 Записи
- •9.1 Описание записи
- •I: integer;
- •9.2 Оператор присоединения
- •I, j, k, m : integer;
- •X: real;
- •9.3 Вложенные записи
- •9.4 Записи с вариантами
- •Information: record
- •I, k, n : integer;
- •Vedom : Array [1..Nmax] Of Stud;
- •I,j : Integer;
- •Vedom : File Of Stud;
- •Vedom : File Of Stud;
- •I,j,kdv,k2 : Integer;
- •If Not Eof (Ftel) Then
- •If Not Eof(Ftel) then
- •If Not Eof(FilComp) then
- •Глава 10 Динамические структуры данных
- •10.1 Распределение памяти при выполнении программ
- •Верхняя граница памяти ms-dos
- •10.2 Ссылочные переменные
- •10.3 Процедуры управления кучей
- •10.4 Использование переменных ссылочного типа
- •I: Integer;
- •I, k : Integer;
- •Val(b, k, code);{Превратили второй символ в ч исло}
- •10.5 Списки
- •Var Ch : Char;
- •Var Ch : Char;
- •10.6 Деревья
- •10.7 Константы ссылочного типа
- •Глава 11. Язык Паскаль. Графический модуль Graph Список используемой литературы Основная
- •Дополнительная
10.4 Использование переменных ссылочного типа
Необходимость использования переменных ссылочного типа возникает при различных ситуациях. Рассмотрим наиболее часто встречающиеся ситуации.
СЛУЧАЙ 1. Программа должна работать с большими объемами данных, причем нет необходимости выделять память сразу под все переменные. Память под объект отводится тогда, когда в этом возникает необходимость, и это место освобождается, когда необходимость в использовании соответствующего объекта исчезает.
Пример 10 1. Дано 10000 вещественных чисел а,, а2, ..., а10000 и 8000 целых чисел b1, b2 ,b8000. Вывести числа а1, а2, ..., а10000 в обратном порядке. Вывести то число bk, номер которого к равен минимальному из чисел b1, b2 b8000.
Program Task9;
Type
ra = array [1 .. 10000] of Real;
ia = array [1 .. 8000] of Integer;
pr = ^ra;
pi = ^ia; {Определили ссылочный тип}
Var
к pr; g : pi; {Описали ссылочные переменные}
Begin
New (f); {Выделили память под массив из 10000 элементов}
For i := 1 to 10000 do
Read(f^ [i]);
For i := 10000 downto 1 do
Writeln(f^ [i]);
Dispose (f); {Освободили выделенную память}
New(g); {Выделили память под массив из 8000 элементов}
Read(g^ [1]);
к := g ^ [1];
For i := 2 to 8000 do
Begin
Read(g^ [i]);
If g^ [i] < к Then
к := g^ [i]
End;
Writeln(g^ [k]) {В конце программы оператор Dispose можно опустить}
End.
В этой программе сначала отводится место для массива из 10000 элементов. Переменные f^ [1] f[10000] получают значения с помощью оператора Read(f^ [i]). После решения первой задачи - вывода этих чисел в обратном порядке, место в памяти, выделенное для объекта типа га, освобождается с помощью Dispose(f). После этого отводится место в памяти для массива из 8000 элементов. Переменные g^ [1], ..., g^ [8000] получают значения с помощью оператора Read(g^ [i]), и решается вторая часть задачи. Память для объектов типа га и ia выделяется поочередно, так что эти объекты могут располагаться в пересекающихся областях памяти вычислительной машины.
СЛУЧАЙ 2. Программа во время компиляции использует данные, для которых заранее неизвестен необходимый объем памяти. Некоторые элементы данных, например, строки и массивы, требуют задания максимально возможного их размера во время компиляции. Объем памяти, необходимый для хранения этого максимально возможного количества данных, будет зарезервирован даже в том случае, если в этих массивах или строках не хранится никаких данных. Если расположить переменные в динамически распределяемой области памяти во время выполнения программы, то для хранения данных будет выделено столько байтов памяти, сколько потребуется.
Пример 10.2. Рассчитать сумму элементов вектора а1, состоящего из n элементов. Сформировать вектор а2 из элементов вектора а1, расположенных в обратном порядке и уменьшенных на единицу.
Объявим тип Vector для массива, состоявшего из одного элемента. Переменную типа Vector объявлять не будем, объявим типизированный указатель, базовым типом данных для которого будет Victor, В процессе работы программы определим количество элементов вектора с помощью оператора Readln(n) и выделим память необходимого размера. Выделять память будем при помощи процедуры Getmem, освобождать - при помощи процедуры Release.
Program Taski;
{$R-}
Type
Vector = array [1..1] of integer;
Var
a1, a2: ^Vector;
p : pointer;
n, i, s ; integer;
Begin
Write('Введите число элементов вектора; ');
Readln(n);
mark(p); {Запоминаем состояние памяти}
Getmem(a1, n*sizeof(integer)); {Выделяем память под вектор а1}
for i := 1 to n do
Readln(a1^ [i]); {Вводим элементы вектора a1}
S := 0;
For i := 1 to n do
S := S+aT[i]; {Суммируем элементы вектора}
Writeln('S=',S);
Getmem(a2, n*sizeof(integer)); {Выделяем память под вектор а2}
For i := 1 to n do
a2^ [n+1-i] := a1^ [i] - 1; {Формируем вектор а2}
For i := 1 to n do
Writeln(a2^ [i]); {Выводим элементы вектора а2}
Release(p); {Возвращаем память в исходное состояние}
End.
Тип Vector объявлен как массив, индексы которого изменяются в диапазоне от 1 до 1. Чтобы не возникло ошибки при выходе за границу массива, необходимо, чтобы директива компилятора, осуществляющая проверку выхода за граничное значение, была отключена {$R-}.
Пример 10.3 Считать 1000 строк из файла и записать их в динамическую память. Неизвестно,, насколько длинной будет каждая из строк, поэтому потребуется описать строковый тип такого размера, который будет соответствовать максимально возможной строке. Чтобы решить эту проблему, можно считать, каждую строку в буфер, затем выделить столько памяти, сколько требуется для фактических данных в строке.
Program Taski1;
Type
PString = ^String;
Var
Buf : String;
L : array[1.. 1000] of PString;
ff : Text;