Дисциплина «Программирование» Специальность 08080165 «Прикладная информатика (в экономике)» Институт информатики, инноваций и бизнес-систем Кафедра информатики, инженерной и компьютерной графики Люлько Виктор Иванович, старший преподаватель Тема 7. Подпрограммы. Процедуры и функции. Символы и строки. Алгоритмы с использованием случайных величин. Рекурсивные алгоритмы. Требования к знаниям, умениям и навыкам После изучения темы студент должен уметь использовать в программах процедуры и функции, символьные и строковые величины, стандартные процедуры и функции для работы со строками уметь реализовывать алгоритмы с использованием случайных величин и рекурсивные алгоритмы 2 Содержание 1. Ключевые понятия 2. Учебный материал 3 Ключевые понятия Подпрограммы Процедуры Функции Символьные переменные Строковые переменные Случайные величины Рекурсивные алгоритмы 4 Учебный материал Основные задачи лекции Знакомство с понятиями подпрограммы, процедуры, функции Изучение особенностей описания (объявления) и использования процедур и функций Знакомство с особенностями описания (объявления) и использования символьных и строковых переменных Знакомство с использованием стандартных процедур и функций для работы со строками Знакомство с особенностями реализации алгоритмов с использованием случайных величин Знакомство с возможностями использования рекурсивных алгоритмов 5 Учебный материал Понятие подпрограммы (начало) Подпрограмма – это группа операторов, логически законченная и специальным образом оформленная. Подпрограмма описывается (объявляется) один раз, а обращаться к ней (вызывать ее) можно по ее имени неограниченное число раз из различных частей программы там, где требуется получить результаты работы подпрограммы. Внутри подпрограммы можно описывать другие подпрограммы, к которым можно обращаться только из той подпрограммы, внутри которой они описаны. 6 Учебный материал Понятие подпрограммы (окончание) При вызове подпрограммы указываются ее имя и список аргументов (фактических параметров), передаваемых подпрограмме для выполнения операторов, входящих в состав этой подпрограммы. Одна и та же подпрограмма может обрабатывать различные данные, переданные ей в качестве аргументов. Подпрограммы делятся на процедуры и функции, основное различие между которыми состоит в том, что результатом выполнения функции является некоторое значение, присвоенное ее имени, и это имя можно использовать как операнд выражения. 7 Учебный материал Процедуры, их описание (объявление) и использование (начало) Описание (объявление) процедуры располагается в программе там же, где располагаются описания (объявления) переменных, констант, меток. Описание (объявление) процедуры состоит из заголовка и блока (тела процедуры). Заголовок имеет формат procedure Имя(Формальные параметры); и состоит из ключевого слова procedure, имени процедуры и необязательного списка формальных параметров в круглых скобках с указанием типа каждого параметра. 8 Учебный материал Процедуры, их описание (объявление) и использование (продолжение) Пример заголовка процедуры: procedure x2y2(var s:real; x,y:real); В списке формальных параметров после указателя типа ставится точка с запятой, если же тип указан сразу для нескольких параметров, то их идентификаторы отделяются друг от друга запятой. 9 Учебный материал Процедуры, их описание (объявление) и использование (продолжение) Блок процедуры начинается с begin и заканчивается end. Внутри блока располагаются операторы с формальными параметрами, например: procedure x2y2(var s:real; x,y:real); //Описание процедуры begin s:=x*x+y*y; end; 10 Учебный материал Процедуры, их описание (объявление) и использование (продолжение) Для обращения к процедуре используется оператор вызова процедуры, состоящий из имени процедуры и списка разделенных запятыми аргументов в круглых скобках, при этом каждому формальному параметру, указанному в заголовке процедуры, должен соответствовать аргумент того же типа, например, x2y2(z,t,u); //Вызов процедуры При обращении к процедуре выполняются операторы ее блока с аргументами вместо формальных параметров. 11 Учебный материал Процедуры, их описание (объявление) и использование (продолжение) Если в описании процедуры формальный параметр указан с описателем var, то при обращении к процедуре в качестве фактического параметра передается адрес аргумента в памяти компьютера. Значение по такому адресу может быть изменено при выполнении процедуры и по такому адресу может быть помещен, например, результат выполнения процедуры. В качестве такого аргумента может быть переменная и не может быть выражение или константа. 12 Учебный материал Процедуры, их описание (объявление) и использование (окончание) Если в описании процедуры формальный параметр указан без описателя var, то при обращении к процедуре в качестве фактического параметра передается значение аргумента в памяти компьютера. Это значение не может быть изменено при выполнении процедуры. В качестве такого аргумента может быть переменная, выражение или константа. 13 Учебный материал Функции, их описание (объявление) и использование (начало) Описание (объявление) функции располагается в программе там же, где располагаются описания (объявления) переменных, констант, меток, описания (объявления) процедур. Описание (объявление) функции состоит из заголовка и блока (тела функции). 14 Учебный материал Функции, их описание (объявление) и использование (продолжение) Заголовок описания (объявления) функции имеет формат function Имя(Формальные параметры):Тип результата; и состоит из ключевого слова function, имени функции, необязательного списка формальных параметров в круглых скобках с указанием типа каждого параметра, а также типа значения функции, например, function x2y2(var x,y:real):real; 15 Учебный материал Функции, их описание (объявление) и использование (продолжение) Блок функции начинается с begin и заканчивается end. Внутри блока располагаются операторы с формальными параметрами, например: function x2y2(var x,y:real):real; //Описание функции begin result:=x*x; x2y2:=result+y*y; end; 16 Учебный материал Функции, их описание (объявление) и использование (продолжение) В блоке функции должен быть хотя бы один оператор присваивания с именем функции в левой части этого оператора. Последний выполненный из таких операторов и определяет значение функции. В этих операторах допускается использование вместо имени функции переменной result, причем в отличие от имени функции переменную result можно использовать в выражениях блока функции в правой части оператора присваивания. Использование этой переменной дает возможность получить в любой момент доступ к текущему значению функции. 17 Учебный материал Функции, их описание (объявление) и использование (продолжение) Для обращения к функции используется ее имя со списком разделенных запятыми аргументов в круглых скобках, при этом каждому формальному параметру, указанному в заголовке функции, должен соответствовать аргумент того же типа. В отличие от имени процедуры имя функции может входить в выражения в качестве операнда, значение которого равно значению функции в зависимости от значений аргументов, например, z:=x2y2(t,u); //Вызов функции 18 Учебный материал Функции, их описание (объявление) и использование (окончание) При обращении к функции передача адреса или значения аргумента происходит так же, как и при обращении к процедуре. При обращении к функции выполняются операторы ее блока с аргументами вместо формальных параметров. 19 Учебный материал Описание (объявление) символьных и строковых переменных (начало) Символьный тип данных (сhar) используется для представления любого символа из набора допустимых символов. Для каждого символа отводится один байт памяти. Пример описания (объявления) величин символьного типа: var a,s: char; К символам можно применять операции сравнения (<, <=, =, >, >=, <>), при этом сравниваются коды символов. 20 Учебный материал Описание (объявление) символьных и строковых переменных (окончание) Строки представляют собой последовательности символов. Строки при описании (объявлении) обозначаются ключевым словом string с возможным указанием максимальной длины строки, например: var s: string; t: string[30]; Длины строк в описаниях (объявлениях) можно задавать именованными константами. 21 Учебный материал Использование символов и строк (начало) Некоторые функции для символьных величин: Функция Описание Тип аргумента результата char integer integer char Pred(s) например, pred('b') => 'a' char char символ, Succ(s) Последующий например, succ('b') => 'c' char char Ord(s) Код (порядковый номер) символа, например, ord('b') => 98 Chr(n) Преобразование в символ, например, chr(98) => 'b' Предыдущий символ, 22 Учебный материал Использование символов и строк (продолжение) Строки можно присваивать друг другу (операция присвоения := ). Если максимальная длина результирующей строки меньше длины исходной строки, то лишние символы справа отбрасываются, например: var s1: string[3]; s2: string[6]; ... s2:='Summer'; s1:=s2; //s1:='Sum' 23 Учебный материал Использование символов и строк (продолжение) Строки можно объединять (сцеплять, склеивать) между собой с помощью операции конкатенации, обозначаемой знаком +, например: s1:='Sum'; s2:='mer'; s3:=s1+s2; //s3:='Summer' 24 Учебный материал Использование символов и строк (продолжение) Строки можно сравнивать между собой с помощью операций сравнения, при этом справедливы, например, следующие соотношения: 'abc'>'ab' 'abc'='abc' 'abc'<'abc ' К отдельному символу строки можно обращаться как к элементу массива символов, например, s1[4]. Один символ из строки совместим с величиной типа char и их можно использовать в выражениях одновременно. 25 Учебный материал Использование символов и строк (окончание) При вводе и выводе может использоваться имя строки, например: readln(s1,s2); writeln(s3); При вводе в строку считывается количество символов, равное длине строки или меньшее, если клавиша Enter будет нажата раньше. При выводе для строки отводится количество позиций, равное ее фактической длине. 26 Учебный материал Использование стандартных процедур и функций для работы со строками (начало) Некоторые функции для работы со строками: Процедура или функция с именем и примером перечня аргументов Описание 1 2 Функция Concat(s1,s2,...,sN) Возвращает строку, являющуюся слиянием строк s1,s2,...,sN. Действие функции аналогично операции конкатенации Функция Copy(s,start,len) Возвращает подстроку длиной len, начинающуюся с позиции start строки s Процедура Delete(s,start,len) Удаляет из строки s, начиная с позиции start, подстроку длиной len Процедура Insert(subs,s,start) Вставляет подстроку subs в строку s, начиная с позиции start 27 Учебный материал Использование стандартных процедур и функций для работы со строками (продолжение) Некоторые функции для работы со строками: 1 2 Функция Length(s) Возвращает фактическую длину строки Функция Pos(subs,s) Ищет вхождение подстроки subs в строку s и возвращает номер первого символа subs в s или нуль, если subs не содержится в s Процедура Str(x,s) Преобразует числовое значение x в строку s, при этом для x может быть задан формат, как в процедурах Write и Writeln, например Str(x:8:2,s) Процедура Val(s,x,errcode) Преобразует строку s, содержащую символьное представление числа, в значение числовой переменной x. При успешном преобразования значение переменной errcode равно нулю, при обнаружении ошибки в символьном представлении числа значение errcode будет содержать номер позиции первого ошибочного символа в строке s, а значение x не определено 28 Учебный материал Использование стандартных процедур и функций для работы со строками (окончание) Некоторые функции для работы со строками: 1 2 Функция IntToStr(n) Преобразует целочисленное значение n в строку Функция StrToInt(s) Преобразует строку s в целое число Функция FloatToStr(x) Преобразует вещественное значение x в строку Функция StrToFloat(s) Преобразует строку s в вещественное число Функция AnsiUpperCase(s) Возвращает строку s, преобразованную к верхнему регистру Функция AnsiLowerCase(s) Возвращает строку s, преобразованную к нижнему регистру 29 Учебный материал Реализация алгоритмов с использованием случайных величин (начало) При реализации алгоритмов с использованием случайных величин могут быть использованы следующие функции и процедуры генерации случайных чисел: RandG(m,sq) – функция, генерирующая случайные числа, распределенные по нормальному закону с математическим ожиданием m и средним квадратическим отклонением sq; 30 Учебный материал Реализация алгоритмов с использованием случайных величин (продолжение) Random(R) – функция, генерирующая равномерно 31 распределенные действительные или целые случайные числа, причем если необязательный целочисленный параметр R не задан, то функция возвращает случайные действительные числа, равномерно распределенные в диапазоне 0<=X<1 или, по другому обозначению, в диапазоне [0,1), а если параметр R задан, то функция возвращает случайные целые числа, равномерно распределенные в диапазоне 0<=X< R или, по другому обозначению, в диапазоне [0,R). Учебный материал Реализация алгоритмов с использованием случайных величин (окончание) Randomize – процедура, задающая случайное начальное значение для функций RandG или Random (иначе говоря, рандомизирует эти функции), причем если перед первым обращением к любой из указанных функций не использовать эту процедуру, то при каждом запуске программы функции RandG и Random будут генерировать одинаковые последовательности случайных чисел, а при использовании же этой процедуры при каждом запуске программы последовательности случайных чисел будут разными. 32 Учебный материал Использование рекурсивных алгоритмов (начало) Рекурсивный алгоритм предполагает использование этого же алгоритма при своей реализации. При реализации рекурсивного алгоритма используется рекурсивная подпрограмма (процедура или функция), в которой содержится обращение к этой же подпрограмме. При обращении подпрограммы к самой себе, как и при обращении к любой другой подпрограмме, используется стек для записи информации, необходимой для работы подпрограммы и для последующего выхода из нее и возврата в вызывающую программу. При повторных вызовах этот процесс повторяется. 33 Учебный материал Использование рекурсивных алгоритмов (продолжение) Для завершения вычислений каждая рекурсивная подпрограмма должна содержать нерекурсивную часть алгоритма, реализующую возврат в вызывающую программу и вызывающую соответствующее освобождение стека. Например, для вычисления суммы первых N чисел натурального ряда может быть использовано рекуррентное соотношение вида SN=SN-1+N при условии, что S1=1. 34 Учебный материал Использование рекурсивных алгоритмов (окончание) Описание соответствующей рекурсивной функции может выглядеть следующим образом: function sumN(N:integer):integer; begin if N=1 then sumN:=1 //Нерекурсивная часть else sumN:=sumN(N-1)+N; //Рекурсивная часть end; 35 Использование материалов презентации Использование данной презентации, может осуществляться только при условии соблюдения требований законов РФ об авторском праве и интеллектуальной собственности, а также с учетом требований настоящего Заявления. Презентация является собственностью автора. Разрешается распечатывать копию любой части презентации для личного некоммерческого использования, однако не допускается распечатывать какую-либо часть презентации с любой иной целью или по каким-либо причинам вносить изменения в любую часть презентации. Использование любой части презентации в другом произведении, как в печатной, электронной, так и иной форме, а также использование любой части презентации в другой презентации посредством ссылки или иным образом допускается только после получения письменного согласия автора. 36