Флаги и форматирующие методы

ДО ЛАБОРАТОРНИХ ТА ПРАКТИЧНИХ

РОБІТ З ДИСЦИПЛІНИ

"Програмування"

Харків 2007

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ
УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ

МЕТОДИЧНІ ВКАЗІВКИ

ДО ЛАБОРАТОРНИХ ТА ПРАКТИЧНИХ

РОБІТ З ДИСЦИПЛІНИ

"програмування"

для студентів денної форми навчання спеціальності

_______________________

Відповідальний за випуск Путятін Є.П.

ЗАТВЕРДЖЕНО

кафедрою інформатики.

Протокол № від

Харків 2007

Методичні вказівки до лабораторних та практичних робіт з дисципліни “Програмування” для cтудентів денної форми навчання спеціальності ___________ /Упоряд.: В.А. Любченко, О.В. Яковлева, Д.О. Руденко - Харкiв: ХНУРЕ, 2007. - ___ с.

Упорядники: В.А. Любченко

О.В. Яковлева

Д.О. Руденко

Рецензент С.С. Танянський, доц. каф. ЕОМ

ЗМІСТ

ВСТУП.. 5

1 Директиви препроцесора. Багатомодульне програмування. 6

2 Потокові класи мови С++. 17

3 Файлові потоки мови С.. 41

4 Перегрузка операцій. 55

5 Основи розробки класів у мові С++. 60

6 Наслідування, поліморфізм, інкапсуляция. 79

РЕКОМЕНДОВАНА ЛІТЕРАТУРА.. 105

ВСТУП

В наш час персональні комп’ютери мають широке застосування в pізноманітних галузях людської діяльності. Все це неможливо без знань мов програмування і тому таку актуальність надбав лозунг “Програмування – друга грамотність”.

Головною метою даних методичних вказівок є допомога студентам в оволодінні практичними навичками у підготовці та розв’язанні задач найбільш розповсюдженою мовою програмування С++, а також придбанні початкових знань в складній сучасній системі програмування VISUAL C ++.

Цикл лабораторних робіт передбачає активну самостійну роботу студентів. Кожна робота виконується студентом особисто, згідно з варіантом завдання, номер якого повиненвідповідати порядковому номеру студента в журналі академгрупи.

Для виконання роботи необхідно: опрацювати теоретичний матеріал, дати відповіді на контрольні запитання, які надаються в цих методичних вказівках, розробити схему алгоритму, скласти програму свого варіанту завдання та розв’язати його на персональному комп’ютері (ПК), оформити звіт і захистити його.

Звіт повинен мати: номер лабораторної роботи, назву та мету роботи, завдання, схему алгоритму (в деяких випадках – короткий опис алгоритму), роздрук-лістинг тексту програми та результати її розв’язання, аналіз одержаних результатів і висновок щодо роботи.

Правила техніки безпеки забороняють студентам вмикати або вимикати ПК, розкривати будь-яке обладнання, знімати захисні щити, а також доторкатись до струмопровідних частин обладнання.

Директиви препроцесора. Багатомодульне програмування

Мета роботи

Отримати практичні навички застосування директив препроцесора, насамперед у створенні макросів, умовної компіляції, створенні багатомодульного проекту.

1.2 Вказівки щодо організації самостійної роботи студентів

Директивы препроцессора начинаются с символа “#” и выполняются во время 1-й фазы компиляции. Результат выполнения затем компилируется, но может быть выведен в stdout или в файл при помощи опций компилятора.

Директива #include

Эта директива предписывает препроцессору поместить на ее место содержимое другого файла. Синтаксис директивы

#include <имя_файла>

или

#include "имя_файла".

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

Директива #define

Директива #define определяет подстановку в тексте программы. Она используется для определения:

- символических констант:

#define имя текст__подстановки

(все вхождения имени заменяются на текст подстановки);

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

#define имя (параметры текст_полстановки;

- символов, управляющих условной компиляцией. Они используются вместе с директивами #i fdef и #i fndef. Формат:

#define имя Примеры:

#define VERSION I

#define VASIA "Василий Иванович"

#define MAX(х,у) ((x)>(y) ? (x) : (y))

