Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Использование цикла for для повышения гибкости






Хотя цикл for выглядит похожим на цикл DO в языке FORTRAN, цикл FOR в языке Pascal и цикл FOR... NEXT в языке BASIC, он обладает гораздо большей гибкостью, чем любой из них. Эта гибкость является результатом того, как могут применяться три выражения в спецификации оператора for. В примерах, приведенных до сих пор, первое выражение использовалось для инициализации счетчика, второе выражение — для установки предельного значения счетчика и третье выражение — для увеличения значения счетчика на 1. Применяемый подобным образом оператор for языка С во многом подобен упомянутым выше операторам. Тем не менее, он обладает и множеством других возможностей, девять из которых описаны далее.

1) Вы можете применять операцию декремента для реализации обратного отсчета значений счетчика вместо прямого.

/* for_down.c */

#include < stdio.h>

int main(void)

{

int secs;

for (secs = 5; secs > 0; secs--)

printf (" %d секунды! \n", secs);

printf(" Ключ на зажигание! \n");

return 0;

}

Ниже показан вывод:

5 секунд(ы)!

4 секунд(ы)!

3 секунд(ы)!

2 секунд(ы)!

1 секунд(ы)!

Ключ на зажигание!

 

2) При желании можно считать двойками, десятками и т.д.

/* for_13s.c */

#include < stdio.h>

int main(void)

{

int n; // счет с интервалом 13, начиная с 2

for (n=2; n< 60; n=n+13)

printf(" %d \n", n);

return 0;

}

Значение переменной n на каждой итерации увеличивается на 13, давая следующий вывод:

 

3) Можно делать подсчет по символам, а не числам.

/* for_char.c */

#include < stdio.h>

int main(void)

{

char ch;

for (ch = 'a'; ch < = 'z'; ch++)

printf(" Значение ASCII для %c равно %d.\n", ch, ch);

return 0;

}

В программе предполагается, что для символов в системе используется кодировка ASCII. Ниже показан фрагмент выходных данных:

Значение ASCII для а равно 97.

Значение ASCII для b равно 98.

Значение ASCII для х равно 120.

Значение ASCII для у равно 121.

Значение ASCII для z равно 122.

Программа работает, т.к. символы хранятся в памяти в виде целых чисел, поэтому цикл в любом случае имеет дело с целыми числами.

 

4) Можно выполнять проверку условия, отличного от количества итераций. В программе for cube.с строку

for (num = 1; num < = 6; num++)

можно заменить такой строкой:

for (num = 1; num*num*num < = 216; num++)

Такое условие проверки можно было бы применять, если вас больше заботит ограничение величины куба, а не количества итераций.

 

5) Можно позволить некоторой величине расти не в арифметической, а в геометрической прогрессии; т.е. вместо добавления каждый раз фиксированного значения можно умножать на фиксированное значение.

/* for_geo. с * /

#include < stdio.h>

int main(void)

{

double debt;

for (debt = 100.0; debt < 150.0; debt = debt * 1.1)

printf(" Теперь ваша задолженность составляет $%.2f.\n", debt);

return 0;

}

В этом фрагменте кода значение переменной debt на каждом проходе цикла умножается на 1.1, что увеличивает его на 10%. Вывод программы имеет следующий вид:

Теперь ваша задолженность составляет $100.00.

Теперь ваша задолженность составляет $110.00.

Теперь ваша задолженность составляет $121.00.

Теперь ваша задолженность составляет $133.10.

Теперь ваша задолженность составляет $146.41.

 

6) В качестве третьего выражения можно использовать любое допустимое выражение. Что бы вы здесь не поместили, это будет обновляться на каждой итерации.

/* for_wild.с */

#include < stdio.h>

int main(void)

{

int x;

int у = 55;

for (x = 1; у < = 75; у = (++x * 5) + 50)

printf(" % 10d %10d\n", x, y);

return 0;

}

Этот цикл выводит значения переменной х и алгебраического выражения ++х *5+50. Ниже показан вывод программы:

1 55

2 60

3 65

4 70

5 75

