Программирование на языке Си/§4

В языке Си используются два оператора цикла:

- while
- for

Оба цикла построены по схеме:

- Заголовок цикла
- Тело цикла

Цикл while - это цикл с предусловием имеющий вид: while(условие) тело цикла; Цикл while с предусловием do имеет вид: do тело цикла while (условие);

Разница между циклом предусловием и постусловием состоит в том, что:

- в цикле с предусловием сначала проверяется условие и если оно выполняется, выполняется тело цикла.
- в цикле с постусловием сначала выполняется тело цикла и лишь потом условие.

Цикл for - параметрический цикл имеет вид: for(выражение1;условие;выражение2) тело цикла;

- Выражение 1 определяет действия до начала цикла.
- Условие - условие окончание или продолжения цикла.
- Выражение 2определяет действия после каждого выполнения тела цикла.

## Программа 3.1

Модифицируем программу "Hello, World!" с помощью операторов цикла, распечатаем 5 строк "Hello, World!".

- оператор while

```
#include <stdio.h>
int main()
{ int i=0; // объявим целочисленный идентификатор и присваиваем ему значение ноль
while(i<5) // выполняем цикл while до тех пор пока i<5
{
printf("Hello, World!\n");
i++; //увеличиваем значение идентификатора i на единицу.
}
}
```

- оператор for

```
#include <stdio.h>
int main()
{ int i; // объявим целочисленный идентификатор
for(i=0;i<5;i++)/*присваиваем идентификатору i значение ноль. Выполняем цикл for до тех пор пока i<5, каждый раз увеличивая значение i на единицу. */
{
printf("Hello, World!\n");
}
}
```

- оператор do while

```
#include <stdio.h>
int main()
{ int i=0; // объявим целочисленный идентификатор и присваиваем ему значение ноль
do // до тех пор пока
{
printf("Hello, World!\n");
i++; //увеличиваем значение i на единицу
}
while(i<=5) // i<=5 выполняется условие - выполняется цикл
}
```

## Программа 3.2

Напишем программу которая в зависимости о введённых параметров выдавала бы нам определённый результат.

```
#include <stdio.h>
int main()
{
int i;
printf("введите целое число не более 1000")
scanf("%d",&i); //получаем число и присваиваем его идентификатору
while(i==0 || i<10) // проверяем, чтобы введённое число было рано нулю или меньше девяти для выполнения цикла
{
printf("Единицы\n");
return 0;
}
while(i==10 || i<100) // проверяем, чтобы введённое число было рано десяти или меньше ста для выполнения цикла
{
printf("Десятки\n");
return 0;
}
while(i==100 || i<1000)
{
printf("Сотни\n");
return 0;
}
}
```

Обратите внимание на нововведение - это операторы логики. В языке Си используются следующие логические операторы:

- ! - не
- || - или
- && - и
- != - исключение или
- == - эквивалентно

ВАЖНО, **не путайте** эквивалентность и присвоение!

Операторы условий работают по очень простому принципу:

- если условие выполняется, то оно равно 1
- если условие не выполняется, то оно равно 0

## Программа 3.3

Напишем программу работающую со степенями:

```
#include <stdio.h>
int main()
{
int i, k, z=1, l=2;
for(i=0;i<5;i++)
{
k=l*z;
z=k;
}
printf(" %d в степени %d = %d\n", l,s,z );
}
```

Вышеприведённая программа возводит 2 (l) в степень 5 (s). Она работает по следующему принципу:

- шаг 1. объявляем идентификаторы i, k, z=1, l=2, s=5.
- шаг 2. i=0
- шаг 3. до тех пор пока i меньше или равно s, выполняем цикл
- шаг 4. i=1
- шаг 5. k=2*1
- шаг 6. z=2
- шаг 7. 1<5 продолжаем выполнение
- шаг 8. i=2
- шаг 9. k=2*2
- шаг 10. z=4
- шаг 11. 2<5 продолжаем выполнение
- шаг 12. i=3
- шаг 13. k=2*4
- шаг 14. z=8
- шаг 15. 3<5 продолжаем выполнение
- шаг 16. i=4
- шаг 17. k=2*8
- шаг 18. z=16
- шаг 19. 4<5 продолжаем выполнение
- шаг 20. i=5
- шаг 21. k=2*16
- шаг 22. z=32
- шаг 23. 5==5 условие не выполняется, выходим из цикла
- шаг 24. производим вывод сообщения 2 в степени 5 = 32.

Усложним предыдущую программу, сделаем возможным ввод как значения степени так и значение возводимого числа:

```
#include <stdio.h>
int main()
{
int i, k, z=1, l, s;
printf ("введите целое число")
scanf("%d",&l);
printf ("введите степень")
scanf("%d",&s);
for(i=0;i<s;i++)
{
k=l*z;
z=k;
}
printf(" %d в степени %d = %d\n", l,s,z );
}
```

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

## Практикум

Напишите на компиляторе Си все приведённые выше примеры. Напишем программу которая считает сумму определённой числовой последовательности:

```
#include <stdio.h>
int main()
{ int k, i;
double s,j;
printf ("введите количество чисел ряда");
scanf ("%d",&k);
printf("введите числовую последовательность");
for(i=0;i<k;i++)
{
scanf("%lf",&j);
s+=j;
}
printf(" сумма = %f\n", s);
}
```

проанализируйте пошагово работу программы.

Усовершенствуем предыдущую программу так, чтобы нам не требовалось вводить количество чисел ряда, а программа сама считала как сумму так и их количество. Знаком окончания последовательности будит число "0"

```
#include <stdio.h>
int main()
{ int k;
double s,j;
printf("введите числовую последовательность");
for(j=1.0, s=0.0, k=0;j!=0;)
{
scanf("%lf",&j);
if(j<=0.0) continue;
k++; s+=j;
}
printf(" сумма = %f, количество = %d\n", s, k);
}
```

Оператор **continue** выполняет функцию прерывания работы оператора и возвращения к началу прерванного оператора.
Проанализируйте пошагово работу программы, уберите оператор **continue** и повторно проанализируйте работу программы.

## Домашняя работа

- Напишите программу на языке Си для перевода 100 бальной оценки в 5 бальную. При условии: 30 и менее 1, 31-50 - 2, 51-72 -3, 73-86 -4 , 87-100 - 5.
- Усовершенствуйте программу 3.3 так, чтобы в целую степень могли возводиться не целые числа (например 2.24 в степени 4).
- Усовершенствовать программу 3.3 так, чтобы она могла возводит в отрицательную степень. (например 4 в степени -2)