Имена рекомендуется записывать прописными буквами, чтобы зрительно отличать их от имен переменных и функций. Параметры макроса используются при макроподстановке, например, если в тексте программы используется вызов макроса y = MAX(suml,. sum2); он будет заменен на

у = ((suml)>(sum2)? (suml):(sum2));

Отсутствие круглых скобок может привести к неправильному порядку вычисления, поскольку препроцессор не оценивает вставляемый текст с точки зрения синтаксиса. Например, если к макросу #deflne sqr(x) (х*х) обратиться как sqr(y+l), в результате подстановки получится выражение (у+1*у+1).

Директивы #undef удаляет объявленную макроподстановку

Условная компиляция

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

#if выражение_1

// эта часть файла компилируется, если выражение_1 истинно

#elif выражение_2

// эта часть файла компилируется, если выражение_1 ложно, а

// выражение_2 истинно

...

#else

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

#endif

Директивы #elif и #else могут быть опущены.

Пример. Простое исключение секции кода.

#if 0

// исключенная секция кода

#endif

Значения выражений в директивах #if и #elif должны быть целыми константами. В выражениях нельзя использовать операцию sizeof.

В качестве выражения в директивах #if и #elif можно использовать оператор defined . Он проверяет, был ли определен макрос.

Пример. Выбор между секциями кода.

#if defined(DEBUGGING)

space = 1000;

#else

space = 10;

#endif

Директивы #ifdef и #ifndef являются сокращением для директив

#if defined и #if !defined соответственно.

Пример. Предотвращение многократной трансляции заголовочного файла sample.h.

#ifndef __SAMPLE_H__

#define __SAMPLE_H__

// здесь содержание файла

#endif

Если файл sample.h окажется многократно включенным в исходный код программы, то при таком “обрамлении” его содержимого будет оттранслировано лишь первое вхождение заголовочного файла.

Замечание. В Visual C++ та же цель достигается применением директивы

#pragma once.

Директива #error

Директива #error вызывает во время компиляции сообщение об ошибке.

#error сообщение_об_ошибке

Пример. Обеспечение правильности параметров компиляции.

#if !defined(__cplusplus)

#error Этот файл должен компилироваться в режиме С++

#endif

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

Директива #line

С помощью директивы #line можно изменить внутренний счетчик строк компилятора и имя компилируемого файла. Она имеет следующий вид

#line номер_строки ["имя_файла"]

Директива #pragma

Директива #pragma позволяет влиять на процесс и результат компиляции. Вот несколько опций для компилятора Visual C++.

§ #pragma hdrstop — предписывает компилятору не включать дальнейшую информацию в прекомпилируемый заголовок;

§ #pragma once — предписывает компилятору лишь однажды включать данный заголовочный файл в программу;

#pragma warning — выборочно разрешает или подавляет предупреждающие сообщения.

Порядок виконання роботи

Вивчити директиви препроцесорної обробки. Ознайомитися з правилами створювання макросами та класичними помилками програмістів-початківців. Перед початком виконання лабораторної роботи розібрати наведений приклад. Особливу увагу приділити механізму підключення модулю до основної програми.

1.4 Контрольні запитання та завдання

Завдання

Ввід-вивід елементів масиву та вирішення завдання оформити у вигляді макросів та розмістити їх в окремому модулі.

1.6 Варіанти завдань

Вариант 1

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) сумму отрицательных элементов массива;

2) произведение элементов массива, расположенных между максимальным и минимальным элементами.

Упорядочить элементы массива по возрастанию.

Вариант 2

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) сумму положительных элементов массива;

2) произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.

Упорядочить элементы массива по убыванию.

Вариант 3

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) произведение элементов массива с четными номерами;

2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.

Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные 0, считать положительными).

Вариант 4

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) сумму элементов массива с нечетными номерами;

2) сумму элементов массива, расположенных между первым и последним отрицательными элементами.

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

Вариант 5

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) максимальный элемент массива;

2) сумму элементов массива, расположенных до последнего положительного элемента.

Сжать массив, удалив из него все элементы, модуль которых находится в интервале [ Флаги и форматирующие методы - student2.ru , Флаги и форматирующие методы - student2.ru ]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 6

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) минимальный элемент массива;

