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

Основы программирования. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
955 Кб
Скачать

3) цифра 5 входит в десятичную запись трехзначного натурального числа;

int a, t; t = a % 10 == 5 a / 10 % 10 == 5 a / 100 == 5; 4) все цифры трехзначного натурального числа различны;

int a, t;

t = a % 10 != a / 10 % 10 && a % 10 != a / 100 && a / 10 % 10!= a / 100;

ТЕМА 2

РАЗВЕТВЛЯЮЩИЙСЯ ВЫЧИСЛИТЕЛЬНЫЙ ПРОЦЕСС

2.1. ПОНЯТИЕ РАЗВЕТВЛЯЮЩЕГОСЯ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА

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

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

2.2. УПРАВЛЯЮЩИЕ СТРУКТУРЫ ВЫБОРА

При реализации на языке программирования разветвляющегося процесса используются следующие структуры управления вычислениями: последовательность (см. тема 1) и ветвления.

1) Структурная схема полного ветвления – выбор одного из двух возможных действий (альтернатива):

11

истина

B

 

ложь

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S1

 

 

 

S2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

На языке программирования эта структура реализуется условным оператором (условный полный оператор):

if ( B ) S1; else S2 ;

Здесь B – выражение, принимающее логическое значение, S1 – оператор, исполняемый, если B истинно, S2 – оператор, исполняемый, если B ложно. В контексте условного оператора значение выражения равное нулю интерпретируется как ложь, а значение отличное от нуля как истина.

Пример полного условного оператора: if (x > 0) y = x * x ; else y = -x;

2) Структурная схема сокращенной альтернативы: выполнение или невыполнение действия:

истина

B S

ложь

На языке программирования эта структура реализуется условным неполным оператором (условный сокращенный оператор):

if ( B ) S;

Здесь S – оператор, исполняемый, если B истинно, в противном случае выполняется следующий по порядку оператор.

Пример сокращенного условного оператора: if ( x > y ) y = x;

Оператор S1 (а также оператор S2 и оператор S) может быть составным, если выбираемое в зависимости от условия B действие включает несколько отдельных действий.

12

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

if ( x>y ){a = x; x = y; y =a;}

3) Многозначное ветвление

▪ Если в качестве оператора S1 (или оператора S2 или оператора S) использовать условный оператор (в полной или сокращенной форме), то можно описать выбор одного из более чем двух действий – многозначное ветвление:

Выбор одного из 4-х действий: if ( B1 )

if ( B2 ) S1; else S2 ; else

if ( B3 ) S3; else S4 ;

Исполняется S1, если B1и B2 истинны, если B1 истинно и ложно B2 исполняется S2 если B1 ложно и истинно B3 исполняется S3, если B1и B3 ложны исполняется S4 .

Выбор одного из 3-х действий:

а) if ( B1 )

if ( B2 ) S1; else S2 ; else S3 ;

Исполняется S1, если B1и B2 истинны, если истинно B1и ложно B2 исполняется S2 если ложно B1 исполняется S3 .

б) if ( B1 ) S1; else

if ( B2 ) S2; else S3 ;

Исполняется S1, если B1 истинно, если ложно B1и истинно B2 исполняется S2 если B1и B2 ложны исполняется S3.

Выбор одного из 2-х действий: if ( B1 )

{if ( B2 ) S1;}

else S2 ;

Исполняется S1, если B1и B2 истинны, если B1 ложно исполняется S2. Условный сокращенный оператор if заключен в фигур-

13

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

Пример многозначного ветвления с помощью вложенности условных операторов:

a) if ( x > 0 )

if (x < 1) y=x * x; else y = 1; b) if ( x > 0 )

{if (x < 1) y=x * x;} else y = 1;

c) if ( x < 0 ) if (x > y) z = x; else z = y; else if (x < y) z = x; else z = y;

▪ Еще одним вариантом многозначного ветвления является управляющая структура переключатель. Структурная схема переключателя:

L1

 

I

Ln

L2

 

 

 

S1

 

S2

...

Sn

где I – выражение дискретного типа, L1, L2, ... , Ln – константы того же типа, что и I, S1, S2, ... , Sn – операторы, из которых выполняется тот, с константой которого совпало значение I.

На языке программирования Си эта структура реализуется оператором переключатель (выбор):

switch ( I )

{

case L1: S1; break; case L2: S2; break;

. . .

case Ln: Sn; break;

14

default: Sn+1;

}

Ветка default (оператор Sn+1) выполняется, если ни одно из вышестоящих выражений не удовлетворено.

Пример записи оператора выбора: a)

switch ( k % 3 )

{

case 0: printf("\n k кратно 3"); break; case 1: printf("\n k не кратно 3"); break; case 2: printf("\n k не кратно 3"); break;

}

b)

switch ( k % 3 )

{

case 0: printf("\n k кратно 3"); break; default: printf("\n k не кратно 3");

}

2.3.ЗАДАЧИ И РЕШЕНИЯ

1.Определить необходимые переменные и записать указанное действие в виде одного условного оператора:

 

 

 

2

x при0

x 2

 

1) y =

cos

 

;

 

sin2 x иначе

 

1

 

 

 

 

 

 

 

 

float x, y;

if (0 < x && x < 2 ) y = cos (x) * cos (x); else y = 1 – sin (x) * sin (x) ;

2) перераспределить значения переменных x и y так, чтобы в x оказалось большее из этих значений, а в y – меньшее;

float x, y, z;

if ( x < y ) {z = y; y = x ; x = z;};

 

15

3) известно, что из четырех чисел a1, a2, a3, a4 одно отлично от трех других, равных между собой; присвоить номер этого числа переменной n;

float a1, a2, a3, a4; int n; if ( a1 == a2 )

if ( a1==a3 ) n = 4; else n = 3 ; else

if ( a1== a3 ) n = 2; else n = 1 ;

2. Определить необходимые переменные и записать последовательность операторов для решения задачи:

1) Даны три различных целых числа. Найти два таких числа среди них, чтобы модуль разности между ними был максимален;

int a, b, c, d1, d2, d3, m, n;

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

d1 = abs (a - b); d2 = abs (b - c); d3 = abs (a - c); if (d1 > d2)

if (d1 > d3) {m = a; n = b;} else {m = a; n = c;}

else

if (d2 > d3) {m = b; n = c;} else {m = a; n = c;}

printf ("\nm = %d n= %d", m, n);

2) Даны три произвольных числа. Можно ли построить равнобедренный треугольник с такими длинами сторон? Если нельзя, то напечатать 0, иначе напечатать 1;

float a, b, c;

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

if (a < 0 b< 0 c< 0 a > b+c b > a+c c > a + b) printf ("\n 0"); else

if (a == b a == c b == c) printf ("\n 1"); else printf ("\n 0");

16

3) Даны координаты трех попарно различных точек плоскости. Найти ту из них, которая расположена ближе других к началу координат;

float x1, y1, x2, y2, x3, y3, d1, d2, d3, x, y;

scanf ("%f%f%f%f%f%f ", &x1, &y1, &x2, &y2, &x3, &y3); d1 = x1*x1 + y1*y1; d2 = x2*x2 + y2*y2; d3 = x3*x3 + y3*y3; if (d1 < d2)

if (d1 < d3) {x = x1; y = y1;} else {x = x3; y = y3;}

else

if (d2 < d3) {x = x2; y = y2;} else {x = x3; y = y3;}

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

4) Даны целочисленные координаты трёх вершин прямоугольника, стороны которого параллельны координатным осям. Найти координаты его четвёртой вершины;

int x1, y1, x2, y2, x3, y3, x4, y4;

scanf ("%f%f%f%f%f%f ", &x1, &y1, &x2, &y2, &x3, &y3); if (x1 == x2) {x4 = x3;

if (y1 == y3) y4 = y2; else y4 = y1;}

else

if (x1 == x3) {x4 = x2;

if (y1 == y2) y4 = y3; else y4 = y1;} else {x4 = x1;

if (y1 == y3) y4 = y2; else y4 = y3;} printf ("\nx4 = %d y4 = %d", x4, y4);

5) Для заданного х найти значение следующей функции f (х):

0, если х 0,

f (x) x2, если 0 х 2,

х, если х 2

float x, y;

scanf ("% f ", &x); if (x < 0) y = 0;

else

17

if (x <= 2) y = x*x; else y=sgrt (x);

printf ("\n%f ", y);

ТЕМА 3

ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ

3.1. ПОНЯТИЕ ЦИКЛИЧЕСКОГО ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА

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

Например, требуется вычислить значение многочлена a5x5+ a4x4 + + ... a1x + a0. Для сокращения вычислений приведем этот полином к скобочной записи, называемой схемой Горнера: (((( a5 x + a4 )x + a3 )x + + a2 )x + a1 )x + a0 . Здесь повторяющейся совокупностью действий является умножение на x и сложение с очередным коэффициентом полинома. Чтобы вычислить полином, надо выполнить следующую после-

довательность действий: p=a5; p=p*x + a4; p=p*x + a3; p=p*x + a2;

p=p*x + a1; p=p*x + a0.

С увеличением порядка полинома длина такой последовательности действий может быть очень большой (или даже заранее неизвестной, если порядок полинома задается переменной величиной). Выходом из этой ситуации является такая запись повторяющихся действий (называемая обобщенной записью, т. е. независимой от номера повторного выполнения), которая позволяет, описав эти действия один раз и организовав их повторение столько раз, сколько необходимо, вычислить требуемое значение. В данной задаче обобщенная запись может иметь вид p=p*x + k, где k – коэффициент полинома, а p частично вычисленное (накапливаемое) значение полинома. Перед выполнением этого

18

действия k должна получить значение очередного коэффициента. Или вид p=p*x + ai, здесь ai также обобщенная запись коэффициента полинома с номером i. Действия, многократное повторение которых позволяет вычислить результат, принято называть телом цикла (в данной задаче это p=p*x + k и действие по заданию значения k).

3.2. СТРУКТУРА ЦИКЛА

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

действия по подготовке цикла к первому исполнению;

действия, являющиеся основным содержанием данного вычислительного процесса – тело цикла;

действия, отслеживающие повторение тела цикла – проверка условия продолжения повторений.

Структурные схемы цикла:

Цикл с предусловием

Цикл с постусловием

подготовка цикла

 

 

 

подготовка цикла

продолжать цикл?

 

 

тело цикла

 

 

+

+

продолжать цикл?

тело цикла

 

_

 

 

выход из цикла

выход из цикла

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

19

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

 

начало

 

ввод x, k

 

p = k

 

_

i =1

 

 

+

 

i n

вывод p

 

ввод k

 

 

 

 

p=p*x+k

 

 

i=i+1

конец

Рис. 1

Блок-схема алгоритма вычисления значения полинома n-й степени для заданного значения x приведена на рис. 1.

3.3. ЦИКЛИЧЕСКИЕ УПРАВЛЯЮЩИЕ СТРУКТУРЫ

Для реализации на языке программирования Си циклического процесса используются следующие структуры управления вычислениями (операторы): цикл с предусловием, цикл с постусловием:

1) Оператор цикла с предусловием while ( В) S;

Здесь B – выражение, определяющее условие продолжения выполнения тела цикла; S – оператор (задает тело цикла). Таким образом, в оператор while не включены действия по подготовке цикла к первому исполнению, а также действия связывающие условие В и S (для того, чтобы на очередном шаге В стало ложным и цикл завершился). Эти действия должен предусмотреть сам программист.

Структурная схема оператора цикла с предусловием:

20

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