Пример программы с подпрограммой

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

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

Разработка ЧПУ программы и подпрограммы.

В неё же возвращается и поток управления командами программы, причем подпрограмма должна уметь вернуть управление независимо от того, откуда она была вызвана. Вызов подпрограмм может быть вложенным. Чтобы работа программы имела смысл, ей надо получить данные из внешней (вызывающей) программы.

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

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

Вызывающая программа:

· Подготовить список параметров согласно соглашениям о связях;

· Подготовить для подпрограммы адрес возврата;

· Передать управление в подпрограмму.

Вызываемая подпрограмма:

· Сохранить состояние среды (контекст) вызывающей программы (в некоторых реализациях это действие выполняет операционная система);

· Выделить память для локальных переменных;

· Получить доступ к параметрам;

· Выполнить алгоритм, заложенный в подпрограмму; при необходимости воспользоваться списком параметров, правильно извлекая и изменяя из значения в соответствии с соглашениями о связях;

· Освободить память локальных переменных и восстановить контекст вызывавшей программы;

· Возвратить управление в вызывавшую программу;

Вызывающая программа:

· Воспользоваться результатами работы подпрограммы.

Параметры, передаваемые в подпрограмму в момент её вызова, называются фактическими. Они замещают формальные параметры, указываемые в заголовке подпрограммы. Параметры могут передаваться по адресу (по имени) или по значению. Последние не могут изменить свои значения в вызывающей программе. По адресу передаются изменяемые параметры, а также массивы и структуры.

Функции c++ примеры. Синтаксис. Объявление, реализация функции. Параметры, аргументы. C++ #33

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

Реализация описанных понятий происходит по-разному в зависимости от архитектуры аппаратных средств и операционной системы. Для микропроцессоров INTELтрадиционным является использование аппаратного стека. Структура информации, соответствующая описанному выше протоколу, дана на следующем рисунке. Она образует «фрейм», или «кадр» стека. Следует помнить, что логический рост стека на данных микропроцессорах происходит «сверху вниз», от больших адресов к меньшим.

Рис. 1. Структура фрейма вызова подпрограммы

Перед вызовом подпрограммы вызывающая программа записывает адреса или значения параметров в стек. Вызов программы выполняется командой CALL, которая в зависимости от формата вызова (ближний или дальний), помещает в стек адрес возврата в виде регистра IP или пары регистров CS/IP.

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

Читайте также:
Что будет если удалить все программа nvidia

Если параметр передан по адресу, то этот адрес обычно переносится в регистр BX, и доступ к параметру также осуществляется с помощью косвенной адресации. Ниже приводится пример, в котором подпрограмма находит сумму элементов массива. Параметр n – число элементов в массиве – передаётся по значению, а адрес массива и результат в виде суммы – по адресу. Распределение параметров в фрейме подпрограммы смотрите в следующей таблице:

структура фрейма стека

смещение элемента от [BP] содержимое слова
. . . . . . . . . . . .
+8 значение n
+6 базовый адрес X
+4 адрес sum
+2 IP возврата
сохранённый BP
-2 сохранённый AX
-4 сохранённый BX
-6 сохранённый CX
-8 сохранённый DX
-10 сохранённый SI
. . . . . . . . . . . .

; пример программы с подпрограммой

mycode segment para

mov ax,seg mydate

; подготовка списка параметров

Источник: poznayka.org

Примеры программ с подпрограммами

Приведем примеры организации программ с подпрограммами.

Пример 4. Определить в матрице все элементы, которые являются числами Фибоначчи, и переписать их в одномерный массив. Полученный массив упорядочить по возрастанию.

Числа Фибоначчи образуются по следующему правилу: f0=1, f1=1, fi =fi-2 +fi-1 (i≥2).

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

Для проверки правильности выполнения отдельных этапов алгоритма выведем получаемый массив чисел Фибоначчи до его упорядочения и после упорядочения. В этом случае целесообразным является составить процедуру вывода элементов одномерного массива, так как это действие приходится осуществлять дважды. Для придания программе большей универсальности будем использовать динамические массивы.

Проверку заданного числа на число Фибоначчи будем проводить путем последовательного сравнения этого числа со всеми числами Фибоначчи, начиная с 1. Процесс сравнения заканчивается в том случае, если заданное число оказалось числом Фибоначчи или если очередное число Фибоначчи превысило заданное число.

