Пути, маршруты, цепи и циклы.

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

Вершины v0, vn называются связанными данным путем (или просто связанными). Вершину v0 называют началом, vn - концом пути. Если v0 = vn, то путь называют замкнутым. Число n называется длиной пути.

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

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

Граф отношения делимости

Построим граф, изображающий отношение делимости на множестве {1,2,3,4,5,6,7,8,9,10}. Принцип такой: если от одного числа до другого есть цепь, ведущая вверх, тогда второе число делится на первое (рис. 2.16).

пути, маршруты, цепи и циклы. - student2.ru

Рис. 2.16

ПОДГРАФЫ

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

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

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

Связность графа

Граф называется связным, если любая пара его вершин связана.
Связными компонентами графа называются подграфы данного графа, вершины которых связаны.

Деревья

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

Генеалогическое дерево

На рисунке 2.17 показано библейское генеалогическое дерево.

пути, маршруты, цепи и циклы. - student2.ru

Рис. 2.17

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

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

В теории графов применяются



  1. Матрица инцинденций. Это матрица А с n строками, соответствующими вершинам, и m столбцами, соответствующнго рёбрам. Для ориентированного графа столбец, соответствующий дуге (х,y) содержит - 1 в строке, соответствующей вершине х и 1, в строке, соответствующей вершине у. Во всех остальных 0. Петлю, т.е. дугу (х,х) можно представлять иным значением в строке х, например, 2. Если граф неориентированный, то столбец, соответствуюший ребру (х,у) содержит 1, соответствующие х и у и нули во всех остальных строках.
  2. Матрица смежности. Это матрица n×n где n - число вершин, где bij = 1, если существует ребро, идещее из вершины х в вершину у и bij = 0 в противном случае.

Составим матрицы инциндентности и смежности для следующего непрерывного графа (рис. 2.18)

пути, маршруты, цепи и циклы. - student2.ru Рис. 2.18 Матрица инцидентности пути, маршруты, цепи и циклы. - student2.ru Матрица смежности пути, маршруты, цепи и циклы. - student2.ru

Вопрос №9

Алгоритм – точное, понятное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи.

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

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

  1. Дискретность.
  2. Конечность и понятность
  3. Детерминированность
  4. Массовость
  5. Результативность

Дискретность - это свойство алгоритма, когда алгоритм разбивается на конечное число элементарных действий (шагов).

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

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

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

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

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

  1. Словесное описание (на языке исполнителя).

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

  1. Табличное описание.
ФИО 1.Кол-во дней 2.Дневная тарифн. ставка 3. З/пл= 1*2
Иванов
  1. Графическое описание или блок – схема алгоритма.

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

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

  НАЧАЛО   - начало алгоритма
  КОНЕЦ   - конец алгоритма
    - ввод/вывод
  - оператор действия
  - проверка условия

Внутри блока запись не формализована

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

Рассмотрим запись алгоритма Евклида на псевдокоде:

Алг алгоритм Евклида

Арг N,M

Рез НОД

Нач

Пока N ¹M

Н.ц.

Если M > N

То M: = M-N

Иначе N: = N-M

Всё

К.ц.

НОД: = M

Кон

  1. На алгоритмическом языке (программа).

Алгоритмический язык ориентирован на исполнителя ЭВМ, полностью формализованная запись алгоритма.

Вопрос №10

Основными алгоритмическими структурами являются:

следование;

ветвление;

цикл.

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

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

Конструкция следования:

пути, маршруты, цепи и циклы. - student2.ru

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

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

Различают две формы ветвления:

полное;

неполное.

Конструкция полного ветвления:

пути, маршруты, цепи и циклы. - student2.ru

Конструкция неполного ветвления:

пути, маршруты, цепи и циклы. - student2.ru

«Цикл» — это часть алгоритма, в которой некоторую последовательность действий необходимо повторить несколько раз.

Алгоритм циклической структуры — алгоритм, в котором предусмотрено выполнение одной и той же последовательности действий.

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

Конструкция цикла «до»:

пути, маршруты, цепи и циклы. - student2.ru

