На занятии будет объяснен алгоритм работы с функциями на Паскале, рассмотрены стандартные функции. Будут разобраны примеры использования функций с параметрами и без параметров.
Содержание:
- Стандартные функции языка Pascal
- Арифметические функции (основные)
- Функции преобразования типов
- Пользовательские функции Pascal
- Самостоятельная работа
Арифметические функции (основные)
Функция | Назначение | Тип результата |
---|---|---|
abs (x) | абсолютное значение аргумента | совпадает с типом аргумента |
sqr (x) | квадрат аргумента | совпадает с типом аргумента |
sqrt (x) | квадратный корень аргумента | вещественный |
cos (x) | косинус аргумента | вещественный |
sin (x) | синус аргумента | вещественный |
arctan (x) | арктангенс аргумента | вещественный |
exp (x) | ex | вещественный |
ln (x) | натуральный логарифм | вещественный |
int (x) | целая часть числа | вещественный |
frac (x) | дробная часть числа | вещественный |
Функции преобразования типов
round (x) | — округляет вещественное число до ближайшего целого. |
trunc (x) | — выдает целую часть вещественного числа, отбрасывая дробную. |
Пользовательские функции Pascal
Функция в Паскале — это подпрограмма, которая в отличие от процедуры всегда возвращает какое-либо значение. Для этого в теле функции её имени присваивается вычисленное значение — результат, который она возвращает.
- Функция – это подпрограмма, результатом работы которой является определенное значение.
- Функции используются для:
- выполнения одинаковых расчетов в различных местах программы;
- для создания общедоступных библиотек функций.
- Синтаксис:
- заголовок начинается служебным словом
function
- описание формальных параметров (тех, значения которых передаются из основной программы в функцию):
- параметры-переменные — параметры, значения которых становятся доступны и в основной программе (возвращаются в программу)
- тип возвращаемого функцией результата описывается в конце заголовка функции через двоеточие:
- Вызывается функция в теле основной программы, только если ее имя фигурирует в каком-либо выражении. В отличие от процедуры, которая вызывается отдельно.
- Внутри функции можно объявлять и использовать локальные переменные:
- значение, которое является результатом, записывается в переменную, имя которой совпадает с названием функции; объявлять ее НЕ НАДО:
Рассмотрим синтаксис:
var …;{объявление глобальных переменных} function название (параметры): тип результата; var…; {объявление локальных переменных} begin … {тело функции} название:=результат; {результат вычислений всегда присваивается функции} end; begin … {тело основной программы} end.
Пример: написать функцию, которая вычисляет наибольшее из заданных двух значений
Решение:
Вызов функции:
PascalABC.NET
:
Правила описания функции:
1. Мы должны написать тип значения, которое возвращает функция.
2. Переменная Result
хранит результат функции.
function f(x: real): real; begin Result := x * x + 1; end;
Вызов функции стоит в выражении:
// основная программа begin var x := 5; var r := Sqrt(x) + f(x); end.
Задача function 0. Написать функцию, которая вычисляет наибольшее из заданных трех значений. Функция с тремя параметрами.
✍ Пример результата:
Введите три числа: 4 1 6 наибольшее = 6
Пример: Написать функцию на Паскале, которая складывает два любых числа
✍ Пример результата:
первое число: 2 второе число: 5 сумма = 7
✍ Решение:
1 2 3 4 5 6 7 8 9 10 11 12 |
var x,y:integer; function f(a,b:integer):integer; begin f:= a+b; end; begin writeln('первое число:'); readln(x); writeln('второе число:'); readln(y); writeln('сумма= ',f(x,y)); end. |
В рассмотренном примере использования функции в Паскале: функция f
имеет два целочисленных параметра — a
и b
. Через двоеточие в заголовке функции (строка 2) указано, что значение, вычисляемое функцией, будет тоже целочисленным. В теле функции вычисляемая сумма присваивается имени функции. А в основной программе вызов функции осуществляется в качестве параметра оператора writeln
.
Таким образом, главное отличие функции от процедуры — это то, что функция производит какие-либо вычисления и выдает в программу результат в виде значения, в то время как процедура чаще всего выполняет какие-либо действия с результатом, например, выводит его на экран (функция этого делать не может).
Задача function 1. При помощи функции найти среднее арифметическое двух чисел (функция с двумя параметрами).
✍ Пример результата:
Введите два числа: 4 7 среднее арифметическое = 5,5
Пример: Составить программу с функцией для вычисления факториала числа.
Показать решение:
Pascal | PascalABC.NET | ||||
|
|
В рассмотренном примере функция имеет один параметр — a
. Вычисляемое функцией значение имеет целочисленный тип, это указывается в заголовке функции (строка 2). В теле функции в цикле for
вычисляется факториал числа. Результат вычисления присваивается имени функции (строка 9). В теле программы для вывода результата функции она вызывается в операторе writeln
(строка 14), который и выводит результат на экран.
PascalABC.NET
:
Короткое определение функции:
function Sq(x: real) := x * x + 1; begin var x := 10; var r := Sq(x) + Sq(2) end.
Короткая запись
Если тело функции состоит только из одного оператора, PascalABC.NET позволяет использовать при описании сокращенный синтаксис, без ключевых слов begin
и end
:
1 2 3 4 5 6 |
## function SumXY(x,y: real) := x + y; // основная программа begin Print (SumXY(9,2)); //11 end; |
Задача function 2. Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования. N — параметр функции.
Пример:
Введите число: 100 сумма = 5050
Задача function 3. Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна (в два раза больше предыдущего результата), на 3-ю – 4 зерна, на 4-ю – 8 зерен…). N
— параметр функции.
Пример:
Введите номер клетки: 28 На 28-ой клетке 134217728 зерен.
Задача function 4. Описать функцию IsDigit(A)
, которая возвращает истину, если целое число A
представляет цифру (то есть A
лежит в диапазоне 0–9). В основной программе вывести значение этой функции для N
(N ≥ 0) данных чисел.
Пример:
Введите N: 3 Введите число: 2 >>> true Введите число: 34 >>> false Введите число: 4 >>> true
Задача function 5. Вычисление степени числа с помощью функции на языке Паскаль.
Пример:
Введите число: 3 Введите степень числа: 2 Результат 3^2 = 9
Задача function 6. Описать функцию Calc(A, B, Operation)
вещественного типа, выполняющую над ненулевыми вещественными числами A
и B
одну из арифметических операций и возвращающую ее результат. Вид операции определяется целым параметром Operation
: 1
— вычитание, 2
— умножение, 3
— деление, остальные значения — сложение. С помощью Calc
выполнить для данных A
и B
операции, определяемые данными целыми N1
, N2
, N3
.
Пример:
Введите два числа: 5 7 Введите номер операции (1 — вычитание, 2 — умножение, 3 — деление, остальные значения — сложение): 2 Результат 5*7 = 35
* Из задачника М. Э. Абрамян (Proc22)
Самостоятельная работа
1 вариант: Описать функцию CircleS(R)
вещественного типа, находящую площадь круга радиуса R
(R
— вещественное). С помощью этой функции найти площади трех кругов с данными радиусами. Площадь круга радиуса R вычисляется по формуле S=π∗R2
. В качестве значения Пи использовать 3.14
.
* Из задачника М. Э. Абрамян (Proc18)
Пример:
Введите радиус: 5.2 Площадь круга = 16,328 ___ Введите радиус: 6.3 Площадь круга = 19,782 ___ Введите радиус: 7.1 Площадь круга = 22,294
2 вариант: Описать функцию TriangleP(a, h)
, находящую периметр равнобедренного треугольника по его основанию a
и высоте h
, проведенной к основанию (a
и h
— вещественные). С помощью этой функции найти периметры трех треугольников, для которых даны основания и высоты (периметр = сумме длин всех сторон). Для нахождения боковой стороны b
треугольника использовать теорему Пифагора: b2=(a/2)2+h2
.
* Из задачника М. Э. Абрамян (Proc20)
Пример:
Введите основание треугольника: 6 Введите высоту треугольника: 5 Периметр треугольника = 17,83095 ___ Введите основание треугольника: ... Введите высоту треугольника: ... Периметр треугольника = ... ___ Введите основание треугольника: ... Введите высоту треугольника: ... Периметр треугольника = ...
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
Автор admin Просмотров 17.2к. Обновлено 26 сентября 2021
Дана следующая функция y=f(x):
y = 2x — 10, если x > 0
y = 0, если x = 0
y = 2 * |x| — 1, если x < 0Требуется найти значение функции по переданному x.
- Получить с клавиатуры значение x.
- Если x больше 0, то вычислить выражение 2*x-10, результат присвоить переменной y.
- Иначе если x равен 0, то присвоить y значение 0.
- Иначе присвоить y результат выражения 2*|x|-1.
- Иначе если x равен 0, то присвоить y значение 0.
- Вывести значение y на экран.
Pascal
Язык Си
Python
КуМир
Basic-256
Процедуры и
функции, написанные программистом, предназначены для оптимизации программ.
Основным их
преимуществом является возможность многократного использования, более легкого и
удобного тестирования и отладки независимо от других модулей.
В Паскале
главная программа начинается с декларативной части, в которую, в частности,
входят и описания всех процедур и функций. Обычно, в Паскале декларативная
часть состоит из раздела определения констант, за которым следует раздел
объявления переменных, а затем все процедуры и функции. Главное правило – любой
объект должен быть описан до его первого использования.
Пример задачи: написать
программу, которая определяет сумму квадратов n первых натуральных чисел. Сумма
определяется в функции пользователя.
program
summa_kv;
uses crt;
var e,
f:integer;
function powers
(n: integer) : integer; {объявление функции}
var i,
sum:integer;
begin
clrscr;
sum:=0;
for i:=1 to n do
sum:=sum +
sqr(i);
powers:= sum
end; {конец
функции}
begin {основная
программа}
write (‘Сколько
чисел нужно cложить?’);
readln (e);
f:= powers (e);
{вызов функции, значение е передается в n}
writeln (‘сумма
квадратов ‘,e,’ чисел’);
writeln (‘Число
членов = ‘,e,’. Сумма = ‘,f);
end. {конец
основной программы}
Функции обычно
применяются в расчетных задачах, когда необходимо выполнить ряд вычислений и
передать их значения основной программе.
Первая строка
описания функции называется заголовком. Она включает в себя имя функции, имя и
тип каждого формального параметра, а также тип результата.
Например:
function powers (n:integer):real;
Здесь имя
функции – powers, у нее один формальный параметр – n, принадлежит типу integer.
Функция возвращает результат типа integer.
За заголовком
функции следует объявление локальных переменных подпрограммы.
Например: var i,
sum:integer;
Локальные
переменные, объявленные в подпрограмме, никак не связаны с объектами главной
программы, даже если у них одинаковые имена.
За объявлениями,
если они есть, следует пара ограничителей begin-end, окружающих набор
предложений, составляющих саму функцию. При этом самым последним должно быть
выполнено предложение, которым имени функции назначается некоторое значение,
оно будет возвращено в главную программу.
Процедуры
применяются, когда приходится решать задачи, в которых интересует не вычисление
какого-то конкретного значения, а выполнение некоторой совокупности действий,
например, отпечатать список чисел. Процедура обычно не возвращает в основную
программу никакого значения. А если и передает данные, то только через
глобальные переменные. Но существуют, так называемы, процедуры с параметрами, в
которые (и даже из которых) можно передавать данные. В этой теме будут
рассмотрены и примеры таких процедур. В Электронном задачнике даются задачи
именно на такие процедуры.
Между функцией и
процедурой имеется несколько различий. Наиболее существенное состоит в том, что
функция всегда возвращает одно конкретное значение, тогда как процедура нет.
Это различие отражается в особенности объявления процедур и функций.
Заголовок
процедуры оформляется почти так же, как заголовок функции с той разницей, что в
нем отсутствует указание о типе возвращаемого значения.
Пример:
procedure test (a: real; var b: integer);
где test –
заголовок процедуры, параметр – a типа real, параметр b типа integer.
Вызов процедуры
из главной программы представляет собой просто имя процедуры со списком
аргументов. Например: test (x,y). Процедуры вообще могут не иметь параметров.
Например, сумма
n первых натуральных чисел:
program primer;
// процедура без параметров
uses crt;
var a,k,sum :
integer;
procedure add; {объявление
процедуры}
begin
writeln(a ,’ чисел,
сумма ‘,sum);
end; {конец
процедуры}
begin {начало
основной программы}
clrscr;
writeln(‘последовательное
сложение натуральных чисел’);
write(‘сколько
первых натуральных чисел сложить? ‘);
readln(k);
sum:=0;
for a:=1 to k do
begin
sum:=sum+a;
add; {вызов процедуры}
end;
end.
Пример решения
задач из Электронного задачника:
Program Proc1;
// процедура с параметрами
uses crt;
var i: integer;
t ,c:real;
procedure
powerA3(a:real;var b:real); {формальные параметры процедуры}
begin
b:=power(a,3);
{a – число, с – степень}
end;
begin {основная
программа}
writeln(‘Вычисление
3-й степени числа:’);
for i:=1 to 5 do
begin
write(‘введите число
‘);
readln(t);
powerA3(t,c);
{фактические параметры процедуры}
writeln(3-я
степень числа:’,c:2:1);
end;
end.
Program Proc3;
// процедура с параметрами
uses crt;
var
a,b,c,d,Ar,Ge:real;
procedure
Mean(x,y:real;var AMean,GMean:real);
begin
AMean:=(x+y)/2;
GMean:=sqrt(x*y);
end;
begin
writeln(‘Введите
числа a,b,c,d’);
readln(a,b,c,d);
Mean(a,b,Ar,Ge);
writeln(‘ср-ар’,Ar:2:1,’ср-геом’,Ge:2:1);
Mean(a,c,Ar,Ge);
writeln(‘ср-ар’,Ar:2:1,’ср-геом’,Ge:2:1);
Mean(a,d,Ar,Ge);
writeln(‘ср-ар’,Ar:2:1,’ср-геом’,Ge:2:1);
end.
program Proc16;
// функция
uses crt;
var a, b:real;
function
sign(x:real):integer;
begin
if x<0 then
sign:=-1;
if x=0 then
sign:=0;
if x>0 then
sign:=1;
end;
begin
writeln (‘vv a i
b’);
readln (a,b);
writeln
(‘sign(a)+sign(b) = ‘,sign(a)+sign(b));
end.
program Proc17;
// функция
uses crt;
var a1,
b1,c1:real;
i:integer;
function
RootsCount(a,b,c:real):string;
var d:real;
begin
d:=sqr(b)-4*a*c;
if d<0 then
RootsCount:=’нет корней’;
if d=0 then RootsCount:=’один
корень’;
if d>0 then
RootsCount:=’два корня’;
end;
begin
for i:=1 to 3 do
begin
writeln (‘введи
коэффициенты квадратного уравнения a, b,c’);
readln
(a1,b1,c1);
writeln
(RootsCount(a1,b1,c1));
end;
end.
Наберите и
отладьте следующие программы, разберитесь в их работе:
1. Программа
“Неповторяющиеся случайные числа” с использованием массива и
процедуры без параметров.
uses crt;
var
a,b,c,d:integer;
q:array[1..15]
of integer;
procedure qw;
begin
for b:=1 to 5 do
begin
if a=b then
continue;
if q[a]=q[b]
then begin q[a]:=random(20); qw; end;
end;
end;
begin
clrscr;
for a:=1 to 5 do
q[a]:=random(20);
for a:=1 to 5 do
qw;
for a:=1 to 5 do
writeln (q[a]);
end.
2. Проверка
целого числа на четность (использование функции).
var m:integer;
function
Chet(n:integer):boolean; { Функция проверки целого числа на четность }
begin
if (n mod 2)= 0
then Chet:=TRUE else Chet:=FALSE;
end;
begin
writeln(‘Введите
целое число и нажмите Enter’);
writeln(‘Для
завершения введите 100’);
repeat
readln ( m );
if chet(m)
then writeln(
m,’ – четное число’)
else writeln(
m,’ – нечетное число ‘);
until m = 100;
end.
3. Вычисление
длины и площади окружности (использование процедуры с параметрами).
uses crt;
var t,l,s:real;
{глобальные переменные радиус, длина и площадь окружности}
procedure
SqLeOkr(r:real); {процедура, r формальный параметр процедуры}
begin
s:=pi*r*r; {r –
радиус, s – площадь круга, l – длина окружности}
l:=2*pi*r;
end;
begin {основная
программа}
writeln(‘Вычисление
длины окружности и площади круга:’);
write(‘Задайте
радиус и нажмите Enter ‘);
readln(t);
l:=0;
s:=0;
SqLeOkr(t);
{фактический параметр процедуры}
writeln(‘Радиус
окружности: ‘,t:3:1);
writeln(‘Длина
окружности: ‘,l:3:1,’,площадь: ‘,s:3:1);
end.
Упражнения
Выполните
задания с Proc2 по Proc15 по электронному задачнику (стр.37)
и с Proc18 по Proc22 по электронному задачнику (стр.39).
Открыть его можно в режиме Помощь – Электронный задачник РТ.
Функции в языке Турбо Паскаль
Практически все
сказанное о процедурах верно и для
функций. Отличие функции от процедуры
состоит в том, что функция не имеет
выходных параметров, она возвращает
единственное значение – это значение
функции.
Входные параметры называются еще
аргументами
функции.
-
Описание функции
Function
<имя> (<список аргументов>): <тип
значения функции>; { заголовок }
<блок
описания локальных данных>
Begin
{ начало исполняемой части функции }
<тело
функции (исполняемая часть)>
End;
{ конец описания функции }
В теле функции
обязательно должна быть команда
присваивания вида:
<имя
функции> :=
<вычисленное
значение>;
которая и позволит
функции возвратить вычисленное значение.
Например, опишем
функцию вычисления среднего арифметического
двух целых чисел:
Function
middle (a, b : integer) : real;
Begin
Middle
:= ( a + b ) / 2
End;
В данном примере
тело функции – единственный оператор
присваивания, который присваивает имени
функции нужное значение.
Примеры решаемых задач
Пример 1.
Составить программу, которая вычислит
значение выражения
am+bn+(a–b)m+n.
Вычисление степени
числа оформить в виде подпрограммы.
Пояснение.
Составим и сравним две программы: с
использованием процедуры и функции
вычисления степени числа.
Программа:
program
calc_proc;
uses
crt;
var
a, b, m, n, s1, s2, s3, s : integer;
procedure
stepen (x, y : integer; var z : integer);
{процедура
возводит число x
в степень y,
результат записывает в z}
{т.е.
в процедуре описано правило вычисления
z=xy}
var
i
: integer;
{ локальная переменная для организации
цикла }
begin
z
:= 1;
for
i := 1 to y do z := z * x
end;
begin
clrscr;
write(‘Введите
a, b, m, n ’);
readln(a,
b, m, n);
{
три раза вызываем процедуру stepen
для вычисления трех слагаемых }
stepen(a,
m, s1); { вычислили
s1
как
am
}
stepen(b,
n, s2); { вычислили
s2
как
bn
}
stepen(a-b,
m+n, s3); { вычислили
s3
как
(a-b)m+n
}
s
:= s1
+ s2
+ s3;
{ вычислили сумму трех слагаемых }
writeln(‘Значение
выражения ’, s);
readln
end.
program
calc_func;
uses
crt;
var
a, b, m, n, s : integer;
function
stepen (x, y : integer) : integer;
{
функция возводит число x
в степень y
}
{
т.е. описано правило вычисления stepen
= xy
}
var
i
,z
: integer;
{локальные переменные:
i
для организации цикла, z
для вычисления произведения }
begin
z
:= 1;
for
i := 1 to y do z := z * x;
stepen
:= z
{ присвоили имени функции вычисленное
значение }
end;
begin
clrscr;
write(‘Введите
a, b, m, n ’);
readln(a,
b, m, n);
{
три раза вызываем функцию stepen
для вычисления трех слагаемых }
s
:= stepen(a, m) + stepen(b, n) + stepen(a-b, m+n, s3);
writeln(‘Значение
выражения ’, s);
readln
end.
Контрольные задания
-
Составить программу,
которая вычислит площадь треугольника,
заданного координатами своих вершин.
Использовать формулу Герона. Вычисление
расстояния между двумя точками оформить
в виде процедуры или функции. -
Составить программу
определения НОД трех чисел (по алгоритму
Евклида) с использованием процедуры
нахождения НОД двух чисел (по алгоритму
Евклида). -
Составить программу,
проверяющую гипотезу Гольдбаха. Она
состоит в том, что любое четное число,
большее 2, можно представить в виде
суммы двух простых слагаемых. Программа
должна вводить четное положительное
число и выводить все его возможные
представления в виде суммы двух простых
слагаемых. Для определения, является
ли число простым, использовать
подпрограмму. -
Составить программу,
которая изображает на экране:
-
лес
-
аллею
из елей и берез.
Рисование ели и березки оформить в виде
процедур.
-
«Диаграммы».
Составить программу, которая вводит N
числовых данных и интерпретирует их в
виде столбиковой, круговой, линейной
диаграмм. Программа должна в
алфавитно-цифровом режиме предоставлять
пользователю меню – список видов
диаграмм, позволять выбрать (например,
ввести номер) нужной диаграммы, после
чего в графическом режиме построить
нужную диаграмму. Каждый из режимов
работы программы (ввод данных, построение
каждого вида диаграмм) оформить в виде
отдельной процедуры.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
“результат работы кода в виде скриншота окна программы с отображением кода и полученного результата.” – это уже немного загнул(а) препод. Ибо в Turbo Pascal это невозможно, т.к. программа выполняется в отдельном окне, текст кода выполняющаяся программа закрывает. Вот в Pascal ABC, например – да, возможно, но Pascal ABC – не полноценный Pascal, а несколько урезанный (более того, даже не совсем Pascal, а сильно переработанный C#, если мне память не изменяет).
Ладно, не будем придираться к заданию, тем более, что смысл понятен, да и толку от этих придирок чуть. Вот код программы:
Program F1;
uses crt;
var x: real;
begin
clrscr;
writeln ('Введите с клавиатуры значение переменной x (число), после чего нажмите клавишу Enter. При вводе дробных значений, целую часть от дробной отделяйте точкой, а не запятой.');
write ('x=');
readln (x);
writeln ('Ответ: y(', x, ') = ', 3-7.5*x+sqr (x)-((sqr (x)+2*x-8)/3));
write ('Программа завершена. Для выхода нажмите клавишу Enter');
readkey;
end.
А вот блок-схема (вместо “y=” в прямоугольник перепишите формулу из задания вместе с этой дробью (дополните, т.е. y=3-7,5x…)- просто иначе может слишком мелким текст у меня получиться, трудночитаемым):