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

Lab_5

.pdf
Скачиваний:
7
Добавлен:
27.05.2015
Размер:
3.49 Mб
Скачать

1Лабораторная работа №5

Алгоритмы разветвляющейся структуры. Условный оператор

1.1Разветвляющиеся структуры

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

(рис. 1б). Эта структура обеспечивает в зависимости результата проверки условия (истина или ложь) выбор одного из альтернативных путей работы алгоритма. Каждый из путей ведет в общему выходу, так что работа алгоритма продолжается независимо от того, какой путь будет выбран. Возможные пути выполнения алгоритма помечаются соответствующими метками, например: истина/ложь (true/false) или да/нет и т.д.

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

Итак, для того чтобы в зависимости от исходных данных обеспечить выполнение разных последовательностей операторов, в языке Си приме-

Рис. 1 Алгоритмы ветвления представляют на блок-схемах в виде ромбов.

няются операторы ветвления if и switch. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор switch

на одну из произвольного числа ветвей (рис. 1г). Рассмотрим сначала задачи с применением оператора if.

1.2Оператор if-else

Оператор if-else, используемый в Си-программах для программирования разветвляющихся структур, имеет следующий формат:

if (выражение) оператор1; else оператор2;

Выполнение оператора начинается с вычисления выражения. Далее выполнение идет по схеме: если значение выражения не равно нулю (т.е. истинно), тогда выполняется оператор1, в противном случае (значение выражения равно нулю, т.е. ложно) выполняется оператор2.

Пример 1

Даны два целых числа a1 , a2 . Найти наибольшее из этих чисел.

#include "stdafx.h" #include <stdio.h>

4

#include <conio.h>

\* Программа нахождения наибольшего из двух целых чисел.*\ void main()

{int al, a2, max;

printf("input 2 int values\n"); scanf("%d%d", &al, &a2); if(al>a2)

max=al; else max=a2;

printf("max(%d, %d) = %d\n", al, a2, max);

getch();

}

Вданном случае наибольшее из двух целых чисел вычисляется с помощью оператора if-else. Но данную задачу можно переписать, используя условную (тернарную) операцию.

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

Сделаем два замечания по поводу использования оператора if-else. Во-первых, вторая часть оператора (else оператор2) является необязательной. В этом случае оператор имеет вид:

if (выражение) оператор1;

Оператор1 выполняется тогда и только тогда, когда значение выражения не равно нулю. Если значение равно нулю, тогда оператор1 пропускается и программа продолжает свое выполнение. Во-вторых, иногда, если конкретное выражение истинно или ложно, бывает нужно выполнить не одно действие, а несколько. Для этого используется составной оператор. Составной оператор состоит из левой фигурной скобки f , нескольких операторов, каждый из которых заканчивается точкой с запятой ; и правой фигурной скобки g. Приведем пример программы, где используется со-

5

ставной оператор.

Пример 2

Необходимо вычислить значение функции Z(x) = x3=y , где y = sin(nx) + 0:5 . При построений алгоритма вычисления данной функции необходимо, чтобы при любых исходных данных был получен либо результат, либо напечатано сообщение о том, что задача не может быть решена при заданных значениях. Действительно, если y = 0 , то задача не может быть решена, так как деление на ноль невозможно. Поэтому в алгоритме необходимо предусмотреть такое условие и выдать в качестве результата информацию о ток, что y = 0 . Таким образом, вычислительный процесс имеет две ветви. В одной ветви, когда y 6= 0 , необходимо вычислить и напечатать значение переменной, в другой вывести на печать информацию, что y = 0 . Такой вычислительный процесс можно описать следующей условной формулой:

Вычислить z = x3=y , если y = sin(nx) + 0:5 ; Вывести y = 0 , если y = 0 .

Си-программа, реализующая данный алгоритм (блок-схема справа), выглядит следующим образом:

#inciude<math.h> void main ()

