Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
О п е р а т о р ц и к л а с п р е д у с л о в и е м
Циклом называется многократно выполняемый участок программы. Обычно для организации циклических программ используют операторы цикла. В Си определены три таких оператора: оператор цикла с предусловием 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 ничего не будет напечатано.
|