Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
24
http://www.chemisk.narod.ru
Содержание
1. Технология разработки программных продуктов |
2 |
1.1 Основные этапы технологического процесса разработки программ |
2 |
1.2 Критерии качества программного изделия |
4 |
1.3 Правила хорошего стиля |
5 |
1.4 Выбор алгоритма |
7 |
1.5 Трудоемкость, эффективность и сложность алгоритма |
8 |
1.6 Итерация и рекурсия |
10 |
1.7 Способы описания алгоритмов |
11 |
2. Языки программирования |
13 |
2.1 Способы и методы оптимизации |
16 |
2.2 Оптимизация программы |
17 |
2.3 Структурное программирование |
18 |
2.4 Вычисление констант |
19 |
2.5 Оптимизирующие компиляторы |
25 |
3. Отладка |
26 |
3.1 Виды ошибок |
26 |
3.2 Обнаружение ошибок |
30 |
3.3 Методы отладки |
32 |
3.4 Пошаговое и монолитное тестирование |
38 |
3.5 Предпродажная подготовка. Лицензии и контракты. |
44 |
3.6 Сопровождение и эксплуатация. Виды обслуживания. |
44 |
1. Технология разработки программных продуктов
1.1. Основные этапы технологического процесса разработки программ
Постановка задачи.
На этом этапе раскрывается организационно-экономическая сущность задачи:
Особое внимание уделяется детальному описанию входной, выходной и промежуточной информации.
При этом определяется:
Кроме того, для цифровой информации указывается:
Завершается постановка задачи описанием контрольного примера, демонстрирующего порядок решения задачи традиционным способом.
Основное требование к контрольному примеру - это отражение всего многообразия возможных форм существования исходных данных.
Пользователь хорошо знает проблемную сторону задачи, но обычно слабо представляет, как она будет решаться на ЭВМ.
Предметная область пользователя часто незнакома программисту, поэтому необходима полная корректная постановка задачи, однозначно понимаемая пользователем и разработчиком.
Построение математической модели объекта.
На этом этапе производится анализ и исследование задачи.
Структура этапа:
Естественный язык, на котором осуществляется постановка задачи, имеет свойство неоднозначности. Создание математической модели позволяет формализовать описание задачи. При этом устанавливается и формируется средствами языка математики логико-математической зависимости между исходными и результатными данными.
Математическая модель - это система математических соотношений (формул, уравнений, неравенств и т.д.), отражающих существенные свойства объекта или явления.
Математическая запись постановки задачи отличается высокой точностью отображения ее сущности, лаконичностью записи, однозначностью понимания, но она может быть выполнена не для всех задач.
При выборе метода решения предпочтение отдается методу, который:
План написания постановки задачи (ПЗ).
1.2. Критерии качества программного изделия
Программа является правильной, если она работает в соответствии с техническим заданием (ТЗ - документ, которым завершается постановка задачи).
Программа является точной, если выдаваемые ею числовые данные имеют допустимые отклонения от аналогичных результатов, полученных с помощью идеальных математических зависимостей.
Программа является совместимой, если она работает должным образом не только автономно, но и как часть программной системы.
Программа является надежной, если она при всех входных данных обеспечивает полную повторяемость результатов.
Программа является универсальной, если она правильно работает при любых допустимых вариантах исходных данных. В ходе разработки программ предусматриваются специальные средства защиты от ввода неправильных данных, обеспечивающие целостность системы.
Программа является защищенной, если она сохраняет работоспособность при возникновении сбоев (режим реального времени, программа большого времени выполнения).
Программа является полезной, если задача, которую она решает, представляет практическую ценность.
Программа является эффективной, если объем требуемых для ее работы ресурсов ЭВМ не превышает допустимого предела.
Программа является проверяемой, если ее качества могут быть продемонстрированы на практике (проверка правильности и универсальности). Существуют формальные математические методы проверки и неформальные (прогоны программы с остановками в контрольных точках, обсуждение результатов заинтересованными пользователями).
Программа является адаптируемой, если она допускает быструю модификацию с целью приспособления к изменяющимся условиям функционирования.
1.3. Правила хорошего стиля
1.4. Выбор алгоритма
Типы алгоритмов.
1.5. Трудоемкость, эффективность и сложность алгоритма
Основным фактором при выборе алгоритма для задач, решаемых с помощью перебора большого числа вариантов, является суммарное время нахождение решения.
Методы, используемые для сокращения числа вариантов при переборе или позволяющие выбрать наиболее правдоподобные варианты, называют эвристическими.
Трудоемкость алгоритма - это число шагов.
Если трудоемкость ограничена полиномом, то алгоритм называется эффективным; если более быстро растущей функцией, то не эффективным.
Зависимость времени работы программы от объема обрабатываемых данных определяется оценкой сложности алгоритма.
Время работы алгоритма обработки массивов данных зависит от размеров этих массивов.
Например, время работы алгоритма выполняющего чтение и запись данных в ОЗУ определяется по формуле an+b, где a - время, необходимое для того, чтобы прочитать или записать один элемент массива; n - количество элементов массива; b - время для выполнения вспомогательных функций.
Поскольку эта формула выражает линейную зависимость от n, сложность соответствующего алгоритма называют линейной. O(n).
Пример: обменная сортировка списка из n элементов представляет собой следующий процесс: определяется минимальный элемент всего списка и осуществляется его обмен с первым элементом списка; затем определяется наименьший элемент оставшегося списка и производится его обмен со вторым элементом.
Таким образом число сравнений здесь выражается полиномом второй степени и сложность здесь будет квадратичная. O(n2).
Если сложность алгоритма вычисляется по уже написанной программе, то вместо числа сравнений вычисляется количество внутренних циклов.
(n-1)+(n-2)+(n-3)+ … + 3 + 2 + 1= =
for i:=1 to n-1 do
for j:=i+1 to n do
if A[I] >A[j] then
begin
tmp:=A[j];
A[j]:=A[i];
A[i]:=tmp;
end;
Внешний цикл выполняется (n-1) раз, внутренний цикл срабатывает в среднем n/2 раз для каждого вхождения во внешний цикл. Общее число обращений к внутреннему циклу будет равно (n-1)*n/2. При больших n за оценку этого выражения принимается n2.
for i:=1 to n-1 do
for j:=1 to n do
begin
С[i, j]:=0;
for k:=1 to n do
С[i, j]:= С[i, j]+A[i, k]*B[k, j];
end;
Алгоритм перемножения двух матриц размером n*n имеет число срабатываний внутреннего цикла равное n3. O(n3).
Формально сложность алгоритма определяется как порядок функции, выражающей время его работы.
Алгоритм двоичного поиска в таблице с упорядоченными элементами оценивается как O(log2n).
Логарифмическая зависимость сложности от возрастания n более приемлема чем линейная; линейная предпочтительнее чем полиномиальная или экспоненциальная.
Для больших объемов данных нежелательна даже полиномиальная сложность.
Пример: составить проект. Имеется последовательность чисел (не больше 30). Положительные четные заменить максимальным числом, отрицательные нечетные заменить средним арифметическим отрицательных чисел. Подсчитать количество замен. Упорядочить элементы последовательности в порядке убывания.
1.6. Итерация и рекурсия
Существуют 2 основные формы повторений: итерация и рекурсия.
Итерация в основном используется для тех видов обработки, которые можно определить выражением "выполнить для всех", а рекурсия задается выражением "выполнить тоже, что и в последний раз". Текущее действие выполняется с помощью предыдущего ответа или предыдущих стадий вычисления.
В действительности итерация и рекурсия взаимозаменяемы.
Пример:
function fact (n: integer): longint;
begin
if n=0 then fact:=1
else fact:=n*fact(n-1);
end;
begin
f:=1;
for i:=1 to n do
f:=f*i;
end.
Оба алгоритма имеют линейную сложность, но для рекурсивной процедуры требуются дополнительные расходы памяти и времени, т.к. происходит многократное обращение из подпрограммы к самой себе. Должно создаваться и сохраняться много копий регистров, переменных и точек возврата. Для хранения этой информации используется стековая память, поэтому предпочтительнее итерационная форма.
1.7. Способы описания алгоритмов
Словесный. Действия описываются средствами естественного языка.
Достоинства:
Недостатки:
Формульно-словесный: нагляден, лаконичен, но не является строго формальным.
Графический. Представляет собой изображение структуры алгоритма, при котором все этапы обработки данных представлены в виде блоков - определенных геометрических фигур.
Достоинства:
Недостатки:
Таблицы решений. Применяются для разработки алгоритмов решения многовариантных расчетов с большим количеством проверок условий, определяющих выбор той или иной ветви процесса обработки информации. Они позволяют четко описывать саму задачу и необходимые для ее решения действия. Таблицы решений в наглядной форме определяют от каких условий зависит выбор того или иного действия.
Достоинства:
Недостатки:
2. Языки программирования
Программным обеспечением называют совокупность программных средств, необходимых при работе на компьютере. Частью ПО является язык программирования.
Основные шаги:
Принцип сокрытия информации сочетается в языках программирования с принципом определения интерфейсов.
Существуют специально разработанные для определенной области производства языки программирования (ЯП). Например, на "Авиастар-СП" разработан язык Casius. Это язык геометрического моделирования и программирования обработки деталей для станков с ЧПУ.
Характеристики и свойства языков программирования.
Основными характеристиками, позволяющими сравнивать языки программирования, являются: мощность, уровень и концептуальная целостность.
Мощность характеризуется количеством и разнообразием задач, алгоритмы решения которых можно записать, используя этот язык. Самым мощным является машинный язык. Любую задачу, запрограммированную на каком-либо языке можно запрограммировать и на машинном языке.
Уровень языка характеризуется сложностью решения задач с использованием этого языка. Чем проще записывается решение задач, чем более непосредственно реализуются сложные операции и понятия, чем меньше объем получаемых программ, тем выше уровень языка.
Концептуальная целостность языка характеризуется свойствами совокупности понятий, служащих для описания этого языка и включает 3 взаимосвязанных аспекта:
Экономия понятий предполагает достижение максимальной мощности языка с помощью минимального числа понятий.
Ортогональность означает, что между понятиями не должно быть взаимного влияния. Если какое-либо понятие используется в различных контекстах, то правила использования должны быть одни и те же.
Единообразие понятий требует согласованного, единого подхода к описанию и использованию всех понятий.
Обычно чем меньше мощность языка, тем выше его уровень. По этой причине, наряду с универсальными языками разрабатываются специализированные в некоторой конкретной области.
Чем мощнее язык, тем труднее обеспечить концептуальную целостность.
Свойства:
Надежность языка обеспечивает минимум ошибок при написании программы. Например, благодаря наличию в языке требования, чтобы все переменные были объявлены до использования, ошибки связанные с неправильным написанием имен выявляются при компиляции, т.е. автоматически.
Удобочитаемость языка - свойство, которое обеспечивает легкость восприятия программ человеком.
Полнота языка обеспечивает описание на языке решения задач определенной предметной области.
Гибкость языка обеспечивает легкость выражения на языке необходимых для решения задач действий.
Простота обеспечивает легкость понимания семантики языковых конструкций и запоминания синтаксиса.
Мобильность языка позволяет обеспечивать независимость его от аппаратных средств. Можно переносить программное обеспечение с машины на машину с относительной легкостью.
Эффективность языка обеспечивает эффективную реализацию языка.
Эффективность программ.
Основной задачей программирования является создание правильных, а не эффективных программ. Эффективная программа не нужна, если она не обеспечивает правильных результатов.
Правильную, но не эффективную программу можно оптимизировать и сделать эффективной.
2.1. Способы и методы оптимизации
Обычно большая часть времени расходуется на выполнение очень небольшой части программы (примерно 5% ее объема), но наиболее часто используемой, называемой, критической областью.
Как правило, только критическая область программы оптимизируется программистом вручную. Для обнаружения этих критических областей используются спец. средства, названные профилировщиками.
Для больших программ на стадии проектирования определяются требуемые параметры, включающие время и емкость памяти.
Существует 3 типа программ:
Удобочитаемость более существенна чем ее эффективность.
Программу делают более эффективной лишь в особых случаях:
2.2. Оптимизация программы
Оптимизация программы - это процесс построения по исходной программе эквивалентной программы, обладающей лучшими характеристиками времени работы и/или объема занимаемой ОП.
2.3. Структурное программирование
Структурное программирование сосредоточено на логике программы и включает 3 главные составляющие:
Проектирование сверху вниз.
Этот метод предусматривает сначала определение задачи в общих чертах, а затем постепенное уточнение структуры, путем внесения более мелких деталей. На каждом шаге такого уточнения необходимо выявить основные функции, которые нужно выполнить. Таким образом, данная задача разбивается на ряд подзадач, пока эти подзадачи не станут на столько простыми, что каждой из них будет соответствовать один модуль. Действия каждого модуля должно быть описано одной фразой.
Проектирование должно быть завершено до начала программирования.
Модульное программирование - это процесс разделения программы на логические части (модули) и последовательное программирование каждой из них.
Каждый модуль должен иметь свое назначение, быть замкнутым, вход и выход должны быть точно определены.
Воздействие изменения в одном модуле на другую часть программы называется "волновым эффектом".
Избегать использования глобальных переменных. Использование модулей приводит к уменьшению сложности.
Методы проектирования программ, основанные на модульном принципе, делятся на 3 группы:
Структурное кодирование - это метод написания хорошо структурированных программ, который позволяет получать программы более удобные для тестирования, модификации и использования. Логическая структура базируется на строго доказанной теореме о структурировании. Эта теорема утверждает, что любую правильную программу можно написать с использованием только следующих структур:
2.4. Вычисление констант
Инициирование переменных.
Программы становятся удобочитаемыми, если в них используются выражения, включающие константы.
Для выполнения вычислений, содержащих только константы, применяют множество различных методов компилирования. Некоторые компиляторы вычисляют все выражения с константами во время компилирования и запоминают результат. Другие компиляторы запоминают константы, а вычисления выполняются во время выполнения.
Второй способ неэффективен, если выражение находится внутри цикла.
Процесс выполнения операторов, значения которых известны на стадии компилирования, что позволяет не выполнять их во время работы программы, называют сверткой.
Инициирование переменных.
Если начальные значения присваиваются одновременно с объявлением переменных, то экономится время выполнения, т.к. переменные получают начальные значения во время компилирования, а не во время выполнения.
Инициирование переменных во время их объявления, облегчает документирование программ и помогает избежать ошибок, которые могут возникнуть, если начальные значения не были присвоены.
Арифметические операции.
Арифметические операции выполняются с различной скоростью.
В порядке возрастания времени:
Пример: 3*I = I + I + I
Преобразование может привести к исключению операции:
X = 2*Y + (A-1)/P + 2*T
X = 2*(Y + T) + (A-1)/P
A/50 = A*0,2
A = 1.0/X RX = 1.0/X
A = RX
C = B + D/X C = B + D*RX
При возведении в степень важно правильно задавать тип показателя степени. При возможности использовать целые типы.
X = Y + A/B*C
Z = W + A/B*C
ABC = A/B*C
X = Y + ABC
Z = W + ABC
Организация цикла.
y = a1x3+a2x2+a3x+a4
POLY = A[1]
FOR I = 2 TO 4 DO
POLY = POLY*X + A[I]
POLY = ((A[1]*X + A[2])*X + A[3])*X + A[4]
Пример 1: инициирование выполняется:
1 for i:=1 to 20 do
20 for j:=1 to 10 do
200 for k:=1 to 5 do
221 раз {тело цикла}
Тело цикла выполняется 20*10*5=1000 раз.
Проверка условий завершения цикла выполняется 1000+200+20=1220 раз.
Путем реорганизации циклов (которая не всегда возможна) можно сократить число инициирований и завершений цикла.
Пример 2: инициирование выполняется:
1 for i:=1 to 5 do
5 for j:=1 to 10 do
50 for k:=1 to 20 do
56 раз {тело цикла}
Тело цикла выполняется 5*10*20=1000 раз.
Проверка условий завершения цикла выполняется 1000+50+5=1055 раз.
Внешний цикл должен иметь наименьшее число итераций, по отношению к внутреннему.
Пример 3: оптимизировать.
for i:=1 to 50 do
for j:=1 to 50 do
A[i, j]:=0;
for k:=1 to 50 do
A[k, k]:=1;
for i:=1 to 50 do
for j:=1 to 50 do
if i=j then A[i, j]:=1
else A[i, j]:=0;
Чистка цикла:
for i:=1 to 10 do
for j:=1 to 10 do
X:=X+Y*Z+C[i, j];
Оптимизированный цикл:
YZ:=Y*Z; // инвариантные выражения - не зависящие от цикла
for i:=1 to 10 do
for j:=1 to 10 do
X:=X+YZ+C[i, j];
Метод развертывания цикла:
for i:=1 to 1000 do
A[i]:=0;
for i:=1 to 500 do
begin
A[i]:=0;
A[i+500]:=0;
end;
Метод развертывания заключается в том, что один и тот же оператор, стоящий в теле цикла, записывается для нескольких различных значений управляющей переменной и, таким образом, сокращается число итераций.
for i:=1 to 100 do
A[i]:=5*i;
A[1]:=5;
for i:=2 to 100 do
A[i]:=A[i-1]+5;
Пример 4: выполнить развертку.
for i:=1 to 10 do
for j:=1 to 10 do
A[i, j]:=0;
for i:=1 to 5 do
for j:=1 to 10 do
begin
A[i, j]:=0;
A[i+5, j]:=0;
end;
for i:=1 to 5 do
for j:=1 to 5 do
begin
A[i, j]:=0;
A[i+5, j]:=0;
A[i, j+5]:=0;
A[i+5, j+5]:=0;
end;
i:=1; j:=1;
repeat
repeat
A[i, j]:=0;
A[i+1, j]:=0;
A[i, j+1]:=0;
A[i+1, j+1]:=0;
j:=j+2;
until j>10;
i:=i+2;
until i>10;
Пример 5: записать на Паскале отношение, истинное при выполнении условия и ложного в противном случае:
1.Натуральное N является полным квадратом:
if sqrt(N) = round(sqrt(N)) then …
2.Целое K делится на 7 без остатка:
if K mod 7 = 0 then …
3.X - максимальный из X, Y, Z:
if (X>Y) and (X>Z) then …
2.5. Оптимизирующие компиляторы
Компилятор - это программирующая программа, предназначенная для перевода (трансляции) описания алгоритмов с одного формального языка на другой. Первый из этих языков называется входным, второй - выходным или объектным. Наиболее распространены трансляторы с языков процедурно-ориентированных в языки машинные и языки машинно-ориентированные.
Транслятор является одним из основных средств автоматизации программирования.
Обычно транслятор состоит из ряда блоков, выполняющих независимые функции:
Для одного и того же входного языка целесообразно иметь несколько трансляторов, один из которых позволяет осуществить быструю трансляцию, выдавая менее эффективные программы. Такой транслятор можно использовать для отладки программ. Компиляторы, создающие эффективную объектную программу обычно бывают большими и работают медленно.
Оптимизирующий транслятор, применяя различные методы оптимизации может получить более качественную объектную программу, используемую для многократных расчетов.
Шаги оптимизации:
Оверлейность программы. Под оверлейностью понимают возможность перенесения подпрограмм во время работы программы в быстродействующую память из некоторого другого типа памяти таким образом, что несколько подпрограмм в различное время занимают одну и ту же область памяти.
Недостатки:
Возможность оверлейности реализуется также при использовании виртуальной памяти.
Если машина имеет виртуальную память, то ОС автоматически делит программу на части фиксированной длины, называемые страницами. Кроме того, ОС, в случае необходимости, пересылает страницы в ОП. Таким образом проблема организации оверлейности перестает быть обязанностью программиста и возлагается на машину.
3. Отладка
3.1. Виды ошибок
Ошибки анализа.
Связаны либо с неполным учетом ситуации, которые могут возникнуть, либо с неверным решением задачи.
К первому случаю относятся, например, пренебрежение возможностью появления отрицательных значений переменных, малых и больших величин.
Во втором случае обычно имеют место крупные и мелкие логические ошибки, из которых можно назвать:
Ошибки общего характера.
После того, как найден подходящий алгоритм решения задачи, на этапе программирования также могут появиться ошибки, независимо от выбранного языка.
Такими ошибками могут быть:
Ошибки физического характера.
Можно назвать несколько типов ошибок, вызываемых неверными действиями программиста:
Большое значение для успешной отладки программы имеют простота и рациональность ее кодирования.
Когда программа написана аккуратно и логично, легче избежать ошибок или выявить их в случае возникновения.
Следует избегать возможных программистских трюков, т.к. чем их больше, тем труднее отладка программы для самого автора, а кто-то другой этого сделать просто не сможет.
Правильность программ.
Любые программы - правильные в отношении их логического построения только для определенного типа данных, поэтому необходимо четко определить область значений данных, в которой программа способна функционировать. Необходимо вводить операторы, позволяющие проверить, находятся ли данные в установленных границах.
Нарушение правильности может проявляться двумя способами:
Правильность синтаксиса означает, что должны быть точно сформированы наименования переменных; арифметические и логические операции должны подчиняться определенным синтаксическим правилам и т.п.
Синтаксические ошибки.
Выявление транслятором синтаксических ошибок представляет собой самый важный и необходимый этап отладки программы.
Если под синтаксической ошибкой понимать "всякое нарушение требований языка программирования", то следует признать, что многие ошибки остаются необнаруженными.
В качестве примеров синтаксических ошибок можно назвать:
Примерами синтаксических ошибок, охватывающих взаимодействие двух или более операторов, могут служить:
Советы по устранению ошибок:
Неопределенные переменные.
Распространенными источниками программных ошибок являются неопределенные переменные и переменные, для которых не заданы начальные значения.
Определение начальных значений:
Разные прогоны программы с одними и теми же данными могут привести к различным результатам.
3.2. Обнаружение ошибок
Ситуации, по которым мы определяем, что в программе есть ошибка:
Любая из этих ситуаций требует от программиста проверки последовательности выполнения команд. Обычно для этого пригодна трассировка.
Процесс обнаружения ошибок характеризуется выявлением двух мест в программе:
Точка обнаружения - место в программе, где ошибка себя проявляет или становится очевидной.
Точка происхождения - место в программе, где возникают условия для появления ошибки.
Точка обнаружения выявляется первой и служит отправным пунктом для поиска точки происхождения.
Действительная ошибка исходит не из точки обнаружения, а из точки происхождения.
Виды отладки. Защитное программирование.
Отладка начинается с того момента, когда перестают выдаваться сообщения о синтаксических ошибках. Вначале процесса отладки надо использовать простые тестовые данные. Если при этом получаются верные результаты, следует переходить к тестированию программы на более сложных данных. Если результаты не верны, возможны следующие ситуации:
Защитное программирование характеризует такой стиль написания программы, при котором появляющиеся ошибки легко обнаруживаются.
Защитное программирование - это встраивание отладочных средств в программу.
Примером защитного программирования может служить метод заглушек при кодировании сверху вниз.
3.3. Методы отладки
Методы отладки можно разделить на методы "грубой силы" и методы, основанные на обдумывании.
Методы "грубой силы" не являются самыми эффективными, но очень популярны, т.к. не требуют значительного внимания и больших умственных затрат. К ним относятся:
Общей проблемой метода "грубой силы" является то, что они игнорируют процесс обнаружения, с помощью которого быстрее и точнее находят ошибки. Использование данного метода рекомендуется только в том случае, если все остальные методы не дали желательного эффекта или в дополнение к процессам, основанным на обдумывании.
Методы, основанные на обдумывании:
Автоматизированные средства отладки программ.
В составе Borland Pascal есть интегрированный отладчик, который имеет 3 основных меню: Run, Debug, Options.
С помощью отладчика можно использовать следующие средства:
После настройки отладчика надо задать выражения, в том числе, имена переменных, значения которых необходимо контролировать с помощью окна просмотра. Затем трассировать, т.е. выполнять программу поэтапно и при каждом останове программы проверять текущие значения заданных выражений и результаты работы программы в одном из окон.
Использование функциональных клавиш.
Начало трассировки:
F4 - выполнение программы до строки, в которой установлен курсор.
F7 - построчное выполнение подпрограмм.
F8 - построчное выполнение программы с выполнением подпрограмм от одного нажатия клавиши F8.
Выполнение программы по частям по каждой команде Ctrl+F9 до строки, в которой установлена очередная контрольная точка.
Выйти из отладочного режима трассировки программы можно с помощью клавиш Ctrl+F2.
Установка и просмотр текущих значений.
Чтобы задать (добавить или удалить) выражения можно использовать:
Чтобы вывести значения всех элементов массива, надо указать только имя массива. Если массив большой, тогда можно указать для наблюдения только часть массива:
имя_массива [n], m ,где n - индекс первого элемента массива, который надо увидеть, m - количество элементов.
Пример:
A[10], 5 - начиная с 10-го выведет 5 элементов
Изменение переменных в процессе выполнения программы.
По команде Debug/Evaluate/Modify (Ctrl+F4) на экране разворачивается дополнительное окно, содержащее три поля и 4 кнопки. Чтобы изменить значение переменной надо перейти в окно New Value и внести исправления, затем нажать кнопку Modify. В поле Result появится новое значение переменной. Модифицировать можно только значения переменных.
В окно Expression можно ввести имя любой переменной программы или любое допустимое выражение, которое надо вычислить. Выражение строится в соответствии с синтаксисом языка Pascal.
Работа с процедурами и функциями.
При каждом вызове подпрограммы Pascal запоминает вызов и передаваемые подпрограммой фактические параметры в стеке вызова. Каждый раз во время очередного останова программы, при ее трассировке, можно запросить текущий стек вызова с помощью команды Debug/Call Stack (Ctrl+F3).
Задать/отключить точку останова - Ctrl+F8.
Необходимость тестирования.
Ситуация |
Эффект |
3, 3, 3 |
равносторонний треугольник |
4, 4, 3 |
равнобедренный |
4, 3, 5 |
прямоугольный |
Причины необходимости тестирования:
Методы тестирования.
Категории тестовых данных.
Существует методология относящаяся к методу ящика, которая называется эквивалентным разбиением.
Согласно ей:
Различают 2 типа классов эквивалентности:
Необходимо сосредоточить внимание на неправильных и неожиданных условиях.
Построение тестов включает в себя:
Данные для тестирования.
3.4. Пошаговое и монолитное тестирование
Монолитное тестирование заключается в том, что сначала по отдельности тестируется каждый модуль, а затем все они комбинируются в рабочую программу и она тестируется.
Пошаговый метод состоит в том, что каждый модуль для тестирования подключается к набору ранее отсортированных модулей.
Рассмотрим пример:
При монолитном подходе сначала тестируются модули, каждый независимо от других, затем они собираются в программу. Для тестирования каждого модуля требуется специальный модуль-драйвер и 1 или несколько модулей-заглушек.
Модуль-драйвер - модуль, который содержит фиксированные тестовые данные, вызывает тестируемый модуль и отображает выходные результаты.
Заглушка - программа, имитирующая работу модуля нижнего уровня. Она может не содержать ничего, кроме сообщения о том, что произошел вход в этот модуль, и возврата управления.
Выводы:
Категории тестов системных испытаний.
Принципы тестирования.
Методы ручного тестирования:
Автоматические средства тестирования:
Компаратор - это программа, считывающая 2 файла, сравнивающая их и печатающая различающиеся элементы.
Профилировщики дают информацию о том, какие операторы и сколько раз выполнялись. Они позволяют накапливать статистические данные о работе тестируемой программы.
Тестовый драйвер - это программа, пересылающая нужные данные на вход тестируемого модуля и накапливающая выходные данные.
Самопроверкой называется проверка результатов тестирования самой тестируемой программой.
Средства защиты программ.
Средства защиты программ можно рассматривать в двух направлениях:
Меры предупреждения компьютерных преступлений можно разделить на 3 группы:
Информационная безопасность должна обеспечивать:
Под понятием целостность данных подразумевается защита от сбоев, ведущих к потере информации, защита от неавторизованного создания или уничтожения информации.
Компьютерные преступления можно условно разделить на группы:
Людей, осуществляющих несанкционированный доступ в чужие информационные сети для забавы называют электронными корсарами или компьютерными пиратами.
Логическая бомба - это программа, которая срабатывает при выполнении определенных условий и частично или полностью выводит из строя компьютерную систему.
Временная бомба - разновидность логической бомбы, которая срабатывает по достижении определенного момента времени.
Способ "троянского коня" состоит в тайном введении в чужую программу таких команд, которые позволяют осуществлять новые, не планировавшиеся владельцем программы функции.
Компьютерные вирусы можно разделить на:
Антивирусные средства делятся на фильтрующие и противовирусные.
Для защиты ПО наиболее часто используются: пароли, назначение прав доступа (людям и программам), методы шифрования.
3.5. Предпродажная подготовка. Лицензии и контракты.
Лицензии и контракты - это лучшее средство установления прав собственности на программное изделие. Они используются для указания гарантийных обязательств, а также помощи, которая будет оказана заказчику. Например, ввод в действие, освоение и обучение, модификация, консультации по использованию. При составлении лицензий и контрактов необходимо учесть:
При составлении лицензии и контракта и даже при их изменении следует получить квалифицированную консультацию юриста по вопросу о праве собственности.
3.6. Сопровождение и эксплуатация. Виды обслуживания.
Группа сопровождения выполняет обязанности, связанные с исправлением дефектов изготовленных программных изделий (корректирующее сопровождение) или незначительными изменениями (адаптивное сопровождение).
Изменения, проводимые на этапе сопровождения, бывают корректирующими и расширяющими.
Корректирующие изменения вызываются переменами, происходящими в окружающей среде.
Расширяющие изменения не являются обязательными и направлены лишь на улучшение характеристик ПО.
Сопровождение как вид деятельности заключается в обработке запросов на исправление, проверку и расширение.
На численность персонала группы сопровождения влияют характер и сроки взятых гарантийных обязательств.
Уровень 1.
Периодический выпуск новых редакций (только корректирующие изменения) и новых версий, содержащих дополнительно расширяющие изменения.
Уровень 2.
Периодический выпуск только новых редакций.
Уровень 3.
Выпуск новых версий или редакций не производится. На заявки отправляются ответы, которые могут содержать или не содержать решения поставленных проблем.
Чем больше изделий приходится сопровождать на уровне 1 или 2 гарантийного обслуживания, тем многочисленнее должна быть группа сопровождения.