2) сумму элементов массива, расположенных между первым и последним положительными элементами.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом — все остальные.

Вариант7

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) номер максимального элемента массива;

2) произведение элементов массива, расположенных между первым и вторым нулевыми элементами.

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

Вариант 8

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) номер минимального элемента массива;

2) сумму элементов массива, расположенных между первым и вторым отрицательными элементами.

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

Вариант 9

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) максимальный по модулю элемент массива;

2) сумму элементов массива, расположенных между первым и вторым положительными элементами.

Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.

Вариант 10

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) минимальный по модулю элемент массива;

2) сумму модулей элементов массива, расположенных после первого элемента, равного нулю.

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

Вариант 11

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) номер минимального по модулю элемента массива;

2) сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Сжать массив, удалив из него все элементы, величина которых находится в интервале [ Флаги и форматирующие методы - student2.ru , Флаги и форматирующие методы - student2.ru ]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 12

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) номер максимального по модулю элемента массива;

2) сумму элементов массива, расположенных после первого положительного элемента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [ Флаги и форматирующие методы - student2.ru , Флаги и форматирующие методы - student2.ru ], а потом — все остальные.

Вариант 13

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество элементов массива, лежащих в диапазоне от Флаги и форматирующие методы - student2.ru до Флаги и форматирующие методы - student2.ru ;

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

Вариант 14

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество элементов массива, равных 0;

2) сумму элементов массива, расположенных после минимального элемента.

Упорядочить элементы массива по возрастанию модулей элементов.

Вариант 15

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество элементов массива, больших С;

2) произведение элементов массива, расположенных после максимального по модулю элемента.

Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом — все положительные (элементы, равные 0, считать положительными).

Вариант 16

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество отрицательных элементов массива;

2) сумму модулей элементов массива, расположенных после минимального по модулю элемента.

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

Вариант 17

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) количество положительных элементов массива;

2) сумму элементов массива, расположенных после последнего элемента, равного нулю.

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

Вариант 18

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество элементов массива, меньших Флаги и форматирующие методы - student2.ru ;

2) сумму целых частей элементов массива, расположенных после последнего отрицательного элемента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, отличающиеся от максимального не более чем на 20%, а потом — все остальные.

Вариант 19

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) произведение отрицательных элементов массива;

2) сумму положительных элементов массива, расположенных до максимального элемента.

Изменить порядок следования элементов в массиве на обратный.

Вариант 20

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) произведение положительных элементов массива;

2) сумму элементов массива, расположенных до минимального элемента.

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

Вариант 21

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) сумму отрицательных элементов массива;

2) количество элементов массива больше первого элемента;

Изменить порядок следования элементов в массиве на обратный.

Вариант 22

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) обнулить все отрицательные элементы массива расположенные на четных местах;

2) подсчитать количество ненулевых элементов массива;

Отсортировать все ненулевые элементы по возрастанию.

Вариант 23

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) максимальный по модулю элемент массива;

2) сумму всех элементов массива, расположенных после максимального по модулю.

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

Вариант 24

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) номер максимального элемента массива;

2) произведение элементов массива, расположенных между первым и вторым отрицательными элементами.

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

Вариант 25

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) сумму положительных элементов массива;

2) произведение элементов массива, расположенных между первым четным и последним нечетным элементами.

Упорядочить элементы массива по возрастанию.

Вариант 26

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) произведение положительных элементов массива;

2) сумму элементов массива, расположенных между максимальным по модулю и последним четным элементами.

Упорядочить элементы массива по убыванию.

Вариант 27

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) произведение элементов массива с четными номерами;

2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.

Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные 0, считать положительными).

Вариант 28

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru целых элементов, вычислить:

1) номер максимального по модулю элемента массива;

2) произведение элементов массива, расположенных между первым и последним нулевыми элементами.

Переставить максимальный по модулю элемент с первым.

Вариант 29

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) минимальный положительный элемент массива;

2) сумму элементов массива, расположенных между первым положительным и последним отрицательным элементами.

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

Вариант 30

В одномерном массиве, состоящем из Флаги и форматирующие методы - student2.ru вещественных элементов, вычислить:

