Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 763 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 4:

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

4.4 Функции

Описание функции также состоит из заголовка и тела:

function имя_функции(список_формальных_параметров ) :
			тип_результата;
	label
		список_меток;
	const
		список_констант;
	type
		список_типов;
	var
		список_переменных;
	begin
		//Тело функции.
	end;

Заголовок функции содержит: служебное слово function, любой допустимый в языке Free Pascal идентификаторимя_функции; имена формальных параметров и их типы, разделённые точкой с запятой — список_формальных_параметров, тип возвращаемого функцией значения — тип_результата (функции могут возвращать скалярные значения целого, вещественного, логического, символьного или ссылочного типов).

Примеры описания функций:

function fun_1 ( x : real ) : real;
function fun_2 ( a, b : integer ) : real;

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

Например:

function fun_2 ( a, b : integer ) : real;
	begin
		fun_2 :=( a+b ) / 2;
	end;

Обращение к функции осуществляется по имени с указанием списка фактических параметров:

имя_функции (список_фактических_параметров );

Например:

y:=fun_1 ( 1. 2 8 );
z :=fun_1 (1.28)/2+ fun_2 ( 3, 8 );
ЗАДАЧА 4.3. Вводится последовательность из N целых чисел, найти среднее арифметическое совершенных чисел и среднее геометрическое простых чисел последовательности.

Напомним, что целое число называется простым, если оно делится нацело только на само себя и единицу. Подробно алгоритм определения простого числа описан в задаче 3.14 (рис. 3.33). Кроме простых чисел, в этой задаче фигурируют совершенные числа. Число называется совершенным, если сумма всех делителей, меньших его самого, равна этому числу. Алгоритм, с помощью которого можно определить делители числа, подробно рассмотрен в задаче 3.13 (рис. 3.32).

Для решения поставленной задачи понадобятся две функции:

  • prostoe — определяет, является ли число простым, аргумент функции — целое число N, функция возвращает true (истина), если число простое, и false (ложь) — в противном случае;
  • soversh — определяет, является ли число совершенным; входной параметр — целое число N, функция возвращает true (истина), если число простое, и false (ложь) — в противном случае.

Фрагмент программы с комментариями:

//Функция, которая определяет простое число.
function prostoe (N: word ) : boolean;
	var i : word;
	begin
		prostoe := true;
		for i :=2 to N div 2 do
		if N mod i = 0 then
		begin
			prostoe := false;
			break;
		end;
	end;
//Функция, которая определяет совершенное число.
function soversh (N: word ) : boolean;
	var i : word; S : word;
	begin
		soversh := false;
		S : = 0;
		for i :=1 to N div 2 do
			if N mod i =0 then S:=S+i;
			if S=N then soversh := true;
	end;
var X: word; K, kol_p, kol_s, i : byte; Sum, Pro : real;
begin //Начало основной программы.
	//Ввод количества элементов в последовательности.
	write ( ’K= ’ ); readln (K);
	Sum: = 0; //Переменная для накапливания суммы.
	Pro : = 1; //Переменная для вычисления произведения.
	kol_p : = 0; //Счётчик простых чисел.
	kol_s : = 0; //Счётчик совершенных чисел.
	for i :=1 to K do
	begin
		//Ввод элемента последовательности.
		Writeln ( ’X= ’ ); readln (X);
		if prostoe (X) then //Если число простое,
		begin
			//выполнить операцию умножения,
			Pro:=Pro *X;
			//увеличить счётчик простых чисел.
			kol_p:=kol_p +1;
		end;
		if soversh (X) then //Если число совершенное,
		begin
			//выполнить операцию умножения,
			Sum:=Sum+X;
			//увеличить счётчик совершенных чисел.
			kol_s := kol_s +1;
		end;
	end;
	//Если были найдены совершенные числа,
	if kol_s<> 0 then
	begin
		Sum:=Sum/ kol_s; //вычислить среднее арифметическое.
		writeln ( ’Среднее арифметическое совершенных чисел  ’,
				Sum : 5 : 2 );
	end
	else //иначе вывести сообщение:
		writeln ( ’Совершенных чисел в последовательности нет. ’ );
	if kol_p<>0 then //Если были найдены простые числа,
	begin
		//вычислить среднее геометрическое.
		Pro:= exp (1/ kol_p _ ln ( Pro ) );
		writeln ( ’Среднее геометрическое простых чисел  ’, Pro : 5 : 2 );
	end
	else //иначе вывести сообщение:
		writeln ( ’Простых чисел в последовательности нет ’ );
end;
ЗАДАЧА 4.4. Вводится последовательность целых чисел. 0 — конец последовательности. Определить, содержит ли последовательность хотя бы одно число-палиндром.

Палиндром — это число, симметричное относительно своей середины. Например, 123 454 321, 678 876 — палиндромы. Чтобы определить, является ли число палиндромом, нужно сравнивать первую и последнюю цифры, затем вторую и предпоследнюю и так далее. Если хотя бы в одной паре цифры не совпадут, то число палиндромом не является.

Для решения поставленной задачи понадобятся две функции:

  • cifra_kol — определяет количество цифр в числе (подробно алгоритм описан в задаче 3.16);
  • palindrom — возвращает значение "истина", если переданное в неё число палиндромом.

Текст программы с комментариями:

//Функция для вычисления количества цифр в числе M.
function cifra_ kol (M: longint ) : byte;
	begin
		cifra_ kol : = 1;
		while M div 10 > 0 do
		begin
			cifra_ kol := cifra_ kol +1;
			M:=M div 1 0;
		end;
	end;
//Функция возвращает значение "истина", если число M,
//состоящее из kol цифр, палиндром,
//и значение "ложь", в противном случае.
function palindrom (M: longint; kol : byte ) : boolean;
	var i : byte; j : longint;
begin
	j : = 1;
//Возведение числа 10 в степень kol-1 (разрядность числа).
	for i :=1 to kol -1 do
	j := j * 10;
	palindrom := true; //Пусть число - палиндром.
	for i :=1 to kol div 2 do
	begin
//Выделение старшего разряда M div j (первая цифра).
//Выделение младшего разряда M mod 10 (последняя цифра).
	//Если первая и последняя цифры не совпадают,
	if M div j <> M mod 10 then
	begin
		palindrom := false; //то, число не палиндром.
		break; //Досрочный выход из цикла.
	end;
	//Изменение числа
	M:=M -(M div j ) * j; //Удаление первой цифры числа.
	M:=M div 10; //Удаление последней цифры числа.
	j := j div 100; //Уменьшение разрядности.
	end;
end;
//Основная программа.
var X: longint; pr : boolean;
begin
	write ( ’X= ’ ); readln (X); //Ввод элемента последовательности.
	pr := false; //Пусть в последовательности нет палиндромов.
	while X<>0 do //Пока не ноль,
	begin
	if palindrom (X, cifra_ kol (X) ) then
	begin
		pr := true; //Найдено число палиндром,
		break; //досрочный выход из цикла.
		end;
		//Ввод следующего элемента последовательности.
		write ( ’X= ’ ); readln (X);
	end;
	if pr then writeln ( ’Последовательность ’,
		’содержит число-палиндром. ’ )
	else writeln ( ’Последовательность не содержит палиндромов. ’ );
end.
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.