Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Задачи для решения на тему «линейные алгоритмы»




Красноярск


Министерство образования и науки Российской Федерации

ФГБОУ ВПО «Сибирский государственный технологический
университет»

 

 

H.Л. Резова, Д.Н. Кузьмин

программированиЕ на С++

 

Утверждено редакционно-издательским советом СибГТУ в качестве учебного пособия для студентов специальностей

220301 «Автоматизация технологических процессов и производств»,

230201 «Информационные системы и технологии»,

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

 

 

Красноярск


Резова H.Л. Программирование на С++: учебное пособие для студентов специальностей 220301 «Автоматизация технологических процессов и производств», 230201 «Информационные системы и технологии», 230105 «Программное обеспечение вычислительной техники и автоматизированных систем» всех форм обучения. - Красноярск: СибГТУ, 2013.- 107с.

 

 


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

 

 

Рецензенты: канд. техн. Наук С.В. Бортновский (КГТУ им. В.П. Астафьева);

Е.В. Касьянова (научно-методический совет СибГТУ)

 

© H.Л. Резова, Д.Н. Кузьмин, 2013

© ФГБОУ ВПО «Сибирский государственный технологический университет», 2013

 


Содержание

 

Введение. 5

1 Состав языка. 5

1.1 Алфавит языка. 6

1.2 Идентификаторы.. 6

1.3 Ключевые слова. 7

1.4 Знаки операций. 7

1.5 Константы.. 7

1.6 Комментарии. 10

2 Типы данных С++. 10

2.1 Концепция типа данных. 10

2.2 Основные типы данных. 10

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

4 Ввод/вывод. 13

5 Переменные и выражения. 20

5.1 Переменные. 21

5.2 Операции. 23

5.3 Выражения. 28

6 Базовые конструкции структурного программирования. 29

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

6.1.1 Задачи для решения на тему «линейные алгоритмы». 30

6.2 Операторы ветвления. 32

6.2.1 Условный оператор if. 32

6.2.2 Оператор switch. 34

6.2.3 Задачи для решения на тему «условные алгоритмы». 35

6.3 Операторы цикла. 37

6.3.1 Цикл с предусловием (while) 38

6.3.2 Цикл с постусловием (do while) 39

6.3.3 Цикл с параметром (for) 40

6.3.4 Задачи для решения на тему «сочетание цикла и разветвления». 42

6.4 Операторы передачи управления. 43

6.4.1 Оператор goto 44

6.4.2 Оператор break. 45

6.4.3 Оператор continue. 45

6.4.4 Оператор return. 45

6.4.5 Задачи для решения на тему «вложенные циклы (вычисление суммы ряда)». 46

7 Указатели и массивы.. 48

7.1 Указатели. 48

7.1.1 Инициализация указателей. 50

7.1.2 Операции с указателями. 52

7.2 Ссылки. 54

7.3 Массивы.. 54

7.3.1 Задачи для решения на тему «одномерные массивы». 59

7.3.2 Задачи для решения на тему «двумерные массивы». 62

7.4 Строки. 65

7.4.1 Функции стандартной библиотеки. 66

7.4.2 Задачи для решения на тему «строки». 68

8 Типы данных, определяемые пользователем.. 69

8.1 Переименование типов (typedef) 69

8.2 Перечисления (enum) 69

8.3 Структуры (struct) 70

8.4 Битовые поля. 72

8.5 Задачи для решения на тему «структуры». 73

9 Функции. 77

9.1 Объявление и определение функций. 77

9.2 Глобальные переменные. 80

9.3 Возвращаемое значение. 80

9.4 Параметры функции. 80

9.5 Передача массивов в качестве параметров. 82

9.6 Параметры со значениями по умолчанию.. 84

9.7 Функции с переменным числом параметров. 84

9.8 Рекурсивные функции. 85

9.9 Задачи для решения на тему «функции». 86

10 Директивы препроцессора. 87

10.1 Директива #include. 87

10.2 Директива #define. 88

11 Динамические структуры данных. 89

11.1 Линейные списки. 90

11.2 Стеки. 95

11.3 Очереди. 96

11.4 Бинарные деревья. 98

11.5 Задачи на тему «динамические структуры». 100

Задание на курсовую работу. 102

Библиографический список. 106

 

 


Введение

 

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

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

Задача этого пособия - дать краткое и четкое изложение языка С++. Пособие предназначено для студентов, изучающих язык «с нуля», но будет полезно и более искушенным в программировании.

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

 

1 Состав языка

 

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

Рисунок 1.1 – Состав алгоритмического языка

 

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

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

Выражение задает правило вычисления некоторого значения.

Оператор задает законченное описание некоторого действия.

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

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

 

1.1 Алфавит языка

 

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

- прописные и строчные латинские буквы и знак подчеркивания;

- арабские цифры от 0 до 9;

- специальные знаки: " { }, | [ ] () + - / % *. \ ’:? < = >! & # ~; ^

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

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

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

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

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

- константы;

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

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

 

1.2 Идентификаторы

 

Идентификатор - это имя программного объекта. В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, sysop, SySoP и SYSOP - три различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются.

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

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

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

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

 

1.3 Ключевые слова

 

Ключевые слова - это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Список ключевых слов С++ приведен в таблице 1.

 

Таблица 1 - Список ключевых слов С++

asm auto bool break case catch
char class const const_cast continue default
delete do double dynamic_cast else enum
explicit export extern false float for
friend goto if inline int long
mutable namespace new operator private protected
public register reinterpret_cast return short signed
sizeof static static_cast struct switch template
this throw true try typedef typeid
typename union unsigned using virtual void
volatile wchar_t while      

 

1.4 Знаки операций

 

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

 

1.5 Константы

 

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

Форматы констант, соответствующие каждому типу, приведены в таблице 2.

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

Если требуется сформировать отрицательную целую или вещественную константу, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -0х3С, -4.8, -0.1е4.

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

 

Таблица 2 - Константы в языке С++

Константа Формат Примеры
Целая Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль 8, 0, 199226
Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7) 01, 020, 07155
Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) 0хА, 0x1В8, 0X00FF
Вещественная Десятичный: [цифры].[цифры] 5.7,.001, 35
Экспоненциальный: [цифры][.][цифры]{Е|е}[+|-][цифры] 0.2Е6,.11e-3, 5Е+10
Символьная Один или два символа, заключенных в апострофы 'А', 'ю', '*', 'db', '\0', '\n'
Строковая Последовательность символов, заключенная в кавычки "Здесь был Vasia", "\tЗначение r=\0xF5\n"

 

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

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

- кодов, не имеющих графического изображения (например, \a - звуковой сигнал, \n - перевод курсора в начало следующей строки);