1) количество элементов массива, равных 0;

2) количество элементов массива, расположенных после минимального элемента.

Упорядочить элементы массива по убыванию модулей элементов.

Контрольний приклад

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

Розв’язок

Главный файл (содержащий функцию main)

#include <iostream>

using namespace std;

#include "myHeader.h"

#define N 3

#define M 5

int main()

{

int mas[N][M]={9,3,6,23,21,

4,5,6,4,51,

4,6,24,23,24};

cout<<"Nachalnije dannie\n";

outmatr(mas,N,M);

#define cmp >

# if defined (cmp)

sortmas(mas[1],M);

#else

cout<<"error";

#endif

#define MES "sort \">\" 2-ja stroka"

cout<<endl;

outmas(mas[1],5);

#define cmp <

#define MES "sort \"<\" 3-ja stroka"

# if defined (cmp)

sortmas(mas[2],M);

#else

cout<<"error";

#endif

cout<<endl;

outmas(mas[2],5);

cout<<endl;

int sum;

SUM(mas[0],5,sum);

cout<<"Summa 1-oj stroki = "<<sum<<endl;

cout<<"Rezultat:"<<endl;

outmatr(mas,N,M);

cin.get();

return 0;

}

Файл “myHeader.h”

//---------------------------------------------------------------------------

#ifndef _MY_HEADER_

#define _MY_HEADER_

#define MES "ne sort"

#define cmp ==

#define sortmas(mas,n) { for (int i=0;i<n;i++) \

for (int j=0;j<n-i-1;j++) \

if(mas[j] cmp mas[j+1]) \

{ mas[j]=mas[j]+mas[j+1]; \

mas[j+1]=mas[j]-mas[j+1]; \

mas[j]=mas[j]-mas[j+1];}; \

}

#define outmas(mas,n) { for (int i=0;i<n;i++) cout<<mas[i]<<"\t"; \

cout<<'\t'<<MES<<endl;}

#define outmatr(mas,n,m) { for (int i=0;i<n;cout<<endl,i++)\

for (int j=0;j<m;j++)\

cout<<mas[i][j]<<"\t"; \

}

//---------------------------------------------------------------------------

#define SUM(mas,n,Sum) { Sum =0; \

for (int j=0;j<n;j++)\

Sum+=mas[j]; \

}

#endif

2 Потокові класи мови С++

Мета роботи

2.2 Вказівки щодо організації самостійної роботи студентів

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

Форматирование данных

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

Флаги и форматирующие методы

Флаги представляют собой отдельные биты, объединенные в поле x_f1ags типа long класса ios. Флаги перечислены в табл. 10.1.

Таблица 10.1.Флаги форматирования

       
Флаг Положение Умолчание Описание действия при установленном бите
skipws 0x0001 + При извлечении пробельные символы игнорируются
left 0x0002   Выравнивание по левому краю поля
right 0x0004 + Выравнивание по правому краю поля
internal 0x0008   Знак числа выводится по левому краю, число — по правому. Промежуток заполняется символами x_fill по умолчанию пробелами
dec 0x0010 + Десятичная система счисления
oct 0x0020   Восьмеричная система счисления
hex 0x0040   Шестнадцатеричная система счисления
showbase 0x0080   Выводится основание системы счисления (Ох для шестнадцатеричных чисел и 0 для восьмеричных)
showpoint 0x0100   При выводе вещественных чисел печатать десятичную точку и дробную часть
uppercase 0x0200   При выводе использовать символы верхнего регистра
showpos 0x0400   Печатать знак при выводе положительных чисел
scientific 0x0800   Печатать вещественные числа в форме мантиссы с порядком
fixed 0x1000   Печатать вещественные числа в форме с фиксированной точкой (точность определяется полем х precision, см. ниже)
unitbuf 0x2000   Выгружать буферы всех потоков после каждого вывода
stdio 0x4000   Выгружать буферы потоков stdout и stderr после каждого вывода

ПРИМЕЧАНИЕ

Флаги (left, right и internal), (dec, oct и hex), а также (scientific и fixed) взаимно исключают друг друга, то есть в каждый момент может быть установлен только один флаг из каждой группы.

