Лекция №9 «Перемещение указателя файла»

Перемещение указателя в открытом файле выполняется с использованием метода.seekp. Метод включает два параметра:

Первый это число со знаком, указывающее на количество позиций смещения. Одна позиция – один байт.

Второй параметр – это константа класса, указывающая на «точку отсчета» смещения (ios::end – относительно конца файлы, ios::beg – относительно начала, ios::cur – относительно текущей позиции).

Перемещение за пределы файла не возможно, указатель будет помещен соответственно в последней либо в первой позиции. Ошибки при этом не генерируется.

При обработке текстов находящихся в файлах следует учитывать наличие «невидимых» символов, которые не отображаются пользователю, но используются при отображении текста на устройствах. Перемещение указателя в файле должно учитывать наличие таких символов.

OD – перевод строки. OA – возврат каретки.

Технология обработки информации в фалах.

1)Открыть файл и считать его содержимое в переменные программы. Если файл слишком велик, то обработка ведется фрагментами. Например, по одной строке или по одной записи.

2)Закрыть файл. Выполнить обработку, подготовить выходные данные. Если объем выходных данных велик, то каждая подготовленная порция записывается последовательно.

3)Открыть выходной файл.

4)Записать выходные переменные в файл.

5) Закрыть выходной файл.

Строковые потоки.

Строковые потоки - это объекты, которые воспроизводят поведение файловых потоков, но не связаны с внешними устройствами, а создают последовательности символов в оперативной памяти. Используя функции и операторы чтения и записи в потоке можно создавать и обрабатывать тесты.

Чтобы использовать потоки нужно указать #include <sstream>.

Извлечь строку из строкового потока можно с помощью метода.str()

Переменной типа string присваивается значение строки из потока.

Чтение из строкового потока.

Дата и время в программах на С++

Время в любой цифровой системе отсчитывается с использованием счетчиков. Всякая программа использующая время должна получать значения счетчика в любой требуемый момент времени. В программах на языке С существует библиотечная функция с помощью которой получают текущее время в секундах прошедших с 1 января 1970 года.

Time_t time(time_t *timer)

Time принимает в качестве аргумента указатель на переменную time_t и в эту переменную записывается время момента вызова функции.

Непосредственно использовать значения времени можно для вычисления временных интервалов. Разность любых значений это длина интервала в секундах.

CurTime=CurTime +3600*24*7 момент времени смещенный на неделю вперед.

Время в виде структуры tm.

Стандартная библиотека в С++ использует структуру tm для привычного представления времени. Это представление включает в себя: текущее время с точностью до секунд, день, месяц, год. Получить это представление можно имея значение в секундах.

Функция localtime предназначена для получения времени в виде структуры tm. Результат возвращается указателю на структуру tm.

Все элементы структуры tm являются целыми числами, т.е. можно использовать в арифметических выражениях.

Выполнить преобразование времени в виде структуры tm число секунд позволяет функция mktime(). В качестве параметра принимается указатель на структурную переменную, а возвращается число типа time_t.

Функция asctime преобразует время в секундах в символьную строку нерусифицированную.

Лекция №10 «Технология поиска информации»

Исходное множество элементов

X={Х1(a),Х2(a),…Хn(a)}

Эталон е(а)

Задача поиска: существует ли

Xi(a) э Х:Хi(a)=e(a),i=1,N

Разнообразие задач поиска существенно зависит от того каковы принципы сравнения объектов. В некоторых случаях сложность сравнения может превышать сложность поиска.

Вторым, существенно важным фактором, является число элементов исходного множества. Если оно велико требуется предпринимать специальные приемы для его представления.

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

Последовательный поиск в массиве.

Функции и структуры данных в библиотеке направлены на максимально общее представление о процессе поиска и объектах, которые подлежат обработке.

Библиотека использует следующие абстракции:

- Контейнер. Это объект или класс объектов, который используется для хранения других объектов. Свойство и методы контейнеров позволяют манипулировать их содержимым независимо от того, как это содержимое выглядит.

- Итератор. Это объект, который используется для доступа к элементам контейнера. Итераторы можно считать обобщением понятий указателя или индекса в массиве.

- Алгоритм. Это функция, реализующая некоторый сценарий обработки информации. Все алгоритмы используют контейнеры и итераторы.

Последовательный поиск алгоритмом find.

Один из простейших контейнеров является vector. При описании вектора указывается тип его элементов. Он может быть любым, в том числе вектором и любым другим контейнером. При описании переменной вектора задается ее размер. С помощью методов вектора можно этот размер произвольно изменять, т.е. векторы схожи на динамические массивы.

Алгоритм find это функция, принимающая три параметра:

- Итератор начала последовательности в контейнере

- Итератор конца последовательности в контейнере

- Значение эталона для поиска.

Алгоритм возвращает итератор найденного объекта в противном случае если не найден, его значение равно итератору конца контейнера.

Если перегрузить оператор сравнения ==, то алгоритм будет использовать именно его для выяснения факта совпадения. В библиотеке есть несколько вариантов алгоритмов поиска. В частности алгоритм find_end позволяет искать в одной последовательности другую последовательность. Границы последовательностей задаются итераторами. Результатом поиска является начало одной последовательности найденной в другой последовательности.

Алгоритм find_end с предикатом сравнения.

Многие алгоритмы в качестве дополнительного параметра могут использовать предикат сравнения заданный пользователем. Предикат – это функция, которая возвращает истинное значение, если сравниваемые элементы в каком-то смысле эквиваленты.

Например, элементы могут быть эквиваленты, если они кратны 5.

Имя функции задается алгоритмом в качестве дополнительного параметра.

Лекция №11 «Технология поиска»

В контейнер вектор могут быть помещены элементы произвольного типа. В этом случае должно быть уточнено то, каким образом выполняется сравнения элементов. Это реализуется путем перегрузки оператора сравнения.

В языке существует ключевое слово typedef, позволяющее вводить наименования (синонимы) для любых созданных типов. Например, для структур введение наименования с помощью typedef упрощает описания переменных.

Перегрузка оператора == (сравнения)

Синтаксически перегрузка оператора подобно описанию функции должно размещаться в программном коде до использования оператора.

В отличие от описания функций перегрузка оператора содержит ключевое слово оператор. Для двуместных операторов в качестве параметров указывается переменная справа и слева от знака оператора.

Все операции с указанными типами в программном коде, будут перегружены при компиляции.

Бинарный поиск.
В основе бинарного поиска лежит идея сравнения атрибута поиска и принятие решения об отбрасывании части последовательности, в котором заведомо отсутствуют искомые элементы. Это возможно только для отсортированных последовательностей.

При бинарном поиске время нахождения элемента пропорционально логарифму числа элементов. Математически сложность поиска по времени выражается

как Тбин=о(log N) где N число элементов. Сложность последовательного поиска это Тпосл=о(N). Таким образом, бинарный поиск обладает преимуществом, которое растет с увеличением N. Функция «о» показывает асимптотическую скорость роста.

Пример кода для бинарного поиска

Алгоритм (binary_search) выполняет бинарный поиск и принимает 3 параметра:

- итераторы начала последовательности

- итераторы конца последовательности

- искомый элемент

Алгоритмы бинарного поиска применимы для любых элементов контейнеров подобно алгоритмам последовательного поиска. В частности требуется перегрузка оператора сравнения, если тип не является встроенным.

Самой главной особенностью применения бинарного поиска является необходимость сортировки контейнера. Практика показывает, что время сортировки занимает значительную долю в общем времени поиска.

Контейнер map.
Контейнер map предназначен для хранения элементов представляющих собой пары. В каждой паре первый элемент является ключевым, второй информационный. Значение ключевого элемента является уникальным для текущего содержимого контейнера, т.е. попытка добавления пары с уже использованным ключом является

