Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
informatika (2).docx
Скачиваний:
49
Добавлен:
16.04.2015
Размер:
653.64 Кб
Скачать
  1. Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.

  2. Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.

  3. Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных и с помощью параметров подпрограммы.

  4. Подпрограмма может использовать любые глобальные переменные кроме тех, которые имеют те же имена, что и ее локальные переменные. Если в подпрограмме описана локальная переменная, имя которой совпадает с именем некоторой глобальной переменной (коллизия переменных) , то данная глобальная переменная становится недоступной в этой подпрограмме, и при указании идентификатора переменной произойдет обращение к локальной переменой подпрограммы, а не одноименной глобальной переменной. Память для локальных (т.е. описанных в подпрограмме) переменных выделяется на время исполнения данной подпрограммы в специальной области, называемой стеком. При завершении работы подпрограммы память освобождается, поэтому все внутренние результаты работы подпрограммы не сохраняются от одного обращения к другому.

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

  6. Var (локальные переменные)

  7. begin

  8. <раздел операторов>

  9. end; {procedure}

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

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

  12. - в отличие от функции, не надо присваивать результат (power:=res;)

  13. Например:

  14. Procedure express (a, b, c : real; var x, y:real);

  15. Var

  16. z : real;

  17. begin

  18. z:=a+ b+ c;

  19. x:=sqr(z);

  20. y:=sqrt(z);

  21. end ; {procedure}

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

  23. Express (7.6, 6.8, 9.5, x1, x2);

  24. Решение треугольной СЛАУ

  25. Наиболее известным и популярным точным способом решения систем линейных алгебраических уравнений (СЛАУ) является метод Гаусса. Этот метод заключается в последовательном исключении неизвестных. Пусть в системе уравнений

  26. первый элемент a11(0) не равен 0. Назовем его ведущим элементом первой строки. Поделим все элементы этой строки на a11(0) и исключим x1 из всех последующих строк, начиная со второй, путем вычитания первой (преобразованной), умноженной на коэффициент при x1 в соответствующей строке. Получим

  27. Если a22(1), то, продолжая аналогичное исключение, приходим к системе уравнений с верхней треугольной матрицей

  28. Из нее в обратном порядке находим все значения xi:

  29. Процесс приведения к системе с треугольной матрицей называется прямым ходом, а нахождения неизвестных - обратным. Если один из ведущих элементов равен нулю, изложенный алгоритм метода Гаусса неприменим. Тем не менее, для нормальной матрицы с ненулевым определителем всегда возможна такая перестановка уравнений, что на главной диагонали не будет нулей. В приведенном коде для простоты перестановок не делается, зато делается проверка решения, а прямой и обратный ход для наглядности вынесены в отдельные подпрограммы.

  30. 18.Параметры-значения и параметры-переменные.

  31. Параметры-значения. Если в качестве формального параметра указана переменная, то такой параметр и есть параметр-значение. Примерами таких параметров служат параметры a, b и с в процедуре sq:36

  32. procedure sq((a, b, c: real; var x1, x2: real); Для параметров-значений машина при вызове процедур выделяет место в памяти для каждого параметра, вычисляет значение, записывает его в ячейку, соответствующую формальному параметру.

  33. Если фактический параметр есть имя переменной, например, r, то значение этой переменной пересылается в соответствующий формальный параметр, например, a. На этом всякая связь между a и r обрывается. Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение.

  34. Пример.

  1. var

  2. i: integer;

  3.  procedure p(i: integer);

  4. begin

  5. i := i * 2

  6. end;

  7.  begin

  8. i := 2;

  9. p(i);

  10. writeln(' i = ', i);

  11.  readln

  12. end.

  1. В программе происходит засылка числа 2 в ячейку, отведенную для переменной i, затем идет обращение к процедуре p с фактическим параметром i = 2. При этом значение 2 пересылается в другую ячейку, отведенную для формального параметра i. В этой ячейке после выполнения оператора i := i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа "знает" только одну переменную i, которая по-прежнему содержит число 2. Поэтому программа выведет i = 2. Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.

  2. Параметры-переменные. Если перед именем формального параметра стоит ключевое слово var, то такой параметр есть параметр-переменная. Примерами таких параметров служат x1 и x2 в заголовке

  3. procedure sq(a, b, c: real; var x1, x2: real); Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением). При вызове процедур (функций) параметры-переменные обрабатываются так: для формального параметра используется именно та ячейка, которая содержит соответствующий фактический параметр.

  4. Пример. При вызове процедуры sq оператором sq(p, q, r, y, z) для переменных x1 и x2 используются непосредственно те ячейки, которые отведены для y и z. Поэтому оператор присваивания x1 := (-b + sqrt(d)) / (2 * a) засылает полученное значение в y.

  5. Под формальные и фактические параметры-значения транслятор отводит разные области памяти. Поэтому результат выполнения процедуры может быть передан только через параметр-переменную.

  1. var

  2. a, b: integer;

  3.  procedure h(x: integer; var y: integer);

  4. begin

  5. x := x + 1;

  6. y := y + 1;

  7. writeln(x, y)

  8. end;

  9.  begin

  10. a := 0;

  11. b := 0;

  12. h(a, b);

  13. writeln(a, b);

  14.  readln

  15. end.

  1. Результаты, выдаваемые процедурой h – 11; основная ветка программы выводит 01.

  2. Разберем этот пример: фактический параметр a соответствует формальному параметру-значению x, а фактический параметр b – формальному параметру-переменной y. Под параметры a и x отведены две разные ячейки памяти, а под b и y – одна и та же ячейка. При обращении к h(a, b) из ячейки a пересылается значение 0 в ячейку x, а в ячейку y засылается адрес ячейки b, содержащей 0, т.к. в процедуре h параметр x – это параметр-значение, а y – параметр-переменная.

  3. При выполнении оператора x := x + 1 в ячейку x прибавляется 1 и в ячейке x окажется 1, а в ячейке a по-прежнему 0.

  4. Выполнение оператора y := y + 1 имеет следующий смысл: «взять число из ячейки, адрес которой находится в y (т.е. из ячейки b), прибавить 1 и заслать в ту же ячейку (т.е. в b)». Поэтому в результате выполнения оператора y := y + 1 значение ячейки b станет 1. Оператор печати из процедуры выдаст содержимое ячейки x и ячейки y, т.е. 1 и 1. Оператор печати в программе напечатает содержимое a, которое осталось равным 0, и содержимое ячейки b, которое теперь равно 1.

  5. Процедуры в Паскале допускают рекурсию, т.е. процедура может вызвать сама себя.

  6. Если в процедуре p есть обращение к процедуре q, описанной ниже, то перед описанием p процедура q декларируется как forward: после заголовка процедуры q ставится двоеточие, а затем ключевое словоforward. В этом случае параметры процедуры описываются только в операторе с forward. В заголовке самой процедуры параметры опускаются.

  1. Пример.

  2. procedure q(x: t1): forward;

  3.  procedure p(x: y);

  4. begin

  5. q(a)

  6. end;

  7.  procedure q;

  8. begin

  9. p(b)

  10. end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]