Для управления флагами в классе ios есть методы flags, setf и unsetf:

long ios::f lags(); — возвращает текущие флаги потока;
long ios::flags (long); — присваивает флагам значение параметра;
long ios::setf (long, long); — присваивает флагам, биты которых установлены в первом параметре, значение соответствующих битов второго параметра;
long ios::setf(long); — устанавливает флаги, биты которых установлены в параметре;
long ios::unsetf(long); — сбрасывает флаги, биты которых установлены в параметре.

Все функции возвращают прежние флаги потока.

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

cout.setf(ios:: right);

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

cout.unsetf(ios::right);

а затем установить флаг выравнивания по левому полю

cout.setf(ios::left);

Кроме флагов, для форматирования используются следующие поля класса ios:

int x_width — минимальная ширина поля вывода;
int x_precision — количество цифр в дробной части при выводе вещественных чисел с фиксированной точкой или общее количество значащих цифр при выводе в форме с мантиссой и порядком;
int x_fill — символ заполнения поля вывода.

Для управления этими полями используются методы width, precision и fill:

int ios::width() — возвращает значение ширины поля вывода;
int ios::width (int) — устанавливает ширину поля вывода в соответствии со значением параметра;
   
int ios::precision() — возвращает значение точности представления при выводе вещественных чисел;
int ios::precision (int) — устанавливает значение точности представления при выводе вещественных чисел, возвращает старое значение точности;
char fill() — возвращает текущий символ заполнения;
char fill (char) — устанавливает значение текущего символа заполнения, возвращает старое значение символа.

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

adjustfield (left | right | internal)

basefield (dec | oct | hex)

floatfield (scientific | fixed)

Пример форматирования при выводе с помощью флагов и методов:

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

#include <iostream>

using namespace std;

const int n=2;

//Создадим структуру для хранения информации о студентах с

//двумя полями ФИО и средний бал успеваимости

struct Tstudent

{

char FIO[20];

float bal;

}StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};

int main (int argc, char * const argv[])

{

//Следующий фрагмент кода иллюстрирует форматирование потока вывода

for(int i=0;i<n;i++)

{

//Форматирование с помощью методов потока

cout.unsetf(ios::right);//сбрасывваем флаг потока выравнивание по правому

//полю(это необходимо сделать обязательно если до э

//того флаг был установлен)

cout.setf(ios::left);//установить флаг выравнивания по левому полю

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

cout.setf(ios::fixed);//установить флаг вывода числа с фиксированной точкой

// следующие две строчки устанавливают формат вывода чисел в виде

// мантиссы с порядком

// cout.setf(ios::scientific);//установить флаг вывода числа в формате

//мантиссы с порядком

// cout.unsetf(ios::fixed);//сбрасывает флаг вывода числа с фиксированной

//точкой (это необходимо сделать обязательно если до этого флаг был

//установлен)

cout.precision(3);//задаем точность (количество чисел после

//запятой или количество значащих чисел)

cout.width(15); //задать поле вывода под поле 20 символов.

//параметр необходимо указывать каждый раз для вывода

cout <<StudetnPotok[i].FIO;//выводим фамилию

cout.setf(ios::right);//задаем вывод по правому полю

cout.width(10);//задаем количество символов под вывод числа

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

cout<<StudetnPotok[i].bal;

cout<<'\n';

}

cin.get();

return 1;

}

//Этот фрагмент выведет на экран следующий результат:

Petrov........._____3.500

Sidorov........_____1.667

Манипуляторы

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

Простые манипуляторы

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

dec — устанавливает при вводе и выводе флаг десятичной системы счисления;
oct — устанавливает при вводе и выводе флаг восьмеричной системы счисления;
hex — устанавливает при вводе и выводе флаг шестнадцатеричной системы счисления;
ws — устанавливает при вводе извлечение пробельных символов;
endl — при выводе включает в поток символ новой строки и выгружает буфер;
ends — при выводе включает в поток нулевой символ;
flush — при выводе выгружает буфер.

Изменения системы счисления действуют до следующего явного изменения.

Пример:

cout << 13<< hex<< ' '<< 13 << oct<< ' '<< 13 << endl;

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

13 d 15

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