Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка КОС часть 2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.43 Mб
Скачать

Лабораторная работа № 4 Программирование процессов с циклической структурой

Цель работы: овладение практическими навыками разработки алгоритмов и программ с циклической структурой на языках Turbo Pascal и Си/С++:

  1. Изучить синтаксис операторов цикла.

  2. Рассмотреть циклические конструкции: циклы с предусловием и постусловием, циклы с параметром.

  3. Научиться составлять циклические программы.

Теоретический материал

Операторы цикла

Циклом называется многократно исполняемый участок алгоритма (программы). Соответственно циклический алгоритм — это алгоритм, содержащий циклы.

Различают два типа циклов: с известным числом повторений и с неизвестным числом повторений. При этом в обоих случаях имеется в виду число повторений на стадии разработки алгоритма.

Существует 3 типа циклических структур:

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

  • Цикл с послеусловием;

  • Цикл с параметром;

Иначе данные структуры называют циклами типа «Пока», «До», «Для».

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

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

Рис. 4.1

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

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

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue, return и goto (см. л.р. № 3). Передавать управление извне внутрь цикла не рекомендуется.

Циклы в Си/С++

В Си/C++ есть три разных оператора цикла — while, do while и for.

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

Цикл с предусловием реализует структурную схему, приведенную на рис. 4.1.(а).

Синтаксис:

while (УсловиеВыполнения)

{

// Инструкции цикла (тело цикла)

}

Выражение УсловиеВыполнения определяет условие повторения тела цикла, представленного простым или составным оператором. Выполнение оператора начинается с вычисления выражения. Если оно истинно (не равно false), выполняется оператор цикла.

Если при первой проверке выражение равно false, цикл не выполнится ни разу. Тип выражения должен быть арифметическим или приводимым к нему.

Выражение вычисляется перед каждой итерацией цикла.

Пример 1. Программа печатает таблицу значений функции f = х^2+1 во введенном диапазоне.

# include <iostream.h>

# include <math.h>

# include <conio.h>

void main (){

clrscr();

float n,k,d;

cout <<"VVedite nachalo, konec i shag izmeneniy";

cin >> n>>k>>d;

float i=n;

while (i<=k) {

cout<<" "<<(pow(i,2)+1);

i=i+d;}

getch();

}

Распространенный прием программирования — организация бесконечного цикла с заголовком while (true) либо while (1) и принудительным выходом из тела цикла по выполнению какого-либо условия.

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

Областью ее действия является цикл: while (int х = 0){ ... / * область действия х */ }

Цикл с постусловием (do while)

Цикл с постусловием реализует структурную схему, приведенную на рис. 4.1(б).

Синтаксис:

do

{

/ / Инструкции цикла (тело цикла)

}

while (УсловиеПовторения);

Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение УсловиеПовторения. Если оно истинно (не равно false), тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.

Тип выражения должен быть арифметическим или приводимым к нему.

Пример 2. Программа осуществляет проверку ввода.

# include <iostream.h>

# include <math.h>

# include <conio.h>

void main (){

clrscr();

char answer;

do {

cout <<"Kypi clona!";

cin >>answer;}

while (answer !='y') ;

}

Цикл с параметром (for)

Синтаксис:

for (Инициализация; УсловиеВыполнения; Изменение)

{

// Здесь инструкции цикла (тело цикла)

}

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой (операцией «последовательное выполнение»), например, так:

for (int 1 = 0, j = 2; …

int к, m;

for (k = 1, m = 0; …

Областью действия переменных, объявленных в части инициализации цикла, является цикл. Инициализация выполняется один раз в начале исполнения цикла.

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

Цикл с параметром реализован как цикл с предусловием. Сам оператор for - это оператор цикла, обобщающий оператор while. Так же, как и в случае оператора while, тело цикла может состоять из одного оператора или из группы операторов, заключенных в фигурные скобки. Инициализирующая и реинициализирующая части могут быть любыми отдельными выражениями.

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

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

Пример 3. Реализовать задачу из примера 1 через цикл for.

# include <iostream.h>

# include <math.h>

# include <conio.h>

void main (){

clrscr();

float n,k,d,i;

cout <<"VVedite nachalo, konec i shag izmeneniy ";

cin >> n>>k>>d;

for (i=n; i<=k; i+=d) {

cout<<" "<< (pow(i,2)+1);

}

getch();

}

Любой цикл while может быть приведен к эквивалентному ему циклу for и наоборот по следующей схеме:

for (i; j; k) оператор i;

while (j){

оператор;

k;}

Часто встречающиеся ошибки при программировании циклов — использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.

Чтобы избежать ошибок, рекомендуется:

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

• проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;

• предусмотреть аварийный выход из цикла по достижению некоторого количества;

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

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

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

  • Число повторений инструкций цикла do while определяется ходом выполнения программы;

  • инструкции цикла do while выполняются до тех пор, пока значение выражения, записанного после слова while, не станет равным нулю;

  • после слова while надо записывать условие выполнения инструкций цикла;

  • для завершения цикла do while в теле цикла обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла;

  • цикл do while — это цикл с постусловием, т. е. инструкции тела цикла будут выполнены хотя бы один раз.

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

  • инструкции цикла while выполняются до тех пор, пока значение выражения, записанного после слова while, не станет равным нулю;

  • после слова while надо записывать условие выполнения инструкций цикла;

  • для завершения цикла while в теле цикла обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла;

  • цикл while — это цикл с предусловием, т. е. возможна ситуация, при которой инструкции тела цикла ни разу не будут выполнены;

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

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

  • инструкция for используется для организации циклов с фиксированным, известным во время разработки программы, числом повторений;

  • количество повторений цикла определяется начальным значением переменной-счетчика и условием завершения цикла;

  • переменная-счетчик должна быть целого (int) типа и может быть объявлена непосредственно в инструкции цикла.

Циклы в TPascal

Цикл с предусловием (иначе цикл пока) имеет вид:

Форматы записи операторов алгоритма

Блок-схема

Форматы записи операторов на Паскале

Пока (условие)

нц

серия команд

кц

while условие do

begin

            серия команд;

end;

где

условие – выражение логического типа.

Цикл может не выполняться ни разу, если значение логического выражения сразу же оказывается ложным.

Серия команд, находящихся между begin и end, выполняются до тех пор, пока условие истинно.

Для того чтобы цикл завершился, необходимо, чтобы последовательность инструкций между BEGIN и END изменяла значение переменных, входящих в условие.

Цикл с постусловием (иначе цикл до) имеет вид:

Форматы записи операторов алгоритма

Блок-схема

Форматы записи операторов на Паскале

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

repeat серия команд

until условие

где

условие – выражение логического типа.

Обратите внимание:

Последовательность инструкций между repeat и until всегда будет выполнено хотя бы один раз;

Для того чтобы цикл завершился, необходимо, чтобы последовательность операторов между repeat и until изменяла значения переменных, входящих в выражение условие.

Инструкция repeat, как и инструкция while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов заранее не известно и определяется самим ходом вычисления.

Цикл с параметром (иначе цикл для) имеет вид:

Форматы записи операторов алгоритма

Блок-схема

Форматы записи операторов на Паскале

Для i от а до b шаг h

делай

      Нц

           Серия команд

      кц 

h = +1

for i:= a to b do

     begin

       серия команд

     end;

h = -1

for i:= b downto a do

     begin

       Cерия команд;

     end;

где

i – параметр цикла;

a – начальное значение цикла;

b – конечное значение цикла;

h – шаг изменения параметра.

Структура данного цикла иначе называют циклом i раз.

Заголовок оператора повтора for определяет:

- диапазон изменения параметра цикла и число повторений тела цикла;

- направление изменения параметра цикла (возрастание (+1) for..to..do и убывания (-1) for..down to.. do) на единицу (шаг изменения параметра) при каждом повторе.

Эта команда выполняется таким образом: параметру i присваивается начальное значение а, сравнивается с конечным значением b и, если оно меньше или равно конечному значению b, выполняется серия команд. Параметру присваивается значение предыдущего, увеличенного на величину h – шага изменения параметра и вновь сравнивается с конечным значением b.

Если между begin и end находится только один оператор, то операторные скобки можно не писать. Это правило работает для цикла типа «Пока» и «Для».

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

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

Например:

Var

I:integer;{описание переменных цикла}

Begin

for I: = -3 to 3 do write (i); {-3 -2 – 1 0 1 2 3}

for I: = 3 down to –3 do write (i); {-3 -2 -1 0 1 2 3}

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

for j:= x+2 down to x-2 do

Begin

A:=j/2;

Write1n (a)

End;

Допустимо применять вложенные циклы, например:

for I: = 1 to 10 do

for j: = 1 to 5 do F [i,j] : = 0; {обнуление элементов матрицы}

Если телом цикла является циклическая структура, то такие циклы называются вложенными. Цикл, содержащий в теле цикла другой цикл, называется внешним циклом. Цикл, входящий в тело другого цикла называется внутренним циклом. Внутренние и внешние циклы могут быть трех видов: циклами с предусловием while, циклами с постусловиями repeat или циклами с параметром for.

Рассмотрим пример решения задач с использованием данных структур

Пример 4.

Вычислить произведение чисел от 1 до 5 используя различные варианты цикла

Математическая модель:

Р= 1· 2· 3· 4· 5=120

Составим алгоритм в виде блок-схемы.

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

Шаг

Операция

Р

i

Проверка условия

1

P:=1

1

 

 

2

i:=1;

1

1

 

3

i<=5

P:=P*I

i:=i+1

1

1

1<=5, да (истина)

4

i<=5

P:=P*I

i:=i+1

2

2

2<=5, да (истина)

5

i<=5

P:=P*I

i:=i+1

6

3

3<=5, да (истина)

6

i<=5

P:=P*I

i:=i+1

24

4

4<=5, да (истина)

7

i<=5

P:=P*I

i:=i+1

120

5

5<=5, да (истина)

8

i<=5

P:=P*I

i:=i+1

 

 

6<=5, нет (ложь)

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

Шаг первый: Р присваивается значение один.

Шаг второй: i присваивается значение один.

Шаг третий: при i равном единице проверяем условие один меньше или равен пяти, да, условие истинно, значит Р присваивается значение один умноженное на один, будет два. Для i: один плюс один, будет два.

Шаг четвертый: при i равном двум проверяем условие два меньше или равен пяти, да, условие истинно, значит Р присваивается значение 2 умноженное на один, будет 2. Для i: два плюс один, будет три.

Шаг пятый: при i равном трем проверяем условие три меньше или равен пяти, да, условие истинно, значит Р присваивается значение два умноженное на три, будет шесть. Для i: три плюс один, будет четыре.

Шаг шестой: при i равном четырем проверяем условие четыре меньше или равен пяти, да, условие истинно, значит Р присваивается значение шесть умноженное на четыре, будет двадцать четыре. Для i: четыре плюс один, будет пять.

Шаг седьмой: при i равном пяти проверяем условие пять меньше или равен пяти, да ,условие истинно, значит Р присваивается значение двадцать четыре умноженное на пять, будет сто двадцать. Для i: пять плюс один, будет шесть.

Шаг восьмой: при i равном шести проверяем условие шесть меньше или равен пяти, нет, условие ложно, тогда мы выходим из цикла, а в результате получаем последнее значение равное сто двадцати.

Program Pr1;

Var i: integer;

Begin

P:=1;

i:=1;

While i<=5 do

       begin

           P:=P*i;

           i:=i+1;

       end;

Write (‘P=’, P);

end.

Пример 5.

Вычислить и вывести на экран значение заданной функции

t=2.2, xЄ[0.2;2], Δx=0.2.

Значение функции вычислять многократно при изменении аргумента в указанном диапазоне и с заданным шагом Δx. Организовать вывод значения аргумента и вычисленного значения функции в виде таблицы.

1. Блок-схема.

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

Program Lab4_for;

Const dx=0.2;t=2.2;

Var x0,xk,z,x:real;

n,i:byte;

Begin

Writeln('Введите x0,xk');

Read(x0,xk);

Writeln('Таблица функции z(x)');

Writeln(' x y');

n:=trunc((xk-x0)/dx)+1;

x:=x0;

for i:=1 to n do

begin

If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)

else if x=0.5 then z:=sqrt(x+t)+1/x

else z:=cos(x)+t*(sqr(sin(x)));

Writeln(x:6:3,' ',z:6:3);

x:=x+dx;

end;

End.

2. Блок-схема.

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

Program Lab4_repeat;

Const dx=0.2;t=2.2;

Var x0,xk,z,x:real;

Begin

Writeln(' Введите x0,xk');

Read(x0,xk);

Writeln('Таблица функции z(x)');

Writeln(' x y');

x:=x0;

Repeat

If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)