{int n;

float x, у, z;

printf("\n input float x \n"); scanf("%f", &x);

n=1;

y=sin(n*x)+0.5;

if(y==0) printf("\n stop y=0 \n"); else

{z=x*x*x/y;

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

}

6

Пример 3

Заданы три вещественных числа a1 , a2 , a3 . Требуется их упорядо-

чить в порядке возрастания.

void main ()

{float a1, a2, a3, b;

printf("\n input 3 float a1, a2, a3 \n" ); scanf("%f %f %f", &a1, &a2, &a3); if(a1>a2)

{b=a1; a1=a2; a2=b;} if(a1>a3)

{b=a1; a1=a3; а3=b;} if(a2>a3)

{b=a2; a2=a3; a3=b;}

printf ("a1=%f a2=%f a3=%f \n", a1, a2, a3);

}

Пример 4

Вычислить корни квадратного уравнения ax2 + bx + c = 0 . Напомним, что если дискриминант d = b2 4ac 0 , то корни действительны и равны x1 = e + f , x2 = e f , где e = b=(2a) ; f = d1=2=(2a) . В противном случае, необходимо вывести сообщение, что действительных корней уравнение не имеет.

void main ()

{float a, b, с, d, e, x1, x2;

printf ("\n input 3 float a, b, с \n"); scanf ("%f %f %f", &a, &b, &c); d=b*b-4.*a*c;

e=-b/2./a; if(d>=0.0)

if(d==0.0)

{x1=e; printf("\n x1=x2=%f \n", x1);}

7

else { f=sqrt(d)/2./a; x1=e+f; x2=e-f; printf("\n x1=%f x2=%f \n", x1, x2);

}

else printf("\n real solutions are absent \n");

}

1.3Оператор-переключатель switch-case

Оператор switch-case предназначен для выбора одного из альтернативных путей выполнения программы. Синтаксис оператора:

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

{[объявление]

...

[case константное выражение:] [оператор;]

...

[default: оператор;]

}

Выражение, следующее за ключевым словом switch в круглых скобках, может быть любым выражением, допустимым в языке Си, значение которого должно быть целым. Значение этого выражения является критерием для выбора пути выполнения программы. Тело оператора switch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным выражением. Константные выражении (или константы варианта) синтаксически представляют собой метки операторов. Для них обычно используются целые или символьные константы. Оператор, получающий управление, это тот оператор, значение константы варианта которого совпадает со значением выражения переключателя. Значение каждой константы варианта должно быть уникальным внутри тела оператора switch.

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

8

какой-либо оператор не передаст управление за пределы тела (операторы break, goto). Оператор, следующий за ключевым словом default, выполняется, если ни одна из констант варианта не равна значению выражения переключателя. Если же слово default опущено, то управление передается на оператор, следующий за оператором switch в программе.

Пример 5

\* Калькулятор *\ void main ()

{char sign; float x, у, z;

printf("\n input two values: x,y"); scanf("%f %f", &x,&y);

printf("\n input sign +,-,*,/"); scanf("%c", &sign);

switch ( sign )

{case ’+’: z=x+y; break; case ’-’: z=x-y; break; case ’*’: z=x*y; break; case ’/’: z=x/y; break;

default: printf( "\n неверный знак\n" );

}

}

1.4Задания к лабораторной работе

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

 

 

1

 

;

a b ;

 

cos(x);

x 0

;

 

 

 

 

 

 

 

 

 

1

 

y =

8

a + b

 

a =

8

 

b =

 

 

 

x+1

 

 

 

 

 

a > b ;

 

x < 0

;

 

<a + pb;

 

< sin(x);

q

 

:

 

 

 

 

 

:

 

 

 

 

 

 

9

Рис. 2 Блок-схема для задания 1

2. Создать блок-схему, написать программу (наличие интерфейса при-

ветствуется), отладить, оформить отчет.

1. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

 

x

+a

при

 

0 и

 

6= 0

 

 

>

ax2

b;

 

x <

 

b

 

;

f =

 

x

 

;

при x > 0 и b = 0 ;

 

>

 

 

b

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

<

 

 

x

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

c ;

 

в остальных случаях

 

>

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

2. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

 

x

+a

при

 

0 и

 

6= 0

 

 

>

ax2

b;

 

x <

 

b

 

;

f =

 

x

 

;

при x > 0 и b = 0 ;

 

>

 

 

b

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

<

 

 

x

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

c ;

 

в остальных случаях

 

>

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

:

10

где a , b , c – действительные числа.

3. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

cx

a;

при x < 0 и b 6= 0 ;

 

>

 

2x

 

c

 

f =

 

 

x

a

 

 

 

 

 

 

;

при x > 0 и b = 0 ;

 

>

 

 

 

 

>

 

 

x

 

c

 

 

>

 

 

 

 

 

>

 

 

 

 

 

 

 

 

<

 

 

 

 

 

 

 

 

>

x c

 

 

 

 

>

 

 

 

 

 

 

 

 

>

c 2x;

 

 

в остальных случаях

 

>

 

 

 

>

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

4. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

ax3

x

 

a

при

 

и

6

f =

>

 

+ bx2;

 

x < 0

 

b = 0 ;

 

 

 

;

при x > 0 и b = 0 ;

 

>

 

 

x

 

c

 

 

 

 

 

>

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

<

x + 5

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

10);

 

 

