Структурное программирование

 

А. Пакетирование структур Б. Вложение структур
 
 

 
 

 

Рисунок 1.1 Пакетирование и вложение структур

 

Структура выбора в языке C++ реализуется одной из трёх инструкций, графическое представление которых приведено на рис. 1.2.

 

Инструкция if…

Инструкция if…..else

 

 


 

Инструкция оператора switch

Рисунок 1.2 Инструкции выбора в языке C++

В языке C++ также имеется и три инструкции повторения, графическое представление которых показано на рис. 1.3.

 

 


Инструкция while

 

 
 

 

 


Инструкция do / while

 

 

 

 

 


Инструкция for

4.5. Примеры решения задач с использованием основных операторов C++

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

Когда компьютер зависает, делается перерыв, после которого все написанное стирается, и все повторяется заново. Периодически высказываются сомнения в правильности работы компилятора, компьютера и операционной системы. Когда программа доходит до стадии выполнения, в нее вводятся произвольные значения, после чего экран становится объектом пристального удивленного изучения. «Работает» такая программа обычно только в бережных руках хозяина на одном наборе данных, а внесение в нее изменений может привести автора к потере веры в себя и ненависти к процессу программирования.

Ваша задача состоит в том, чтобы научиться подходить к программированию профессионально. В конце концов, профессионал отличается тем, что может достаточно точно оценить, сколько времени у него займет написание программы, которая будет работать в полном соответствии с поставленной задачей. Кроме «ума, вкуса и терпения», для этого требуется опыт, а также знание основных принципов, выработанных программистами в течение более, чем полувека развития этой дисциплины. Даже к написанию самых простых программ нужно подходить последовательно, соблюдая определенную дисциплину» [3].

Решение задач по программированию предполагает ряд этапов:

1. Разработка математической модели. На этом этапе определяются исходные данные и результаты решения задачи, а также математические формулы, с помощью которых можно перейти от исходных данных к конечному результату.

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

3. Запись программы на некотором языке программирования. На этом этапе каждому шагу алгоритма ставится в соответствие конструкция выбранного алгоритмического языка.

4. Выполнение программы (исходный модуль → компилятор → объектный модуль → компоновщик → исполняемый модуль)

5. Тестирование и отладка программы. При выполнении программы могут возникнуть ошибки 3 типов:

а) синтаксические – исправляются на этапе компиляции;

б) ошибки исполнения программы (деление на 0, логарифм от отрицательного числа и т.п.) – исправляются при выполнении программы;

в) семантические (логические) ошибки – появляются из-за неправильно понятой задачи, неправильно составленного алгоритма.

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

Для определения достаточного количества тестов существует два подхода. При первом подходе программа рассматривается как «черный ящик», в который передают исходные данные и получают результаты.

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

1) тестирование классов входных данных, т.е. набор тестов должен содержать по одному представителю каждого класса данных:

X= 0 1 0 1 –1 1 –1

Y= 0 1 1 0 1 –1 –1

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

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

1) тестирование команд. Набор тестов должен обеспечивать прохождение каждой команды не менее одного раза.

2) тестирование ветвей. Набор тестов в совокупности должен обеспечивать прохождение каждой ветви не менее одного раза. Это самый распространенный критерий в практике программирования.