В цикле «пока» тело цикла выполняется до тех пор, пока выполняется условие.

Конструкция цикла «пока»:

пути, маршруты, цепи и циклы. - student2.ru

Циклический алгоритм позволяет существенно сократить объем программы.

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

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

изменение значения этой переменной перед каждым новым повторением цикла;

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

Существует два вида циклов:

цикл «до»;

цикл «пока».

В цикле «до» тело цикла выполняется определенное количество раз.

Вопрос №11

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

  1. Постановка задачи:
    • сбоp инфоpмации о задаче;
    • фоpмулиpовка условия задачи;
    • опpеделение конечных целей pешения задачи;
    • определение формы выдачи результатов;
    • описание данных (их типов, диапазонов величин, структуры и т.п. ).
  2. Анализ и исследование задачи, модели:
    • анализ существующих аналогов;
    • анализ технических и программных средств;
    • pазpаботка математической модели;
    • разработка структур данных.
  3. Разработка алгоритма:
    • выбор метода проектирования алгоритма;
    • выбор формы записи алгоритма (блок-схемы, псевдокод и др.);
    • выбоp тестов и метода тестиpования;
    • проектирование алгоритма.
  4. Пpогpаммиpование:
    • выбор языка программирования;
    • уточнение способов организации данных;
    • запись алгоpитма на выбpанном языке пpогpаммиpования.
  5. Тестиpование и отладка:
    • синтаксическая отладка;
    • отладка семантики и логической стpуктуpы;
    • тестовые pасчеты и анализ pезультатов тестиpования;
    • совершенствование пpогpаммы.
  6. Анализ результатов решения задачи и уточнение в случае необходимости математической модели с повторным выполнением этапов 2 — 5.
  7. Сопровождение программы:
    • доработка программы для решения конкретных задач;
    • составление документации к pешенной задаче, к математической модели, к алгоpитму, к пpогpамме, к набору тестов, к использованию.

Вопрос №12

Алфавит C++

Алфавит (или множество литер) языка программирования C++ основывается на множестве символов таблицы кодов ASCII. Алфавит C++ включает:

  • строчные и прописные буквы латинского алфавита (мы их будем называть буквами),
  • цифры от 0 до 9 (назовём их буквами-цифрами),
  • символ '_' (подчерк - также считается буквой),
  • набор специальных символов:
    " { } , | [ ] + - % / \ ; ' : ? < > = ! & # ~ ^ . *
  • прочие символы.

Алфавит C++ служит для построения слов, которые в C++ называются лексемами. Различают пять типов лексем:

  • идентификаторы,
  • ключевые слова,
  • знаки (символы) операций,
  • литералы,
  • разделители.

Почти все типы лексем (кроме ключевых слов и идентификаторов) имеют собственные правила словообразования, включая собственные подмножества алфавита.

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

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

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

Программа на языке С++ состоит из директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций.

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

#define, #elif, #else, #endif, #if, #ifdef, #ifndef, #include, #undef. Директива #define используется для задания констант, ключевых слов, операторов и выражений, используемых в программе. Общий синтаксис данной директивы имеет следующий вид:

#define <идентификатор> <текст>

или

#define <идентификатор> (<список параметров>) <текст>

Следует заметить, что символ ‘;’ после директив не ставится. Приведем примеры вариантов использования директивы #define.

Вопрос №13

Операции языка программирования С++. Приоритеты операций

· математические операции

· присваивание

· составное присваивание

· преобразование типов

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

· операции инкремента (++) и декремента (--)

· операция sizeof

· операция <<запятая>>

· оператор ?:

· указатель; определение адреса переменной

· таблица приоритетов операций языка С++

Математические операции

Таблица 1.3.1.

Знак Математическая операция

* Умножение

/ Деление и целочисленное деление нацело

% Деление по модулю и остаток от деления

+ Сложение

- Вычитание

Знак / всегда означает деление. Однако если с обеих сторон от этого знака стоят целые величины (константы, переменные или их комбинации), он означает целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает.

Знак % означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины.

Примеры.

