Задание 9
Электронные таблицы
Как проверить каждую строку таблицы чисел по условию и посчитать подходящие — формулами и программой.
6 подтем · 35 задач + 6 дополнительных · базовый · ≈ 6 мин
Подтема 1 из 6
Строка и условие
Как перевести условие в точные проверки и посчитать подходящие строки — в таблице и программой.
Как устроена тема
В задании 9 дан файл с таблицей чисел. Нужно проверить каждую строку по условию и посчитать, сколько строк подошло, — или найти номер нужной строки. Вот задача, которую мы будем решать всю тему:
«В каждой строке таблицы записаны шесть натуральных чисел. Определи количество строк, для которых выполнены оба условия: в строке одно число повторяется дважды, остальные четыре числа различны; среднее арифметическое неповторяющихся чисел строки больше суммы повторяющихся чисел.»
Каждую строку проверяют отдельно: в электронной таблице — вспомогательными столбцами, в Python — циклом по строкам файла. Сначала разберём, что сказано в условии:
| В условии | Что это значит |
|---|---|
| одно число повторяется дважды, остальные четыре различны | в строке ровно одна пара одинаковых чисел |
| среднее неповторяющихся больше суммы повторяющихся | сравнить среднее четырёх чисел с суммой пары |
| выполнены оба условия | подходят строки, где верно и то и другое |
| определи количество строк | ответ — сколько строк подошло |
В экзаменационном файле тысячи строк. Учиться удобнее на маленькой таблице — шесть строк по шесть чисел: каждую проверку можно повторить вручную.
| Строка | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 1 | 2 | 2 | 5 | 7 | 9 | 11 |
| 2 | 5 | 5 | 1 | 3 | 7 | 9 |
| 3 | 2 | 2 | 5 | 5 | 9 | 11 |
| 4 | 2 | 2 | 2 | 7 | 9 | 11 |
| 5 | 3 | 3 | 4 | 5 | 7 | 8 |
| 6 | 7 | 7 | 20 | 22 | 24 | 26 |
Тема состоит из шести подтем — у каждой своя страница. Идём по ним по порядку:
- Строка и условие — ты сейчас здесь.
- Сумма, наибольшее и наименьшее — наибольшие числа, сумма остальных и средние.
- Повторы в строке — сколько раз встречается каждое число.
- Две группы чисел — повторяющиеся и одиночные числа — и ответ задачи темы: 2.
- Порядок и номер строки — когда спрашивают не количество, а номер.
- Вся таблица и соседние ячейки — дополнительный урок для редких задач.
Задачу можно решить и в электронной таблице, и программой — выбирай вкладку «Таблица» или «Python». На экзамене подойдёт любой способ, а второй пригодится для проверки.
Условие — буквально
Пятая строка — 3, 3, 4, 5, 7, 8. Среднее неповторяющихся чисел (4 + 5 + 7 + 8) / 4 = 6, сумма повторяющихся 3 + 3 = 6. Подходит ли она под задачу темы?
Условие переводят в сравнения дословно: «больше» — знак >, «не меньше» — знак ≥. Среднее 6 не больше 6, поэтому пятая строка не подходит. Если бы в условии было «не меньше», она бы подошла, и ответ стал бы 3. Равенство — первый случай, на котором проверяют решение. Выбери формулировку, чтобы увидеть запись:
- a больше b
- a > b
- a не меньше b
- a ≥ bравенство подходит
- a не больше b
- a ≤ bравенство подходит
- a не превышает b
- a ≤ bто же, что «не больше»
- ровно три числа
- количество = 3
- не менее трёх
- количество ≥ 3
- хотя бы одно
- количество ≥ 1
- ни одного
- количество = 0
Различай «на» и «в»: «a больше b на 5» — a = b + 5, «a больше b в 5 раз» — a = 5b, «a больше b более чем в три раза» — a > 3b. Например, «наименьшее число более чем в шесть раз меньше суммы остальных» — это 6 · m < S − m, где m — наименьшее, S — сумма строки.
Несколько условий
Проверки строки соединяют так, как сказано в условии: «оба» — и, «хотя бы одно» — или, «ровно одно» — одно из двух, но не оба. Результат отдельной проверки — да или нет: в таблице ИСТИНА и ЛОЖЬ, в Python True и False.
Пусть P — «сумма больше 35», Q — «наибольшее меньше 10». У первой строки сумма 36, а наибольшее 11: P верна, Q нет. Под «оба условия» строка не подходит, под «хотя бы одно» и «ровно одно» — подходит.
| P | Q | Оба | Хотя бы одно | Ровно одно |
|---|---|---|---|---|
| нет | нет | нет | нет | нет |
| нет | да | нет | да | да |
| да | нет | нет | да | да |
| да | да | да | да | нет |
Главное различие — в последней строке таблицы: «хотя бы одно» допускает оба, «ровно одно» — нет.
Тонкости:одно число или разные
В строке 3, 8, 11 есть чётное число — 8 и есть число больше 10 — 11. Поэтому «есть чётное число и есть число больше 10» верно. А «есть чётное число, которое больше 10», неверно: здесь оба условия должно выполнять одно и то же число.
Признак и счётчик
Сколько строк учебной таблицы имеют сумму больше 30?
Каждую строку проверяют отдельно и учитывают один раз: в таблице — признаком 1 или 0, в программе — счётчиком. Ответ — сколько строк прошли проверку.
Числа строки 1 занимают A1:F1. Справа от них ставят вспомогательные столбцы: СУММ даёт сумму, а ЕСЛИ превращает проверку в 1 или 0:
=СУММ(A1:F1)=ЕСЛИ(G1>30; 1; 0)Обе формулы до последней строки данных: каждая строка проверяет свои числа. Ответ — сумма признаков в H7:
| A | B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 2 | 5 | 7 | 9 | 11 | 36 | 1 |
| 2 | 5 | 5 | 1 | 3 | 7 | 9 | 30 | 0 |
| 3 | 2 | 2 | 5 | 5 | 9 | 11 | 34 | 1 |
| 4 | 2 | 2 | 2 | 7 | 9 | 11 | 33 | 1 |
| 5 | 3 | 3 | 4 | 5 | 7 | 8 | 30 | 0 |
| 6 | 7 | 7 | 20 | 22 | 24 | 26 | 106 | 1 |
| 7 | 4 |
G1скопирована до G6=СУММ(A1:F1)H1скопирована до H6=ЕСЛИ(G1>30;1; 0) H7=СУММ(H1:H6)
Подходят строки 1, 3, 4 и 6. Вторая и пятая дают ровно 30 и получают 0. Поменяй любое число второй строки — её признак пересчитается.
Несколько проверок соединяют функциями И и ИЛИ, «ровно одно» — сравнением двух проверок знаком <> («не равно»):
=ЕСЛИ(И(СУММ(A1:F1)>35;МАКС(A1:F1)<10); 1; 0)=ЕСЛИ(ИЛИ(СУММ(A1:F1)>35;МАКС(A1:F1)<10); 1; 0)=ЕСЛИ((СУММ(A1:F1)>35)<>(МАКС(A1:F1)<10); 1; 0)При протягивании вниз =СУММ(A1:F1) становится =СУММ(A2:F2) — так работают . Вместо суммы признаков можно включить фильтр по столбцу признака — он покажет только подходящие строки (подтема 5).
Строки таблицы можно записать строк, где каждая строка — тоже список. Цикл берёт строки по очереди, проверяет сумму, а answer += 1 учитывает подходящую строку. Нажми «Запуск» и пройди программу по шагам:
table = [ [2, 2, 5, 7, 9, 11], [5, 5, 1, 3, 7, 9], [2, 2, 5, 5, 9, 11], [2, 2, 2, 7, 9, 11], [3, 3, 4, 5, 7, 8], [7, 7, 20, 22, 24, 26],]answer = 0for a in table: if sum(a) > 30: answer += 1print(answer)С файлом меняется только начало: программа по строкам, делит строку на части, а с переводит их в числа:
answer = 0with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] if sum(a) > 30: answer += 1print(answer)answer = 0 стоит до цикла, чтобы ответ не обнулялся; список a строится заново для каждой строки; print(answer) — после цикла.
дают сумму, наименьшее и наибольшее число строки. Проверки соединяют , «ровно одно» — сравнением !=:
a = [2, 2, 5, 7, 9, 11]p = sum(a) > 35q = max(a) < 10print(p, q)print(p and q, p or q, p != q)Файл задачи
Файл задачи открывают в электронной таблице как есть, а для программы сохраняют текстом. На экзамене дают таблицу — .xlsx, .ods или .csv. Файл .xlsx или .ods нельзя прочитать программой как текст: внутри хранятся листы и ячейки в сжатом виде.
- Открой файл в электронной таблице.
- Сохрани его как текст — «Текст (разделитель — табуляция)» или — в папку с программой.
- Открой получившийся файл в блокноте и посмотри, чем разделены числа.
От разделителя зависит запись split. Выбери, как выглядит строка файла:
- 2 2 5 7 9 11
line.split()- числа разделены табуляциями
line.split()- 2;2;5;7;9;11
line.split(";")- 2,2,5,7,9,11
line.split(",")
Без аргумента split() делит строку по любым пробелам и табуляциям. Для задач ниже даны оба файла: таблица .xlsx и та же таблица текстом .txt.
Тонкости:что не должно попасть в файл
В текстовый файл должны попасть только исходные числа: без строки заголовков, вспомогательных столбцов с формулами и пустых строк. Иначе int встретит текст и программа остановится с ошибкой.
В чужих решениях строку переводят в числа записью — она делает то же, что включение [int(part) for part in line.split()].
Итого
- Условиедословно: «больше» — >, «не меньше» — ≥; проверь равенство
- Оба, хотя бы, ровно
И,ИЛИ,<>;and,or,!= - Признак
=ЕСЛИ(…;, протянуть, сложить1; 0) - Счётчик
answer = 0до цикла,+= 1после проверки строки - Файлсохранить текстом, делить по разделителю
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
=ЕСЛИ(И(СУММ(A1:F1)>30; МИН(A1:F1)<=2); 1; 0); подходят 3 строки — первая, третья и четвёртая. У шестой строки сумма 106, но наименьшее 7.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
«Не меньше» и «больше»
Введите число.
Подсказка
«Не меньше 34» допускает сумму, равную 34.
Решение
Суммы строк учебной таблицы — 36, 30, 34, 33, 30 и 106. Не меньше 34 три из них: 36, 34 и 106. Сумма 34 третьей строки подходит под «не меньше», но не подошла бы под «больше».
Решение программой
answer = 0with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] if sum(a) >= 34: answer += 1print(answer)Ответ: 3
Ровно одно из двух условий
Для той же таблицы 9-1.xlsx, 9-1.txt определи количество строк, для которых выполнено ровно одно из условий: наибольшее число строки больше 95; наименьшее число строки меньше 5.
Введите число.
Подсказка
«Ровно одно» — две проверки дают разные ответы; «или» засчитало бы и строки, где выполнены оба условия.
Решение
«Ровно одно» — результаты двух проверок различны: в программе (max(a) > 95) != (min(a) < 5), в таблице =ЕСЛИ((МАКС(A1:F1)>95)<>(МИН(A1:F1)<5);. Строки, где выполнены оба условия, не считаются; подходит 387 строк.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] if (max(a) > 95) != (min(a) < 5): answer += 1print(answer)Ответ: 387
Числа и строки
Введите число.
Подсказка
Строка считается один раз, сколько бы в ней ни было подходящих чисел.
Решение
Чисел больше 8 в таблице одиннадцать, но строка учитывается один раз, сколько бы в ней ни было подходящих чисел. Такие числа есть во всех строках, кроме пятой (3, 3, 4, 5, 7, 8): 8 не больше 8.
Решение программой
rows = 0with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] big = [x for x in a if x > 8] if len(big) > 0: rows += 1print(rows)Ответ: 5
Сумма и наибольшее число
В каждой строке таблицы 9-1.xlsx, 9-1.txt записаны шесть натуральных чисел. Определи количество строк, в которых сумма чисел больше 300, а наибольшее число строки меньше 90.
Введите число.
Подсказка
Соедини две проверки строки через «и»: подходят строки, где выполнены обе.
Решение
Оба условия должны выполняться для одной строки, поэтому их соединяют через «и»: в таблице признак =ЕСЛИ(И(СУММ(A1:F1)>300;, в программе sum(a) > 300 and max(a) < 90. Сумма признаков — 163.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] if sum(a) > 300 and max(a) < 90: answer += 1print(answer)Ответ: 163