Для упорядочения чисел используется алгоритм “пузырьковой сортировки”.

  1. uses
  2. SysUtils;
  3. type
  4. matr=array of array of Integer;
  5. mas=array of Integer;
  6. var
  7. a:matr; b:mas;
  8. m,n,i,j,k:Integer;
  9. //Функция, определяющая, является ли заданное число
  10. //числом Фибоначчи
  11. function Fib(a:Integer):Boolean;
  12. var
  13. f0,f1,f2:Integer;
  14. begin
  15. Result:=False;
  16. f1:=0;f2:=1;
  17. repeat
  18. f0:=f1;
  19. f1:=f2;
  20. f2:=f0+f1;
  21. if a=f2 then Result:=True
  22. until Result or(f2>=a);
  23. end; //конец функцииFib
  24. //Процедура упорядочения элементов одномерного массива
  25. //по возрастанию
  26. procedure Upor(var b:mas);
  27. var
  28. i,k,c,n:Integer;
  29. pr:boolean;
  30. begin
  31. n:=High(b);
  32. k:=0;
  33. repeat
  34. k:=k+1;
  35. pr:=True;
  36. for i:=0 to n-k do
  37. if b[i]>b[i+1] then
  38. begin
  39. c:=b[i];
  40. b[i]:=b[i+1];
  41. b[i+1]:=c;
  42. pr:=False;
  43. end;
  44. until pr;
  45. end; //конец процедуры Upor
  46. //Процедура вывода элементов одномерного массива
  47. procedure Wiwod(const b:mas);
  48. var
  49. i:Integer;
  50. begin
  51. for i:=0 to High(b) do
  52. Write(b[i]:4);
  53. WriteLn;
  54. end; //конец процедуры Wiwod
  55. begin //РАЗДЕЛ ОПЕРАТОРОВ
  56. WriteLn(‘Введите количество строк и столбцов’);
  57. ReadLn(m,n);
  58. SetLength(a,m,n);
  59. Writeln(‘Введите матрицу по строкам’);
  60. for i:=0 to m-1 do
  61. begin
  62. for j:=0 to n-1 do
  63. Read(a[i,j]);
  64. ReadLn;
  65. end;
  66. WriteLn(‘Исходная матрица’);
  67. for i:=0 to m-1 do
  68. begin
  69. for j:=0 to n-1 do
  70. Write(a[i,j]:4);
  71. WriteLn;
  72. end;
  73. k:=0;
  74. for i:=0 to m-1 do
  75. for j:=0 to n-1 do
  76. if Fib(a[i,j]) then
  77. begin
  78. k:=k+1;
  79. SetLength(b,k);
  80. b[k-1]:=a[i,j];
  81. end;
  82. if k=0 then
  83. WriteLn(‘В матрице нет чисел Фибоначчи’)
  84. else
  85. begin
  86. WriteLn(‘Массив чисел Фибоначчи’);
  87. Wiwod(b);
  88. Upor(b);
  89. WriteLn(‘Упорядоченный массив чисел Фибоначчи’);
  90. Wiwod(b);
  91. end;
  92. ReadLn;
  93. end.
  1. program funprost;
  2. uses
  3. SysUtils;
  4. const
  5. mm=10; nn=12;
  6. type
  7. matr=array[1..mm,1..nn] of Integer;
  8. mas=array[1..mm] of Integer;
  9. var
  10. a:matr; i,j,m,n:Integer;
  11. b:mas; pr:boolean;
  12. function Pros(a:Integer):Boolean;
  13. var
  14. i:Integer;
  15. begin
  16. i:=2;
  17. Result:=True;
  18. while Result and (i <=Sqrt(a)) do
  19. if a mod i=0 then
  20. Result:=False
  21. else
  22. i:=i+1;
  23. end; //конец функции Pros
  24. begin//РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
  25. WriteLn(‘Введите количество строк и столбцов матрицы’);
  26. ReadLn(m,n);
  27. SetLength(a,m,n);
  28. WriteLn(‘Введите матрицу по строкам’);
  29. for i:=1 to m do
  30. begin
  31. for j:=1 to n do
  32. Read(a[i,j]);
  33. ReadLn;
  34. end;
  35. for i:=1 to m do
  36. begin
  37. j:=1;
  38. pr:=False;
  39. while(j <=n) and not pr do
  40. begin
  41. pr:= Pros(a[i,j]);
  42. if not pr then j:=j+1;
  43. end;
  44. if pr then b[i]:=a[i,j]
  45. else b[i]:=0;
  46. end;
  47. WriteLn(‘Исходная матрица’);
  48. for i:=1 to m do
  49. begin
  50. for j:=1 to n do
  51. Write(a[i,j]:4);
  52. WriteLn;
  53. end;
  54. WriteLn(‘Полученный массив’);
  55. for i:=1 to m do
  56. Write(b[i]:4);
  57. ReadLn;
  58. end.
  1. program Proc_sam_pol;
  2. uses
  3. SysUtils;
  4. const
  5. mm=12;nn=15;
  6. type
  7. matr=array[1..mm,1..nn] of Real;
  8. var
  9. w:matr;
  10. i,j,m,n:Integer;
  11. procedure Wiwod(a:matr;m,n:Integer);
  12. var
  13. i,j:Integer;
  14. begin
  15. for i:=1 to m do
  16. begin
  17. for j:=1 to n do
  18. Write(a[i,j]:6:1,’ ‘);
  19. WriteLn;
  20. end;
  21. end;
  22. procedure Samen(var a:matr;m,n:Integer);
  23. var
  24. i,j,jpol,l:Integer;
  25. Min:Real;
  26. begin
  27. for i:=1 to m do
  28. begin
  29. jpol:=0;
  30. for j:=1 to n do
  31. begin
  32. if a[i,j]>0 then
  33. begin
  34. Min:=a[i,jpol+1];
  35. for l:=jpol+1 to j-1 do
  36. if a[i,l]
  37. if Min
  38. jpol:=j;
  39. end;
  40. end;
  41. end;
  42. end;
  43. begin//РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
  44. WriteLn(Rus(‘Введите количество строк и столбцов матрицы’));
  45. ReadLn(m,n);
  46. WriteLn(Rus(‘Введите матрицу по строкам’));
  47. for i:=1 to m do
  48. begin
  49. for j:=1 to n do
  50. Read(w[i,j]);
  51. ReadLn;
  52. end;
  53. WriteLn(Rus(‘Исходная матрица’));
  54. Wiwod(w,m,n);
  55. Samen(w,m,n);
  56. WriteLn(Rus(‘Преобразованная матрица’));
  57. Wiwod(w,m,n);
  58. ReadLn;
  59. end.
