субота, 25 листопада 2017 р.

11 клас. С++

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, только найти суммы чисел по каждому ряду.


Немає коментарів:

Дописати коментар