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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

while (условие) оператор;

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

Обратите внимание, что условие обязано стоять в скобках, так же, как для оператора if. Если операторов тела цикла несколько, нужно ставить их в операторные скобки {...}.

Цикл while выполняется до тех пор, пока истинно (не равно нулю) условие. Таким образом, в следующем фрагменте:

int a=0;

while (a<10) a++; // цикл №1

while (a>10) a--; // цикл №2

while (a<10) a=0; // цикл №3

цикл № 1 выполнится 10 раз, цикл № 2 ни одного раза, а цикл № 3 будет выполняться бесконечное количество раз.

Бесконечным или вечнымциклом (зацикливанием) называется цикл, число шагов которого не ограничивается условием.

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

while (1) оператор;

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

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

Пример. Программа для подсчета отрицательных чисел. Командой выхода будет ввод нуля.

#include <stdio.h>

void main ()

{

int x, count=0;

printf("Вводите целые числа\n");

printf("Выход - по вводу нуля\n");

while (1)        // используем вечный цикл

{

scanf("%d", &x);

if (x<0) count++;

if (x==0) break; // выходим из цикла

}

printf("Вы ввели %d отрицательных чисел\n", count);

}

Ту же задачу можно решить более изящным образом – без зацикливания:

#include <stdio.h>

void main ()

{

int x=1, count=0;

printf("Вводите целые числа \n");

printf("Выход - по вводу нуля\n");

while (x!=0)

{

scanf("%d", &x);

if (x<0) count++;

}

printf("Вы ввели %d отрицательных чисел\n", count);

}

Пример. Программа для подсчёта количества и суммы цифр во введённом натуральном числе.

#include <stdio.h>

void main()

{

long int n;      // n – вводимое число

int k=0, S=0, p; // k – количество цифр, S – сумма цифр

printf("Введите натуральное число\n");

scanf("%li", &n);

while (n!=0)

{

p=n%10;

S=S+p;

k++;

n/=10;

}

printf("В данном числе %d цифр\n", k);

printf("Сумма цифр равна %d \n", S);

}

Пример. Программа для решения задачи: «Стоимость буханки хлеба на данный момент 4 рубля, пакета молока – 3 рубля. Каждый месяц цена на хлеб повышается на 10%, а на молоко – на 15%. Через сколько месяцев буханка хлеба будет стоить дешевле пакета молока?».

#include <stdio.h>

void main()

{

int n=0;

float h=4.0, m=3.0;

while (m<=h)

{

h=1.1*h; // тоже самое, что h=h+0.1*h

m=1.15*m; // тоже самое, что m=m+0.15*m

n++;

}

printf("Через %d месяцев\n", n);

}

Пример. Программа нахождения наибольшего общего делителя двух натуральных чисел.

Алгоритм Евклида нахождения наибольшего общего делителя (НОД) двух целых неотрицательных чисел: Пусть x и y – одновременно не равные нулю целые неотрицательные числа, и пусть xy. Если y = 0, то НОД(x, y) = x, а если y ≠ 0, то для чисел x, y и r, где r – остаток от деления x на y, выполняется равенство НОД(x, y) = НОД(y, r).

Например, пусть x = 48, а y = 18. НОД(48, 18) = НОД(18, 12) = НОД(12,6) = НОД(6, 0) = 6.

#include <stdio.h>

void main()

{

int a, b;

printf("Введите два натуральных числа \n");

scanf("%d%d",&a,&b);

while (a!=0 && b!=0)

if (a>b) a=a%b;

else b=b%a;

printf("НОД этих чисел равен %d\n", a+b);

}

Пример. Найти сумму ряда , пока члены ряда больше eps >0.

#include <stdio.h>

void main()

{

int n=1;

float S=0.0, eps;

printf("Введите eps >0\n");

scanf("%f", &eps);

while (1.0/(n*n)>eps)

{

S=S+1.0/(n*n);

n++;

}

printf("Сумма ряда S = %f\n", S);

}

Результат работы программы:

Введите eps >0

0.001

Сумма ряда S = 1.613191

Press any key to continue

Введите eps >0

0.0001

Сумма ряда S = 1.634984

Press any key to continue

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

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

В языке С++ синтаксис цикла с постусловием таков:

do

оператор;  

while (условие);

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

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

Как цикл с предусловием, цикл do...while выполняется до тех пор, пока условие остается истинным. Таким образом, в следующем фрагменте:

int a=0;

do a++; while (a<10); // цикл №1

do a--; while (a>10); // цикл №2

do a=0; while (a<10); // цикл №3

В этом примере цикл №1 выполнится 10 раз, цикл №2 – один раз (!), а цикл №3 – опять вечный.

Пример. Программа для подсчета нечетных чисел. Командой выхода будет ввод нуля.

#include <stdio.h>

void main ()

{

int x, count=0;

printf("Вводите целые числа, а я буду считать нечетные\n");

printf("Выход - по вводу нуля\n");

do

{ scanf("%d", &x);

if (x%2!=0) count++; }

while (x!=0);

printf("Вы ввели %d нечетных чисел\n", count);

}

Пример. Программа поиска первого числа Фибоначчи, большего m (m >1).

Последовательность Фибоначчи образуется так: первый и второй члены последовательности равны 1, каждый следующий равен сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, …).

#include <stdio.h>

void main()

{

int m, a=1, b=1, c;

printf("Введите натуральное число, большее 1\n");

scanf("%d",&m);

do

{ c=a+b;

  a=b;

b=c; }

while (c<=m);

printf("Искомое число Фибоначчи равно %d\n", c);

}

Вложенные циклы

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

Циклы закрываются по "принципу матрешки": первый цикл закрывается последним. Вот так:

while (...)

{   // while-начало

for (...)  

{ // for-начало

} // for-конец

}   // while-конец

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

1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

#include <stdio.h>

void main()

{

for (int i=1; i<=4; i++)  // меняется по строкам

{

for (int j=1; j<=5; j++) // меняется по столбцам

printf("%2d", j); // вывод нескольких столбцов

printf("\n");      // переход на следующую строку

}

}

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

 

1

2 2

3 3 3

4 4 4 4

5 5 5 5 5

#include <stdio.h>

void main()

{

for (int i=1; i<=5; i++)      

{

for (int j=1; j<=i; j++) printf("%2d", i);     

printf("\n");          

}

}

Пример. Программа для вывода на экран всех трехзначных чисел, сумма цифр которых равна заданному натуральному числу n .

1-й способ. Без использования вложенных циклов.

#include <stdio.h>

void main()

{

int n,x,a,b,c; // n – введенное число, x – трехзначное число

printf("Введите 1<=n<=27\n");

scanf("%d",&n);

for (x=100; x<=999; x++)

{

a=x/100;  // a – число сотен

b=x/10%10; // b – число десятков

с=x%10;   // c – число единиц

if (a+b+c==n) printf("%4d", x);

}

printf("\n");

}

2-й способ. С использования вложенных циклов.

#include <stdio.h>

void main()

{

int n,a,b,c;

printf("Введите 1<=n<=27\n");

scanf("%d",&n);

for (a=1; a<=9; a++)

for (b=0; b<=9; b++)

for (c=0; c<=9; c++)

   if (a+b+c==n) printf("%4d", a*100+b*10+c);

printf("\n");

}

Пример. Программа для графического изображения делимости чисел от 1 до n (n задается). В каждой строке отображается очередное число и столько плюсов, сколько делителей у этого числа. Например, если задано число 4, на экран будет  выведено:

1+

2++

3++

4+++

#include <stdio.h>

void main()

{

int n,i,d;

printf("Введите натуральное число n\n");

scanf("%d",&n);

for (i=1; i<=n; i++)

{

printf("%d",i);

for (d=1; d<=i; d++)

if (i%d==0) printf("+"); 

printf("\n");

}

}

Пример. Программа поиска простых чисел от 2 до 50.

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

1-й способ. Для каждого проверяемого числа num (внешний цикл от 2 до 50) вычисляется количество делителей (внутренний цикл от 1 до num). Если количество делителей равно двум, то это число простое, следовательно, оно выводится на экран.

#include <stdio.h>

void main()

{

int k;

for (int num=2; num<=50; num++) // num – проверяемое число

{

k=0;      // k – количество делителей числа

// delit – возможные делители

for (int delit=1; delit<=num; delit++)

if (num%delit==0) k++; 

if (k==2) printf("%3d", num);

}

printf("\n");

}

Результат работы программы:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Press any key to continue

2- й способ. Для каждого числа num (внешний цикл от 2 до 50) ищется первый делитель, больший 1 (внутренний цикл). Если найденный делитель равен самому числу, то это число простое, следовательно, оно выводится на экран.

#include <stdio.h>

void main()

{

int delit;

for (int num=2; num<=50; num++)    

{

delit=1;

do                 

delit++;

while (num%delit!=0);            

if (delit==num) printf("%3d", num);

}

printf("\n");

}

Данный вариант программы выполняется быстрее, чем предыдущий.

 



Поделиться:


Последнее изменение этой страницы: 2021-01-08; просмотров: 146; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.171.121 (0.039 с.)