Turbo Pascal Лекция 6 – Подпрограммы, Процедуры, Строки


подпрограммы

 Подпрограммы предназначены для реализации алгоритмов обработки отдельных частей некоторой сложной задачи.Они позволяют реализовывать концепцию структурного программирования, суть которого заключается в разложении сложной задачи на последовательность простых подзадач и в составлении для алгоритмов решения каждой подзадачи соответствующих подпрограмм.Различают два вида подпрограммподпрограммы-процедуры и подпрограммы-функции.Подпрограммы делятся на: стандартные и подпрограммы пользователя.

Стандартные подпрограммы создавать не нужно — они содержатся в стандартных модулях System, Crt, Dos, Graph и тому подобное.

Подпрограмма пользователя — это поименованная группа команд, которую создают и описывают в основной программе в разделах procedure или function и к которой обращаются с любого места программы нужное количество раз.

  1. Процедуры (procedure). Общее описание процедуры:
procedure <имя> (<список формальных параметров>);

<Разделы описаний и объявлений процедуры>;

begin

<Раздел команд процедуры>

end;

В списке формальных параметров перечисляют переменные вместе с указанием их типов.Различают параметры-аргументы (другой термин: параметры-значения) — входные данные для процедуры, и параметры-результаты (другой термин: параметры-переменные), через которые можно возвращать результаты работы процедуры в основную программу.Перед спискам параметров-результатов каждого типа записывают слово var.

Заметим, что массивы фиксированных размеров в списках формальных параметров нельзя описывать с помощью слова array (см. Образцы программ).

Разделы описаний и объявлений в подпрограммах имеют такую ​​же структуру как и в основной программе.

Пример 1. Рассмотрим процедуру под названием Cina, которая определяет с — стоимость k минут телефонного разговора с поминутной оплатой 0.6 грн.+ 20% НДС.

procedure Cina (k: integer; var c: real)

begin

c = k * 0.6; c = c + 0.2 * c;

end;

В приведенном примере k является формальным параметром аргументом, с — формальным параметром результатом.

К процедуре обращаются с раздела команд основной программы или другой подпрограммы.

Обращение к процедуре:

<Название процедуры> (<список фактических параметров>);

Параметры, которые записывают в команде вызова процедуры, называются фактическими.Фактическими параметрами-аргументами могут быть стали, переменные, выражения, а параметрам-результатами — только переменные. Типы данных здесь не указывают.

Между фактическими и формальными параметрами должно быть соответствие по количеству и типам. Обратите внимание, соответствующие фактические и формальные параметры могут иметь разные имена.

Команда вызова функционирует так: значение фактических параметров присваиваются соответствующим формальным параметрам процедуры, выполняется процедура, определяются параметры-результаты, значение которых предоставляются (возвращаются) соответствующим фактическим параметрам в команде вызова.

Переменные, описанные в разделе описаний основной программы, называются глобальными.Они действуют во всех подпрограммах, из которых состоит программа. Переменные, описанные в разделе описаний конкретной процедуры, называются локальными.Они действуют только в пределах данной процедуры.

Процедуры могут получать и возвращать значение не только через параметры-результаты, но и через глобальные переменные. Поэтому списков параметров в процедуре может и не быть.

 

  1. Функции (function). Функция, в отличие от процедуры, может возвращать в место вызова только один результат простого стандартного типа.

Общее описание функции:              

function <название> (<список формальных параметров>) <тип функции>;

<Разделы описаний и объявлений функции>;

begin

<Раздел команд функции, где должна быть такая команда: название = выражение>

end;

В разделе команд функции должна быть команда присвоения значения некоторого выражения имени функции. Результат функции возвращается в основную программу через ее название (как и в случае использования стандартных функций, таких как sin, cos).

Обращение к функции:

<Название> (<список фактических параметров>).

Пример 1. Создадим функцию для вычисления tg (x) и вычислим значение выражения tg (x) + ctg (x) + tg2 (x).

program Myfunc;

uses Crt;

var x, y: real;

function tg (x: real): real;

begin

