в основу какой технологии были положены структуры алгоритмов
Средства описания структурных алгоритмов
План темы
1. Основные и дополнительные алгоритмические структуры.
2. Средства описания структурных алгоритмов.
Основные и дополнительные алгоритмические структуры
Одним из способов обеспечения высокого уровня технологичности разрабатываемого программного обеспечения является структурное программирование.
Различают три вида вычислительного процесса, реализуемого программами: линейный, разветвленный и циклический.
Линейная структура процесса вычислений предполагает, что для получения результата необходимо выполнить некоторые операции в определенной последовательности.
Разветвленная структура процесса вычислений предполагает, что конкретная последовательность операций зависит от значений одной или нескольких переменных.
Циклическая структура процесса вычислений предполагает, что для получения результата некоторые действия необходимо выполнить несколько раз.
После того, как в 60-х годах XX в. было доказано, что любой алгоритм можно представить с использованием трех основных управляющих конструкций, в языках программирования высокого уровня появились управляющие операторы для реализации соответствующих конструкций. Эти три конструкции принято считать базовыми. К ним относят:
· следование – обозначает последовательное выполнение действий;
· ветвление – соответствует выбору одного из двух вариантов действий;
· цикл-пока – определяет повторение действий, пока не будет нарушено некоторое условие, выполнение которого проверяется в начале цикла.
Помимо базовых конструкций, языки программирования высокого уровня обычно используют еще три конструкции, которые можно составить из базовых конструкций:
· выбор – обозначает выбор одного варианта из нескольких в зависимости от значения некоторой величины;
· цикл-до – обозначает повторение некоторых действий до выполнения заданного условия, проверка которого осуществляется после выполнения действий в цикле;
· цикл с заданным числом повторений (счетный цикл) – обозначает повторение некоторых действий указанное количество раз.
Эти шесть конструкций были положены в основу структурного программирования.
Рис. 1. Базовые конструкции: а – следование; б – ветвление; в – цикл-пока
Рис. 2. Дополнительные конструкции: а – выбор; б – цикл-до; в – счетный цикл
Программы, написанные с использованием только структурных операторов передачи управления, называют структурными.
Представление алгоритма программы в виде блок-схемы с точки зрения структурного программирования имеет два недостатка:
· предполагает слишком низкий уровень детализации, что часто скрывает суть сложных алгоритмов;
· позволяет использовать неструктурные способы передачи управления, причем часто в блок-схеме они выглядят проще, чем эквивалентные структурные.
Кроме блок-схем, для описания алгоритмов можно использовать псевдокоды, Flow-формы и диаграммы Насси-Шнейдермана.
Средства описания структурных алгоритмов
Псевдокоды. Псевдокод – формализованное текстовое описание алгоритма (текстовая нотация).
Использование псевдокодов ориентирует только на структурные способы передачи управления и потому требует более тщательного анализа разрабатываемого алгоритма. Псевдокоды хорошо согласуются с основным методом структурного программирования – методом пошаговой детализации.
Таблица 1. Псевдокоды
Задача. В векторе A(n) найти заданное число y.
то Вывести «Элемент найден»
иначе Вывести «Элемент не найден»
Flow-формыпредставляют собой графическую нотацию описания структурных алгоритмов, которая иллюстрирует вложенность структур. Каждый символ Flow-формы соответствует управляющей структуре и изображается в виде прямоугольника. Для демонстрации вложенности структур символ Flow-формы может быть вписан в соответствующую область прямоугольника любого другого символа. В прямоугольниках символов содержится текст на естественном языке или в математической нотации. Размер прямоугольника определяется длиной вписанного в него текста и размерами вложенных прямоугольников.
На рис. 3 представлен фрагмент поискового цикла с использованием Flow-формы.
Рис. 3. Алгоритм поискового цикла
Диаграммы Насси-Шнейдермана являются развитием Flow-форм. Основное их отличие от Flow-форм заключается в том, что область обозначения условий и вариантов ветвления изображают в виде треугольников (рис. 4). Такое обозначение обеспечивает большую наглядность представления алгоритма.
Рис. 4. Условные обозначения диаграмм Насси-Шнейдермана для основных конструкций: а – следование; б – ветвление; в – выбор; г – цикл-пока; д – цикл-до
Графические нотации лучше отображают вложенность конструкций, чем псевдокоды.
Недостатком Flow-форм и диаграмм Насси-Шнейдермана является сложность построения изображений символов, что усложняет практическое применение этих нотаций для описания больших алгоритмов.
Структурное и модульное программирование.
Структурное программирование
Структурное программирование — парадигма программирования, в основе которой лежит представление программы в виде иерархической структуры блоков.
По своей сути оно воплощает принципы системного подхода в процессе создания и эксплуатации программного обеспечения ЭВМ.
Структурное программирование воплощает принципы системного подхода в процессе создания и эксплуатации программного обеспечения ЭВМ. В основу структурного программирования положены следующие достаточно простые положения:
Структурное программирование иногда называют еще «программированием без go to». Рекомендуется избегать употребления оператора перехода всюду, где это возможно, но чтобы это не приводило к слишком громоздким структурированным программам.
goto (перейти на) — оператор безусловного перехода (перехода к определённой точке программы, обозначенной номером строки либо меткой) в некоторых языках программирования. В некоторых языках оператор безусловного перехода может иметь другое имя (например, jmp в языках ассемблера).
Фундаментом структурного программирования является теорема о структурировании. Эта теорема устанавливает, что, как бы сложна ни была задача, схема соответствующей программы всегда может быть представлена с использованием ограниченного числа элементарных управляющих структур.
Базовыми элементарными структурами являются структуры: следование, ветвление и повторение (цикл), любой алгоритм может быть реализован в виде композиции этих трех конструкций.
Достоинства структурного программирования:
Модульное программирование
Модульное программирование является естественным следствием проектирования сверху вниз и заключается в том, что программа разбивается на части – модули, разрабатываемые по отдельности.
В программировании под модулем понимается отдельная подпрограмма, а подпрограммы часто называются процедурами или процедурами-функциями. Поэтому модульное программирование еще называется процедурным.
Модуль должен обладать следующими свойствами:
Модули содержат определение доступных для обработки данных, операции обработки данных, схемы взаимосвязи с другими модулями.
Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки.
Принципы модульного программирования программных продуктов во многом сходны с принципами нисходящего проектирования: сначала определяются состав и подчиненность функций, а затем — набор программных модулей, реализующих эти функции.
§ 13. Структура алгоритмов
Базовые алгоритмические структуры
В 1969 году известным голландским ученым-нрограммистом Э. В. Дейкстрой (1930-2002) было доказано, что алгоритм для решения любой логической задачи можно составить только из структур следование, ветвление, цикл. Их называют базовыми алгоритмическими структурами. Методика программирования, основанная на этой теореме, называется структурным программированием.
С базовыми алгоритмическими структурами вы познакомились, изучая информатику в 9 классе. Там же для описания структур алгоритмов были использованы два способа: блок-схемы и учебный Алгоритмический язык (АЯ). Еще раз покажем, как изображаются базовые структуры в схемах алгоритмов и как они описываются на АЯ.
Следование — это линейная последовательность действий (рис. 3.3).
Рис. 3.3. Структура «следование»
В программе на Паскале серия — это либо один отдельный оператор, либо составной оператор: последовательность операторов, заключенная в операторные скобки. Например, в языке Паскаль операторными скобками являются служебные слова Begin и End.
Ветвление — алгоритмическая альтернатива. Управление передается одному из двух блоков в зависимости от истинности или ложности условия. Затем происходит выход на общее продолжение. Вот как изображается ветвление на блок-схеме и АЯ (рис. 3.4).
Рис. 3.4. Структура «ветвление»
Условие представляет собой утверждение, которое может быть либо истинным, либо ложным. Такое утверждение называется логическим выражением.
Неполная форма ветвления имеет место, когда на ветви «нет» пусто (рис. 3.5).
Рис. 3.5. Неполное ветвление
Цикл — повторение некоторой группы действий по условию. Различают два типа цикла. Первый — цикл с предусловием: цикл-пока (рис. 3.6).
Рис. 3.6. Структура «цикл-пока»
Пока условие истинно, выполняется серия, образующая тело цикла.
Второй тип циклической структуры — цикл с постусловием: цикл-до (рис. 3.7).
Рис. 3.7. Структура «цикл-до»
Здесь тело цикла предшествует условию цикла. Тело цикла повторяет свое выполнение, если условие ложно. Повторение прекращается, когда условие становится истинным.
Теоретически необходимым и достаточным является лишь первый тип цикла — цикл с предусловием. Любой циклический алгоритм можно построить с его помощью. Это более общий вариант цикла, чем цикл-до. В самом деле, тело цикла-до хотя бы один раз обязательно выполнится, так как проверка условия происходит после завершения его выполнения. А для цикла-пока возможен такой вариант, когда тело цикла не выполнится ни разу. Поэтому в любом языке программирования можно было бы ограничиться только циклом-пока. Однако в ряде случаев применение цикла-до оказывается более удобным, и поэтому он используется.
Иногда в литературе структурное программирование называют программированием без GOTO — оператора безусловного перехода. Действительно, при таком подходе нет места безусловному переходу. Неоправданное использование в программе оператора GOTO лишает ее структурности, а значит, всех связанных с этим положительных свойств: прозрачности и надежности алгоритма. Хотя во всех процедурных языках программирования этот оператор присутствует, однако, с точки зрения структурного подхода, его употребления следует избегать.
Комбинации базовых структур
Сложный алгоритм состоит из соединенных между собой базовых структур. Соединяться эти структуры могут двумя способами: последовательным и вложенным.
Если блок, составляющий тело цикла, сам является циклической структурой, то имеют место вложенные циклы. В свою очередь, внутренний цикл может иметь внутри себя еще один цикл и т. д. В связи с этим вводится представление о глубине вложенности циклов. Точно так же и ветвления могут быть вложенными друг в друга.
Рис. 3.8. Структурные схемы алгоритмов
Для приведенных на рис. 3.8 блок-схем структура текста на АЯ должна быть следующей:
Такой же способ структуризации используется и в текстах программ (например, на Паскале).
Структурное программирование — это не только форма описания алгоритма и программы, но это еще и способ мышления программиста. Размышляя над алгоритмом, нужно стремиться составлять его из стандартных структур. Если использовать строительную аналогию, то структурная методика построения алгоритма подобна сборке здания из стандартных секций, в отличие от складывания по кирпичику.
Система основных понятий
Вопросы и задания
Составьте блок-схему алгоритма решения и опишите его на АЯ.
Лекция №3. Структурное и неструктурное программирование. Основы алгоритмизации
Цель – получить представление об особенностях структурного и неструктурного программирования; изучить особенности представления алгоритмов, а также основные алгоритмические структуры.
Одним из способов обеспечения высокого уровня качества разрабатываемого программного обеспечения является структурное программирование.
Существует несколько способов записи алгоритмов: словесный, формульно-словесный, графический, язык операторных схем, алгоритмический язык.
Наибольшее распространение благодаря своей наглядности получил графический способ записи алгоритмов с помощью блок-схем.
Блок-схемой называется графическое изображение логической структуры алгоритма, в котором каждый этап процесса обработки информации представляется в виде геометрических символов (блоков), имеющих определенную конфигурацию в зависимости от характера выполняемых операций. Графические символы, их размеры и правила построения схем алгоритмов определены Единой системой программной документации (ЕСПД), являющейся государственным стандартом (ГОСТ). Перечень символов, их наименование, отображаемые ими функции, форма и размеры определяются ГОСТами (таблица Б.1). Все формулы в блок-схеме записываются на языке математики, а не конкретном языке программирования.
Различают три вида вычислительного процесса, реализуемого программами: линейный, разветвленный и циклический. Линейная структура процесса вычислений предполагает, что для получения результата необходимо выполнить операции в определенной последовательности. При разветвленной структуре процесса вычислений конкретная последовательность операций зависит от значений одной или нескольких переменных. Для получения результата при циклической структуре некоторые действия необходимо выполнить несколько раз. Для реализации этих вычислительных процессов в программах используют соответствующие управляющие операторы.
Программы, написанные с использованием только структурных операторов передачи управления, называют структурными, чтобы подчеркнуть их отличие от программ, разрабатываемых с использованием низкоуровневых способов передачи управления.
После того, как в 60-х годах XX в. было доказано, что любой сложный алгоритм можно представить, используя три основные управляющие конструкции, в языках программирования высокого уровня появились управляющие операторы для их реализации [3, 4]. К базовым относят:
Кроме базовых, процедурные языки программирования высокого уровня используют три дополнительные конструкции, реализуемые через базовые:
Перечисленные конструкции были положены в основу структурного программирования. Программы, написанные с использованием только структурных операторов передачи управления, называют структурными, чтобы подчеркнуть их отличие от программ, разрабатываемых с использованием низкоуровневых способов передачи управления. Недостатки схем:
а) низкий уровень детализации, что скрывает суть сложных алгоритмов;
б) использование неструктурных способов передачи управления, которые на схеме выглядят проще, чем эквивалентные структурные.
Пример 3.1 – Использование блок-схемы для описания алгоритма поиска в массиве А(n) элемента, равного заданному (рисунок 3.1).
Рисунок 3.1 – Фрагмент блок-схемы алгоритма поиска
В приведенном примере используется структурный вариант алгоритма (цикл-пока). Элементы массива перебираются и поочередно сравниваются с заданным значением Y. В результате выводится соответствующее сообщение.
К недостаткам блок-схем можно отнести следующие:
а) низкий уровень детализации, что скрывает суть сложных алгоритмов;
б) использование неструктурных способов передачи управления, которые на схеме выглядят проще, чем эквивалентные структурные.
Кроме схем, для описания алгоритмов можно использовать псевдокоды, Flow-формы и диаграммы Насси-Шнейдермана, которые базируются на тех же основных структурах, допускают разные уровни детализации и делают невозможным описание неструктурных алгоритмов [1, 3, 8].
Пример 3.2 – Использование псевдокода для описания алгоритма поиска в массиве А(n) элемента, равного заданному (фрагмент).
Цикл-пока i £ n и A(i) ¹ Y
то Вывести «Элемент найден»
иначе Вывести «Элемент не найден»
Пример 3.3 – Использование Flow-форм для описания алгоритма поиска в массиве А(n) элемента, равного заданному (рисунок 3.2).
Рисунок 3.2 – Flow-форма алгоритма поиска (фрагмент)
Диаграммы Насси-Шнейдермана являются развитием Flow-форм лишь с той разницей, что область обозначения условий и вариантов ветвления изображают в виде треугольников (таблица В.1), обеспечивающих большую наглядность представления алгоритма.
Пример 3.4 – Использование диаграмм Насси-Шнейдермана для описания алгоритма поиска в массиве А(n) элемента, равного заданному (рисунок 3.3).
Рисунок 3.3 – Фрагмент диаграммы Насси-Шнейдермана
Так же, как при использовании псевдокодов описать неструктурный алгоритм, применяя Flow-формы или диаграммы Насси-Шнейдермана, невозможно (отсутствуют условные обозначения). В то же время, являясь графическими, эти нотации лучше отображают вложенность конструкций, чем псевдокоды. Недостаток: сложность построения изображений символов усложняет их практическое применение для описания больших алгоритмов.
Лекция №4. Алгоритмические языки и предъявляемые к ним требования. Процедурные языки
Цель – получить представление об основных характеристиках алгоритмических языков и их классификации; изучить особенности использования процедурных языков.
Языки программирования, которые используются при записи алгоритмов, обладают рядом характеристик, которые позволяют классифицировать, сравнивать и выбирать их с учетом целей разработки программы. К таким характеристикам относятся мощность, уровень и целостность [11].
Мощность языка характеризуется разнообразием задач, алгоритмы которых можно записать, используя этот язык. Поэтому, очевидно, что самым мощным является язык процессора, так как любая задача в конечном итоге записывается на языке компьютера.
Уровень языка определяется сложностью решения задач с использованием этого языка. Чем проще записывается решение, тем более непосредственно выражаются сложные операции и понятия, тем меньше объем получаемых исходных программ и, наконец, тем выше уровень языка.
Целостность языка обусловлена свойствами экономии, независимости и единообразия понятий.
Экономия понятий предполагает достижения максимальной мощности языка при условии использования минимального числа понятий. Независимость понятий означает, что правила использования одного и того же понятия в разных контекстах также должны быть одними и теми же, кроме того, между ними не должно быть взаимного влияния. Единообразие понятий требует единого согласованного подхода к описанию и использованию всех понятий.
Традиционно при классификации языков программирования используется такая характеристика, как уровень языка (рисунок 4.1). На нижних уровнях размещаются машинно-ориентированные языки, а на верхних – машинно-независимые.
![]() |
![]() | ![]() |
Рисунок 4.1 – Классификация языков программирования по уровню
Машинно-ориентированные языки позволяют в полной мере учитывать особенности процессора и получать программы с высокой степенью быстродействия. Однако они не способны обеспечить мобильность (переносимость) программ между разнотипными компьютерами. Под мнемокодами подразумеваются языки ассемблера без макросредств, к макроязыкам относятся языки ассемблера с макросредствами.
Таким образом, классификация, которая показана на рисунке 4.1, содержит 5 уровней языков: 0 – машинные, 1 – мнемокоды, 2 – макроязыки, 3 – процедурные, 4 – проблемные языки. Но в связи с тенденцией универсализации языков, эта классификация уже не является строгой, поскольку языки ассемблеров приобрели средства, присущие языкам высокого уровня, а язык С++ вообще имеет признаки как высокоуровневого, так и низкоуровневого языка. Поэтому класс языка имеет смысл определять по уровню его основополагающих средств.
В исходных текстах программ, как правило, используются комментарии, т. е. пояснительный текст, оформленный определенным образом и никоим образом не влияющий на ход выполнения программы. Для идентификации (обозначения) всех объектов, вводимых в программу, используются имена (идентификаторы). Под объектами понимаются переменные, константы, типы данных, функции и т. д. Для каждого языка четко определены правила, согласно которым вводятся обозначения. Ключевые (служебные) слова имеют однозначно определенный смысл и могут использоваться только так, как это задано в языке. Ключевые слова не могут быть переопределены, т. е. их нельзя использовать в качестве имен, вводимых программистом [1, 6, 7].
Лекция №5. Введение в язык С++. Структура и этапы создания программы на языке С++. Стандарты языка С++
Цель – получить представление о языке программирования С++, его особенностях, структуре программ и процессе их создания.
— С++ предлагает большой набор операций, многие из которых соответствуют машинным командам и поэтому допускают прямую трансляцию в машинный код, а их разнообразие позволяет выбирать различные наборы для минимизации результирующего кода;
— базовые типы данных С++ совпадают с типами данных Ассемблера, на преобразования типов налагаются незначительные ограничения;
— объем С++ невелик, т.к. практически все выполняемые функции оформлены в виде подключаемых библиотек, также C++ полностью поддерживает технологию структурного программирования и обеспечивает полный набор соответствующих операторов;
— С++ широко использует указатели на переменные и функции, кроме того, поддерживает арифметику указателей, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти; удобным средством для передачи параметров являются ссылки;
— C++ содержит в себе все основные черты объектно-ориентированных языков программирования: наличие объектов и инкапсуляцию данных, наследование, полиморфизм и абстракцию типов.
При написании программ на языке С++ используются следующие понятия: алфавит, константы, идентификаторы, ключевые слова, комментарии, директивы [2, 5].
С помощью перечисленных символов формируются имена, ключевые (служебные) слова, числа, строки символов, метки.
Идентификаторы (имена) обязательно начинаются с латинской буквы или символа подчеркивания «_», за которыми могут следовать в любой комбинации латинские буквы и цифры. C++ различает прописные и строчные буквы. Не допускается использование для написания имен специальных символов и символов-разделителей. Например,
Существуют некоторые соглашения относительно использования прописных и строчных букв в идентификаторах. Например, имена переменных содержат только строчные буквы, константы и макросы – прописные. С символа подчеркивания обычно начинаются имена системных зарезервированных переменных и констант, а также имена, используемые в библиотечных функциях. Поэтому во избежание возможных конфликтов и взаимопересечений с множеством библиотечных имен не рекомендуется использовать знак подчеркивания в качестве первого символа имени.
Некоторые идентификаторы, имеющие специальное значение для компилятора, употребляются как ключевые слова. Их употребление строго определено, и они не могут использоваться иначе. Список зарезервированных слов в C++ приведен в таблице Г.2.
Числа, обозначающие целые и вещественные значения, записываются в десятичной системе счисления. Перед любым числом может стоять знак «+» или «-». В вещественном числе целая часть числа отделяется от его дробной части точкой. Вещественные числа, содержащие десятичную точку, должны иметь перед ней или после нее, по крайней мере, по одной цифре.
Имя метки перехода представляет собой символьно-цифровую конструкцию, например, metkal, pass, cross15, и в программе не объявляются.
Строка символов — это последовательность символов, заключенная в кавычки. Например, «Строка символов».
Различают два вида комментариев. Любая последовательность символов, заключенная в ограничивающие скобки /* */, в языках С/С++ рассматривается как многострочный комментарий, например,
В языке С++ дополнительно имеется еще один вид комментария – однострочный: все символы, следующие за знаком // (двойной слеш) до конца строки, рассматриваются как комментарий, например, //Главная программа.
В основном, используют комментарий стиля С++ (//), а комментарий стиля C (/* */) применяют для временного отключения больших участков программы. Следует помнить, что комментарии должны пояснять, не что это за операторы, а для чего они здесь используются.
Программа, записанная на языке С/C++, обычно состоит из одной или нескольких функций. Функция – это самостоятельная единица программы, созданная для решения конкретной задачи, которая может оперировать данными и возвращать значение. Структура программы представлена на рисунке 5.1.
Каждая программа на языке C++ начинается с директивы препроцессора #include, которая подключает заголовочный файл (*.h), содержащий прототипы функций, которые сообщают компилятору информацию о синтаксисе функции, например,
Заголовочный файл обычно содержит определения, предоставляемые компилятором для выполнения различных операций. Заголовочные файлы записаны в формате ASCII, их содержимое можно вывести для просмотра с помощью любого текстового редактора из каталога INCLUDE. Препроцессор просматривает программу до компилятора, подключает необходимые файлы, заменяет символические аббревиатуры в программе на соответствующие директивы и даже может изменить условия компиляции.
Каждая программа на C++ содержит, по крайней мере, одну функцию – main(), которая автоматически вызывается при запуске, может вызывать другие имеющиеся в программе функции и обычно имеет вид:
| #include | → | Подключение заголовочных файлов |
| function1 ( ) < оператор; >function2 ( ) | → | Определение функций программы |
| void main ( ) | → | Определение главной функции |
| < | → | Начало тела главной функции |
| оператор 1; … оператор N; | → | Операторы функции |
| function1 ( ); function2 ( ); … | → | Вызов функций программы |
| > | → | Конец тела главной функции |
Рисунок 5.1 – Структура программы на языке С++
Обычную функцию необходимо вызывать (обращаться к ней) программно, в ходе выполнения кода. Функция main() вызывается операционной системой, и обратиться к ней из кода программы невозможно. Слово void служит признаком того, что программа не возвращает конкретного значения. В случае возврата значения операционной системе перед функцией main() указывается слово int, а в конце тела этой функции помещается выражение return() или return0.
После определения главной функции следуют операторы программы, которые заключены в группирующие фигурные скобки . Каждый оператор оканчивается точкой с запятой (;), указывающей на его завершение. Программа выполняется по строкам, в порядке их расположения в исходном коде, до тех пор, пока не встретится вызов какой-нибудь функции, тогда управление передается строкам этой функции. После выполнения функции управление возвращается той строке программы, которая следует за вызовом функции [2, 5, 10].
Лекция №6. Представление данных в языке С++. Оператор присваивания. Арифметические операции. Директивы препроцессора
Цель – получить представление о стандартных типах данных, порядке выполнения операций, изучить особенности оператора присваивания и использования препроцессора.
Определяя данные, необходимо предоставить компилятору информацию об их типе, тогда ему будет известно, сколько места нужно выделить (зарезервировать) для хранения информации и какого рода значение в ней будет находиться. В С++ определены пять базовых типов данных: символьные (char), целые (int), вещественный с плавающей точкой (float), вещественный с плавающей точкой двойной длины (double), а также пустой, не имеющий значения тип (void). На основе перечисленных типов строятся все остальные.
Простейшим приемом является использование модификаторов типа, которые ставятся перед соответствующим типом: знаковый (signed), беззнаковый (unsigned), длинный (long) и короткий (short). В таблице Г.3 приведены все возможные типы с различными комбинациями модификаторов с указанием диапазона изменения и занимаемого размера в байтах. При многократном использовании в программе типов данных с различными комбинациями модификаторов, например, unsigned short int, легко сделать синтаксические ошибки, во избежание которых в С++ предусмотрена возможность создания псевдонима (синонима) с помощью ключевого слова typedef. Например, строка typedef unsigned short int USHORT;создает новый псевдоним USHORT, который может использоваться везде, где нужно было бы написать unsigned short int.
Переменная – это имя, связанное с областью памяти, которая отведена для временного размещения хранимого значения и его последующего извлечения. Для длительного (постоянного) хранения значений переменных используются базы данных или файлы. В С++ все переменные должны быть объявлены до их использования. Объявление предполагает наличие имени переменной и указание ее типа. Однако следует иметь в виду, что нельзя создать переменную типа void. Основная форма объявления переменных имеет вид
В этом объявлении: тип– один из существующих типов переменных; может состоять из одной или нескольких переменных, разделенных запятыми. Например,
int x, e, z; float radius; long double integral;
Можно объявлять переменные и одновременно присваивать им начальные значения, т.е. инициализировать их. Например, int min=15; float p1=1.35;
Переменная называется глобальной, если она объявлена вне каких-либо функций, в том числе функции main(). Такая переменная может использоваться в любом месте программы (за исключением глобальных статических переменных), а при запуске программы ей присваивается нулевое значение. Переменная, объявленная внутри тела функции (одного блока), является локальной и может использоваться только внутри этого блока. Вне блока она неизвестна. Важно помнить, что:
— две глобальные переменные не могут иметь одинаковые имена;
— локальные переменные разных функций могут иметь одинаковые имена;
— локальные переменные в одном блоке не могут иметь одинаковые имена.
Данные в языках программирования могут представляться также в виде констант. Константы используются в тех случаях, когда программе запрещено изменять значение какой-либо переменной. Для определения константы традиционным способом используется #define, которая просто выполняет текстовую подстановку. Например,
#define StudentsOfGroup 15
В данном случае константа StudentsOfGroup не имеет конкретного типа и каждый раз, когда препроцессор встречает имя StudentsOfGroup, он заменяет его литералом 15. Поскольку препроцессор запускается раньше, компилятор никогда не увидит константу, а будет видеть только число 15.
Наиболее удобным способом определения констант является следующий:
const тип имя_константы = значение_константы;
Этот способ облегчает дальнейшее сопровождение программы и предотвращает появление ошибок. Так как определение константы содержит тип, компилятор может проследить за ее применением только по назначению (в соответствии с объявленным типом). Например,
const int Diapazon=20;
Литеральные константы (литералы) – это значения, которые вводятся непосредственно в текст программы. Поскольку после компиляции нельзя изменить значения литералов, их также называют константами. Например, в выражении int MyAge=19; имя MyAge является переменной типа int, а число 19 – литеральной константой, которой нельзя присвоить никакого иного значения.
Символьная константасостоит из одного символа, заключенного в апострофы: ‘q’, ‘2’, ‘$’. Например,
К символьным константам относятся специальные символы (в том числе управляющие, список приведен в таблице Г.1).
Строковые константы состоят из последовательности символов кода ASCII, заключенной в кавычки, оканчивающейся нулевым байтом. Конец символьной строки (нулевой байт) обозначается символом NULL (‘\0’).
Перечислимые константы позволяют создавать новые типы данных, а затем определять переменные этих типов, значения которых ограничены набором значений константы. Для создания перечисляемой константы используется ключевое слово enum, а запись имеет вид:
Значения константы в списке значений разделяются запятыми. Например,
В этом примере значение BLUE=101, BLACK=301.
Существует механизм явного задания типов констант с помощью суффиксов. Для констант целого типа в качестве суффиксов могут использоваться буквы u, l, h, L,H, а для чисел с плавающей точкой – l, L, f, F.Например,
Выражение в языке С++ представляет собой некоторую допустимую комбинацию операций и операндов (констант, переменных или функций). Перечень операций языка C++ приведен в таблице Г.4. Все перечисленные операции выполняются традиционным способом, за исключением операции деления. Особенность операции деления заключается в том, что если оба операнда целого типа, то она даст целый результат, например, 3/2даст 1. Для получения действительного результата необходимо иметь хотя бы один действительный операнд, например, 3/2.0 даст 1.5.
Для каждой операции языка определено количество операндов:
а) один операнд – унарная операция, изменяющая знак, например, унарный минус –х;
б) два операнда – бинарная операция, например, операция сложения х+у;
Каждая операция может иметь только определенные типы операндов. Каждая бинарная операция имеет определенный порядок выполнения: слева направо или справа налево. Наконец, каждая операция имеет свой приоритет. Приоритет и порядок выполнения операций приводятся в таблице Г.4.
Все выражения являются операторами, которые в языке предназначены для описания действий. Любой оператор может быть помечен меткой. Операторы отделяются друг от друга точкой с запятой (;). В любом месте программы, где может быть размещен один оператор, можно разместить составной оператор, называемый блоком. Блок содержит несколько операторов, которые выполняются как одно выражение, ограничивается фигурными скобками <>, но не заканчивается точкой с запятой (;).






















