Что такое стандартный ввод и вывод в программировании
Один из основных механизмов, который делает программу полезной является ввод/вывод. Все языки программирования имеют такой механизм. Среди операторов и ключевых слов нет ввода/вывода. Потому что в языке С++ ввод/вывод реализован в виде библиотеки. И вообще многие механизмы, которые делают язык С++ таким мощным реализованы в библиотеках (стандартные, специализированные, персональные).
Вывод: Помещение (направление) данных в поток вывода осуществляется с помощью оператора cout
Можно определить операторы потокового ввода/вывода и для созданных абстрактных типов данных.
Ввод: Ввод данных из потока осуществляется аналогично с использованием обратного оператора >> (inserter):
Переменную любого временного типа можно ввести (считать) из потока:
Для использования стандартной библиотеки нужно включить ее описание в текст программы. Это делается с помощью директивы препроцессору #include.
#include // подключение стандартной библиотеки
using namespace std; // объявление об использовании стандартного пространства имен
void main() // функция main
<
cout
Форматированный ввод/вывод
Примеры, которые приводились выше и ввод/вывод, который вы использовали на практических занятиях до сих пор, обычно называют неформатированным выводом.
Часто программисту нужно более детализированное управление. Управление осуществляется для каждого потока отдельно, т.е. если вы определили какой-то формат для потока ввода, то на поток вывода он не подействует. Более того, управление влияет только на следующее выводимое значение.
Управление можно организовать используя манипуляторы потока, которые вставляются между объектами (записываемыми или читаемыми) и тем самым изменяют состояние потока (формат вывода значений):
для вывода целых чисел
dec; // устанавливает десятичную систему счисления
hex; // устанавливает шестнадцатеричную систему счисления
oct; // устанавливает восьмеричную систему счисления
setbase(int b); // вывод целых чисел в системе счисления с основанием b(10,8. )
show base; // показывает основание системы счисления
для вывода чисел с плавающей точкой
float f=1234.56789;
cout
для вывода логических переменных
Дополнительно можно определить ширину вывода переменных в количестве символов:
setw(int n); // если строка или число длиннее, то будут выведены все setw(0)
А также задать символ для заполнения
Можно определить место размещения заполнителей. По умолчанию как видите заполнители размещаются до значения. Это аналогично записи:
endl; // заканчивается строка, т.е. вставляется символ ‘\n’
ends; // заканчивается строка записью ‘ ‘
flush; // очистка буфера потока
Это лишь основные манипуляторы, которые вы можете использовать для форматирования. С остальными познакомьтесь самостоятельно:
| Манипулятор | Действие на поток |
|---|---|
| showbase noshowbase | инициирует отображение основания системы счисления |
| showpos noshowpos | инициирует явное отображение знака (+) для положительных значений |
| uppercase nouppercase | инициирует преобразование выводимых символов в верхний регистр |
| showpoint noshowpoint | инициирует отображение десятичной точки при выводе вещественных чисел |
| skipws noskipws | инициирует пропуск пробельных символов при вводе |
| left | инициирует левое выравнивание, заполнение справа |
| right | инициирует правое выравнивание, заполнение слева |
| internal | инициирует внутреннее заполнение (между значением и знаком или основанием системы счисления) |
| scientific | инициирует вывод вещественных значений в научном формате (d.ddddddddE+dd) |
| fixed | инициирует вывод вещественных значений в фиксированном формате (d.dddddd) |
| setbase (int base) | изменяет систему счисления (10, 8, 16) |
| dec | инициирует вывод целочисленных значений в десятичной системе счисления |
| oct | инициирует вывод целочисленных значений в восьмеричной системе счисления |
| hex | инициирует вывод целочисленных значений в шестнадцатеричной системе счисления |
| setfill (char n) | задает заполняющий символ |
| setprecision (int n) | изменяет точность выводимых значений |
| setw (int n) | задает ширину поля вывода |
Файловые потоки
Для первых программ стандартных потоков ввода/вывода будет достаточно, но по мере усложнения программ не обойтись без работы с файлом, которая в С++ осуществляется так же на основе механизма потоков.
void main()
<
ifstream inputfile(«z:\data.txt»); // создается поток ввода из файла
inputfile>>x; // все то же самое что и для cin
ofstream outputfile(«z:\res.txt»); // создается поток вывода в файл
outputfile
По умолчанию ввод и вывод данных в поток осуществляется в текстовом режиме. Для того, чтобы данные выводились в двоичном режиме следует использовать следующую запись:
По умолчанию файл открываемый для вывода создается (если он создан), а если существует, то очищается. Для того чтобы открыть файл для добавления:
Можно создать файловый поток, который запускает и ввод и вывод:
Ввод-вывод в Си
Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.
Вывод информации
Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.
Общая форма записи функции printf() :
СтрокаФорматов состоит из следующих элементов:
Объекты могут отсутствовать.
Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.
Основные управляющие символы:
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:
Результат работы программы
Тот же самый код может быть представлен с использованием одного вызова printf :
Табличный вывод
При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:
В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Ввод информации
Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :
Строка форматов и список аргументов для функции обязательны.
Результат работы программы:
Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
Комментариев к записи: 96
#include
#include
#include
#include
int main() <
int a[4][5];
int i,j,range,max,maxi,maxj;
float kproiz1,kproiz2;
int proiz1=1;
int proiz2=1;
Стандартные библиотеки C ++ предоставляют расширенный набор возможностей ввода / вывода, которые мы увидим в последующих главах. В этой главе будут рассмотрены основные и наиболее распространенные операции ввода-вывода, необходимые для программирования на C ++.
Файлы заголовков библиотеки ввода-вывода
Этот файл объявляет службы для обработки файлов, управляемых пользователем. Мы обсудим это подробно в главе «Файл и поток».
Стандартный выходной поток (cout)
Оператор ввода может использоваться более одного раза в одном выражении, как показано выше, и endl используется для добавления новой строки в конце строки.
Стандартный входной поток (cin)
Компилятор C ++ также определяет тип данных введенного значения и выбирает соответствующий оператор извлечения потока для извлечения значения и сохранения его в данных переменных.
Оператор извлечения потока >> может использоваться более одного раза в одном выражении. Чтобы запросить более одного элемента данных, вы можете использовать следующее:
Это будет эквивалентно следующим двум утверждениям:
Стандартный поток ошибок (cerr)
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Стандартный поток журнала (засорение)
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Вы не сможете увидеть какие-либо различия в cout, cerr и clog с этими небольшими примерами, но при написании и выполнении больших программ разница становится очевидной. Поэтому хорошей практикой является отображение сообщений об ошибках с использованием потока cerr и при отображении других сообщений журнала, которые следует использовать.
Что такое стандартный ввод и вывод в программировании
Под вводом-выводом в программировании понимается процесс обмена информацией между оперативной памятью и внешними устройствами: клавиатурой, дисплеем, магнитными накопителями и т. п. Ввод — это занесение информации с внешних устройств в оперативную память, а вывод — вынос информации из оперативной памяти на внешние устройства. Такие устройства, как дисплей и принтер, предназначены только для вывода; клавиатура — устройство ввода. Магнитные накопители (диски, ленты) используются как для ввода, так и для вывода.
Основным понятием, связанным с информацией на внешних устройствах ЭВМ, является понятие файла. Всякая операция ввода-вывода трактуется как операция обмена с файлами: ввод — это чтение из файла в оперативную память; вывод — запись информации из оперативной памяти в файл. Поэтому вопрос об организации в языке программирования ввода-вывода сводится к вопросу об организации работы с файлами.
Внутренний файл — это переменная файлового типа, являющаяся структурированной величиной. Элементы файловой переменной могут иметь разный тип и, соответственно, разную длину и форму внутреннего представления. Внутренний файл связывается с внешним (физическим) файлом с помощью стандартной процедуры Assign. Один элемент файловой переменной становится отдельной записью во внешнем файле и может быть прочитан или записан с помощью одной команды. Попытка записать в файл или прочитать из него величину, не совпадающую по типу с типом элементов файла, приводит к ошибке.
Аналогом понятия внутреннего файла в языках Си/Си++ является понятие потока. Поток — это байтовая последовательность, передаваемая в процессе ввода-вывода.
Поток должен быть связан с каким-либо внешним устройством или файлом на диске. В терминологии Си это звучит так; поток должен быть направлен на какое-то устройство или файл.
Основные отличия файлов в Си состоят в следующем: здесь отсутствует понятие типа файла и, следовательно, фиксированной структуры записи файла. Любой файл рассматривается как байтовая последовательность:
Стрелочкой обозначен указатель файла, определяющий текущий байт файла. EOF является стандартной константой — признаком конца файла.
Существуют стандартные потоки и потоки, объявляемые в программе. Последние обычно связываются с файлами на диске, создаваемыми программистом. Стандартные потоки назначаются и открываются системой автоматически. С началом работы любой программы открываются 5 стандартных потоков, из которых основными являются следующие:
o stdin — поток стандартного ввода (обычно связан с клавиатурой);
o stdout — поток стандартного вывода (обычно связан с дисплеем);
o stderr — вывод сообщений об ошибках (связан с дисплеем).
Кроме этого, открывается поток для стандартной печати и дополнительный поток для последовательного порта.
Работая ранее с программами на Си, используя функции ввода с клавиатуры и вывода на экран, мы уже неявно имели дело с первыми двумя потоками. А сообщения об ошибках, которые система выводила на экран, относились к третьему стандартному потоку. Поток для работы с дисковым файлом должен быть открыт в программе.
Работа с файлами на диске. Работа с дисковым файлом начинается с объявления указателя на поток. Формат такого объявления:
Слово file является стандартным именем структурного типа, объявленного в заголовочном файле stdio.h. В структуре file содержится информация, с помощью которой ведется работа с потоком, в частности: указатель на буфер, указатель (индикатор) текущей позиции в потоке и т.д.
Следующий шаг — открытие потока, которое производится с помощью стандартной функции fopen (). Эта функция возвращает конкретное значение для указателя на поток и поэтому ее значение присваивается объявленному ранее указателю. Соответствующий оператор имеет формат:
Имя_указателя=fореn (“имя_файла”, “режим_открытия”) ;
Параметры функции fopen () являются строками, которые могут быть как константами, так и указателями на символьные массивы. Например:
Существуют следующие режимы открытия потока и соответствующие им параметры:
r открыть для чтения
w создать для записи
а открыть для добавления
r+ открыть для чтения и записи
w+ создать для чтения и записи
а+ открыть для добавления или
создать для чтения и записи
Поток может быть открыт либо для текстового, либо для двоичного (бинарного) режима обмена.
Понятие текстового файла: это последовательность символов, которая делится на строки специальными кодами — возврат каретки (код 13) и перевод строки (код 10). Если файл открыт в текстовом режиме, то при чтении из такого файла комбинация символов «возврат каретки — перевод строки» преобразуется в один символ \n — переход к новой строке.
При записи в файл осуществляется обратное преобразование. При работе с двоичным файлом никаких преобразований символов не происходит, т.е. информация переносится без всяких изменений.
Указанные выше параметры режимов открывают текстовые файлы. Если требуется указать на двоичный файл, то к параметру добавляется буква b. Например: rb, или « b », или r +b. В некоторых компиляторах текстовый режим обмена обозначается буквой t, т.е. записывается a+t или rt.
Если при открытии потока по какой-либо причине возникла ошибка, то функция fopen() возвращает значение константы null. Эта константа также определена в файле stdio.h. Ошибка может возникнуть из-за отсутствия открываемого файла на диске, нехватки места в динамической памяти и т.п. Поэтому желательно контролировать правильность прохождения процедуры открытия файла. Рекомендуется следующий способ открытия:
if (fp=fopen(«test.dat», «r»)==NULL)
В случае ошибки программа завершит выполнение с закрытием всех ранее открытых файлов.
Закрытие потока (файла) осуществляет функция fclose(), прототип которой имеет вид:
int fclose(FILE *fptr);
Здесь fptr обозначает формальное имя указателя на закрываемый поток. Функция возвращает ноль, если операция закрытия прошла успешно. Другая величина означает ошибку.
Запись и чтение символов. Запись символов в поток производится функцией putc() с прототипом
int putc (int ch, FILE *fptr);
Если операция прошла успешно, то возвращается записанный символ. В случае ошибки возвращается константа EOF.
Считывание символа из потока, открытого для чтения, производится функцией gets () с прототипом
int gets (FILE *fptr);
Функция возвращает значение считываемого из файла символа. Если достигнут конец файла, то возвращается значение EOF. Заметим, что это происходит лишь в результате чтения кода EOF.
Исторически сложилось так, что gets() возвращает значение типа int. To же можно сказать и про аргумент ch в описании функции puts(). Используется же в обоих случаях только младший байт. Поэтому обмен при обращении может происходить и с переменными типа char.
Пример 1. Составим программу записи в файл символьной последовательности, вводимой с клавиатуры. Пусть признаком завершения ввода будет символ *.
Ввод и вывод информации в программировании
Ввод и вывод данных: способы, функции и операторы. Последовательные контейнеры для последовательного и произвольного доступа к элементам с помощью индексов. Ассоциативные контейнеры для быстрого доступа с помощью ключей. Реализация обобщенного алгоритма.
| Рубрика | Программирование, компьютеры и кибернетика |
| Вид | контрольная работа |
| Язык | русский |
| Дата добавления | 26.05.2013 |
| Размер файла | 25,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ФИНАНСОВЫЙ УНИВЕРСИТ ПРИ ПРАВИТЕЛЬСТВЕ РФ
КОНТРОЛЬНАЯ РАБОТА № 1
по дисциплине: «Информатика и программирование»
1. Ввод и вывод данных
Существует несколько способов консольного ввода и вывода.
Для работы с операторами cin и cout необходимо подключить библиотеку директивой #include (табл. 2.1).
Функции и операторы ввода/вывода информации
Функции ввода/вывода printf() и scanf()
Рассмотрим шесть наиболее распространенных функций ввода информации с клавиатуры и ее вывода на экран (консольный ввод-вывод): getchar, putchar (для ввода-вывода символа); gets, puts (для ввода-вывода строки); scanf, printf (для форматированного ввода-вывода ); и функцию flush очистки буфера stdin.
данные оператор контейнер алгоритм
/* Ввод-вывод с использованием функций getchar, putchar, gets, puts */
char nf[40]; int ch; clrscr();
put («Введите Ваше имя и фамилию»);
puts(«Вас зовут»); puts(nf);
puts(«Введите любой символ»); ch=getchar();
puts(«Вы ввели символ»); putchar(ch);
getch(); /*Организации задержки смены экрана*/
Функция printf предназначена для вывода форматированной последовательности данных. Может иметь один или несколько параметров, первым из которых является строка, называемая форматной строкой. За форматной строкой следует список вывода, который может содержать переменные, константы, выражения разных типов. Форматная строка задает способ преобразования и представления на печати элементов списка вывода, а также определяет, сколько элементов содержит список вывода и какого они типа.
Функция scanf предназначена для вывода форматированной последовательности данных
Формат функции ввода:
Основным отличием применения функции scanf() от функции printf() является знак & перед именем переменной, в которую записываются результаты ввода.
Функция scanf() может работать сразу с несколькими переменными. Предположим, что необходимо ввести два целых числа с клавиатуры. Формально для этого можно дважды вызвать функцию scanf(), однако лучше воспользоваться такой конструкцией:
Функция scanf() возвращает число успешно считанных элементов. Если операции считывания не происходило, что бывает в том случае, когда вместо ожидаемого цифрового значения вводится какая-либо буква, то возвращаемое значение равно 0.
2. Определение последовательного контейнера
STL предоставляет два вида контейнеров:
o последовательные и
Последовательные контейнеры предназначены для обеспечения последовательного или произвольного доступа к своим членам (или элементам).
Ассоциативные контейнеры получают доступ к своим элементам по ключу.
Все контейнерные классы библиотеки STL определены в пространстве имен std.
Последовательные контейнеры
Это означает, что для элементов контейнера определены понятия первый, последний, предыдущий и следующий. К этому виду контейнеров принадлежат
o векторы,
o списки,
o Деки,
o строки типа string.
Векторы
Библиотека STL предоставляет контейнерный класс vector, определенный в заголовочном файле и доступный в пространстве имен std.
Класс vector ведет себя подобно массиву, однако предоставляет больше возможностей по управлению ним. В частности, вектор можно наращивать по мере необходимости, и он обеспечивает контроль значений индексов. Определение класса vector выглядит следующим образом:
По умолчанию память для элементов вектора распределяется и освобождается глобальными операторами new() и delete (). Таким образом, для создания нового элемента вектора вызывается конструктор класса Т. Для встроенных типов данных векторы можно определить следующим образом:
//Вектор целых чисел
//Вектор чисел типа
double vector vDbls;
Обычно пользователь знает, сколько элементов будет содержаться в векторе. В этом случае он может зарезервировать память в векторе для нужного числа элементов, указав его после имени объекта в круглых скобках, например:
Количество элементов в векторе можно узнать с помощью функции-члена size ():
size_type size() const;
Функция resize изменяет величину вектора. Она имеет следующий прототип:
void resize(size_type sz);
Если новая величина вектора sz больше текущей, то в конец вектора добавляется нужное число элементов класса Т. Если же новая величина вектора меньше текущей, вектор усекается с конца.
void pop_back(); //удаляет последний элемент вектора.
Обращаться к элементам вектора можно по индексам. Значения индекса начинаются с нуля. Например, присвоить значение четвертому элементу объявленного выше вектора можно следующим образом:
Если первоначально зарезервированная память для элементов вектора исчерпана, число элементов вектора будет автоматически увеличено.
Добавить элемент в конец вектора можно с помощью функции-члена push_back(), однако она требует, чтобы в классе хранимых в контейнере объектов был определен конструктор копирования (эта функция добавляет в контейнер копию элемента). Она имеет следующий прототип:
void push_back(const Т& х); //Добавить элемент в конец вектора
Проверить, не является ли контейнер пустым, можно с помощью функции-члена empty ():
bool empty() const; //является ли контейнер пустым
Она принимает значение true, если контейнер пуст.
Функция clear (), имеющая следующий прототип:
void clear(); //удаляет все элементы из вектора.
Функция at () работает подобно оператору индексирования ( [ ] ), но является более безопасной, поскольку проверяет, попадает ли переданный ей индекс в диапазон допустимых значений. Если индекс вне диапазона, она генерирует исключение out_of _range.
Функция insert () вставляет один или несколько элементов, начиная с указанной позиции в векторе. Функция pop_back () удаляет из вектора последний элемент. Кроме того, для класса vector определены обычные операции сравнения.
Рассмотри теперь функции-члены шаблонного класса vector.
size_type capacity() const; возвращает величину распределенной для вектора памяти в виде числа элементов, которые могут быть сохранены в векторе.
void reserve(size_type n); добавляет емкость вектору в предположении, что к вектору будут добавляться новые элементы.
После вызова этой функции последующие операции добавления элементов не будут вызывать перераспределения памяти, пока величина вектора не превзойдет n. Перераспределение памяти не появляется, если n не превосходит значения capacity(). Если происходит перераспределение памяти, то все итераторы и ссылки, указывающие на элементы вектора, становятся неверными.
reference back(); возвращает ссылку на последний элемент
reference front(); возвращает ссылку на первый элемент вектора.
функция reference at(size_type n); возвращает ссылку на элемент со значением индекса n.
Функция
iterator insert (iterator position, const T& x);
вставляет элемент x перед элементом, позиция которого задана параметром position. Возвращаемое значение указывает на вставленный элемент.
Кроме обычных итераторов, в контейнере определены обратные (или реверсивные) итераторы, которые имеют тип reverse_iterator. Такие итераторы используются для прохода последовательного контейнера в обратном направлении, то есть от последнего элемента к первому.
reverse_iterator rbegin(); возвращает обратный итератор произвольного доступа, который указывает на область памяти за последним элементом.
reverse_iterator rend(); возвращает обратный итератор произвольного доступа, который указывает на первый элемент.
Библиотека STL содержит контейнерный класс list, предоставляющий в распоряжение двусвязный (двунаправленный) список. Он определен в заголовочном файле в пространстве имен std.
Этот класс имеет такие же функции, как вектор и ряд дополнительных функций.
Если с векторами итераторы используются редко, то при работе со списком они являются основным средством. Для создания списков предназначены конструкторы, которые имеют несколько форм. Конструктор
explicit list(const Allocator& alloc = Allocator() )
создает список, не содержащий элементов, причем список использует для распределения памяти объект alloc.
explicit list(size_type n);
создает список длины n, содержащий копии значения по умолчанию объектов типа Т. Тип Т должен иметь конструктор по умолчанию. Список использует для распределения памяти объект alloc.
Конструктор list(size_type n, const T& value, const Allocator & alloc = Allocator()); создает список длины n, содержащий копии значения value объектов типа Т. Тип Т должен иметь конструктор по умолчанию. Список использует для распределения памяти объект alloc. В классе list определены дополнительные функции. Функции void push_front(const T& x); и void pop_front(); аналогичны функциям push_back() и pop_back(), однако осуществляют добавление и удаление элементов в начале списка. Функция void remove(const Т& value); удаляет элемент из списка.
Вызвав функцию sort (), можно отсортировать список: void sort();



