Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

11. Процедуры и функции

Предыдущий раздел:

Следующий раздел:

Задание 11: Процедуры и функции

Простейшие процедуры

1. Создайте процедуру, печатающую на экране слово Hello и программу, которая с ее помощью напечатает слово Hello 10 раз.

Локальные переменные

2. Создайте процедуру, которая выводит в одну строку слово Hello 5 раз. Осуществите это с помощью цикла. Переменную счетчик цикла сделайте локальной. С помощью этой процедуры выведите 5 таких строк.

Параметры процедур

3. Создайте процедуру, печатающую слово Hello заданное число раз. Количество раз передавайте в процедуру как параметр-значение.

4. Создайте процедуру, увеличивающую значение переменной на единицу.

5. Создайте процедуру, меняющую значения двух переменных местами.

6. Создайте процедуру, располагающую два числа по возрастанию. На входе она должна получать две переменные и если первая больше второй, то значения должны поменяться местами. Операцию перестановки выполняйте, обращаясь к процедуре из первой задачи.

7. Создайте процедуру, упорядочивающую три числа по возрастанию. Сравнений в этой процедуре не проводите. Вместо этого обращайтесь к процедуре из предыдущего задания.

8. Создайте процедуру, которая пару последовательных чисел Фибоначчи преобразует в следующую пару. То есть, если на входе даны элементы с номерами (n-1) и n, то процедура должна в те же переменные записать элементы с номерами n и (n+1). С помощью этой процедуры найдите 10-е число в последовательности Фибоначчи.

9. Создайте процедуру для возведения числа в целую степень. Число и степень должны быть параметрами-значениями, а результат должен записываться в параметр-переменную. То есть заголовок процедуры должен выглядеть примерно так:

  procedure Power(x: real; n: integer; var Result: real);

10. Поворот на угол \varphi против часовой стрелки относительно начала координат приводит к следующему преобразованию координат:

\left\{ \begin{array}{r}  x'=x \cos \varphi - y \sin \varphi\\  y'=x \sin \varphi + y \cos \varphi  \end{array} \right.

Создайте процедуру, осуществляющую такое преобразование.

12. Создайте процедуру, заполняющую массив случайными числами. Массив для заполнения передавайте в процедуру как параметр-переменную. В той же программе создайте процедуру, печатающую на экране элементы массива. Главная программа должна состоять из вызова этих процедур.

13. Усовершенствуйте предыдущую программу, добавив к процедурам еще один параметр – количество элементов, которые нужно заполнять или печатать. Пусть главная программа запрашивает это количество у пользователя.

Функции

14. Создайте функцию, перемножающую два числа. Убедитесь с ее помощью, что дважды два – четыре.

15. Создайте функцию, возводящую число в целую степень. Число и степень должны быть, естественно, параметрами.

16. Создайте функцию, возвращающую индекс максимального элемента части массива. Часть задавайте диапазоном индексов (с какого по какой). С помощью этой функции осуществите сортировку массива.

17. Реализуйте несделанные вами ранее задания на обработку массивов, оформляя часть программы как процедуру или функцию.

Процедурные типы

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

Следующий раздел:

Предыдущий раздел:

26 комментариев

  1. Константин

    Ух! Ещё 5 параграфов и можно переходить к PHP :)

  2. Taras

    Хороший план :)

  3. Константин

    Кстате, а можно сначало изучить PHP, а потом полностью HTML. HTML только базу знаю :/

  4. Taras

    Поскольку результатом работы PHP скрипта является HTML код, то совсем без HTML никак. Но если база, как ты говоришь, есть, то вполне можно учить PHP. Просто странички будут получаться простенькие, без дизайнерских изысков.

  5. Тори

    «Процедуры и функции»… Почему они такие сложные?! В голове каша… все смешалось: локальные, глобальные переменные… а уж параметры процедур вообще ужасны(((

  6. Taras

    Привыкнешь ))
    Два вида переменных, два вида параметров. Всего-то!

  7. оксана

    Здравствуйте, Тарас Викторович, проверьте, пожалуйста 4 задание:

    Был текст программы

    и 5 задание:
    var

    Был текст программы

  8. Taras

    Все правильно )

  9. оксана

    Здравствуйте, проверьте, пожалуйста, задание 7:

    Был текст программы

  10. оксана

    задание 13:

    Был текст программы

  11. Taras

    7, 9 — правильно.

    13 — стоит убрать var перед t в Randomm. Во Writee количество задается глобальной переменной m. Глобальные переменные в процедурах — это не хорошо. Надо сделать параметр.

  12. оксана

    Здравствуйте, замечания принимаются))))
    задание 15:

    Был текст программы

    задание 16:

    Был текст программы

    А сортировку делать именно с этой функцией?

  13. Taras

    15 — хорошо
    16 — для сортировки нужен максимум не во всем массиве, а только в неотсортированной части. Так что я, получается, не очень хорошо сформулировал задачу. Формулировку задачи исправил.

  14. оксана

    Здравствуйте, задание 16, сортировка по убыванию:

    Был текст программы

  15. Taras

    Параметр t у функции никак не используется. Раз уж первым делом t:=m1+1, то совершенно не важно какое значение было передано в функцию.

      n1:=i;
      z:=Max(x,i,n1);

    n1 — лишний посредник.

    В остальном — хорошо.

  16. Darkhan

    program N11_8;{числа Фибоначчи}
    var
    x, y:integer;

    procedure Fibonachi( x, y:integer);
    var
    a, b, c, i:integer;
    begin
    a:=1;
    b:=1;
    c:=0;
    i:=2;
    while a < x do
    begin
    c:=a;
    a:=b;
    b:=b+c;
    c:=0;
    i:=i+1;
    end;
    if (a = x) and (b = y) then
    begin
    c:=x;
    x:=y;
    y:=y+c;
    writeln('x', [i], ' = ', x, ' ', 'y', [i+1], ' = ', y);
    end else
    writeln(x, ' и ', y, ' не являются числами Фибоначчи ');
    end;

    begin
    write('x = ');
    readln(x);
    write('y = ');
    readln(y);
    Fibonachi(x, y);
    end.

  17. Taras

    В задаче предполагалось, что будет процедура типа

    procedure Fibonachi(var x, y:integer);

    Программа возьмет начальные значения (1,1), вызовет процедуру 8 раз и т.о. получит искомое 10-е число.

    Кстати,

    c := 0;

    оба раза лишнее..

  18. Alex_Kot

    Пример 6:
    Program Z11_6; {Order}
    type
    TProc = procedure(var x, y: real);
    var
    a, b: real;
    Proc1: TProc;

    procedure Swap(var x, y: real);
    var
    c: real;
    begin
    c:= x;
    x:= y;
    y:= c;
    end;

    procedure Order(var x, y: real; Proc1: TProc);
    begin
    if (x>y) then
    Swap(x, y);
    end;

    begin
    readln(a, b);
    writeln(‘a=’, a, ‘ b=’, b);
    Order(a, b, Swap);
    writeln(‘a=’, a, ‘ b=’, b);
    end.
    Как может быть оформлен код программы без использования в процедуре Order параматра процедурного типа Proc1 ?

  19. Alex_Kot

    Пример 7:
    Program Z11_7; {Order 3 operands}
    type
    TProc = procedure(var x, y: real);
    var
    a, b, c: real;
    Proc1: TProc;

    procedure Swap(var x, y: real);
    var {Swap: перев.»поменять местами»}
    d: real;
    begin
    d:= x;
    x:= y;
    y:= d;
    end;

    procedure Order(var x, y: real; Proc1: TProc);
    begin
    if (x>y) then
    Proc1(x, y);
    end;

    begin
    readln(a, b, c);
    writeln(‘a=’, a, ‘ b=’, b, ‘ c=’, c);
    Order(a, b, Swap);
    Order(b, c, Swap);
    Order(a, b, Swap);
    writeln(‘a=’, a, ‘ b=’, b, ‘ c=’, c);
    end.

  20. Alex_Kot

    Пример 8:
    Program Z_11_8;{Последовательность Фибоначчи: 1,1,2,3,5,8,13,21,34,55,89,144…}
    const
    n = 10;
    var
    x, y: integer;
    Counter: integer;

    procedure Fibonachi(var x, y: integer);
    var
    z: integer;
    begin
    z:= x;
    x:= y;
    y:= y+z;
    write(y, ‘ ‘);
    end;

    begin
    x:=1;
    y:=1;
    write(‘ Последовательность Фибоначчи: ‘, x, ‘ ‘, y, ‘ ‘);
    Counter:=2;
    repeat
    Fibonachi(x, y);
    Counter:=Counter+1;
    until Counter = n;
    write(‘…’);
    writeln;
    writeln(‘ Y_n=’, y);
    end.

  21. Alex_Kot

    Program Z11_10 {Преобразование координат};
    var
    x, y, fi: real;

    procedure Transform(var x, y: real; fi: real);
    var
    z: real;
    begin
    z:= x;
    x:= x*cos(fi) — y*sin(fi);
    y:= z*sin(fi) + z*cos(fi);
    end;

    begin
    readln(x, y, fi);
    writeln(‘ x=’, x, ‘ y=’, y, ‘ fi=’, fi);

    Transform(x, y, fi);
    writeln(‘ x=’, x, ‘ y=’, y);
    end.

  22. Alex_Kot

    Может быть такая сортировка имелась в виду в примере 16:
    Program Z11_16; {Ранжирование элементовтов массива по возрастанию}
    const
    N=10;
    type
    TMass = array[1..N] of real;
    var
    a: TMass;
    i, d: integer;
    z: real;

    procedure FillTMass(var x: TMass; m1, m2: integer);
    var {Заполнение массива}
    i: integer;
    begin
    for i:=m1 to m2 do
    x[i]:= trunc(99 *(2*random-1));
    end;

    procedure OutTMass(var x: TMass; n1, n2: integer);
    var {Вывод массива}
    i: integer;
    begin
    for i:=n1 to n2 do
    write(x[i]:4);
    writeln;
    end;

    function Indexmax(var x: TMass; k1, k2: integer): integer;
    var {Индекс наибольшего элемента: k1<=Indexmaxx[c]) then
    c:= i;
    Indexmax:=c;
    end;

    begin
    FillTMass(a, 1, N);
    OutTMass (a, 1, N);

    for i:=1 to N do
    begin
    d:= Indexmax(a, i, N);
    z:= a[i];
    a[i]:= a[d];
    a[d]:= z;
    end;

    OutTMass (a, 1, N);
    end.

    Работает также код с параметром процедурного типа, хотя и нет полной уверенности в корректности описаний параметров:

    Program Z11_16; {Ранжирование элементов массива по возрастанию}
    const
    N=10;
    type
    TMass = array[1..N] of real;
    TFunc = function(var x: TMass; k1, k2: integer): integer;
    var
    a: TMass;
    Func: TFunc;
    i: integer;

    procedure FillTMass(var x: TMass; m1, m2: integer);
    var {Заполнение массива}
    i: integer;
    begin
    for i:=m1 to m2 do
    x[i]:= trunc(99 *(2*random-1));
    end;

    procedure OutTMass(var x: TMass; n1, n2: integer);
    var {Вывод массива}
    i: integer;
    begin
    for i:=n1 to n2 do
    write(x[i]:4);
    writeln;
    end;

    procedure Sort(var x: TMass; k1, k2: integer; Func: TFunc);
    var {Сортировка элементов массива по возрастанию}
    i, d: integer;
    z: real;
    begin
    for i:=1 to N do
    begin
    d:= Func(a, i, N);
    z:= a[i];
    a[i]:= a[d];
    a[d]:= z;
    end;
    end;

    function Indexmax(var x: TMass; k1, k2: integer): integer;
    var {Индекс наибольшего элемента: k1<=Indexmaxx[c]) then
    c:= i;
    Indexmax:=c;
    end;

    begin
    FillTMass(a, 1, N);
    OutTMass (a, 1, N);

    Sort(a, 1, N, Indexmax);
    OutTMass(a, 1, N);
    end.

  23. Alex_Kot

    В первом варианте ошибка копирования. Пробую исправить:

    function Indexmax(var x: TMass; k1, k2: integer): integer;
    var {Индекс наибольшего элемента: k1<=Indexmaxx[c]) then
    c:= i;
    Indexmax:=c;
    end;

  24. Alex_Kot

    function Indexmax(var x: TMass; k1, k2: integer): integer;
    var
    i, c: integer;
    begin
    c:= k1;
    for i:=k1+1 to k2 do
    if (x[i]>x[c]) then
    c:= i;
    Indexmax:=c;
    end;

  25. Alex_Kot

    Пример 18:
    rogram Integral_11_11;
    type
    TFunc = function (x: real): real;
    var
    x, Int: real;
    function Example (x: real): real;
    {Та функция, от которой в последствии будем брать интеграл}
    begin
    Example:=cos(x);
    end;
    function Integral(a, b: real; f: TFunc): real;
    const
    N=1000;
    var
    i: integer;
    h, s: real;
    begin
    h:=(b-a)/N;
    s:=(f(a)+f(b))/2;
    x:=a;
    for i:=1 to N-1 do
    begin
    x:=x+h;
    s:=s+f(x);
    end;
    Integral:=s*h;
    end;
    begin
    Int:=Integral(-Pi/2, Pi/2, Example); {Вызов функции Integral, где в
    качестве параметра передана функция Example, вычисляющая
    косинус}
    Writeln(‘ Int=’, Int);
    end

  26. Javohir

    Не могу 11 сделал помогите пожалуйста

Добавить комментарий