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

5.5. Составная инструкция

В языке Basic такой инструкции нет по той же причине, что и пустой инструкции.

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

Формат:

{<инструкция>;[<инструкция>;]...}

Пример. Найти x=max(a, b), y=min(a, b).

if(a>b){

x=a; y=b;

}else{

x=b; y=a;

}

5.6. Циклы

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

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

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

Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

C

u=v=0; i=0; // Инициализация цикла

begin: if(i>=100) goto end; // Условие окончания

if(a[ i ]>0)u+=a[ i ]; if(a[ i ]<0)v+=a[ i ]; // Тело цикла

i++; // Изменение условия

goto begin; // Переход к началу

end: ;

Basic

u=0 : v=0 : i=0 ' Инициализация цикла

begin: if i>=100 then goto konec ' Условие окончания

if a( i )>0 then u+=a(i) ' Тело

if a( i )<0 then v+=a(i) ' цикла

i+=1 ' Изменение условия

goto begin ' Переход к началу

konec: ..................................

Дано: {ai}, i=1...100. Найти y=max{ai} и его номер.

С

MaxElem=a[0]; NumbMaxElem=i=1; // Инициализация цикла

Begin: if(i>=100) goto End; // Условие окончания

if(MaxElem<a[ i ]){ // Тело

MaxElem=a[ i ]; NumbMaxElem=i+1; //

} // цикла

i++; // Изменение условия

goto Begin; // Переход к началу

End: ;

Basic

MaxElem=a(0) : NumbMaxElem=1 : i=1 ' Инициализация цикла

Begin: if i>=100 goto Konec ' Условие окончания

if MaxElem<a(i) then MaxElem=a(i) : NumbMaxElem=i+1' Тело цикла

i+=1 ' Изменение условия

goto Begin ' Переход к началу

Konec: ...........................................

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

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

MaxElem=a(0) : NumbMaxElem=1 : i=1

Begin: if MaxElem<a(i) then MaxElem=a(i) : NumbMaxElem=i+1

i+=1

if i<100 goto Begin

Konec: ...........................................

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

Наиболее употребительный тип инструкции цикла. Существует несколько форм таких инструкций и в языке C, и в языке Basic. Назовем их условно циклы while и циклы for.

Циклы while

C

Формат:

while(<условие>)<инструкция>;

Эквивалентная схема:

label: if(<условие>)<инструкция>; goto label;

...........................................................................

Замечания.

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

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

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

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

Пример. Найти xn/n!,n=1,2,..., пока |un|>5e-6.

Рекуррентное соотношение: un/un-1=xn*(n-1)!/xn-1*n!=x/n un=un-1*x/n

s=0;

u=n=1;

while(fabs(u)>5e-6){

u *= x/n;

s += u;

n++;

}

Basic

Формат:

do while <условие>

<инструкции>

loop

Пример. Тот же.

s=0 : u=1 : n=1

do while abs(u)>5e-6

u *= x/n

s += u

n += 1

loop

Допустима другая разновидность этой инструкции:

do until <условие>

<инструкции>

loop

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

Пример.

s=0 : u=1 : n=1

do until abs(u)<=5e-6

u *= x/n

s += u

n += 1

loop

Есть еще 1 инструкция, более похожая на инструкцию языка C:

while <условие>

<инструкции>

end while

Работает так же, как инструкция do while ... loop. Различие между ними будет рассмотрено ниже.

Рекомендация. Циклы while разумно применять в тех случаях, когда:

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

- неизвестна закономерность повторений или она сложна.

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