10.01 Циклы и символы


Долг за прошлый семинар FIXME Нужен только в 2026

Тернарная операция

Условный оператор

Общий вид: if ( <выражение> ) <оператор> [ else <оператор> ]

{OK} Ввести два числа, вывести, какое больше

{i} Ввести три вещественных числа, проверить, ∃ ли треугольник с такими сторонами

Точки последовательных вычислений

:)) <!> Повторение из лекции о точках последовательных вычислений: Спойлер:

:)) Замечание про постинкременцию и постдекременцию:

   1 int a=2, b=10, c;
   2 c = a++ * b--;
   3 printf("%d %d %d\n", a, b, c);
   4 c = b--, b--;
   5 printf("%d %d %d\n", a, b, c);

Долг отдан


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

for(;;)

«Главный» оператор цикла в Си: for ( <инициализация> ; <условие> ; <изменение> ) <тело>

{OK} ввод целого n, вывод таблицы умножения от 2 до 9 на n в столбик

{i} ввести три целых числа — a, d, и n, вывести первые n членов арифметической програессии aᵢ₊₁ = aᵢ + d

{OK} Лайфхак: если это не слишком утяжеляет текст, в выражениях можно использовать операцию-с-запятой:

   1 for(int i=1, j=9; i<j; i+=2, ++j)
   2         printf("%d %d\n", i, j);

while()

Если инициализация очень длинная или её нет, а изменение входит в тело, получается for (; <условие>;) <тело>, то есть while ( <условие> ) <тело>

{i} Переписать for(i=0; i<10; i++) printf("%d\n", i); в цикл while()

do … while()

Цикл с постусловием — do <оператор> while ( <условие> ). Нарушает каноническую схему цикла. Всегда выполняется минимум один раз. нужен, когда к началу выполнения цикла ещё невозможно проверить условие.

{i} Переписать в цикл while():

Ещё о scanf()

{OK} Лайфхак: функция scanf() возвращает значение — количество введённых переменных. Это и хорошо, и плохо:

   1 int a=1, b=2, n;
   2 n = scanf("%d %d", &a, &b);
   3 printf("%d: %d %d\n", n, a, b);

{i} Организовать т. н. «цикл по вводу»: вводится (и выводится удвоенным) целое число до тех пор, пока… вводится! То есть пока scanf() возвращает не 0.

Мы вас обманули! Ещё scanf() может возвращать -1, если ввод закончен. Попробуйте вместо числа ввести Ctrl+D. Вжжжух!

Скорее жмите Ctrl+C!

<!> Что произошло:

Кстати, о символах

Тип char — это очень короткое целое. На некоторых архетиктурах — 0…255, на некоторых -128…127

:)) А что это?

Если хотите строгой определённости, пишите unsigned char и signed char.

Чем отличается от int, кроме размера? Примерно ничем!

getchar() и putchar()

{OK} Коды символов:

   1 while(c=getchar())
   2   printf("%d\n", c);

Теперь хорошо видно, что такое буферизованный ввод: вы что-то набираете, но getchar() срабатывает только после переводя строки

{i} Переделать в цикл for(), который заканчивается при вводе Ctrl+D (то есть при получении -1 aka EOF)

TODO Вложенные циклы не успеем, но там есть ещё один семинар про циклы

Д/З

TODO

  1. Шифрование методом Цезаря — ввести число, затем посимвольно строку до перевода строки (не включая его), затем вывести эту строку, прибавив число к коду всех символов
  2. Ещё задача на цикл
  3. Ввести вещественное число в любом из двух форматов (экспоненциальном и с фиксированной точкой) посимвольно. Буква e может быть как большой, так и маленькой; в начале числа и порядка моет стоять '+', '-' и ничего

    • Подсказка: возможно, стоит построить синтаксическую диаграмму
    • Спойлер — сама синтаксическая диаграмма

LecturesCMC/AL/Prac/09_CharFor (последним исправлял пользователь FrBrGeorge 2026-09-30 02:00:42)