Представление о структурном программировании



Лабораторная работа № 4. Разработка программ. Метод пошаговой детализации. Представление о структурном и модульном программировании

Метод пошаговой детализации

 

Предыдущие три раздела были посвящены материалу, который вам, хотя бы отчасти, уже знаком. М-функции фактически являются подпрограммами, знакомыми, например, по Фортрану. Операторы цикла и условные операторы примерно одинаково выглядят в любом языке программирования. Сложность заключается не в том, чтобы выучить эти конструкции языка программирования – их не так много. Гораздо труднее научиться составлять из этих конструкций работающие программы.

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

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

 

Прежде всего, надо четко сформулировать поставленную задачу. Берете чистый лист бумаги и пишете вверху:

 

Решить систему n линейных уравнений Ax= b.

 

Задача сформулирована четко, но как ее решать, по-прежнему непонятно. Попытаемся разбить эту задачу на несколько подзадач. В методе Гаусса напрашивается следующее разбиение:

 

Решить систему n линейных уравнений Ax= b.

  1. Привести систему к треугольному виду
  2. Решить треугольную систему

 

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

Сосредоточимся на первой из них и попробуем и ее разбить на более простые подзадачи:

 

Решить систему n линейных уравнений Ax= b.

  1. Привести систему к треугольному виду

Для i=1,2,… ,n-1

       Исключить  из уравнений i+1, i+2,…, n

Конец цикла по i

  1. Решить треугольную систему

 

Задача: Исключить  из уравнений i+1, i+2,…, n уже значительно проще задач, с которых мы начинали, но, пожалуй, неплохо будет продолжить детализацию:

 

 

Решить систему n линейных уравнений Ax= b.

  1. Привести систему к треугольному виду

Для i=1,2,…, n-1

       Исключить  из уравнений i+1, i+2,…, n:

                   Для j=i+1,…,n

                              Исключить  из j-го уравнения

              Конец цикла по j

Конец цикла по i

  1. Решить треугольную систему

 

На этом детализацию можно было бы уже закончить, но если задача «Исключить  из j-го уравнения» вам кажется не совсем понятной, то и ее следует разбить на более элементарные шаги:

 

Решить систему n линейных уравнений Ax= b.

  1. Привести систему к треугольному виду

Для i=1,2,…, n-1

       Исключить  из уравнений i+1, i+2,…, n:

                   Для j= i+1,…, n

                              Исключить  из j-го уравнения:

                                          Вычислить коэффициент

                                          Вычесть из j-й строки i-ю строку, умноженную на c

                                          Вычесть из  число

              Конец цикла по j

Конец цикла по i

  1. Решить треугольную систему

 

Теперь первая подзадача детализирована настолько подробно, что написать операторы MATLAB’а, соответствующие каждой строчке составленного плана, не составит труда.

 

Аналогичным образом детализируется вторая подзадача. Окончательный план программы может выглядеть примерно так:

 

  1. Привести систему к треугольному виду

Для i=1,2,…, n-1

       Исключить  из уравнений i+1, i+2,…, n:

                   Для j= i+1,…, n

                              Исключить  из j-го уравнения:

                                          Вычислить коэффициент

                                          Вычесть из j-й строки i-ю строку, умноженную на c

                                          Вычесть из  число

              Конец цикла по j

Конец цикла по i

  1. Решить треугольную систему

Найти

Для i= n-1, n-2,…,1

       Вычислить

Конец цикла по i

 

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

Насколько подробной должна быть детализация? Это зависит только от вас. Как только вы почувствовали, что четко представляете, как перевести каждую строчку вашего плана на язык MATLAB’а, – заканчивайте детализацию и переходите к написанию программы.

 

 

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

Откройте встроенный редактор MATLAB’а. Сначала следует записать заголовок функции и заголовочные комментарии:

 

 

 

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

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

В результате файл с программой будет иметь примерно такой вид:

 

function x=gauss(n,A,b)

% Решение системы линейных уравнений по методу Гаусса

% Входные параметры:

% n - количество уравнений,

% A - матрица системы,

% b - вектор правых частей.

% Выход:

% x - вектор решения

 

% 1. Приведение системы к треугольному виду

 

for i=1:n-1 % Для i=1,2,...,n-1

for j=i+1:n % Для j=i+1,...,n

   c = A(j,i)/A(i,i); % Вычислить коэффициент с=A(j,i)/A(i,i)

   A(j,:) = A(j,:) - c*A(i,:);

                % Вычесть из j-й строки i-ю строку, умноженную на с

   b(j) = b(j) - c*b(i); % Вычесть из b(j) число c*b(i)

end % Конец цикла по j

end % Конец цикла по i

 

