Цикл с заданным количеством итераций (цикл с параметром) for
Цикл for лучше всего использовать, когда известно количество повторений в цикле. Программа при этом становится короче и понятнее.
Синтаксис
FOR (выражение 1; выражение 2; выражение 3) <оператор>
Здесь «выражение 1» задает начальное значение переменной цикла, «выражение 2» – это выражение, определяющее условие, при котором тело цикла будет выполняться, «Выражение 3» определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла. Значения «выражения 1» и «выражения 2» должны быть типа, совместимого по присваиванию с типом переменной цикла. Таким образом, цикл for может быть реализован на основе цикла с предусловием:
<переменная>=<выражение 1>;
while <переменная> <= <выражение 2>
{
<оператор>;
<переменная>++;
}
Вход в цикл возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break. При нормальном завершении цикла значение переменной цикла неопределенно, если цикл завершился преждевременно по оператору break или goto, то переменная цикла сохраняет свое последнее значение. В теле цикла for запрещается изменять переменную цикла.
Пример 19. Необходимо ввести и вывести матрицу вещественных чисел с помощью цикла с параметром, по пути подсчитав сумму всех ее элементов.
int n=10;
int a[10][10];
int sum=0;
int i,j;
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("Введите элемент матрицы [%d %d]: ",i,j);
scanf("%d",&a[i][j]);
}
}
printf("Введенная матрица:");
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
sum = sum + a[i][j]; // считаем сумму
}
printf("\n");
}
printf("Сумма элементов = %d", sum);
Операторы прерывания циклов
В некоторых случаях необходимо прервать повторение цикла, проанализировав какие-то условия внутри тела цикла. Это может потребоваться в тех случаях, когда проверки условия для окончания цикла громоздкие, требуют многоэтапного сравнения и сопоставления каких-то данных, и все эти проверки просто невозможно разместить в выражении условия операторов while, do-while или for. Для этого можно использовать оператор break. Он прерывает выполнение тела любого цикла for, do-while или while и передает управление следующему за циклом выполняемому оператору. Еще один способ прерывания – использование оператора goto, передающего управление какому-то оператору, расположенному вне тела цикла. Такой способ нарушает концепции структурного программирования и не рекомендуется к использованию.
Для прерывания циклов, размещенных в процедурах или функциях, можно воспользоваться стандартной процедурой exit. В отличие от оператора break, процедура exit прерывает не только выполнение цикла, но и выполнение той процедуры или функции, в которой расположен цикл.
Иногда внутри тела цикла возникает необходимость прервать только выполнение текущей итерации и перейти к следующей. В этом случае можно воспользоваться стандартной процедурой continue, которая передает управление в заголовок цикла.
Пример 20. Написать программу, которая находит в массиве целых чисел первое отрицательное число и выводит его на экран.
const int n=10;
int mas[n];
int i;
bool flag; //переменная–индикатор отсутствия отрицательных элементов в массиве
flag=false;
for(i=0;i<n;i++)
{
printf("Введите %d элемент массива: ",i);
scanf("%d",&mas[i]);
}
for (i=0;i<n;i++) //теперь ищем отрицательное число
{
if (mas[i] > 0) continue; // переходим в заголовок цикла
printf ("Первое отрицательное число = %d. Номер = %d\n",mas[i],i);
flag = true;
break; // отрицательное число найдено – можно прервать цикл
}
if (!flag) printf("Отрицательных чисел нет");
Форматированный ввод данных
Функция scanf() (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:
scanf ("<управляющая строка>", аргумент_1, аргумент_2,...);
Аргументы scanf() должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет рассмотрено далее.
Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:
· пробелы, символы табуляции и перехода на новую строку (все они игнорируются);
· спецификации преобразования, состоящие из знака %, возможно, символа * (запрещение присваивания), возможно, числа, задающего максимальный размер поля, и самого символа преобразования;
· обычные символы, кроме % (считается, что они должны совпадать с очередными неизвестными символами во входном потоке).
Рассмотрим символы преобразования функции scanf() (указываются после символа %):
Таблица 9.
Символы преобразования функции scanf()
Символы преобразования | Описание |
c | на входе ожидается появление одиночного символа; |
d или i | на входе ожидается десятичное целое число, и аргумент является указателем на переменную типа int; |
D или l | на входе ожидается десятичное целое число, и аргумент является указателем на переменную типа long; |
е или Е | на входе ожидается вещественное число с плавающей точкой; |
f | на входе ожидается вещественное число с плавающей точкой; |
g или G | на входе ожидается вещественное число с плавающей точкой; |
о | на входе ожидается восьмеричное целое число, и аргумент является указателем на переменную типа int; |
О | на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа long; |
s | на входе ожидается появление строки символов; |
x | на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа int; |
Х | на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа long; |
p | на входе ожидается появление указателя в виде шестнадцатеричного числа; |
n | применяется в операциях форматирования. Аргумент, соответствующий этому символу спецификации, должен быть указателем на целое. В него возвращается номер позиции (после ввода), в которой записана спецификация %n; |
u | на входе ожидается беззнаковое целое число, и аргумент является указателем на переменную типа unsigned int; |
U | на входе ожидается беззнаковое целое число и аргумент является указателем на переменную типа unsigned long; |
[ ] | сканирует входную строку для получения символов. |
Перед некоторыми символами преобразования могут записываться следующие модификаторы:
Таблица 10.
Модификаторы функции scanf()
F | изменяет указатель, заданный по умолчанию, на указатель типа far; |
N | изменяет указатель, заданный по умолчанию, на указатель типа near; |
h | преобразует аргумент к типу short int (может записываться перед символами d, i, о, u, х); |
l | преобразует аргумент к типу long int (может записываться перед символами d, i, o, u, x); |
L | преобразует аргумент к типу long double (может записываться перед символами е, f, g). |
Пример 21. Необходимо вести с клавиатуры целое число, символ и вещественное число.
int a;
char b;
float t;
scanf("%d", &a);
scanf("%c", &b);
scanf("%d%c%f",&a, &b, &t);
Пользователь осуществил ввод с клавиатуры в следующем виде:
431 <Enter>
W <Enter>
3.14 <Enter>
В этом случае, переменные получили следующие значения:
a → 431
b → ‘W‘
t → 3.14