cout << 10/2 << "\n>> // 5 (остатка нет)

cout << 300/100 << "\n"; // 3 (остатка нет)

cout << 10/3 << "\n"; // 3 (остаток отброшен)

cout << 300/165 << "\n>> // 1 (остаток отброшен)

cout << 10%3 << "\n>; // 1 (остаток)

cout << 20/4 "\n"; // 0 (остатка нет)

Присваивание

В одной строке может стоять больше одной операции присваивания =.

Пример.a=b=c=d=100;

Знак = всегда означает: "переменной слева присвоить значение, стоящее справа ". Операция выполняется справа налево. Поэтому первой значение 100 получает переменная d, затем с, b и а.

Знак присвоить может стоять даже внутри математического выражения:

value=5+(r=9-c)

Присваивание имеет более высокий приоритет, чем сложение и вычитание. Поэтому сначала переменной r будет присвоено значение 9-с. А затем переменная value получит значение 5+9-с.

Составное присваивание

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

Таблица 1.3.2.

Операция Пример Эквивалент

+ = B+ = 500; B= b+ 500;

- = С- = 50; C = с - 50;

* = D* = 1.2; D = d*1.2;

/ = F/ = 50; f = f/.50;

% = m% = 7; M = m% 7;

Преобразование типов

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

Формат:

(тип данных) выражение

Тип данных - это любой допустимый тип.

Выражение - переменная, константа или выражение.

Пример.

v=(double)age*f;

- переменная age временно преобразуется к типу с плавающей точкой двойной точности и умножается на переменную f.

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

Таблица 1.3.3.

Операции Описание

= = Равно

> Больше

< Меньше

>= Больше или равно

<= Меньше или равно

!= Не равно

Замечание 1.

Знак = никогда не используется как знак сравнения! Это знак присвоить значение.

Замечание 2.

В C++ нет логического типа. Поэтому, если выражение принимает ненулевое значение, то оно считается истинным, а если не нулевое - ложным.

Операции инкремента (++) и декремента (-)

В языке C++ предусмотрены две уникальные операции, которые увеличивают или уменьшают значение переменной на 1.

Таблица 1.3.4.

Оператор Пример Описание Эквивалентное выражение

+ + i + +; Постфиксная i =i+1; или i+=1;

+ + + + i; Префиксная i =i+1; или i+=1;

- - i - -; Постфиксная i =i-1; или i-=1;

- - - - i; Префиксная i =i-1; или i-=1;

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

Пример.

float a, b=2, c=1, d=1;

a = b + c++;

cout << "\n a=" << a <<"\t c= "<< c;

/* Даст результат a=3 c=2.

Используется постфиксный инкремент. Сначала произойдет сложение b и c, результат запишется в а, затем с будет увеличена на 1 */

a = ++d + b;

cout << "\n a=" << a <<"\t d= "<< d;

/* Даст результат a=4 d=2.

Используется префиксный инкремент. Сначала d будет увеличена на 1 (и станет равной 2), затем произойдет сложение d и b, результат запишется в а */

Операция sizeof

Имеет формат

sizeof данные

или

sizeof (тип данных)

Операция sizeof возвращает размер в байтах указанного в ней данного или типа данных.

Пример.

cout " "Размер типа float в байтах=\t" "sizeof (float)

Результат: 4.

Операция "запятая"

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

Пример 1.

main()

{

int i = 10,

j = 25;

}

Пример 2.

i = 10;

j=(i=12,i+8);

Результат выполнения: j=20. Сначала i получает значение 10, затем использование операции "запятая" приведет к тому, что i получит значение 12, а затем значение i+8, т.е. 12+8=20. Результат будет присвоен j.

Оператор ?:

(Условие) ? (выражение1):(выражение2)

Если условие истинно, то выполняется выражение1, а если ложно, то выражение2.

Пример.

(а>b) ? (ans =10):(ans=25);

или

ans=(a>b)?(10):(25);

Если а>b, то переменная ans получается значение 10, иначе - значение 0.25

Указатель. Определение адреса переменной

С++ позволяет на прямую работать с памятью. С любой переменной можно работать, указывая ее имя или ее адрес. Адреса переменных называются указателями, при описании указатель обозначается *.

Пример.

int * k; // k - указатель на переменную целого типа

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

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

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

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

Пример.

int *c; // с указатель на переменную типа int

float * d; // d указатель на переменную типа float

Примеры программ.

Пример 1. Выведем значения переменной и ее адреса в памяти

#include <iostream.h>

main()

{

int *c; int d;

d=45; c=&d; // с присваивается адрес переменной d

cout << "\n Адрес : " << с<< "\n 3начение по адресу с: " << *с <<"\n 3начение d: " << d;

return 0;

}

с - это указатель на число типа int.

Пример 2. Изменим значение переменной двумя способами:

1) с использованием имени переменной.

2) с использованием адреса переменной.

#include <iostream.h>

main()

{

int *c; int d;

c=&d; // с присваивается адрес переменной d

d=105; // первый способ

*с=105; // второй способ

cout <<"\n прочитаем значение переменной через ее имя "<< d;

cout <<"\n прочитаем значение переменную через ее адрес "<<*с;

return 0;

}

пути, маршруты, цепи и циклы. - student2.ru

Рисунок 1.3.1. Таблица приоритетов С++

Вопрос №14

Константа, переменная — это базовые понятия в любом языке программирования. Дадим им определения.

Константа — это величина, которая при выполнении программы остаётся неизменной.

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

Описание и инициализация переменных

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

int k; // это переменная целого типа int

double x; // это переменная вещественного типа удвоенной точности

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

double a, b, c;

После описания переменной её можно использовать, но возникает вопрос: а какое значение имеет переменная сразу же после её описания? Ответ таков: в программе на языке C или C++ переменная после описания имеет произвольное значение, то есть ей просто выделяется свободный участок памяти и на этом всё заканчивается. В переменной хранится та последовательность двоичных цифр, которая была там до выделения памяти под эту переменную. Такой подход таит определённую опасность: можно по ошибке использовать в выраении переменную, которой не было присвоено ни какое значение:

double x, y;

y = 2 * x;

Так как переменная x ни как не была определена, т. е. имела произвольное значение (чаще всего — это очень большое число или наоборот — очень маленькое), то и переменная y получит явно не то значение, на которое рассчитывал пользователь.

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

double a=3, b=4, c=5;

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

Задание и использование констант

Выше было дано определение констант. Теперь рассмотрим работу с константами более подробно.

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

25 — константа целого типа;

3.14 — вещественная константа;

'A' — символьная константа.

Все три приведённые здесь константы не имеют имени, они заданы своим внешним представлением и используются в программе непосредственно, например так:

int k=25; // переменная k инициализирована константой — целым числом 25.

В ряде случаев константе удобнее дать имя и использовать её далее по имени. Обычно это делается для математических или физических констант.

В языке C был единственный способ создания именованных констант — с помощью директивы препроцессора #define, например:

#define PI 3.14

...............

double t;

t = PI * 2; // здесь использована именованная константа PI, заданная выше

В языке C++ появился ещё один способ — использование константных переменных, то есть переменных, которые нельзя изменять после инициализации. Рассмотрим на том же примере:

const double PI=3.14; // здесь PI — константная переменная

double t;

t=PI * 2;

В чём преимущество от использования константных переменных вместо задания констант с помощью директивы препроцессора #define? Всё очень просто: при использовании константной переменной компилятор проверяет правильность задания константы, и если она будет задана неверно, то будет выдана ошибка именно в операторе, в котором дано определение константной переменной.

Если использована именованная константа, заданная директивой препроцессора #define, то ошибка будет показана только там, где используется константа. Например:

// в директиве препроцессора сделаем ошибку:

#define PI ююю

..............

double t;

t = PI * 2; // в этой строке компилятор выдаст ошибку,

// хотя на самом деле ошибка допущена гораздо раньше!

Вопрос №15

Явные и неявные преобразования типов в с++. Правила неявного преобразования.

Операции преобразования типа:

float a=1;

float b;

b=a+(int)2.1;

