Функции

advertisement
Функции
Функции
Функция – это вспомогательный алгоритм (подпрограмма),
результатом работы которого является некоторое значение.
В Паскале помимо процедур можно использовать функции. Их еще
называют функции пользователя ( в отличие от стандартных
функций, таких как 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
символов, ОЦЕНКИ – через пробел три цифры.
Требуется написать программу, которая
будет на экран фамилии и имена трёх лучших
по среднему баллу учеников. Если среди
остальных есть ученики, набравшие тот же
средний балл, что и один из трёх лучших, то
следует вывести их фамилии и имена.
Download