tg = sin (x) / cos (x)

end;

begin clrscr;

writeln ( ‘Введите х’);

readln (x);

y = tg (x) + 1 / tg (x) + sqr (tg (x));

writeln ( ‘y =’, y: 5: 2) readln

end.

  1. Рекурсивные функции. рекурсией называется алгоритмическая конструкция, где подпрограмма вызывает сама себя.Рекурсия позволяет записывать циклический алгоритм, не используя команду цикла. Рассмотрим сначала понятие стека.

Стек — это структура данных в оперативной памяти, где данные запоминаются и хранятся по принципу «первый пришел — последним ушел».Аналогом в военном деле является рожок для патронов к автомату.

Пример 1. Рекурсивная функция вычисления суммы целых чисел от a до b имеет вид:

function Suma (a, b: integer): integer;

begin

if a = b then Suma = a {Это стоп-условие рекурсии}

else Suma = b + Suma (a, b-1) {Это неявный цикл}

end;                            

 

Пример2. Составить рекурсивную функцию Factorial для вычисления факториала числа n! = 1 · 2 · 3 · … · n, (0! = 1, 1! = 1), которая основывается на многократном (рекурсивном) применении формулы n! = N · (n — 1) !.

function Factorial (n: integer): integer;

begin

if n = 0 then Factorial = 1 {Это стоп-условие}

else Factorial = n * Factorial (n-1)

end;

 

Замечания. Применяя рекурсию, нужно правильно составлять стоп-условия, обеспечивающие окончания циклических вычислений.

 

массивы

Массив (array) — это конечный набор элементов одного (базового) типа, которые хранятся в последовательно расположенных ячейках оперативной памяти и имеют общее название.

В математике понятию мaсив соответствуют понятия вектора и матрицы.Различают равно (строки, ленты, векторы) — и многомерные массивы.Двумерный массив данных — это таблица, состоящая из нескольких строк.

 

  1. Одномерные массивы (строки, векторы):

Общий вид конструкции описания типа массива таков:

     TYPE

<название типа> = array [<размер>] of <название базового типа>;

можно и так:

     <список переменных>: array [<размер>] of <название базового типа>;

Размер (количество элементов) массива чаще всего задают в виде диапазона или названия некоторого перечисленного типа данных.

Описать массив можно в разделе описания типов type, в разделе констант const, или в разделе объявления переменных var.Названия типов массивов и переменных-массивов придумывает пользователь.

Пример. Рассмотрите: 1) описание типа массивов (название типа mymasyv), 2) объявление Устойчивое массива (массива-константы) vydatky типа mymasyv и 3) объявление переменных-массивов a, a1 типа mymasyv и массивов: b (он имеет 7 элементов целого типа) , c (имеет 100 элементов-символов, то есть данных типа char).

type mymasyv = array [1..10] of real;

day = (mon, tue, wed, the, fri, sat, sun)

const vydatky: mymasyv = (1.2, 1, 1, 2, 18, 2.4, 8.97, 3, 7, 1.3);

var a, a1: mymasyv;

b: array [day] of integer;

c: array [1..100] of char;

Над массивами определена единая команда копирования a = a1 — все значения массива a1 будут присвоены соответствующим элементам массива a. Все остальные операции, например, присвоение конкретных значений, сложение, умножение и т.д., определены только над элементами массива.

Доступ к элементу массива осуществляется через название массива и номер элемента. Этот номер (его часто называют индексом) записывается в квадратных скобках, например, a [1] — про рший элемент массива а, b [tue]-другой элемент массива b.

Чтобы обработать все элементы массива используют команду цикла for (или while или repeat).

Пример.Элементам описанных массивов можно придать значение так: a [1] = 15.1; b [tue] = 3; с [1] = ‘a’; c [2] = ‘b’. Стали элементы имеют следующие значения: vydatky [1] = 1.2; vydatky [2] = 1; …; vydatky [10] = 1.3.

Пример. Создать массив из первых ста целых чисел и вычислить сумму всех его элементов можно так: s: = 0; for i: = 1 to 100 do begin a [i] = i; s = s + a [i] end; writeln (s)