% 2. Решение треугольной системы

   

x(n) = b(n)/A(n,n); % Найти x(n) = b(n)/A(n,n)

for i=n-1:-1:1 % Для i=n-1,n-2,...,1

x(i) = (b(i) - sum(A(i,i+1:n).*x(i+1:n)))/A(i,i); % Вычислить x(i)

end % Конец цикла по i

 

Стоит ли оставлять все эти комментарии? Решать, прежде всего, вам – как вам удобнее. Однако приведу некоторые рецепты, проверенные временем:

1) Используйте заголовочные комментарии, в которых указывается назначение программы, описываются входные и выходные параметры;

2) Комментарии должны пояснять операторы программы, а не повторять их;

3) Количество строк комментариев в самом тексте программы бывает различным, но обычно одна строка комментариев приходится на 5-10 строк программы.

 

Я бы, например, предпочел следующую окончательную редакцию этого программного файла:

 

function x=gauss(n,A,b)

% Решение системы линейных уравнений по методу Гаусса

% Входные параметры:

% n - количество уравнений,

% A - матрица системы,

% b - вектор правых частей.

% Выход:

% x - вектор решения

 

% 1. Приведение системы к треугольному виду

 

for i=1:n-1

for j=i+1:n

   c = A(j,i)/A(i,i);

   A(j,:) = A(j,:) - c*A(i,:);

   b(j) = b(j) - c*b(i);

end

end

 

% 2. Решение треугольной системы

   

x(n) = b(n)/A(n,n);

for i=n-1:-1:1

x(i) = (b(i) - sum(A(i,i+1:n).*x(i+1:n)))/A(i,i);

end

 

Наконец, последнее замечание. Последнее по порядку, но не по значимости (last but not least). Вы, наверное, обратили внимание, что в этом примере строчки начинаются не с одной позиции, а располагаются уступами. Благодаря этому структура программы становится более понятной, хорошо видно, где начинается и где кончается каждый цикл. Также для повышения наглядности бывает полезно вставить пустую строку между отдельными частями программы.

Хотя эти советы могут показаться незначительными мелочами, пренебрегать ими не следует. Затратив совсем немного труда для повышения наглядности программы, вы сэкономите массу времени на ее отладке. Учтите, что все эти рекомендации не выдумка автора, а результат опыта нескольких поколений программистов. Не стоит без необходимости выдумывать свой собственный стиль программирования и стараться быть оригинальным. Оригинальность, конечно, хорошее качество, но… Если большинство людей одевают левый ботинок на левую ногу, а правый на правую, то может быть они в чем-то правы.

 

 

Представление о структурном программировании

 

Первая электронно-вычислительная машина ENIAC начала работать в 1947 году. Если учесть, что и до ЭВМ существовали механические и электро-механические вычислительные устройства, то можно сделать вывод, что программирование – составление программ для вычислительных устройств – имеет довольно давнюю историю.

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

Важным шагом на этом пути превращения программирования из искусства в ремесло была концепция структурного программирования, предложенная в 60-х годах ХХ-го века. Согласно этой концепции любая программа может быть составлена с помощью всего трех программных структур:

 

1) последовательное выполнение операций;

2) ветвление (выбор из двух альтернатив на основании проверки условия

3) цикл (многократное выполнение операции, пока выполняется некоторое условии)


Обоснованием этой концепции послужила теорема сформулированная итальянскими математиками К. Бомом и Дж. Якопини в 1966 году:

Любую схему алгоритма можно представить в виде композиции вложенных блоков begin и end, условных операторов if, then, else, циклов с предусловием (while) и может быть дополнительных логических переменных (флагов)

 

На первый взгляд данная информация представляет лишь исторический интерес. Ведь операторы языка MATLAB’а, рассмотренные в предыдущей работе как раз и представляют эти структуры (Операторы switch и for, как легко проверить, несложно воспроизвести, используя три основные структуры). Таким образом, сам язык программирования навязывает программисту использование базовых структур.

Однако именно применение только трех базовых структур и является обоснованием рассмотренной выше методики пошаговой детализации (или, как нередко говорят, программирования сверху вниз).

Те из вас, кто начинал изучение программирование с FORTRAN’а, помнят о таком операторе как GO TO. Этот оператор вызывает переход управления программой в любое место программы. На следующем рисунке показано, как, примерно, может выглядеть фрагмент программы использующей этот оператор.

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

 

В наши дни большинство современных языков программирования просто не допускают средств, отличных от трех базовых структур. Программируя в MATLAB’е, мы не можем воспользоваться оператором GO TO, поскольку его в MATLAB’е попросту нет.

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

 


Дата добавления: 2018-11-24; просмотров: 261; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!