Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы разработки программ на языке С++ для систем информационной безопасности. Учебное пособие
.pdf
15.3. Потоки ввода (istream)
81
Таблица 55
Пример использования строкового потока
#include “stadfx.h”
#include <sstream>
#include <iostream>
#include (string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
stringstream WorkString;
WorkString << 25 << “.” << 10 << << “,” << 2020;
return 0;
}
Строки и строковые потоки являются ярким примером абстрагирования близких, но не эквивалентных сущностей. Включая строки как свойства,
объекты строковых потоков обладают совсем не характерным поведением
для строк. Строку класса string можно получить из строкового потока, используя метод str (табл.55).
Из строкового потока могут считываться данные подобно тому, как
это делалось для файлового потока. На рис. 20 приведен пример, в котором
из строкового потока считываются числа, символы и строка.
Рис. 20. Получение строки из строкового потока
15.3. Потоки ввода (istream)
Для ввода используется оператор >>. Он также определен для всех
встроенных типов и некоторых классов стандартной библиотеки.
Оператор >> также можно определить для своих классов:

15. Классы строк и строковых потоков
82
istream& operator>>(istream& s)
{
...
}
Некоторые методы класса istream:
• get() – считать следующий символ;
• get(char *buf, streamsize n) – считать максимум n-1 символ и поме-
стить в массив buf;
• get(char *buf, streamsize n, char delim) – считывание символов до сим-
вола-разделителя delim (разделитель не считывается и остается в потоке);
• getline(char *buf, streamsize n);
• getline(char *buf, streamsize n, char delim);
• peek() – считывает следующий символ, но оставляет его в потоке;
• ignore(streamsize n = 1, int delim = EOF) – извлекает символы из потока
до тех пор, пока их число меньше n или пока не встретился символ delim;
• putback(char c) – добавляет символ с в текущую позицию потока;
• unget() – возвращает последний считанный символ в поток.
Практическое задание 8. Векторы
Задание: вывести данные по кредитам в виде 3 векторов (фамилия,
имя, год рождения, сумма кредита, срок погашения, остаток по задолженности). Использовать функции из библиотеки <vector>.
Таблица 56
Варианты для практического задания 8
№
вар.
Входные данные
1
Проверка на уникальность введенных значений (поле фио)
2
Сортировка элементов по убыванию (по сумме кредита)
3
Сортировка элементов по возрастанию (по задолженности)
4
Поменять местами четные по значению элементы 2 векторов
(срок погашения)
5
Сравнить элементы 3-х векторов (остаток по задолженности)
6
Поменять местами положительные элементы 2-х векторов (год рождения)
7
Сравнить элементы 3-х векторов (сумма кредита)
8
Сортировка элементов по возрастанию (срок погашения)
9
Вывести данные по кредитам, заканчивающимся в текущем году

15.3. Потоки ввода (istream)
83
Окончание табл. 56
№
вар.
Входные данные
10
Увеличить остаток по задолженности на сумму кредита больше введенной
(в диалоге)
11
Увеличить срок погашения на год для кредитов на сумму меньше введенной (в диалоге)
12
Сортировка элементов по убыванию (год рождения)
13
Уменьшить остаток по задолженности для введенного года рождения (в
диалоге)
14
Вывести процент остатка по кредиту от первоначальной суммы
15
Вывести значения наибольшего остатка по задолженности

15. Классы строк и строковых потоков
84
16. ДАТА И ВРЕМЯ В ПРОГРАММАХ НА С++
Необходимость в программной обработке времени возникает при раз-
работке систем, обрабатывающих данные реального мира. Сложность подобных программ изменяется в широких пределах – от простого отсчета вре-
менного диапазона до реализации логики временных событий.
Функций для работы со временем в языке C++ несколько. Одной из
них является функция clock(), которая подключается к проекту с помощью
заголовочного файла <ctime>. Она позволяет вывести время работы программы к определенному моменту. С помощью этого можно вычислять,
сколько времени затрачено на тот или иной участок кода.
Таблица 57
Чтение данных из строкового потока
s = “12.04.2020 День космонавтики “;
int dd,mm,yy;
char cc;
char Str[100];
stringstream IntStr (s);
InStr >> dd >> cc >> mm >> cc >> yy;
IntStr.getline( Str,100);
Время в любой цифровой системе отсчитывается с использованием
счетчиков. Всякая программа, использующая время, должна получать значения счетчика в любой требуемый момент времени. В программах на языке С
существует библиотечная функция, с помощью которой с 1 января 1970 г.
получают текущее время в секундах.
time_t time( time_t *timer)
Функция time принимает в качестве аргумента указатель на переменную типа time_t и в эту переменную записывается время момента вызова
функции.
На рис. 21 показан пример, где в окне отладчика отображено значение
текущего времени в числовом виде.
Рис. 21. Чтение текущего времени

