10.06 Вложенные циклы
Каноническая схема цикла (повторение)
Вывести (в одну строку, без "\n") часть таблицы умножения вида
1*3=3 2*3=6 … 9*3=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
- TODO: почётче сформулировать, что значит "ввод полностью исчерпан". В т.ч. для случая, когда во вводе мусор.
Флаг — это переменная, содержащая условие выхода из цикла, если их больше одного
Решение предыдущего задания с флагом
Дополнительно: число 13 не прерывает ввод
Ещё про scanf()
TODO: перенести выше (перед break и continue), т.к. задачки на b. и c. требуют приемов работы с вводом.
Повторение:
EOF (оно же -1) при закрытии ввода от scanf() и getchar()
Закрытие ввода происходит само собой, если запускать ./пограмма < ввод или по Ctrl+D, если запускать просто программу: - и
Непробельные символы в форматной строке нужно вводить
Объяснить/предсказать поведение на вводе: <3:4>
3 4
<3 4>
- в две строки!
<3: 4>
лайфхак с getnchar(), если scanf() залип на мусоре
- Введём мусор — о ужас!
Добавить перед printf() один getchar(), который будет по одному символу отъедать мусор, если scanf() не ввёл переменную. Повводить что угодно с цифрами.
Добавить ещё и continue, чтобы не выводить старое значение повторно
Бонусная задача: Ввести ширину экрана 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 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
- Вводятся группы целых чисел. Разделитель групп — запятая. В группе числа разделены пробельными символами. Признак конца ввода — конец файла (EOF). В каждой группе найти максимальное число, среди найденных чисел выбрать минимальное и вывести его.
1 2 3, -1 10 5, 7 7 7 3
Написать программу, которая принимает пользовательский ввод, пока пользователь не введет три целых числа, разделённых пробельными символами scanf() (пробелами, переводами строки, табуляциями и т. п.; в тестах будут только пробелы). Вывести удачный ввод, т.е. эти три числа через пробел.
1 2 a 3,2,1 3 44 xyz -100 10 0 -100 10 0
