книги / Язык Си
..pdfОбратим внимание, что нельзя потерять дробную часть при целочисленном делении, для чего ставим точку после единицы /.//.
Закрепим изучение цикла while на решении следующего при мера: чему равна переменная к после выполнения следующего кода:
int n=5,i=2,k;
while(i<n)
{k=n-i;
i++;
Ответ: к = 1.
Справа представлена блок-схема данной задачи. Двигаясь по стрелкам блок-схемы и подсчитывая значения переменных (реко мендуется начертить на листке для каждой переменной свою ко лонку и записывать в нее значения на каждой итерации цикла), определите ответ. Если ваш не совпадает с правильным, внима тельно пересчитайте пример.
Самостоятельно решите следующий пример (для чего нари суйте блок-схему): чему равна переменная к после выполнения сле дующего кода:
int n=5,i=2,k=0;
while(i<n)
{k+=n-i;
i++;
}
Ответ: k = 6.
5.2. Оператор цикла d o -w h ile (цикл с постусловием)
Основная форма оператора do-while следующая:
do
тело цикла while(условие);
Блок-схема цикла do-while имеет вид
В отличие от цикла while в do-while условие проверяется в конце оператора цикла. Телом цикла может быть один оператор или блок операторов.
Пример. Тело цикла - один оператор.
int i=0; do
i++;
while(i<5);
printf("%d\n",i);
Результат на экране: 5
Пример. Тело цикла - блок операторов.
int i=0; do
{i++;
printf("%d\nn,i);
}
while(i<5);
Результат на экране:
1
2
3
4
5
Обратим внимание еще на один важный момент, где часто де лают ошибку.
■ Для цикла do-while после ключевого слово while точка с запятой ОБЯЗАТЕЛЬНА.
Пример. Найти все числа кратные 3 в диапазоне от 10 до 100 включительно.
#include<conio.h> |
|
#include<stdio.h> |
|
main() |
|
{int i=10; |
|
do |
//если число кратно 3 |
{if(i%3==0) |
|
printf("%d\nM,i); //печатаем его |
|
i++; |
//переходим на следующее |
}while(i<=100); |
//число |
//проверяем условие окончания |
|
getch(); |
//цикла |
|
|
return 0; |
|
} |
|
Пример. Вычислить суммуряда 1 + —+ —+ |
. |
2 3 |
п |
#include<conio.h> |
|
#include<stdio.h> |
|
main() {int n,i; float S;
puts("Введите целое число");
scanf("%d",&n); //считываем с консоли число //членов ряда
S=l; //помещаем первый член ряда в накопленную //сумму
i=2; //начинаем суммирование со второго члена do
{S + = l . / i ;
i++;
}while(i<=n);
printf("S=%f", S); getch();
return 0;
}
Как видно из примеров, do-while дает абсолютно те же ре зультаты, что и while. Каким из этих двух операторов пользовать ся, решает сам программист.
Закрепим изучение цикла do-while на решении следующего примера: чему равна переменная к после выполнения следующего кода:
int n=3,i=0,k;
do
{n— ;
i++;
k=n+i;
}while(i<n);
Ответ: к = 3.
Самостоятельно решите следующий пример (для чего нари суйте блок-схему): чему равна переменная к после выполнения сле дующего кода:
int n=3,i=0,k=0;
do
{k=n-i;
i++; n — ;
}while(n+k>i);
Ответ: k = 1.
5.3. Оператор цикла for (цикл с параметрами) Основная форма циклаfor имеет следующий вид:
ft^(инициализация; условие; изменение) тело цикла
Инициализация используется для присвоения параметру цикла (и другим переменным) начального значения.
Условие - это условное выражение, которое определяет, когда цикл должен быть завершен.
Изменение (итератор) используется для изменения параметра цикла (и других переменных).
Эти три раздела заголовка циклаfor ДОЛЖНЫ быть разделе ны точкой с запятой.
Телом цикла может являться один оператор, блок операторов, пустой оператор.
Блок-схема циклаfor имеет вид
Обратите внимание на последовательность выполнения цикла for: инициализация, условие, тело цикла, изменение.
Раздел «Инициализация» выполняется ОДИН РАЗ: перед пер вой проверкой условия и первым выполнением тела цикла. Больше в этот раздел при работе цикл не заходит. Условие проверяется ПЕРЕД КАЖДЫМ выполнением (итерацией) тела цикла. Если условие истинно, то выполняется тело цикла, иначе цикл заверша ется. Изменение выполняется ПОСЛЕ КАЖДОГО выполнения те ла цикла (перед следующей проверкой условия).
Пример. Напечатать все цифры.
#include<stdio.h>
#include<conio.h> main()
{int i; for(i=0;i<10;i++)
printf("%d\n",i);
getch(); return 0;
}
Разделы «Инициализация» и «Изменение» в операторе for мо гут отсутствовать (по одному или сразу оба). Посмотрим, как при этом изменится предыдущий пример.
#include<stdio.h>
#include<conio.h>
main() {int i=0;
for(;i<10;)
{print f (1%d\nn,i);
i++;
}
getch(); return 0;
}
Теперь инициализация происходит при объявлении перемен ной /, а сама переменная / меняется в теле цикла, а не в разделе «Изменение». При такой записи уместнее использовать цикл while.
Пример. Распечатать цифры от 9 до 0 в обратном порядке.
#include<stdio.h>
#include<conio.h>
main()
{int i;
for(i=9; i>=0; i— )
printf("%d\n",i);
getch(); return 0;
Из данного примера видно, что параметры цикла могут не только расти, но и убывать. Кроме того, изменять параметр цикла можно не только на единицу, но и на любое значение.
Пример. Распечатать каждую третью букву латинского алфавита.
#include<stdio.h>
#include<conio.h>
main()
{char s;
for(s=1A*;s<= 'Z 1;s+=3)
printf ('^ c W , s) ; getch();
return 0;
Здесь параметр цикла s меняет свое значение на три после каждой итерации цикла.
В качестве параметра цикла необязательно использовать це лочисленный счетчик.
Пример. Вычислить значения функции sin(x) в точках 1, 1.25, 1.5, 1.75, 2.
#include<stdio.h>
#include<conio.h>
#include<math.h> main()
{double x; for(x=l;x<=2;x+=0.25)
printf("%.2f %10.4f\n",x,sin(x)); getch();
return 0;
}
Здесь параметр цикла x имеет тип double и меняет свое значе ние на 0.25 после каждой итерации цикла.
Закрепим изучение циклаfor на решении нескольких примеров.
Чемуравна переменнаяj после выполнения следующего кода:
int n=3,i,j=0;
for(i=0; i<n; i++)
j+=n-i;
Ответ: j = 6.
Чемуравна переменная а после выполнения следующего кода:
int i,j,a; |
i=4,j=0 |
for(i=4,j=0; i>j; |
|
i— /j++) |
|
a=i+j; |
|
Ответ: a = 4.
Самостоятельно решите примеры:
Чемуравна переменная i после выполнения данного кода:
int i,j=3;
for(i=0; j>0; j— )
i+=j;
Ответ: i = 6.
Чемуравна переменная а после выполнения данного кода:
int i,j,а=5;
for(i=a,j=0; i>j; i— ,j++)
a+=i+j;
Ответ: a = 20.
Обратите внимание, что в разделах «Инициализация» и «Из менение» могут содержаться не только параметры цикла, но и дру гие переменные. В этом случае они отделяются друг от друга запя той. Разделы же в заголовке цикла for всегда отделяются друг от друга точкой с запятой.
5.4. Вложенные циклы
Если один цикл находится внутри тела другого цикла, то та кие циклы называются вложенными. Число вложений циклов мо жет быть любым.
Вложенные циклы используются, например, при заполнении таблиц.
Пример. Печать таблицы умножения целых чисел.
#include<stdio.h>
#include<conio.h>
main()
{int i,j;
for(i=l;i<10;i++)
{ for(j=l;j<10;j++)
pr int f("%3d*%d=%2d", i, j, i * j ); p r i n t f ( " \ n " ) ;
}
getch();
return 0;
}
Блок-схема циклаfor для данного примера имеет вид
Здесь телом цикла по i являются строки
for(j=l;j <10;j++)
printf("%3d*%d=%2d",i,j,i*j);
printf("\n");