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

Д/З

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

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

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

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

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