РАЗРАБОТКА И РЕАЛИЗАЦИЯ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ




Цель работы

 

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

 

Методические указания

1. Понятие разветвляющегося алгоритма

 
 

Алгоритм называется разветвляющимся, если обеспечивает в зависимости от выполнения определенных условий выбор одного из ранее предусмотренных путей решения задачи. Каждый из возможных путей решения называется ветвью. Выбор той или иной ветви осуществляется в результате проверки некоторого условия и зависит от исходных данных или промежуточных результатов. В общем случае блок-схема разветвляющегося алгоритма представлена на рис. 1. На схеме блок проверки условия изображается ромбом, внутри которого записывается условие (блок 2). Из блока исходят две стрелки выполнения условия (истина) и невыполнения условия (ложь) и ведут к соответствующим ветвям алгоритма.

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

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

Операторы в программах лабораторных работ № 1, 2 выполняются последовательно друг за другом в порядке их написания. Такой порядок выполнения операторов называется естественным. Однако при программировании разветвляющихся алгоритмов необходимо в зависимости от тех или иных условий изменять последовательность выполнения операторов. Для этого в языке имеются управляющие средства, реализующие разветвления.

 

2. Условный оператор

 

Условный оператор (if) предназначен для выбора и выполнения одного из двух входящих в него операторов в зависимости от значения условия. Общая форма записи оператора имеет такой вид:

 

If (выражение)

< оператор 1 >

[ else < оператор 2>;]

Здесь if - else - зарезервированные слова, означающие соответственно ЕСЛИ - ИНАЧЕ, квадратные скобки означают, что конструкция else <оператор2> может отсутствовать, выражение - это любое выражение языка. Этот оператор можно записывать в одну строку, потому что компилятор пробелы игнорирует. Из общей формы записи оператора if следует, что он имеет две формы записи: полную с конструкцией else и неполную - без else.

Порядок выполнения условного оператора для полной формы записи и неполной представлены соответственно на рис. 2 и 3.

 

 
 

if (-3) x + = 2; y - = 3;

В этом примере значение выражения ²истина², выполняют операторы x и y.

if (0) x + = 2; z = x + 3; Выполняется только оператор z.

if (5) x = a + b; else z = a - b; c = x + 5;. Выполняются только операторы x и c.

if (0) x = a + b; else z = a - b; c = x + 5;. Здесь выполняются операторы z и c.

Как правило в операторе if в начале выражения используются либо выражение отношения, либо логическое выражение.

 

3. Выражения отношения

 

Выражение отношения - это конструкция вида AQB, где A, B - любые выражения языка, Q - один из знаков операций отношения.

Выполнение оператора if сводится к следующему:

1) вычисляется выражение, заключенное в круглые скобки. Определяется факт выполнения выражения: если выражение имеет ненулевое значение, оно считается истинным; если выражение имеет нулевое значение, оно считается ложным;

2) если выражение истинно, выполняется оператор 1, а оператор 2 (если он есть) игнорируется;

3) если выражение ложно и ветви else нет, управление передается следующему оператору за if;

4) если выражение ложно и имеется ветвь else, выполняется оператор 2 и затем следующий оператор по тексту программы.

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

В языке Си допустимы следующие операции отношения: < меньше; <= меньше или равно; > больше;>= больше или равно; = = равно;!= не равно.

Результат выполнения выражений отношения есть либо 1, если условие выполняется, либо 0, если оно не выполняется, поэтому выражение 5 > 4 имеет значение 1, т.е. "истина", а выражение 7 = = 5 - "ложь", т.е. ноль.

Приведен фрагмент программы печати максимального значения из двух переменных i, j целого типа

if (i > j) printf (" max = %d \n", i);

else printf ("max = %d \n", j).

 

4. Пустой оператор

 

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

Например, оператор if (a > b); else c = a + b; d ++; по ветви да имеет пустой оператор, если условие "истина", то выполняется только оператор d, в противном случае - операторы c и d.

 

5. Вложенные операторы if

 

Операторы if могут быть вложены друг в друга, т.е. по ветви "истина" вместо <оператора 1> может быть другой оператор if, а также по ветви "ложь" вместо < оператора 2> - другой оператор if. Число таких вложений может быть любым.

Например, в следующем фрагменте программы

i = 5; k = 2; j = 3;

if (i > k) if (i < j) printf ("оператор1 \n");

else printf ("оператор 2 \n");

будет напечатано: оператор 2. В данном фрагменте два оператора if, причем один имеет полную форму, а другой неполную. Какому оператору if соответствует else? Компилятор языка решает эту задачу по правилу, которое гласит, что каждое else относится к ближайшему if не имеющему else. Таким образом, в нашем примере второй оператор if имеет полную форму, а первый if - неполную.

Рассмотрим в качестве примера, более сложный фрагмент программы

 

if (a > b)

if (b > c)

z = a + b;

else if (c < d) w = b - c;

else; z = a = b;

 