else if x=0.5 then z:=sqrt(x+t)+1/x

else z:=cos(x)+t*(sqr(sin(x)));

Writeln(x:6:3,' ',z:6:3);

x:=x+dx;

Until x>xk;

End.

3. Блок-схема.

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

Program Lab4_while;

Const dx=0.2;t=2.2;

Var x0,xk,z,x:real;

Begin

Writeln(' Введите x0,xk');

Read(x0,xk);

Writeln(' Таблица функции z(x)');

Writeln(' x y');

x:=x0;

while x<=xk do

begin

If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)

else if x=0.5 then z:=sqrt(x+t)+1/x

else z:=cos(x)+t*(sqr(sin(x)));

Writeln(x:6:3,' ',z:6:3);

x:=x+dx;

end;

End.

Таблица функции z(x)

x y

0.200 -3.091

0.400 -1.606

0.600 1.527

0.800 1.829

1.000 2.098

1.200 2.273

1.400 2.306

1.600 2.169

1.800 1.859

2.000 1.403

Пример 6.

Вычислить:

При вычислении конечной суммы следует организовать цикл, в котором число повторений равно количеству слагаемых. Перед началом цикла переменную суммы обнуляют S:=0. Тело цикла должно содержать вычисления очередного слагаемого А и рекуррентного соотношения:

S:=S+A.

К переменной суммы S прибавляется переменная А, результат вычисления присваивается переменной S.

Вычисление произведения конечного числа элементов аналогично, начальному значению произведения присваивается значение единицы P:=1, а в рекуррентной формуле меняется знак:

P:=P*A.

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

Обозначим результаты вычисления произведения по параметру i - через P1, результат вычисления суммы по параметру j - через S1, результат вычисления суммы по параметру k - через S2, результат произведения по параметру l-через P2.

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

program lab_4;

var

p1, s1, s2, p2: real; i, j, k, l: integer;

begin

p1:=1;

for i:=1 to 4 do

begin

s1:=0;

for j:=1 to 6 do

begin

s2:=0;

for k:=2 to 11 do s2:=s2+sqr(k);

p2:=1;

for l:=1 to 3 do p2:=p2*l;

p2:=sin(p2);

s1:=s1+i+j-sqrt(s2+p2);

end;

p1:=p1*(sqr(i)+s1);

end;

writeln (`s= `, p1:6:3);

end.

Методические рекомендации к выполнению лабораторной работы

Отчет к лабораторной работе оформляется в текстовом редакторе MS Word в формате А4 и должна содержать:

1. Цель работы.

2. Задание (3 задачи – на использование циклов «до», «пока» и «для»).

3. Графические схемы алгоритмов с учетом требований ГОСТ 19.701-90 (в редакторе Visio).

4. Программы на Тuгbо Раscаl и Си/С++.

5. Результаты выполнения работы.

ВАРИАНТЫ ЗАДАНИЙ

№ вар

Цикл типа «для»

Циклы типа «пока» и «до» выполняются по одному заданию.

a, b, c – действительные числа. Значения a, b, c, Хнач, Хкон и dX ввести с клавиатуры

1

Y=

2

Y=

3

Y=

4

Y=

5

Y=

6

Y=

7

Y=

8

Y=

9

Y=

10

Y=

11

Y=

12

Y=

13

Y=

14

Y=

15

Y=

16

Y=

17

Y=

18

Y=

19

Y=

20

Y=

21

Y=

22

Y=

23

Y=

24

Y=

25

Y=

26

Y=

27

Y=

28

Y=

29

Y=

30

Y=

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

  1. Перечислите операторы циклов, используемых в языках ТР и Си/С++.

  2. В чем разница между операторами типа «пока» и «до»?

  3. Запишите общую структуру оператора цикла.

  4. В каких случаях предпочтительно использовать для организации циклов оператор повтора for?

  5. Формат записи и блок-схема оператора for.

  6. К какому типу данных принадлежат параметр цикла, его начальное и конечное значение?

  7. Что такое вложенные циклы? Какие циклы называются внешними и внутренними?