Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы разработки программ на языке С++ для систем информационной безопасности. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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 ; }
Смысл этого действия в том, что дальнейшее исполнение программ-
ного кода функции прекращается, управление передается в вызвавшую функцию. Далее возможна одна из двух ситуаций:
• вызвавшая функция обрабатывает исключение и продолжает свое
выполнение;
• вызвавшая функция не обрабатывает исключения. Тогда объект ис-
ключения «пробрасывается» в вызвавшую функцию верхнего уровня и так далее до тех пор, пока исключение либо не будет обработано одной из функ­ций программы, либо будет выброшено операционной системе. В этом слу­чае операционная система аварийно завершает программу, выводя соответ­ствующее уведомление.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]