СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

"Безопасные шаги на пути к безопасности на дороге"

Нажмите, чтобы узнать подробности

Все вышеизложенные правила достаточно просты и эффективны, а их соблюдение позволяет полностью исключить вероятность несчастных случаев. 

Просмотр содержимого документа
«"Безопасные шаги на пути к безопасности на дороге"»


МИНИCTEPCTBO НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное
образовательное учреждение высшего образования

«СЕВЕРО-КАВКАЗСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»







Лабораторный практикум

Часть 1


Алгоритмизация и программирование


Направление подготовки

01.03.01 - Прикладная математика и информатика

Профиль подготовки

Вычислительная математика и математическое моделирование


Бакалавриат










Ставрополь

2023



Печатается по решению

учебно-методического совета

Северо-Кавказского федерального

университета

Алгоритмизация и программирование: лабораторный практикум. Часть 1. / авт.-сост.: Непретимова Е. В. – Ставрополь: Изд-во СКФУ, 2024. – 147 с.

Форматирование и корректировка текста, блок-схем, программ: студенты группы МКН-б-о-22-1 Марьясов И. А. и Шахметов Р.З.

Лабораторный практикум соответствует требованиям Федерального государственного образовательного стандарта высшего образования последнего поколения. Предназначен для проведения занятий по дисциплине «Алгоритмизация и программирование» (1 семестр) для студентов специальности: 01.03.02 Прикладная математика и информатика.

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

Предназначено для студентов физико-математических специальностей СКФУ.

Рецензенты:

кандидат экономических наук, доцент И.В. Азаров (ФГАОУ ВО «Северо-Кавказский федеральный университет)

кандидат технических наук С.В. Аникуев (ФГБОУ ВО «Ставропольский государственный аграрный университет»)


© ФГАОУ ВО «Северо-Кавказский федеральный университет», 2024


Содержание

Введение 6

Лабораторная работа № 1 Запись арифметических выражений 8

Теоретическая часть Основные понятия алгоритмизации и программирования 8

1.1. Этапы решения задач на ЭВМ 8

1.2. Основы алгоритмизации 11

1.3. Теоретические основы программирования 19

1.4. Правила записи в С++ арифметических выражений 19

Задания 21

Контрольные вопросы 24

Лабораторная работа № 2 Программирование алгоритмов линейной структуры 25

Теоретическая часть Программирование алгоритмов линейной структуры 25

2.1 Общая характеристика языка программирования С++ 25

2.2. Основные понятия языка 26

2.3. Данные и способы их организации 28

2.4. Стандартные простые типы данных 30

2.5. Структура программы 33

2.6. Операторы 36

2.7. Организация ввода/вывода данных 38

Задания 44

Контрольные вопросы 51

Пример выполнения лабораторной работы 52

Лабораторная работа № 3 Программирование алгоритмов разветвляющейся структуры 54

Теоретическая часть Операторы ветвления 54

3.1. Простые и составные условия 54

3.2. Составной оператор 55

3.3. Условная операция (?:) 56

3.4. Условный оператор if 57

3.5. Оператор switch 60

3.6. Оператор перехода goto 61

Задания 63

Контрольные вопросы 68

Пример выполнения лабораторной работы 69

Лабораторная работа № 4 Программирование алгоритмов циклической структуры 72

Теоретическая часть Циклы 72

4.1. Оператор цикла с параметром (for) 73

4.2. Оператор цикла с предусловием (while) 74

4.3. Оператор цикла с постусловием (do while) 76

4.4. Вложенные циклы 77

Задания 78

Контрольные вопросы 83

Пример выполнения лабораторной работы 84

Лабораторная работа № 5 Использование функций для решения прикладных задач 88

Теоретическая часть Подпрограммы 88

5.1. Понятие подпрограммы 88

5.2. Формальные и фактические параметры 89

5.3. Локальные и глобальные переменные 89

5.4. Функции 91

Задания 94

Контрольные вопросы 96

Пример выполнения лабораторной работы 97

Лабораторная работа №6 Программирование рекурсивных алгоритмов 99

Теоретическая часть Итерация и рекурсия 99

6.1. Понятие итеративного процесса 99

6.2. Понятие рекурсии 99

Задания 101

Контрольные вопросы 105

Пример выполнения лабораторной работы 106

Лабораторная работа №7 Использование числовых одномерных массивов 109

Теоретическая часть Одномерные массивы 109

7.1. Понятие структурированного типа данных 109

7.2. Понятие и описание типа массив 109

7.3. Одномерные массивы 111

7.4. Основные действия над элементами массивов 112

Задания 114

Контрольные вопросы 117

Пример выполнения задания II лабораторной работы 118

Лабораторная работа №8 Двумерные массивы 120

Теоретическая часть Двумерные массивы 120

8.1 Двумерные массивы 120

Задания 124

Контрольные вопросы 127

Пример выполнения лабораторной работы 128

Лабораторная работа № 9 Задачи сортировки и поиска 130

Теоретическая часть Алгоритмы решения задач внутренней сортировки и алгоритмы поиска информации 130

9.1. Сложность алгоритмов 130

9.2. Постановка задачи поиска 131

9.3. Последовательный (линейный) поиск 131

9.4. Бинарный поиск 132

9.5. Постановка задачи сортировки данных 132

9.6. Прямые и быстрые методы внутренней сортировки 133

9.7. Сортировка вставками 134

9.8. Сортировка с помощью прямого выбора 135

9.9. Сортировка с помощью прямого обмена 136

Задания 137

Контрольные вопросы 137

СПИСОК ЛИТЕРАТУРЫ 139

Приложение 1 Порядок выполнения лабораторных работ 140

Приложение 2 Базовые функции 141

Приложение 3 Перечень планируемых результатов обучения по дисциплине, соотнесённых с планируемыми результатами освоения образовательной программы 142

Приложение 4 Правила поведения в компьютерном классе 146


Введение

Существует достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет.

Блез Паскаль (1623 - 1662)

Язык программирования Си (англ. C – третья буква латинского алфавита) разработанный в 1969 - 1973 годах сотрудниками Bell Labs Кеном Томпсоном и Деннисом Ритчи как развитие языка Би (B – вторая буква латинского алфавита) предназначался для реализации операционной системы UNIX, но, впоследствии, был перенесён на множество других платформ. Благодаря близости по скорости выполнения программ, написанных на Си, к языку ассемблера, этот язык получил широкое применение при создании системного программного обеспечения (ПО) и прикладного ПО для решения широкого круга задач. Язык программирования Си оказал существенное влияние на развитие индустрии ПО, а его синтаксис стал основой для таких языков программирования как C++, C# и Java.

В конце 1970-х годов Си начал вытеснять Бейсик с позиции ведущего языка для программирования микрокомпьютеров. В 1980-х годах он был адаптирован для использования в IBM PC, что привело к резкому росту его популярности. В то же время Бьёрн Страуструп и другие в лабораториях Bell Labs начали работу по добавлению в Си возможностей объектно-ориентированного программирования. Язык, который они в итоге сделали, C++, оказал большое влияние на разработку ПО, но так и не смог сравняться по популярности с Си, особенно в UNIX-подобных системах.

В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для разработки стандартной спецификации Си. По окончании этого процесса в 1989 году он был утверждён как «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI C или C89. В 1990 году стандарт ANSI C был принят с небольшими изменениями Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990.

ANSI C сейчас поддерживают почти все существующие компиляторы.

После стандартизации в ANSI спецификация языка Си оставалась относительно неизменной в течение долгого времени, в то время как C++ продолжал развиваться. Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «C99». В марте 2000 года он был принят и адаптирован ANSI.

8 декабря 2011 опубликован новый стандарт для языка Си (ISO/IEC 9899:2011).

Язык программирования Си отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад, к уже обработанному тексту. Поэтому использованию функции и переменных должно предшествовать их объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практически на любой модели компьютера. Си часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам. Однако, в строгой классификации, он является языком высокого уровня.

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

Одним из последствий высокой эффективности и переносимости Си стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высокого уровня часто написаны на языке Си.

Многие элементы Си потенциально опасны, а последствия неправильного использования этих элементов зачастую непредсказуемы. Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. Это часто приводит к непредсказуемому поведению программы. Иногда в результате неграмотного использования элементов языка появляются уязвимости в системе безопасности. Необходимо заметить, что использования многих таких элементов можно избежать.

Язык программирования C++ произошёл от Си. Однако в дальнейшем Си и C++ развивались независимо, что привело к росту несовместимости между ними. Редакция C99 добавила в язык несколько конфликтующих с C++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково и в Си и в C++, что, конечно, запутывает тех, кто программирует на обоих языках.

Бьёрн Страуструп, придумавший C++, неоднократно выступал за максимальное сокращение различий между Си и C++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как Си и C++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности [3].

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



Лабораторная работа № 1
Запись арифметических выражений


ЦЕЛЬ РАБОТЫ: закрепление знаний по теоретическим основам алгоритмизации и программирования, приобретение навыков использования арифметических операций, функций и правил записи арифметических выражений согласно синтаксису языка C++.

Знания, умения и владения, приобретаемые обучающимся в результате освоения темы, в рамках формируемых компетенций (ИД-1 ОПК -2, ИД-2 ОПК -2, ИД-3 ОПК -2, ИД-1ОПК-5, ИД-2 ОПК -5, ИД-3 ОПК -5): см. приложение 3: приобретение навыков разработки математических моделей (формируется часть указанных компетенций).
Оборудование и материалы: ПЭВМ с микропроцессором не ниже Pentium 4 объем свободной памяти в ПЗУ не менее 2-3 гб, объем ОЗУ не менее 512 мб.

Теоретическая часть
Основные понятия алгоритмизации и программирования 1.1. Этапы решения задач на ЭВМ

Задачи, решаемые с помощью ЭВМ, можно классифицировать по различным критериям: по типу информации и информационным технологиям, по способу поиска решения (простые и переборные), по характеру целей (задачи оптимизации, управления, обучения, информационного поиска), по функциональному назначению, а также по уровню достижения цели и уровню их решения, в т. ч. по уровню автоматизации этапов их решения.

Задача становится разрешимой, если найдено правило, способ получения результата. В информатике такое правило называют алгоритмом.

Решение задачи на ЭВМ состоит из нескольких этапов, среди которых основными являются следующие:

1. Постановка задачи:

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

2. Формализация (анализ и исследование задачи, модели, представление ее в виде уравнений, соотношений, ограничений и т.п.):

