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 в случае, когда сработало дополнительное условие

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

Ещё про scanf()

TODO: перенести выше (перед break и continue), т.к. задачки на b. и c. требуют приемов работы с вводом.

Повторение:

   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() залип на мусоре

   1 while((num = scanf("%d", &n)) >= 0)
   2         printf("%d\n", n);

{i} Добавить перед printf() один getchar(), который будет по одному символу отъедать мусор, если 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
      6*3=18 7*3=21 8*3=24 9*3=27
      1*4= 4 2*4= 8 3*4=12 4*4=16 5*4=20
      6*4=24 7*4=28 8*4=32 9*4=36
      1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
      6*5=30 7*5=35 8*5=40 9*5=45
      1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30
      6*6=36 7*6=42 8*6=48 9*6=54
      1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35
      6*7=42 7*7=49 8*7=56 9*7=63
      1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40
      6*8=48 7*8=56 8*8=64 9*8=72
      1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45
      6*9=54 7*9=63 8*9=72 9*9=81  
  2. Вводятся группы целых чисел. Разделитель групп — запятая. В группе числа разделены пробельными символами. Признак конца ввода — конец файла (EOF). В каждой группе найти максимальное число, среди найденных чисел выбрать минимальное и вывести его.
    • 1 2 3, -1 10 5, 7 7 7
      3
  3. Написать программу, которая принимает пользовательский ввод, пока пользователь не введет три целых числа, разделённых пробельными символами scanf() (пробелами, переводами строки, табуляциями и т. п.; в тестах будут только пробелы). Вывести удачный ввод, т.е. эти три числа через пробел.

    • 1 2 a
      3,2,1
      3 44
      xyz
      -100 10 0
      -100 10 0

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