Обратите внимание, что в проверке участвует переменная у, а не х. В каждом из трех выражений, управляющих циклом for, могут применяться разные переменные. (Следует отметить, что хотя этот пример является допустимым, он не соответствует хорошему стилю программирования. Программа могла бы стать более ясной, если не смешивать процесс обновления с алгебраическими вычислениями.)

 

7) Можно даже оставить одно или несколько выражений пустыми (но не опускайте точки с запятой). Обеспечьте наличие в цикле оператора, который в конечном итоге приведет к завершению цикла.

/* for_none.c */

#include < stdio.h>

int main(void)

{

int ans, n;

ans = 2;

for (n = 3; ans < =25;)

ans = ans * n;

printf(" n = %d; ans = %d.\n", n, ans);

return 0;

}

Вот вывод этой программы:

n = 3; ans = 54.

Значение переменной n в цикле остается равным 3. Переменная ans начинается со значения 2, затем увеличивается до 6 и 18, а в конечном итоге получает значение 54. (Значение 18 меньше, чем 25, так что цикл for выполняет на одну итерацию больше, умножая 18 на 3 для получения 54.) Кстати, пустое управляющее выражение, находящееся посередине, считается истинным, поэтому приведенный ниже цикл выполняется бесконечно:

for (;;)

printf(" Требуется определенное действие.\n");

 

8) Первое выражение не обязательно должно инициализировать переменную. Вместо этого им могла бы быть какая-то разновидность оператора printf (). Просто запомните, что первое выражение вычисляется или выполняется только один раз, до того как начнут выполняться другие части цикла.

/* for_show.c */

#include < stdio.h> int main(void)

{

int num = 0;

for (printf(" Продолжайте вводить числа! \n"); num! = 6;)

scanf(" %d", & num);

printf(" Вот то число, которое было нужно! \n");

return 0;

}

Этот фрагмент кода один раз выводит первое сообщение, а затем продолжает принимать числа до тех пор, пока вы не введете 6:

Продолжайте вводить числа!

Вот то число, которое было нужно!

 

9) Параметры выражений цикла могут изменяться с помощью действий внутри тела цикла. Например, предположим, что цикл определен следующим образом:

for (n = 1; n < 10000; n = n + delta)

Если после нескольких итераций программа решит, что значение delta слишком мало или слишком велико, то посредством оператора if внутри цикла величину delta можно изменить. В интерактивной программе значение delta может быть изменено пользователем в процессе выполнения цикла. С таким видом настройки связана и определенная опасность; к примеру, установка delta в 0 приведет к бесконечному циклу.

Короче говоря, свобода при выборе выражений, управляющих циклом for, предоставляет этому циклу способность делать намного больше, чем просто выполнение фиксированного количества операций.

 

Дополнительные операции присваивания: +=, -=, *=, /=, %=

В языке С доступно несколько операций присваивания. Наиболее базовой из них, конечно же, является операция =, которая просто присваивает значение выражения, находящегося справа от знака операции, переменной, указанной слева от этого знака. Другие операции присваивания модифицируют переменные. В каждой такой операции имя переменной располагается слева от знака операции, а выражение — справа. Переменной присваивается новое значение, которое образовано путем корректировки ее старого значения на величину выражения, стоящего справа. Действительная корректировка зависит от операции.

Например:

scores += 20 — то же, что и scores = scores + 20

dimes - = 2 — то же, что и dimes = dimes - 2

bunnies *= 2 — то же, что и bunnies = bunnies * 2

time /= 2.73 — то же, что и time = time /2.73

reduce %= 3 — то же, что и reduce = reduce % 3

 

В приведенных выше примерах применялись простые числа, но эти операции также работают и с более сложными выражениями:

х *= 3 * у + 12 — то же, что и х = х* (3 * у + 12)

Только что рассмотренные операции присваивания имеют такой же низкий приоритет, как и операция =, и этот приоритет меньше приоритета операции + или *. Низкий приоритет отражен в последнем примере, в котором 12 суммируется с 3 * у и только затем результат умножается на х.

Использовать все эти формы операции присваивания совершенно не обязательно. С другой стороны, они компактны и могут генерировать более эффективный машинный код, чем длинная форма операции. Комбинированные операции присваивания особенно полезны в ситуации, когда необходимо поместить в спецификацию цикла for сложное выражение.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.