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!

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

TODO Вернуть сюда «ещё о scanf()» из будущего семинара (за счёт списания долга) — нужен рассказ про ввод непробельных символов

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

Тип 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 Вложенные циклы не успеем, но там есть ещё один семинар про циклы

Д/З

  1. EJudge: CaesarCrypt 'Шифр Цезаря'

    Шифрование методом Цезаря — ввести число, в той же строке посимвольно (через getchar()) — сообщение до перевода строки (не включая его). К коду каждого символа прибавить введенное число и вывести полученный символ.

    Input:

    10Hi there!
    Output:

    Rs*~ro|o+
  2. EJudge: EuclidGCD 'Наибольший общий делитель'

    Ввести (через scanf()) два целых числа. Проверить их на положительность. Если проверка успешна, то вычислить НОД этих чисел по алгоритму Евклида и вывести полученный НОД. Если проверка неуспешна, вывести "FAIL".

    Input:

    144 108
    Output:

    36
  3. EJudge: CharInput 'Посимвольный ввод числа'

    Ввести целое десятичное число, считывая по одному символу с помощью getchar(). Число может начинаться с + или -, в конце ввода должен быть перевод строки (и только он). Если ввод некорректен, вывести "NaN" (Not a Number), если корректен — введённое число. Попытка ввода числа за пределами констант INT_MIN и INT_MAX из #include <limits.h> также считается NaN.

    Input:

    +12345
    Output:

    12345
  4. <!> Ввести вещественное число в любом из двух форматов (экспоненциальном и с фиксированной точкой) посимвольно. Буква e может быть как большой, так и маленькой; в начале числа и порядка может стоять '+', '-' и ничего. Если введено корректное число, вывести "SUCCESS", иначе вывести "FAIL".

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

LecturesCMC/AL/Prac/09_CharFor (последним исправлял пользователь FrBrGeorge 2026-10-06 11:09:29)