Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

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

Закрепим изучение цикла 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");