По приведенному выше правилу в данном фрагменте установлены соответствия операторов if - else подчеркиванием их одной и двумя линиями. В примере первый оператор if имеет неполную форму, остальные два оператора - полную, заметим, что последний else имеет пустой оператор. На рис.4 приведен алгоритм, который реализует указанный фрагмент программы.

Для облегчения чтения и понимания программы с вложенными операторами if целесообразно использовать полные формы операторов или применять составной оператор.

 

6. Составной оператор (блок)

 

Конструкция оператора if такова, что по ветвям "да", "нет" допускается использование только одного оператора. Часто требуется по ветвям оператора if выполнять большой объем действий, которые не могут быть реализованы одним оператором, а только несколькими. В этом случае используется составной оператор (или блок). Составной оператор - это последовательность любых операторов, заключенных в фигурные скобки, отделенных друг от друга точкой с запятой:

 

{<оператор 1>; <оператор 2>;..;.<оператор n>;}

Точка с запятой в конце фигурной скобки не ставится.

Пример. Даны две переменные x и y. Если x = y, то вывести на печать значения этих переменных без изменения. Если x > y, значения переменных уменьшить в два раза. Если x < y, то значения переменных увеличить на 10. Ниже приведена программа.

 

# include <stdio.h>

main ()

{

float x, y

printf ("вводите x, y \n")

scanf (" %f %f ", &x, &y);

if (x! = y) if (x > y)

{ x = x/2; y = y/2;

}

else

{ x = x + 10; y = y + 10}

printf (" x = %f y = %f \n", x, y); }

Приведем фрагмент программы, используя составной оператор, для алгоритма рис. 4.

if (a > b)

{ if (b > c) z = a + b;

else if (c < d) w = b - c;

else;

}

z = a - b;

В этом фрагменте ветвь "да" первого оператора if заключена в фигурные скобки, что существенно облегчает чтение программы с ранее приведенной.

 

7. Логические операции

 

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

! - логическое отрицание;

&& - логическое умножение;

½½ - логическое сложение.

Действие логических операций определяется так называемой таблицей истинности:

 

Выра-жение А Выра- жение В ! А А && B А ½½ В
Ложь Ложь Истина Ложь Ложь
Ложь Истина Истина Ложь Истина
Истина Ложь Ложь Ложь Истина
Истина Истина Ложь Истина Истина

 

Например. Определить возможность попадания точки M (x,y) с координатами x, y в первую четверть круга радиусом R. Условие попадания точки можно записать в виде трех выражений:

x ³ 0;

y ³ 0;

x2 + y2 £ R2.

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

x >= 0 && y >= 0 && x*x + y*y <= R*R.

 

Приоритет выполнения логической операции следующий:

1) отрицание;

2) логическое умножение;

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

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

 

scanf ("%f %f %f", &x, &y, &r);

if (x >= 0 && y >= 0 && x*x + y*y <= r*r)

printf ("\n точка попала в первую четверть круга");

else

printf ("\n точка не попала в первую четверть круга")

 

8. Условная операция

 

Эта операция может использоваться вместо оператора if - else. В общем случае условную операцию можно записать следующим образом:

 

(<выражение 1>)?:<выражение 2>:<выражение 3>;

 

Если <выражение 1> истинно, то значением этой операции является величина <выражения 2>; если <выражение 1> ложно, то значением этой операции является величина <выражения 3>.

Пример, с помощью, которого находится абсолютное значение переменной y и присваивание этого значения переменной x:

x = (y > 0)? y: -y;

Условные операции более компактны по сравнению с оператором if - else, и их применение обычно приводит к получению более компактного машинного кода.

 

9. Оператор switch

 

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

Оператор switch производит выбор одного из нескольких вариантов. Общая форма записи этого оператора выглядит так:

 

switch (целое выражение)

{

case константа 1:

[оператор(ы);]

case константа 2:

[оператор(ы);]

.

.
[default:

оператор(ы);]

}

Здесь switch, case, default - служебные слова, означающие соответственно "ключ", "выбрать", "умолчание". Порядок выполнения оператора switch:

1) вычисляется выражение в скобках после ключевого слова switch;

2) вычисленное значение приводится к типу int;

3) вычисленное значение последовательно сравнивается с константами, указанными после слова case;

4) если найдена константа, совпадающая со значением выражения, управление передается первому оператору, который стоит за этой константой, и выполняются все операторы этой ветви;

5) если среди этих операторов нет оператора прерывание break, то последовательно выполняется вся оставшаяся часть оператора switch до конца, после чего выполняется оператор, который стоит за switch (т.е. за закрывающей скобкой);

6) если среди операторов, относящихся в выбранному case, есть оператор break, то при его выполнении происходит выход из оператора switch и управление передается на оператор, следующий за switch;

7) если нет константы, совпадающей со значением выражения, и нет ветви с названием default, то оператор switch не выполняется;

8) если нет константы, совпадающей со значением выражения, и присутствует ветвь default, то будут выполняться все операторы этой ветви;

9) слова case и default могут следовать в любом порядке, но хорошим стилем программирования считается, если ветвь default является последней;

10) отсутствие оператора в ветви означает получение одинаковых результатов при переходе к разным константам.

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

