Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_лекций_Ч_2.doc
Скачиваний:
26
Добавлен:
26.05.2015
Размер:
156.16 Кб
Скачать

Тема 14. Реализация циклических алгоритмов.

Оператор цикла for.

Синтаксис оператора цикла for:

for (начальное значение ; условие окончания цикла ; шаг итерации) { тело цикла; }

Ну а вот реальный пример цикла:

for (int i = 0; i < 10; i++){ //тело цикла ; }

Т.е. задали начальное значение, равное 0; определили условие окончания оператора цикла (i < 10); и выбрали шаг итерации (i++). Причем ни какой из параметров цикла не является обязательным. Т.е. можно и вот так записать цикл for:

for ( ; ; ){ //тело; }

Правда это выйдет бесконечный цикл.

Примеры:

  1. Вывести первые 10 чисел

int chislo = 0;

for (; chislo < 10; chislo++){ printf ("%d\t", chislo); }

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

int chislo;

scanf ("%d", &chislo);

for (int i = 0; i < chislo; i++){ printf ("%d\t", chislo); }

Инициализировать(задать первоначальные значения) переменные можно в самом начальном значении. Это очень удобно, так как созданная переменная имеет область действия только лишь - оператор цикла for.

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

for (int a = 5, int b = 0 ; a < 9 || b > 4 ; ){ //тело; }

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

Примеры:

  1. Подсчитать количество натуральных чисел n ( 102 < n > 987 ), в которых все три цифры различны

#include <iostream.h>

#include <conio.h>

int main(int argc, char* argv[])

{

int edinici, decjatki, sotni, tri_razlichni=0;

for (int n=102; n < 967; n++) {

sotni = n / 100;

decjatki = (n % 100)/10;

edinici = n % 10;

if (sotni != decjatki != edinici)

tri_razlichni++;

}

cout << "Всего различных: " << tri_razlichni << "чисел";

getch();

return 0;

}

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

#include <stdio.h>

#include <conio.h>

int main()

{ int a, count=0;

printf ("Vvedite luboe chislo:");

scanf ("%d",&a);

for (int i=2; i<a; i++){ if (a%i == 0) count++; }

if (count == 0 )

printf ("chislo prostoe\n");

else

printf("Chislo ne prostoe\n");

}.

Оператор цикла do — while ( с предусловием | постусловием ).

Конструкция оператора цикла while с предусловием:

Синтаксис:

while (условие){ //тело цикла }

Цикл while с предусловием, в принципе, действует, так: пока условие истинно (TRUE), то будет выполняться тело цикла.

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

do { //тело }

while (условие);

Тут не важно, будет ли условие истинно (TRUE ) или ложно (FALSE), но тело оператора цикла хоть раз да выполнится. Это иногда очень важно.

Пример:

  1. Введите с клавиатуры число, если оно меньше 5, то выведите его и с помощью инкрементации все числа, пока значение введенного числа не будет равно 5. Если же число будет сразу больше 5, то просто выведите его.

int chislo;

scanf("%d", &chislo);

do { printf ("%d",chislo++); }

while (chislo < 5);

Оператор continue.

Оператор continue просто прекращает текущую итерацию.

Пример:

  1. Вводим числа с клавиатуры, если число больше нуля, то выводим на экран сообщение: Число положительное, если меньше, то - Число отрицательное. Если, вдруг, оказывается, что мы ввели 0, то продолжаем дальше вводить значения. Условием выхода из цикла будет значение -13.

#include <conio.h>

#include <stdio.h>

int main()

{ int chislo;

for ( ; ; ){ scanf ("%d", &chislo);

if (chislo == -13)

break;

if (chislo == 0)

continue;

if ( chislo > 0 )

printf ("Число положительное");

if (chislo < 0)

printf ("Число отрицательное");

}

getch();

return 0;

}

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

Во всех операторах if нет фигурных скобок, так как в их теле всего-навсего размещен один оператор.

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

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

Что такое рекурсия?

Циклические алгоритмы можно реализовать еще одним способом- рекурсией.

Так что такое рекурсия? Рекурсия - это вид функции, которая вызывает саму себя.

Пример рекурсии:

#include <conio.h>

#include <stdio.h>

int sum (int temp){ int i=0;

if (temp == 0) return temp;

else return temp+sum(temp-1);

}

int main()

{ printf ("%d", sum(5));

getch();

return 0;

}

Этот пример рекурсивной функции ( рекурсии ) выводит сумму чисел до введенной в аргументе. Суть рекурсивной функции ( рекурсии ) тут состоит в том, что пока наше число не равно нулю, мы будем накапливать полученное число в аргументе и передавать в эту же функцию число, но на единицу меньшее. Т.е. на первом шаге мы в накоплении оставим 5, а передадим 4, далее мы к 5 прибавляем 4, а передаем 3. Вот как действует наша рекурсия.