Задачи видшукуання в массиве конкретных данных решают методом сканирования (переборки, просмотра) всех элементов массива с помощью цикла и условной команды, где отмечают условие поиска.

Задача 1. Пусть yk — это число вызовов, поступающих на АТС с k-ю секундy. Предположим, что yk — случайное число со значением от 0 до 6, которое генерируется формуле yk = trunc (abs (7sin (k))). Создать массив y с десятью элементами. Вычислить сумму вызовов за первые 10 секунд работы АТС и максимальное количество вызовов, которые были за некоторую одну секунду. Результаты вычислений.

program ATS;

uses Crt;

type vyklyk = array [1..10] of integer;

var y: vyklyk; max, s, i: integer;

begin

clrscr;

max: = 0; s: = 0; {Предположим, что max = 0}

for i: = 1 to 10 do

begin

y [i]: = trunc (abs (7 * sin (i))) {Вычислим количество вызовов}

write ( ‘Количество вызовов за «, i,’ -ту секунду: ‘); {по i-ту секунду}

writeln (y [i]: 5); {Выведем это количество}

s = s + y [i]; {Вычислим сумму вызовов}

if y [i]> max then max = y [i]; {Вычислим max значение}

      end;

writeln ( ‘Количество вызовов за 10 секунд =’, s: 3);

write ( ‘Максимальное количество вызовов за одну’);

writeln ( ‘секунду =’, max: 3);

readln

end.                            

Замечания. Случайное целое число со значением от 0 до 6 можно сгенерировать также с помощью функции random (7).В начале исполняемого блока следует записать вызов процедуры randomize (она обеспечит другую последовательность случайных чисел при выполнении программы вторично).

Задача 2. Создать массив y, элементы которого вычисляются по формуле y k = ln (k) 3, где .Построить массив g, состоящий из отрицательных элементов массива y.Результаты вычислений. Если искомых величин нет, вывести об этом сообщение.

В следующей программе переменная n определяет количество отрицательных элементов в новом массиве.

program DvaMasyvy;

uses Crt;

var y, g: array [1..10] of real;

k, n: integer;

begin clrscr;

n = 0; {Сначала количество элементов в g = 0}

for k: = 1 to 10 do

begin

y [k] = ln (k) -3;

if y [k] <0 then                                    {Проверим элемент отрицательный}

         begin

n = n + 1; {Увеличим количество элементов вектора g}

g [n] = y [k]; {Найдем n-ый элемент}

end;

writeln ( ‘y (‘, k, ‘) =’, y [k]: 7: 2)

end;

if n = 0 then writeln ( ‘Массив в видь’емних элементов не имеет’)

else

for k: = 1 to n do

writeln ( ‘g [‘, k, ‘] =’, g [k]: 7: 2) {Выведем массив g}

readln

end.                            

 

  1. Двумерные массивы (матрицы). Элементы двумерного массива (данные могут быть представлены в виде таблицы-матрицы) определяются именем массива и двумя индексами: первый индекс означает номер строки, а второй — номер столбца, на пересечении которых стоит элемент, например р [1,2], p [i , j].

Общий вид конструкции описания типа матрицы таков:

     TYPE

<название типа> = array [<размер>, <размер>] of <название базового типа>;

можно и так:

     <список переменных>: array [<размер>, <размер>] of <название базового типа>;

Рассмотрим примеры объявления массива-константы bal, имеющий 2 строки и 4 столбца элементов, некоторого массива doba, содержащий 24 · 60 элементов целого типа, двумерного массива г. размера 9 на 9 (здесь будет 9 · 9 = 81 элемент).

const bal: array [1..2, 1..4] of integer = ((4,3,5,3), (4,4,5,3))

var doba: array [0..23] of array [0..59] of integer;

const n = 9;

var p: array [1..n, 1..n] of integer;

 

Здесь bal [1,1] = 4, bal [1,2] = 3, …, bal [2,3] = 5, bal [2,4] = 3. Значение элементам массивов doba i p можно предоставить командой присвоения двумя способами, например, так: doba [16] [30] = 5, doba [16,30] = 5.

 

