решить на питоне: В файле marks.csv записаны сведения о результатах экзаменов в 9-х классах района. Всего в списке 1000 записей, каждая из которых содержит
• фамилию
• имя
• отметки по четырем предметам (алгебре, русскому языку, физике и истории).
Все элементы в каждой строке разделены запятыми.
Напишите программу, которая читает данные из файла в массив структур (записей) и выводит на экран:
а) средний в районе по каждому предмету;
б) максимальную сумму , полученных учащимися;
в) список учащихся (фамилии и имена), набравших эту максимальную сумму, в алфавитном порядке;
г) количество учащихся, получивших хотя бы одну отметку «2».
Пример данных в файле
Александрова,Маргарита,3,3,4,2
Алескеров,Имран,3,4,4,2
Бармин,Владимир,4,3,4,2
Вот решение на питоне:
```python
import csv
def read_marks():
marks = []
with open('marks.csv') as file:
reader = csv.reader(file)
for row in reader:
marks.append(row)
return marks
def average_marks(marks):
subjects = len(marks[0]) - 2
averages = [0] * subjects
count = len(marks)
for i in range(2, len(marks[0])):
total = 0
for j in range(len(marks)):
total += int(marks[j][i])
averages[i-2] = total / count
return averages
def max_total(marks):
max_sum = 0
max_students = []
for i in range(len(marks)):
total = sum([int(x) for x in marks[i][2:]])
if total > max_sum:
max_sum = total
max_students = [marks[i][:2]]
elif total == max_sum:
max_students.append(marks[i][:2])
return max_sum, max_students
def alphabetical_order(students):
return sorted(students, key=lambda x: (x[1], x[0]))
def count_negative_marks(marks):
count = 0
for i in range(len(marks)):
if '2' in marks[i][2:]:
count += 1
return count
def main():
marks = read_marks()
averages = average_marks(marks)
max_sum, max_students = max_total(marks)
sorted_students = alphabetical_order(max_students)
negative_marks_count = count_negative_marks(marks)
print("Средний балл в районе по каждому предмету:")
for i in range(len(averages)):
print(f"{marks[0][i+2]}: {averages[i]}")
print(f"\nМаксимальная сумма баллов: {max_sum}")
if len(max_students) > 1:
print("\nСписок учащихся, набравших максимальную сумму в алфавитном порядке:")
else:
print("\nУченик, набравший максимальную сумму:")
for student in sorted_students:
print(f"{student[0]} {student[1]}")
print(f"\nКоличество учащихся, получивших хотя бы одну отметку '2': {negative_marks_count}")
if __name__ == '__main__':
main()
```
Пояснение к решению:
- Функция `read_marks()` открывает файл `marks.csv` и считывает данные в массив `marks`.
- Функция `average_marks()` вычисляет средний балл для каждого предмета, перебирая все строки и суммируя оценки по каждому предмету. Результатом является массив `averages`.
- Функция `max_total()` находит учеников с максимальной суммой баллов, перебирая все строки и сравнивая текущую сумму с максимальной. Результатом является максимальная сумма `max_sum` и список учеников `max_students`.
- Функция `alphabetical_order()` сортирует список учеников `max_students` в алфавитном порядке по фамилии и имени.
- Функция `count_negative_marks()` считает количество учащихся, получивших хотя бы одну отметку "2".
- Функция `main()` вызывает все остальные функции и выводит результаты на экран.
Обратите внимание, что предполагается, что файл `marks.csv` находится в том же каталоге, что и исполняемый скрипт. Если файл находится в другом месте, необходимо указать полный путь к файлу при открытии.