Консультация № 198640
19.05.2020, 14:18
0.00 руб.
1 1 1
Уважаемые эксперты! Пожалуйста, помогите с решением задачи:
Вот мой код, но он у меня не доработан, помогите доработать
n,m=map(int,input().split())
A=[]
for i in range(n):
A.append([int(j) for j in input().split()])
s=0
w=1000
for i in range(n):
for j in range(m):
while i != n:
while j != m:
s += A[i][j]
j+=1
if s < w:
w = s
i+=1
print(w)
Текст задачи на фото
Прикрепленные файлы:
8c9c4a53ae3257971f399430afc948862a17fc00.JPG

Обсуждение

давно
Старший Модератор
312929
1973
24.05.2020, 07:26
общий
это ответ
Здравствуйте, kandALS!

Прежде всего, следует отметить, что использованные Вами в программе операторы цикла for i in range(n) и for j in range(m) уже пробегают все необходимые значения (от 0 до n-1 для i и от 0 до m-1 для j), поэтому стоящие внутри них операторы while i != n и while j != m, выполняющие вместе с командами i+=1 и j+=1 ту же функцию, не нужны (тем более, они не будут работать корректно, поскольку для этого требуется отдельное задание начальных значений i и j, которое Вы не сделали.

Ещё одна серьёзная ошибка - сумма элементов строки (переменная s) должна обнуляться для каждой новой строки, то есть внутри цикла for i in range(n), а не вне его, как у Вас.

Также следует обращать особое внимание на отступы, поскольку в Python нет специальных операторных скобок, наподобие { } в C/C++ или begin end в Pascal, и команды, относящиеся к одному оператору, должны иметь один и тот же отступ.

Кроме того, Ваша программа должна вывести не минимальную сумму элементов строки, а саму строку с минимальной суммой элементов, поэтому следует запоминать не только минимальную сумму, но и номер соответствующей строки.

Наконец, хороший стиль программирования требует наличия в программе максимального количества подсказок для стороннего пользователя. По крайней мере, следует перед запросом данных выводить пояснение, какие данные должны быть введены и в каком виде.

С учётом этих замечаний, Вашу программу можно переделать следующим образом:
[code lang=python]
# coding: cp1251
n, m = map(int, input("Введите число строк и столбцов (через пробел): ").split())
print("Введите матрицу (построчно):")
A = []
for i in range(n):
A.append([int(j) for j in input("строка {0:d}: ".format(i+1)).split()])
w = 1000
k = 0
for i in range(n):
s = 0
for j in range(m):
s += A[i][j]
if s < w:
w = s
k = i
print("Строка с минимальной суммой: ", ' '.join(map(str, A[k])))
[/code]
Здесь во все команды ввода и вывода добавлены соответствующие текстовые пояснения для пользователя (в частности конструкция "строка {0:d}: ".format(i+1) выводит приглашение ввести строку, подставив на место шаблона "{0:d}" первый по порядку аргумент команды format - номер строки). Первая строка программы (# coding: cp1251) обеспечивает корректное отображение символов русского языка для кодовой страницы 1251 (стандартной в Windows). Переменная k запоминает индекс строки с минимальной суммой элементов. Конструкция ' '.join(map(str, A[k])) преобразует все элементы строки в символьный формат и объединяет в одну строку (разделив пробелами), которую можно вывести командой print.

Эта программа выполняет то, что от неё требуется, но её можно сделать ещё компактнее, если Вас не пугают сложные и "навороченные" синтаксические конструкции, обычные для языка Python. В частности, для первого цикла (построчного ввода строк двумерного списка) можно переместить оператор for внутрь самого списка, а вместо поэлементного подсчёта сумм можно использовать встроенную функцию sum, которая сразу подсчитывает сумму элементов строки и даже несколько таких сумм, если использовать вложенный оператор for. Также, имея список сумм элементов строк, можно не только найти в нём нужное нам минимальное значение, но и определить индекс этого значения (с помощью функции index).

С учётом всего вышесказанного программу можно упростить до следующей:
[code lang=python]
# coding: cp1251
n, m = map(int, input("Введите число строк и столбцов (через пробел): ").split())
print("Введите матрицу (построчно):")
A = [[int(a) for a in input("строка {0:d}: ".format(i+1)).split()] for i in range(n)]
s = [sum(A[i]) for i in range(n)]
k = s.index(min(s))
print("Строка с минимальной суммой: ", ' '.join(map(str, A[k])))
[/code]
5
Форма ответа