 
        
        - •Сведения об авторах
- •1. Знакомство с языком С++
- •1.1 Первая программа на С++
- •1.2 Среда программирования Qt Creator
- •2. Общие сведения о языке С++
- •2.1 Алфавит языка
- •2.2 Данные
- •2.2.1 Символьный тип
- •2.2.2 Целочисленный тип
- •2.2.3 Вещественный тип
- •2.2.4 Логический тип
- •2.2.5 Тип void
- •2.3 Константы
- •2.4 Структурированные типы данных
- •2.5 Указатели
- •2.6 Операции и выражения
- •2.6.1 Операции присваивания
- •2.6.2 Арифметические операции
- •2.6.3 Логические операции
- •2.6.4 Операции отношения
- •2.6.5 Условная операция
- •2.6.6 Операция преобразования типа
- •2.6.7 Операция определения размера
- •2.6.8 Операции с указателями
- •2.7 Стандартные функции
- •2.8 Структура программы
- •2.9 Ввод и вывод данных
- •2.9.1 Функции ввода - вывода
- •2.10 Задачи для самостоятельного решения
- •2.10.2 Операции целочисленной арифметики.
- •2.10.3 Встроенные математические функции
- •3. Операторы управления
- •3.1 Основные конструкции алгоритма
- •3.2 Составной оператор
- •3.3 Условные операторы
- •3.3.1 Условный оператор
- •3.3.2 Оператор варианта
- •3.4 Операторы цикла
- •3.4.1 Оператор цикла с предусловием
- •3.4.2 Оператор цикла с постусловием
- •3.4.3 Оператор цикла с параметром
- •3.4.4 Операторы передачи управления
- •3.5 Решение задач с использованием циклов
- •3.6 Задачи для самостоятельного решения
- •3.6.1 Разветвляющийся процесс. Вычисление значения функции.
- •3.6.2 Разветвляющийся процесс. Попадание точки в плоскость.
- •3.6.3 Разветвляющийся процесс. Пересечение линий и решение уравнений.
- •3.6.4 Циклический процесс. Вычисление значений функции
- •3.6.6 Циклический процесс. Последовательности произвольных чисел
- •3.6.7 Циклический процесс. Работа с цифрами в числе
- •3.6.8 Вложенные циклы
- •4. Использование функций при программировании на С++
- •4.1 Общие сведения о функциях. Локальные и глобальные переменные
- •4.2 Передача параметров в функцию
- •4.3 Возврат результата с помощью оператора return
- •4.4 Решение задач с использованием функций
- •4.5 Рекурсивные функции
- •4.6 Перегрузка функций
- •4.7 Шаблоны функций
- •4.8 Область видимости переменных в функциях
- •4.9 Функция main(). Параметры командной строки
- •4.10 Задачи для самостоятельного решения
- •4.10.1 Применение функций при работе с последовательностями чисел
- •4.10.2 Применение функций для вычислений в различных системах счисления
- •4.10.3 Применение функций для решения нелинейных уравнений
- •5. Массивы
- •5.1 Статические массивы в С(С++)
- •5.1.1 Описание статических массивов
- •5.1.2 Основные операции над массивами
- •5.2 Динамические массивы в С(С++)
- •5.2.1 Функция malloc
- •5.2.2 Функция calloc
- •5.2.3 Функция realloc
- •5.2.4 Функция free
- •5.2.5 Операторы new и delete
- •5.3 Основные алгоритмы обработки массивов
- •5.3.2 Вычисление суммы элементов массива
- •5.3.3 Вычисление произведения элементов массива
- •5.3.4 Поиск максимального элемента в массиве и его номера
- •5.3.5 Удаление элемента из массива
- •5.3.6 Сортировка элементов в массиве
- •5.3.6.1 Сортировка методом «пузырька»
- •5.3.6.2 Сортировка выбором
- •5.3.6.3 Сортировка вставкой
- •5.4 Указатели на функции
- •5.5 Совместное использование динамических массивов, указателей, функций в сложных задачах обработки массивов
- •5.6.1 Основные операции при работе с массивами
- •5.6.2 Применение функций для обработки массивов.
- •5.6.3 Работа с группами элементов в массиве
- •5.6.4 Сортировка элементов массива
- •6. Статические и динамические матрицы
- •6.1 Статические матрицы С(С++)
- •6.2 Динамические матрицы
- •6.2.1 Использование указателей для работы с динамическими матрицами
- •6.2.2 Использование двойных указателей для работы с динамическими матрицами
- •6.3 Обработка матриц в С(С++)
- •6.4 Решение некоторых задач линейной алгебры
- •6.5 Задачи для самостоятельного решения
- •6.5.1 Основные операции при работе с матрицами
- •6.5.2 Работа со строками и столбцами матрицы
- •6.5.3 Решение задач линейной алгебры
- •7. Организация ввода-вывода в C++
- •7.1.2 Использование манипуляторов форматирования
- •7.2 Работа текстовыми файлами в C++
- •7.2.1 Запись информации в текстовый файл
- •7.2.2 Чтение информации из текстового файла
- •7.3 Обработка двоичных файлов
- •8. Строки в языке С++
- •8.1 Общие сведения о строках в С++
- •8.2 Операции над строками
- •8.3 Тип данных string
- •8.4 Задачи для самостоятельного решения
- •9. Структуры в языке С++
- •9.1 Общие сведения о структурах
- •9.2 Библиотеки для работы с комплексными числами
- •9.3 Задачи для самостоятельного решения
- •9.3.1 Структуры. Операции над комплексными числами
- •9.3.2 Работа с библиотекой комплексных чисел
 
| Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. | 234 | 
7. Организация ввода-вывода в C++
7.1Форматированный ввод-вывод в C++
Вэтом параграфе мы вернемся к рассмотренным ранее операторам ввода-вывода cin и cout, и рассмотрим возможности их использования для организации формати-
рованного ввода-вывода.
Для управления вводом-выводом в C++ используются:
•флаги форматного ввода-вывода;
•манипуляторы форматирования.
Флаги позволяют установить параметры ввода-вывода, которые буду действовать во всех последующих операторах ввода-вывода, до тех пор, пока не будут отменены. Манипуляторы вставляются в операторы cin (cout) и устанавливают параметры теку-
щего оператора ввода-вывода.
7.1.1Использование флагов форматного ввода-вывода
Флаги позволяют включить или выключить один из параметров вывода на экран.
Для установки флага вывода используется следующая конструкция языка C++. cout.setf(ios::flag)
Для снятия флага используется конструкция cout.unsetf(ios::flag)
Здесь flag – имя конкретного флага.
Если при выводе необходимо установить несколько флагов, то можно воспользоваться арифметической операцией «или» (|). В этом случае конструкция языка C++ бу-
дет такой.
cout.setf(ios::flag1|ios::flag2| ios::flag3)
В данном случае flag1, flag2, flag3 – имена устанавливаемых флагов выво-
да.
В таблице 7.1 приведены некоторые флаги форматного вывода с примерами их использования.
Таблица 7.1. Некоторые флаги форматного вывода
| Флаг | Описание | Пример использования42 | Результат | 
| right | Выравнивание | int r=-25; | 
 | 
| 
 | по правой гра- | cout.setf(ios::right); | 
 | 
| 
 | нице | cout.width(15); | r=-25 | 
| 
 | 
 | cout<<"r="<<r<<endl; | |
| left | Выравнивание | double r=-25.45; | 
 | 
| 
 | по левой гра- | cout.setf(ios::left); | 
 | 
| 
 | нице (по умол- | cout.width(50); | r=-25.45 | 
| 
 | чанию) | cout<<"r="<<r<<endl; | |
| boolalpha | Вывод логиче- | bool a=true; | 1 | 
| 
 | ских величин в | cout<<a<<endl; | |