Читайте также:
В какой программе создать грамоту

Источник: studfile.net

Пример программы с использованием подпрограмм

Задан двумерный массив целых чисел. Определить количество четных чисел в массиве.

Составим процедуру ввода элементов массива;

функцию подсчета количества четных чисел;

процедуру вывода двумерного массива в виде матрицы.

  1. Таблица идентификаторов
Наименование переменной Обозначения в программе
Имя массива a
Количество строк n
Количество столбцов m
Индексы массива I,j
  1. Листинг программы.

mas=array[1..10,1..10] of integer;

procedure input_mas(n,m:integer; var a:mas);

for j:=1 to n do readln(a[i,j]);

function kol(n,m:integer; a:mas):integer;

if not odd(a[ i,j ]) then k:=k+1;

procedure print_mas(n,m:integer; a:mas);

for j:=1 to n do write(a[i,j],‘ ‘);

writeln(‘Введите элементы массива по строкам’);

writeln(‘Количество нечетных чисел =’,kol(n,m,a));

Вопросы для самоконтроля

  1. В каких случаях прибегают к построению подпрограмм?
  2. В каком месте программы располагаются функции или процедуры?
  3. Что такое процедура?
  4. Какова структура процедуры?
  5. Как передается информация в процедуру?
  6. Каким образом возвращаются результаты работы процедуры в основную программу?
  7. Какое соответствие должно быть между формальными и фактическими параметрами?
  8. Какие переменные называются глобальными? Время существования глобальных переменных?
  9. Какие переменные называются локальными? Время существования локальных переменных?
  10. Когда используют директиву forward?
  11. В каких случаях целесообразно прибегать к построению функций?
  12. Как передается информация в функцию?
  13. Каким образом возвращается результат работы функции в основную программу?

Методические указания для выполнения практического задания №9. «Подпрограммы»

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

Задание:

1. В приложении 10 выбрать свой вариант задания.

2. Выполнить практическое задание №9, используя пример программы с использованием подпрограмм

3. Составить блок-схему алгоритма.

4. Написать программу и отладить ее по заранее подготовленному тесту.

5. Оформить задание в тетради для практических работ.

6. Результат выполнения программы предъявить преподавателю.

7. Ответить на вопросы самоконтроля.

8. Защитить выполненную работу у преподавателя.

Приложение 10. Таблица вариантов заданий