ошибкой. Поиск нужного элемента контейнера выполняется по значению ключа. Время поиска ведет себя, так же как и в случае бинарного поиска.

В описании переменной контейнера указываются два типа: первый из них является типом ключа, второй типом информационной части. Для поиска в контейнере используется метод find, который принимает один параметр значения ключа. Результат это итератор, указывающий на найденный элемент. Поскольку элемент является парой значений, выделить информационный элемент можно через свойство second значения итератора.

В общем случае при программировании поиска с самого начала учитывают вид исходных данных. Если это отсортированная последовательность, то применяют бинарный поиск. Если последовательность не отсортирована оценивают время ее сортировки. Может оказаться, что оно настолько велико, что целесообразнее использовать последовательный поиск. В том случае, когда данные в систему поступают последовательно имеет смысл помещать их в контейнер map, снабжая уникальным ключом. Любая операция поиска будет выполняться с высокой скоростью.

Лекциия №12 «Сортировка»

Сортировка как способ обработки информации заключается в упорядочивании последовательности

X={x1,x2,…,xn}

К(a1,a2)={true, a1<a2; false, a1>a2}

xi,xj, X&i<j->R(xi,xj)=true

C формальной точки зрения, чтобы отсортировать последовательность нужно иметь предикат R(a1,a2), который дает истинное значение если пара сравниваемых элементов находятся в «нужном» порядке и ложное значение если элементы необходимо поменять местами в последовательности. Предикат сравнения может содержать любые операции, которые позволят для конкретной прикладной задачи выразить предпочтения в размещений элементов.

Пузырьковая сортировка

Простейшим алгоритмом сортировки считается пузырьковая. Алгоритм состоит в том, чтобы просматривая последовательно элементы в последовательности сравниваются соседние, и перемещать «большое» в конец последовательности, а меньшее в сторону начала последовательности. Выполнив проход по всей длине последовательности можно убедиться, что в ее начале окажется самый «легкий» элемент. Таким образом, оказывается выполненным первый шаг сортировки. Чтобы поместить на второе место следующий по величине элемент достаточно выполнить описанную процедуру среди оставшихся элементов последовательности. Выполнив эти действия N-1 раз, где N – длина последовательности, получим отсортированную последовательность.

Пузырьковая сортировка по сложности (количеству операций) растет как о(N2). Для больших значений N

оказывается, что время сортировки достаточно значительно. Существует ряд алгоритмов, улучшающий пузырьковую сортировку по времени, но не изменяющих основную тенденцию роста.

Существует семейство алгоритмов сортировки, которые дают результат лучше, чем пузырьковая. Идея этих алгоритмов часто использует принцип «Разделяй и властвуй». Суть принципа в том, что исходная задача разбивается на совокупность более простых, которые решаются с гораздо меньшими затратами и результаты решения частных задач могут быть «простым» образом объединены в результат решения исходных задач.

Алгоритм быстрой сортировки основан на том, что первоначально в последовательности выбирается срединный элемент, относительно него последовательность упорядочивается следующим образом: направо перемещаются большие элементы из левой части, а в левую меньшие. Таким образом, последовательность оказывается частично отсортированной относительно срединного элемента. Описанная процедура применяется для правой и левой части последовательности независимо. Каждая из них приобретает частичную упорядоченность. Применяя тот же алгоритм для получившихся фрагментов добивается с каждым шагом степени отсортированности. Когда фрагмент последовательности содержит 2 элемента достаточно выполнить при необходимости их перестановку. Алгоритм заканчивает свою работу, когда все короткие фрагменты отсортированы. Теоритически показано, что сложность сортировки ведет себя как о(N logN).

Алгоритмы быстрой сортировки не отличаются стабильностью. В зависимости от характера последовательности, режима выбора срединного элемента, время сортировки может в некоторых случаях не отличаться от времени пузырьковой сортировки. Скорость роста о(N logN) характеризует алгоритм в среднем.

Сортировка слиянием представляет собой более стабильный вариант алгоритма и основано на том, чтобы делить исходную последовательность на небольшие фрагменты, сортировать их (возможно пузырьком), а затем последовательно объединять фрагменты в более крупные, но в также отсортированные. Скорость роста сложности о(N logN) в среднем.

Лекция №13 «Обработка ошибок в работе программ»

Исполнение любой программы может сопровождаться появлением сочетаний данных, которые считаются ошибочными. Не учитывать подобные ситуации – значит строить ненадежную программу. Обработка ошибок в программах на многих языках может строиться по двум основным направлениям:

- пассивное реагирование на ошибочную ситуацию

- активное реагирование на ошибочную ситуацию

Оба пути не исключают друг друга, а могут комбинироваться.

Пассивный режим основан на возврате (return) из функции признака ошибки. В некоторых случаях в качестве признака ошибки используется одно из значений данных, такой стиль программирования применять не рекомендуется из-за высокой вероятности “спутать” полезное и ошибочное значение. Чтобы разделить ошибочные и полезные значения, выходные переменные переносят в список параметров функций. В качестве возвращаемого оставляют булево значения, таким образом, оно позволяет однозначно определить была ошибка или не было. В обоих случаях остается открытым вопрос о том, будет ли проверено возвращаемое значение. Если это не сделано, ошибочные данные будут распространяться через последующий процесс обработки.

В основе активного режима обработки ошибок лежит использование исключений. Исключение в программе это специфическая ситуация, которая возникает после использования ключевого слова “throw”. Оператора “throw” выбрасывает исключения. Смысл этого действия в том, что дальнейшее исполнение программного кода функции прекращается, управление передается в вызвавшую функцию и далее возможно две ситуации:

- вызвавшая функция обрабатывает исключения.

- вызвавшая функция не обрабатывает исключения. Здесь объект исключения “пробрасывается” в вызвавшую функцию верхнего уровня и так далее до тех пор, пока

исключение либо не будет обработано, либо будет выброшено ОС, в этом случае программа аварийно завершается.

Обработка исключений строится на использовании операторов try и catch.

Обработка исключений при использовании try и catch осуществляется по следующему сценарию:

- Последовательно выполняются строки кода в блоке try. Если исключений не возникло, после блока try исполняется код, размещенный после ловушек.

- Если возникло исключение в блоке try дальнейшее исполнение кода прерывается и система исполнения программ стремится найти ловушку, соответствующую типу исключения. Если не одна ловушка не сработала, исключение “пробрасывается” в вызвавшую функцию.

- Выполняется программный код первой подходящей ловушки. Все ловушки просматриваются сверху вниз. После выполнения кода ловушки, делается переход на программный код за пределами ловушки. Исключение считается обработанным, программа продолжается в обычном режиме.

В блок try обычно помещают программный код минимального размера, поскольку обработка исключений приводит к увеличению общего объема программы. Это связано с тем, что компилятор дополняет ненадежный код специальным кодом, для восстановления после прерывания.

Catch(…) это вариант ловушки, которая ловит любые типы исключений.

Стандартная библиотека С++ выбрасывает ряд исключений, определенных классов, описанных в самой библиотеке.

Лекция №14 «Управление памятью»

Задача управления памятью на программном уровне относится к использованию оперативной памяти. Создание переменных программы обязательно связано с потреблением оперативной памяти, объем которой конечен. Для устройств и систем с ограниченным объемом оперативной памяти важно организовать динамическую процедуру захвата и освобождения памяти. Для статических переменных, т.е. тех, которые имеют заданный фиксированный размер никакое управление не возможно. Как альтернатива многие языки предлагают возможности динамически выделять и освобождать память.

Любая программа при загрузке для выполнения имеет определённое распределение областей памяти. Например, выделяется область программного кода, расположенная рядом со стеком, область стека обычно

используется для сохранения адресов и параметров, вызываемых функцией, а также для хранения промежуточных переменных. Использование стека программисту не доступно, а зависит от логики работы компилятора. Стек заполняется “снизу вверх” и при большом количестве вложенных вызовов может перейти границу программного кода. В этом случае фиксируется аварийное завершение программы из-за переполнения стека.

В памяти статических переменных помещаются чаще всего глобальные переменные фиксированного размера.

Куча – область, в которой создаются динамические переменные, запрашиваемые по ходу исполнения программы. На языке программирования могут существовать либо операторы динамического выделения памяти, либо функции.

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

Функция void*malloc(size_t size) выделяет непрерывный участок памяти длинной size байт, если такого участка выделить не удается, функция возвращает null. Получив отказ в памяти, функция может в частности из-за

фрагментированности памяти. Фрагментированность – это наличие чередующихся участков занятых и свободных в памяти. Несмотря на наличие суммарного достаточного объема свободной памяти, запрос не удовлетворяется, поскольку требуемый фрагмент должен быть непрерывным.

Void*Calloc(size_tn, size_t size) позволяет выделенного блок памяти из n элементов заданного размера.

Выделенную память можно привести к требуемому типу. Это не влияет на ее размер, но указывает компилятору, как генерировать код для обработки содержимого этой памяти.

Void*realloc(void*ptr,size-t size); позволяет изменить размер выделенной памяти. Если память вызвать не удалось, то она возвратит null. Новое значение может быть как больше существующего, так и меньше.

После работы с выделенной памятью, ее всегда следует освобождать вызовом функции Void free(void* ptr);. Параметр этой функции – указатель. Дальнейшее использование указателя на освобожденную память является опасным.


В С++ для выделения и освобождения памяти введены операторы new и delete.

Оператор new возвращает указатель на экземпляр объекта, созданного в памяти. Если память не выделена, выбрасываются исключения и нормальное продолжение программы становится невозможным. Любой указатель на динамически выделенную память должен далее использоваться в операторе delete.

Если в программе ошибочно не освобождаются области памяти, возникают “утечки” памяти, т.е. области не доступные для дальнейшей работы. Значительные утечки памяти могут приводить к аварийному завершению программ.

Лекция №15 «Кодирование и отображение информации»

Основы кодирования информации.

Термин кодирование взят из теории информации.

1. Кодирование означает преобразование сообщения в сигнал для удобной передачи по каналу связи.

2. Применительно к выведению на экран компьютера, кодированием называется способ представления команд оператора, соответствующие особенностям восприятия, памяти, мышления человека.

Основные требования:

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

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

- создать условия для эффективного взаимодействия между оператором и компьютером или группой

операторов между собой, позволяющая своевременно менять, координировать между собой.

Из перечисленных выше требований вытекают характеристики информации. 1. Количество информации.

Вся информация обозначается какими-либо знаками от nz (количество элементов знака) должно соответствовать количеству свойств отображаемого ответа no. В случае избыточности элементов наблюдается неоднозначность приемы информации (9% ошибок), а при недостаточности элементов снижается надежность (25% ошибок). 2. Полнота отображения объекта.

Противоречие: для своевременного принятия решения нужна как можно более полная информация, с другой стороны, если объем информации превышает возможности оператора по ее приему и обработке, то это снижает надежность и эффективность работы. Для этого информацию распределяют по зрительным или слуховым каналам. 3. Временная развертка – основной вопрос о частоте смены кадров. С увеличением объема информации должна увеличиваться длительность предъявления информации.

Далее учитывается особенности оперативного мышления (время принятия решения человеком).

Пространственное расположение информации.

Где-то 30 – 40 градусов.

Точки пересечения экрана – это область для лучшего представления информации …

Звуковые сигналы предпочтительные для передачи непрерывных сообщений, а зрительные – дискретных.

Остальная часть это периферическое поле зрения, эффективна для обнаружения сигналов. Здесь основный принцип компактности, группировки (информация о взаимосвязанных параметрах должна объединяться в группы.

Принцип соответствия т.е. распределение информации по степени важности.

Правила отображения информации на экране.

Неправильное представление и размещение информации вызывает ряд заболеваний:

- миопия

- астенопия

После нескольких часов работы у него возникает воспаление глазного яблока, слезотечение и головная боль.

Представление информации.

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

Есть специальный ГОСТ согласно которому, есть разряды зрительных работ.

Минимально различимое глазом пятно считается где-то один в градус, но это все условно, зависит от освещенности, цвета пятна, яркости цвета фона.

Лекция №16 «Глобальные переменные и пространства имен»

Глобальные переменные в программах доступны для чтения и модификации во всех функциях исполняемой программы. Это создает определенные проблемы в том случае, когда программа использует библиотеки функций. Объявления переменных и функций в программах могут дублировать имена переменных и функций в библиотеке. Для исключения этого многие языки используют пространство имен.

В языке С++ ключевое слово namespace определяет имя пространства имен, внутри которого локализуются объявления переменных и функций. Программе может быть объявлено произвольное число пространств имен. Все пространства изолированы.

Для указания на прямую принадлежность к пространству имен синтаксически используется:: (двойное двоеточие).

Кроме явного указания пространства имен, можно указывать неявно. Оператор Using namespace указывает имя пространства, из которого неявно будут извлекаться переменные и функции.

Под перегрузкой функций понимается замена вызова функции в программном коде ”подходящим” вариантом ее описания. Варианты описания представляют собой одинаково именованные функции с разным числом и типом входных параметров. При компиляции кода срока вызова функции сопоставляется по набору типов с описанными вариантами функции. Если такой вариант

найден, вызов перегружается, т.е. в его точку будет загружено функция с соответствующей сигнатурой.

Сигнатура – это перечисление типов параметров функции.

Не допускается в качестве перегружаемых функций использовать функции с одинаковой сигнатурой, либо отличающиеся только типом возвращаемого значения.

Перегрузка функций позволяет повысить понятность и читаемость программного кода. Часто библиотеки содержат наборы перегружаемых функций, что позволяет упростить код использующий библиотеку, уменьшить вероятность ошибки.

Лекция №17 «Использование API Windows в программах на С++»

API – это прикладной программный интерфейс. Данный термин используют для перечисления функции, которая напрямую обращается к ОС либо любой другой системе способной обслуживать запрос. Всякая ОС предоставляет свои функции прикладным программам через API адрес. В отличие от библиотек программирования, вызов функции напрямую является более быстрым. Объясняется это тем, что библиотечные функции добавляют программный код, обеспечивающий более высокую надежность исполнения заданного действия. Кроме того в библиотеке программирования создают структуры данных более высокого смыслового уровня, что снижает сложность программного кода и повышает его надежность. API OC Windows имеет реализацию в виде функций на языке С++. В общем случае API может реализоваться на любых языках программирования.

Функции манипулирования файлами API Windows позволяют создавать, копировать, переименовывать и удалять файлы. В качестве параметров эти функции используют специальные типов определённые в заголовочном файле windows.h. Каждый из них связан и отображает абстракции, которые используются на уровне ОС. Например, тип HANDLE является дескриптором, который ОС сопоставляет всякому системному объекту. Каждая функция API имеет набор параметров, которые точно определяют все детали выполнения любого действия. Функции стандартной библиотеки С++ многие детали скрывают. Например, функция CreateFile позволяет создавать файл и при этом требует 7 конкретных параметров. Библиотечная функция аналог содержит два параметра.


Среди файловых функций существует функция поиска (Find). Функция называется FindFirst и имеет два параметра. Первый параметр это шаблон имени файла. Второй параметр это структурная переменная, в которую загружается информация о первом найденном файле.

Функция FindFirstFile() возвращает признак того, что поле завершилось нахождением файла.

При программировании не следует делать предположения о том, какой из файлов будет первым. Повторные вызовы этой функции возвращают тот же результат.

Вся информация о найденном файле сохраняется в структурной переменной WIN32_FIND_DATA. Эта структура включает поля, которые содержат имя файла, даты создания и модификации, длину байта и т.д.

Каждое из ролей имеет специфический тип объявленный для API.

Для обработки содержимого полей их необходимо преобразовать к типам принятым в С++.
Например, тип DWORD является двойным словом ОС, которая чаще всего преобразуется в целое число (int).

Поле TCHAR cFileName[MAX_PATH] содержит имя найденного файла. Следует обратить внимание, что длинна имени ограниченна константой [MAX_PATH]. А символы являются «широкими»(2 байта). Эти особенности должны учитываться при обработке вызова API.

Тип TCHAR в тип char не может быть преобразован принципиально.

Функция FindNextFile позволяет продолжить поиск дальше. Дает следующий за найденным файл.

Последовательные вызовы функции FindNextFile позволяют получить данные о следующим файле, соответствующем шаблону, заданному функцией FindFirstFile.

Параметром FindNextFile является структурная переменная WIN32_FIND_DATA и дескриптор, возвращенный предыдущим вызовом FindNextFile или FindFirstFile.

Функция CopyFile копирует существующий файл в новый. Один из параметров функции указывает, можно ли копировать, если файл с таким именем уже существует. В качестве параметров строк указываются длинные указатели. Например, LPSTR.
Любая ссылка на строку должна быть явно приведена к данному типу указателя.

Функция DeleteFile() позволяет удалить файл с указанным именем.

При обработке файла используется понятие текущего каталога, по умолчанию текущем считается каталог, из которого запущен исполняемый файл программы.

Получить наименование этого каталога программа может, вызвав функцию API GetCurrentDirrectory(MAX_PATH, Buffer). Первый параметр – длина, второй – указание на строку, буфер.

Использование данной функции позволяет обеспечить работоспособность программ, которые запускаются из произвольных каталогов.

Функция GetCurrentDirrectory(Buffer) позволяет установить в качестве текущего каталога любой другой каталог.

Функции для создания и удаления каталогов имеют особые названия несмотря на то, сто на низком уровне каталоги – это файлы для регистрации других файлов.

Лекция №18 «Тестирование программного кода»

Тестирование – это процесс экспериментального оценивания качества программного кода.

При тестировании:

1) Стремятся обнаружить ошибки;

