10.06 Вложенные циклы
Каноническая схема цикла (повторение)
Вывести (в одну строку, без "\n") часть таблицы умножения вида
1*3=3 2*3=6 … 9*27
Использовать цикл while
Вложенные циклы
Вывести в 9 строк «гробик учителя информатики» — таблицу умножения 1…10 без форматирования
Использовать цикл while - Место инициализации внутреннего цикла
Каноническая схема цикла:
- Инициализация
- Проверка условия
- Тело
- Изменение
⇒ Цикл for()!
Сколько операций умножения было выполнено? А если бы таблица умножения была 1…20? ⇒ Квадратичная сложность
Полиномиальная сложность
Написать (с помощью копипасты) программу, которая вводит n запускает 7 вложенных циклов от 0 до n (n-1, разумеется)
- Подсчитать с помощью ++ и вывести, сколько раз выполняется тело внутреннего цикла
Объяснить поведение для n=10,11,12,20,30
Поэкспериментировать с n так, чтобы программа работала достаточно долго
Что будет, если добавить восьмой вложенный цикл
Break, continue и флаги
Куда происходит переход по break и continue в цикле for()?
«Цикл по вводу»: scanf возвращает количество введённых переменных. Если их меньше ожидаемого или вообще -1 (прагматичнее вместо -1 тут писать EOF), то со вводом что-то не так))
Пример цикла по вводу. Что такое EOF, как его ввести руками
«Поиск первого»: выход из цикла с помощью break в случае, когда сработало дополнительное условие
Вводить числа до конца (корректного) ввода, но если встретится нечетное число, немедленно выйти
Вывести последнее введённое число, если оно было нечётное, или первое введённое число, если ввод полностью исчерпан
Использовать break
Флаг — это переменная, содержащая условие выхода из цикла, если их больше одного
Решение предыдущего задания с флагом
Число 13 не прерывает ввод
Ещё про scanf()
- Непробельные символы в форматной строке нужно вводить
Объяснить/предсказать поведение на вводе: <3:4>
3 4
<3 4>
- в две строки!
<3: 4>
лайфхак с getnchar(), если scanf() залип на мусоре
Бонусная задача: Ввести ширину экрана W и вывести таблицу умножения 1…9 в несколько колонок в пределах ширины экрана
- Таблица выводится поблочно
×1 ×2 ×3 ×4 ×5 ×6 ×7 ×8 ×9
Д/З
В этих заданиях нельзя пользоваться массивами
- Ввести целое 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
- Вводятся группы целых чисел. Разделитель групп - запятая. В группе числа разделены одиночными пробелами. Признак конца ввода - группа "0 0 0", её обрабатывать не надо. В каждой группе найти максимальное число, среди найденных чисел выбрать минимальное и вывести его.
1 2 3,-1 10 5,7 7 7,0 0 0 3
- Написать программу, которая принимает пользовательский ввод, пока пользователь не введет ТРИ ЦЕЛЫХ ЧИСЛА в одной строке; разделитель чисел - пробел. Вывести удачный ввод, т.е. эти три числа с тем же разделителем.
- (а виновен февраль, три числа под окном...)
1 2 a 3,2,1 3 44 xyz -100 10 0 -100 10 0
- (а виновен февраль, три числа под окном...)
Бонусная задача гроб: Написать программу, которая вводит два целых числа 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 