Не имея четко сформулированной методологии разработки программного обеспечения, программисты столкнулись с огромной беспорядочностью и ошибками в своих программах, трудностями их чтения и понимания. Тогда и появился термин «спагетти-код». Этот код крайне сложен в обслуживании и развитии и имеет много операторов безусловного перехода go to.
Чтобы избежать этого, известный голландский специалист Эдсгер Дейкстра опубликовал статью «Доводы против оператора GO TO». Цитата из этой статьи: «Оператор go to сам по себе просто слишком примитивен; он создает слишком сильное побуждение внести путаницу в программу» [2].
С этого момента и началось развитие структурного программирования, в основе которого лежали следующие принципы:
«Я считаю, что программа никогда не является самоцелью; программа предназначается для того, чтобы вызвать вычисления, а цель вычислений - получить нужный результат... Я утверждаю (хотя и не могу доказать), что легкость и гибкость таких наших суждений существенно зависит от простоты взаимосвязей между программой и вычислениями... Грубо говоря, можно считать желательным, чтобы структура программы отражалась в структуре вычислений» - из «Заметок по структурному программированию» [3].
Простой пример структурного программирования с использованием базовых конструкций:
Найдите наибольшую цифру данного натурального числа.
int main()
{
int n;
cout<<"input n: "; cin>>n;
if (n<=0)
cout<<"error n"<<endl;
else
{
int max=0;
while (n>0)
{
if ((n%10)>max)
max=n%10;
n/=10;
}
cout<<"answer: "<<max<<endl;
}
return 0;
}
Достоинства структурного программирования:
1. Уменьшение трудностей тестирования и отладки;
2. Повышение производительности программистов;
3. Помощь разработчику наметить путь решения задачи, представить алгоритм и писать программу согласно определенной схеме;
4. Повышение ясности и удобочитаемости программ, что позволяет работать с ними не только автору, но и другим программистам;
5. Увеличение уровня надежности
Модульное программирование тесно связано со структурным и используется при разработке больших программ - группа программистов, работающих над одним проектом, могут параллельно друг от друга писать отдельные блоки (модули), которые в совокупности и будут представлять одну большую и сложную программу.
Характеристики модуля:
Впервые специализированная синтаксическая конструкция модуля была предложена Н. Виртом в 1975 г. и включена в его новый язык Modula.
Типичный пример модуля - определение стека. Здесь необходимо решить следующие задачи:
1. Предоставить пользователю интерфейс для стека (например,
функции
push () и pop ()).
2. Гарантировать, что представление стека (например, в виде
массива
элементов) будет доступно лишь через интерфейс
пользователя.
3. Обеспечивать инициализацию стека перед первым его использованием.
Ниже
представлен на С возможный внешний интерфейс
модуля, реализующего стек:
// описание интерфейса для модуля, реализующего стек символов:
void push ( char );
char pop ();
const int stack_size = 100;
Допустим, что описание
интерфейса находится в файле stack.h, тогда
реализацию стека можно определить следующим
образом:
#include
"stack.h"
// используем интерфейс стека
static char v [ stack_size ]; // ``static'' означает локальный
// в данном файле/модуле
static char * p =
v; // стек вначале пуст
void push ( char c )
{
//проверить на переполнение и поместить в стек
}
char pop ()
{
//проверить, не пуст ли стек, и считать из него
}
Вполне возможно, что
реализация стека может измениться, например, если
использовать для хранения связанный список.
Пользователь в любом случае не
имеет непосредственного доступа к реализации: v
и p - статические
переменные, т.е. переменные локальные в том
модуле (файле), в котором они
описаны. Использовать стек можно так:
#include
"stack.h" // используем интерфейс
стека
void some_function ()
{
push ( 'c' );
char c = pop ();
if ( c != 'c' ) error (
"невозможно" );
}
Преимущества модульного программирования:
1. Упрощение разработки программы для группы специалистов;
2. Возможность корректировки модуля, не затрагивая остальную систему;
3. Уменьшение времени перекомпиляции при внесении изменений;
4. Уменьшение объема занимаемой памяти программы за счет сокращения количества повторений кода.
Таким образом, использование методов структурного и модульного программирования помогает успешно решить задачу любой сложности, повысить эффективность и мобильность работы программы.
Список литературы
1. Бьерн Страуструп. Язык программирования С++[Текст] / 2-е изд., перераб. и доп. - М.: БИНОМ, 2004. - 369 с.
2.
Communications of the ACM, Vol. 11, No. 3,
March 1968, pp. 147-148.
Copyright (c) 1968, Association for Computing Machinery, Inc. [Текст]
3. Дейкстра Э. Структурное программирование [Текст] / Дал У., Дейкстра Э., Хоор К. - М.:"Мир", 1975. - с.7 - 97
4. https://ru.wikipedia.org [Электронный ресурс]
5. http://www.feip.ru [Электронный ресурс]