- анализ существующих аналогов задачи;
- анализ технических и программных средств;
- разработка математической модели;
- разработка структур данных.

Понятие моделирования

При решении задачи обычно исследуют не реальный объект, а его модель.

Модель – искусственно созданный объект, обладающий всеми существенными признаками реального объекта, явления или процесса.

Моделирование – это метод познания, состоящий в создании и исследовании моделей.

Цели моделирования:

  1. понять сущность изучаемого объекта;

  2. научиться управлять объектом и определять наилучшие способы управления;

  3. прогнозировать прямые или косвенные последствия;

  4. решать прикладные задачи.

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

Порядок составления математической модели:

  • выделить реальный объект, на котором будет основываться математическая модель, и из множества его свойств, закономерностей, внутренних связей, отдельных характеристик явления и параметров выделяем те, которые являются существенными для решаемой задачи, и отбросить несущественные;

  • определить, что считать исходными данными и результатами;

  • подобрать математический объект с тем же числом подобных параметров, отражающий суть реального объекта; записать математические соотношения, связывающие результаты с исходными данными.

3. Выбор метода решения.

4. Разработка алгоритма:

- выбор метода проектирования алгоритма;
- выбор формы записи алгоритма (блок-схемы, псевдокод и др.);
- выбор тестов и метода тестирования;
- проектирование алгоритма.

5. Программирование:

- выбор языка программирования;
- уточнение способов организации данных;
- запись алгоритма на выбранном языке программирования.

6. Тестирование, отладка и исправление обнаруженных ошибок:

- синтаксическая отладка;
- отладка семантики и логической структуры;

- тестовые расчёты и анализ результатов тестирования;
- совершенствование программы.



Отладка программы

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

В современных программных системах отладка осуществляется с использованием специальных программных средств, называемых отладчиками. Эти средства позволяют исследовать внутреннее поведение программы.

Программа-отладчик обычно обеспечивает следующие возможности:

  • пошаговое исполнение программы с остановкой после каждой команды (оператора);

  • просмотр текущего значения любой переменной или нахождение значения любого выражения, в том числе, с использованием стандартных функций; при необходимости можно установить новое значение переменной;

  • установку в программе "контрольных точек", т.е. точек, в которых программа временно прекращает свое выполнение, так что можно оценить промежуточные результаты, и др.

При отладке программ важно помнить следующее:

  • в начале процесса отладки надо использовать простые тестовые данные;

  • возникающие затруднения следует четко разделять и устранять строго поочередно;

  • не нужно считать причиной ошибок машину, так как современные машины и трансляторы обладают чрезвычайно высокой надежностью.

Тест и тестирование программы

Тестирование – это испытание, проверка правильности работы программы в целом либо ее составных частей.

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

Как бы ни была тщательно отлажена программа, решающим этапом, устанавливающим ее пригодность для работы, является контроль программы по результатам ее выполнения на системе тестов.

Программу условно можно считать правильной, если её запуск для выбранной системы тестовых исходных данных во всех случаях дает правильные результаты. Но, как справедливо указывал известный теоретик программирования Э. Дейкстра, тестирование может показать лишь наличие ошибок, но не их отсутствие. Нередки случаи, когда новые входные данные вызывают "отказ" или получение неверных результатов работы программы, которая считалась полностью отлаженной.

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

7. Анализ результатов решения задачи и уточнение математической модели с повторным выполнением этапов 2 - 6 (при необходимости).

8. Сопровождение программы: это работы, связанные с обслуживанием программ в процессе их эксплуатации:

- доработка программы для решения конкретных задач;
- составление документации к решённой задаче, к математической модели, к алгоритму, к программе, к набору тестов, к использованию программы.

1.2. Основы алгоритмизации

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

Свойства алгоритма

  1. Дискретность (прерывность, раздельность). Алгоритм должен представлять процесс решения задачи как последовательное выполнение конечного числа простых (или ранее определенных) законченных действий шагов.

  2. Понятность для исполнителя — т.е. исполнитель алгоритма должен знать, как его выполнять.

  3. Определенность (точность, детерминированность). Каждое правило алгоритма должно быть четким и однозначным, содержать действия над известными данными. Каждое действие должно быть понятно исполнителю (для каждого алгоритма предполагается конкретный исполнитель).

Замечание. Часто под свойством детерминированности алгоритма понимается одновременное выполнение свойств точности и понятности.

  1. Результативность (или конечность). Алгоритм должен приводить к решению задачи, получение определенного результата за конечное число шагов.

  2. Правильность. Способность алгоритма обеспечить получение именно того результата, который требуется. Неправильность может объясняться неполнотой наших представлений о свойствах объекта или упущением в решении. Для доказательства правильности алгоритма задача часто делится на блоки и правильность доказывается для каждого блока, хотя такая проверка не является полной.

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

  4. Универсальность. Алгоритм должен быть составлен так, чтобы им мог воспользоваться любой исполнитель для решения анало­гичной задачи. (Например, правила сложения и умножения чисел годятся для любых чисел, а не для каких-то конкретных.)

  5. Эффективность. Выбор алгоритмы, который будет выполнен за минимальное время, с минимальными затратами ресурсов.

Таким образом, исполнитель действует формально, т.е. отвлекается от содержания поставленной задачи, а только строго выполняет некоторые правила, инструкции и вместе с тем получать нужный результат.

Критерии качества алгоритма

  1. Связанность. Определяется количеством промежуточных результатов. Чем выше количество промежуточных результатов, тем ниже связанность.

  2. Объем алгоритма. Это количество операций или шагов, которые необходимо выполнить, а также сложность этих шагов.

  3. Логическая сложность. Определяется количеством ветвлений и циклов.

Порядок выполнения алгоритма

  1. Действия в алгоритме выполняются в порядке их записи.

  2. Нельзя менять местами никакие два действия алгоритма.

  3. Нельзя не закончив одного действия переходить к следующему.

Способы описания алгоритмов

  1. Словесно-формульный. Описание алгоритма с помощью слов и формул на естественном языке.

Словесный способ не имеет широкого распространения по следующим причинам:

  • такие описания строго не формализуемы;

  • страдают многословностью записей;

  • допускают неоднозначность толкования отдельных предписаний. «Он встретил ее на поле с цветами».

Пример. Составить алгоритм начисления зарплаты согласно следующему правилу: если стаж работы сотрудника менее 5 лет, то зарплата 130 руб., при стаже работы от 5 до 15 лет – 180 руб., при стаже свыше 15 лет зарплата повышается с каждым годом на 10 руб.

Словесно-формульное описание алгоритма решения задачи:

1. Ввести ST, перейти к п. 2.

2. Если STZP:.=l30, перейти к п. 4, иначе — перейти к п. 3.

3. Если STZP:=180, перейти к п.4, иначе ZP:=180+(ST-15)10, перейти к п. 4.

4. Вывести (отпечатать) значение ZP, перейти к п. 5.

5. Вычисления прекратить.

  1. Табличный. Алгоритм представляется в форме таблицы и расчётных формул (физика, химия и т. д.).



  1. Структурограмма

  1. Синтаксическая диаграмма (формулы Бэкуса-Наура)

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

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

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

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

Примером псевдокода является школьный алгоритмический язык.

Алгоритмический язык – это средство для записи алгоритмов в аналитическом виде, промежуточном между записью алгоритма на естественном (чело­веческом) языке и записью на языке ЭВМ (языке программирования).

Запись алгоритма решения задачи примера 1 на алгоритмическом языке:

алг зарплата(цел. ST, вещ ZP)

арг ST

рез ZP

нач

если ST

то ZP:=150

иначе

если ST

то ZP:=180

иначе ZP:=180+(ST-15)*10

все

все

кон

  1. Программный. Описание алгоритма с помощью языков программирования.

  2. Графический. Алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Такое графическое представление называется схемой алгоритма или блок-схемой.

Блок-схема алгоритма представляет собой систему связанных геометрических фигур.

Правила построения блок-схем

  1. В блок-схеме каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий, управлению повторением действий, окончанию обработки и т.п.) соответствует геометрическая фигура, представленная в виде блочного символа. Для наглядности операции разного вида изображаются в схеме различными геометрическими фигурами.

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

  3. В схеме блоки стараются размещать сверху вниз, в порядке их выполнения.

  4. Все повороты соединительных линий выполняются под углом 90 градусов.

В таблице приведены наиболее часто употребляемые символы.

Название

Обозначение и пример заполнения

Выполняемая функция (пояснение)

Начало/конец (вход/выход)

Начало или конец программы, вход или выход в подпрограмму

Блоки ввода/вывода

Ввод-вывод данных


Вывод данных на печатающее устройство

Блок вычислений

Арифметический блок определяет вычислительное действие или последовательность действий

Логический блок

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

Предопределенный процесс

Вычисления по стандартной или пользовательской подпрограмме

Блок модификации

Выполнение действий, изменяющих пункты алгоритма, начало цикла.

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

Межстраничный соединитель

Указание связи между частями схемы, расположенной на разных страницах


Общие правила построения схемы алгоритма задачи

1. Выявить исходные данные, результаты, назначить им имена.

2. Выбрать метод (порядок) решения задачи.

3. Разбить метод решения задачи на этапы (с учетом возможностей ЭВМ).

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

5. В полученной схеме при любом варианте вычислений:

а) предусмотреть выдачу результатов или сообщений об их отсутствии;

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

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

Типы алгоритмов

  • структурированные;

  • неструктурированные (т.е. с нарушением структуры – с операторами безусловного перехода);

  • вспомогательные (используемые в составе других алгоритмов).

Виды алгоритмов

  • линейный алгоритм;

  • алгоритм ветвления;

  • циклический алгоритм;

  • алгоритм с подпрограммами;

  • смешанные (т.е. содержащие и циклы, и ветвление, и функции).

  • рекурсивный алгоритм обращается к самому себе, пока не выполнится определенное условие.

Базовые алгоритмические конструкции

Структу́рное программи́рование – методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом. Основывается на теореме о структуре.

Согласно теореме о структуре (теорема Бёма – Якопини, 1966 г) логическая структура любого алгоритма может быть представлена комбинацией трех базовых структур: следование, ветвление, цикл.

Характерной особенностью базовых структур является наличие в них одного входа и одного выхода.

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

2. Базовая структура ветвление (алгоритм ветвления) обеспечивает в зависимости от результата проверки условия выбор одного из альтернативных путей работы алгоритма. Условие – вопрос, имеющий два варианта ответа: да или нет. Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран. Запись ветвления выполняется в двух формах: полной и неполной.


