Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






О п е р а т о р ц и к л а с п р е д у с л о в и е м






 

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

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

 

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

 
 

 


Схема выполнения оператора while:

 
 

 


В цикле вычисляется выражение. Если его значение отлично от нуля (true), то выполняется оператор, и вычисление выражения повторяется. Этот цикл продолжается до тех пор, пока выражение не станет равным нулю (false), после чего вычисления продолжатся с точки, расположенной сразу за оператором. Таким образом, оператор после слова while выполняется нуль или более раз. Чтобы цикл не был бесконечным (случай " зацикливания"), значение выражения в операторе должно изменяться таким образом, чтобы оно стало равным false.

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

 

Пример 1. Зацикливание программы.

x=10;

while (x> 0)

{

y=x+1; z=y-2;

}

 

Пример 2. Алгоритм Евклида (Evklid2)

int main()

{ // программа Evklid2

unsigned int m, n, d, r;

//Ввод значения m, n

if (m< n)

{ r=m; m=n; n=r; }

while (n> 0)

{ r=m % n; m=n; n=r; }

d=m;

//Печать результата

getch();

return 0;

}

В программе Evklid1 не учтено, что при вводе данных могут быть заданы значения m< n. В этом случае будет производиться лишнее деление. В программе Evklid2 сравниваются введенные значениям и приводятся к требуемому соотношению m> n.

Если в данном примере введено m = 10, n = 0, то цикл while ни разу не выполняется, и в результате получаем d = 10.

 

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

 

 
 

 


Пример 3. Модификация алгоритма Евклида.

 

int main()

{ // программа Evklid2

unsigned int m, n, d;

//Ввод значения m, n

while ((m> 0) & & (n> 0))

if (m> n)

m=m % n;

else

n=n % m;

d=m+n;

//Печать результата

getch();

return 0;

}

 

 

Программы Evklid2 и Evklid2a можно считать равноценными по быстродействию (компьютерный эксперимент показывает, что программа Evklid2a работает примерно на 7% быстрее по сравнению с программой Evklid2).

 

Пример 4. Определить, сколько раз число b является сомножителем числа a.

 

Если числа a или b равны 0, то задача не имеет решения. Определяется переменная kol, как счетчик количества вхождений числа b в сомножители числа a. Пока a делится на b без остатка, в цикле вычисляется частное, а к счетчику прибавляется 1. Перед циклом счетчик устанавливается в 0 (обнуляется).

 

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

 

 
 

 

 


Си-программа.

 

int main()

{

unsigned int a, b, kol;

//Ввод значения a, b

if (a==0 || b==0)

printf(" \n Нет решения \n");

else

{

kol=0;

while (a%b==0)

{

kol++; a=a/b;

}

}

//Печать kol

getch();

return 0;

}

 

В приведенном решении присутствуют 2 неточности:

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

2. В приведенной программе не учтен вариант, когда числа могут быть отрицательными. В этом случае надо работать с модулями введенных значений. Модуль целочисленной переменной возвращает функция abs(), которая объявлена в заголовочном файле “math.h”.

 

#include < math.h>

...

int main()

{

int a, b, kol, a1, b1;

//Ввод значения a, b

if (a==0 || b==0)

printf(" \n Нет решения \n");

else

{

kol=0; a1=abs(a); b1=abs(b);

while (a1%b1==0)

{

kol++; a1=a1/b1;

}

}

//Печать kol

getch();

return 0;

}

 

Пример 5. Распечатать цифры целого числа a в обратном порядке.

В разделе «Системы счисления» рассматривался алгоритм получения цифр в 2, 8, 16-ой системах счисления. Если осуществлять деление на 10, будут выделяться 10-цифры из заданного числа в обратном порядке. Этот алгоритм является основой для решения задачи. Предварительно берется модуль числа, для обработки и отрицательных значений.

 

Си-программа

 

int main()

{

int a, d, a1;

//Ввод значения а

a1=abs(a);

while (a1! = 0)

{

d = a1 % 10; a1 = a1 / 10;

printf(" %1d", d);

}

getch();

return 0;

}

Блок-схема.

 
 

 


Недостаток приведенного решения заключается в том, что при а=0 ничего не будет напечатано.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.