Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Цикл с предусловием (цикл 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 – одновременно не равные нулю целые неотрицательные числа, и пусть x ≥ y. Если 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; просмотров: 163; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.128.17 (0.005 с.) |