2) Устанавливают соответствие функции программы и ее спецификацию;

3) Оценивают надежность программы;

4) Оценивают специфические показатели, такие как: уровень защиты, нагрузочная способность, качество диалогового интерфейса и т.д.

Тестирование не может показать отсутствие ошибок.

Тест – это информационная структура, которая описывает условия для выполнения некоторого действия, входные данные, результат выполнения с указанием выходных данных и состояния программы.

Отдельные тестовые случаи составляют совокупность, которая считается полным тестом программного кода.

Тестовые случаи формулируются на основе содержательного анализа, исходной спецификации программы и опыта разработки программ.

Полное тестирование программы.

Любую программу можно потенциально протестировать полностью. Общее число тестов в этом случае совпадает с числом вариантов сочетаний входных, выходных данных и их состояний. Даже для несложных программ это число имеет астрономический порядок, поэтому полное тестирование любой реально программы невозможно.

Выходом из положения является разбиение всего множества на классы эквивалентности.

В класс объединяется эквивалентные, по соображениям тестирующего, варианты данных.

Для каждого выделенного класса строятся тесты (по крайне мере один) которые, по мнению тестирующего, позволяют сделать заключение об уровне качества программного кода.

Общее число тестов суммируется в конечном счете сложность теста (число) должна обеспечить необходимый уровень оценки качества программного кода. Сложность теста при этом минимизирует.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: