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

1й курс / Konspekt_lektsiy_Informatika_4

.pdf
Скачиваний:
2
Добавлен:
12.06.2023
Размер:
267.09 Кб
Скачать

ÓЕфименко К.Н.

Тема №5. АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ НА С++

5.1.Циклический вычислительный процесс

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

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

1-й этап – подготовка к выполнению цикла. На этом этапе задаются начальные значения для параметра цикла и переменных, использующихся для хранения накапливающихся величин (сумма, количество или произведение вычисляемых величин). Параметр цикла – это переменная, на основе которой строится цикл. Она должна удовлетворять трем условиям: являться исходной величиной для выполнения вычислений; изменяться по определенному закону (чаще всего это закон арифметической прогрессии); оказывать влияние на условие завершения повторяющихся вычислений.

2-й этап – тело цикла. Cодержит арифметические и логические действия, выполнение которых может повторяться определенное количество раз. В теле цикла обязательно должно изменяться значение параметра цикла. Одно выполнение тела цикла называется шагом.

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

Блок-схема, изображающая этапы организации цикла имеет вид:

Подготовка к циклу

Тело цикла

+

Условие

_

Выход из цикла Такая организация циклического вычислительного процесса называетсяциклом с по-

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

Соответствующий этой структуре оператор С++ имеет вид: do

оператор;

while (выражение);

Принцип работы оператора цикла с постусловием do…while

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

Если тело цикла состоит более чем из одного оператора, то используется составной опе-

ратор:

1

ÓЕфименко К.Н.

do

{

оператор_1;

оператор_n;

}

while (выражение);

Пример 5.1. Вычислить значения функции y=esin(x)cos(x), для каждого значения х Î [0;1] с шагом D=0.1.

Для решения поставленной задачи необходимо организовать перебор всех возможных значений х из заданного интервала с указанным шагом (0; 0.1; 0.2; 0.3, … 1). Для каждого полученного х вычислить значение функции у, т.е. организовать циклический вычислительный процесс.

Блок-схема алгоритма должна быть составлена «в общем виде», т.е. работать при любых наборах исходных данных и обеспечивать такое свойство алгоритма, как массовость. Поэтому

в дальнейшем левую границу интервала будем обозначать как xn, а правую – xk.

 

Постановка задачи

1

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения: нет.

4.Блок-схема алгоритма,

вкоторой используется цикл с постусловием:

НАЧАЛО

2

Ввод xn, xk, Dx

5.Описание блок-схемы:

 

 

3

 

Блок 2 – ввод исходных данных.

 

 

x = xn

 

Блок 3 – подготовка к циклу.

 

 

 

 

 

 

 

 

 

 

Блоки 4-7 – тело цикла с постусловием.

 

 

4

 

Блок 6 – изменение параметра цикла х.

 

 

 

 

 

y=esin(x)cos(x)

 

Блок 7 – условие входа в цикл.

 

 

 

6. Текст программы:

 

 

 

 

 

 

 

5

int main()

 

 

 

 

Вывод x,y

{

 

 

 

 

 

 

 

float xn, xk, dx, x, y;

 

 

6

 

cout<<"Input xn="; cin>>xn;

 

 

x = x + Dx

 

 

cout<<"Input xk="; cin>>xk;

 

 

 

 

 

 

 

 

 

 

cout<<"Input dx="; cin>>dx;

+

 

7

 

 

x=xn;

 

x ≤ xk

do

 

 

{

 

 

_

 

 

y=exp(sin(x))*cos(x);

 

 

8

 

 

cout<<"x="<<x<<"\t y="<<y<<endl;

 

 

 

 

 

 

 

 

 

x+=dx;

 

 

КОНЕЦ

}

 

 

 

 

 

while(x<=xk);

 

 

 

 

 

}

 

 

 

 

 

Результаты работы программы:

 

 

 

 

 

2

Подготовка к циклу
Условие
+
Тело цикла

ÓЕфименко К.Н.

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

В цикле с предусловием перед началом тела цикла проверяется условие входа в цикл.

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

Блок-схема алгоритма цикла с предусловием имеет следующую структуру:

_

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

Соответствующий этой структуре оператор С++ имеет вид:

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

Принцип работы цикла с предусловием

while

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

Если тело цикла состоит более чем из одного оператора, то используется составной опе-

ратор:

while (условие)

{

оператор 1;

оператор n;

}

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

Пример 5.2. См. условие примера 1.

Постановка задачи

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения: нет.

4.Блок-схема алгоритма, в которой используется цикл с предусловием:

5.Описание блок-схемы:

Блок 2 – ввод исходных данных. Блок 3 – подготовка к циклу.

Блоки 4-7 – тело цикла с предусловием. Блок 4 – условие входа в цикл.

Блок 7 – изменение параметра цикла х.

3

ÓЕфименко К.Н.

5. Текст программы: int main()

{

float x, y, xn, xk, dx; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx; x=xn;

while (x<=xk)

{

y=exp(sin(x))*cos(x); cout<<"x="<<x<<"\t y="<<y<<endl; x+=dx;

}//Конец тела цикла.

}

Результаты работы программы:

5.1.3. Цикл «Для» (цикл с параметром)

1

НАЧАЛО

2

Ввод xn, xk, Dx

3

x = xn

4

 

_

x ≤ xk

 

 

 

+

5

8

 

y=esin(x)cos(x)

 

КОНЕЦ

 

 

 

6

Вывод x,y

7

x = x + Dx

Цикл «Для» реализуется на основе блока модификации и представляет собой вариант цикла с предусловием, в котором часть действий по организации цикла выполняется автомати-

чески.

1

 

 

x = xn; x≤ xk; x=+Dx

 

4

 

2

 

3

ТЕЛО

 

 

ЦИКЛА

 

 

 

 

Цикл «Для» на основе блока модификации работает следующим образом:

При входе в блок модификации (линия 1) автоматически выполняются следующие действия. Параметру цикла x присваивается начальное значение xn и проверяется, не превышает ли оно конечного значения xk. Если результатом проверки условия является true, то происходит переход к выполнению тела цикла (линия 2). После этого осуществляется возврат в блок модификации (линия 3), увеличение параметра цикла x на значение шагаDx и проверка условия продолжения цикла и т.д. Когда текущее значение параметра циклаx превысит ко-

нечное значение xk, цикл завершит свою работу (линия 4).

1

x = xn

_

x ≤ xk

4

+ 2

ТЕЛО ЦИКЛА

3

x = x + Dx

4

ÓЕфименко К.Н.

Соответствующий этой структуре оператор С++ имеет вид:

for (нач_присваивания; условие; приращение) оператор;

где начальные_присваивания – оператор или группа операторов, которые выполняются один раз в начале цикла; применяются для присвоения начальных значений величинам, используемым в цикле, в том числе параметру цикла (подготовка к циклу); условие – определяет условие выполнения цикла, если значение выражения истинно (≠0), то цикл выполняется;

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

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

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

Если приращение или начальные_присваивания это не один оператор, а группа,

то они отделяются запятой, которая является операцией последовательного выполнения.

Принцип работы цикла с параметром for

1.Выполняются начальные_присваивания.

2.Вычисляется значение выражения, определяющего условие, если оно ≠0 (true), то выполняется переход к п.3. В противном случае, выполнение цикла завершается.

3.Выполняется оператор.

4.Выполняется оператор приращение и осуществляется переход к п.2, то есть опять вычисляется значение условия и т.д.

Если тело цикла состоит более чем из одного оператора, то используется составной опе-

ратор:

for (нач_прис; условие; приращение)

{

оператор_1;

оператор_n;

}

Пример 5.3. См. условие примера 5.1.

Постановка задачи

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения: нет.

4.Блок-схема алгоритма, в которой используется цикл «Для» на основе блока модификации:

1

НАЧАЛО

2

Ввод xn, xk, Dx

3

x = xn; x ≤ xk; x=+Dx

4 y=esin(x)cos(x)

5

Вывод x,y

6

КОНЕЦ

5

ÓЕфименко К.Н.

5. Описание блок-схемы:

Блок 2 – ввод исходных данных.

Блок 3 – блок модификации (заголовок цикла «Для»). Блоки 3-5 – тело цикла «Для».

6. Текст программы: Вариант 1

int main()

{

float x, y, xn, xk, dx; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx; for (x=xn;x<=xk; x+=dx)

{

y=exp(sin(x))*cos(x); cout<<"x="<<x<<"\t y="<<y<<endl;

}

}

Вариант 2 int main()

{

float x, y, xn, xk, dx; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx;

for (x=xn;x<=xk; y=exp(sin(x))*cos(x), cout<<"x="<<x<<"\t y="<<y<<endl,x+=dx);

}

Вариант 3 int main()

{

float x, y, xn, xk, dx; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx; x=xn;

for (;x<=xk;)

{

y=exp(sin(x))*cos(x); cout<<"x="<<x<<"\t y="<<y<<endl; x+=dx;

}

}

Результаты работы программы:

6

ÓЕфименко К.Н.

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

Количество шагов выполнения циклаN можно вычислить до начала работы алгоритма по формуле:

N =

ù xk - xn é

+1

ú

 

ê

Dx

 

û

ë

 

где ] [ обозначают целую часть выражения.

5.2. Операторы передачи управления

Операторы передачи управления принудительно изменяют порядок выполнения команд. Оператор break осуществляет немедленный выход из цикловwhile, do…while, for и из

оператора выбора switch. Управление передается оператору, находящемуся непосредственно за циклом или оператором выбора.

Оператор continue начинает новый шаг цикла, даже если предыдущий не был завершен. Оператор return выражение завершает выполнение функции и передает управление в

точку ее вызова.

К операторам передачи управления также относится оператор безусловного перехода

goto.

5.3. Проверка ограничений в

1

цикле

НАЧАЛО

 

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

ниться, и работа цикла пойдет -есте ственным путем.

Пример 5.4. Вычислить значения функции y=ecos(x)/sin(x), для каждого

значения х Î [0;1] с шагом Dx=0.2.

Постановка задачи

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения:

1) sin(x)≠0.

4. Блок-схема алгоритма:

 

 

2

 

Ввод

 

 

 

xn, xk, Dx

 

 

 

 

3

 

 

x = xn

 

 

 

 

 

 

+

4

 

 

 

sin(x)≠0

5

y=ecos(x)/sin(x)

7

6

Деление на 0

Вывод x, y

8

x = x + Dx

9

+

x ≤ xk

1

КОНЕЦ

7

ÓЕфименко К.Н.

5. Описание блок-схемы:

Блок 2 – ввод исходных данных. Блок 3 – подготовка к циклу.

Блоки 4-9 – тело цикла с постусловием. Блок 4 – проверка ограничения Блок 8 – изменение параметра цикла х. Блок 9 – условие входа в цикл.

6. Текст программы: int main()

{float xn, xk, dx, x, y; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx; x=xn;

do

{if (sin(x)!=0)

{y=exp(cos(x))/sin(x); cout<<"x="<<x<<"\t y="<<y<<endl; }

else cout<<"Divizion by zero"<<endl; x+=dx; }

while(x<=xk);

}

Пример 5.5 (лабораторная работа №4.1). Вычислить значения функции

ìtg2

(ax),

если х <1

ï

 

 

 

если 1 £ x £ 5

y = ía /(x + a),

ï

 

 

 

 

x

2 | a |,

если x > 5

ï

î

 

 

 

,

 

 

 

 

соответствующие каждому значению х из заданного интервала xn x xk с шагом Dx.

Постановка задачи

1.Исходные данные: a, хn, xk, Dx.

2.Выводимые результаты: x, y.

3.Ограничения:

1)cos(ax)≠0 – проверять;

2)x+a≠0 – проверять;

3)x2|a|³0 – не проверять.

4.Блок-схема алгоритма:

5.Текст программы:

int main()

{float a, xn, xk, dx, x, y; cout<<"Input a="; cin>>a; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx; x=xn;

do

{if (x<1)

if (cos(a*x)!=0) y=tan(a*x)*tan(a*x);

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ÓЕфименко К.Н.

else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{cout<<"No tg!"<<endl;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

goto m1; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

if (x>5)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y=sqrt(x*x*fabs(a));

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

if (x+a!=0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y=a/(x+a);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{cout<<"Divizion by zero"<<endl;

 

 

 

 

goto m1; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cout<<"x="<<x<<"\t y="<<y<<endl; }

 

 

 

 

m1: x+=dx; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

while(x<=xk);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

НАЧАЛО

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

Ввод a,xn,xk,Dx

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x = xn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

4

 

 

 

 

 

 

 

 

 

x < 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

5

 

+

 

 

 

8

 

cos(ax)≠0

 

 

 

 

x > 5

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

y = tg2(ax)

 

 

 

 

7

y =

x2 | a |

 

+

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x+a≠0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tg не суще-

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ствует

 

 

 

 

 

 

 

y = a/(x+a)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

 

 

 

 

 

 

 

 

A

 

 

 

13

 

 

 

 

 

 

 

 

Деление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

на 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод x, y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

A

 

 

x = x + Dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

x ≤ xk

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

КОНЕЦ

 

 

 

 

9

ÓЕфименко К.Н.

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

При нахождении суммы, произведения или количества значений, полученных при каждом выполнении тела цикла, используется принцип пошагового накапливания величин. Для хранения таких «накапливающихся» величин используются дополнительные переменные, которым предварительно необходимо присвоить начальные значения. Обычно это делается на этапе подготовки к выполнению цикла. В качестве начального значения для суммы (S) и количества (k) используется ноль, для произведения (P) – единица.

//Присваивание начальных значений

S=0; k=0; P=1;

//Накапливание значений в теле цикла

S=S+Имя_переменной; //S+=Имя_переменной; k=k+1; //k++; P=P*Имя_переменной; //P*=Имя_переменной;

Пример 5.6. Вычислить значения выражения у = 2∙x + 1, соответствующие каждому значению х из заданного интервала [-2;2] с шагом Dx=1. Найти количество (k) вычисленных значений y; сумму (S) значений y, которые ≤ 0 ( S = åy ) и произведение (Р) значений y, которые > 0

y£0

( P = Õy ).

y>0

Постановка задачи

1.Исходные данные: хn, xk, Dx.

2.Выводимые результаты: x, y, S, k, P.

3.Ограничения: нет.

4.Блок-схема алгоритма:

НАЧАЛО

Ввод xn, xk, Dx

x = xn; S=0; k=0; P=1

у = 2∙x + 1

Вывод x, y

 

 

k = k + 1

 

+

 

 

 

 

 

 

 

 

y≤0

 

 

 

 

 

S = S + y

 

 

 

P = P ∙ y

 

 

 

 

 

x = x + Dx

Вывод

S, k, P

+

x ≤ xk

КОНЕЦ

10

Соседние файлы в папке 1й курс