Задача 3. Составить программу для занесения в двумерный массив г. таблицы умножения двух чисел и вывода массива на экран.

program Pifagor;

uses Crt;

const n = 9;

var p: array [1..n, 1..n] of integer; i, j: integer;

begin clrscr;

for i: = 1 to n do   begin

for j = 1 to n do begin

p [i, j] = i * j;

write (p [i, j]: 6) {Обратите внимание на команды вывода массива}

end;                                  {в виде таблицы}

writeln

end;

readln;     end.

Задача 4. Кондитерская фабрика для изготовления пяти сортов конфет использует пять видов сырья. Пусть нормы затрат aij каждого вида сырья и производство 1т конфет сорта j заданные формулой aij = 2 | Sin (i) | + j,. Вывести на экран таблицу затрат сырья (то есть массив а). Определить для какого сорта конфет (imin) нужно меньше сырья (min) третьего вида.

program Fabryka;

uses Crt;

type vytraty = array [1..5, 1..5] of real;

var i, j, imin: integer; min: real; a: vytraty;

begin clrscr;

writeln ( ‘Вид сырья’);

writeln ( ‘1 2 3 4 5’);

for i: = 1 to 5 do                                               {Образуем таблицу затрат}

      begin

write (i, ‘сорт’);

for j = 1 to 5 do

begin

a [i, j] = 2 * abs (sin (i)) + j;

write (a [i, j]: 7: 2) {Распечатайте элементы и-й строки}

         end;

writeln                                                     {Перейдем на новую строку}

end;

imin: = 1;

min = a [1, 3]; {Предположим, что меньше сырья третьего}

for i: = 2 to 5 do                       {вида нужно для конфет первого сорта}

if a [i, 3] <min then

begin

min = a [i, 3]; imin = i; {Определим искомый сорт конфет}

         end;

writeln ( ‘Меньше сырья третьего вида’);

writeln ( ‘нужно для конфет «, imin,» сорта’);

   readln; end.                            

Замечания. Пусть задана некоторая матрица ai, j,. Тогда выражения i = j, i <j и i> j определяют соответственно элементы главной диагонали, элементы над и под главной диагональю этой матрицы.

 

строки

  1. Строки (string). Данное типа строка — это последовательность произвольных символов (то есть элементов типа char). Стали типа строка записывают с помощью двух штрих-символов, которые охватывают текст. Строка может содержать от 0 до 255 символов. Например, «Украина», «Львовская политехника ‘,’ ‘- пустая строка нулевой длины,’ — строка, содержащая один символ-пропуск.

Переменную типа строка объявляют с помощью слова string так:

   var <переменная>: string [n];

где n-длина строки, n <256. Длину строки можно не указывать.

Пример.

const slovo = ‘University’;

var fraza1: string [45]; fraza2: string;

Над переменными типа строка определенные операции соединения (+) и сравнения (<, <=,>,> =, =, <>). Сравнение двух строк осуществляется слева направо к первым символам, причем ‘A’ < ‘B’, ‘B’ < ‘C’ и тому подобное. «Большим» считается символ, который расположен в алфавите дальше. Числовой код символа дает функция ord, например, ord ( ‘B’) = 66, ord ( ‘A’) = 65. Обратное действие выполняет функция chr: chr (66) дает ‘B’.

Пример. Пусть t1 = ‘New’, t2 = ‘Year «. Тогда соединением этих строк будет s = t1 + t2 (s иметь значение ‘New Year «). Здесь s> t1.

Пример. Вывести на экран строчные буквы латинского алфавита и их коды можно так: for v = ‘a’ to ‘z’ do writeln (v, ord (v): 5).

 

  1. Функции и процедуры для действий со строками. Над данным типа строка определены следующие стандартные функции:              
length (<строка>) — определяет количество символов в строке;

copy (r, m, n) — дает n символов строки r, начиная с символа с номером m;

concat (r1, r2, …, rn) — соединяет строки r1, …, rn в одну строку;