| 
 | текстовом виде | cout.setf(ios::boolalpha); | true | 
| 
 | (true, false) | cout<<a<<endl; | 
42 cout.width(n) устанавливает ширину поля вывода, подробнее об этом в п.8.1.2
| Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. | 235 | |||||||
| 
 | 
 | 
 | 
 | |||||
| Флаг | Описание | Пример использования | Результат | |||||
| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | |
| dec | Вывод | 
 | 
 | ве- | int r=-25; | r=-25 | 
 | |
| 
 | личин в деся- | cout<<"r="<<r<<endl; | 
 | |||||
| 
 | тичной | систе- | 
 | 
 | 
 | |||
| 
 | ме | счисления | 
 | 
 | 
 | |||
| 
 | (по | 
 | умолча- | 
 | 
 | 
 | ||
| 
 | нию) | 
 | 
 | 
 | 
 | 
 | 
 | |
| oct | Вывод | 
 | 
 | ве- | int p=23; | 
 | 
 | |
| 
 | личин | в | 
 | вось- | cout.unsetf(ios::dec); | 
 | 
 | |
| 
 | меричной | си- | cout.setf(ios::oct); | p=27 | 
 | |||
| 
 | стеме | счисле- | cout<<"p="<<p<<endl; | 
 | ||||
| 
 | ния (для этого | 
 | 
 | 
 | ||||
| 
 | надо | 
 | 
 | снять | 
 | 
 | 
 | |
| 
 | флаг | вывод в | 
 | 
 | 
 | |||
| 
 | десятичной) | 
 | 
 | 
 | ||||
| hex | Вывод | 
 | 
 | ве- | int p=23; | 
 | 
 | |
| 
 | личин в шест- | cout.unsetf(ios::dec); | 
 | 
 | ||||
| 
 | надцатеричной | cout.setf(ios::hex); | p=17 | 
 | ||||
| 
 | системе | 
 | счис- | cout<<"p="<<p<<endl; | 
 | |||
| 
 | ления (для это- | 
 | 
 | 
 | ||||
| 
 | го надо | снять | 
 | 
 | 
 | |||
| 
 | флаг | вывод в | 
 | 
 | 
 | |||
| 
 | десятичной) | 
 | 
 | 
 | ||||
| showbase | Выводить | ин- | int p=23; | 
 | 
 | |||
| 
 | дикатор | осно- | cout.unsetf(ios::dec); | 
 | 
 | |||
| 
 | вания системы | cout.setf(ios::hex|ios:: | 
 | 
 | ||||
| 
 | счисления | showbase); | p=0x17 | 
 | ||||
| 
 | 
 | 
 | 
 | 
 | 
 | cout<<"p="<<p<<endl; | 
 | |
| uppercase | Использовать | int p=29; | 
 | 
 | ||||
| 
 | прописные | cout.unsetf(ios::dec); | 
 | 
 | ||||
| 
 | буквы в шест- | cout.setf(ios::hex|ios:: | 
 | 
 | ||||
| 
 | надцатерич- | uppercase); | p=1D | 
 | ||||
| 
 | ных цифрах | cout<<"p="<<p<<endl; | 
 | |||||
| showpos | Выводить знак | int p=29; | 
 | 
 | ||||
| 
 | «+» | для | поло- | cout.setf(ios::showpos); | p=+29 | 
 | ||
| 
 | жительных чи- | cout<<"p="<<p<<endl; | 
 | |||||
| 
 | сел | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
| scientific | Экспоненци- | double p=146.673; | 
 | 
 | ||||
| 
 | альная | форма | cout.setf(ios::scientific); | 
 | 
 | |||
| 
 | вывода | 
 | веще- | cout<<"p="<<p<<endl; | p=1.466730e+002 | |||
| 
 | ственных | 
 | чи- | 
 | 
 | 
 | ||
| 
 | сел | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
| fixed | Фиксирован- | double p=146.673; | 
 | 
 | ||||
| 
 | ная форма вы- | cout.setf(ios::fixed); | p=146.673 | |||||
