C + + Л Е К Ц І Я 3
ОПЕРАТОРЫ ЦИКЛА
Язык Си имеет три конструкции, реализующие операторы цикла: for,
while,
do-while.
1. ОПЕРАТОР for
Цикл for является одним из основных видов циклов, которые имеются во
всех универсальных языках программирования,
включая С. Однако версия цикла for, используемая в С, обладает
большей мощностью и гибкостью.
Основная
идея функционирования for заключается в том, что
операторы, находящиеся внутри цикла, выполняются фиксированное число раз, в то
время как переменная цикла (известная еще как индексная переменная) пробегает
определенный ряд значений.
Синтаксис:
for (<выражение
инициализации>; <условное выражение>; <выражение цикла>)
<тело
оператора>;
Параметры цикла for, заключенные в скобки, должны
разделяться точкой с запятой (позиционный параметр), которая делит в свою
очередь пространство внутри скобок на три сектора.
Тело оператора for
выполняется нуль и более раз до
тех пор, пока условное выражение <условное выражение> не станет ложным.
Выражения инициализации <выражение инициализации> и цикла
<выражение цикла> могут быть использованы для инициализации и модификации
величин во время выполнения оператора for.
Первым
шагом при выполнении оператора for является вычисление выражения
инициализации, если оно имеется. Далее вычисление продолжается в зависимости от
значения условного выражения:
1. Если условное выражение истинно (не равно нулю), то выполняется тело
оператора. Потом вычисляется выражение
цикла (если оно есть). Процесс повторяется снова с вычислением условного
выражения.
2. Если условное выражение опущено,
то его значение принимается за истину и процесс выполнения продолжается, как
описано выше. В этом случае оператор for может завершиться только при
выполнении в теле оператора операторов break, goto, return.
3. Если условное выражение ложно, то выполнение оператора for
заканчивается и управление передается следующему оператору в программе.
Оператор for может завершиться
при выполнении операторов break, goto,
return
в теле оператора. В некоторых случаях использование оператора запятая (,)
позволит вводить составные выражения в оператор цикла for.
Пример 1. Вычислить сумму чисел от 1 до 100.
for
(s=0,i=1;i<=100;i++)
s = s + i;
Выражение инициализации обнуляет переменную суммы s и присваивает 1 переменной i.
Операторы, записанные через запятую, выполняются последовательно. Выражение
цикла прибавляет 1 к переменной i, а
в теле цикла происходит суммирование переменных s и i. Цикл завершает
свою работу когда переменная i
достигнет значения 101. То есть последним числом, которое будет прибавлено к
переменной s, будет 100. В конце
работы оператора for переменная s
будет содержать число 5050 – сумму натуральных чисел от 1 до 100.
Пример 2. Тело цикла, которое не выполняется
for
(s=0,i=1;i<1;i++)
s = s + i;
Если в предыдущей программе заменить условное выражение на i < 1, то тело цикла никогда не
выполнится. После инициализации s =
0, i = 1 будет проверено условное
выражение i < 1. И поскольку оно
ложно, то управление программой перейдет на следующий за for оператор.
Пример 3. Для заданного натурального n вычислить сумму S=1/1 + 1/2 +
1/3 + … + 1/n
Сумму будем вычислять в переменной s,
имеющей тип double. Каждое слагаемое имеет вид
1/i. На языке Си это выражение можно записать как 1.0 / i . В качестве числительного следует
писать 1.0, а не 1, так как результат деления должен быть действительным. В
цикле последовательно прибавляем к нулю все слагаемые 1.0 / i
для i от 1 до n.
#include <stdio.h>
int i,n;
double s;
void main(void)
{
scanf("%d",&n);
s = 0;
for(i=1;i<=n;i++)
s += 1.0 / i ;
printf("%lf\n",s);
}
Упражнение 1. Ввести 10 цілих чисел. Знайти суму та
кількість додатніх чисел.
Упражнение 2. Ввести n цілих чисел. Знайти середнє
арифметичне парних чисел.
2. ОПЕРАТОР while
В конструкции while вычисляется выражение. Если его значение отлично от нуля
(истинно), то выполняется тело оператора и выражение вычисляется снова. Этот
цикл продолжается до тех пор, пока значение выражения не станет нулем, после
чего выполнение программы продолжается с места после тела оператора.
Синтаксис:
while (<выражение>)
<тело оператора>;
Пример 1. Вычислить сумму чисел от 1 до 100.
#include <stdio.h>
int s, i;
void main(void)
{
s = 0; i = 100;
while(i > 0)
{
s = s + i;
i--;
}
printf("%d\n",s);
}
Изначально значение суммы s
положили равным нулю. В переменной i содержится
очередное слагаемое, которое будет прибавляться к сумме s. Первым таким слагаемым будет i
= 100. Пока выражение, заключенное в круглые скобки цикла while будет истинным,
совершается тело цикла. В теле цикла к сумме s прибавляется слагаемое i
и это слагаемое уменьшается на 1. Цикл закончит свое выполнение, когда
слагаемое i станет равным нулю и не
будет выполняться условие i > 0.
Операторы можно разделять запятой (‘,’), тогда они будут выполняться
последовательно. Если два оператора в теле цикла while объединить в
последовательное выполнение, то можно не брать в фигурные скобки тело цикла:
#include <stdio.h>
int s, i;
void main(void)
{
s = 0; i = 100;
while(i > 0)
s += i, i--;
printf("%d\n",s);
}
Виконати Пример 3, Упражнение 1 та Упражнение 2.
1.3. ОПЕРАТОР do-while
Оператор цикла do-while проверяет условие окончания в конце, после каждого
прохода через тело цикла; тело цикла всегда выполняется по крайней мере один
раз. Сначала выполняется тело оператора, затем вычисляется выражение. Если оно
истинно, то тело оператора выполняется снова и т.д. Если выражение становится
ложным, цикл заканчивается.
Синтаксис:
do <тело оператора> while (<выражение>);
Тело оператора do выполняется один или несколько раз до тех пор, пока
выражение <выражение> станет ложным
(равным нулю). Вначале выполняется <тело оператора>, затем
вычисляется <выражение>. Если выражение ложно, то оператор do завершается и управление передается
следующему оператору в программе.
Если выражение истинно
(не равно нулю), то тело оператора выполняется снова и снова проверяется
выражение. Выполнение тела
оператора продолжается до тех
пор, пока выражение не станет ложным.
Пример 1. Вычислить сумму чисел от 1 до 100.
#include <stdio.h>
int s, i;
void main(void)
{
s = 0; i = 100;
do {
s = s + i;
i--;
} while (i > 0);
printf("%d\n",s);
}
В переменной s накапливается
сумма, переменная i принимает все
значения от 100 до 1. В теле цикла происходит прибавление значения i к сумме s и уменьшение i на 1.
Цикл повторяется пока выражение (i
> 0) истинно. Как только значение переменной i станет равным 0, цикл завершается и управление передается
следующей команде.
Виконати Пример 3, Упражнение 1 та Упражнение 2.
2. МНОГОКРАТНЫЙ ВВОД – ВЫВОД
Различают однократный ввод (single input) и многократный ввод (multiple
input). Однократный ввод характеризуется данными для одного теста. Если на вход
подаются данные для нескольких тестов, то говорят о многократном вводе.
Рассмотри два примера.
Пример 1. На вход подаются два числа a и b.
Найти их сумму.
Для решения задачи достаточно ввести два числа, найти их сумму и вывести
результат.
Пример 2. На вход подаются несколько строк.
Первая строка содержит количество тестов n.
Каждая из следующих n строк содержит
два числа a и b. Для каждого теста найти сумму двух чисел и вывести ее в
отдельной строке.
Читаем в переменную n количество
тестов. Далее в цикле для каждой входной строки вводим слагаемые a и b,
находим их сумму и выводим на экран.
#include <stdio.h>
int i, a, b, n;
void main(void)
{
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%d %d",&a,&b);
printf("%d\n",a + b);
}
}
Цикл можно организовать и при помощи конструкции while. В таком случае
вводить дополнительную переменную i
нет необходимости:
#include <stdio.h>
int a, b, n;
void main(void)
{
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
printf("%d\n",a + b);
}
}
Цикл while будет продолжаться до тех пор, пока выражение n-- будет оставаться истинным. А это
будет выполняться до тех пор, пока n
не станет равным 0.
Самостійно написати цю програму для циклу do-while.
Пример 2.3. На вход подаются несколько строк.
Каждая строка содержит два числа a и b. Для каждой строки вывести сумму двух
чисел, находящихся в ней.
Условие задачи отличается от предыдущей тем, что мы не знаем количество
входных строк. В таком случае следует читать данные до конца файла. В отличии
от языка Паскаль, в Си в таком случае не следует прибегать к файловым
операторам.
Функция scanf не только вводит данные, но и возвращает целочисленное
значение, равное количеству прочитанных аргументов. То есть если записать
выражение
i = scanf("%d %d",&a,&b);
и ввести два числа a и b, то переменная i примет значение 2. Это свойство функции очень удобно использовать
при чтении данных до конца файла. Дело в том, что если программа прочитает все
данные и дойдет до конца файла, то при следующем вызове функции scanf
она вернет значение, равное -1.
#include <stdio.h>
int a, b;
void main(void)
{
while(scanf("%d
%d",&a,&b) == 2)
printf("%d\n",a + b);
}
В цикле while читаем два числа a
и b. Пока вводятся два числа, scanf
возвращает 2 и выполняется тело цикла (печать суммы чисел). Кодга дойдем до
конца файла, функция scanf не сможет прочитать следующие
два числа и вернет -1. Выполнение цикла закончится.
Напоминание! При чтении данных с консоли ввести
символ “конец файла” можно, нажав комбинацию клавиш ^Z.
Пример 2. На вход подаются несколько строк.
Каждая строка содержит два неотрицательных целых числа a и b. Для каждой строки
вывести сумму двух чисел, находящихся в ней. Последняя строка содержит два нуля
и не обрабатывается.
Пример отличается от предыдущего тем, что окончание работы цикла следует
произвести не по достижению конца файла, а при прочтении значений a = 0, b = 0.
#include <stdio.h>
int a, b;
void main(void)
{
while(scanf("%d
%d", &a, &b), a + b)
printf("%d\n", a + b);
}
Условное выражение цикла while состоит из двух частей:
функции scanf и выражения a +
b. Цикл продолжается до тех пор, пока
оба выражения остаются истинными. Очевидно, что функция scanf всегда будет
возвращать 2 (поскольку до конца файла при обработке данных в этой задаче мы не
дойдем), а значение a + b будет оставаться истинным пока оба
значения a и b не станут равными 0 (по условию a и b целые
неотрицательные).
Напоминание! Арифметическое выражение является
истинным, если оно не равно 0.
Упражнение 3. [Вычислить сумму всех нечетных чисел из
интервала [a, b]. Например, сумма нечетных чисел из интервала [3,
9] равна 3 + 5 + 7 + 9 = 24.
Вход. Первая строка содержит количество
тестов T є N. Каждый тест состоит из двух чисел a и b (дійсні числа).
Выход. Для каждого теста вывести его номер и
сумму всех нечетных чисел из интервала [a, b].
Пример входа
|
Пример выхода
|
2
|
Nomber
1 - Sum 9
|
1 5
|
Nomber
2 - Sum 15
|
3 7
|
|
3. ФОРМАТИРОВАННЫЙ ВВОД-ВЫВОД
В первом уроке были приведены форматы ввода-вывода элементарных типов
данных. Формат позволяет выводить числовые значения переменных с определенным
количеством знаков. Следующая таблица описывает форматы данных:
тип
|
формат
|
int
|
%<n>d
|
float
|
%<n>.<m>f
|
double
|
%<n>.<m>lf
|
Здесь <n> и <m> – некоторые целые неотрицательные числа.
Значение переменной выводится в <n> позициях. При выводе значения
действительного типа после десятичной запятой выводится <m> знаков,
десятичная точка занимает одну позицию. Если <n> больше чем количество
цифр в выводимом значении, то перед числом выводятся пробелы. Если <n>
меньше чем количество цифр в выводимом значении, то значение выводится с таким
количеством цифр, которое оно содержит.
переменная
|
формат вывода
|
выводимое значение
|
int a = 456
|
%1d
|
456
|
int a = 456
|
%3d
|
456
|
int a = 456
|
%5d
|
456
|
float s = 34.1223
|
%3.2f
|
34.12
|
float s =
34.1223
|
%7.3f
|
34.122
|
float s = 34.1223
|
%8.4f
|
34.1223
|
float s = 34.1223
|
%9.4f
|
34.1223
|
double d =
1.123456789
|
%5.3lf
|
1.123
|
double d =
1.123456789
|
%7.5lf
|
1.12346
|
double d =
1.123456789
|
%12.9lf
|
1.123456789
|
double d =
1.123456789
|
%15.11lf
|
1.12345678900
|
Если <m> = 0, то действительное число при выводе округляется до
целого значения.
Пример 3. Вывести таблицу умножения 9*9. Каждое
число в таблице должно занимать две позиции, между числами в одной строке
должен находиться один пробел.
Приведенный пример показывает, как можно форматировать табличный вывод.
Используя двойной цикл, построчно выводим требуемую таблицу.
for(i = 1; i < 10; i++)
{
for(j = 1; j < 10; j++)
printf("%2d ", i*j);
printf("\n");
}
Пример 4. На вход подается квадратная матрица размером n * n (n < 10), каждый элемент которой представляет
собой цифру. Первая строка задает n, следующие строки описывают матрицу. Необходимо найти сумму
всех чисел матрицы.
Пример входа
|
Пример выхода
|
3
1 1 1
2 2 2
3 3 3
|
18
|
Для чтения однозначных чисел следует воспользоваться форматом “%1d”:
#include <stdio.h>
int s, a, n, i, j;
void main(void)
{
s=0;
scanf("%d",&n);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
scanf("%1d
", &a);
s += a;
}
printf("%d\n", s);
}
Упражнение 4. Условие из Пример 4, только найти суммы чисел по каждому ряду.
Немає коментарів:
Дописати коментар