в остальных случаях

 

> c(x

 

 

>

>

:

где a , b , c – действительные числа.

5. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

(

 

+

x a

при

 

и

6

 

>

a

x

 

c)2

b;

 

x < 0

 

b = 0 ;

f =

 

 

 

 

;

при x > 0 и b = 0 ;

 

>

 

 

 

c

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

<

 

 

 

x

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

 

 

a + c ;

 

в остальных случаях

 

>

 

 

 

 

>

 

 

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

6. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

 

 

x

a

 

при

 

0 и

 

6= 0

 

 

>

 

ax3

 

b;

 

x <

 

b

 

;

f =

 

 

x

 

c

;

при x > 0 и b = 0 ;

 

>

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

 

< x

 

c

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

в остальных случаях

 

> c + x;

 

 

 

>

 

 

 

 

 

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

11

7. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8 ax2 + c;

при x < 0 и b 6= 0 ;

 

>

 

 

 

b

 

 

 

x

 

a

 

 

 

f =

>

 

 

 

2

;

при x > 0 и b = 0 ;

 

>

(x

 

c)

 

 

 

>

 

 

 

 

 

>

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

<

 

x2

 

 

 

 

>

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

>

 

c2 ;

 

 

в остальных случаях

 

>

 

 

 

 

>

 

 

 

 

 

 

:

где a , b , c – действительные числа.

8. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8 ax

+ a

 

при

 

0 и

 

6= 0

 

 

>x

2

b2x;

 

x <

 

b

 

;

f =

 

 

; при x > 0 и b = 0 ;

 

 

 

>

x c

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

<

 

x

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

1 + c ;

 

в остальных случаях

 

>

 

 

>

 

 

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

9. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8 a

xx

; при c < 0 и a 6= 0 ;

 

>

 

2

f =

 

 

; при c > 0 и a = 0 ;

 

>

 

cx

 

 

>

 

 

 

 

>

 

 

 

 

<

 

x

 

 

>

 

 

 

 

>

 

c ;

в остальных случаях

 

>

 

 

>

 

 

 

:

где a , b , c – действительные числа.

10. Вычислить значение функции f для любого, заданного пользовате-

лем, значения аргумента x

 

8

a

x

при

 

5 и

 

6= 0

 

 

>

x2

b;

 

x <

 

c

 

;

f =

 

 

;

при x > 5 и c = 0 ;

 

>

 

x

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

<

 

x

 

 

 

 

 

 

 

 

>

 

 

 

 

 

 

 

 

 

 

>

c ;

 

в остальных случаях

 

>

 

 

>

 

 

 

 

 

 

 

 

 

:

где a , b , c – действительные числа.

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]