10.01 Циклы и символы
Долг за прошлый семинар FIXME Нужен только в 2026
Тернарная операция
printf("%d %d %d %d", a, b, c, a ? b: c);
Неравенство треугольника: вывести 1 или 0 в зависимости от того, может ли быть образован треугольник с положительными (не проверять) вещественными сторонами.
Условный оператор
Общий вид: if ( <выражение> ) <оператор> [ else <оператор> ]
Выражение — интерпретируется как 0 или не 0
оператор — один оператор
Если надо больше, заключаем операторы в фигурные скобки — т. н. составной оператор
Если вдруг надо ни одного, пишем одинокую «;» — т. н. пустой оператор
Ввести два числа, вывести, какое больше
Ввести три вещественных числа, проверить, ∃ ли треугольник с такими сторонами
- При вводе хотя бы одного отрицательного числа программа ругается на это и завершается
- Выводится, можно ли построить треугольник (строгое неравенство)
Точки последовательных вычислений
Повторение из лекции о точках последовательных вычислений: Спойлер:
Замечание про постинкременцию и постдекременцию:
Что выведется?
Долг отдан
Операторы цикла
for(;;)
«Главный» оператор цикла в Си: for ( <инициализация> ; <условие> ; <изменение> ) <тело>
- Каноническая схема цикла!
<инициализация> <условие> <изменение> — выражения (возможно, пустые)
<тело> — оператор один, или составной с {}, или пустой
ввод целого n, вывод таблицы умножения от 2 до 9 на n в столбик
ввести три целых числа — a, d, и n, вывести первые n членов арифметической програессии aᵢ₊₁ = aᵢ + d
Лайфхак: если это не слишком утяжеляет текст, в выражениях можно использовать операцию-с-запятой:
while()
Если инициализация очень длинная или её нет, а изменение входит в тело, получается for (; <условие>;) <тело>, то есть while ( <условие> ) <тело>
Переписать for(i=0; i<10; i++) printf("%d\n", i); в цикл while()
do … while()
Цикл с постусловием — do <оператор> while ( <условие> ). Нарушает каноническую схему цикла. Всегда выполняется минимум один раз. нужен, когда к началу выполнения цикла ещё невозможно проверить условие.
Переписать в цикл while():
Ещё о scanf()
Лайфхак: функция scanf() возвращает значение — количество введённых переменных. Это и хорошо, и плохо:
Организовать т. н. «цикл по вводу»: вводится (и выводится удвоенным) целое число до тех пор, пока… вводится! То есть пока scanf() возвращает не 0.
Мы вас обманули! Ещё scanf() может возвращать -1, если ввод закончен. Попробуйте вместо числа ввести Ctrl+D. Вжжжух!
Скорее жмите Ctrl+C!
Что произошло:
Ctrl+D — это символ с кодом 4, он управляющий (обрабатывается терминалом ОС Linux. программе на вход не попадает) и собственно и значит «закрыть поток ввода» (если бы для этого каждый раз пришлось отрывать клавиатуру, было бы неудобно).
- Работает только если вводить его в начале строки (actually, при пустом входном буфре)
- Ctrl+C — это символ с кодом 3, он тоже управляющий и значит «убить запущенный процесс»
Кстати, о символах
Тип char — это очень короткое целое. На некоторых архетиктурах — 0…255, на некоторых -128…127
А что это?
Если хотите строгой определённости, пишите unsigned char и signed char.
Чем отличается от int, кроме размера? Примерно ничем!
getchar() и putchar()
getchar() возвращает целое число (int, а не char) — ACSII-код введённого символа
При закрытии ввода тоже возвращает -1; для этого даже есть специальный макрос — EOF
putchar( <целое> ) выводит на стандартный вывод символ с кодом <целое>
Коды символов:
- Всякие буквы
- Ctrl+A, Ctrl+F, Tab,
Теперь хорошо видно, что такое буферизованный ввод: вы что-то набираете, но getchar() срабатывает только после переводя строки
Переделать в цикл for(), который заканчивается при вводе Ctrl+D (то есть при получении -1 aka EOF)
TODO Вложенные циклы не успеем, но там есть ещё один семинар про циклы
Д/З
TODO
- Шифрование методом Цезаря — ввести число, затем посимвольно строку до перевода строки (не включая его), затем вывести эту строку, прибавив число к коду всех символов
- Ещё задача на цикл
Ввести вещественное число в любом из двух форматов (экспоненциальном и с фиксированной точкой) посимвольно. Буква e может быть как большой, так и маленькой; в начале числа и порядка моет стоять '+', '-' и ничего
- Подсказка: возможно, стоит построить синтаксическую диаграмму
- Спойлер — сама синтаксическая диаграмма

Логические операции && и ||