| 
 | вода | 
 | 
 | веще- | cout<<"p="<<p<<endl; | |||
| 
 | ственных | 
 | чи- | 
 | 
 | 
 | ||
| 
 | сел | (по | умол- | 
 | 
 | 
 | ||
| Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. | 236 | |||
| 
 | 
 | 
 | 
 | |
| Флаг | Описание | Пример использования | Результат | |
| 
 | 
 | 
 | 
 | 
 | 
| 
 | чанию) | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
 | 
Флаги удобно использовать в тех случаях, когда следует изменить параметры всех последующих операторов ввода-вывода. Использование большого количества флагов для управления одним или несколькими операторами ввода-вывода не совсем удобно, потом все установленные придется отключать.
Еще одним способом форматирования является использование манипуляторов непосредственно в операторах cin и cout.
7.1.2Использование манипуляторов форматирования
Манипуляторы встраиваются непосредственно в операторы ввода-вывода. C одним из манипуляторов (endl) читатель уже встречался, начиная с первой главы книги.
В таблице 7.2 приведены основные манипуляторы форматирования с примерами их использования. Для корректного использования всех манипуляторов необходимо подключить библиотеку iomanip с помощью оператора
#include <iomanip>
Таблица 7.2. Некоторые манипуляторы форматирования
| Манипулятор | 
 | Описание | Пример использования | Результат | |||
| 
 | 
 | 
 | 
 | 
 | 
 | примера | |
| 
 | 
 | 
 | 
 | 
 | |||
| setw(n) | Определяет | int r=253; | 
 | 
 | |||
| 
 | ширину | поля | cout.setf(ios::fixed); | r= | 253 | ||
| 
 | вывода | в | n | cout<<"r="<<setw(8)<<r<<endl; | 
 | 
 | |
| 
 | символов | 
 | 
 | 
 | 
 | 
 | |
| setprecision(n) | Определяет | double h=1234.6578; | 
 | 
 | |||
| 
 | количество | 
 | cout.setf(ios::fixed); | 
 | 
 | ||
| 
 | цифр (n-1) в | cout<<setprecision(3);cout<<"h="<<setw(15); | h=1234.658 | ||||
| 
 | дробной части | cout<<<<h<<endl; | 
 | 
 | |||
| 
 | числа | 
 | 
 | 
 | 
 | 
 | |
| dec | Перевод числа | int r=0253; | 
 | 
 | |||
| 
 | в | десятичную | cout<<"r="<<dec<<r<<endl; | r=171 | 
 | ||
| 
 | систему | 
 | (по | 
 | 
 | 
 | |
| 
 | умолчанию) | 
 | 
 | 
 | |||
| oct | Перевод числа | int r=253; | 
 | 
 | |||
| 
 | в | восьмерич- | cout<<"r="<<oct<<r<<endl; | r=375 | 
 | ||
| 
 | ную систему | 
 | 
 | 
 | |||
| hex | Перевод числа | int r=253; | 
 | 
 | |||
| 
 | в | шестнадца- | cout<<"r="<<hex<<r<<endl | p=fd | 
 | ||
| 
 | тиричную | си- | 
 | 
 | 
 | ||
| 
 | стему | 
 | 
 | 
 | 
 | 
 | |
| right | Выравнивание | int r=-25; | 
 | 
 | |||
| 
 | по правой гра- | cout.width(15); | 
 | r=-25 | |||
| 
 | нице | 
 | 
 | cout<<"r="<<setw(15)<<right; | 
 | ||
| 
 | 
 | 
 | cout<<<<r<<endl; | 
 | 
 | ||
| 
 | 
 | 
 | 
 | 
 | 
 | 
 | |
| left | Выравнивание | int r=-25; | 
 | 
 | |||
 
| Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. | 237 | ||||||
| 
 | 
 | 
 | 
 | ||||
| Манипулятор | Описание | Пример использования | Результат | ||||
| 
 | 
 | 
 | 
 | 
 | 
 | примера | 
 | 
