- •Конспект лекций Часть 1 Оглавление
- •Часть 1 1
- •Введение
- •1. Этапы и проблемы решения задач с использованием компьютера
- •Алфавит языка
- •Ключевые слова
- •Идентификаторы
- •Знаки операций
- •Константы
- •Комментарии
- •2.3. Структура и основные элементы программы
- •2.4. Трансляция программ и их выполнение
- •3. Стандартные (базовые) типы данных, операции и выражения
- •3.1. Типы данных, переменные и константы Понятие типов данных
- •Классификация простых предопределенных типов данных
- •Переменные, константы
- •3.2. Целочисленные типы данных
- •3.3. Вещественные типы данных
- •3.4. Логический тип данных
- •3.5. Символьный тип данных
- •3.6. Операции и выражения
- •Преобразования типов данных
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные (битовые) операции
- •Операции составного присваивания
- •Условная операция
- •Операция sizeof
- •Приоритеты рассмотренных операций
- •3.7. Ввод и вывод простых типов данных
- •Вывод текстовых строк
- •Ввод/вывод арифметических типов данных
- •Форматирование ввода / вывода
- •4.1. Идеи структурного программирования
- •Условная инструкция (if)
- •Инструкция множественного выбора (switch)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Итерационный цикл (for)
- •Инструкции перехода
- •5. Приемы программирования циклов
- •5.1. Рекуррентные вычисления
- •5.2. Инвариант цикла
- •6. Массивы
- •6.1. Понятие массива
- •6.2. Объявление массивов Объявление одномерных массивов
- •Объявление многомерных массивов
- •6.3. Ввод-вывод массивов
- •Вывод массивов
- •Ввод массивов
- •6.4. Текстовые строки как массивы символов
- •Определение текстовой строки
- •Ввод текстовых строк с клавиатуры
- •Обработка текстовых строк
- •Массивы текстовых строк
- •7. Разработка программ при работе с массивами
- •Не успел дописать. Некоторые примеры по этому разделу в Приложениях
Форматирование ввода / вывода
В приведенных ранее примерах были использованы простейшие способы управления вводом/выводом с помощью специальных управляющих символов (ESCAPE последовательностей) - '\n' и '\t'. Однако, очень часто этого бывает недостаточно, например, для аккуратного структурированного оформления данных на экране.
Более гибкое управление вводом/выводом (форматирование ввода/вывода) в C++ осуществляется либо с помощью установки флагов форматирования, либо с помощью специальных манипуляторов ввода/вывода.
Использование флагов форматирования.
В этой таблице перечислены флаги форматирования.
Флаг |
Числовое значение |
Назначение |
Действие |
ios:: skipws |
1 |
Отменяет ввод из потока лидирующих пробельных символов (пробелов, символов табуляции, символов перевода строки). Установлен по умолчанию. |
ввод |
ios:: unitbuf |
2 |
Если буфер вывода не пуст, его содержимое передаются на устройство вывода сразу при завершении операции вывода. |
вывод |
ios:: uppercase |
4 |
Отображает шестнадцатеричные цифры и символ экспоненты при выводе вещественных значений в верхнем регистре. |
вывод |
ios:: showbase |
8 |
Отображает обозначение основания системы счисления, в которой выводится числовое значение. Например, если выводится значение A1F, то оно будет выведено в виде 0xA1F. |
вывод |
ios:: showpoint |
16 |
Отображает при выводе вещественных значений десятичную точку и нули дробной части, даже если дробная часть отсутствует. |
вывод |
ios:: showpos |
32 |
Приводит к отображению знака + при выводе положительных числовых значений. |
вывод |
ios:: left |
64 |
Выравнивает вывод данных по левому краю поля вывода, дополняя данные справа пробелами (или установленными символами) до ширины поля вывода. |
вывод |
ios:: right |
128 |
Выравнивает вывод данных по правому краю поля вывода, дополняя данные слева пробелами (или установленными символами) до ширины поля вывода |
вывод |
ios:: internal |
256 |
Выводит знак числа с левым выравниванием, а само число с правым выравниванием. Между знаком и самим числом выводятся либо пробелы, либо установленные символы заполнения, дополняя выводимое значение до ширины поля вывода. |
вывод |
ios:: dec |
512 |
Устанавливает десятичную форму представления целых чисел. Флаг установлен по умолчанию. |
ввод/вывод |
ios:: oct |
1024 |
Устанавливает восьмеричную форму представления целых чисел. |
ввод/вывод |
ios:: hex |
2048 |
Устанавливает шестнадцатеричную форму представления целых чисел. |
ввод/вывод |
ios:: scientific |
4096 |
Устанавливает формат вывода вещественных значений в формате с экспонентой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). |
вывод |
ios:: fixed |
8192 |
Устанавливает формат вывода вещественных значений с фиксированной точкой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). |
вывод |
ios:: boolalpha |
16384 |
По умолчанию логические значения представляются в виде 0 и 1. При установке этого флага эти значения представляются словами false и true. |
ввод/вывод |
Замечания:
Приставка ios:: указывает на то, что определение флага принадлежит классу ios, опускать ее не следует, иначе компилятор выдаст ошибку.
Некоторые компиляторы (старые) могут не воспринимать представления этих флагов в виде идентификаторов. В этом случае необходимо использовать их числовые эквиваленты.
По сути, каждый флаг можно рассматривать как целочисленную именованную константу. Все эти константы определены в классе ios.
Флаги работают как переключатели (включен - выключен, установлен - сброшен). Все флаги упакованы в одном целом значении типа long int. Это целое значение определяет общее состояние всех флагов потока. Каждый флаг в этом целом значении представлен 1 битом (1 двоичным разрядом). Установленному флагу соответствует значение 1 некоторого двоичного разряда. Если флаг сброшен (отключен), соответствующий двоичный разряд равен 0. Например, если значение состояния всех флагов равно 68, то установлены флаги uppercase и left:
Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0
Состояния флагов: 0 0 … 0 0 1 0 0 0 1 0 0 = 68
Такое представление флагов позволяет, кроме компактной формы хранения, обеспечить эффективное управление флагами на основе использования побитовых логических операций.
Для управления флагами используются три функции: flags, setf и unsetf. Эти функции являются членами потоковых классов cout и cin, поэтому обращаться к ним следует через идентификаторы соответствующих потоковых классов: cout.flags, cout.setf, cout.unsetf или cin.flags, cin.setf, cin.unsetf. Если необходимо управлять флагами потока вывода, используется класс cout, если флагами потока ввода - класс cin. Все эти функции возвращают предыдущее состояние флагов.
Функция flags может использоваться двумя способами. Если вызвать ее без параметров, то она не изменяет состояние флагов, а только возвращает значение состояния всех флагов потока. Например, строка
cout << cin.flags () << endl;
выведет на экран целое значение соответствующее состоянию флагов потока ввода. А строка
cout << cout.flags () << endl;
выведет на экран целое значение соответствующее состоянию флагов потока вывода.
Эту функцию можно использовать и для изменения состояния флагов. Для этого при ее вызове в качестве параметра ей необходимо передать необходимое значение флага (флагов). Например, оператор cout.flags(ios::hex); установит флаг hex, все остальные флаги будут сброшены.
Особенностью этой функции является то, что она сначала сбрасывает все флаги, а уже потом устанавливает флаг (флаги), заданный параметром.
Замечание. Если вызвать функцию следующим образом: flags(0), то будут сброшены все флаги соответствующего потока.
Функция setf также служит для установки флагов. Она добавляет новый флаг (флаги) без изменения всех остальных.
/* 1 */ cout.flags(0); // Отключены все флаги
/* 2 */ cout.setf(ios :: showpos); // Установлен единственный флаг showpos
/* 3 */ cout.setf(ios :: hex); // Установлены два флага - showpos и hex
Если требуется сбросить флаг (флаги), используют функцию unsetf. В качестве параметра используется значение флага (флагов), который необходимо отключить. При этом остальные флаги изменены не будут. Например, если добавить к предыдущим строкам программы строку:
/* 4 */ cout.unsetf(ios :: showpos);
флаг showpos будет отключен, и останется установленным только флаг hex.
При использовании этих процедур можно оперировать не одиночными флагами, а объединением нескольких флагов. Например, строки 2 и 3 можно заменить одной строкой:
cout.setf ( ios :: showpos | ios :: hex);
Объединение флагов осуществляется с помощью операции | - арифметическое ИЛИ.
Рассмотрим некоторые примеры использования флагов форматирования.
#include <iostream>
using namespace std;
int main ()
{
setlocale (0, "");
cout << 255 << endl; // На экране видим 255 - по умолчанию установлен флаг dec
cout.setf (ios :: hex); // Включаем флаг hex - хотим видеть на экране ff
cout << 255 << endl; // На экране видим 255 - изменений не произошло
system ("Pause");
return 0;
}
В этом примере установка флага hex не привела ни к каким изменениям. Причиной этого явилось то, что одновременно с установленным флагом hex остался установленным и флаг dec. Для исправления ситуации необходимо сначала отключить флаг dec, а затем уже установить флаг hex:
cout.unsetf (ios :: dec); // Отключаем флаг dec
cout.setf (ios :: hex); // Включаем флаг hex - хотим видеть на экране ff
cout << 255 << endl; // На экране видим ff - то, что хотели
Среди всех флагов можно выделить три группы, в каждой из которых флаги управляют одной и той же характеристикой ввода / вывода, но являются взаимоисключающими. Флагам каждой из этих групп в классе ios присвоены обобщающие имена:
Группа |
Флаги |
Обобщающее имя |
Флаги основания систем счисления |
dec, oct, hex |
basefield |
Флаги выравнивания |
left, right, internal |
adjustfield |
Флаги формата вещественных значений |
scientific, fixed |
floatfield |
Обобщающие имена групп удобно использовать для выполнения операции со всеми флагами группы, например, для сброса всех флагов группы:
cout.unsetf (ios :: basefield); // Отключаем флаги dec, oct, hex за один прем
Более того, функцию setf можно использовать с двумя параметрами:
setf (новые флаги, маска)
В этом случае функция setf устанавливает только те флаги, которые одновременно присутствуют и в первом и во втором параметре, а те флаги, которые присутствуют во втором параметре, но отсутствуют в первом, будут сброшены. Это дает возможность отключать и включать флаги за один вызов функции setf. Например, для установки любого флага из группы basefield достаточно использовать всего один оператор:
cout.setf (ios :: hex, ios :: basefield);
Здесь второй параметр содержит три флага: dec, oct, hex. Первый параметр содержит флаг hex. Этот флаг будет установлен, а флаги dec и oct будут сброшены.
В классе cout имеются еще несколько функций управляющих форматом вывода данных. К ним относятся:
precision - определяет точность представления вещественных значений;
width - устанавливает ширину поля вывода;
fill - определяет символ заполнения при выводе данных.
Примеры использования этих функций
Пример 1.
cout.width (10); // Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено 7 пробелов и число 123
cout.fill (‘.’); // Символ заполнения ‘.’
cout.width (10); // Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено …….123
Пример 2
cout.width (10); // Ширина поля вывода 10 позиций
cout.setf (ios :: fixed); // Вывод вещественных значений с фиксированной точкой
cout.precision (3); // Ширина поля вывода 10 позиций
cout << 1.2345 << endl; // На экран выведено 7 пробелов и число 1.234
cout.fill (‘.’); // Символ заполнения ‘.’
cout.width (10); // Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено …….123
Форматирование ввода-вывода с помощью манипуляторов.
Управление флагами потоков ввода-вывода можно осуществлять с помощью, так называемых, манипуляторов ввода-вывода. В следующей таблице перечислены стандартные манипуляторы:
Манипулятор |
Назначение |
Действие |
skipws |
Устанавливает флаг skipws. |
ввод |
noskipws |
Обнуляет флаг skipws. |
ввод |
unitbuf |
Устанавливает флаг unitbuf. |
вывод |
nounitbuf |
Обнуляет флаг unitbuf. |
вывод |
uppercase |
Устанавливает флаг uppercase. |
вывод |
nouppercase |
Обнуляет флаг uppercase. |
вывод |
showbase |
Устанавливает флаг showbase. |
вывод |
noshowbase |
Обнуляет флаг showbase. |
вывод |
showpoint |
Устанавливает флаг showpoint. |
вывод |
noshowpoint |
Обнуляет флаг showpoint. |
вывод |
showpos |
Устанавливает флаг showpos. |
вывод |
noshowpos |
Обнуляет флаг showpos. |
вывод |
left |
Устанавливает флаг left. |
вывод |
right |
Устанавливает флаг right |
вывод |
internal |
Устанавливает флаг internal. |
вывод |
dec |
Устанавливает флаг dec. |
ввод/вывод |
oct |
Устанавливает флаг oct. |
ввод/вывод |
hex |
Устанавливает флаг hex. |
ввод/вывод |
scientific |
Устанавливает флаг scientific. |
вывод |
fixed |
Устанавливает флаг fixed. |
вывод |
boolalpha |
Устанавливает флаг boolalpha. |
ввод/вывод |
noboolalpha |
Обнуляет флаг boolalpha. |
ввод/вывод |
endl |
Выводит в поток символ перевода строки. |
вывод |
ends |
Выводит в поток нулевой символ (‘\0’). |
вывод |
flush |
«Сбрасывает» поток. |
вывод |
resetiosflags(флаги) |
Обнуляет флаги, указанные в параметре |
ввод/вывод |
setiosflags(флаги) |
Устанавливает флаги, указанные в параметре |
ввод/вывод |
setbase(int base) |
Устанавливает основание системы счисления в значение base (допустимые значения параметра 8, 10, 16). |
вывод |
setfill(char ch) |
Устанавливает символ для заполнения в значение ch. |
вывод |
setprecision(int p) |
Устанавливает количество цифр после десятичной точки в значение p. |
вывод |
setw(int w) |
Устанавливает ширину поля вывода в значение w. |
вывод |
ws |
Пропускает ведущие пробельные символы в потоке ввода |
ввод |
Замечание. При использовании манипуляторов с параметрами необходимо использовать заголовочный файл <iomanip>.
Манипуляторы ввода-вывода непосредственно включаются в потоки ввода-вывода. Например:
cout << setw(20) << right << setfill(‘.’) << 123 << endl;
На экран будет выведено:
……………..123
Можно создавать свои собственные манипуляторы ввода-вывода.
4. Основные управляющие структуры программирования и управляющие конструкции в языке С++
Структурное программирование. Основные управляющие структуры программирования: последовательность, выбор (ветвление), итерации (циклы). Примеры преобразования структур. Семантика управляющих структур и инструкции языка С++. Операторы и блоки. Выбор вариантов: оператор if, расширение оператора if, множественный выбор. Итерации: цикл с предусловием, цикл с постусловием.