В Си используется автоматическое приведение типа при вычислениях (при вычислениях с различными типами данных):

int a=1;

float b;

b=a+2.1; //В результате: 3.1

Правила:

1)тип char приводится к short;

2)short - к int;

3)signed - к unsigned;

4)все целые типы преобразуются к long, а long - к unsigned long;

double f;

unsigned char ch;

unsigned long m;

int I;

f*(I+ch/m)

Результат операции в скобках приводится к double перед умножением.

Явное приведение типа.

Правила:

1. Целое со знаком преобразуется к более короткому целому со знаком путем усечения старших бит.

Unsigned char ch;

ch=()65535

Целое со знаком преобразуется к более длинному целому со знаком путем размножения знаков.

2. При преобразовании целого со знаком к целому без знака целое со знаком преобразуется к размеру целого без знака и результат интерпретируется как целое без знака.

Unsigned char ch1; //Пример описания. В других языках такого нет.

char ch2=-1;

ch1=ch2

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

4. Целое без знака преобразуется к более длинному целому со знаком путем расширения нулем.

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

Unsigned short A1=65535;

short A2=;

A2=A1;

A2

.1

6. Величина типа float преобразуется к double без изменения значений. Величины double, преобразованные к float, представляются точно, если это возможно.

7. При преобразовании величины с плавающей точкой к целым типам они сначала преобразуются к типу long, при этом дробная часть отбрасывается, а затем величины типа long преобразуются к требуемому типу. Если значение слишком велико для long, то результат будет не определён (отбрасывается младшая часть мантиссы).

Вопрос №16

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

Таблица: Манипуляторы ввода/вывода С++

Манипулятор Назначение Ввод/вывод

dec Ввод/вывод данных в десятичной форме ввод и вывод

endl Вывод символа новой строки с передачей в поток всех данных из буфера вывод

ends Вывод нулевого символа вывод

flush Передача в поток содержимого буфера вывод

hex Ввод/вывод данных в шестнадцатиричной системе ввод и вывод

oct Ввод/вывод данных в восьмеричной форме ввод и вывод

resetiosflags(long f) Сбрасывает флаги, указанные в f ввод и вывод

setbase(int base) Устанавливает базу счисления равной параметру base вывод

setfill(int ch) Устанавливает символ заполнения равным ch вывод

setiosflags(long f) Устанавливает флаги, указанные в f ввод и вывод

setprecision(int p) Устанавливает число цифр после запятой вывод

setw(int w) Устанавливает ширину поля равной w вывод

ws Пропускает начальный символ-разделитель ввод

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

Манипуляторы могут использоваться в составе выражений ввода/вывода. Ниже представлен пример программы, использующей манипуляторы для изменения формата вывода:

#include <iostream.h>

#include <iomanip.h>

int main()

{

cout << setiosflags(ios::fixed);

cout << setprecision (2) << 1000.243 << endl;

cout << setw (20) << "Hello there.";

return 0;

}

Программа выводит следующие данные:

1000 .24

Hello there.

Обратим внимание, как манипуляторы появляются в последовательности операторов ввода/вывода. Когда манипуляторы не имеют аргументов, как манипулятор endl в этой программе, за ними не следуют скобки. Причина этого в том, что оператору << передается адрес манипулятора.

Следующая программа использует функции setiosflags() для установки флагов scientific и showpos потока cout:

#include <iostream.h>

#include <iomanip.h>

main ()

{

cout << setiosflags(ios::showpos);

cout << setiosflags(ios::scientific);

cout << 123 << " " << 123.23;

return 0;

}

Следующая программа использует манипулятор ws для пропуска идущих вначале символов- разделителей при вводе строки в переменную s:

#include <iostream.h>

int main()

{

char s [80];

cin >> ws >> s;

cout << s;

}

Вопрос №17

Операция присваивания.

Рассматриваемая операция в языке С++ обозначается как "=". Оператор присваивания может использоваться в выражениях, которые включают в себя оператры сравнения или логические операторы. Например:

if ((f=x-y)>0) printf ("Число x больше, чем y");