16. Дата и время в программах на С++
85
Непосредственно использовать значения времени можно для вычис-
ления временных интервалов. Разность любых значений – это длина интервала в секундах. Кроме того, добавление интервалов времени в секундах позволяет установить временную метку «будущего». Например,
CurTime=CurTime +3600*24*7
определяет момент времени, смещенный на неделю вперед относительно
текущего.
Таблица 58
Структурированное представление времени
tm_sec Seconds after minute (0-59).
tm_min Minutes after hour (0-59).
tm_hour Hour after midnight (0-23).
tm_mday Day of month (1-31).
tm_mon Month (0-11; January = 0).
tm_year Year (current year minus 1900).
tm_wday Day of week(0-6; Sunday = 0).
tm_yday Day of year (0-365; January 1 = 0).
tm_isdst
Стандартная библиотека в С++ использует структуру tm для привыч-
ного в отображении представления времени (рис. 22). Это представление
включает в себя: текущее время с точностью до секунд, день, месяц, год. Получить это представление можно, имея значение типа time_t в секундах.
Рис. 22. Получение времени в виде структуры tm
Функция localtime предназначена для получения времени в виде
структуры tm. На рис. 22 показано окно отладчика, отображающее структур-

16. Дата и время в программах на С++
86
ную переменную времени. Результат возвращается как указатель на структуру tm. Все элементы структуры tm являются целыми числами, т.е. их
можно использовать в арифметических выражениях.
Выполнить преобразование времени в виде структуры tm число секунд позволяет функция mktime. В качестве параметра принимается указатель на структурную переменную, а возвращается число типа time_t. На
рис. 23 показан программный код, позволяющий получить число типа time_t
для нужного дня месяца (в примере 22 числа текущего месяца).
Функция asctime преобразует время в секундах в символьную нерусифицированную строку (рис. 23).
Рис. 23. Преобразование времени из структуры tm в time_t
Практическое задание 9. Время получения результата
Задание: определить время работы программы
Таблица 59
Варианты для практического задания 9
№
вар.
Входные данные
Представление
выходных данных
1
Сравнить время работы функций, заполняющей массив случайными числами и считывающей числа с клавиатуры
Наименьший результат из
полученных
2
Сравнить время выполнения 2-х способов
сортировки массива (на выбор: сортировка
пузырьком, вставками, деревом)
Наибольший результат из полученных
3
Получите время, которое пользователь
тратит на нажатие клавиши при заполнении массива из 20-ти целых чисел
Наименьший результат из
полученных

16. Дата и время в программах на С++
87
Окончание табл. 59
№
вар.
Входные данные
Представление
выходных данных
4
Сравнить время выполнения 2-х способов сортировки массива (на выбор: сортировка выбором, обменами, «гномья»)
Время работы фрагмента
программы
5
Получите время, которое пользователь тратит
на нажатие клавиши при заполнении массива
из 10-ти вещественных чисел
Время работы программы
без использования системных часов
6
Выполнить сортировку элементов массива (на
выбор: сортировка пузырьком, вставками, деревом)
Время работы программы
в миллисекундах
7
Сравнить время выполнения 2-х способов сортировки массива (на выбор: сортировка слиянием, быстрая, выбором)
Время программы в секундах, с дробной частью
(до 2 знаков)
8
Выполнить сортировку элементов массива (на
выбор: сортировка пузырьком, вставками, деревом).
Время работы программы
в миллисекундах
9
Сравнить время выполнения 2-х способов сортировки массива (на выбор: сортировка слиянием, быстрая, выбором)
Время работы фрагмента
программы
10
Получите время, которое пользователь тратит
на нажатие клавиши при заполнении массива
из 25-ти целых чисел
Время выполнения функции, измеренное в цикле
11
Выполнить сортировку элементов массива (на
выбор: сортировка пузырьком, вставками, деревом)
Время работы программы
без использования системных часов
12
Получите время, которое пользователь тратит
на нажатие клавиши при заполнении массива
из 20-ти целых чисел
Время работы программы
в миллисекундах
13
Сравнить время выполнения 2-х видов поразрядной сортировки массива
Наименьшее время работы программы
14
Сравнить время выполнения 2-х способов сортировки массива (на выбор: сортировка слиянием, быстрая, выбором)
Время работы программы
без использования системных часов
15
Получите время, которое пользователь тратит
на нажатие клавиши при заполнении массива
из 30-ти целых чисел
Время работы фрагмента
программы

