Парадигма программирования - это некий набор правил, который определяет стиль написания программ.
Парадигма программирования не определяется однозначно языком программирования: практически все современные языки программирования в той или иной мере допускают использование различных парадигм. Парадигмы программирования могут сочетаться, обогащая инструментарий программиста.
Императивное программирование
1. Императивное программирование – это парадигма программирования, которая описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивный язык должен описывать не столько саму задачу, сколько ее решение.
1.1. Процедурное программирование – это парадигма программирования, основанная на концепции вызова процедуры. Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании. Выполнение программы сводится к последовательному выполнению операторов.
Теоретической моделью процедурного программирования служит абстрактная вычислительная система под названием машина Тьюринга:
В состав машины Тьюринга входит произвольное количество лент, разделенных на ячейки, и управляющее устройство, способное работать в соответствии с заданным алгоритмом. Еще одно графическое представление машины Тьюринга:
Алгоритм описывает правила перехода, которые предписывают машине в зависимости от текущего состояния и наблюдаемого в текущей ячейке символа, записать в эту клетку новый символ, перейти в новое состояние и переместиться на одну клетку влево или вправо. Некоторые состояния могут быть помечены как терминальные и переход в любое из них означает конец алгоритма и остановку работы.
Достоинства процедурного программирования:
- возможность повторного использования одного и того же кода из нескольких мест программы без его копирования;
- возможность отследить поток выполнения программы, нежели в случае использования инструкции GOTO, которая может сделать из большой сложной программы «спагетти-код»;
- возможность поддержки модульности и структурности.
Недостатки процедурного программирования:
- процедурная парадигма была актуальна во времена, когда компьютеры были большими, а программы маленькими. На данном этапе развития информационных технологий одного только разделения программы на процедуры уже недостаточно.
Язык программирования частично ликвидирует разрыв между методами решения различного рода задач человеком и вычислительной машиной. Чем более язык ориентирован на человека, тем выше его уровень.
Языки, относящиеся в том числе к методологии процедурного программирования
Язык Basic (Beginners All-purpose Symbolic Instruction Code — многоцелевой язык символических инструкций для начинающих) представляет собой простой язык программирования, разработанный в 1964 году для использования новичками.
Язык С нашел широкое применение при создании системного и прикладного программного обеспечения, оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования как C++, C#, Java.
Язык Ада (Ada) создан в 1980г. Министерством обороны США для встроенных бортовых систем управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.).
Язык Pascal - один из наиболее известных языков программирования. Используется для обучения программированию в старших классах школы, является базой для других языков. В Паскале реализован ряд концепций, рассматриваемых как основа «дисциплинированного» программирования, и заимствованных впоследствии разработчиками многих языков.
Фортра́н (Fortran) — первый язык программирования высокого уровня, имеющий транслятор.
Транслятор – программа или техническое средство, выполняющее трансляцию программы.
Трансляция программы – это преобразование программы, представленной на одном из языков программирования, в программу на другом языке, равносильную первой.
Транслятор обычно выполняет также диагностику ошибок, выдает для печати тексты программы и т.п. Язык, на котором представлена входная программа, называется исходным языком, а сама программа – исходным кодом. Выходной язык называется целевым языком или объектным кодом.
Кобо́л (COBOL, COmmon Business Oriented Language) – один их старейших языков программирования, предназначенный в первую очередь для разработки бизнес-приложений.
Языки Ada, Basic, С, COBOL, Fortran, Pascal и др. считаются также и структурными языками программирования, поскольку все языки допускают использование различных видов парадигм.
1.2. Структурное программирование – это методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков (модулей).
Разработка программы в структурном программировании ведётся пошагово, методом «сверху вниз». Это позволяет вместо работающих подпрограмм использовать "заглушки", чтобы протестировать работоспособность всей программы в целом. После тестирования заглушку заменяют реальной подпрограммой.
Необходимо стараться писать программу таким образом, чтобы те блоки, из которых она будет состоять, были универсальными: чтобы к ним можно было обращаться несколько раз. Или, что еще лучше, чтобы такой модуль был настолько универсален, что его можно было бы использовать в совершенно другой программе.
Достоинства структурного программирования:
- Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и облегчает понимание ее другими разработчиками;
- В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные – дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов;
- Сильно упрощается процесс тестирования и отладки структурированных программ.
1.3. Объектно-ориентированное программирование – это парадигма программирования, в которой основными концепциями являются понятия:
- Объекты и классы;
- Наследование (Inheritance);
- Инкапсуляция (Encapsulation);
- Полиморфизм (Polymorphism).
Объект в ООП — это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. Объектно-ориентированный подход предлагает описывать системы в виде взаимодействия объектов. Описание в виде объектов позволяет определить различные компоненты системы. Объекты выполняют необходимые действия, передавая друг другу сообщения.
Декларативное программирование
- Декларативное программирование – это парадигма программирования, которая описывает каково нечто, а не как его создать.
2.1.Функциональное программирование – сформировалось, как дань математической направленности при исследовании и развитии искусственного интеллекта и освоении новых горизонтов в информатике. Единственной управляющей конструкцией является вызов функции. В языке, реализующем функциональную парадигму, существует некоторое множество базовых функций, и все другие функции строятся из базовых функций с помощью композиции. Теоретической основой является лямбда-исчисление и теория рекурсивных функций.
На настоящий момент существую сотни функциональных языков программирования, ориентированных на разные классы задач и виды технических средств: Lisp, Haskell и др.
2.2. Логическое программирование – это парадигма программирования, в которой программы пишутся не в виде последовательности инструкций, а в виде множества фактов и правил, а процесс выполнения программы сводится к выводу нужных результатов из этого множества. Концептуально системы логического программирования близки базам данных.
Логическое программирование относится к декларативному программированию, потому что программа на нём скорее описывает свойство задачи, нежели алгоритм её решения.
Наиболее известными языками логического программирования являются Prolog, Mercury.
Чтобы окно консоли не закрывалось, можно дописать команду system (“pause”);
Чтобы использовать русский язык в консоли, нужно добавить строку:
В стандартной реализации языка C++ имеется набор файлов, называемый “стандартная библиотека”.
В стандартной библиотеке есть файл iostream, в котором определяются различные сущности, в том числе объект cout.
В строке #include помещена директива (команда) препроцессора, обеспечивающая включение (include) в программу средств связи со стандартными потоками ввода и вывода данных. Указанные средства находятся в файле с именем iostream.h (мнемоника: “i” (input) – ввод, “o” (output) – вывод, stream – поток, “h” (head) – заголовок). Стандартным потоком вывода по умолчанию считается вывод на экран дисплея. Стандартный поток ввода обеспечивает чтение данных от клавиатуры.
Чтобы каждый раз не дописывать std::, можно поместить директиву using в верхнюю часть cpp-файла:
Четвертая строка является заголовком функции с именем main(). Любая программа на языке C++ должна включать одну и только одну функцию с этим именем. Именно с нее всегда начинается выполнение программы. Перед именем main() помещено служебное слово void – спецификатор типа, указывающий, что функция main() в данной программе не возвращает никакого значения. Круглые скобки после main() требуются в соответствии с форматом (синтаксисом) заголовка любой функции. В них помещается список параметров. В этом примере параметры не нужны, и список пуст.
Тело функции – это последовательность описаний, определений и операторов. Тело функции должно быть заключено в фигурные скобки:
Рекомендуется выделять целую строку для фигурной скобки, чтобы повысить удобочитаемость программы:
Точка с запятой заканчивает инструкцию:
Пример:
В 5 и 6 строках текста программы – однострочные комментарии, каждый из которых начинается парой символов // и заканчивается неотображаемым символом "конец строки":
В 10-12 строках – реже используемый многострочный комментарий.
Комментарии нужны не для объяснения написанного. Они должны выполнять роль "путевых заметок". А код должен быть самодокументируемым: имена идентификаторов (переменных, функций и т.д.) должны быть осмысленными.
В С++ различаются ПРОПИСНЫЕ и строчные буквы
До выполнения программы необходимо подготовить ее текст в файле с расширение .cpp; передать этот файл на компиляцию и устранить синтаксические ошибки, выявленные компилятором; безошибочно откомпилировать (получится объектный файл с расширением .obj); дополнить объектный файл нужными библиотечными функциями (компоновка) и получить исполняемый модуль программы в файле с расширением .exe.
Cхема этапов компиляции
Перед шагом компиляции показан шаг препроцессорной обработки текста программы. В примере с Hello, World! Препроцессор обрабатывает директиву #include и подключает к исходному тексту программы средства для обмена с дисплеем (для поддержки операции <<).
Если исходный текст программы подготовлен в файле hello.cpp, то препроцессор сформирует полный текст программы, компилятор создаст объектный файл hello.obj, выбрав (по умолчанию) для него указанное имя, а компоновщик (редактор связей, Linker) дополнит программу библиотечными функциями, например, для работы с объектом cout, и построит модуль hello.exe.
Особенности выполнения перечисленных действий зависят от конкретного компилятора языка C++ и от ОС.
Чтобы автоматизировать весь процесс компиляции, используется IDE.
Ошибки
По времени появления ошибки можно разделить на 2 типа:
- ошибки времени компиляции
- ошибки времени выполнения
1. Ошибки компиляции (например, синтаксические ошибки) – легко обнаруживаются на этапе компиляции: компилятор сам указывает, где они были допущены и что стало их причиной. Чаще всего это опечатки: неправильное написание идентификаторов, пропущенные фигурные скобки, кавычки или точка с запятой
Компилятор также может выдавать сообщения с предупреждениями. Предупреждения следует расценивать как ошибки и своевременно исправлять. Например, это может быть предупреждение об объявленной, но не использованной переменной.
2. Ошибки компоновки – эти ошибки возникают в процессе компоновки (связывания). Скорее всего программа не может найти какие-то данные, ссылки на которые в ней имеются. Обычно для устранения таких ошибок достаточно исправить проблемную ссылку.
3. Ошибки времени выполнения (runtime error) – возникают при запуске исполняемого файла/во время работы программы. Причинами таких ошибок может быть неправильный ввод данных пользователем или попытка деления на ноль.
4. Логические ошибки - относятся к ошибкам времени выполнения.
Логические ошибки проявляются в некорректной работе программы, но не приводят к краху программы.
Эти ошибки обнаружить сложнее.
Непечатаемый символ \n можно использовать в любом месте строки:
Также к непечатаемым символам относится символ табуляции \t, который тоже можно использовать в любом месте строки:
Если требуется вывести обратный слэш:
Для перевода курсора на новую строку также можно использовать endl:
Задачи:
1. Создать новый проект. Сохранить. Используя один cout, вывести на экран информацию о себе следующим образом:
2. Устно ответить на вопрос: что будет выведено на экран в результате работы следующей программы?
3. Изменить цвет символов в консоли, добавив строку
4. Изменить цвет символов и фона в консоли, добавив строку