Здесь вначале вычисляется величина x-y, которая присваивается переменной f. Далее ее значение сравнивается с нулем.

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

a=b=c=d=x*y;

Здесь Вы видите многократное использование знака присвоения "=". Как выполняется такой оператор? Сначала вычисляется значение правой части выражения: x*y. Далее полученное число записывается в память, отведенную под переменную "d". После этого это же значение записывается в память, отведенную под величину "с" и так далее под величины: "b" и "a". В левой части оператора присвоения должно стоять выражение, которому можно присваивать значение. Такие выражения в языке С, например, просто переменная, называются величиной lvalue. Например, выражение 2=2 ошибочно, так как константе нельзя присвоить никакое значение. Поэтому константа не является величиной lvalue.

В языке С++ имеются еще дополнительные операции со знаком присвоения. Это +=, -=, /=, %=. Поясним немного данные операции. Так, например, вместо выражения a=a+5 можно написать a += 5. Здесь операция "+=" это аддитивная операция присвоения. В результате ее выполнения величина, стоящая справа от знака "=", то есть число 5, прибавляется к значению переменной, указанной слева от знака "=".

Отметим, что аналогично выполняются и такие операции, как:

m-=20, что означает то же самое, что и m=m+20;

m*=20, что означает то же самое, что и m=m820;

m/=10, что означает то же самое, что и m=m/10;

m%=10, что означает то же самое, что и m=m%10.

Указанные операции имеют тот же приоритет, что и операция "=". То есть приоритет этих операций ниже, чем приоритет арифметических операций. Отметим, что операция x+=5 выполняется значительно быстрее, чем операция x=x+5.

Условный оператор

if (условие)

{блок из одного или более операторов}

Если условие верно, то выполняется блок из одного или более операторов

Второй вариант:

if (условие)

{блок 1 из одного или более операторов}

else

{блок 2 из одного или более операторов}

Если условие верно, то выполняется блок 1 из одного или более операторов, а если не верно, то блок 2.

Пример 1.

if (a>b)

ans=10;

else

ans=25;

Если а>b, то переменная ans получается значение 10, иначе - значение 0.

Пример 2.

if ( age <18)

{

cout <<"Вы несовершеннолетний. \n";

cout <<"Введите ваш возраст";

cin>> grade;

}

Если переменная age<18 , то запрашивается возраст и заносится в переменную grade.

Оператор while

Цикл while - цикл с неизвестным числом повторений

while (условие)

{блок из одного или нескольких операторов}

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

Пример 1.

char ans ='Y';

longint a==l;

while ( (ans ='Y') || (ans='y') )

{a*=a+l;

cout <<"\n"<< a;

cout <<"\n\t" <<" Для продолжения введите Y, для окончания N ";

cin >> ans;

}

ans описывается как символ, а - как целое длинное. Если пользователь вводит 'Y' или'у', то выполняются блок операторов в фигурных скобках.

Прокомментируйте операторы в фигурных скобках.

Оператор while удобно использовать для проверки ввода пользователя.

Оператор do...while

do...while - это цикл с постусловием.

Цикл do ... while - цикл с неизвестным числом повторений. В отличие от цикла while условие проверяется в конце цикла. Поэтому тело цикла выполняется хотя бы один раз

do

{блок из одного или нескольких операторов}

while (условие)

Пример 1.

char ans 'Y';

longint a=l;

do

{a*=a+l;

cout <<"\n" << a;

cout << "\n\t" <<" Для продолжения введите Y, для окончания N " ;

cin>> ans;

}

while ((ans ='Y') || (ans='y') ) ;

Операторы exit(). break continue

В C++ предусмотрена возможность досрочного выхода из программы до ее нормального завершения с помощью функции exit().

Формат:

exit(статус);

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

Обычно оператор exit ставиться в теле оператора if, чтобы закончить программу, в зависимости от результата проверки условия. При использовании exit необходимо указывать заголовочный файл stdlib.h

Команда break используется для выхода из текущего цикла.

Команда break может находиться в любом месте программы, однако обычно break стави

Наши рекомендации