16. Дата и время в программах на С++
88
17. ОБРАБОТКА ОШИБОК И ИСКЛЮЧЕНИЙ
Исполнение любой программы может сопровождаться появлением
сочетаний данных, которые считаются ошибочными. Не учитывать подобные ситуации – значит строить ненадежную программу. Обработка ошибок
в программах на многих языках может строиться по двум основным
направлениям:
• пассивное реагирование на ошибочную ситуацию;
• активное реагирование на ошибочную ситуацию.
Рис. 24. Преобразование времени из типа time_t в строку
Оба пути не исключают друг друга, а могут комбинироваться.
Таблица 60
Функция, возвращающая и данные, и код ошибки
int MyFunction ( int InpData
{
bool bError = false;
int OutData;
// обработка входных аднных
// …
// здесь может быть ошибочная ситуация, т.е. bError = true
if (bError)
return -1;
else
return OutData;
}
Пассивный режим основан на возврате оператором return из функции
признака ошибки (табл. 61).
Таблица 61
Проверка ошибки и обработка данных
int Result;
result = MyFunction( 100 );

17. Обработка ошибок и исключений
89
Окончание табл. 61
В некоторых случаях в качестве признака ошибки используется одно из
значений данных, такой стиль программирования применять не рекомендуется из-за высокой вероятности “спутать” полезное и ошибочное значение.
Чтобы разделить ошибочные и полезные значения, выходные пере-
менные переносят в список параметров функций (табл.62).
Таблица 62
Разделение кода ошибки и полезных значений
bool MyFunctionA ( int InpData, int& OutData )
{
bool bError = false;
// обработка входных аднных
// …
// здесь может быть ошибочная ситуация, т.е. bError = true
return bError;
}
В качестве возвращаемого оставляют булево значение. Именно оно
позволяет однозначно определить была ошибка или не было. В табл.61 показан программный код, обрабатывающий признак ошибки.
В обоих рассмотренных выше случаях остается открытым вопрос о
том, будет ли проверено возвращаемое значение программным кодом, вызвавшим функцию. Если это не сделано, ошибочные данные будут распространяться через последующий процесс обработки.
Таблица 63
Обработка ошибки и данных раздельно
bool fError;
int DataFromFunction;
fError = MyFunctionA( 100, DataFromFunction );
if( !fError )
if( Result != -1)
{
// ошибки не было, данные обрабатываются
}
else
cout << “Error detected !”;

17. Обработка ошибок и исключений
90
Окончание табл. 63
{
// ошибки не было, данные обрабатываются
}
else
cout << “Error detected !”;
В основе активного режима обработки ошибок лежит использование
исключений. Исключение в программе – это специфическая ситуация, которая возникает после использования ключевого слова throw. Оператор
throw х «выбрасывает» исключение х, которое является переменной или зна-
чением определенного типа. В табл. 64 показан пример функции, которая при
возникновении ошибки выбрасывает «неопределенное» исключение.
Таблица 64
Выброс исключения при возникновении ошибки
void MyFunctionB ( int InpData, int& OutData )
{
bool bError = false;
// обработка входных данных
// …
bError = true;
// здесь можеть быть ошибочная ситуация, т.е. bError = true
if (bError)
throw ;
}
Смысл этого действия в том, что дальнейшее исполнение программ-
ного кода функции прекращается, управление передается в вызвавшую
функцию. Далее возможна одна из двух ситуаций:
• вызвавшая функция обрабатывает исключение и продолжает свое
выполнение;
• вызвавшая функция не обрабатывает исключения. Тогда объект ис-
ключения «пробрасывается» в вызвавшую функцию верхнего уровня и так
далее до тех пор, пока исключение либо не будет обработано одной из функций программы, либо будет выброшено операционной системе. В этом случае операционная система аварийно завершает программу, выводя соответствующее уведомление.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
