Pascaler
О проекте Теоретический материал Тестирование Архив задач
Войти в личный кабинет



О проекте


Преподавателям


Тема: Процедуры.

Структура процедуры имеет следующий вид:

Procedure <имя процедуры>(формальные параметры : их тип);
Var
  (локальные переменные)
begin
  . . .
end;

Процедура вызывается по имени:

  <имя процедуры> (фактические параметры);

Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Временно управление передаётся процедуре. После завершения работы процедуры управление возвращается в основную программу.

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

Заголовок процедуры может выглядеть так:

  PROCEDURE GG(a,b,c:integer); вызываться так: GG(3,n,m)

Здесь a,b,c-формальные параметры, а 3, n, m-фактические параметры

Таким образом в процедуру передаются значения: a=3, b=n, c=m

Переменные описанные в процедуре после слова Var, являются внутренними переменными процедуры или промежуточными, они не являются данными для операций внутри процедуры и не являются результатом её выполнения, а нужны лишь для промежуточных действий. Данные и результаты описываются в круглых скобках после имени процедуры. Перед описанием переменных-результатов пишут служебное слово var.

Например:

Procedure express(a,b,c : real; var x,y:real);
Var
  z : real;
begin
  z:=a+ b+ c;
  x:=sqr(z);
  y:=sqrt(z);
end ;

Эту процедуру можно вызвать следующим образом:

express(7.6, 6.8, 9.5, x1, x2);

Формальные входные параметры a, b, c принимают значения соответствующих фактических параметров a=7.6; b=6.8; c=9.5.

При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом в основной программе будем иметь x1=20, y1=22.

В качестве фактических параметров могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут быть только переменные(константы и выражения недопустимы).

Рассмотрите примеры решения задач.

Задача 1. Описать пpоцедуpу "аналитического" сложения обыкновенных дpобей, вычисляющую по числам P1,Q1,P2,Q2, являющимися числителями и знаменателями дробей и последняя дpобь несокpатима. Результат вывести в виде

 P1      P2       P
---- + ----  = ---
 Q1     Q2      Q

Program Kudashev_Artem;
Uses
  Crt;
Var
  P1, Q1, P2, Q2, P, Nod_2, Celaya : Longint;
  Dop_1, Dop_2 : integer;

Procedure Nod(A,B : Longint;Var Nod_2 : Longint);
Begin
  Nod_2:=A*B;
End;

Procedure Vivod_Otveta(Celaya,P1,Q1,P2,Q2,P,Nod_2,X,Y:integer);
Var
  i : integer;
Begin
  if P > Nod_2
    then
      begin
        Celaya:=P div Nod_2;
        P:=P mod Nod_2;
      end
    else
      begin
        Gotoxy(X+1,Y);
        write(P1);
        Gotoxy(X+10,Y);
        write(P2);
        if P = 0
          then
            begin
              Gotoxy(X+1,Y+1);
              write('---- + ---- = ',Celaya,'');
              Gotoxy(X+1,Y+2);
              write(Q1);
              Gotoxy(X+10,Y+2);
              write(Q2);
            end
          else
            begin
              for I:=10 downto 2 do
                begin
                  if ((P mod I) = 0) and ((Nod_2 mod I) = 0) then
                    begin
                      P:=P div I;
                      Nod_2:=Nod_2 div I;
                    end;
                end;
              Gotoxy(X+19,Y);
              write(P);
              Gotoxy(X+1,Y+1);
              write('---- + ---- = ',Celaya,' ------');
              Gotoxy(X+1,Y+2);
              write(Q1);
              Gotoxy(X+10,Y+2);
              write(Q2);
              Gotoxy(X+19,Y+2);
              write(Nod_2);
            end;
      end;
End;

Procedure Podshet(P1, Q1, P2, Q2 : Longint);
Begin
  Nod(Q1,Q2,Nod_2);
  Dop_1:=Nod_2 div Q1;
  Dop_2:=Nod_2 div Q2;
  P:=(Dop_1*P1)+(Dop_2*P2);
    if P > Nod_2
      then
        begin
          Celaya:=P div Nod_2;
          P:=P mod Nod_2;
        end;
End;

Begin
  Clrscr;
  Q1:=0;
  Q2:=0;
  Textcolor(LightCyan);
  writeln(' P1 P2 P');
  writeln('---- + ---- = ---');
  writeln(' Q1 Q2 Q');
  writeln;
  write('Введите P1 -> ');
  readln(P1);
  while Q1 = 0 do
    begin
      write('Введите Q1 -> ');
      readln(Q1);
      if Q1 = 0
        then
          writeln('Число Q1 не должно pавнятся 0');
    end;
write('Введите P2 -> ');
readln(P2);
while Q2 = 0 do
  begin
    write('Введите Q2 -> ');
    readln(Q2);
    if Q2 = 0
      then
        writeln('Число Q2 не должно pавнятся 0');
  end;
Podshet(P1,Q1,P2,Q2);
Vivod_Otveta(Celaya,P1,Q1,P2,Q2,P,Nod_2,2,10);
readkey;
End.

Задача 2. Для заданного N составить алгоритм вычисления значения выражения:

  (1*1)          (2*2)        (3*3)              (N*N)
--------- * --------- * --------- *...* ---------
(1+(3*3))   (2+(3*3))   (3+(3*3))        (N+(3*3))

Program Kudashev_Artem;
Uses
  Crt;
Var
  N, Ch, Zn, Celaya : Longint;

Procedure Podshet(N : Longint; Var Chislitel, Znamenatel : Longint);
Var
  A, Z : integer;
Begin
  Chislitel:=1;
  Znamenatel:=1;
  for A:=1 to N do
    begin
      Chislitel:=Chislitel*(A*A);
      Znamenatel:=Znamenatel*(9+A);
      for Z:=2 to 10 do
        begin
          if ((Chislitel mod Z) = 0) and ((Znamenatel mod Z) = 0)
            then
              begin
                Chislitel:=Chislitel div Z;
                Znamenatel:=Znamenatel div Z;
              end;
        end;
    end;
End;

Begin
  Clrscr;
  TextBackground(Black);
  Textcolor(Yellow);
  write('Введите N -> ');
  read(N);
  Podshet(N,Chl,Zn);
  Celaya:=Ch div Zn;
  Chislitel:=Ch mod Zn;
  writeln('Ответ');
  writeln(' ',Ch);
  writeln('',Celaya,' ---------');
  writeln(' ',Zn);
  readkey;
End.

Задание. Приготовьтесь объяснить решение задач учителю. 

Задачи для самостоятельного решения:

  1. Написать программу подсчета суммы М введенных с клавиатуры чисел.


  2. Составить программу поиска большего из трёх чисел, с использованием процедуры поиска большего из двух чисел.


  3. Напишите программу (процедуру), которая будет возвращать значение среднего арифметического двух своих параметров а и b.


  4. Написать процедуру, меняющую значения двух переменных а и b местами.


  5. Используя процедуру обмена значений двух переменных, упорядочьте по возрастанию переменные a, b, c.


  6. Определить длину окружности L и площадь круга S. Радиус окружности задается с клавиатуры. Вычисление S и L оформить в виде процедуры.


  7. Постройте диалоговой алгоритм, позволяющий выводить несколько графиков по выбору в одной системе координат. Для построения графиков используйте подпрограммы.


  8. Напишите подпрограмму, которая будет вычислять сумму правильных делителей заданного числа n. Правильными делителями числа n, являются все делители этого числа, за исключением его самого.
Вернуться назад
2003—2012 © Группа «Vimedia»
Проект «Pascaler» — лучший на ХI Всероссийской конференции молодых исследователей с международным участием «Шаг в будущее», Россия, Москва, 12 – 16 апреля 2004г.