Программирование на языке Си/§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\n");
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, s=5;
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)