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

Иванова Г.С. - Основы программирования

.pdf
Скачиваний:
2770
Добавлен:
02.04.2015
Размер:
13.53 Mб
Скачать

i. Управляющие операторы языка

Действие 1

Действие 2

Действие 1

Действие 2

Рис. 3.2. Фрагменты алгоритмов

В соответствии с синтаксической диаграммой допускается использовать оператор условной передачи управления с неуказанной (пустой) ветвью else. В некоторых случаях использование укороченных конструкций может приве­ сти к неоднозначности, например, не понятно, какому из двух вариантов схем алгоритма (рис. 3.2) соответствует фрагмент:

[/'<условие1> then

if <условие 2> then <действие ]>

else <действие 2>;

В этих случаях используется так называемое правило вложенности: аль­ тернатива else всегда относится к блиэюайшему if, что соответствует вари­ анту алгоритма на рис. 3.2, а. Если необходимо реализовать вариант алгорит­ ма, изображенный на рис. 3.2, б, то используют операторные скобки:

//'<условие1> then begin

if <условие 2> then <действие 1>

end

else <действие 2>;

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

 

при |х| < 1;

У = 14

^'прииначе.1 < |х| < 2;

I А

 

Программа должна начинаться с ввода значения аргумента. Затем в за­ висимости от того, в какой интервал попадает введенное значение, вычисля-

51

Часть 1. Основы алгоритмизации и процедурное программирование

Рис. 3.3. Схема алгоритма программы вычисления функции, заданной на отрезках, в заданной точке

ем значение функции по одному из заданных выражений. Алгоритм решения данной задачи представлен на рис. 3.3. Текст программы имеет следующий вид:

Program ex; Var x,y:real; Begin

WriteLnCВведите значение аргумента.'); ReadLn(x);

ifabs(x)<=l then y:=abs(x) {первый отрезок} else

ifabs(x)<=2 then

 

y:=sqr(x)

{второй отрезок}

else y:-4;

{третий отрезок}

WriteLnCTIpu x= \ x:8:5,

* y=^ \ y:8:5);

End.

 

3.2, Практикум. Тестирование программ

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

52

3, Управляющие операторы языка

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

Соответственно хорошим следует считать тест, обнаруживающий ошиб­ ку. Для формирования таких тестов определены две стратегии:

«белого» или «прозрачного ящика» (тестирование маршрутов);

«черного ящика».

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

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

На практике лучшие результаты получают, используя при разработке те­ стов обе стратегии.

Пример 3,2. Даны длины сторон треугольника, определить вид треу­ гольника и его площадь. Выполнить контроль вводимых чисел.

Сама задача решается просто. Вид треугольника определим, сравнивая стороны, а площадь вычислим по формуле Герона. Задание «выполнить кон­ троль вводимых чисел» означает, что программа в случае ввода чисел, кото­ рые не могут интерпретироваться как стороны треугольника, должна выда­ вать сообщение об ошибках данных. Три числа нельзя интерпретировать как стороны треугольника, если хотя бы одно из них меньше или равно О, или сумма двух любых чисел больше третьего.

На рис. 3.4 представлена схема алгоритма данной программы, а сама программа имеет следующий вид:

Program ex;

Var АЛС,РЛ'геа1; Begin

WriteСВведите длины сторон треугольника: *); ReadLn(A,B,C);

if (A<=0)or(B<^0)or(C<^0) then

WriteLn('Числа долэюны быть полоэюителъными.') else

if(A+B<=C) or (A+C<^B) or (B+C<^A) then WriteLn(Треугольник с такими сторонами не существует. *)

53

Часть 1. Основы алгоритмизации и процедурное программирование

L"Числа меньше О" i

А ^ О или В < О или С ^ О

А+В <. С или А+С < В или В+С <. А

 

А=ВиВ=С

 

А = В или

 

В = С или

 

Л = С

^"Равнобедренный/

/"Разносторонний

треугольник" / /

треугольник" /

P:=(A+B-fC)/2

 

I

 

S:=\/P(P.A){P.B)(PnC)

I

Вывод /

/

{Конец j

Рис. 3.4. Схема алгоритма программы определения вида треугольника

else

begin tf(A^B)and(B=C)then

WriteLn(Треугольник равносторонний,')

else

if(A^B)or(A=C)or(B^C)then WriteLn(Треугольник равнобедренный, *)

else WriteLn(Треугольник разносторонний, *); P-(A+B+C)/2;

S:=sqrt(P*(P'A) ""(P-B) ""(P-C));

54

J. Управляющие операторы языка

 

 

 

 

 

Т а б л и ц а

3.1

1 А

В

С

Ожидаемый результат

Объект проверки

 

 

1

1

1

Равносторонний, 8=0.43

Маршрут

 

 

2

2

3

Равнобедренный, S=1.98

Маршрут

 

 

4

3

4

Равнобедренный, S~5.56

Маршрут

 

 

2.5

2.5

4

Равнобедренный, 8=3.00

Тип данных и результата

 

1

3.1

4

2.6

Разносторонний, 8=4.03

Тип данных и результата

 

'

0

0

0

Числа должны быть >0

Недопустимые данные

 

 

1

-1.5

1

Числа должны быть >0

Недопустимые данные

 

 

0

1

1

Числа должны быть >0

Недопустимые данные

 

 

1

2

0

Числа должны быть >0

Недопустимые данные

 

 

8

4

3

Тр^гольник не существует.

Недопустимые данные

 

 

2

2

5

Треугольник не существует

Недопустимые данные

 

 

3

9

4

Треугольник не существует

Недопустимые данные

|

WriteLnCwioufadbтреугольника: \S:8:2, 'единиц/); end

End

Примерный набор тестов для обнаружения ошибок в рассматриваемой программе приведен в табл. 3.1

Задания для самопроверки

Задание 1. Разработайте программу, которая вводит вещественные числа х, у и определяет, принадлежит ли точка с координатами (х, у) закрашенной части плоско­ сти (рис. 3.5). Выполните тестирование полученной программы.

Рис. 3.5. Вид области к заданию 1

Задание 2. Заданы целые числа а, Ь, где а < Ь. Раз­ работайте программу, которая определяет, имеет ли точки разрыва функция:

(

х^

при X < а;

X

при

а ^ х ^ Ь ;

I

при

X ^Ь.

Выполните тестирование полученной программы в точках предполагаемого разрыва.

55

Часть L Основы алгоритмизации и процедурное программирование

Задание 3. Периодическая функция f(x) на отрезке [-1, 1] совпадает с функцией x^+l. Разработайте программу, которая определяет значение функции f(x) для заданного значения XQ. Выполните тестирование полученной профаммы.

3.3. Оператор выбора

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

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

Предоставим пользователю возможность выбрать функцию через про­ стейшую имитацию меню, в котором каждой функции соответствует некото­ рое число (код):

Введите код функции: 1 - y=sin(x)

2 - y=cos(x)

3 - у=ехр(х)

В зависимости от значения введенного кода выбирается одна из функ­ ций. На рис. 3.7 представлена схема алгоритма программы.

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

Program ex;

Var x,y:real; Kod:byte; Key:boolean; Begin

WriteLn('Введите код функции:'); WriteLn(4 - sin(x)');

WriteLnC2 - cos(x) '); WriteLn(*3 - exp(x) *); ReadLn(Kod);

—>( case y-A Выражение h*/ of JTAКонстанта/диапазон

else

Оператор end

Оператор —'

Рис. 3.6. Синтаксическая диаграмма <Оператор выбора>

56

3. Управляющие операторы языка

( Начало j

Вывод

меню

Ш

 

 

Kod

 

 

Kod=l

Kod=2 "^^v - ^ Kod=3

другие

л

з:

 

X

i

y:=sin(x)

y:=cos(x)

 

y=Q>

Key:=false

1

 

 

 

 

 

да

Key

нет

 

 

Вывод

 

Неверный

 

х>У

 

код

J

 

ц

 

1

^

 

(

Конец

j

 

Рис. 3.7. Алгоритм программы вычисления значения одной из заданных функций

Write('Beedume значение аргумента:'); ReadLn(x);

Key:=true; {признак правильности кода} case Kod of

1:y:-sin(x);

2:y:=cos(x);

3:y:=exp(x);

else Key:=false; {код не соответствует функции} end;

if Key then

WriteLn(^npu x= \x:12:6, y= \y:12:6)

else

WriteLnCBeeden неверный код функции,');

End

57

Часть 1. Основы алгоритмизации и процедурное программирование

3.4. Операторы организации циклической обработки

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

ляют несколько основных видов циклов:

цикл-пока (рис. 3.8, а)\

цикл-до (рис. 3.8, б);

счетный цикл (рис. 3.8, в).

В Borland Pascal реализованы все три указанных вида циклов. Цикл-по­ ка и цикл-до используют для реализации итерационных циклических про­ цессов. Счетный цикл -для реализации циклических процессов с заданным количеством повторений. Для реализации циклических процессов поисково­ го типа используют циклы-пока или циклы-до со сложными условиями или неструктурные передачи управления (см. параграф 3.6).

Цикл-пока. Синтаксическая диаграмма оператора «цикл-пока» приве­ дена на рис. 3.9. Условие записывают в виде логического выражения. Опера­ тор тела цикла повторяется, пока условие истинно. Проверка осуществляет­ ся на входе. Если при входе в цикл условие не выполняется, то оператор те­ ла цикла игнорируется.

Если в тело цикла необходимо поместить несколько операторов, то ис­ пользуют составной оператор.

Цикл-до. Операторы тела цикла повторяются до выполнения условия, условие проверяется на выходе, т.е. тело цикла всегда выполняется хотя бы

нет

г-*- <K=nl.n2,h>

1

Действие

1

1

(

б

в

Рис. 3.8. Структура циклов, реализованных в Borland Pascal: а - цикл-пока; б - цикл-до; в - счетный цикл

— ^ while V-*^

Логическое

do

Оператор

 

выражение

 

 

Рис. 3.9. Синтаксическая диафамма <Цикл-пока>

58

3'. Управляющие операторы языка

— ^ repeat Утл Оператор \т*\ until V-*J Логическоевыражение

О

Рис. ЗЛО. Синтаксическая диафамма <Цикл-до>

один раз. Синтаксическая диаграмма оператора «цикл-до» приведена на рис. 3.10. В тело цикла можно поместить несколько операторов, разделив их точкой с запятой «;».

Счетный цикл. Цикл выполняется, пока переменная (параметр) цикла принимает значения в заданном диапазоне с определенным шагом. Синтак­ сическая диаграмма оператора приведена на рис. 3.11. Переменная цикла должна иметь порядковый тип. Выражение 1 определяет начальное значение параметра цикла, выражение 2 - конечное значение параметра цикла. Соот­ ветственно начальное и конечное значения должны принадлежать к тому же типу, что и параметр цикла. Если используется служебное слово to, то при каждом выполнении цикла переменной цикла присваивается следующее зна­ чение порядкового типа переменной. Если используется служебное слово downto, то при каждом выполнении цикла переменной цикла присваивается предыдущее значение порядкового типа переменной. Если диапазон значе­ ний переменной цикла пуст, то цикл не выполняется.

Примечание. По сравнению с теоретическим-представлением оператор счетного цикла, реализованный в Borland Pascal, является менее мощной конструкцией, так как шаг цикла ог­ раничен (фактически только +1 и -1).

Пример 3.4. Разработать профамму вычисления суммы п первых нату­ ральных чисел.

Сумма определяется методом накопления. Количество суммируемых чи­ сел известно, поэтому используем цикл с заданным количеством повторений. При каждом проходе к сумме будем добавлять переменную цикла, которая будет изменяться от 1 до п. Перед циклом переменную суммы необходимо

*©^Параметр|.(;:>1°"Р7-'К^и°"Т""'ИЯНОператор

цикла

L^^downtoV

Рис. 3.11. Синтаксическая диаграмма <Цикл с заданным количеством повторений>

59

Часть 1. Основы алгоритмизации и процедурное программирование

(

Начало

j

обнулить. На рис. 3.12 приведена

схема

алгоритма

программы. Текст программы приведен ниже.

 

 

 

 

Ввод

 

Program ex;

 

 

 

п

 

Var

 

 

 

S:=0

 

/, п, S:integer;

 

 

 

 

Begin

 

 

 

л:

 

WritelnCBeedume n');

 

 

 

i:=l,n,l

 

ReadLn(n);

 

 

 

 

 

S:=0;

 

 

 

S:=S+i

 

for /;=/ to n do

 

 

 

 

S:=SH;

 

 

Т"

 

 

 

 

WriteLn('Сумма \ n /

чисел равна \ S);

 

Вывод

/

End,

 

 

/

 

 

Пример 3.5. Разработать программу, определяю­

I

Конец

J

щую сумму ряда 1 - 1/х + 1/х2 - 1/х^ + ...

с заданной

 

 

 

Рис. 3.12. Алгоритм

точностью S (епсилон).

 

 

 

 

 

Из соответствующих разделов математики изве­

вычисления суммы

стно, что суммой ряда называется предел, к которому

п натуральных

стремится последовательность частичных сумм дан­

чисел

ного ряда, если он существует. Если такой предел су­

 

ществует, то ряд называется сходящимся^ в противном случае -расходящим­ ся. Также известно, что знакопеременный ряд сходится, если

где г„ и Tj^+i ~ соответственно п-й и n+1-й члены ряда. Кроме того, доказано, что

|s-sj^kn+iU

где S - сумма ряда, а S^ ~ сумма п членов ряда.

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

кп1 < е •

На рис. 3.13 представлен алгоритм программы. Анализ алгоритма пока­ зывает, что он неструктурный, так как в нем присутствует цикл суммирова-

60