Функции Функции Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение. В Паскале помимо процедур можно использовать функции. Их еще называют функции пользователя ( в отличие от стандартных функций, таких как sin, random и др.) Обращение к функции приводит к вычислению ее значения – объекта типа real, integer или char. Примеры: x • вычислениеsin x , cos x, • расчет значений по сложным формулам Зачем? • для выполнения одинаковых расчетов в различных местах программы • для создания общедоступных библиотек функций Функции Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования Функция: формальные параметры function Max (a, b: integer): integer; begin if a > b then Max := a else End; Max := b; это результат функции Функции Особенности: • заголовок начинается словом function function Max (a, b: integer): integer; • формальные параметры описываются так же, как и для процедур function qq( a, b: integer; x: real ): real; • можно использовать параметры-переменные function Max ( var a, b: integer): integer; • в конце заголовка через двоеточие указывается тип результата function Max (a, b: integer): integer ; • функции располагаются ВЫШЕ основной программы Функции Особенности: • можно объявлять и использовать локальные переменные function qq (a, b: integer): float; var x, y: float; begin ... end; • значение, которое является результатом, записывается в переменную, имя которой совпадает с названием функции; объявлять ее НЕ НАДО: function Max (a, b: integer): integer; begin ... Max := a; end; Программа program qq; c var a, b, max: integer; function Max (a, b: integer): integer; begin ... end; begin фактические параметры writeln('Введите два числа'); read(a, b); вызов функции c := Max ( a, b ); max c ); writeln('Наибольшее число ', max end. ! Имена переменных, функций и процедур не должны совпадать! Задача Написать программу для вычисления значения функции f(0.8,a)+f(a,b)-f(2a-1,ab), где a, b действительные числа и x y f ( x, y) 2 2 x 2 xy y 6 2 2 Задача Program F_X_Y; x y f ( x, y) 2 2 x 2 xy y 6 uses CRT; var a,b,z: real; function f (x,y:real):real; begin f:= (sqr(x)+sqr(y))/(sqr(x)+2*x*y+sqr(y)+6); end; begin clrscr; writeln ('Zadayte a,b'); readln(a,b); z:=f(0.8,a)+f(a,b)-f(2*a-1,a*b); writeln(z:8:2); readln; end. 2 2 Логические функции Задача: составить функцию, которая определяет, верно ли, что заданное число – простое. Особенности: • ответ – логическое значение (True или False) • результат функции можно использовать как логическую величину в условиях (if, while) Алгоритм: считаем число делителей в интервале от 2 до N-1, если оно не равно нулю – число составное. count := 0; for i := 2 to N-1 do if N mod i = 0 then count := count + 1; if count = 0 then { число N простое} else { число N составное } Логические функции program qq; var N: integer; результат – логическое значение function Prime (N: integer): boolean; var count, i: integer; N перебор только до begin i := 2; count := 0; while i*i <= N do begin if N mod i = 0 then count := count + 1; i := i + 1; end; Prime := (count = 0); end; условие – это логическое значение begin writeln('Введите целое число'); read(N); вызов функции if Prime(N) then writeln(N, ' – простое число') else writeln(N, ' – составное число'); end. Сравнение процедур и функций. Процедуры Функции 1 Может иметь несколько Имеет только один результат, результатов или выполнять тип которого указывается некоторое действие отдельно при объявлении функции. 2 Результатами могут быть Результат может быть только значения любого типа значением типа real, integer или массивы, строки, числа и т.д. char. 3 Команда вызова процедуры – Обращение к функции может отдельная команда, которая использоваться только как употребляется самостоятельно компонент выражения соответствующего типа. 4 В теле функции должен быть хотя бы один оператор присваивания, в левой части которого указано имя функции. Задания «1»: Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования. «2»: Составить программу, которая в двумерном массиве определяет максимальный элемент в каждом столбце и записывает его в одномерный массив. Для определения максимального элемента в столбце использовать функцию, а для ввода и вывода массивов –процедуру. «3»: Составить функцию, которая определяет наибольший общий делитель двух натуральных и привести пример ее использования. Пример: Введите два числа: 14 21 НОД(14,21)=7 «4»: Написать программу, которая определяет, является ли билет «Счастливым», т.е. сумма правых трех цифр числа должна быть равна сумме левых трех цифр. (использовать функцию, считающую сумму 3 цифр в числе). Записи Запись Паскаля – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа. Описание: type < имя _ типа >= record <имя_поля1>: тип; <имя_поля2>: тип; …………………. <имя_поля K >: тип end ; Записи являются очень удобным инструментом для создания баз данных. Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры . Описание анкеты студента в Паскале будет выглядеть так: Type anketa =record fio: string[45]; pol: char; dat_r: string[8]; adres: string[50]; curs: 1..5; grupp: string[3]; end; Имя типа Имя Имя поля поля Такая запись Паскаля, так же как и соответствующее ей дерево, называется двухуровневой. Задача. Пусть нам необходимо заполнить сведения о студенте (Ф.И.О., дата рождения, адрес, курс и группа), а затем вывести эти сведения на экран. program primer1; type anketa=record fio: string[45]; dat_r: string[8]; adres: string[50]; curs: 1..5; grupp: string[3] end; var student: anketa; ввод каждого поля осуществляется отдельно вывод записи осуществляется по полям begin writeln (‘введите сведения о студенте’); writeln (‘введите фамилию, имя и отчество’); readln (student.fio); writeln (‘введите дату рождения’); readln (student.dat_r); writeln (‘введите адрес’); readln (student.adres); writeln (‘введите курс’); readln (student.curs); writeln (‘введите группу’); readln (student.grupp); writeln (‘ввод закончен’); writeln ; writeln (‘фамилия студента: ’, student . fio ); writeln(‘ дата рождения : ’, student.dat_r); writeln(‘ адрес : ’, student.adres); writeln(‘ курс : ’, student.curs); writeln(‘ группа : ’, student.grupp); end. Пусть нам необходимо иметь сведения о многих студентах. А затем из общего списка вывести фамилии студентов 2-го курса. Следовательно, необходимо организовать массив записей Паскаля. program primer 2 ; begin type for I:=1 to 10 do anketa=record begin {Описание } With student[i] do begin var student: array [1..10] of anketa; writeln (‘введите сведения о’, I , ‘-м студенте’); writeln (‘введите фамилию, имя и отчество’); I: integer; readln (fio); writeln (‘введите дату рождения’); readln (dat_r); writeln (‘введите адрес’); Оператор readln(adres); позволяет не упоминать writeln (‘введите курс’); имя записи, а записывать readln(curs); только имена writeln (‘введите группу’); компонентов записи. readln (grupp); end; writeln (‘ввод закончен’); writeln ; for I:=1 to 10 do if student[I].curs=2 then writeln(‘ фамилия студента : ’, student[I].fio); end. Задача На вход программе подаются сведения о сдаче экзаменов учениками 9-ых классов в некоторой школе. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из N строк имеет следующий формат: ФАМИЛИЯ ИМЯ ОЦЕНКИ (через пробел), где ФАМИЛИЯ строка < 20 символов, ИМЯ – строка < 15 символов, ОЦЕНКИ – через пробел три цифры. Требуется написать программу, которая будет на экран фамилии и имена трёх лучших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трёх лучших, то следует вывести их фамилии и имена.