
- •1. Алгоритмизация
- •1.1.Функциональная схема эвм.
- •1.2. Этапы решения задач на эвм.
- •1.3. Язык блок-схем для представления алгоритмов
- •1.4. Базовые структуры алгоритмов
- •1.5. Конструирование сложных алгоритмов
- •2. От алгоритма к программе
- •2.1. Концепция данных в Турбо-Паскале
- •2.2. Структура Паскаль - программы
- •2.3. Комментарии
- •2.4 Операторы
- •2.4.1 Оператор присваивания
- •2.4.2. Составной оператор
- •2.4.3. Логические выражения
- •2.4.4. Условный оператор
- •2.4.5. Оператор цикла с параметром
- •2.4.6. Оператор цикла с постусловием
- •2.4.7. Оператор цикла с предусловием
- •2.5. Производные типы
- •2.5.1 Перечислимые типы
- •2.5.3. Регулярные типы (массивы)
- •2.5.4. Многомерные массивы
- •2.5.5.Комбинированные типы (записи)
- •2.6. Подпрограммы
- •2.6.1. Функции
- •2.6.2. Процедуры
- •2.6.3. Формальные и фактические параметры
- •2.6.4. Параметры - значения
- •2.6.5. Параметры - переменные
- •2.6.6. Параметр - массив
- •2.6.7. Параметры подпрограмм без указания типа
- •2.6.8. Параметры - процедуры и параметры - функции
- •2.6.9 Локальные и глобальные переменные
- •3. Задания
- •3.1. Построение таблицы значений функции.
- •3.2 Вычисление сумм и произведений.
- •3.3. Вычисление функции разложением в ряд
- •3.4 Обработка одномерных массивов.
- •3.5 Проверка попадания точки в заданную область
- •3.6. Нахождение экстремумов последовательностей
- •3.7.Обработка простых двумерных массивов.
- •3.8 Обработка двумерных массивов
- •3.9. Разработка алгоритмов и программ нисходящим способом
- •3.10.Задачи на обработку символьных данных сложной структуры
- •Создать исходный типизированный файл.
- •Результаты записать в текстовый файл.
- •3.11 Задачи с использованием имени массива как параметра функции
- •3.12. Задача на использование формальных массивов в процедурах
- •3.13. Задачи на разработку программы с использованием созданной по условию процедуры
- •3.14.Задачи на использование функций в качестве параметров других функций.
- •3.15. Разработка многомодульных программ.
2.6.7. Параметры подпрограмм без указания типа
В Турбо-Паскале можно использовать формальные параметры, не указывая их типов. В этом случае фактические параметры могут быть любого типа.
Так как такой параметр внутри подпрограммы типа не имеет, перед его использованием надо привести к конкретному типу. Для этого необходимо написать идентификатор требуемого типа и за ним в круглых скобках - переменную ( параметр, не имеющий типа ).
Используя подпрограмму с параметром без типа, можно сделать ее универсальной, т.е. пригодной для обработки любого массива. Рассмотрим пример такой подпрограммы, суммирующей элементы одномерного массива произвольной длины.
Program SumMas;
Var a: array[1..10] of real;
s1: real;
k : integer;
{ функция с параметром без типа }
Function Sum( var mas; n: integer ): real;
Type tarray = array[1..maxint] of real;
Var i: integer;
s: real;
Begin
s := 0;
For i := 1 to n Do
s := s + tarray( mas )[ i ];
Sum := s
End;
{ раздел операторов программы }
Begin
Writeln( ‘введите массив’ );
For k := 1 to 10 Do
Readln( a[k]);
{ вызов функции для суммирования массива }
s1 := Sum( a, 10);
Writeln( s1 )
End.
В этом примере имя tarray определяет тип одномерного массива с количеством элементов равным максимальному целому числу. В подпрограмме это имя используется для приписывания типа параметру mas. Реально при обращении к функции Sum вместо параметра mas подставляется массив a из 10 элементов.
2.6.8. Параметры - процедуры и параметры - функции
Используя такие параметры, можно передавать подпрограмме при вызове различные процедуры или функции, которые будут использоваться подпрограммой для вычислений.
Параметр процедурного типа - это параметр-значение.
Таким параметрам в заголовке подпрограммы должен приписываться процедурный тип.
Задание процедурного типа - это просто заголовок процедуры (функции), из которого изъято имя процедуры (функции).
Например: Type func = function (x: real): real;
proc = procedure (x: real; Var y: real);
В этом примере тип func описывает функцию одной вещественной переменной, имеющую вещественный результат; тип proc определяет процедуру с двумя вещественными параметрами, первый параметр - значение, второй - переменная.
При обращении к подпрограммам, имеющим параметры процедурного типа, на место таких параметров подставляются имена подпрограмм, соответствующих описанным типам. Эти подпрограммы не должны быть стандартными и должны компилироваться с использованием дальней модели памяти. Т.е. перед текстом подпрограмм должна стоять директива компилятору {$F+}, а в конце директива - {$F-}.
Рассмотрим пример программы, в состав которой входит процедура приближенного решения нелинейного уравнения методом половинного деления. Решить приближенно уравнение - значит найти на оси х отрезок
заданной длины, на котором находится корень. Метод состоит в том, что исходный отрезок (известно, что на нем есть корень) делится пополам и выбирается для дальнейшего рассмотрения половина, содержащая корень. Процесс деления продолжается до тех пор пока длина отрезка не станет меньше требуемой точности.
program uravn;
type ur = function(x:real):real;
var a,b,x_cor:real;
rez:boolean;
{процедура решения уравнения}
procedure cor(g:ur;lgr,rgr,eps:real;var x:real; var pr:boolean);
{ входные параметры: g - имя функции, задающей вид уравнения;
lgr, rgr - границы отрезка;
eps - точность;
выходные параметры: х - середина отрезка, содержащего корень;
pr - признак, принимающий значение true,
если корень найден и - значение false,
если корня на отрезке нет}
begin
{проверка, есть ли корень на заданном отрезке}
if g(lgr) * g(rgr) > 0 then pr:=false
else
begin
pr:=true;
repeat
x:=(lgr + rgr)/2;
{выбор половины отрезка, при помощи изменения
значения левой или правой границы}
if g(lgr) * g(x) > 0 then lgr:=x
else rgr:=x;
until abs(lgr - rgr) <= eps;
x:=(lgr + rgr)/2;
end
end;{конец процедуры}
{$F+}
{функция, задающая уравнение}
function f(x:real):real;
begin
f:=sin(x) - 0.5
end;{конец функции}
{$F-}
begin
a:=0;
b:=pi/2;
{вызов процедуры решения уравнения}
cor(f,a,b,0.01,x_cor,rez);
{анализ, возвращенных функцией результатов }
if rez then writeln('x_cor = ',x_cor)
else writeln('на отрезке [',a,',',b,'] нет корня')
end.