Мегаобучалка Главная | О нас | Обратная связь


Организация форматированного ввода и вывода



2019-08-13 267 Обсуждений (0)
Организация форматированного ввода и вывода 0.00 из 5.00 0 оценок




ОРГАНИЗАЦИЯ ВВОДА И ВЫВОДА В ПРОГРАММАХ

РЕШЕНИЕ ЗАДАЧ С ПРОСТОЙ ПРЕМЕННОЙ

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

Библиотека языка С++ поддерживает следующие три уровня ввода - ввода:

     ¾ ввод - вывод потока;

¾ ввод - вывод нижнего уровня;

¾ ввод - вывод для консоли и порта.

При вводе - выводе потока все данные рассматриваются как поток отдельных байтов. Для пользователя поток - это либо файл на диске, либо физическое устройство, например, дисплей, клавиатура или печатающее устройство, с которого или на которое направляется поток данных. Функции ввода - вывода для потока позволяют обрабатывать данные различных размеров и форматов от одиночного символа до больших структур данных. Программист может использовать функции библиотеки или разрабатывать собственные и включать их в библиотеку. Для доступа к библиотеке этих классов надо включить в программу соответствующие файлы заголовков, например #include <iostream.h>.

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

¾ <stdio.h> содержит большинство функций ввода – вывода ;

   ¾ <ctype .h> содержит функции для обработки символьных массивов;

   ¾ <string . h> содержит функции для проверки символов.

 

 

Использование операторов ввода

Чаще всего в С++ используется потоковый ввод данных, операции которого включены в состав классов istream или iostream . Он может осуществляться с предопределенным в этих классах входным потоком cin или входным потоком, определенным пользователем. Для чтения символов из этого потока указывается операция извлечения из потока, которая обозначается с помощью символов    “ >> “ . Это перегруженная операция, предопределенная для всех простых типов и указателя на char.

Формат записи оператора cin имеет вид:

cin [ >> values ];           .

Например, для ввода значений переменным Х и У можно написать:

cin >> x >> y;           .

Каждая операция “ >> “ предусматривает ввод одного значения. При вводе данных необходимо выполнять следующие требования:

¾ для разделения двух последовательно вводимых чисел используется пробел (данные типа сhаr разделять пробелом не обязательно) или ENTER;

¾ если последовательно вводится символ и число (или наоборот), пробел надо записывать только в том случае, если вводимый символ (типа сhаr) является цифрой;

¾ поток ввода игнорирует пробелы;

¾ при вводе большого количества данных одним оператором их можно располагать в нескольких строках (используя ENTER);

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

 

2.345 789

или

2.345

                                                        789

Поскольку в этом примере пробел является разделителем между вводимыми значениями, то при вводе строк, содержащих пробелы в своем составе, этот оператор использовать нельзя. В таком случае надо использовать методы рассматриваемых классов такие как: getline( ), read( ), get( ) и др. (форматы этих функций рассмотрим при обработке символьных данных). В С++ ввод - вывод может выполнятся с использованием операторов, а не функций ввода - вывода.

 

 

1.2.2 Организация вывода данных в С++

Вывод данных может быть неформатированным и форматированным. Чаще всего для вывода применяется предопределенная операция <<, которая записывается совместно с именем выходного потока cout. Таким образом запись:

cout << x;

означает вывести значение переменной x (или записать в поток). Этот оператор выбирает необходимую функцию преобразования данных в поток байтов.

Формат записи cout отличается от формы записи команд С++ 

cout << data [ << data ];               ,

где data ¾ это переменные, константы, выражения или комбинация типов.

Записи оператора cout может выглядеть следующим образом:

с out << "y=" << x + a - sin(x) << "\n";       .

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

с out << " p =" << ( a && b || c ) << "\ n";      .

В С++ нет символьных значений. Символ перевода каретки "\n" записывается как строковая константа, иначе он рассматривается не как управляющий сим- вол, а как число 10 ( код символа). Таких ошибок можно избежать путем присвоения значения управляющих символов переменным, например:

#define <<sp " "

#define <<ht "\t"

# define << hl "\ n"

Теперь оператор вывода можно записать:

с out << " y = " << x + a - sin(x) << hl;    .

Надо помнить, что cout не выполняет автоматический возврат каретки. Чтобы напечатать строковую константу, надо поместить ее за оператором cout в таком виде:

cout << " Я изучаю программирование \n";          .

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

 //P1_1.CPP ¾ печать значений переменных

 //                     с соответствующими пометками

#include <iostream.h>

main ( )

       {

          char first = 'W';

          char middle = 'P';

          char last = 'S';

          int wozrast = 20;

          int doplata = 2;

          float zarplata = 309.75;

          float prozent = 8.5;

// Печать результатов

cout << " Проверка исходных данных\n";

cout << first << middle << last << "\n\n";

cout << " Возраст доплата зарплата процент: \n";

cout << wozrast << ' ' << doplata << ' ' << zarplata << ' ' << prozent;

Return 0;

       }

Последние два оператора можно представить с символами табуляции. Знак \t  помещает каждое следующее имя или число в следующую позицию табуляции (каждые восемь символов). Например:

cout << " Возраст\t доплата\t зарплата\t процент\t \n";

cout << wozrast<<"\t" << doplata<<"\t"<< zarplata<<"\t"<< prozent<<"\n " ;

Для дополнительного управления выходными данными используются манипуляторы: setw(n) и setprecision(k). Манипулятор setw(n) служит для указания длины поля, которое отводится для вывода последующего данного (здесь n - количество позиций в строке). Setprecision(k) предназначен для указания количества позиций в дробной части вещественных чисел.

Манипуляторы изменяют вид некоторых переменных в объекте cout, которые в потоке следуют за ними. Эти манипуляторы называют флагами состояния. Когда объект посылает данные на экран, он проверяет флаги, чтобы узнать, как выполнить задание, например, запись:

 

cout << 456 << 789 << 123;

выдаст значения в виде: 456789123, что затрудняет определить группы значений.

 

Пример 1 .2   Написать программу с использованием манипулятора setw .

// P1_2.CPP ¾  демонстрация различных манипуляторов

//                      ширины вывода целого числа

#include <iostream.h>

#include <iomanip.h>

Main ( )

{

           cout << 456 << 789 << 123 << endl;

           cout << setw(5) << 456 << setw(5) << 789

                                              << setw(5) << 123 << endl;

           cout << setw(7) << 456 << setw(7) << 789

                                              << setw(7) << 123 << endl;

           return 0;

}

 


Примечание: В языке С++ операция endl равносильна операции “/n”

Результаты выполнения программы:

                       456789123

                       456 789 123

                       456  789  123

В этом примере появился новый заголовочный файл iomanip.h, позволяющий использовать функции манипуляторов, таких как setw. При использовании функции setw, С++ выравнивает число вправо в границах заданной ширины поля вывода. Если ширина недостаточная, С++ игнорирует указанное значение.

Функция setprecision(2) сообщает С++ о том, что число с плавающей точкой надо выводить с двумя знаками после точки с округлением дробной части, например, при выполнении оператора

с out << setw(7) << setprecision (2) << 123.456789;

будет получен следующий результат:                123.46        .

Операция cin использует те же манипуляторы , что и операция cout. Список переменных, в которые будут помещены данные, определены в values.

Пример 1. 3  Написать программу для вычисления налога на продажи.

// P1_3.CPP ¾  программа налог :ввод суммы продаж

//                    и печать налога на продажи

# include < iostream. h>

# include < iomanip. h>

main ( )

{

float prod_sum; // Сюда будет записана сумма продаж

float nalog ;

// Вывод подсказки для пользователя

           cout << " Введите сумму продаж для расчета налога ";

cin >> prod_ sum;

nalog = prod_sum* 0.7; // Вычисление налога на продажи

cout << " " << setprecision(2) << prod_sum;

           cout << " " <<  setprecision(2) << nalog"\n";

           return 0;

}

