Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Подпрограммы.doc
Скачиваний:
25
Добавлен:
09.02.2015
Размер:
369.15 Кб
Скачать

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

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

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

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

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

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

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

program Procfib;

  1. {$APPTYPE CONSOLE}

  2. uses

  3. SysUtils;

  4. type

  5. matr=array of array of Integer;

  6. mas=array of Integer;

  7. var

  8. a:matr; b:mas;

  9. m,n,i,j,k:Integer;

  10. //Функция, определяющая, является ли заданное число

  11. //числом Фибоначчи

  12. function Fib(a:Integer):Boolean;

  13. var

  14. f0,f1,f2:Integer;

  15. begin

  16. Result:=False;

  17. f1:=0;f2:=1;

  18. repeat

  19. f0:=f1;

  20. f1:=f2;

  21. f2:=f0+f1;

  22. if a=f2 then Result:=True

  23. until Result or(f2>=a);

  24. end; //конец функцииFib

  25. //Процедура упорядочения элементов одномерного массива

  26. //по возрастанию

  27. procedure Upor(var b:mas);

  28. var

  29. i,k,c,n:Integer;

  30. pr:boolean;

  31. begin

  32. n:=High(b);

  33. k:=0;

  34. repeat

  35. k:=k+1;

  36. pr:=True;

  37. for i:=0 to n-k do

  38. if b[i]>b[i+1] then

  39. begin

  40. c:=b[i];

  41. b[i]:=b[i+1];

  42. b[i+1]:=c;

  43. pr:=False;

  44. end;

  45. until pr;

  46. end; //конец процедуры Upor

  47. //Процедура вывода элементов одномерного массива

  48. procedure Wiwod(const b:mas);

  49. var

  50. i:Integer;

  51. begin

  52. for i:=0 to High(b) do

  53. Write(b[i]:4);

  54. WriteLn;

  55. end; //конец процедуры Wiwod

  56. begin //РАЗДЕЛ ОПЕРАТОРОВ

  57. WriteLn('Введите количество строк и столбцов');

  58. ReadLn(m,n);

  59. SetLength(a,m,n);

  60. Writeln('Введите матрицу по строкам');

  61. for i:=0 to m-1 do

  62. begin

  63. for j:=0 to n-1 do

  64. Read(a[i,j]);

  65. ReadLn;

  66. end;

  67. WriteLn('Исходная матрица');

  68. for i:=0 to m-1 do

  69. begin

  70. for j:=0 to n-1 do

  71. Write(a[i,j]:4);

  72. WriteLn;

  73. end;

  74. k:=0;

  75. for i:=0 to m-1 do

  76. for j:=0 to n-1 do

  77. if Fib(a[i,j]) then

  78. begin

  79. k:=k+1;

  80. SetLength(b,k);

  81. b[k-1]:=a[i,j];

  82. end;

  83. if k=0 then

  84. WriteLn('В матрице нет чисел Фибоначчи')

  85. else

  86. begin

  87. WriteLn('Массив чисел Фибоначчи');

  88. Wiwod(b);

  89. Upor(b);

  90. WriteLn('Упорядоченный массив чисел Фибоначчи');

  91. Wiwod(b);

  92. end;

  93. ReadLn;

  94. end.

Пример 5. Определить в каждой строке матрицы A(m,n), m<=10, n<=12, первое по порядку простое число и занести его в одномерный массив. Если в строке нет простых чисел, то для этой строки занести в массив нулевой элемент.

Поскольку максимальные размеры матрицы заданы в условии, то в программе целесообразно использовать статические массивы. Определение вида числа (простое или нет) произведем в подпрограмме-функции, которая возвращает значение “истина”, если число простое, и “ложь” в противном случае.

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

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

  1. program funprost;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. const

  6. mm=10; nn=12;

  7. type

  8. matr=array[1..mm,1..nn] of Integer;

  9. mas=array[1..mm] of Integer;

  10. var

  11. a:matr; i,j,m,n:Integer;

  12. b:mas; pr:boolean;

  13. function Pros(a:Integer):Boolean;

  14. var

  15. i:Integer;

  16. begin

  17. i:=2;

  18. Result:=True;

  19. while Result and (i<=Sqrt(a)) do

  20. if a mod i=0 then

  21. Result:=False

  22. else

  23. i:=i+1;

  24. end; //конец функции Pros

  25. begin//РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  26. WriteLn('Введите количество строк и столбцов матрицы');

  27. ReadLn(m,n);

  28. SetLength(a,m,n);

  29. WriteLn('Введите матрицу по строкам');

  30. for i:=1 to m do

  31. begin

  32. for j:=1 to n do

  33. Read(a[i,j]);

  34. ReadLn;

  35. end;

  36. for i:=1 to m do

  37. begin

  38. j:=1;

  39. pr:=False;

  40. while(j<=n) and not pr do

  41. begin

  42. pr:= Pros(a[i,j]);

  43. if not pr then j:=j+1;

  44. end;

  45. if pr then b[i]:=a[i,j]

  46. else b[i]:=0;

  47. end;

  48. WriteLn('Исходная матрица');

  49. for i:=1 to m do

  50. begin

  51. for j:=1 to n do

  52. Write(a[i,j]:4);

  53. WriteLn;

  54. end;

  55. WriteLn('Полученный массив');

  56. for i:=1 to m do

  57. Write(b[i]:4);

  58. ReadLn;

  59. end.

Пример 6. Составить процедуру, которая в каждой строке матрицы заменяет каждый положительный элемент минимальным отрицательным элементом из стоящих между предыдущим и текущим положительными элементами. Если положительный элемент стоит на первом месте в строке, то его не изменять. Если отрицательных элементов нет между положительными, то замену не производить.

Использовать составленную процедуру для матрицы W(m,n),m<=12,n<=15.

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

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

  1. program Proc_sam_pol;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. const

  6. mm=12;nn=15;

  7. type

  8. matr=array[1..mm,1..nn] of Real;

  9. var

  10. w:matr;

  11. i,j,m,n:Integer;

  12. procedure Wiwod(a:matr;m,n:Integer);

  13. var

  14. i,j:Integer;

  15. begin

  16. for i:=1 to m do

  17. begin

  18. for j:=1 to n do

  19. Write(a[i,j]:6:1,' ');

  20. WriteLn;

  21. end;

  22. end;

  23. procedure Samen(var a:matr;m,n:Integer);

  24. var

  25. i,j,jpol,l:Integer;

  26. Min:Real;

  27. begin

  28. for i:=1 to m do

  29. begin

  30. jpol:=0;

  31. for j:=1 to n do

  32. begin

  33. if a[i,j]>0 then

  34. begin

  35. Min:=a[i,jpol+1];

  36. for l:=jpol+1 to j-1 do

  37. if a[i,l]<Min then Min:=a[i,l];

  38. if Min<0 then a[i,j]:=Min;

  39. jpol:=j;

  40. end;

  41. end;

  42. end;

  43. end;

  44. begin//РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  45. WriteLn(Rus('Введите количество строк и столбцов матрицы'));

  46. ReadLn(m,n);

  47. WriteLn(Rus('Введите матрицу по строкам'));

  48. for i:=1 to m do

  49. begin

  50. for j:=1 to n do

  51. Read(w[i,j]);

  52. ReadLn;

  53. end;

  54. WriteLn(Rus('Исходная матрица'));

  55. Wiwod(w,m,n);

  56. Samen(w,m,n);

  57. WriteLn(Rus('Преобразованная матрица'));

  58. Wiwod(w,m,n);

  59. ReadLn;

  60. end.

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