Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дорошенко.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
659 Кб
Скачать
☆

9.2. Функции

В математике функция – это зависимость некоторой переменной от других переменных (аргументов). В отличие от математического понятия функции в программировании рассматриваются такие функции,

  • для которых можно построить алгоритм (а следовательно, и программу) вычислеия значений,

  • значения которых относятся к простым типам (например, значением функции не может быть вектор, массив ).

Структура функции в определенной мере по форме, также как и структура процедуры, совпадает со структурой программы, но имеет и существенные отличия:

Function имя_функции[(список параметров)] : тип_функции;

{раздел объявления локальных объектов функции: констант,

типов, переменных:}

const…

type…

var…

begin

{операторная часть или тело функции}

end;

Примечание. В отличие от процедуры для функции необходимо выполнять следующие требования

  • в заголовке всегда указывается тип функции;

  • в списке параметров записываются только те параметры, значения которых передаются (вводятся) из вызывающей программы, но не возвращаются в программу;

  • значение функции, возвращаемое вызывающей программе, присваивается имени функции, поэтому операция присваивания имени функции (уже без указания параметров) вычисленного значения – обязательная в операторной части описания функции; эта операция присваивания – последняя в операторной части функции;

  • обращение к функции из вызывающей программы состоит в написании имени функции и в подстановке фактических значений всех формальных параметров;

  • порядок задания и типы подставляемых фактических значений должны соответствовать порядку написания и типам формальных параметров функции.

  • Функция, в отличие от процедуры, не является самостоятельной подпрограммой, поэтому обращение к функции из вызывающей программы будет корректным в одном из двух случаев:

1)имя функции присваивается некоторой переменной или

2)Имя функции входит составной частью (как переменная) в некоторое выражение.

Ниже рассмотрены примеры описания и применения функций.

Пример 15. Даны четыре произвольных числа a,b,c,d. Найти максимальное, используя функцию fmax2 выбора большего из двух чисел.

Program max_4;

Var a,b,c,d:real;

y1,y2,z:real;

Function fmax2(x1,x2:real):real;

Var fm:real;

begin if x1>x2 then fmax2:=x1 else fmax:=x2

end;

begin write(‘Введите 4 числа’);read(a,b,c,d);

y1:=fmax2(a,b); y2:=fmax2(c,d); z:=fmax2(y1,y2);

writeln(‘Максимальное число: ’,z:8:2); readln

end.

Примечание. Для более короткой (компактной ) формы вычисления здесь возможно применение рекурсии: в качестве параметра функции может использоваться имя той же функции. (О рекурсиях более подробно см. в следующем учебном пособии). Тогда формула вычисления максимального из четырех чисел будет выглядеть так:

Z:=fmax2(fmax2(a,b),fmax2(c,d));

Или еще короче – выражение, вычисляющее результат, записывается в качестве параметра процедуры вывода:

writeln(‘Максимальное число: ’,max2(fmax2(a,b),fmax2(c,d) ):8:2);

Пример 16. Функция F_middle вычисляет среднее значение элементов одномерного массива целых чисел {Тип массива А должен быть объявлен в вызывающей программе

Type TA=array[1..30] of integer;}:

Function f_middle (n:integer; A:TA):real;

Var i:integer; s:real;

Begin s:=0;

For i:=1 to n do s:=s+A[i]; s:=s/n;

F_middle:=s

End;

Пример 17. В программе формируется двумерный массив (матрица) целых чисел, получаемых с помощью стандартной функции генерирования случайных чисел в диапазоне (0..50). Применяя функцию, описанную в предыдущем примере, в данной программе вычисляются и выдаются на экран ПК средние значения строк и средние значения столбцов матрицы.

program m_s;

type T1= array[1..10] of integer;

var i,j,n,m:integer;

mas:array[1..10,1..15]; {матрица исходных чисел}

mas1:array[1..15] of real; mas2:array[1..10] of real;{массивы для хранения текущей строки и текущего столбца матрицы}

Function f_middle (n:integer; A:Т1):real;

Var i:integer; s:real;

Begin s:=0;

For i:=1 to n do s:=s+A[i]; s:=s/n;

F_middle:=s

End;{function middle}

Begin writeln(‘Задайте размерность матрицы: ’);

Write(‘Количество строк N= ’);read(n);

Write(‘Количество чисел в строке М=’);read(m);

{Задание значений и печать элементов матрицы}

Writeln(‘Исходная матрица:’) ;

for i:=1 to n do

begin

For j:=1 to m do

Begin mas[i,j]:=random(51); write(mas[i,j])

End; writeln

End;

Writeln;

Writeln(‘Средние значения элементов строк:’);

For i:=1 to n do

Begin

{Элементы i-той строки копируются, образуя массив mas1:}

For j:=1 to m do mas1[j]:=mas[i,j];

{на монитор выдается в форме с фиксированной точкой рассчитанное с помощью функции среднее значение текущей i-той строки:}

write(i,’-й строки: ’,f_middle(m, mas1):8:3);

end;

writeln;

Writeln(‘Средние значения элементов столбцов:’);

For j:=1 to m do

Begin

{Элементы j-того столбца копируются, образуя массив mas2:}

For i:=1 to n do mas2[i]:=mas[i,j];

{на монитор выдается в форме с фиксированной точкой вычисленное с помощью функции среднее значение текущего j-того столбца:}

write(j,’-го столбца: ’,f_middle(n, mas2):8:3);

end;

writeln; writeln(‘Для выхода из программы нажать Enter’);

readln

End.

10. ЗАДАНИЯ К ЛАБОРАТОРНЫМ РАБОТАМ

ПО ДИСЦИПЛИНЕ «ИНФОРМАТИКА И ПРОГРАММИРОВАНИЕ»

Задание к лабораторной работе №1.

Тема: Изучение процедур Write, Writeln и оператора цикла с параметром.

  1. Войти в среду ТР и набрать текст программы выдачи списка кодов в диапазоне (0..N) и соответствующих им символов:

{ Начальный текст программы: }

program cod_simv;

var n,i:byte;

sim: char;

begin writeln(‘ Программа выдает список имеющихся в ПК символов’);

writeln(‘ соответствующих кодам из диапазона (0..N, ’);

writeln(‘ где число N вводится с клавиатуры’);

writeln;

writeln(‘Задай целое положительное число N=’);read(n);

for i:=1 to n do write(i,chr(i));

writeln;

writeln(‘для завершения работы нажми Enter ’);

readln;

end.

2. Сохранить файл, присвоив ему имя “cod_sim.pas”. Выполнить программу, задавая последовательно значения N=10, 20, 200. Убедиться, что читать результат практически невозможно из-за слияния значений кодов и символов.

3. Внести изменения в строку оператора цикла for:

For i:=1 to n do write(i, ‘ – ‘,chr(i), ‘; ‘);

Выполнить программу при N=120. Уже лучше? Но еще трудно читать.

Примечание.

Программу придется запускать многократно при различных значениях N. Поэтому рекомендуется всю программу заключить в оператор цикла

repeat…until (povtor=’N’) or (povtor=’n’);

Для этого в программе необходимо объявить переменную povtor и внести соответствующие дополнения

4. Задать выдачу каждого символа в отдельной строке, изменив в for-операторе процедуру write на writeln. Задать N=15, затем 50. Увидим на дисплее только последние коды до 50-го и их символы.

5. Tело цикла записать в виде составного оператора, заключенного в операторные скобки:

For i:=1 to n do

Begin sim:=chr(i); writeln(‘Коду ‘,i,’ соответствует символ ‘,sim,’ ‘);

End;

Выполнить программу при n=15 и 120. Видим последние коды до 120-го.

6. Увеличить число видимых символов, удалив ln в процедуре writeln и задав N=120. Плохо читается? Перейти к п.7.

7. Изменить программу, задавая печать только двух кодов-символов в строке:

  • Объявить переменную S – счетчик строк.

  • До начала цикла установить S в 0.

  • Оператор цикла записать в виде:

For i:=1 to n do

Begin sim:=chr(i); write(i,’: ‘,sim,’ ‘);s:=s+1;

If S=2 then

Begin S:=0;writeln {переход на следующую строку}

end

End;

Выполнить программу при N=15 и 120.

8. Задать в программе условие размещения в строке максимального числа кодов-символов и выполнить программу при N=15, 120, 200. А как задавать произвольное число элементов в строке, вводимое в процессе работы программы? Проведите соответствующие изменения и дополнения в программе и проверьте результат.

9. Включить в программу процедуру clrscr очистки экрана. Для этого подключить модуль CRT, содержащий библиотеку дополнительных функций и процедур, в частности процедуру clrscr:

Program cod_simv;

Uses CRT;

Var ……………

……………

Begin clrscr;……

…………..

End.

Выполнить программу при N=15, 150, 300, 600.

Убедиться, что начиная с кода 256 символы повторяются, то есть всего кодируется в компьютере 256 символов (практически меньше, так как некоторые коды не связываются с символами. Найдите такие коды и подсчитайте их количество).