Из-за того, что в первом операторе cout не содержится знак перевода строки, ответ пользователя на подсказку появится сразу справа от знака вопроса.

 

 

Организация форматированного ввода и вывода

При форматированном ввода используются функции:

        scanf( ) ¾ форматированный ввод из потока ;

    sscanf( ) ¾ форматированный ввод из строки ;

    fscanf( ) ¾ форматированный ввод из любого стандартного устройства.

Для форматированного ввода используется функция scanf, которая обеспечивает форматированный ввод данных. Функция s canf имеет переменное число параметров, но в качестве фактических параметров она использует адреса переменных, а не их значения. При этом перед соответствующим параметром ставится знак & - символ взятия адреса переменной. Например, &x1 означает "адрес переменной x1", а не значение, которое эта переменная имеет в данный момент. Строка форматов функции s canf указывает, какие данные ожидаются на входе. Если функция встречает в форматной строке знак % , за которым следует знак преобразования, то она будет пропускать на входе символы до тех пор, пока не встретит какой - нибудь непустой символ. Таким образом функция s canf изменяет значения переменных в вызывающей программе.

Форма записи этих функций имеет вид:

Scanf ( "строка форматных кодов", список имен переменных );         .

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

%[*] [длина] [f | n ] [ h | l ] тип

где % ¾ признак начала форматного кода. Если за символом % следует символ, который не является символом управления форматом, то он рассматривается как обычная последовательность символов. При этом следующие за ним символы (до следующего символа %) также считаются просто символами; если за символом % следует * (звездочка), то присваивание следующего входного поля подавляется, поле читается, но не сохраняется;

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

    f и n ¾ позволяют подавить соглашение по умолчанию об использова -

ной модели памяти (далекая, близкая память);

    n и l  ¾ предикаты, которые определяют аргументы short и long соответственно;

    тип ¾ задается одним из символов :

    d ¾ десятичное целое;

     i ¾ десятичное, восьмеричное или шестнадцатеричное целое со знаком;

c ¾ одиночный символ;

u ¾ беззнаковое десятичное число;

x, X ¾ беззнаковое шестнадцатеричное число;

     0 ¾ восьмеричное число;

      s ¾ воспринимает символы без преобразования до символа "\n",  пробела или пока не будет достигнута заданная длина ¾ при выводе выдает в поток все символы до символа "\0", или до достижения специфицируемой точности.

f ¾ значение с плавающей точкой;

e , E ¾ значение в форме Е;

 G , g ¾ значение со знаком в форме f или e в зависимости от значения.

Аргументы в функции scanf( )  должны быть записаны в форме указателей, т.е. в виде &x, &y, &mas[i]  и т.д. Например для ввода переменных k(int) и p(float) эту функцию можно записать в виде:

               scanf( " % d % f \ n ", & k, & p);          .

                               

Пример 1.4 Ввести два числа и вычислить их сумму:

// P1_4.CPP ¾ввод двух чисел и вычисление их суммы

#include <stdio.h>

Main( )

{

int a,b,c;

s canf ( " %d %d",&a,&b); // Было введено 5 и 8

c=a+b;

printf ("Cумма =%d \n", c);

}

В результате выполнения программы было выведено:

Сумма=13

Форматная строка предписывает функции s canf ввести десятичное число, которое надо поместить в переменную а, а затем продвинуться к следующему не пустому символу и с этой точки начать ввод нового десятичного числа, которое затем присвоить переменной b. Если за строкой управления форматом аргументов больше, чем спецификаций формата, лишние аргументы игнорируются. Если для спецификаций формата недостаточно аргументов, результат не определен.

 



2019-08-13 267 Обсуждений (0)
Организация форматированного ввода и вывода 0.00 из 5.00 0 оценок









Обсуждение в статье: Организация форматированного ввода и вывода

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (267)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)