Составить программу с использованием процедуры и функции
Вариант Задание
В данной действительной матрице размером n*m поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что эти элементы единственны.
Дана действительная матрица размером n*m, все элементы которой различны. В каждой строке выбирается элемент с наибольшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением.
Дана целочисленная матрица размером n*m. Написать программу, формирующую двумерный массив по следующему правилу: элементы первой строки – в порядке возрастания индексов столбцов, элементы второй строки – в порядке убывания индексов столбцов и т. д.
Дана действительная матрица размером n*m. Найти среднее арифметическое каждого из столбцов, имеющих четные номера.
Дана действительная матрица размером n*m. Все элементы с наибольшим значением заменить нулями (таких элементов может быть несколько).
Дана целочисленная матрица размером n*m. Написать программу, позволяющую находить сумму наибольших значений элементов ее строк.
Дана целочисленная квадратная матрица размером n*m. Написать программу, формирующую два одномерных массива. В один переслать по строкам верхний треугольник матрицы, включая элементы главной диагонали, в другой – нижний треугольник. Полученные массивы распечатать.
Дана целочисленная квадратная матрица размером n*m. Написать программу, позволяющую исключать из нее столбец, в котором расположен минимальный элемент главной диагонали.
Дана целочисленная квадратная матрица размером n*m. Написать программу, позволяющую поменять местами элементы, расположенные в верхней и нижней четвертях, ограниченные главной и побочной диагоналями (за исключением элементов, расположенных на диагоналях).
Задана действительная матрица размером n*m. Написать программу, позволяющую заменить все элементы, наименьшие в строке, на нули.
Задана целочисленная матрица размером n*m. Написать программу, позволяющую находить строки с наименьшей и наибольшей суммой и выводить их на печать.
Задана целочисленная квадратная матрица размером n*n. Написать программу, преобразующую исходную матрицу по правилу: начетные столбцы разделить на среднее значение диагональных элементов матрицы, а четные оставить без изменения.
Задана действительная квадратная матрица размером n*n. Вычислить сумму тех из ее элементов, расположенных на главной диагонали и выше ее, которые превосходят по величине все элементы, расположенные ниже главной диагонали. Если таких элементов нет, то ответом должно служить сообщение об этом.
Задана целочисленная квадратная матрица размером n*n (n – чётное). Написать программу, позволяющую менять местами элементы первой и второй строк, элементы третьей и четвертой строк и т.д.
Даны две действительные квадратные матрицы размером n*n. Получить новую матрицу, прибавлением к элементам каждого столбца первой матрицы, произведения элементов соответствующих строк второй матрицы.
Даны две действительные квадратные матрицы размером n*n. Получить новую матрицу умножением элементов каждой строки первой матрицы на наибольшее из значений элементов соответствующей строки второй матрицы.
Дана целочисленная квадратная матрица размером n*n. Найти номера строк, все элементы которых – нули.
Задан массив из целых чисел размером n и число L. Написать программу, формирующую из него матрицу, содержащую по L элементов в строке. Недостающие элементы заполнить нулями.
Дана целочисленная матрица размером n*m (m – чётное). Написать программу, позволяющую менять местами элементы первого и последнего столбцов, элементы второго и (n-1)-го столбцов и т. д. до среднего столбца (n – нечётно).
Дана действительная квадратная матрица размером n*n (n – чётное), все элементы которой различны. Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении с этими диагоналями.
Дана целочисленная матрица размером n*m. Найти максимальный по модулю элемент среди отрицательных элементов нечетных столбцов.
Дана целочисленная матрица размером n*m и число K. Написать программу, переставляющую строки и столбцы таким образом, чтобы максимальный по модулю элемент был расположен на пересечении K-ой строки и K-го столбца.
Дана действительная матрица размером n*m. Все элементы с наибольшим значением заменить нулями (таких элементов может быть несколько).
Дана целочисленная матрица размером n*m. Написать программу, формирующую двумерный массив по следующему правилу: элементы первой строки – в порядке возрастания индексов столбцов, элементы второй строки – в порядке убывания индексов столбцов и т. д.
Дана целочисленная квадратная матрица размером n*n. Написать программу, позволяющую исключать из нее столбец, в котором расположен минимальный элемент главной диагонали.
В данной действительной матрице размером n*m обнулить все отрицательные элементы. Подсчитать, количество обнуленных элементов.
Дана целочисленная квадратная матрица размером n*n. Найти номера строк, все элементы которых отрицательны.
Задана целочисленная квадратная матрица размером n*n (n — четное). Написать программу, позволяющую менять местами элементы первой и последней строк, второй и предпоследней строк и т. д.
Задана целочисленная матрица размером n*m. Написать программу, позволяющую находить строки с наименьшим и наибольшим произведением элементов. Вывести на печать номера этих строк.
Даны две действительные квадратные матрицы размером n*n. Получить новую матрицу умножением элементов каждой строки первой матрицы на наименьшее из значений элементов соответствующей строки второй матрицы.
Читайте также:
Как выглядит программа криптопро на рабочем столе

Источник: studopedia.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru