Основы программирования на С/С++. Часть 2
Покупка
Новинка
Тематика:
Программирование на C и C++
Год издания: 2007
Кол-во страниц: 70
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7038-2939-4
Артикул: 842137.01.99
Учебное пособие представляет собой краткое изложение лекционного курса «Программирование на языке С», читаемого для студентов ГУИМЦ. Изложены основные концепции программирования на языке С/С++, рассмотрены особенности реализации классических алгоритмов программирования на этом языке, приведены примеры использования С/С++ для решения конкретных задач с использованием различных типов и структур данных.
Для студентов 3-го курса ГУИМЦ. Также может быть использовано при изучении курса «Основы информатики» студентами 1-го курса факультета РК.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Московский государственный технический университет имени Н.Э. Баумана М.Ю. Барышникова, А.В. Силантьева ОСНОВЫ ПРОГРАММИРОВАНИЯ НА С/С++ Рекомендовано редсоветом МГТУ им. Н.Э. Баумана в качестве учебного пособия по курсу «Язык программирования С» Часть 2 М о с к в а Издательство МГТУ им. Н.Э. Баумана 2 0 0 7
УДК 004.43(075.8) ББК 32.973.26–018.1 Б26 Рецензенты: Г.С. Иванова, К.А. Милорадов Б26 Барышникова М.Ю., Силантьева А.В. Основы программирования на С/С++: Учеб. пособие. – Ч. 2. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2007. – 70 с.: ил. ISBN 978-5-7038-2939-4 Учебное пособие представляет собой краткое изложение лекционного курса «Программирование на языке С», читаемого для студентов ГУИМЦ. Изложены основные концепции программирования на языке С/С++, рассмотрены особенности реализации классических алгоритмов программирования на этом языке, приведены примеры использования С/С++ для решения конкретных задач с использованием различных типов и структур данных. Для студентов 3-го курса ГУИМЦ. Также может быть использовано при изучении курса «Основы информатики» студентами 1-го курса факультета РК. Табл. 1. Ил. 9. Библиогр. 8 назв. УДК 004.43(075.8) ББК 32.973.26–018.1 ISBN 978-5-7038-2939-4 © МГТУ им. Н.Э. Баумана, 2007
1. ПОТОКОВЫЙ ВВОД-ВЫВОД В языке С++ предусмотрена возможность ввода-вывода потоков байтов. Поток рассматривается просто как последовательность байтов и с программной точки зрения не зависит от тех конкретных устройств, с которыми ведется обмен данными. При этом очень важно, что никакой связи значений этих байтов с кодами какого-либо алфавита не устанавливается. В то же время в языке С++ каждая операция ввода-вывода осуществляется способом, определяемым типом данных. Это достигается за счет того, что для реализации потокового ввода-вывода используются средства объектно-ориентированного программирования и библиотека потокового ввода-вывода С++ является библиотекой не функций, а классов, она содержит не только описания типов, но свои методы (функции) обработки для каждого типа адресованного этому классу обращения. Используемые в программах потоки логически делятся на три типа: – входные, из которых читается информация в память; – выходные, в которые вводятся данные из памяти; – двунаправленные, допускающие как чтение, так и запись. В операциях ввода байты пересылаются от устройства ввода (например, клавиатуры, дисковода или соединения сети) в оперативную память, а при выводе – из оперативной памяти на устройства вывода, например на экран дисплея, дисковод или принтер. При этом для ускорения процессов обмена данными с потоком часто используется участок основной памяти – буфер потока. Чтобы воспользоваться функциями потокового ввода-вывода, необходимо включить в программу заголовочный файл <iostream.h> (он описывает класс двунаправленных потоков ввода-вывода). 1.1. Ввод потоков Он описывается следующим образом: cin >> <имя_объекта_ базового_типа>; Ввод потока может быть выполнен с помощью операции >> «взять из потока». Эта операция обычно игнорирует во входном 3
потоке так называемые символы-разделители (пробел, знак табуляции, знак конца строки). Операция «взять из потока» возвращает нулевое значение (false), когда встречает в потоке признак конца файла; в противном случае она возвращает ссылку на объект, с помощью которого она вызывалась. Стандартный поток ввода cin «привязан» к стандартному устройству ввода (обычно к клавиатуре). Пример: … int x; float y; .... cin >> x; cin >> y; /* Можно сформировать цепочку операций обмена с потоком при вводе данных: */ cin >> x >>y; Исходные данные здесь можно ввести с клавиатуры либо в одну строку, разделяя их пробелом, либо помещая каждое значение на отдельной строке. Операция «взять из потока» автоматически настраивается на тип вводимых данных. При этом необходимо учитывать ограничения на длину внутреннего преставления данных определенного типа. Примечание. Попробуйте объявить в программе целую переменную (например int x;) и ввести с клавиатуры значение, выходящее за границы диапазона значений данного типа (например, значение 40 000). Если сразу после ввода распечатать значение х, то будет видно, что вместо числа 40 000 напечатано число – 25 536 (так как максимальное положительное число типа int есть + 32 768, то остаток от вычитания 400 000 – 32 768 = 7 232, переведенный в дополнительный код, будет равен –25 536). Этот пример показывает, что при потоковом вводе, как и при форматном, следует соблюдать правила корректной работы с типами данных. Кроме того, целочисленное значение можно ввести с клавиатуры в восьмеричной или шестнадцатеричной системе счисления. При вводе вещественных чисел допустимы все их формы записи. Наличие буфера в стандартном входном потоке приводит к тому, что в процессе набора данных на клавиатуре они отображаются на экране, но не извлекаются из потока, что дает возможность исправлять ошибки во вводимых данных. Собственно вы4
полнение операции >> происходит только после нажатия на клавишу ввода (Enter). 1.2. Вывод потоков Он описывается следующим образом: cout << <выражение_ базового_типа>; Выполняется с помощью операции << «поместить в поток». Пример: int x,y; cout << "Значение х= "<< х; //поместить в поток значение x cout << "Значение y= "<< y; //поместить в поток значение y cout << "Значение суммы= "<< x+y; При выводе в поток значений выражений надо следить за приоритетом операций. Например, в результате выполнения операции cout << 2+3+4; на экран будет выведено значение 9 (так как приоритет арифметических операций выше, чем приоритет операции <<). Чтобы вывести в поток значение выражения, содержащего операции более низкого приоритета, чем <<, требуется применить скобки (например, cout << (a+b<c);). Это нужно учитывать и при формировании цепочек операций вывода. При выводе целых чисел необходимо помнить о длине внутреннего представления числа данного типа. Вывод целого числа осуществляется по умолчанию в десятичной системе счисления, а для вывода его в восьмеричной или шестнадцатеричной системе необходимо применять специальное воздействие на поток (форматирование данных). Вещественные числа по умолчанию выводятся в форме с фиксированной точкой. Для перехода на новую строку можно использовать управляющую последовательность '\n' (например, cout << "Значение х= ="<< х<< '\n';). 1.3. Форматирование данных при обмене с потоками Для данных базовых типов непосредственное применение операций вывода << и ввода >> к стандартным потокам приводит к использованию форматов по умолчанию для внешнего представления пересылаемых значений. Например, при выводе чисел каж5
дое из них занимает ровно столько позиций, сколько необходимо для его представления. Это не всегда удобно и правильно. Так, выполнение следующей операции вывода: { int i1=1, i2=2, i3=3, i4=4, i5=5; cout << i1 << i2 << i3 << i4 << i5; } приведет к результату 12345. Для улучшения читаемости проще всего явно ввести разделительные пробелы: cout << i1 << ' ' << i2 << ' ' << i3 << ' ' << i4 << ' ' << i5; Тогда получим на экране результат 1 2 3 4 5. Можно также добавить пояснительный текст и символы табуляции, но это никак не изменит формат самих выводимых значений. Формат вывода можно изменить только при использовании флагов форматирования и манипуляторов потоков. Манипуляторами называют специальные функции, позволяющие программисту изменять состояния потоков. Особенность манипуляторов и их отличие от обычных функций состоят в том, что их имена (без параметров) и вызовы (с параметрами) можно использовать в операциях обмена с потоками (<< или >>). В качестве параметра каждый манипулятор автоматически (без явного участия программиста) получает ссылку на тот поток, с которым он используется в выражении. После выполнения выражения он возвращает ссылку на тот же поток. Поэтому манипуляторы можно использовать в цепочке включений в поток или извлечений из потока. При выполнении манипулятора никакого обмена данными с потоком не происходит, но манипулятор изменяет состояние потока. Таким образом манипуляторы потоков в языке С++ решают задачу форматирования информации. С их помощью можно, например, задать основание системы счисления для целых чисел, установить ширину полей, задать точность для чисел с плавающей точкой и др. Если в программе используются манипуляторы потоков с параметрами, то требуется подключить библиотеку <iomanip.h>. Например, манипуляторами без параметров являются манипуляторы потоков, задающие основание системы счисления для целых значений: – dec – десятичная система счисления (по умолчанию); – oct – восьмеричная система счисления; – hex – шестнадцатеричная система счисления; 6
Пример: … int x=20; cout<< "В десятичном формате"<<x; //20 cout << "В восьмеричном формате:"<< oct << x; //24 cout << "В шестнадцатеричном формате:"<< hex << x; //14 Другим примером манипулятора потоков без параметров является манипулятор endl. Этот манипулятор вызывает не только переход на новую строку, но и сброс буфера вывода (т. е. заставляет немедленно вывести данные из буфера, даже если он полностью не заполнен). Пример: cout << "Значение х= "<< х<< endl; Для управления точностью вещественных чисел с плавающей точкой используется манипулятор setprecision(n). Он имеет единственный параметр – точность. При этом точность 0 соответствует точности по умолчанию, равной шести знакам после десятичной точки. Установленная точность будет действовать для всех последующих операций вывода до тех пор, пока не будет произведена следующая установка точности. Пример. Печать значения 2 в различном формате и с различными количествами разрядов в дробной части. #include<conio.h> #include<math.h> #include<iostream.h> //для класса двунаправленных потоков #include<iomanip.h> //для использования манипуляторов void main() { float root2=sqrt(2.0); //значение 2 clrscr(); cout<<" root2=" << root2 << endl; cout<<"Управл. колич. разрядов в дробной части" << endl; cout<<"Колич. разрядов от 1 до 10 через 2 разряда" << endl; for (int pr=1; pr<=10; pr+=2) //количество разрядов: cout<< setprecision(pr) << root2 << endl; cout<<" Вывод с нулевой точностью" << endl; //установка нулевой точности: cout<< setprecision(0) << root2 << endl; getch(); } 7