Урок 2. Часть 2: Конструкции языка Си: циклы

На занятии рассматривается конструкции языка Си — циклы. Разбираются примеры работы с циклами и даются задания

Понятия счетчика и сумматора в Си

Счетчик:
При работе с счетчиком предусматриваются следующие действия:

  1. Обнулить:
  2. с=0;
  3. В каждой итерации цикла увеличивать счетчик на единицу:
  4. с=с+1;

Сумматор:
Работа с сумматором предполагает следующие шаги:

  1. Обнулить:
  2. s=0;
  3. В каждой итерации цикла увеличивать сумматор на новое значение:
  4. s=s+x;

Цикл Си While

Цикл с предусловием. Пока условие истинно, выполняются операторы тела цикла.

while (условие) 
{
	оператор1;
	оператор2;}
Пример: Выводить на экран степени двойки до 1000
1
2
3
4
5
6
7
8
main(){
int i=2;
while (i<=1000)
  {
	i = i*2; 
	printf("%d\n",i);
  }
}
Пример: Выполнить сложение всех цифр от 1 до 1000
Показать решение:

1
2
3
4
5
6
7
8
9
10
11
main(){
int sum,i;
sum=0;
i=1;
while (i<=100)
  {
	sum += i; // сумматор
	++i; // счетчик
  }
printf("Сумма=%d\n",sum);
}
Задача c 2-2_1: Для x=2700, 900, 300, 100 … вычислять и печатать y=x/4+20 и z=2y+0.23 до тех пор пока произведение y и z не станет меньше 1/x
Для вывода использовать функцию Си printf

Цикл Си do while

Цикл с постусловием. Пока условие истинно, выполняются операторы тела цикла

1
2
3
4
5
6
7
do
{
	оператор1;
	оператор2;}
while (условие);
Пример: Выводить на экран степени двойки до 1000
Показать решение:

1
2
3
4
5
6
7
8
9
main(){
int i=2;
do
{
	i = i*2; 
	printf("%d\n",i);
}
while (i<=1000);
}
Задача c 2-2_2: В компьютер вводятся числа. После ввода каждого числа нужно печатать, сколько среди них уже введено отрицательных. Закончить ввод, когда отрицательных станет >5
Ввод чисел осуществлять оператором си scanf, а вывод — printf

Показать аналог в Pascal

1
2
3
4
5
6
7
8
9
10
var i,numb:integer;
begin
i:=0;
repeat
 readln(numb);
 if numb<0 then
	inc(i);
 writeln('otricat=',i);
until (i>=5);
end.

Операторы цикла Си for

Простая конструкция:

1
2
for (переменная=начальное значение; условие; приращение значения)
	оператор;

Конструкция с составным оператором:

1
2
for (переменная=начальное значение; условие; приращение значения)
	{оператор1; оператор2;}

Пример:

1
2
3
4
for (int  i=1;  i<=10;  i++)
{
  операторы;
}
Важно: Цикл for используется в том случае, когда известно точное количество повторов, которое нужно выполнить
Пример: Выводить на экран числа от 1 до 10
1
2
3
4
5
6
main()
{
int r;
for (r = 1; r <= 10; r++)
	printf("%d\n", r);
}
Задача c 2-2_3: При помощи циклов for напечатать: 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1

Дополните код:

1
2
3
4
5
6
7
8
9
#include<stdio.h>
main()
{
int i;
for(i=1; i<=10; i++)
	printf("%d",i);
for (...)
	printf("%d",i);
}
Показать аналог в Pascal

1
2
3
4
5
6
7
var i: integer;
begin
for i:=1 to 10 do
	write(i:3);
for i:=9 downto 1 do
  write(i:3);
end.
Задача c 2-2_4: В компьютер вводятся 10 чисел. Подсчитать по отдельности количество отрицательных, положительных чисел и тех, что превышают число 10
Для подсчета использовать счетчики.

Вложенные циклы

1
2
3
4
5
6
for() {
	for()
        {}
}
Пример: Напечатать следующую последовательность символов *:
язык си циклы
1
2
3
4
5
6
7
8
9
10
main()
{
int row, column;
for (row = 1; row <= 10; row++)
  {
  for (column = 1; column <= 10; column++)
		printf("*");
  puts("\n");
  }
}
Задача c 2-2_5: Распечатать таблицу умножения:
вложенные циклы си
Показать аналог в Pascal

1
2
3
4
5
6
7
8
9
10
11
var row, column, x: integer;
begin
for row:= 1 to 10 do
begin
    for column:= 1 to 10 do begin
        x:= row * column;
    	  write(x:4);
    end;
writeln;
end;
end.
Задача c 2-2_6: Вывести символ * в следующем порядке:
си циклы

Показать аналог в Pascal

1
2
3
4
5
6
7
8
9
var row,column:integer;
begin
for row:= 1 to 10 do
begin
    for column:= 1 to row do
        write('*':2);
    writeln;
end;
end.
Вопросы для самоконтроля:

  • На каком основании вы будете осуществлять выбор между циклами for, do и while?
  • Для чего предназначены параметры цикла for?
  • В каком случае прекращается выполнение цикла for?
  • Что такое вложенный цикл языка Си?
  • Каково назначение оператора break?