- символов апострофа ('), обратной косой черты (\), знака вопроса (?) и кавычки (");

- любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от 0 до 255.

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

 

Таблица 3 - Управляющие последовательности в языке С++

Изображение Шестнадцатеричный код Наименование
  Звуковой сигнал
\b   Возврат на шаг
\f С Перевод страницы (формата)
\n А Перевод строки
D Возврат каретки
\t   Горизонтальная табуляция
\v В Вертикальная табуляция
\\ Обратная косая черта
\'   Апостроф
\"   Кавычка
\? 3F Вопросительный знак
\0ddd - Восьмеричный код символа
\0xddd ddd Шестнадцатеричный код символа

 

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

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

В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на единицу больше количества символов в ее записи. Таким образом, пустая строка "" имеет длину 1 байт. Обратите внимание на разницу между строкой из одного символа, например, "А", и символьной константой 'А'.

Пустая символьная константа недопустима.

 

1.6 Комментарии

 

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

Рекомендуется использовать для пояснений // -комментарии, а скобки /* */ применять для временного исключения блоков кода при отладке.

 

2 Типы данных С++

 

2.1 Концепция типа данных

 

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

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

- внутреннее представление данных в памяти компьютера;

- множество значений, которые могут принимать величины этого типа;

- операции и функции, которые можно применять к величинам этого типа.

Все типы языка С++ можно разделить на основные и составные. В языке С++ определено шесть основных типов данных для представления целых, вещественных, символьных и логических величин. На основе этих типов программист может вводить описание составных типов. К ним относятся массивы, перечисления, функции, структуры, ссылки, указатели, объединения и классы.

 

2.2 Основные типы данных

 

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

- int (целый);

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

- wchar_t [1](расширенный символьный);

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

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

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

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

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

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

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

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

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

Целый тип (int)

Размер типа int не определяется стандартом, а зависит от компьютера и компилятора. Для 16 -разрядного процессора под величины этого типа отводится 2 байта, для 32 -разрядного - 4 байта.

Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта независимо от разрядности процессора. Спецификатор long означает, что целая величина будет занимать 4 байта. Таким образом, на 16 -разрядном компьютере эквиваленты int и short int, а на 32 -разрядном - int и long int.

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

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

Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.

Символьный тип (char)

Под величину символьного типа отводится количество байт, достаточное для размещения любого символа из набора символов для данного компьютера, что и обусловило название типа. Как правило, это 1 байт. Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от -128 до 127. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Этого достаточно для хранения любого символа из 256 -символьного набора ASCII. Величины типа char применяются также для хранения целых чисел, не превышающих границы указанных диапазонов.

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

Величины логического типа могут принимать только значения true и false, являющиеся зарезервированными словами. Внутренняя форма представления значения false - 0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.

Типы с плавающей точкой (float, double и long double)

Стандарт С++ определяет три типа данных для хранения вещественных значений: float, double и long double.

Типы данных с плавающей точкой хранятся в памяти компьютера иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей - мантиссы и порядка. В IBM PC -совместимых компьютерах величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса - это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка - его диапазон. Как можно видеть из таблицы 4, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления.

Спецификатор long перед именем типа double указывает, что под величину отводится 10 байт.

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

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

 

 

Таблица 4 - Диапазоны значений простых типов данных для IBM PC

Тип Диапазон значений Размер (байт)
bool true и false  
signed char -128... 127  
unsigned char 0... 255  
signed short int -32 768... 32 767  
unsigned short int 0... 65 535  
signed long int -2 147 483 648... 2 147 483 647  
unsigned long int 0... 4 294 967 295  
float 3.4e-38... 3.4e+38  
double 1.7e-308... 1.7c+308  
long double 3.4e-4932... 3.4e+4932  

 

Тип void

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

 

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

 

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

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

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

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

описания

int main(){операторы главной функции}

int f1(){операторы функции f1}

int f2(){операторы функции f2}

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

 

4 Ввод/вывод

 

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

Основные функции ввода/вывода в стиле С:

scanf // ввод

printf // вывод

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

 

Таблица 5 - Спецификации формата для функций семейства printf

Спецификация Пояснение
с аргумент рассматривается как отдельный символ
d, i аргумент преобразуется к десятичному виду
е, Е аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]m.nnnnnne[+-]xx, где длина строки из n определяется указанной точностью. Точность по умолчанию равна 6
f аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]mmm.nnnnn, где длина строки из n определяется указанной точностью. Точность по умолчанию равна 6
g,G используется формат %е или %f, который короче; незначащие нули не печатаются
o аргумент преобразуется в беззнаковую восьмеричную форму (без лидирующего нуля)
р вывод указателя в шестнадцатеричном формате (эта спецификация не входит в стандарт, но она существует практически во всех реализациях)
s аргумент является строкой: символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности
u аргумент преобразуется в беззнаковую десятичную форму
х, X аргумент преобразуется в беззнаковую шестнадцатеричную форму (без лидирующих 0х)
% выводится символ %

Модификаторы формата

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

Если указанного количества позиций для размещения значения недостаточно, автоматически выделяется большее количество позиций: %minC (%-minC) или %min.precisionC (%-min.precisionC).

Здесь С - спецификация формата из приведенной выше таблицы, min - число, задающее минимальную ширину поля. Смысл модификатора precision, также задаваемого десятичным числом, зависит от спецификации формата, с которой он используется:

- при выводе строки (спецификация %s) precision указывает максимальное число символов для вывода;