| 
 | по | левой гра- | cout.width(15); | r=-25 | 
 | ||
| 
 | нице | 
 | (по | cout<<"r="<<setw(15)<<left; | 
 | ||
| 
 | умолчанию) | cout<<<<r<<endl;43 | 
 | 
 | |||
| 
 | 
 | 
 | 
 | ||||
| 
 | 
 | 
 | 
 | 
 | |||
| boolalpha | Вывод логиче- | bool a=true; | 
 | 
 | |||
| 
 | ских | 
 | величин | cout<<boolalpha<<a<<endl; | true | 
 | |
| 
 | в | текстовом | 
 | 
 | 
 | ||
| 
 | виде | 
 | (true, | 
 | 
 | 
 | |
| 
 | false) | 
 | 
 | 
 | |||
| noboolalpha | Вывод логиче- | bool a=true; | 
 | 
 | |||
| 
 | ских | 
 | величин | cout<<noboolalpha<<a<<endl; | 1 | 
 | |
| 
 | в | 
 | числовом | 
 | 
 | 
 | |
| 
 | виде (1, 0) | 
 | 
 | 
 | |||
| showpos | Выводить | int p=29; | 
 | 
 | |||
| 
 | знак «+» для | cout<<"p="<<showpos<<p<<endl; | p=+29 | 
 | |||
| 
 | положитель- | 
 | 
 | 
 | |||
| 
 | ных чисел | 
 | 
 | 
 | |||
| noshowpos | Не | 
 | выводить | int p=29; | 
 | 
 | |
| 
 | знак | 
 | «+» для | cout<<"p="<<noshowpos; | p=29 | 
 | |
| 
 | положитель- | cout<<<<p<<endl; | 
 | ||||
| 
 | 
 | 
 | 
 | ||||
| 
 | ных чисел | 
 | 
 | 
 | |||
| 
 | 
 | 
 | 
 | 
 | |||
| uppercase | Использовать | int p=253; | 
 | 
 | |||
| 
 | прописные | cout<<"p="<<hex<<uppercase; | 
 | 
 | |||
| 
 | буквы в шест- | cout<<<<p<<endl; | p=FD | 
 | |||
| 
 | надцатерич- | 
 | 
 | 
 | |||
| 
 | ных цифрах | 
 | 
 | 
 | |||
| nouppercase | Использовать | int p=253; | 
 | 
 | |||
| 
 | строчные бук- | cout<<"p="<<hex<<nouppercase; | 
 | 
 | |||
| 
 | вы | в | шестна- | cout<<<<p<<endl; | p=fd | 
 | |
| 
 | дцатеричных | 
 | 
 | 
 | |||
| 
 | цифрах | 
 | 
 | 
 | |||
| showbase | Выводить ин- | int p=253; | 
 | 
 | |||
| 
 | дикатор осно- | cout<<"p="<<hex<<uppercase | 
 | 
 | |||
| 
 | вания | систе- | <<showbase<<p<<endl; | p=0XFD | 
 | ||
| 
 | мы счисления | 
 | 
 | 
 | |||
| noshowbase | Не | 
 | выводить | int p=253; | 
 | 
 | |
| 
 | индикатор | cout<<"p="<<hex<<uppercase; | 
 | 
 | |||
| 
 | основания си- | cout<<<<noshowbase<<p<<endl; | p=FD | 
 | |||
| 
 | стемы счисле- | 
 | 
 | 
 | |||
| 
 | ния | 
 | 
 | 
 | 
 | 
 | 
 | 
| showpos | Выводить | int p=29; | 
 | 
 | |||
| 
 | знак | 
 | «+» для | cout.setf(ios::showpos); | p=+29 | 
 | |
| 
 | положитель- | cout<<"p="<<p<<endl; | 
 | ||||
| 
 | 
 | 
 | 
 | ||||
| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
43 Еще один пример приведен при использовании манипулятора setfill