pos (r1, r2) — определяет номер символа, с которого начинается вхождение

рядкаr1 в строку r2.

и процедуры:

insert (r1, <переменная>, n) — вставляет строку r1 в строку, заданный переменной,

начиная с позиции n;

delete (<переменная>, m, n) — изымает n символов из строки, заданного переменной,

начиная с позиции m;

str (<число>, <переменная>) — переводит числовое данное в данное типа строка;

где указанная переменная посылает в процедуру входящее данное типа строка и получает назад другая строка — результат выполнения процедуры.

Пример. Пусть переменная Lviv имеет значение ‘Львовская политехника «. Рассмотрим примеры функций и их значения:

функция                                                    значение

length (Lviv) 21;

copy (Lviv, 15, 11) техника;

concat (Lviv, «- 2000 ‘) Львовская политехника — 2000;

pos ( ‘т’, Lviv) 15.

Следующие процедуры окажут переменной Lviv следующих значений:              

процедура                                                          Значение переменной Lviv                     

insert ( ‘НУ’, Lviv, 1) ‘НУ Львовская политехника »

delete (Lviv, 6, 16) ‘Львов’

str (2000, Lviv) ‘2000’

val ( ‘1256’, Lviv1, Ozn) Lviv1 = 1256, Ozn = 0

 

Есть два способа обработки данных типа string. Первый — можно обрабатывать всю строку как единое целое, применяя к нему функции и процедуры, второй — можно рассматривать строку как массив, составленный из элементов-символов, и обрабатывать его по правилам работы с элементами массива.

Пример. Некоторые значения переменным fraza1 и fraza2 из предыдущего примера можно предоставить, а затем вывести тексты на экран так:

fraza1 = ‘Вы любите каникулы? «;

for i: = 1 to 19 do read (fraza2 [i]) {Вводим текст с клавиатуры}

writeln (fraza1) writeln (fraza2).

 

Задача 1. Кодирования информации. Исключить из фразы а пропуски, запятые и точки, другие символы продублировать. Вывести результат.

program MyCode;

uses Crt;

var a, b, c: string; i: integer;

begin

clrscr;

write ( ‘Введите текст:’);

readln (a); {Вводим любую фразу}

b = »;

for i: = 1 to Length (a) do

begin

c = Copy (a, i, 1); {Обратите внимание на комментарий внизу:}

if (c <> ‘,’) and (c <> ‘.’) and (c <> ») {или так: c = a [i]; }

then b = b + c + c

end;

writeln (b)

readln

end.

 

Задача 2. Составить программу, которая везде в заданном тексте mytext заменит некоторое слово другим словом такой же длины (word1 на word2).

program FindAndChange;

uses Crt;

var mytext, word1, word2: string; i, k: integer;

begin

clrscr;

write ( ‘Введите текст:’); readln (mytext)

write ( ‘Введите искомое слово:’); readln (word1)

write ( ‘Введите другое слово:’); readln (word2)

k = length (word1)

for i: = 1 to length (mytext) — k do

if copy (mytext, i, k) = word1 then

begin

delete (mytext, i, k)

insert (word2, mytext, i)

end;

writeln (mytext)

readln

end.

 

Задача 3. Пусть задано строку «Я люблю информатику». Определить длину строки. Вывести на экран второе слово этой строки.

program Ryadok;

uses Crt;

const r1: string = ‘Я люблю информатику’;

var i, k, m, n1, n2: integer;

begin

clrscr;

m = 0;

k = length (r1) {Определяем длину строки}

writeln ( ‘Длина строки k =’, k);

for i: = 1 to k do {Просматриваем все символы строки}

if r1 [i] = » then {Ищем пропуск}

begin

m = m + 1;

if m = 1 then n1 = i; {Определяем номер первого и второго пропусков}

if m = 2 then n2 = i

end;

for i = n1 + 1 to n2-1 do write (r1 [i]); {Выводим слово между двумя пробелами}

readln

end.

[Всего голосов: 3    Средний: 5/5]

Читать  Интегрированная среда программирования Turbo Pascal