Структура ветвление существует в четырех основных вариантах:

Неполная форма записи

Полная форма записи

1. если-то


2. если-то-иначе


3. выбор

4. выбор-иначе

Примеры команды если

Пример: найти наименьшее из трех чисел.

1 вариант решения:

2 вариант решения:

3 . Базовая структура цикл обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла, над новыми данными.



Цикл типа «пока» (Цикл с предусловием)

В

+

Тело цикла

Условие

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

Зацикливание - бесконечное повторение выполняемых действий.

Ц икл типа «до» (Цикл с постусловием)

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

Ц икл типа «для»

Цикл с параметром, или цикл со счетчиком, или арифметический цикл - это цикл с заранее известным числом повторов. Предписывает выполнять тело цикла для всех значений некоторой переменной (параметра цикла) в заданном диапазоне.


х0 – начальное значение параметра; h – шаг; хn – последнее значение параметра.


Для создания циклов с параметром необходимо использовать правила:

  1. Параметр цикла, его начальное и конечное значения и шаг должны быть одного типа.

  2. Запрещено изменять в теле цикла начальное, текущее и конечное значения для параметра.

  3. Запрещено входить в цикл, минуя блок модификации.

  4. После выхода из цикла значение переменной параметра неопределенно и не может использоваться в дальнейших вычислениях.

  5. Из цикла можно выйти, не закончив его, тогда переменная параметр сохраняет свое последнее значение.

1.3. Теоретические основы программирования

Программирование – это раздел информатики, изучающий методы и приемы составления программ для компьютеров. Кроме того, программирование – это подготовка задачи к решению ее на компьютере.

Программапоследовательность действий, которые должен выполнить компьютер в строго указанной очерёдности для достижения конкретного результата.

Языки программирования – это совокупность средств и правил представления алгоритма в виде, приемлемом для компьютера.

Системы программирования – это набор средств ввода, редактирования, трансляции и выполнения программ на ЭВМ.

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

Например, транслятор воспринимает операторы одного языка и вырабатывает соответствующие операторы другого языка.

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

Компилятор оценивает исходный текст в соответствии с синтаксической конструкцией языка и переводит на машинный язык.

Например, компилятор берет программу, написанную на языке C, и преобразует ее в программу на языке ассемблера.

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

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

1.4. Правила записи в С++ арифметических выражений

Арифметические выражения

Выражение состоит из операторов и операндов. Операндами могут быть, в свою очередь, выражения или одни из его частных случаев – числа (константы) или переменные, операторы обозначают выполняемые над ними действия (+ сложение, - вычитание, * умножение, / деление (для целых операндов – целая часть от деления), % остаток от деления (только для целых ), …).

Все основные операции языка С++ можно разбить на следующие группы:


  • арифметические операции;

  • логические операции;

  • операции отношения;

  • операции с битами информации;

  • операции со строками;

  • операции присваивания;

  • операция sizeof;

  • условная операция (?:).


Примеры выражений:

(a + 0.12)/6

x && || !z

(t * sin(x)-1.05e4)/((2 * k + 2) * (2 * k + 3))

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

Порядок вычисления выражений определяется рангом (приоритетом) входящих в него операций (табл. 3). Принятый в С++ ранг операций наиболее близок к математическому, также как и принятый порядок их вычисления. Так, умножение и деление (мультипликативные операции) старше сложения и вычитания (аддитивные операции). Унарные операции + и – старше бинарных, т.е., знак операнда вычисляется в первую очередь. Операции типа присваивания младше прочих, что позволяет выполнить их только после того, как значение выражения вычислено полностью. Операции отношения младше арифметических операций, что позволяет использовать естественную запись логических выражений, например, x0 && y0. Здесь в первую очередь вычисляются значения отношений, которые затем являются операндами конъюнкции.

Таблица 1 – Порядок вычисления выражений

Группа

Тип действий

Операции или элементы

1

Вычисления в круглых скобках

( )

2

Вычисления значений функции

Функции

3

Унарные операции

++, --, ~, !, унарные - и +, &, * (разадресация),

4

Операции типа умножения

*, /, %

5

Операции типа сложения

+, –

6

Операции отношения

, =, ==, !=

Арифметические выражения строятся из операндов, арифметических операций и круглых скобок.

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

Арифметические выражения записываются по следующим правилам:

  • Запись ведётся в строчку.

  • Нельзя опускать знак умножения между сомножителями.

  • Для обозначения переменных используются буквы латинского алфавита.

  • Операции выполняются в соответствии с приоритетами: сначала вычисление функций, затем умножение и деление , потом сложение и вычитание.

  • Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные – слева направо. Например, a = b = c означает a = (b = c), а a + b + с означает (a + b) + c.

  • При использовании стандартных функций аргумент обязательно заключается в круглые скобки.

  • В языке С++ предусмотрены базовые математические операции (см. прил. 2).

Примеры записи выражений:

Математическое выражение

Запись на C++

  1. 10 * x + 3 * sqrtf(cos(x))

  1. (sin(2*x) - 1) / (pow(x, 2) - 1)

  1. abs(x) + 2 * cos(x) / sin(x)

Задания

Выполнение работы: записать следующие выражения по правилам языка C++.

Задание I
  1. sin 5x + 2 tg x2

  1. ;

  1. 2x + 3y2 - sin3x

  1. ;

  1. ;


Задание II

Выполнить согласно варианту, записать следующие выражения по правилам языка C++.:

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

.

    1. ,

    1. ,

    1. ,

    1. ,

.

    1. ,

.

    1. ,

.



Содержание отчета

В тетради для лабораторных работ должны быть: номер лабораторной работы, тема, цель, задание 1 (8 примеров), задание 2 (своего варианта - 2 примера), ответы на контрольные вопросы.

Контрольные вопросы
  1. Что такое алгоритм?

  2. Перечислите свойства алгоритмов.

  3. Способы записи алгоритма.

  4. Перечислите базовые алгоритмические конструкции. Какова блок-схема следования?

  5. Какова блок-схема полной (неполной) формы команды ветвления?

  6. Какова блок-схема цикла с предусловием?

  7. Какова блок-схема цикла с постусловием?

  8. Какова блок-схема цикла с параметром?

  9. Что такое программа?

  10. Что такое транслятор?

  11. Что такое компилятор?

  12. Что такое интерпретатор?

  13. Что такое оператор и операнд?

  14. В каких случаях при записи математических выражений на языке С++ используются круглые скобки?

  15. Как используются стандартные математические функции в С++?

Список литературы, рекомендуемый к использованию по данной теме:

[1] стр. 4-5, 17-18, 27;

[2] Введение в C++. Язык программирования C++ - https://metanit.com/cpp/tutorial/1.1.php;

[6] Целые числа - https://stepik.org/lesson/13021/step/1?unit=4362

[9] Структура и порядок выполнения программы.https://www.youtube.com/watch?v=TQyIJ4xHOEE&list=PLQOaTSbfxUtCrKs0nicOg2npJQYSPGO9r&index=4

Учить: п. 1.1-1.4.

Письменно ответить на контрольные вопросы.

Указания по технике безопасности см. приложение 4.


Лабораторная работа № 2
Программирование алгоритмов линейной структуры

ЦЕЛЬ РАБОТЫ: закрепление знаний о типах данных, преобразованиях типов, приобретение навыков составления и отладки программ линейной структуры на языке программирования C++.

Знания, умения и владения, приобретаемые обучающимся в результате освоения темы, в рамках формируемых компетенций (ИД-1ОПК-2, ИД-2ОПК-2, ИД-3ОПК-2,
ИД-1ОПК-5, ИД-2 ОПК -5, ИД-3ОПК -5): см. приложение 3: приобретение навыков разработки математических моделей, а также формируется способность к разработке и применению алгоритмических и программных решений (линейной структуры) в области прикладного программирования (формируется часть указанных компетенций).

Оборудование и материалы: ПЭВМ с микропроцессором не ниже Pentium 4 объем свободной памяти в ПЗУ не менее 2-3 гб, объем ОЗУ не менее 512 мб.

Теоретическая часть
Программирование алгоритмов линейной структуры 2.1 Общая характеристика языка программирования С++

C++ – компилируемый статически типизированный язык программирования общего назначения.

Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником – языком C, – наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C [3].

2.2. Основные понятия языка

Основу любого языка программирования образуют три, его составляющие: алфавит, синтаксис и семантика.

Алфавит - это фиксированный для данного языка программирования набор основных символов (букв алфавита), из которых состоит любой текст на этом языке. Никакие другие символы в тексте, не допускаются. Все символы в тексте кодируются с использованием стандартной кодовой таблицы ASCII. Каждый символ кода ASCII имеет неотрицательный порядковый номер, т.е. множество всех символов является упорядоченным.