switch (scanf (: %d", &N)

{

case 1: printf ("январь \n"); break;

case 2: printf ("февраль \n");break;

.

.

.

case 12: printf ("декабрь \n"); break;

default:

printf ("ошибка при вводе, повторите \n");

}

 

10. Оператор безусловного перехода

 

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

Он имеет такой формат:

 

goto <идентификатор>;

 

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

 

11. Пример выполнения задания

 

Вычислить корни квадратного уравнения ax2 + bx = c =0.

В зависимости от значений коэффициентов a, b, c необходимо различать несколько случаев, а именно: уравнение имеет бесчисленное множество корней; один корень, если оно линейно; корни комплексные, корни действительные. Блок-схема алгоритма и программы приведены на рис. 5.

 

# include <stdio.h>

#include <math.h>

main ()

{

float a, b, c, x, d, x1, x2, Rex, Jmx;

scanf ("%f %f %f", &a, &b, &c);

IF (a = = 0)

{ IF (b = = 0) printf (" \n корней нет");

else

{ x = - c/b;

printf ("\n уравнение линейное x = %f",x);

}

else

{

d = b*b - 4*a*c;

if (d < 0)

{ Rex = - b/(2*a); Jmx = sqrt (fabs(d))/(2*a);

printf ("\n комплексные Rex = %f, Jmx = %f", Rex, Jmx);

}

else

{ x1 = (-b +sqrt(d))/(2*a);

x2 = (-b - sqrt(d))/(2*a);

printf ("\n действительные корни x1 = %f, x2 = %f", x1, x2);

}

}

 

Контрольные вопросы

 

Какой процесс называется разветвляющимся?

Приведите пример разветвляющегося процесса, имеющего три ветви.

Какова форма условного оператора if?

Что такое истина выражения в языке Си?

Что такое отношение? Каковы операции отношения?

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

Что такое составной оператор? Где он применяется?

С какой целью используется пустой оператор?

С какой целью в выражениях используются логические операции?

Чем отличается условная операция от оператора if?

Какую структуру имеет оператор switch?

Каков принцип работы оператора switch?

 

Варианты заданий

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

Даны два произвольных числа A, B. Если оба значения принадлежат отрезку [c,d], то вычислить R = sina.sinb, в противном случае печатать сообщение "Нет решения".

В зависимости от параметров A, B, C квадратного уравнения составить программу печатающую одно из сообщений: "корней нет", "линейное уравнение", "корни мнимые, корни действительные различные", "корни действительные равные".

 
 

Определить принадлежность точки B(x,y) к заштрихованной области

Даны три числа A, B, C. Найти остаток от деления на 3 величины M и вычислить значения функции y.

 
 

 
 

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

 

 

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

 
 

8. Даны три числа A, B, C. Составить программу вычисления экспоненты числа, значение которого ближе всего к значению функции

9. В зависимости от величины остатка от деления на семь значения функции y = ln(x 2 + ab) напечатать сообщение об одном из дней недели.

10. Даны отрезки A, B, C, D. Составить программу определения возможности построения их них параллелограмма.

11. Даны три числа А, В, С. Определить сколько среди них отрицательных чисел.

12. Расположить три заданных числа a, b, c в порядке убывания их значений.

13. Даны три числа А, В, С, которые являются сторонами треугольника. Определить вид треугольника: прямоугольный, остроугольный, тупоугольный.

15. Дано прямоугольное отверстие размером x на y и кирпич с гранями А, В, С. Составить программу для определения возможности прохождения кирпича через заданное отверстие.

 

 

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

17. Даны значения A, B, C. Если ни одно из значений не равно нулю, то вычислить , и если D > 0 и A > 0, вычислить , в противном случае y = 2. Если хотя бы одно из значений A, B, C равно нулю, то печатать сообщение ‘ Нет решения ’.

18. Даны значения A, B, C. Если A > B, B > C, то присвоить x = 0.2; если b < c и a < c, то x = 2; в остальных случаях x = 0, y = 0.

19. Составить программу нахождения меньшего из трех данных и печати его имени и значения.

20. Составить программу нахождения большего их трех данных и печати его имени и значения.

21. Даны значения x1, x2, x3. Составить программу присвоения переменным a1, a2, a3 значений по следующему правилу: если x1 > x2 > x3, то a1 = = x1, a2 = x2, a3 = x3; если x1 £ x2 £ x3, то a1 = x3, a2 = x1, a3 = x2, в остальных случаях печатать значения x1,x2,x3.

22. Составить программу преобразования заданных значений А, В по правилу: если А и В оба положительны, то каждое из них удвоить. Если оба отрицательны, то вычислить их произведение; если хотя бы одно значение отрицательно, найти их сумму.

23. Составить программу преобразования заданных значений x и y по правилу: если x и y отрицательны, то каждое значение заменить его модулем. Если отрицательно только одно из них, то оба значения увеличить на 0.5, если оба значения не отрицательны, то отыскать максимальное значение.

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

 

Лабораторная работа № 4

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: