Переменные в процедуре

Этот пост поясняет урок"Процедуры и функции в Паскаль. Как объявлять и использовать " .
Если вы обьявили три переменных в процедуре, то вы обязаны при вызове этой процедуры тоже писать три переменные. Количество обьявленных переменных должно быть равно количеству переменных в синтаксисе процедуры при ее использовании. Например:

 
procedure sum(x, y,z: integer); // начало объявления процедуры три параметра, объявлем все три переменных
begin
  z := x + y; // тело процедуры
  writeln(z);
end;    
begin
  write('chisla ');
  readln(a, b);  // мы можем ввести два параметра, но можем ввести и три readln (a,b,c);
  sum(a,b,c); // обязательно пишем именно три парамерта
  readln();
end.   

Теперь рассмотрим на примере, что такое "переменная по ссылке" и "переменная по значению":

Механизм обращения к "переменным по значению": мы можем извне с помощью переменной 'c' изменить переменную 'z' в процедуре, но при этом вызвать переменную 'z' напрямую оператором writeln (writeln (z)) нельзя и нельзя вывести ее через эту новую переменную 'с' в теле программы. Пример:

 
program project1;
var
  a, b, c: integer; // объявляем глобальные переменные программы
procedure sum(x, y,z: integer); // если a,b,z переменные по значению
begin
  z := x + y; // тело процедуры
end;
begin
  write('chisla ');
  readln(a, b);
  sum(a,b,c);
     writeln (c); // выведется значение '0'
	 // writeln (z); // вообще приведет к ошибке
  readln();
end. 

Ссылка — это способ обратиться к переменной с помощью другого имени.Ссылки - это средство доступа к содержимому одной переменной под разными именами. Механизм обращения к "переменной по ссылке": мы можем извне с помощью переменной 'c' изменить переменную 'z' в процедуре и при этом вызвать переменную 'z' через эту новую переменную 'с' в теле программы. Пример:

 
program project1;
var
  a, b, c: integer; // объявляем глобальные переменные программы
procedure sum(x, y: integer; var z:integer); // если a,b,z переменные по значению
begin
  z := x + y; // тело процедуры
end;
begin
  write('chisla ');
  readln(a, b);
  sum(a,b,c);
     writeln (c); // выведется значение 'z'
	  // writeln (z); // также, приведет к ошибке
  readln();
end. 

Для лучшего понимания обратите внимание на следующий пример где z глобальная переменная (! ЗДЕСЬ ОШИБКА В КОДЕ - ПРАВИЛЬНЫЙ КОД В КОММЕНТАРИИ ПОД ДАННЫМ ПОСТОМ) :

 
program project1;
var
  a, b, c,z: integer; // объявляем глобальные переменные программы
procedure sum(x, y: integer); // начало объявления процедуры
begin
  z := x + y; // тело процедуры
  writeln(z);
end;
begin
  write('chisla ');
  readln(a, b);
  sum(a, b);
  readln();
  // writeln (z);  // мы вызываем в теле программы переменную 'z'
end.

Переменная 'z' глобальная - ее можно поменять где угодно и вне процедуры. При этом обратите внимание что вводим мы только a и b - readln(a, b) выведется значение z = a+b , при этом мы можем отдельно вызвать в теле программы writeln(z); Если Переменная 'z' неглобальная и "по значению" - ее нельзя поменять вне программы. Пример:

 
var
  a, b, c: integer; // объявляем глобальные переменные программы
procedure sum(x, y,z: integer); // начало объявления процедуры
begin
  z := x + y; // тело процедуры
  writeln(z);
end;
begin
  write('chisla ');
  readln(a, b);
  sum(a,b,c);
 // writeln (z);  приведет к ошибке
  writeln (с); // можно вывести 'z' через переменную 'c'
  readln();
end.
  

Если после этого вызвать оператор writeln(z) - то это приведет к ошибке. Но ! Если сделать переменную 'z' переменой по ссылке, то тогда мы сможем вывеси через новую переменную, например через переменную 'c' с оператором writeln(c) выведем значение переменной 'z'.

vedro-compota's picture

Переменная z глобальная - ее можно поменять где угодно и вне процедуры

а разве в самой процедуре можно получить доступ к переменной из программы таким образом? Проверяли этот код?

_____________
матфак вгу и остальная классика =)

fgh's picture

Спасибо за замечание, поменять глобальную переменную

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

 
program project1;
var
  a, b, c,z: integer; // объявляем глобальные переменные программы
procedure sum(x, y,c: integer); // начало объявления процедуры
begin
  c := x + y+z; // тело процедуры
  z:=99; // значение "из процедуры" не повлияет на значение глобальной переменной в программе
  writeln(c);
end;
begin
  write('chisla ');
  readln(a, b);
  z:=1; // здесь значение глобальной переменной 
 //  повлияет на выполнение процедуры
  sum(a, b,c);
  readln();
   writeln (z); // мы вызываем в теле программы переменную 'z'
end. 
  
vedro-compota's picture

желательно добавить ссылку на урок, которому относится обсуждение

_____________
матфак вгу и остальная классика =)