Алфавит С ++ включает:

  1. Прописные и строчные латинские буквы и знак подчеркивания.

  2. Арабские цифры от 0 до 9.

  3. Специальные знаки:
    “ {} , | [ ] ( ) + - / % * . \ ` : ? ! & # ~ ; ^

  4. Пробельные символы: пробел, символы табуляции, символы перехода на новую строку.

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

Синтаксис C++ устанавливает, как можно на этом языке сформировать корректный текст и писать программы. Синтаксически правильная программа компилируется без ошибок.

Из символов алфавита формируются лексемы языка:

  • идентификаторы;

  • ключевые (зарезервированные) слова;

  • знаки операций;

  • константы;

  • разделители (скобки, точка, запятая, пробельные символы).

Лексема, или элементарная конструкция - минимальная единица языка, имеющая самостоятельный смысл. Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.

Одним из важнейших синтаксических понятий любого языка программирования является понятие идентификатора.

Идентификаторимя программного объекта.

В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, alpha, Alpha и ALPHA – три различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются.

Для улучшения читаемости программы следует давать объектам осмысленные имена. Существует соглашение о правилах создания имен, называемое венгерской нотацией (поскольку предложил ее сотрудник компании Microsoft венгр по национальности), по которому каждое слово, составляющее идентификатор, начинается с прописной буквы, а вначале ставится префикс, соответствующий типу величины, например, lpfnSetFirstDialog. Другая традиция – разделять слова, составляющие имя, знаками подчеркивания: max_length, number_of_galosh [8].

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

  • идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

  • не рекомендуется начинать идентификаторы с символа подчеркивания, поскольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

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

Примеры правильных идентификаторов: value25, My_File, index, Operation. Примеры синтаксически неправильных идентификаторов:

1_Side (имя не должно начинаться с цифры),

Том 2 (не допускается пробел),

New-Name (не допускается дефис),

break (служебное слово),

ехр (предопределенное имя функции-экспоненты).

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

Служебные (зарезервированные, ключевые) слова – это идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, const – ключевое слово, обозначающее невозможность модификации значения, int – ключевое слово, используемое для обозначения целого типа данных.

Знаки операций. Знак операции – это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарные по количеству участвующих в них операндов. Один и тот же знак может интерпретироваться по-разному в зависимости от контекста. Все знаки операций за исключением [ ] ,( ) и ? : представляют собой отдельные лексемы.

Семантика языка – это смысловое значение слов. В программировании – начальное смысловое значение операторов, основных конструкций языка, т.п. [3].

Пример. Первый код: i=0; while(ii++;}

Второй код: i=0; do{i++;}while(i

Логически эти два фрагмента кода выполняют одно и то же, результаты их работы идентичны. В то же время семантически это два разных цикла.

Таким образом,

  • синтаксис – формальный набор правил, определяющий способ построения любых конструкций языка;

  • семантика – множество правил, определяющих смысл синтаксических конструкций.

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

Комментарии в программе на С++ либо начинаются с двух символов «прямая косая черта» (//однострочный комментарий) и заканчивается символом перехода на новую строку, либо заключается между символами – скобками /*многострочный комментарий*/. Внутри комментария можно использовать любые допустимые на данном компьютере символы, а не только символы из алфавита языка С++, поскольку компилятор комментарии игнорирует. Вложенные комментарии – скобки стандартом не допускаются, хотя в некоторых компиляторах разрешены.

2.3. Данные и способы их организации

Данные – это информация, представленная в виде пригодном для обработки автоматическими средствами, в частности ЭВМ, при возможном участии человека.

В программах обрабатываемые данные фигурируют в качестве значений тех или иных программных объектов. Данные, которые зафиксированы в тексте и не изменяются в процессе выполнения программы, называются константами; остальные данные являются значениями объектов, называемых переменными, поскольку значения этих объектов могут изменяться в процессе выполнения программы.

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

Таблица 2 – Классификация типов данных C++

Базовые

Определяемые программистом

Простые (скалярные)

Логический (bool)

Целые (short int, int, long int)

Вещественные (float, double, long double)

Символьные (char, wchar_t)

Пустой тип (void)

Простые

Составные

Перечисления

Указатели

Ссылки

Массивы

Структуры

Объединения

Классы

Тип данных однозначно определяет:

  1. Формат представления данных в памяти компьютера.

  2. Множество допустимых значений, принимаемое переменной или константой, принадлежащей к выбранному типу.

  3. Множество допустимых действий применимых к этому типу (операции и функции).

Например, целые и вещественные числа, занимают одинаковый объем памяти (long int и float), но имеют разные диапазоны возможных значений.

Константы в языке Си++

Итак, константа представляет значение, которое не может быть изменено. Константы обладают типом, и тип определяется записью константы. Синтаксис языка выделяет пять типов констант: целые, действительные (вещественные), символьные, перечислимые, нулевой указатель.

Например:

const int k=1; // целая именованная константа

const float Pi = 3.1415926, Eps = 0.1e-5; // действительные константы

const char a = 'а'; // символьная константа

enum DAY {SUNDAY, MONDAY, TUESDAY, WEDNESDAY,

THURSDAY, FRIDAY, SATURDAY}; // перечисление

char *pc = nullptr; // нулевой указатель

Порядок объявления и инициализации переменных

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

имя_типа имя_переменной;

При описании можно присвоить переменной начальное значение, это называется инициализацией.

Например:

int d = 5; // Целочисленная переменная d проинициализирована значением 5

float b; // Объявлена вещественная переменная b

char s = '+'; /* Переменная s объявлена как символьная и проинициализирована значением '+'*/

Можно одновременно объявить несколько переменных, тогда в списке имен они отделяются друг от друга запятой, например:

int a, b, c; // Целые со знаком

char ch, sh; // Однобайтовые символьные

long l, m, k; // Длинные целые [-2147483648 – 2147483647]

float x, y, z; // Вещественные

long double u,v,w; // Длинные вещественные с двойной точностью

Итак, перед использованием переменной необходимо определить четыре характеристики:

  • имя;

  • тип;

  • значение (не обязательно);

  • область видимости.

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

Тип переменной определяет размер выделяемой памяти и способ хранения значения.

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

Область видимости. Переменные в языке Си классифицируются по области видимости и делятся на две категории: локальные и глобальные.

Локальная переменная – это такая переменная, которая объявлена внутри какого-либо блока (под блоком в языке Си понимается последовательность операторов, заключенная в фигурные скобки). Память под эту переменную выделяется в момент выполнения оператора ее объявления. По завершении работы блока эта переменная разрушается, а занимаемая ей память высвобождается. То есть, время жизни такой переменной ограничено тем блоком, в котором она объявлена.

Глобальная переменная – это такая переменная, которая объявлена вне любого блока. Следовательно, время ее жизни – время жизни самой программы.

Еще одним отличием локальной переменной от глобальной является процедура их инициализации. Любая глобальная переменная при объявлении автоматически обнуляется, локальная – нет. Поэтому, если начальное значение локальной переменной при объявлении еще не известно, лучше ее принудительно обнулить.

Резюмируя все вышесказанное, можно сделать вывод, что прежде чем описывать какие-либо данные, необходимо выполнить следующие действия:

    • выбрать имя переменной (описать идентификатор);

    • определить исходя из необходимого диапазона представления чисел тип переменной;

    • определить область видимости переменной;

    • обнулить или проинициализировать переменную начальным значением.

2.4. Стандартные простые типы данных

В любом алгоритмическом языке каждая константа, переменная, результат вычисления выражения или функции должны иметь определенный тип. Все типы языка С++ можно разделить на основные и составные (производные) [30, стр. 42-47]. В языке С++ определено шесть основных типов данных для представления целых, вещественных, символьных и логических величин. На основе этих типов программист может вводить описание составных типов.

Основные (стандартные) типы данных часто называют арифметическими, поскольку их можно использовать в арифметических операциях. Для описания основных типов определены следующие ключевые слова:

  • int (целый);

  • char (символьный);

  • wchar_t (расширенный символьный);

  • bool (логический);

  • float (вещественный);

  • double (вещественный с двойной точностью).

Первые четыре типа называют целочисленными (целыми), последние два – типами с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

  • short (короткий);

  • long (длинный);

  • signed (знаковый);

  • unsigned (беззнаковый).

По умолчанию все целочисленные типы считаются знаковыми, то есть спецификатор signed можно опускать.

Базовыми в системе типов языка С++ являются простые типы, представленные в следующей таблице:

Таблица 3 – Стандартные простые типы данных

Простые
типы

Тип

Название

Размер, байт

Диапазон

Логический

bool

булевское (логическое)

1

false, true (0, 1)

Символьный

signed char

символ

1

-128 … 127

unsigned char

беззнаковый символьный

1

набор допустимых символов с кодами
0 … 255

Целые

short int

короткое целое (short)

2

-32 768 ... 32 767 (-215 .. 215 - 1)

unsigned short int

беззнаковое короткое целое (слово)

2

0 ... 65 535 (0 .. 216 - 1)

long int

длинное целое (long)

4

-2 147 483 648 … 2 147 483 647

unsigned long int

беззнаковое длинное целое

4

0 … 4294967295

Вещественные

float

вещественный

4

3.4e-38 … 3.4e+38

double

двойной точности

8

1.7e-308 … 1.7e+308

long double

расширенный

10

3.4e-4932 … 3.4e+4923

Для вещественных типов в таблице приведены абсолютные величины минимальных и максимальных значений.

В стандарте ANSI диапазоны значений для основных типов не задаются, определяются только соотношения между их размерами, например:

sizeof (float)

sizeof (char)

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

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

1. Булевский (логический) тип обозначается стандартным идентификатором bool. В С++ имеются две константы булевской типа, которые обозначаются также посредством стандартных идентификаторов: true (истина) и false (ложь). Внутренняя форма представления значения false-0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1. Над значениями булевского типа допустимы операции сравнения, причем, считается, что false && (конъюнкция), || (дизъюнкция) и ! (не – логическое отрицание). По приоритету эти операции имеют последовательность ! - && - ||. Значения булевского типа занимают один байт памяти.

2. Символьный тип имеет стандартный идентификатор char. Значениями переменных этого типа являются символы из множества АSCII. Это множество состоит 256 различных символов, упорядоченных определенным образом, и содержит символы заглавных и строчных букв, цифр и различных других символов, включая специальные управляющие символы. Если символьное значение имеет графическое изображение, оно представляется соответствующим знаком, заключенным в апострофы, например: '*', '1', ';'. Тип char, как другие целые типы, может быть со знаком или без знака. Величины типа char применяются также для хранения целых чисел, не превышающих границы указанных диапазонов (см. табл. 3).

Расширенный символьный тип (wchar_t) предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например, Unicode. Размер этого типа зависит от реализации; как правило, он соответствует типу short. Строковые константы типа wchar_t записываются с префиксом L, например, L”Gates”.

3. Целые типы – эта группа типов обозначает множества целых чисел в различных диапазонах. В С++ имеется пять целых типов, различающихся диапазоном значений и объемом занимаемой оперативной памяти. Целые типы обозначаются идентификаторами int, short int, long int, unsigned short int, unsigned long int: их характеристики приведены в таблице 3. Размер типа int не определяется стандартом, а зависит от компьютера, компилятора и операционной системы. Для 16-разрядного процессора под величины этого типа отводится 2 байта, для 32-разрядного – 4 байта. Поэтому при написании программ, переносимых на различные платформы, нельзя делать предположений о размере типа int. Для его получения необходимо пользоваться операцией sizeof, результатом которой является размер типа в байтах.

Число относится к целому типу тогда и только тогда, когда в его записи не содержится ни десятичной точки, ни признака порядка e.

Константам, встречающимся в программе, приписывается тот или иной тип в соответствии с их видом. Если этот тип по каким- либо причинам не устраивает программиста, он может явно указать требуемый тип с помощью суффиксов L, l (long) и U, u (unsigned). Например, константа 32L будет иметь тип long и занимать 4 байта. Можно использовать суффиксы L и U одновременно, например, 0х22UL или 05Lu.

Над целыми значениями допустимы четыре арифметических действия, имеющие привычный смысл и обозначаемые соответственно символами: + – сложение, - – вычитание, * – умножение, / – целая часть от деления. Кроме того, в С++ можно использовать еще унарные операции (++, --, унарный минус и плюс, …), операцию "типа деления": % – нахождение остатка от деления, операции присваивания (=, *=, /=,%=, +=, -=). Все приведенные операции при целых операндах дают целый результат. Также над целочисленными данными допустимо выполнять битовые, логические операции и операции сравнения.

4. Вещественные типы - эта группа типов обозначает множества вещественных значений в различных диапазонах. C++ поддерживает три вещественных типа, которые обозначаются стандартными идентификаторами float, double, long double (см. табл. 3). Вещественные числа могут изображаться в двух формах: в форме с фиксированной точкой (целая и дробная части отделяются друг от друга точкой, например, -19.324, 0.1281) и в форме с плавающей точкой (e, например, 16.2e21, 2e-48).

Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f (float) и L, l (long). Например, константа 2Е+6L будет иметь тип long double, а константа 1.82f- тип float.

Над числами вещественных типов допустимы четыре арифметические операции: сложение, вычитание, умножение и деление; операции присваивания и сравнения.

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

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

2.5. Структура программы

Программа на языке С++ состоит из функций, описаний и директив препроцессора. Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции.

Формат простейшего определения функции:

тип_возвращаемого_значения имя_функции ([параметры]) // заголовок функции

{

// Блок тела функции:

// определения объектов;

// исполняемые операторы;

// return выражение; // если функция возвращает значение.

}

Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип (тип возвращаемого результата). Если функция не должна возвращать значение, указывается тип void. Тело функции является блоком и, следовательно, заключается в фигурные скобки. Любая функция, кроме main, вызывается из другой функции. Примером функций являются библиотечные функции, например, sin(x), fabs(a).

Пример структуры простейшей
программы

Текст программы, состоящей из одной функции и содержащей
компоненты, которые почти все могут отсутствовать

1. Препроцессорные
директивы

#include iostream /* подключение заголовочного файла для организации ввода-вывода в С++ */

2. Описания

using namespace std; // описание пространства имен std

3. Определение
главной
функции

int main() // заголовок главной функции

{

// Блок тела функции

// здесь находится программный код

}

Блок (составной оператор) – это произвольная последовательность определений и операторов, заключенная в фигурные скобки. Блок используется для укрупнения структуры программы. Точка с запятой в конце блока не ставится.

Текст программы на С++ обладает структурой. Общие принципы, позволяющие написать синтаксически правильную программу, таковы:

    1. Каждый оператор заканчивается знаком «;». Обычная ошибка начинающего – это знак «;», завершающий заголовки функций или операторов цикла. В первом случае синтаксическая ошибка распознается как отсутствие тела функции, во втором случае телом цикла является пустой оператор, что синтаксической ошибкой не является, и программа выполняется.

    2. Прежде чем использовать функции, переменные, типы данных, следует объявить их или подключить файлы с их объявлениями (сделать известными компилятору). В С++ объявление переменной (объекта) возможно не только в начале программы, но и в любом месте текста до первого обращения к ней. Областью действия такого объекта является только непосредственно охватывающий его блок. Как правило, так объявляют рабочие переменные.

    3. Чтобы вызов функции мог быть выполнен, функция должна быть определена, т. е. описаны действия, которые она осуществляет.

    4. При определении функции полезно придерживаться следующих рекомендаций:

    • объявить и проинициализировать входные и выходные переменные;

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

    1. В любой последовательности действий нужно стремиться к триаде: инициализация (ввод), обработка, возвращение значения (вывод).

Пример структуры программы, содержащей 2 функции: main и mysum.

1

Зона комментариев

// моя первая программа

2

Зона директив препроцессора

#include

#include

3

Зона объявления прототипов пользовательских функций и глобальных переменных и структур данных

int a = 10;

int mysum(int x);

4

ТОЧКА ВХОДА В ПРОГРАММУ

Зона функции main()

int main()

{

int b = 15, c;

c = mysum(b);

cout

_getch();

}

5

Зона определения пользовательских функций

int mysum(int x)

{

int z = x + a;

return z;

}

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

  • подключение заголовочных файлов библиотек;

  • объявления пользовательских символических констант, вспомогательных функций, классов и типов данных, глобальных переменных;

  • заголовок главной функции;

  • определение главной функции – блок, содержащий:

      • объявление локальных переменных и констант и их инициализацию (присвоение начальных значений);

      • ввод исходных данных (диалог с пользователем);

      • обработка – обращение к функциям, вычисление выражений, выполнение операторов;

      • вывод результата;

      • возвращение кода завершения главной функции;

  • определения пользовательских вспомогательных функций и методов классов; для каждой функции после заголовка размещается блок, содержащий:

  • объявление локальных переменных и их инициализацию;

  • обработку формальных параметров с использованием локальных переменных;

  • возвращение результата.

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

Правила оформления текста программы, направленные на облегчение понимания смысла и повышение наглядности, таковы:

  • разделять логические части программы пустыми строками;

  • разделять операнды и операции пробелами;

  • для каждой фигурной скобки отводить отдельную строку;

  • в каждой строке должно быть, как правило, не более одного оператора;

  • ограничивать длину строки 60-70 символами;

  • отступами слева отражать вложенность операторов и блоков;

  • длинные операторы располагать в нескольких строках;

  • проводить алгоритмизацию так, чтобы определение одной функции занимало, как правило, не более одного экрана текста;

  • стремиться использовать типовые заготовки фрагментов программ, включая и типовую структуру блока и программы в целом.

Конечно, эти правила нужно использовать совместно с правилами именования элементов программы и комментирования текста программы:

  • комментарии в тексте необходимы;

  • имена объектов программы выбираются осмысленно. Каждое имя подчеркивает назначение и логику объекта, например, имена библиотечных функций sin, abs, printf и прочих говорят сами за себя. Имена объектов, введенные программистом, подчеркивают их абстрактный смысл, например, Count, Square, Point.x, Point.y и так далее.

2.6. Операторы

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

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

Среди исполняемых операторов можно выделить:

  • простые операторы (оператор-выражение, операторы передачи управления);

  • составные операторы (составной оператор, блок)

  • структурированные операторы (условный, выбора, цикла).

Рассмотрим простые операторы

Оператор «выражение»

Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор (;). Он используется, когда по синтаксису оператор требуется, а по смыслу нет.

Примеры:

x ++; // выражение – оператор; выполняется операция инкремента

c = a * 1.5; // выражение с операцией присваивания

a *= b + c; // выполняется умножение с присваиванием: a = a * (b + c)

fun(i, k); // выполняется вызов функции

Оператора присваивания в языке С++ нет, его заменяет выражение, в составе которого есть операция присваивания.

Общий вид:

идентификатор = выражение;

Пример: x = y + 4; // выражение с операцией присваивания

Выполняется в два этапа:

а) вычисляется значение выражения, стоящего в правой части от знака присваивания;

б) вычисленное значение присваивается переменной, стоящей в левой части от знака присваивания, при этом предыдущее значение этой переменной теряется.

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

При выполнении присваивания, если типы левой и правой части не совпадают, происходит неявное преобразование. С++ всегда пытается это сделать, и упрощенно можно считать, что преобразование происходит без потери данных от меньшего типа к большему, например от int к float или от char к int, и с потерей данных от большего типа к меньшему, например, от float к int. Это легко понять, если вспомнить, что тип данного, это объем занятой им памяти.

Явное преобразование типов выполняется при присваивании вида:

имя = (тип) выражение;

Например:

int a = 5, b = 2;

float c;

с = a/b;

Хочется думать, что значение с будет равно 2.5, ведь оно вещественное, но порядок операций таков, что деление старше присваивания, и оно выполняется с операндами целого типа, и его результат равен 2, то есть приведение типа будет выполнено только при присваивании.

Для явного преобразования типов используется известный прием:

c = (float) a/(float) b; // c = 2.5

Операция присваивания правоассоциативна, т.е. вычисления выполняются справа налево, поэтому допускается запись цепочек присваиваний, например:

x = y = z = 1; // Каждая переменная будет равна 1.

В сложных операциях присваивания ( +=, *=, /= и т п.) при вычислении выражения, стоящего в правой части, используется и L-значение из левой части. Например, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение a += b является более компактной записью выражения a = a + b.

Еще один вид операторов, который можно отнести к операторам-выражениям, это оператор обращения к функции (вызов функции). Его операндам являются параметры функции.

Формат оператора:

имя функции ([список фактических параметров] – может отсутствовать);

Например:

scanf ("%d%f", &my_int, & my_float); // ввод данных

printf ("Целое = %d, Вещественное = %f\n", my_int, my_float) // вывод

Пробелы в строке текста являются значащими, то есть, если ввести целое 5 и дробное 9.9, то строка вывода будет иметь вид:

Целое = 5, Вещественное = 9.900000

Операторы передачи управления рассмотрим позже (п. 3.6, п. 4.1)

2.7. Организация ввода/вывода данных

Ввести данное – означает присвоить произвольное значение переменной во время выполнения программы. Вывести данное – означает напечатать на экране значение переменной при выполнении программы.

В С++ нет встроенных средств ввода/вывода – он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: функции, унаследованные из языка С, и объекты С++.

Организация ввода/вывода в стиле С

Простейший из способов ввода и вывода (обмена) данных – это форматированный, с определением правил размещения данных во входном – выходном потоке. Для реализации такого обмена необходима библиотека stdio.h (standart input output library), которая подключается к программе директивой #include

Для ввода значения данного с клавиатуры (с эхоповтором на экране) используется функция scanf, синтаксис которой:

scanf ("форматная строка", список_ввода);

Здесь «список ввода» – имена переменных, значения которых будут введены с клавиатуры при выполнении функции scanf. Имена переменных предваряются символом &, который является признаком адресной операции, и означает, что введенное значение пересылается по адресу, определенному именем переменной. При вводе данные отделяются пробелами, или Enter’ом.

Для вывода значения данного на экран используется функция printf, синтаксис которой:

printf ("форматная строка", список_вывода);

Здесь «список вывода» – список имен переменных и выражений (в том числе констант), значения которых появятся на экране при выполнении функции printf.

Форматная (управляющая) строка, – это строка символов внутри двойных кавычек, содержащая управляющие символы и текст. При вводе данных функция scanf читает посимвольно текст из входного потока, распознает лексемы и преобразует их в машинное представление в соответствии с признаком формата, сопоставленного переменной, ожидающей данное. При выводе функция printf берет машинное представление значения переменной, и соответственно признаку формата, преобразует в текстовое представление, и выводит на экран.

Число управляющих символов равно числу объектов в списке ввода-вывода. Управляющий символ имеет признак %, и одно из следующих значений:

%d – ввод - вывод целого десятичного числа (int);

%u – ввод - вывод целого без знака (unsigned);

%f – ввод - вывод числа с плавающей точкой (float и double);

%e – ввод - вывод числа в экспоненциальной форме (double и float);

%c – ввод - вывод символа (char);

%l – ввод – вывод длинного значения (long);

и другие.

При вводе и выводе необходимо строгое соответствие типа вводимого данного управляющему символу формата.

Пример форматированного ввода и вывода.

#include

void main(void)

{

int my_int;

float my_float;

printf("\nВведите целое и дробное число\n");

scanf ("%d", &my_int);

scanf ("%f", &my_float);

printf ("%d %f", my_int, my_float);

}

При запуске программы она выведет на экран строку – приглашение ко вводу данных, затем при выполнении каждого scanf будет ожидать ввода данных. Пользователь должен ввести требуемое количество данных, отделяя их друг от друга пробелами или нажатием клавиши Enter. При завершении ввода данные тут же будут выведены на экран самым примитивным образом. Так, если ввести целое 5 и дробное 9.9, то строка вывода будет иметь вид:

5 9.900000

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

При выводе данных для улучшения читабельности рекомендуется использовать некоторые приемы.

1. Управляющие символы потока, например:

\n для перевода строки при выводе;

\t для выполнения табуляции.

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

printf ("Целое = %d, Вещественное = %f\n", my_int, my_float);

Пробелы в строке текста являются значащими. Теперь, если ввести целое 5 и дробное 9.9, то строка вывода будет иметь вид:

Целое = 5, Вещественное = 9.900000

3. Модификаторы форматов. Они используются для оформления вывода. По умолчанию (без модификаторов) данные выводятся в поле минимальной ширины с точностью 6 знаков после запятой, число прижимается к правому краю поля. Выводом можно управлять.

а) Ширина поля, это строка цифр, определяющая наименьший размер поля вывода (позиционирование). Число, не входящее в поле, игнорируется.

б) Точность вывода, это две цифры, определяющие общий размер поля вывода и число знаков после запятой. Используется для вещественных чисел.

В примерах обозначим знаком ˽ пробелы, которые будут в строке вывода.

printf ("Целое = %4d, Вещественное = %5.2f\n", my_int, my_float);

Если ввести значения 10 и 2.3, то строка вывода будет иметь вид:

Целое = ˽˽10, Вещественное = ˽2.30

Если ввести значения 19951 и 12.9999, то строка вывода будет иметь вид:

Целое = 19951, Вещественное = 13.00

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

в) Знак минус используется для выравнивания числа влево внутри поля вывода.

printf ("Целое = %–4d, Вещественное = %–5.2f\n", my_int, my_float);

Если ввести значения 2 и 2.36666, то строка вывода будет иметь вид:

Целое = 2˽˽˽, Вещественное = 2.37˽

Если ввести значения -1999 и 12.9999, то строка вывода будет иметь вид:

Целое = –1999, Вещественное = 13.00

Пример использования форматированного ввода-вывода.

#include stdio.h

#define STR "Программа" // Для иллюстрации вывода строк.

void main (void)

{

// Вывод целого числа 336

printf ("%d\n", 336); // 336

printf ("%2d\n", 336); // 336, формат 2d игнорируется

printf ("%8d\n", 336); // ˽˽˽˽˽336 // ширина поля вывода = 8

printf ("%-8d\n", 336); // 336˽˽˽˽˽ // прижато влево ширина поля 8

printf("\n"); // Пропуск строки при выводе

// Вывод вещественного числа 12.345

printf ("%f\n", 12.345); // 12.345000

printf ("%e\n", 12.345); // 1.234500е+01

printf ("%10.1f\n", 12.345); // ˽˽˽˽˽˽12.3

printf ("%–12.1f\n", 12.345); // 12.3

printf("\n");

// Вывод строки символов по формату s

printf ("%s\n", STR); // Программа

printf ("%12s\n", STR); // ˽˽˽Программа

printf ("%12.5s\n", STR); // ˽˽˽˽˽˽˽Прогр

printf ("%-12.5s\n", STR); // Прогр

printf("\n");

}

Организация ввода/вывода в стиле С++

Для управления вводом/выводом данных в стиле С++ применяется заголовочный файл iostream.h. В нем определены стандартные объекты-потоки cin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток « и чтения из потока ».

cin»список_ввода; // ввод значения данного с клавиатуры

cout«список_вывода; // вывода значения данного на экран

Пример программы, использующей функции ввода/вывода в стиле С:

#include

int main()

{

int i;

printf("Введите целое число\n");

scanf("%d",&i);

printf("Вы ввели число %d, спасибо!",i);

return 0;

}

А вот как выглядит та же программа с использованием библиотеки классов C++:

#include

int main()

{

int i;

cout«"Введите целое число\n";

cin»i;

cout«"Вы ввели число "«i«", спасибо!";

return 0;

}

Форматированный ввод/вывод в С++

Возможность управлять вводом-выводом в С++, обеспечивают форматирующие функции-члены, флаги и манипуляторы. Флаги, функции и манипуляторы выполняют одну и туже задачу – задают определённый формат ввода/вывода информации в потоках. Ввод/вывод на экран/с экрана в С++ осуществляется с помощью операторов cin и cout соответственно, а значит  манипуляторы форматирования используются совместно с данными операторами ввода/вывода. Различие между функциями, флагами и манипуляторами форматирования состоит в способе их применения. Теперь рассмотрим способы применения объектов форматирования.

//Основные форматирующие функции-члены:

cout.fill('/*symbol*/');     // устанавливает символ заполнитель

//где symbol – символ-заполнитель, символ передаётся в одинарных кавычках

 

cout.width(/*width_field*/); // задает ширину поля

//где width_field - количество позиций (одна позиция вмещает один символ)

 

cout.precision(/*number*/); //задает количество знаков после десятичной

// точки, где number - количество знаков после десятичной точки

Доступ к функциям осуществляется через операцию точка, а в круглых скобках передаётся аргумент. Аргумент функции fill() может передаваться в виде символа, обрамленного одинарными кавычками или в виде числа (код символа). Одних функций не достаточно для форматирования потоков ввода/вывода, поэтому в С++ предусмотрен ещё один способ форматирования – флаги.

Флаги форматирования позволяют включить или выключить один из параметров ввода/вывода.  Чтобы установить флаг ввода/вывода, необходимо вызвать функцию setf(), если необходимо отключить флаг вывода, то используется функция  unsetf(). Далее показаны конструкции установки и снятия флагов вывода.

// установка флага вывода

cout.setf( ios::/*name_flag*/ );

// где name_flag - это имя флага

Доступ к функциям оператора вывода выполняется через операцию точка. Метод setf() принимает один аргумент – имя флага. Флаги вывода объявлены в классе ios, поэтому, перед тем, как обратиться к флагу, необходимо написать имя класса – ios, после которого, с помощью операции разрешения области действия, вызвать нужный флаг.

// снятие флага вывода

cout.unsetf( ios::/*name_flag*/ );

// где name_flag - это имя флага

Если при вводе/выводе необходимо установить/снять несколько флагов, то можно воспользоваться поразрядной логической операцией ИЛИ |. В этом случае конструкция языка C++ будет такой:

// установка нескольких флагов

cout.setf( ios::/*name_flag1*/ | ios::/*name_flag2*/ | ios::/*name_flag_n*/ );

// снятие нескольких флагов

cout.unsetf( ios::/*name_flag1*/ | ios::/*name_flag2*/ | ios::/*name_flag_n*/ );

В таблице 4 описаны некоторые основные флаги форматирования, а также показаны примеры их использования.

Таблица 4 – Некоторые флаги форматирования в С++

Флаг

Назначение

Пример

Результат

cientific

Вывод чисел с плавающей точкой в экспоненциальной форме

cout.setf(ios::scientific);

double value = 1024.165;

cout

1.024165e+003

fixed

Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию)

double value = 1024.165;

cout

1024.165

right

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

cout.width(40);

cout

__cppstudio.com 

left 

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

cout.setf(ios::left);

cout.width(40);

cout

cppstudio.com__

Ещё один способ форматирования – форматирование с помощью манипуляторов. Манипулятор – объект особого типа, который управляет потоками ввода/вывода, для форматирования передаваемой в потоки информации. Отчасти манипуляторы дополняют функционал, для форматирования ввода/вывода. Но большинство манипуляторов выполняют точно, то же самое, что и функции с флагами форматирования. Есть случаи, когда проще пользоваться флагами или функциями форматирования, а иногда удобнее использовать манипуляторы форматирования. Именно по этому в С++ предусмотрено несколько средств форматирования ввода/вывода. В таблице 5 показаны основные манипуляторы форматирования С++.

Таблица 5 – Некоторые манипуляторы форматирования в С++

Манипулятор

Назначение

Пример

Результат

endl

Переход на новую строку при выводе

cout

website:
cppstudio.com

scientific

Вывод чисел с плавающей точкой в экспоненциальной форме

double value = 1024.165;

cout

1.024165e+003

fixed

Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию).

double value = 1024.165;

cout

1024.165

setw(int number)

Установить ширину поля, где number - количество позиций, символов (выравнивание по умолчанию по правой границе). Манипулятор с параметром.

cout

__cppstudio.com

right

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

cout

__cppstudio.com

left 

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

cout

cppstudio.com__

setprecision(int count)

Задаёт количество знаков после запятой, где count - количество знаков после десятичной точки

cout

6.750

setfill(int symbol)

Установить символ заполнитель. Если ширина поля больше, чем выводимая величина, то свободные места поля будут наполняться символом symbol - символ заполнитель

cout

0015

При использовании манипуляторов необходимо подключить заголовочный файл iomanip

Задания

Выполнение работы: в соответствии с вариантом составить и реализовать программы.

Задание I

Написать программу для расчета по двум формулам. Предварительно подготовить тестовые примеры для второй формулы с помощью калькулятора (результаты вычисления по обеим формулам должны совпадать). Список стандартных математических функций C++ приведен в приложении 2. Отсутствующие в языке функции выразить через имеющиеся.

  1. .

  1. .

  1. (m  0)

  1. (a  0)

  1. .

  1. .

  1. .

  1. .

  1. .

Задание II
  1. Составить программу вычисления объема конуса по заданному диаметру и образующей.

  2. Дана сторона равностороннего треугольника. Составить программу нахождения площади этого треугольника и радиуса описанной окружности.

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

  4. Составить программу нахождения суммы n членов арифметической прогрессии, для которой известен первый член, разность и число n.

  5. Вычислить объем призмы, боковые грани которой - квадраты, а основанием служит равносторонний треугольник, вписанный в круг радиуса r.

  6. Вычислить площадь прямоугольника, вписанного в окружность радиуса r, если отношение его сторон равно R.

  7. Даны две стороны треугольника и угол между ними. Определить третью сторону и площадь.

  8. Вычислить процент материала, ушедшего в отходы, если из куба с ребром а был выточен шар радиуса r ( а).

  9. Вычислить площадь кольца, ширина которого равна а, а отношение радиусов окружностей равно b.

  10. Вычислить периметр и площадь прямоугольного треугольника, описанного около круга радиуса r, если гипотенуза треугольника равна с.

  11. Вычислить диаметр трубы, пропускная способность которой позволяет заменить ею две трубы с диаметрами d1 и d2.

  12. Вычислить высоты треугольника со сторонами a, b и с.

  13. Вычислить площадь правильного n-угольника, описанного около круга радиусом r.

  14. Высота конуса равна h, а радиус основания r. Вычислить объем шара, вписанного в конус.

  15. Вычислить массу свинцовой трубы, длина которой равна b м (плотность свинца равна 11,4 г/см3), толщина стенок а мм, а внутренний диаметр трубы равен d мм.

  16. Дан равносторонний треугольник. Вычислить сторону, высоту и площадь этого треугольника, если радиус вписанной окружности равен r.

  17. Стальной вал, имеющий b мм длины и d мм в диаметре, обтачивается на токарном станке, при этом диаметр уменьшается при обточке на S мм. Вычислить, на сколько уменьшается масса тела (плотность стали 7,4 г/см3).

  18. Вычислить объем призмы, боковые грани которой – квадраты. Основанием призмы служит равносторонний треугольник, заданный длиной стороны.

  19. В конус с радиусом основания r и высотой h вписан цилиндр, радиус основания которого равен а. Вычислить объем цилиндра.

  20. Даны две стороны треугольника d и с и угол между ними a. Найти радиусы окружностей: вписанной в треугольник и описанной около него.

  21. Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.

  22. Треугольник задан тремя сторонами. Вычислить его высоты.

  23. Определить периметр правильного n-угольника, описанного около окружности радиуса R.

  24. Смешано V1 литров воды температуры Т1 и V2 литрами воды температуры Т2. Найти объем и температуру образовавшейся смеси.

  25. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

  26. Даны гипотенуза и катет прямоугольного треугольника. Найти второй катет и радиус вписанной окружности.

  27. Найти площадь кольца, внутренний радиус которого равен R1, а внешний - R2 (R2  Rl).

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

  29. Вычислить расстояние между двумя точками с координатами (x1y1) и (x2y2).

  1. Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.

Задание III
  1. Радоновые ванны, применяемые для лечения, содержат 1.8·106 атомов радона в воде объемом 1.0 дм3. На сколько молекул воды приходится один атом радона в лечебной ванне?

  2. Сколько атомов ртути содержится в воздухе объемом 1.0 м3 в помещении, зараженном ртутью, при температуре 20°С, если давление насыщенного пара ртути при этой температуре 133 мПа?

  3. Какова длина ребра куба, содержащего 1.0·106 молекул идеального газа при нормальных условиях?

  4. При какой температуре молекулы гелия имеют такую же среднюю скорость, как молекулы кислорода при 23°С?

  5. Найдите среднюю кинетическую энергию поступательного движения молекул водорода, если при давлении 0.5 атм. их концентрация равна 1.5·109 м-3.

  6. Газ нагревается в открытом сосуде при нормальном атмосферном давлении от 27°С до 327°С. Какое приращение получает при этом число молекул в единице объема газа?

  7. В сосуде объемом 1 дм3 содержится некоторый газ при температуре 17°С. Найти приращение давления газа, если вследствие утечки газа из него выйдет 1021 молекул.

  8. В сосуде объемом 3.0 дм3 находится гелий массой 4.0 мг, азот массой 70 мг и 5.0·1021 молекул водорода. Каково давление смеси, если температура ее 27°С?

  9. Определить среднюю кинетическую энергию вращательного движения молекул водорода, содержащихся в 1.0 моль при 18°С.

  10. При какой температуре молекулы кислорода имеют такую же среднюю скорость, как молекулы водорода при 25°С?

  11. Сколько молекул содержится при нормальных условиях в 1м3 воздуха?

  12. В сосуде объемом 2.0 дм3 находится газ под давлением 0.50 МПа. Чему равна средняя кинетическая энергия поступательного движения молекул газа?

  13. Кислород массой 12 г находится при температуре 700°С, при этом 40% молекул диссоциировано на атомы. Чему равна средняя кинетическая энергия теплового движения частиц? Колебательные степени свободы молекул кислорода не возбуждаются.

  14. Объём помещения 50 м3 . температура воздуха зимой 0°С, а летом – 40°С. Какова разница в массе воздуха, заполняющего помещение зимой и летом? Принять μ = 29 кг/моль.

  15. Плотность воздуха при нормальных условиях 1.3 г/л. Какова плотность воздуха при температуре 100°С и давлении 4.0·105 Н/м2?

  16. Температура воздуха в баллоне объёмом 10 м3 при давлении 700 мм рт. ст. была 15°С. После нагрева воздуха до 20°С часть воздуха была вытеснена. Найдите массу вытесненного воздуха.

  17. Сколько частиц (атомов и молекул) находится в азоте массой 1.0 г, если степень диссоциации азота 7.0%.

  18. Какое давление на стенки сосуда производит кислород, если средняя квадратичная скорость его молекул 400 м/с и концентрация молекул 2.7·1019 м-3?

  19. Найдите среднюю кинетическую энергию поступательного движения молекул гелия, если при давлении 0.5 атм. их концентрация равна 1.5·109 м3.

  20. Определите температуру газа, если средняя кинетическая энергия поступательного движения его молекул равна 1.6·10-19 Дж.

  21. Каково давление газа, если в каждом кубическом сантиметре его содержится 1.0·106 молекул, а температура газа 87°С?

  22. Газ нагревается в открытом сосуде при нормальном атмосферном давлении от 22°С до 320°С. Какое приращение получает при этом число молекул в единице объема газа?

  23. В сосуде объемом 15.0 дм3 находится газ под давлением 0.50 МПа. Чему равна средняя кинетическая энергия поступательного движения молекул газа?

  24. При какой температуре молекулы гелия имеют такую же среднюю скорость, как молекулы водорода при 27°С?

  25. Газ занимает объём 2 л при давлении 5·105 Н/м2. Определите суммарную энергию поступательного движения молекул газа.

Задания для самостоятельной работы
    1. Даны два действительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.

    2. Даны четыре целых числа. Найти среднее арифметическое этих чисел и среднее геометрическое этих чисел.

    3. Треугольник задан длинами своих сторон. Используя формулу Герона, найти площадь этого треугольника.

    4. Идет k-я секунда суток. Определить сколько полных часов H, полных минут М прошло к этому моменту.

    5. Даны два момента времени одних суток: H1, H2 - часы, M1, M2 - минуты. Определить интервал между этими моментами в часах H и минутах M.

    6. По трем координатам вершин некоторого треугольника найти его высоту.

    7. Найти объем и площадь боковой поверхности конуса радиусом r, высотой h и образующей l.

    8. Вычислить боковую поверхность пирамиды (пирамида правильная, усеченная), если известны р и p1 - полупериметры нижнего и верхнего оснований и k - апофема.

    9. Найти объем и полную поверхность полого шара, если известны r1 и r2 - радиусы внешней и внутренней шаровых поверхностей.

    10. Вычислить площадь поверхности и объем усеченного конуса высотой h, радиусами r1 и r2, образующей l.

    11. В шар радиуса r вписан конус с углом а при вершине в осевом сечении конуса. Определить объем и полную поверхность конуса.

    12. Вычислить объем цилиндра, вписанного в правильную шестиугольную призму, у которой каждое ребро равно а.

    13. Найти площадь равнобокой трапеции с основаниями А и В и углом a при большем основании A.

    14. Треугольник задан величинами своих углов и радиусом описанной окружности. Найти, стороны треугольника.

    15. Найти объем правильной треугольной пирамиды, если стороны ее основания равны а и плоский угол при ее вершине равен a.

    16. Вычислить радиус шара, вписанного в правильную четырехугольную пирамиду, если стороны основания пирамиды равны а и двухгранный угол при основании равен a.

    17. Вычислить площадь круга и равнобедренной трапеции, описанной около него, если периметр трапеции равен р, а угол при нижнем основании равен а.

    18. Вычислить объем призмы, боковые грани которой – квадраты. Основанием призмы служит равносторонний треугольник, по который известно, что радиус вписанной в него окружности равен r.

Содержание отчета

См. приложение 1 и пример выполнения лабораторной работы

Контрольные вопросы
  1. Что такое программа на С++?

  2. Какая программа является линейной?

  3. Какова структура программы на С++?

  4. Что такое идентификатор?

  5. По каким правилам создаются идентификаторы в С++?

  6. Что такое тип величины?

  7. Какие типы величин используются в языке С++?

  8. Какие типы величин относятся к простым типам?

  9. В каком диапазоне могут изменяться переменные типа int и float?

  10. Как описываются переменные в С++? (Привести пример.)

  11. Что такое операторные скобки? Каково их назначение?

  12. Как выполняется команда присваивания?

  13. Какая инструкция предназначена для вывода на экран сообщений?

  14. Какая инструкция предназначена для ввода данных?

  15. Что такое заголовочный файл? Приведите пример заголовочного файла.

  16. Каково назначение заголовочных файлов?

  17. Как сохранить программу? (Устно)

  18. Как осуществить компиляцию текста программы? (Устно)

  19. Как осуществить запуск программы? (Устно)

  20. Как считать готовую программу с диска? (Устно)

Список литературы, рекомендуемый к использованию по данной теме:

[1] стр. 5-16, 18-26, 28, 45-57, 145-152, 161-164;

[5] Ввод-вывод, оператор присваивания, арифметические операции - https://informatics.msk.ru/mod/book/view.php?id=578;

[6] Действительные числа - https://stepik.org/lesson/13024/step/1?unit=4376/.

[9] Типы данных https://www.youtube.com/watch?v=pwUNLjgw7lY&list=PLQOaTSbfxUtCrKs0nicOg2npJQYSPGO9r&index=6.


Учить: п. 2.1-2.7.

Письменно ответить на контрольные вопросы.


Указания по технике безопасности см. приложение 4.



Пример выполнения лабораторной работы

Задание I. Напишите программу для расчета по двум формулам. Отсутствующие в библиотеке языка функции выразите через имеющиеся.

Решение

  1. Математическая модель

В библиотеке math.h языка С++ отсутствует функция ctg(x), поэтому выразим ее через имеющуюся функцию tg(x), используя известное соотношение:

.

Запись выражений на языке С++ примет вид:

z1 = tan(x) - 1/tan(7*pi/6); z2 = tan(7*pi/8) - sqrt(3.0) * tan(pi/8) * tan(x).

Аргументы: х – вещественного типа.

Результаты : z1, z2 – вещественного типа.

  1. Алгоритм (блок - схема)



3. Программа

//подключение заголовочных файлов

#include iostream //для организации ввода-вывода в С++

#include conio.h //для организации консольного ввода-вывода

#include math.h //для работы с математическими функциями

using namespace std; // описание пространства имен std

int main() // заголовок главной функции

{ // тело функции

const double pi = 3.14159265359; // описание константы

double z1, z2, x; // описание переменных

cout// вывод сообщения на экран

cinx; // ввод переменной х

//вычисляем значения переменных z1, z2

z1 = tan(x)-1/tan(7*pi/6); //присвоение переменной z1 значения выражения

z2 = tan(7*pi/8)-sqrt(3.0)*tan(pi/8)*tan(x);

coutz1 = "z1z2 = "z2; // вывод данных на экран

_getch(); //функция ожидания нажатия клавиши из conio.h

return 0; //главная функция возвращает целочисленное значение 0

}

4. Результат работы программы

Введите х = 4

z1 = -0.57

z2 = -1.24


Задание II. Написать программу для вычисления длины окружности и площади круга заданного радиуса.

Решение

  1. Математическая модель

Аргументы: радиус окружности r, вещественного типа.

Результаты: длина окружности l и площадь круга S, вещественного типа.

  1. Блок – схема

  1. Программа

4 . Результат работы программы:

Введите радиус: r = 5

Длина окружности: l = 31.4

Площадь круга: S = 78.5



//программа нахождения длины окружности и площади

// круга заданного радиуса

#include iostream

#include


using namespace std;


int main()//заголовок главной функции

{//описание переменных, начальные установки

setlocale(LC_ALL,"Rus");

double pi = 3.14;

double r, l, S;

coutВведите радиус: r = ";

cinr; // ввод переменной

//вычисление по формулам

l = 2*pi*r;

S = pi*r*r;

//вывод данных

coutendll = "l;

coutПлощадь окружности: S = "

_getch();

//главная функция возвращает целое значение 0

return 0;

}



Лабораторная работа № 3
Программирование алгоритмов разветвляющейся структуры

ЦЕЛЬ РАБОТЫ: приобретение навыков программирования вычислительных разветвляющихся процессов с использованием условного, составного операторов, оператора выбора (множественного ветвления) и оператора безусловного перехода.

Знания, умения и владения, приобретаемые обучающимся в результате освоения темы, в рамках формируемых компетенций (ИД-1 ОПК -2, ИД-2 ОПК 2,
ИД-3 ОПК-2, ИД-1ОПК-5, ИД-2 ОПК-5, ИД-3 ОПК-5): см. приложение 3: вырабатывается навык разработки математических и информационных моделей, а также формируется способность к разработке и применению алгоритмических и программных решений (разветвляющейся структуры) в области прикладного программирования с умением объяснить теоретическую и практическую часть темы (формируется часть указанных компетенций).

Оборудование и материалы: ПЭВМ с микропроцессором не ниже Pentium 4 объем свободной памяти в ПЗУ не менее 2-3 гб, объем ОЗУ не менее 512 мб.

Теоретическая часть
Операторы ветвления 3.1. Простые и составные условия

В C++ условие – выражение логического типа (bool), которое может принимать одно из двух значений: «истина» (true) или «ложь» (false). Внутренняя форма представления значения false - 0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.

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

 (больше),

==  (равно), !=  (не равно),

=  (больше либо равно),

Условия, которые составлены с использованием одного оператора сравнения, называются простыми условиями, например, x + y 0.

Общий вид:

выражение оператор сравнения выражение

Из простых условий, которые являются выражениями логического типа можно строить сложные условия, применяя к ним, как к операндам, логические операторы: ! (не), && (и), || (или).

Логические операции выполняются слева направо. Если значение первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется. Для изменения порядка действий используются круглые скобки.

Итак, составные условия – это простые условия, связанные при помощи логических операторов: (x  5) ||  (a + b 

Операция &&

Логическую операцию && (и) используют, если нужно, чтобы одновременно выполнялись два условия. C++ это записывается так:

(условие1) && (условие2)

На практике эта логическая операция часто применяется для создания условия принадлежности некоторой переменной указанному промежутку. Например, составим условие, которое будет истинно тогда и только тогда, когда переменная х принадлежит промежутку от 10 до 20: 10 x х 10 и x (x 10) && (x .

Операция ||

Логическую операцию || (или) используют, когда хотят сформулировать условие, которое будет истинно в том случае, когда верно хотя бы одно условие из двух. В C++ эта операция используется так:

(условие1) || (условие2)

Операция !

Логическую операцию ! (не – логическое отрицание) используют, если нужно проверить условие (выражение) на ложность. Эта операция делает ложным истинное условие и истинным ложное. Запись операции:

! (условие)

В таблице 6 приводятся результаты применения логических операторов к операндам логического типа. Для наглядности вместо значения false используется 0, true – 1.

Таблица 6 – Логические операции


a

b

a && b

a || b

! a

0

0

0

0

1

0

1

0

1

1

1

0

0

1

0

1

1

1

1

0


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

3.2. Составной оператор

К составным операторам относятся собственно составные операторы и блоки.

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



Формат оператора:

{

оператор1;

оператор2;

...

операторN;

}

Блок отличается тем, что в его состав входят описания каких-либо объектов программы. Например:

{// Это составной оператор

n ++;

S += n;

}

{// Это блок

int  n = 0;

n ++;

S += n;

}

Блоки, чаще всего, используются в качестве тела функции. Составной оператор используется в любом случае, когда несколько операторов следует объединить в один. Это необходимо в условных операторах и операторах цикла, согласно синтаксису которых, исполнимым является только один оператор. Чаще всего, составной оператор формирует ветвь условного оператора или тело цикла в операторах цикла.

3.3. Условная операция (?:)

Эта операция тернарная, то есть имеет три операнда.

Формат операции:

операнд_1 ? операнд_2 : операнд_3

Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю – как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе – третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if.

Пример: Вывести на экран минимальное из двух значений.

#include

int main ( )

{

int a = 10, b = 5, min;

min = (b ? b : a ;

printf(“Наименьшее число: %d”, min);

return 0;

}

Результат работы программы:

Наибольшее число: 5

Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1:

i = (i ? i + 1: 1;

3.4. Условный оператор if

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

Формат оператора:

if (условие) оператор 1; else оператор 2;

Инструкция выполняется следующим образом:

  1. Вычисляется значение условия (выражения), которое может иметь арифметический тип или тип указателя.

  2. Если значение выражения (условия) не равно нулю (имеет значение true), выполняется первый оператор, следующий за условием. Если значение выражения (условия) равно false, то выполняются инструкции, следующие за словом else.

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

if (условие) оператор;

Если значение логического выражения истинно, то выполняются инструкции, следующие за условием. Если значение выражения ложно, то выполняется инструкция, следующая непосредственно после оператора if.

Если после условия или служебного слова else требуется выполнить несколько операторов, то их оформляют в виде составного.

Структура команды «Ветвление» называется вложенной, если после условия или служебного слова else используются вновь условные операторы. Число вложений может быть произвольным. При этом справедливо следующее правило: служебное слово else всегда относится к ближайшему if.



Таблица 7 – Графическая интерпретация условного оператора.

Неполная форма записи

Полная форма записи

если-то

a)

+



b)

+


если-то-иначе

b)

a)

+


+


Замечание. В таблице 7 приводятся блок-схемы возможных вариантов алгоритма команды «Ветвление» (условного оператора) случаи

a) для простых операторов;

b) для составных, когда при выполнении условия или при не выполнении его требуется исполнить несколько операторов: оператор 1, оператор 2, …, оператор n. В программе данную серию операторов: оператор 1, оператор 2, …, оператор n оформляют в виде составного оператора или блока, заключив их в операторные скобки.



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

1 вариант решения:

2 вариант решения:

Программа на С++

//min_of_3_numbers;

#include

#include

using namespace std;


int main()

{

setlocale(LC_ALL,"Rus");

int a, b, c, min;

cout

cinabc;

if (a

if (a случай, когда a

else min = c;

else

if (b случай, когда a = b

else min = c;

coutmin;

_getch();

return 0;

}

//min_of_3_numbers;

#include

#include

using namespace std;


int main()

{

setlocale(LC_ALL,"Rus");

int a, b, c, min;

cout

cinabc;

min = a;

if (b

if (c

coutmin;

_getch();

return 0;

}


Результат работы программы:

Введите 3 числа через пробел:

12 5 -7

Минимальное число = -7


3.5. Оператор switch

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

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Блок-схема оператора выбора (switch) предложена в таблице 8.

Формат оператора:

switch ( выражение )

{

case константное_выражение_1: [оператор_1];

case константное_выражение_2: [оператор_2];

case константное_выражение_n: [оператор_n];

[default: оператор_n + 1];

}

Оператор выбора является обобщением условного оператора. Выполнение оператора начинается с вычисления выражения (оно должно быть целочисленным), а затем управление передается первому оператору из списка, помеченного константным выражением, значение которого совпало с вычисленным. После этого, если выход из переключателя явно не указан, последовательно выполняются все остальные ветви. Затем управление передаётся оператору, следующему за оператором выбора. Если значение выражения не совпадает ни с одним константным выражением, то выполняется оператор n + 1.

Таблица 8 – Оператор выбора (блок-схема)

Неполная форма записи

Полная форма записи

выбор