Беляков
А. В. Боженюк
М. В. Петряева
Основы разработки
программ
на языке C++
для систем
информационной
безопасности
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное
образовательное учреждение высшего образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Инженерно-технологическая академия
С. Л. БЕЛЯКОВ
А. В. БОЖЕ II ІО К
М. В. ПЕТРЯЕВА
Учебное пособие
Ростов-на-Дону - Т аганрог
Издательство Южного федерального университета
2020
УДК 004.438:004.056 (075.8)
ББК 32.973-018.1я73
Б448
Рецензенты:
доктор технических наук, профессор, заведующий кафедрой информатики
Таганрогского института имени А. П. Чехова (филиал) «Ростовского
государственного Экономического университета (РИНХ)» Я. Е. Ромм
Беляков, С. Л.
Б448 Основы разработки программ на языке C++ для систем информа
ционной безопасности : учебное пособие / С. Л. Беляков, А. В. Боже-
нюк, М. В. Петряева ; Южный федеральный университет. - Ростов-на-
Дону ; Таганрог : Издательство Южного федерального университета,
2020. - 152 с.
ISBN 978-5-9275-3521-7
Изложены необходимые для освоения курса сведения - краткий кон
спект лекций, методические указания к выполнению лабораторных работ, ин
дивидуального задания, а также образцы тестовых вопросов. Направление
подготовки 120700 «Защита информации».
2
СОДЕРЖАНИЕ
ВВЕДЕНИЕ............................................................................................... 5
1. КАЧЕСТВО ПРОГРАМ М ................................................................. 7
1.1. Правильность программы........................................................... 7
1.2. Надёжность программы.............................................................. 9
1.3. Время получения результата..................................................... 10
1.4. Используемые ресурсы ................................................................. 10
1.5. Защ ита............................................................................................. 11
2. ОСНОВНЫЕ ЭТАПЫ РАЗРАБОТКИ ПРОГРАМ М ............... 13
3. АЛГОРИТМИЗАЦИЯ......................................................................... 17
4. ИСПОЛНЕНИЕ ПРОГРАМ М .......................................................... 22
5. СТРУКТУРА ПРОГРАММЫ НА C + + ......................................... 24
5.1. Поточный ввод-вывод в C + + ..................................................... 27
5.2. Вывод информации...................................................................... 28
5.3. Ввод информации.......................................................................... 28
5.4. Ввод символьных строк................................................................ 28
5.5. Манипуляторы потока.................................................................. 28
6. ПЕРЕМЕННЫЕ ПРОГРАММЫ И ОБЛАСТИ ИХ ДЕЙСТВИЯ 32
7. ТИПЫ ДАННЫ Х............................................................................... 34
7.1. Символьный т и п ........................................................................... 35
7.2. Числовые т и п ы .............................................................................. 37
7.3. Преобразование типов данных в С + + ....................................... 41
7.4. Неявное преобразование т и п а ..................................................... 41
7.5. Числовое расширение.................................................................. 42
7.6. Числовая конверсия...................................................................... 42
7.7. Обработка арифметических выражений................................... 42
7.8. Приоритет типов операндов........................................................ 43
7.9. Явное преобразование типов данны х........................................ 43
8. ПОРАЗРЯДНАЯ ОБРАБОТКА ДАННЫ Х................................... 46
8.1. Шифрование м атриц..................................................................... 48
8.2. Шифр В ернама.............................................................................. 49
3
Содержание
9. УКАЗАТЕЛИ....................................................................................... 50
10. СИМВОЛЬНЫЕ МАССИВЫ И СТРО КИ................................ 53
11. ПЕРЕДАЧА ПАРАМЕТРОВ ФУНКЦИЯМ............................ 57
12. СТРУКТУРЫ И ОБЪЕДИНЕНИЯ............................................. 61
13. КЛАССЫ ............................................................................................ 64
14. ВВОД И ВЫВОД ИНФОРМАЦИИ В Ф А Й ЛЫ ................... 71
15. КЛАССЫ СТРОК И СТРОКОВЫХ ПОТОКОВ................... 77
15.1. Конструкторы стр о к.................................................................. 79
15.2. Арифметические операторы..................................................... 80
15.3. Потоки ввода (istream) .............................................................. 81
16. ДАТА И ВРЕМЯ В ПРОГРАММАХ НА С + + ........................ 84
17. ОБРАБОТКА ОШИБОК И ИСКЛЮЧЕНИЙ............................ 88
18. ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМ ЯТИ........................... 94
19. ТЕСТИРОВАНИЕ ПРОГРАММНОГО К О Д А .......................... 98
ЛАБОРАТОРНЫЕ РАБОТЫ ................................................................... 102
Лабораторная работа № 1 ...................................................................... 102
Лабораторная работа № 2 ...................................................................... 105
Лабораторная работа № 3 ...................................................................... 108
Лабораторная работа № 4 ...................................................................... 109
Лабораторная работа № 5 ....................................................................... 111
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ.......................................................... 114
Общие требования к разработке........................................................... 114
Представление результата выполнения индивидуального зада
ния .............................................................................................................. 121
ПРИМЕРЫ ТЕСТОВЫХ ВОПРОСОВ................................................. 124
ЗАКЛЮ ЧЕНИЕ........................................................................................... 150
СПИСОК ЛИТЕРАТУРЫ......................................................................... 151
ВВЕДЕНИЕ
5
Введение
9■
Требования
к программе (техническое
Программа
задание)
8
1.2. Надёжность программы
9
1. Качество программ
Ротказа
At
і ;'| 1 I I. . I .4 . I. ■ ■ ■ ■ ■ ! І, Ѵ • ••
П рограм м а
К.э И.) ЛЫ ГН и л-
1.5. Защита
11
1. Качество программ
13
2. Основные этапы разработки программ
14
2. Основные этапы разработки программ
17
3. Алгоритмизация
с тем, чтобы выработать затем общий алгоритм решения. Здесь важна ви
зуализация примеров: можно использовать рисунки и схемы. Они могут
натолкнуть на идею алгоритма.
Сопоставление с известным образцом предполагает, что разработ
чик знает ряд алгоритмов и пытается найти среди них аналогичный тому,
который требуется построить.
Стратегия Упростить, затем усложнить основана на том, чтобы ис
ходную задачу представить в некотором упрощенном виде, позволяющем
составить алгоритм. Затем пытаются усовершенствовать алгоритм так,
чтобы он учитывал первоначально сделанные упрощения.
Стратегия От частного к общему состоит в следующем: текущий
результат пытаются получить, комбинируя более простые предыдущие ре
зультаты работы алгоритма.
Стратегия Выбор структуры данных состоит в том, чтобы решить
задачу выбором такой структуры данных, которая, по сути, заменяет алго
ритм поиска решения выбором из памяти готового результата.
Всегда ли нужно описывать алгоритмы перед разработкой про
граммы? Категоричного утвердительного ответа здесь дать нельзя. Описа
ние алгоритма полезно разработчику ровно настолько, насколько позво
ляет справиться с сложной задачей. «Простые» задачи обдумываются и ре
ализуются непосредственно написанием программного кода. Простота
оценивается в 5-10 строк кода. Если речь идет о сложных задачах, то опи
сание алгоритма необходимо по нескольким причинам:
• на этапе постановки задачи для фиксации и обдумывания разных
вариантов решения;
• на этапе моделирования для уточнения и детализации действий,
выполняемых программой;
• при архитектурном проектировании алгоритмами описывают
связи между элементами системы;
• при кодировании и отладке коллективной работы.
Варианты описания алгоритмов приведены ниже: Естественный код;
Псевдокод; Блок-схемы.
Описание алгоритмов на естественном языке выглядит как нуме
рованный список действий. Пример алгоритма работы калькулятора:
18
3. Алгоритмизация
19
3. Алгоритмизация
20
3. Алгоритмизация
22
4. Исполнение программ
24
5. Структура программы на C+ +
Таблица 4
Пример программы на C++
include “stdafx.h”
int_main (int argc, _TCHAR* argv [])
{
printf (“Hello, world !”);
return 0;
______________________________________________________
Пример описания функции, созданной пользователем:
int MyFunction (int A, int В)
{
return (А+В);
25
5. Структура программы на C+ +
26
5.1. Поточный ввод-вывод в C+ +
Таблица 6
Объявление и определение функции
# include “stdafx.h”
# incude < iostream>
27
5. Структура программы на C+ +
co u t« значение;
Здесь значение преобразуется в последовательность символов и вы
водится в выходной поток:
co u t« п;
Возможно многократное назначение потоков:
co u t« 'значение Г « 'значение2'« . . . « 'значение п';
сіп » идентификатор;
При этом из входного потока читается последовательность символов
до пробела, затем эта последовательность преобразуется к типу идентифи
катора, и получаемое значение помещается в идентификатор.
Возможно многократное назначение потоков:
28
5.5. Манипуляторы потока
29
5. Структура программы на C++
Таблица 8
Варианты для практического задания 1
№
Входные данные Представление выходных данных
вар.
i 10 целых простых чисел Вывести числа в шестнадцатеричной
типа int системе счисления.
Все числа записываются через пробел,
если длина полученной строки больше
15 символов, выполнить перенос на но
вую строку
2 15 целых чисел типа short со После цифры 5 выполнять вертикаль
знаком в шестнадцатеричной ную табуляцию
системе счисления
3 10 целых чисел типа int со Максимальное количество символов: 25.
знаком в восьмеричной си Вывести число в 8-СИ. Если его длина
стеме счисления превышает 25 символов, то необходимо
вывести 25 первых символов числа
4 10 целых чисел типа int со В полученной строке все цифры 4 выво
знаком в восьмеричной си дить в апострофах.
стеме счисления Пример: 0х0”4”21
5 15 целых чисел типа longint со Все числа записываются через пробел,
знаком в шестнадцатеричной если длина полученной строки больше
системе счисления 10 символов, выполнить перенос на но
вую строку
6 10 чисел с плавающей точкой Максимальное количество символов: 20
типа double (вещественный
формат двойной точности)
7 15 целых чисел типа int со Вывести 10 чисел, остальные отбросить
знаком в восьмеричной си
стеме счисления
8 10 целых чисел типа int со В полученной строке все цифры 8 выво
знаком в восьмеричной си дить на экран в апострофах
стеме счисления
9 10 целых чисел типа signed Показать знак для положительных чи
shortint сел
10 15 целых чисел типа longint со После каждой цифры 2 выполнять вер
знаком в шестнадцатеричной тикальную табуляцию
системе счисления
30
5.5. Манипуляторы потока
Окончание табл. 8
№
Входные данные Представление выходных данных
вар.
32
6. Переменные программы и области их действия
Таблица 10
Зона действия переменной-параметра функции
Тело функции
char SomeFunction(int X)
{
intY ;
__________ 1______________________________________________________
В языке C++ существует возможность сохранять значения
переменной после завершения функции и последующим вызовом. Это
обеспечивается, если переменная описана как статическая с помощью
ключевого слова static.
Зона действия глобальных переменных ограничивается функциями
файлов, в которых размещены определения этих функций (табл. 11).
7. ТИПЫ ДАННЫ Х
34
7.1. Символьный тип
Name Value
int а = sizeof (char); a 1
35
7. Типы данных
36
7.2. Числовые типы
может быть размещён символ фунта «£», а на месте символа доллара «$» -
знак валюты «и».
В табл. 14 показаны примеры программного кода, выполняющего
допустимые операции над переменными символьного типа.
Таблица 14
Допустимые операции над переменными символьного типа
char sl,s2,s3;
c o u t « ”Set symbol
c in » s l;
s2=’5 ’;
s3 = si + s2; /* ‘9’ + ‘5’ = ‘n ’ */
s3 = si —s2; /* ‘Z ’ - ‘5’ = ‘% ’ */
s3 = ‘\A ’;
s3 = ‘W;
cout « “Out s y m b o l « s3;
38
7.2. Числовые типы
Окончание табл. 16
double a,b,c; Name Value
3 = 7 + 0.0000000001; а 7.0000000001000000
b = 21/3; ь 7.0000000000000000
А С
С
И I
II с
-1.000000000000000
else
с = -1;
39
7. Типы данных
класс также позволяет сравнить два различных типа целых чисел, пока они
являются объектами Safelnt. Как правило, при выполнении сравнения сна
чала необходимо преобразовать числа, чтобы они были одного типа. Хотя
класс Safelnt принимает любой тип целого числа, он выполняет более эф
фективно с типами без знака.
40
7.4. Неявное преобразование типа
Окончание табл. 18
№
Входные данные Представление выходных данных
вар.
13 При вводе неверных значений Совершенные числа
вывести программу из режима
отказа
14 Числа генерируются случай Числа, которые больше предыдущего
ным образом (первое число сравнить с последним)
15 По заданию Выводятся первые 7 чисел, остальные
игнорируются программой
41
7. Типы данных
Таблица 19
Варианты для практического задания 3
№
Входные данные Представление выходных данных
вар.
i 2 числа longlong. Опера Вывести числа в шестнадцатеричной си
ция умножения стеме счисления
Все числа записываются через пробел, если
длина полученной строки больше 15 симво
лов, выполнить перенос на новую строку
2 4 числа unsignedshort. После цифры 5 выполнять вертикальную
Операция сложения ин табуляцию
крементов чисел
3 3 чи сла unsignedint. О пе Максимальное количество символов: 25
рац ия получен ия остатка Вывести число в 8-СИ. Если его длина пре
о т д еления вышает 25 символов, то необходимо выве
сти 25 п ервы х символов числа
4 2 числа int. Операция сло В полученной строке все цифры 4 выводить
жения декрементов чисел в апострофах.
Пример: 0х0”4”21
5 3 чи сла float. О перация В се числа записываются через пробел, если
получен ия целой части от длина полученной строки больше 10 симво
деления лов, выполнить перенос на новую строку
6 4 чи сла unsignedint. О пе Максимальное количество символов: 20
рация получен ия остатка
о т д еления
7 2 числа unsignedshort. Вывести 10 чисел, остальные отбросить
Вывести меньшее из чисел
8 3 числа longdouble. Опе В полученной строке все цифры 8 выводить
рация деления на экран в апострофах
9 2 числа float. Операция де Показать знак для положительных чисел
ления
10 2 числа double. Операция После каждой цифры 2 выполнять верти
сложения инкрементов чи кальную табуляцию
сел
11 3 числа unsignedlonglong. Вывести первые 15 чисел, остальные отбро
Операция сложения декре сить
ментов чисел
44
7. 9. Явное преобразование типов данных
Окончание табл. 19
№
Входные данные Представление выходных данных
вар.
12 2 числа int. Вывести число, Вывести 30, остальные отбросить
наибольшее по модулю
13 2 числа usignedint. Выве Каждые 20 символов выполнять перенос
сти большее из чисел строки
14 4 числа float. Вывести Вывести числа, больше чем А
меньшее из чисел
15 2 числа double. Операция После каждой цифры 9 выполнять верти
деления кальную табуляцию
8. ПОРАЗРЯДНАЯ ОБРАБОТКА ДАННЫ Х
46
8. Поразрядная обработка данных
Таблица 23
Пример шифрования и дешифрования
char Str[]=" Совершенно секретно!!!";
char Key []=ncafkgfkghagkaglgkgkj gl 1hrktu";
char Res [100];
in t;
//кодирование
for(int i=0; i<sizeof(Str)/sizeof(char);i++0
Res[i]=Str[i]AKey[i];
char Str[]=" Совершенно секретно!!!";
char Key []=ncafkgfkghagkaglgkgkj gl 1hrktu";
_______char Res [100];_____________________________________________
47
8. Поразрядная обработка данных
Окончание табл. 23
in t;
//кодирование
for(int і=0; i<sizeof(Str)/sizeof(char);i++0
Res[i]=Str[i] AKey [i];
// декодирование
for(int i=0; i<sizeof(Str)/sizeof(ehar);i++0
Res[i]=Res[i]AKey[i];
РМ = &М[0];
*РМ=’А ’;
50
9. Указатели
Таблица 26
Модификация значений массива по указателю
int intArray[2];
intArray[0]=9;
intArray[l]=99;
int *plnt;
pInt=&intArray [0];
*plnt=*plnt +1;
*(plnt+ 1) = *(plnt+ 1 ) + 1;
intArray 0x0012ffl8 int [2]
[0] 10 int
rn loo int
Таблица 27
Преобразование типа указателя
int intArray [2];
intArray[0]=9;
intArray[l]=99;
int *plnt;
pInt=&intArray [0];
char *pChar;
pChar = (char *) pint;
char cl, c2, c3, c4;
cl = *pChar;
c2 = (*pChar+l);
c3 = (*pChar+2);
c4= (*pChar +3);___________________________________________
51
9. Указатели
Окончание табл. 28
№ Представление
Входные данные
вар. выходных данных
4 Умножить результат на п-ю сте
пень числа 2
5 Выполнить исключающее ИЛИ У результата поменять знак
6 Определить положение старшей Заменить стоящую справа 1 на 0
единицы в длинном целом числе N
7 Выполнить сдвиг влево на Зраз- Обнулить п-й бит
ряда
8 Выполнить инверсию целого Результат округлить до следую
числа щей степени числа 2
9 Выполнить конъюнкцию 2 чисел.
Заменить стоящий справа 0 на 1
10 Определить положение старшего Вывести п-й бит числа
нуля в длинном целом числе N
11 Выполнить инверсию целого Умножить результат на п-ю сте
числа пень числа 2
12 Выполнить дизъюнкцию2 чисел Обнулить п-й бит
13 Выполнить сдвиг вправо на 2 раз Заменить стоящую справа 1 на 0
ряда
14 Выполнить сдвиг влево на У результата поменять знак
празрядов
15 Выполнить исключающее ИЛИ Вывести п-й бит числа
10. СИМВОЛЬНЫЕ МАССИВЫ И СТРОКИ
return 0;
J______
Nam e V a lu e
® у с А гга ѵ 0 x 0 0 1 2 f f 1C "ММММММММММММММММММММСтроК* СИ М ВО ЛО В'
(Э у C h a rA rr a y 0 x 0 0 1 2 ff3 0 ’ С т р о к а си м в о л о в ’
Таблица 32
Пример корректного копирования
char CharArray []=”Строка символов”;
char с Л rr ay [ 10];
strcpy(cArray, & CharArray [7]);
return 0;
Name Value
6) cArray 0x00i2ffic 'oweonoe'
6) * CharArray 0x00i2ff30 'Строка oweonoe'
55
10. Символьные массивы и строки
Окончание табл. 33
№
Входные данные Представление выходных данных
вар.
7 20 символов. Результат без Выполнить побайтное копирование
учета регистра символов из строки n+5 в строку n в
случае несовпадения
8 10 фамилий. Результат с учетом Объединить n символов
регистра строки n+5 со строкой n. Результат
сохранить в строке n
9 25 дат в формате дд. мм. гг. Ре Выполнить побайтное копирование
зультат без учета регистра n+5 символов из строки nв
строку n+5 в случае несовпадения
10 15 фамилий. Результат с учетом Выполнить побайтное копирование
регистра символов из строки n+5 в строку n в
случае несовпадения
11 30 символов. Результат без Выполнить побайтное копирование n
учета регистра. символов из строки n в строку n+5 в
случае несовпадения
12 10 дат в формате дд. мм. гг. Ре Объединить n+5 символов
зультат без учета регистра строки n+5 со строкой n. Результат
сохранить в строке n
13 10 фамилий. Результат с учетом Выполнить побайтное копирование
регистра. символов из строки n+5 в строку n в
случае несовпадения
14 20 дат в формате дд. мм. гг. Ре Объединить n символов
зультат без учета регистра строки n+5 со строкой n. Результат
сохранить в строке n
15 15 фамилий. Результат с учетом Выполнить побайтное копирование n
регистра символов из строки n+5 в строку n в
случае несовпадения
11. ПЕРЕДАЧА ПАРАМЕТРОВ ФУНКЦИЯМ
Окончание табл. 35
z = 10;
FuncA( &х, &у, &z );
return 0;
}
паше value
X 5.0000000
У 1.0000000
Z 2.8284271
Таблица 36
59
11. Передача параметров функциям
Student x;
strcpy(&x.Name[0],’’Иванов Иван Иванович”);
strcpy(&x. Group [0],”KT6ol -1”);
x.Age = 18;
return 0;
}______________________________________________________
1 Name Value
3 0 X {Name =0x0012fe74 Иванов И.И.* Group =0x0012fed8 Н-999* Аде=20 }
—0 0 Name 0x0012fe74 Иванов И.И."
—0 0 Group 0x0012fed8 H-999'
— у Аде 20
Student x;
strcpy(&x.Name[0],’’Иванов Иван Иванович”);
strcpy(&x.Group[0],”K T6ol-Г’);
x.Age =18;
Student *pSt;
pSt =&x;
pSt->Age = pSt->Age+5;
return 0;
}_______________________________________________________
Name Value
Е # I {Name =0x0012fe74 "Иванов И.И." Group =0x00 12fed8 ТЛ-999" Аде=25 }
—0 у Name 0x0012fe74 "Иванов И.И."
—Щ у Group 0x0012fed8 31-999'
^ Аде 25
62
12. Структуры и объединения
63
13. КЛАССЫ
N am e Value
Е3 0 у {sPin =0x0012fe5c "dm " iPin=129124 shPin=0x0012fe5c ...}
— с-3 0 sPin OxOOlZfieSc^m *
— о га 100 'd'
■ в и -8 'іи'
■ q га I 'm '
■ 0 га 0
— V ІРІп 129124
в t shPin 0x0012fe5c
■ о га -1948
L 0 га 1
1
— У ІРІП 129124
64
13. Классы
Класс - это сложная стру кту ра данных, которая включает в себя свой
ства и методы. Свойства класса - это любые типы данных. Методы - это
функции, выполняющие обработку данных. Аналогичным образом функции
можно включать в структуры (struct). Основным отличием класса является
то, что в классах имеется возможность ограничить доступ к элементам
класса (ключевые слова public, private, protected).
Ключевое слово public определяет элементы, доступные пользовате
лям класса. Пользователь класса - это программный код, создающий и ис
пользующий объекты данного класса.
Всякий объект является экземпляром данных, созданных по описа
нию класса. Описание играет роль матрицы.
Ключевое слово private определяет закрытые свойства и методы. Эти
свойства и методы недоступны внешним пользователям, однако доступны
любым методам класса.
Ключевое слово protected определяет свойства и методы, закрытые
от внешних пользователей, но доступные в классах, связанных с данным
классом отношением наследования.
Закрытые данные класса размещаются после модификатора доступа
private. Если отсутствует модификатор public, то все функции и переменные
по умолчанию являются закрытыми (как в первом примере).
Обычно, приватными делают свойства класса, а публичными - его
методы.
Напрямую обращаться к закрытым данным класса нельзя. Для работы
с этими данными используют методы этого класса.
Таблица 42
Пример работы с классами
class Sport {
public:
// Установка среднего значения очков
void set_average_score(float score)
{
average_score = score;
}
// Получение среднего значения очков
float get average score (_________________________________
65
13. Классы
Окончание табл. 42
“1
return average_ score;
}
std::string name;
std: :string last_name;
int scores[5];
private:
float average_ score;
66
13. Классы
Окончание табл. 43
int TableCount;
protected:
int MaxAge;
int MinAge;
};
struct StudentField{
string Name;
string Group;
int Age;
};___________________________________________________________
Среди методов класса Students можно заметить одноименный метод
Students(). Этот метод называют конструктором класса. Он выполняет все
действия, необходимые при создании экземпляра объекта. Такие действия
будут выполнены в точке нахождения в программном коде строки
Students X;
где X - имя переменной-экземпляра класса. В табл. 44 показана реализация
класса, в которой метод «конструктор» инициализирует свойства класса
TablCount, MaxAge, MinAge нулевым значением.
Таблица 44
Реализация класса Students
Students::Students()
{
TableCount = 0;
MaxAge = 0;
MinAge = 100;
}
bool Students::AddStudent(string Name, string Gropu, int Age)
{
if (T ableCount <20)
{
StudTable[TableCount].Name = Name;
StudTable[TableCount].Group = Group;
StudTable[TableCount].Age = Age;
TableCount++;
_______MaxAge = max(Age,MaxAge);_________________________________
67
13. Классы
Окончание табл. 44
MinAge = min(Age,MinAge);
return true;
}
return false;
}
StudentField Students: :GetInfo(int Num)
{
return StudTable[Num];
}______________________________________________________
Хорошим стилем построения классов считается максимальное
скрытие (инкапсуляция) свойств и предоставление доступа к ним через
методы. Такой прием значительно повышает безопасность использова
ния объектов: если свойства открыты, пользовательский код способен
любым образом изменить их значения. Последствия такого неконтроли
руемого изменения состояния объекта непредсказуемы. Если же значе
ния свойств модифицируются методом класса, состояние объекта нахо
дится под контролем.
Таблица 45
Пример использования класса Students
int _tmain(int argc, _TCHAR* argv[])
{
Students Stud Group;
bool result;
StudGroup. AddStudent(“neTpOB П.П.”,”КТбо 1-1”, 17);
StudGroup.AddStudent(“HaHOB И.И.”,”КТсо1-2”,17);
StudGroup.AddStudent(“CimopoB C.C.”,”KT6ol-3”,17);
68
13. Классы
—Е
иг~>
>
i»
69
13. Классы
71
14. Ввод и вывод информации в файлы
Таблица 47
Запись в файл функциями библиотеки С
FILE* f;
F =fopen(“ TextF ile.txt’Y’w”);
If9f==NULL)
printf(“\n File open error ! \n”);
else
{
char Str[]=”CTpoKa”;
int Num=55;
fprintf(f,’’Строка для записи в файл = %s, число = %d”, Str, Num);
fclose(f);
}_________________________________________________________
В библиотеке C++ имеется несколько семейств функций ввода-вы
вода. В табл. 47 приведен пример программного кода записи данных в файл,
который использует функции стандартной библиотеки языка С. В табл. 48
показан пример чтения данных.
Таблица 48
Чтение из файла функциями библиотеки С
f = fopen(“TextFile.txt”,”r”);
if( f == Null)
printf(“\n File open error ! \n”);
else
{
charStr [100];
int Num;
int res =
fscanf(f,”%s%*s%*s%*s%*s%*s%*s%*s%*s%*s%d”,Str,&Num);
fclose(f);
}_______________________________________________________
Особенностью рассматриваемых библиотечных функций является ис
пользование форматной строки функциями fprintf и fscanf.
Альтернативным вариантом ввода-вывода в файлы может считаться
набор функций библиотеки C++. Для встроенных типов не требуется фор
матная строка. Считается, что текст программы становится более понятным
и естественным благодаря использованию операторов ввода-вывода.
72
14. Ввод и вывод информации в файлы_____________________
Таблица 49
Запись в файл функциями библиотеки C++
#include “stadfx.h”
#include <fstream>
#include <iostream>
using namespace std;
O u t F i l e . o p e n ( " N e w F i le . t x t " . i o s : : o u t
r e tu rn 0 ;
^ openmode -
=T) operator!
operator =
=^j operator void *
^1_____
Lt ] pos_type
precision
=♦ pword □
= * rdbuf
^ rd state 0
73
14. Ввод и вывод информации в файлы
Таблица 50
Чтение из файла функциями библиотеки C++
OutFile.орсп(Ъ”Эксперименталыю созданный файл+хГ,
ios_base::in);
char Strl [100],Str2[100];
OutFile» Strl;
OutFile » Str2;
_______return 0;___________________________________________________
В табл. 50 показан пример чтения из файла. При чтении из файла с
помощью оператора » выполняется контроль типа переменной. Это озна
чает, что считываемые символы преобразуются к значению соответствую
щему типу переменной. Например, если считывается строка, в нее поме
щаются последовательно символы до тех пор, пока не будет встречен сим
вол-разделитель. По умолчанию таковым является пробел, запятая, точка с
запятой, точка.
Обмен данными с файлом осуществляется функциями из библиотек
C++ в основном на уровне встроенных типов C++. Более сложные объекты
для сохранения в файл должны декомпозироваться на простые элементы.
Рассмотрим эту процедуру на примере ввода данных, представляющих со
бой строки со специальным разделителем. В табл. 51 показаны две строки
текстового файла, причем всякая строка файла имеет три поля, каждое из
которых отделено символом #.
Таблица 51
Строки со специальным разделителем
Петров А.А.#12.12.1991#город Таганрог___________________________________
Сидоров С.Л#01.06.1996#село Несветайское_______________________________
74
14. Ввод и вывод информации в файлы
77
15. Классы строк и строковых потоков
S + = string^0, 'а');
В этом примере явно вызывается конструктор string для создания
строки, состоящей из 10 символов 'а'.
Неявно конструктор вызывается при объявлении строки с указанием
дополнительных параметров. Например, так:
Таблица 55
Пример использования строкового потока
#include “stadfx.h”
#include <sstream>
#include <iostream>
#include (string>
return 0;
}_________________________________________________
Строки и строковые потоки являются ярким примером абстрагирова
ния близких, но не эквивалентных сущностей. Включая строки как свойства,
объекты строковых потоков обладают совсем не характерным поведением
для строк. Строку класса string можно получить из строкового потока, ис
пользуя метод str (табл. 55).
Из строкового потока могут считываться данные подобно тому, как
это делалось для файлового потока. На рис. 20 приведен пример, в котором
из строкового потока считываются числа, символы и строка.
s t r i n g s t r e a m W o rk S trin g ;
W o rk S tr in g « 25 « « 10 « " ." « 2010;
s trin g s;
W. = W o r k S t r i n g . s t r (> ;
I П 0 # ! S ' '25.10.2010'
>
81
15. Классы строк и строковых потоков
}
Некоторые методы класса 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 с) - добавляет символ с в текущую позицию потока;
• unget() - возвращает последний считанный символ в поток.
82
15.3. Потоки ввода (istream)
Окончание табл. 56
№
Входные данные
вар.
10 Увеличить остаток по задолженности на сумму кредита больше введенной
(в диалоге)
11 Увеличить срок погашения на год для кредитов на сумму меньше введен
ной (в диалоге)
12 Сортировка элементов по убыванию (год рождения)
13 Уменьшить остаток по задолженности для введенного года рождения (в
диалоге)
14 Вывести процент остатка по кредиту от первоначальной суммы
15 Вывести значения наибольшего остатка по задолженности
16. ДАТА И ВРЕМЯ В ПРОГРАММАХ НА C++
tm *pCurTime;
£CurTimej=localtime CurT ime) ;
□ sf pCurTime 0x009567a0 {tm_sec=51tm_min=ll tm_hour=20 ...} |
CurT * * tm_sec
‘ 51 + 3600*24*7;
pCur' * tm_min 11 іе (& C u rT im e ) ;
tmjiour 20
tmjnday 3
tmjnon 3 = 22;
tm_year 112
* tmjwday 2
C u rT V tm_yday 93 p C u rT im e );
у tmjsdst 0 ie C u r T im e ) ;
85
16. Дата и время в программах на C++
C u rT im e — nOctime (p C u r T im e ) ;
^ u r T i m e j = l o c a lt i m e (&C u rT im e ) ;
В 0 pCurTime 0x009 567a0 {tm_sec=51 tr
c h a r *pi &tm_sec 51
p s trc u r: *
11 e ( p C u r T im e ) ;
sf tm_hour 20
$ tmjnday 22
r e t u r n ( ‘S' tmjnon 3
tm_year 112
__________ tmjwday 0
V tm_yday 112
--------- ------- * tm isdst 0
86
16. Д ат а и время в программах на ( '
(Окончание табл. 59
№ Представление
Входные данные
вар. выходных данных
4 Сравнить время выполнения 2-х способов сор Время работы фрагмента
тировки массива (на выбор: сортировка выбо программы
ром, обменами, «гномья»)
5 Получите время, которое пользователь тратит Время работы программы
на нажатие клавиши при заполнении массива без использования си
из 10-ти вещественных чисел стемных часов
6 Выполнить сортировку элементов массива (на Время работы программы
выбор: сортировка пузырьком, вставками, де в миллисекундах
ревом)
7 Сравнить время выполнения 2-х способов сор Время программы в се
тировки массива (на выбор: сортировка слия кундах. с дробной частью
нием, быстрая, выбором) (до 2 знаков)
8 Выполнить сортировку элементов массива (на Время работы программы
выбор: сортировка пузырьком, вставками, де в миллисекундах
ревом).
9 Сравнить время выполнения 2-х способов сор Время работы фрагмента
тировки массива (на выбор: сортировка слия программы
нием. быстрая, выбором)
10 Получите время, которое пользователь тратит Время выполнения функ
на нажатие клавиши при заполнении массива ции, измеренное в цикле
из 25-ти целых чисел
11 Выполнить сортировку элементов массива (на Время работы программы
выбор: сортировка пузырьком, вставками, де без использования си
ревом) стемных часов
12 Получите время, которое пользователь тратит Время работы программы
на нажатие клавиши при заполнении массива в миллисекундах
из 20-ти целых чисел
13 Сравнить время выполнения 2-х видов пораз Наименьшее время ра
рядной сортировки массива боты программы
14 Сравнить время выполнения 2-х способов сор- Время работы программы
гировки массива (на выбор: сортировка слия без использования си
нием, быстрая, выбором) стемных часов
15 Получите время, которое пользователь тратит Время работы фрагмента
на нажатие клавиши при заполнении массива программы
из 30-ти целых чисел
87
17. ОБРАБОТКА ОШИБОК И ИСКЛЮ ЧЕНИЙ
88
17. Обработка ошибок и исключений
Окончание табл. 61
89
17. Обработка ошибок и исключений
Окончание табл. 63
{
// ошибки не было, данные обрабатываются
}
else
_______co u t« “Error detected !”;___________________________________
В основе активного режима обработки ошибок лежит использование
исключений. Исключение в программе - это специфическая ситуация, кото
рая возникает после использования ключевого слова throw. Оператор
throw х «выбрасывает» исключение х, которое является переменной или зна
чением определенного типа. В табл. 64 показан пример функции, которая при
возникновении ошибки выбрасывает «неопределенное» исключение.
Таблица 64
Выброс исключения при возникновении ошибки
void MyFunctionB ( int InpData, int& OutData)
{
bool bError = false;
// обработка входных данных
/ / ...
bError = true;
// здесь можеть быть ошибочная ситуация, т.е. bError = true
if (bError)
throw ;
_______ 1_________________________________________________________
Смысл этого действия в том, что дальнейшее исполнение программ
ного кода функции прекращается, управление передается в вызвавшую
функцию. Далее возможна одна из двух ситуаций:
• вызвавшая функция обрабатывает исключение и продолжает свое
выполнение;
• вызвавшая функция не обрабатывает исключения. Тогда объект ис
ключения «пробрасывается» в вызвавшую функцию верхнего уровня и так
далее до тех пор, пока исключение либо не будет обработано одной из функ
ций программы, либо будет выброшено операционной системе. В этом слу
чае операционная система аварийно завершает программу, выводя соответ
ствующее уведомление.
90
1 7. Обработка ошибок и исключений
Таблица 65
Код с функцией, способной генерировать исключения
bool fError;
int DataFromFunction;
fError = MyFunctionA ( 100, DataFromFunction );
if( !fError)
{
// ошибки не было, данные обрабатываются
}
else
cout « “Error detected !”;
_______MyFunctionB( 100, DataFromFunction ); // exception_______________
В табл. 65 приведен программный код, содержащий вызов функции,
способной выбросить исключение. Если это происходит, выполнение про
граммы завершается выводом сообщения, показанного на рис. 25. Исключе
ния в коде игнорируются.
92
17. Обработка ошибок и исключений
Окончание табл. 67
}
catch(char)
{
// обработка исключения символьного типа, например DataFrom-
Function = ‘а’ + ‘А ’;
_______1_________________________________________________________
В табл. 67 и 67 показан код, генерирующий исключения, и код, обра
батывающий исключения. В примере генерируются исключения двух ти
пов - int или char. Для каждого из них в вызывающей функции предусмот
рена ловушка. Заметим, что catch(...) - это вариант ловушки, которая ловит
любые типы исключений.
Таблица 68
Обработка исключений стандартной библиотеки
try
{
string str( “Micro” );
string rstr( “soft” );
str.append( rstr, 5, 3 ); // позиции 5 в строке rstr не существует
}
catch (out_of_range& e)
{
co u t« “exception: ” « e.what()« endl;
}
catch (exception& e)
{cout « “exception: “ « e.what() « endl;
}
catch (...)
{
a = -1;
}___________________________________________________
Стандартная библиотека C++ выбрасывает ряд исключений опреде
ленных классов, описанных в самой библиотеке. Их обработка должна быть
сделана при вызове соответствующих функций. В табл. 68 показано, как об
рабатывается исключение, генерируемое методом append класса string.
93
18. ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ
94
18. Динамическое выделение памяти
char *S1;
SI = (char*) malloc (100) ;
Функция
void* realloc ( void* ptr, size_t size);
позволяет изменить размер уже выделенной памяти по указателю ptr. Новый
размер памяти должен составлять size байт. Если память вызвать не удалось,
то она возвратит NULL. Новое значение может быть как больше существу
ющего, так и меньше.
95
18. Динамическое выделение памяти
96
18. Динамическое выделение памяти
Структура теста
С о сто я н и е п р о гр а м м ы
Услови я зап уска
п о сле завер ш ени я
п р о гр а м м ы .
раб оты .
Входны е д ан ны е
Вы ходны е д анны е
98
19. Тестирование программного кода
Таблица 72
Пример тестирования функции
// тестируемая функция
bool AddInfToFile(char* sPath, char* sText)
{
fstream TextFile;
TextFile.open(sPath,ios_base::app);
TextFile « sText;
TextFile.close();
return true;
}
int _tmain(mt argc, _TCF1AR* argv[])
{
bool Result;
// тест 1
Result = AddInfToFile(“d:\\temp\\info\\filel.txt”,”90901234567
10.05.2020 55”);
// тест 2
Result = AddInfToFile(“d:\\temp\\info\\l)j)a&i
статистики, txt”,”90901234567 10.05.2020 55”);
// тест 3
Result = AddInfToFile(“ ”,”90901234567 10.05.2020 55”);
// тест 4
Result = AddInfToFile(“d:\\temp\\info\\filel.txt”,” ”);
100
19. Тестирование программного кода
Лабораторная работа № 1
Изучение консольных приложений и функций
ввода-вывода с консоли
102
Лабораторная работа № 1
Окончание табл. 73
№
Входные данные Представление выходных данных
вар.
13 5 пар наименований Интер Три столбца: порядковый номер, адрес
нет-порталов и их адресов портала в Интернет, наименование
14 6 наименований учебных Три столбца: порядковый номер, наименова
курсов и оценки по ним в чис ние учебного курса, наименование оценки
ловом виде (отлично, хорошо, удовлетворительно)
Методические указания
Для решения поставленной задачи следует использовать консольные
функции ввода-вывода библиотеки С и C++.
int printf(char *управляющая строка, список переменных);
int scanf(char *управляющая строка, список переменных);
Оператору « передаются различные значения - строки, значения пе
ременных, которые выводятся на консоль.
Строки могут содержать управляющие последовательности, которые
интерпретируются определенным образом. Например, последовательность
"\п" интерпретируется как перевод на новую строку. Из других управляю
щих последовательностей также нередко употребляется "\t", которая интер
претируется как табуляция.
Для считывания с консоли данных применяется оператор ввода » ,
который принимает два операнда. Левый операнд представляет объект типа
istream (в данном случае объект сіп), с которого производится считывание, а
правый операнд - объект, в который считываются данные.
Оператор ввода » возвращает левый операнд - объект сіп, поэтому
мы можем по цепочке считывать данные в различные переменные.
Таблица 74
Спецификаторы формата в управляющей строке_________
Обозначение Тип
%с Символ
%d Целое десятичное число
%і Целое десятичное число
%е Десятичное число в виде х.хх е+хх
103
Лабораторные работы
Окончание табл. 74
Обозначение Тип
%o Восьмеричное число
%s Строка символов
%x Шестнадцатеричное число
%X Шестнадцатеричное число
%% Символ %
%p Указатель
%n Указатель
Таблица 75
Модификаторы
Обозначение Действие модификатора
104
Лабораторная работа № 2
Лабораторная работа № 2
Разработка консольных приложений для числовой
обработки информации
Х1 =
Х2=
Х3=
Х4=
Y=
Разработать функцию, которая автоматически заполняет массив из 10
наборов входных данных. Массив затем подвергается обработке, т.е. в цикле
вычисляются значения функции и выводятся на экран в виде
Y l= Y2= Y3= Y4= и т.д.
Варианты индивидуальных заданий приведены в табл. 76.
Таблица 76
Варианты для лабораторной работы № 2
№ Тип входных Тип выходных
Функция
вар. данных данных
i Целые Целое
0.5*,5 + 30 0 * 2 + ° - 1*3 + 504
2 Вещественные Вещественное 0.53* і +3.4*2
12*з - 3 0 * 4
105
Лабораторные работы
Окончание табл. 76
№ Тип входн ы х Тип в ы ходн ы х
Ф ункция
вар. дан н ы х данны х
7 Ц елы е Ц елое
0 .5 x f + 300x2 + 0 - 1х | + 50x4
8 В ещ ествен н ы е В ещ ествен н ое
^ + 0 .5 3 * 5
12* | -3 0 * J
9 Ц елы е Ц елое Xj sin *2 + *з sin *4
10 В ещ ествен н ы е В ещ ествен н ое
tg (x i - 9 0 ° * 2 )
tg ( *з - 1 9 0 0 * 4 )
11 Ц елы е Ц елое
+X2 + д^Х3 + X4
14 Ц елы е В ещ ествен н ое
10.3xi + 0 .4 * 2
V 12x3 - 3 0 4
15 В ещ ествен н ы е Ц елое
^ /x | sin *2 + *3 yjsin x 4
16 Ц елы е В ещ ествен н ое
tg (* lx 2 )
tg ( V x 3 - 4 )
17 В ещ ествен н ы е Ц елое
^/500-X] + *2 •7/x3 +X4 +100
18 Ц елы е В ещ ествен н ое sin(log5( x l + x2)) + b g X3 x4
Методические указания
Для построения программ необходимо использовать математическую
библиотеку стандартной библиотеки С, заголовочный файл для которой
именуется как math.h. Функции библиотеки приведены ниже в табл. 77.
При построении алгоритма следует предусмотреть проверку коррект
ности вводимых данных (в том числе выход за разрядную сетку) и коррект
ность промежуточных результатов. Также в файле cmath есть набор полезных
числовых констант, например константа М_РІ хранит значение числа ж.
106
Лабораторная работа № 2
Т а б ли ц а 77
Функции математической библиотеки
Имя Описание
acos Арккосинус
asin Арксинус
atan Арктангенс
atan2 Арктангенс с двумя параметрами
ceil Округление до ближайшего большего целого числа
COS Косинус
cosh Гиперболический косинус
exp Вычисление экспоненты
fabs Абсолютная величина (числа с плавающей точкой)
floor Округление до ближайшего меньшего целого числа
107
Лабораторные работы
Лабораторная работа № 3
Разработка консольных приложений,
осуществляющих битовую обработку данных
108
Лабораторная работа № 4
Окончание табл. 78
№
Разрядность F 1 Разрядность F2 Разрядность F3 Разрядность F4
вар.
п 6 2 19 5
12 4 1 22 5
Методические указания
Для выделения отдельных групп разрядов в данной работе предлага
ется использовать двоичное маскирование разрядов. Маска - это двоичная
комбинация, содержащая двоичные единицы в требуемых разрядах числа.
Например, чтобы выделить старшие 5 разрядов 32-битного слова, исполь
зуют двоичную маску
11111000000000000000000000000000,
что в 16-ричной системе счисления задается константой F8000000. Выпол
нив поразрядное логическое умножение любого значения на данную маску
и сдвинув результат на 27 разрядов вправо, получаем число, находящееся в
поле из старших пяти разрядов.
Пример программного кода:
unsigned int Kadr,Mask,Field;
Kadr = 0x88000000;
Mask = OxF8000000;
Field = Kadr&M ask;
Field = Field » 27;
Переменная Field получает двоичное значение
00000000000000000000000010001 ,
означающее, что в старших пяти разрядах переменной Kadr содержалась
двоичная комбинация 10001.
Лабораторная работа № 4
Разработка приложений,
содержащих представление информации таблицами
109
Лабораторные работы
Методические указания
Таблицы на программном уровне рекомендуется описывать перемен
ными структурного типа. Чтение и сохранение в файл выполняется незави
симо для каждого поля структуры.
Вывод в C++ может быть буферизован по соображениям производи
тельности. Это означает, что всё, что выводится в файловый поток, не может
сразу же быть записанным на диск (в конкретный файл). Когда данные бу
фера записываются на диск, то это называется очисткой буфера. Одним из
способов очистки буфера является закрытие файла.
ПО
Лабораторная работа № 5
Лабораторная работа № 5
Разработка консольных приложений для обработки строк
111
Лабораторные работы
Окончание табл. 80
№
Запрос Содержание обработки
вар.
6 Произвольное предложение Подсчитать число вхождений в пред
ложение одного их четырех задан
ных заранее слов
7 Имя файла в виде Ввести по отдельности имя файла,
сервер:том \каталог1 \каталог2 сервера и всех каталогов
\...имя. расширение
8 Имя файла в виде сервер: том\ката- Подсчитать глубину вложенности
лог1\каталог2\...имя. расширение подкаталогов
9 Два имени файла в виде сервер: Определить, находятся ли они в од
том\ каталогі \каталог2 \...имя. ноименных подкаталогах и сколько
расширение таких подкаталогов
10 Интернет-адрес файла в виде Ввести по отдельности имя файла,
http://www.сервер.ш\каталог 1\ка- сервера и всех каталогов
талог2\...имя. расширение
11 Интернет-адрес файла в виде Подсчитать глубину вложенности
http://www.сервер.ги\каталог 1\ка- подкаталогов
талог2\...имя. расширение
12 Интернет-адреса двух файлов в Определить, находятся ли они в од
виде http://www.сервер.ru\ката- ноименных подкаталогах и сколько
лог1\каталог2\...имя. расширение таких подкаталогов
Методические указания
Для построения программы понадобятся функции обработки строк,
объявленные в заголовочном файле string.h. Ниже показаны основные необ
ходимые функции, показанные в табл. 81.
Таблица 81
Функции обработки строк
Имя Примечания
char *strcat(char *dest, const char *src); дописывает строку src в конец dest
112
Лабораторная работа № 5
Окончание табл. 81
Имя Примечания
114
Общие требования к разработке
115
Индивидуальное задание
INFТARIF InfTarif[5];
USERINF Pols[10];
SpisokISPLUslug IspUsl[20];
VVOD zadanie;
Создание файлов в программе, открытие их для чтения из файла в
структуры следующим алгоритмом:
FILE *Klient;
ermo_t raz = fopen_s(&Klient, "C:\\Users\\acer\\Desktop\\H3\\Pro-
jectlWuser details.txt", "r");
FILE *Tarif;
ermo_t dva = fopen_s(&Tarif, "C:\\Users\\acer\\Desktop\\H3\\Pro-
jectlWuslugi.txt", "r");
FILE *IspUslug;
ermo_t tri = fopen_s(&IspUslug, "C:\\Users\\acer\\Desktop\\H3\\Pro-
jectlWispol.txt", V );
FILE *input;
ermo t chetiri = fopen_s(&input, "C:\\Users\\acer\\Desktop\\H3WPro-
jectlWparam.ini", "r");
if (raz II dva || tri || chetiri)
{
printf_s("He все файлы существуют или имеют некорре-
ткный набор данных\п");
return -1;
}
for (int i = 0; (i < 10) && !feof(Klient); І++)
{
fscanf_s(Klient, "%[A,]s", &Pols[i].Name, 40); fscanf_s(Klient,
"%*c");
fscanf_s(Klient, "%[A,]s", &Pols[i].TelUse, 15);
fscanf_s(Klient, "%*c");
117
Индивидуальное задание
118
Общие требования к разработке
fscanf_s(input, "%*с");
fscanf_s(input, "%s", &zadanie.Nomer, 15);
Алгоритм для определения даты и расчёта задолжности:
for (int j = 0; j < 10; j++)
{
if (((IspUsl[j].Mes - 1) < timeinfo->tm_mon) && ((timeinfo->tm_year -
100 + 2000) == IspUsl[j].Yr))
{
h = MessDay[IspUsl[j].Mes - 1] - IspUsl[j].Day + timeinfo->tm_mday;
if (h <= 3)
{ {
if (memcmp(zadanie.Nomer, IspUsl[j].TELUSE, 12) == 0)
{
if (IspUsl[j].Kod == 1)
{
к += InfTarif[0].Tarif*((IspUsl[)].vremispol + 59) /60); a++;
}
if (IspUsl[j].Kod == 2)
{
к += InfTarif[l].Tarif*((IspUsl|j].vremispol + 59) / 60); b++;
}
if (IspUsl[j].Kod == 3)
{
к += InfTarif[2].Tarif*((IspUsl[)].vremispol + 59) / 60); C + + ;
}
if (IspUsl[j].Kod == 4)
{
к += InfTarif[3].Tarif*((IspUsl|j].vremispol + 59) / 60); d++;
}
if (IspUsl[j].Kod == 5)
{
к += InfTarif[4].Tarif; e++;
119
Индивидуальное задание
{
h = timeinfo->tm_mday - IspUsl[j].Day;
if (h <= 3)
{
{
if (memcmp(zadanie.Nomer, IspUsl[j].TELUSE, 12) == 0)
{
if (IspUsl[j].Kod == 1)
{
k += InfTarif[0].Tarif*((IspUsl[j].vremispol + 59) / 60); a++;
}
if (IspUsl[j].Kod == 2)
{
k += InfTarif[1].Tarif*((IspUsl[j].vremispol + 59) / 60); b++;
}
if (IspUsl[j].Kod == 3)
{
k += InfTarif[2].Tarif*((IspUsl[j].vremispol + 59) / 60); c++;
}
if (IspUsl[j].Kod == 4)
{
k += InfTarif[3].Tarif*((IspUsl[j].vremispol + 59) / 60); d++;
}
if (IspUsl[j].Kod == 5)
{
k += InfTarif[4].Tarif; e++;
}
}
}
}
}
}
Вывод полученных результатов в файл output и закрытие всех файлов:
if (k >= zadanie.sum)
{
if (a > 0) fprintf_s(output, "Связь внутри сети^");
if (b > 0) fprintf_s(output, "CMC\n");
if (c > 0) fprintf_s(output, "Связь с другими сетями^");
if (d > 0) fprintf_s(output, "Роуминг^");
120
Представление результата выполнения индивидуального задания
121
Индивидуальное задание
Продолжение табл. 83
№ Отчет Параметры
3 Построить список клиентов, использовавших Наименования двух
услуги двух наименований в указанный времен услуг, дата начала диа
ной промежуток ( с ... по ....) пазона, дата конца диа
пазона
4 Получить перечень услуг, предоставленных в Минимальное значе
текущем месяце, с суммарным значением в за ние и максимальное
данном диапазоне значений значение диапазона
5 Определить список клиентов и список услуг, Номер месяца
которыми они пользовались за указанный месяц
6 Перечислить ФИО клиентов, пользовавшихся Наименование услуги
указанной услугой в дневное время
7 Сформировать список и стоимость услуг, кото ФИО клиента
рыми пользовался указанный клиент в текущем
квартале
8 Получить список клиентов, которые имеют за Сумма задолженности
долженность не более заданной и не пользова
лись услугами в течение предыдущего месяца
от момента запуска программы
9 Перечислить даты заключения договоров и теле Сумма стоимости
фонные номера клиентов, использовавших услуги услуг
на сумму, не менее заданной, в течение текущей
недели (от момента запуска программы)
10 Сформировать список услуг, не использовав Список ФИО пяти кли
шихся в 1-м квартале текущего года заданными ентов
пятью клиентами
11 Получить перечень услуг и телефонных номе Список ФИО клиентов
ров для заданных клиентов, с которыми заклю
чён договор во 2-м квартале нынешнего года
12 Построить список клиентов, которые имеют за Три вида услуг, сумма
данную сумму кредита и задолженности и не кредита и долга
пользуются указанными тремя видами услуг
13 Перечислить даты начала и окончания догово Наименования трех
ров, заключенных на текущей неделе (от мо услуг
мента запуска программы), использовавших 3
указанные услуги
14 Сформировать список услуг, использовавшихся Список ФИО клиентов
указанными клиентами в ночное время
15 Сформировать список номеров клиентов, ис Наименование услуги,
пользовавших указанную услугу хотя бы в од первый и второй диа
ном из двух заданных временных интервалов пазон времени
122
Представление результата выполнения индивидуального задания
Окончание табл. 83
№ Отчет Параметры
16 Определить список клиентов, сумма потреблен Диапазон стоимости
ных услуг для которых за последние 3 недели
(от момента запуска программы) была бы в за
данном диапазоне
17 Определить список услуг, которыми пользова
лись клиенты со сроком окончания договора до
конца следующего месяца (от момента запуска
программы)
18 Получить общую длительность телефонных Наименование двух
разговоров указанного вида для клиентов, за услуг по разговорам
ключивших договоры в текущем месяце
19 Сформировать список клиентов, которые не ис Список из 3 услуг, диа
пользовали указанные 3 услуги в заданном диа пазон времени
пазоне времени с... по ...
20 Построить список услуг, которые использова ФИО двух клиентов
лись двумя клиентами в прошедшем году (от
момента запуска программы)
21 Подсчитать суммарные платежи для 3 заданных Список 3 услуг
услуг, которые использовались клиентами в
прошедшем квартале (от момента запуска про
граммы)
ПРИМЕРЫ ТЕСТОВЫХ ВОПРОСОВ
124
Примеры тестовых вопросов
125
Примеры тестовых вопросов
в) описываться блок-схемой;
г) давать одни и те же результаты при одних и тех же исходных дан
ных.
11. Каким из перечисленных ниже свойств должен обладать алгоритм
работы программы?
а) содержать в себе только последовательно выполняемые действия;
б) описываться с помощью псевдокода;
в) получать результат за ограниченное число шагов;
г) позволять моделировать случайность.
12. Кокой элемент блок-схемы обязателен для изображения алго
ритма?
а) параллельное ветвление;
б) начало;
в) параллельное слияние;
г) условие.
13. Какие элементы блок-схемы позволяют описать цикл обработки
массива?
а) действие + Условие;
б) начало + Конец;
в) параллельное ветвление + Действие;
г) параллельное слияние + Действие + Начало + Конец.
126
Примеры тестовых вопросов
void MyPrint(char*);
int _tmain(int argc, _TCHAR* argvf])
{
char sl,s2,s3;
co u t« "S e t symbol
c in » si;
return 0;
}
а) iostream;
б) MyPrint;
в) _tmain;
r) cout.
void MyPrint(char*);
128
Примеры тестовых вопросов
Y=100;
A= Y - A;
return A;
}
int Function2( int B)
{
int Y;
Y=B - 10;
B= sqrt( Y);
return B;
}
int main()
{
int X, Y;
X=Function1( 10 ); // точка 1
Y=Function2( 19 ); // точка 2
}
а) неопределённое;
б) 100;
в) 90;
г) 0.
20. Какие переменные программы называются глобальными?
а) переменные, действительные во всех строках программного кода
одной функции;
б) переменные, действительные во всех строках программного кода
файла, в котором находятся функции;
в) переменные, действительные для всех строк программного блока;
г) переменные, которые используются после запуска программы.
21. Какие переменные программы называются статическими?
а) переменные, изменяющие своё значение только после выполнения
над ними статических операций;
б) переменные, сохраняющие своё значение даже после выполнения
над ними арифметических операций;
в) переменные, сохраняющие своё значение после завершения функ
ции;
129
Примеры тестовых вопросов
130
Примеры тестовых вопросов
а) sizeof(char) = sizeof(double);
б) sizeof(char) > sizeof(double);
в) sizeof(char) < sizeof(double);
г) sizeof(char) > sizeof(double) + 1.
131
Примеры тестовых вопросов
в) float X;
г) long long X.
134
Примеры тестовых вопросов
а) 3;
б) 2;
в) 6;
г) 5.
45. Какую информацию выведет на экран программный код, показан
ный ниже?
char sArray[] = "Программа из 20 строк";
printf (" % s " , & sArray [ 13 ] ) ;
а) строк;
б) 20 строк;
в) из 20 строк;
г) программа из 20 строк.
135
Примеры тестовых вопросов
136
Примеры тестовых вопросов
}
а) &X[20];
б) &X[0];
в) &X;
г) X.
137
Примеры тестовых вопросов
а) StudentField;
б) Students;
в) MinAge;
г) Age.
138
Примеры тестовых вопросов
139
Примеры тестовых вопросов
71. Какого типа должна быть переменная Z, чтобы для нее можно
было выполнить операцию Z « х ?
140
_________________________Примеры тестовых вопросов_________________________
а) stringstream;
б) time t;
в) string;
г) struct.
141
Примеры тестовых вопросов
142
Примеры тестовых вопросов
143
Примеры тестовых вопросов
а) любые типы;
б) строковые потоки;
в) строки символов;
г) целые числа.
144
Примеры тестовых вопросов
в) ==;
г)
94. Какой оператор должен быть перегружен при использовании ал
горитма бинарного поиска?
а) !=;
б) >=;
в) <=;
г) ==.
95. Чем отличается контейнер т а р от контейнера vector?
а) наличием ключей у каждого элемента;
б) наличием индекса у каждого элемента;
в) ограничением на тип каждого элемента;
г) ограничением на число элементов в контейнере.
96. Какова сложность поиска в контейнере шар?
а) о( N );
б) о( log N );
в) о( N log N );
г) o(N **2).
97. Требуется ли сортировка элементов контейнера т а р перед поис
ком?
а) требуется всегда;
б) требуется всегда, если элементы не являются целыми числами;
в) не требуется;
г) не требуется, если элементы являются целыми числами.
98. Какой из операторов должен быть перегружен для поиска в кон
тейнере тар ?
а) ==;
б) !=;
в) любой из двух перечисленных выше;
г) операторы перегружать не требуется.
99. Выберите выражение, определяющее сложность пузырьковой сор
тировки:
145
Примеры тестовых вопросов
а) о( N **2);
б) о( N );
в) о( log N );
г) о( N log N ).
100. Выберите выражение, определяющее сложность быстрой сорти
ровки:
а) o(N **2);
б) o ( Nl o g N) ;
в) о( log N );
г) о( N ).
101. Какой из операторов предназначен для генерации исключения?
а) throw;
б) try;
в) catch;
г) exception.
102. Какой из операторов используется для указания блока программ
ного кода, при выполнении которого возможны исключения?
а) catch;
б) try;
в) throw;
г) exception.
146
Примеры тестовых вопросов
147
Примеры тестовых вопросов
148
Примеры тестовых вопросов
149
ЗАКЛЮ ЧЕНИЕ
Учебное пособие