10.06 Вложенные циклы

Форма для сдачи

Каноническая схема цикла (повторение)

{i} Вывести (в одну строку, без "\n") часть таблицы умножения вида

Вложенные циклы

{i} Вывести в 9 строк «гробик учителя информатики» — таблицу умножения 1…10 без форматирования

Каноническая схема цикла:

  1. Инициализация
  2. Проверка условия
  3. Тело
  4. Изменение

⇒ Цикл for()!

:)) Сколько операций умножения было выполнено? А если бы таблица умножения была 1…20? ⇒ Квадратичная сложность

Полиномиальная сложность

{OK} Написать (с помощью копипасты) программу, которая вводит n запускает 7 вложенных циклов от 0 до n (n-1, разумеется)

{i} Поэкспериментировать с n так, чтобы программа работала достаточно долго

Break, continue и флаги

:)) Куда происходит переход по break и continue в цикле for()?

«Цикл по вводу»: scanf возвращает количество введённых переменных. Если их меньше ожидаемого или вообще -1 (прагматичнее вместо -1 тут писать EOF), то со вводом что-то не так))

«Поиск первого»: выход из цикла с помощью break в случае, когда сработало дополнительное условие

{i} Вывести последнее введённое число, если оно было нечётное, или первое введённое число, если ввод полностью исчерпан

Флаг — это переменная, содержащая условие выхода из цикла, если их больше одного

{i} Число 13 не прерывает ввод

Ещё про scanf()

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

  <3:
  4>

{OK} лайфхак с getnchar(), если scanf() залип на мусоре

{i} <!> Бонусная задача: Ввести ширину экрана W и вывести таблицу умножения 1…9 в несколько колонок в пределах ширины экрана

Д/З

<!> В этих заданиях нельзя пользоваться массивами

  1. Ввести целое W, вывести таблицу умножения от 1 до 9 включительно в W колонок
    • Обход таблицы умножения происходит построчно, т.е. первым меняется первый множитель
    • При смене второго множителя выводится дополнительный перевод строки
      • в связи с этим, а также из-за конечности выводимой таблицы умножения, для больших W количество колонок будет меньше чем W
    • Все колонки разделены одним пробелом, все числа выровнены пробелами по правому краю (см. printf); пробел после "=" не является разделителем колонок

      • 5

      1*1= 1 2*1= 2 3*1= 3 4*1= 4 5*1= 5
      6*1= 6 7*1= 7 8*1= 8 9*1= 9
      1*2= 2 2*2= 4 3*2= 6 4*2= 8 5*2=10
      6*2=12 7*2=14 8*2=16 9*2=18
      1*3= 3 2*3= 6 3*3= 9 4*3=12 5*3=15
  2. Вводятся группы целых чисел. Разделитель групп - запятая. В группе числа разделены одиночными пробелами. Признак конца ввода - группа "0 0 0", её обрабатывать не надо. В каждой группе найти максимальное число, среди найденных чисел выбрать минимальное и вывести его.
    • 1 2 3,-1 10 5,7 7 7,0 0 0
      3
  3. Написать программу, которая принимает пользовательский ввод, пока пользователь не введет ТРИ ЦЕЛЫХ ЧИСЛА в одной строке; разделитель чисел - пробел. Вывести удачный ввод, т.е. эти три числа с тем же разделителем.
    • (а виновен февраль, три числа под окном...)
      1 2 a
      3,2,1
      3 44
      xyz
      -100 10 0
      -100 10 0
  4. Бонусная задача гроб: Написать программу, которая вводит два целых числа a, b; если они положительны и a делится нацело на b, то выводит процесс деления a на b в столбик; иначе выводит "FAIL".

    • -10 1
      FAIL
      10 3
      FAIL
      1024 16
      1024|16
       96 |64
        64
        64
         0   

Форматировать надо по образцу, показанному выше; "красиво" выглядело бы как показано ниже для того же деления, но так НЕ надо, ибо сложно расписывать правильное количество "-".

  1024 | 16
-  96  |----
   --  | 64
    64
-   64
   ---
     0 

LecturesCMC/AL/Prac/10_ForFor (последним исправлял пользователь hbd 2026-10-05 16:16:15)