- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
Формальные параметры-массивы без указания границ
В части II приводились примеры подпрограмм с параметрами-массивами. Тип массивов объявлялся до описания подпрограмм в разделе типов, причем размеры выбирались по максимальной длине фактических массивов, используемых в данной задаче. Такой подход, несомненно, имеет два недостатка: во-первых, теряется универсальность подпрограммы, а, во-вторых, память по фактические массивы объявляется с избытком.
В рассматриваемых версиях Паскаля допускается в списке формальных параметров использовать конструкцию Array of тип без указания границ массивов. Такие массивы называютсяоткрытыми. Соответствующим фактическим параметром может быть как динамический, так и статический массив произвольного размера.
Открытые массивы могут быть только одномерными, но их компоненты могут иметь сложный тип. Нумеруются элементы открытых массивов начиная с нуля. При работе с открытыми массивами, наряду с функциями High, Low, Length,может быть полезна функцияSlice(массив, количество_элементов), возвращающая начальную часть массива.
Пример 1.Приведенная программа вычисляет максимальные значения элементов двух одномерных массивов. Подпрограммы ввода и обработки используют открытые массивы.
program Project1;
Var A:Array[1..5] of real; B:Array[1..8] of real;
Procedure masin( c:char; Var A:array of real);
Var i:integer;
begin
writeln('input vector',c,' size of ',Length(A));
for i:=Low(A) to High(a)do
read(A[i]); readln;
end{masin};
Function max( Var A:array of real):real;
Var i:integer;mx:real;
begin
mx:=a[Low(A)];
for i:=Low(A)+1 to High(A) do
if mx<A[i]then
mx:=A[i];
max:=mx
end{max};
begin
masin('A',A); masin('B',B);
writeln('maxa=',max(A),' maxb=',max(b)); readln
end.
Пример 2.В отличие от примера 1, приведенная программа позволяет обрабатывать не все элементы массивов (в соответствии с описанием), а только совокупность первых элементов массивов, число которых задается вводом. Эта возможность обеспечивается применением функции Slice.
program Project2;
Var A:Array[1..10] of real; B:Array[1..10] of real; nA,nB:integer;
Procedure masin( c:char; Var A:array of real);
Var i:integer;
begin
writeln('input vector',c,' size of ',Length(A));
for i:=Low(A) to High(a)do
read(A[i]);
readln;
end{masin};
Function max( Var A:array of real):real;
Var i:integer;mx:real;
begin
mx:=a[0];
for i:=Low(A)+1 to High(A) do
if mx<A[i]then
mx:=A[i];
max:=mx
end{max};
begin
writeln('Input number of components of array A');
readln(nA);
masin('A',Slice(A,nA));
writeln('Input number of components of array B');
readln(nB);
masin('B',Slice(B,nB));
writeln('maxa=',max(Slice(A,nA)),' maxb=',max(Slice(B,nB)));
readln
end.
Пример 3.Этот пример показывает, как использовать подпрограммы с формальными параметрами, являющимися открытыми массивами, для обработки динамических матриц. Программа вычисляет и выводит сумму элементов каждой из двух матриц. Размеры матриц задаются вводом. На значения размеров не накладывается никаких ограничений.
program Project3;
Type str=array of real;{тип строки матрицы – динамический массив}
Var nA,mA,nB,mb:integer; A,B:array of str;
Function Sum(n,m:integer; Var a:array of str):real;
Var s:real; i,j:integer;
Begin
s:=0;
for i:=0 to n-1 do
for j:=0 to m-1 do
s:=s+a[i][j];
sum:=s
End {Sum};
Procedure InMatr(n,m:integer; c:char;Var A:array of str);
Var i,j:integer;
Begin
writeln('input matrix ', c, ' size of ', n, '*', m);
for i:=0 to n-1 do
begin
SetLength(a[i],m);
for j:=0 to m-1 do
read(a[i][j]);
end; readln;
End;
begin
writeln ('Input sizes of matrix A'); readln (nA,mA);
SetLength(A,nA);
InMatr(nA,mA,'A',A);
writeln ('Input sizes of matrix B'); readln (nB,mB);
SetLength(B,nB);
InMatr(nB,mB,'B',B);
writeln('sumA=',Sum(nA,mA,A):6:1,' sumB=',Sum(nB,mB,B):6:1); readln;
end.