- при выводе вещественного числа (спецификации %f или ) precision указывает количество цифр после десятичной точки;

- при выводе целого числа (спецификации %d или %i), precision указывает минимальное количество выводимых цифр. Если число представляется меньшим числом цифр, чем указано в precision, выводятся ведущие (начальные) нули;

- при выводе вещественного числа (спецификации %g или %G) precision указывает максимальное количество значащих цифр, которые будут выводиться.

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

Перед спецификацией могут использоваться префиксы l и h, например, %lf, %hu.

Префикс h с типами d, i, о, х и X указывает на то, что тип аргумента short int, а с типом u - short unsigned int.

Префикс l с типами d, i, о, х и X указывает на то, что тип аргумента long int, с типом u - long unsigned int, а с типами е, Е, f, g и G - что тип аргумента double, а не float.

Пример использования строки формата:

#include <stdio.h>

int main(){

int int1 = 45, int2 = 13;

float f = 3.621;

double dbl = 2.23;

char ch = 'z', *str = "ramambahari";

printf("intl = %d| int2 = %10d| int2 = %-15d|\n", int1, int2, int2);

printf("intl = %X| int2 = %10x| int2 = %-15o|\n", int1, int2, int2);

printf("f = %f| f = %4.2f| f = %6.1f|\n", f, f, f);

printf("f = %g| f = %e| f = %+E|\n", f, f, f);

printf("dbl = %5.2lf| dbl = %e| dbl = %4.1G| \n", dbl, dbl, dbl);

printf("ch = %c| ch = %3c| \n", ch, ch);

printf("str = %14s| \nstr = %-14s| \nstr = %s| \n", str, str, str);

return 0;

}

Результат работы программы:

intl = 45| int2 = 13| int2 = 13 |

intl = 2D| int2 = D| int2 = 15 |

f = 3.621000| f = 3.62| f = 3.6|

f = 3.621| f = 3.621000e+000| f=+3.621000E+000|

dbl = 2.23| dbl = 2.230000e+000| dbl = 2|

ch = z| ch = z |

str = ramambahari|

str = ramambahari |

str = ramambahari|

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

#include <stdio.h>

int main(){

int i;

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

scanf("%d", &i);

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

return 0;

}

Первая строка этой программы - директива препроцессора (#include), по которой в текст программы вставляется заголовочный файл <stdio.h>, содержащий описание использованных в программе функций ввода/вывода (в данном случае угловые скобки являются элементом языка). Все директивы препроцессора начинаются со знака #. Третья строка - описание переменной целого типа с именем i. Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf заносит введенное с клавиатуры целое число в переменную i (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования на значение этого числа.

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

#include <iostream.h>

int main(){

int i;

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

cin >> i;

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

return 0;

}

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

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

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

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

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

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

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

 

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

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

long ios::flags(); - возвращает текущие флаги потока;

long ios:: flags (long); - присваивает флагам значение параметра;

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

long ios:: setf (long); - устанавливает флаги, биты которых установлены в параметре;

long ios::unsetf(long); - сбрасывает флаги, биты которых установлены в параметре.

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

Кроме флагов, для форматирования используются следующие поля класса 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.h>

int main(){

long a = 1000, b = 077;

cout.width(7);

cout.setf(ios::hex | ios::showbase | ios:uppercase);

cout «a;

cout.width(7);

cout «b «endl;

double d = 0.12, с = 1.3e-4;

cout. setf (ios::left);

cout «d «endl;

cout «c;

return 0;

}

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

0Х3Е8 0X3F

0.12

0.00013

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

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

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

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

- dec - устанавливает при вводе и выводе флаг десятичной системы счисления;

- oct - устанавливает при вводе и выводе флаг восьмеричной системы счисления;

- hex - устанавливает при вводе и выводе флаг шестнадцатеричной системы счисления;

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

- endl - при выводе включает в поток символ новой строки и выгружает буфер;

- ends - при выводе включает в поток нулевой символ;

- flush - при выводе выгружает буфер.

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

Пример:

cout «13 «hex «' ' «13 «oct «' ' «13 «endl;

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

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

Ниже перечислены манипу

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...