Дан файл f, содержащий сведения о студентах: ФИО, группа, оценки за экзамены. Вывести в файл f1 и на экран сведения о студентах, имеющих неудовлетворительные оценки; подсчитать их количество. В файл f2 и на экран вывести сведения об отличниках; подсчитать их количество. Использовать при решении подпрограммы. Предусмотреть проверку открытия файла.
```
Иванов Иван Иванович, 1, 5 4 3
Петров Петр Петрович, 2, 4 5 5
Сидоров Сидор Сидорович, 1, 4 3 3
```
Для решения задачи мы будем использовать следующие подпрограммы:
1. `read_file` - для чтения данных из файла f.
2. `write_file` - для записи данных в файл f1 и f2.
3. `get_average_grade` - для подсчета средней оценки студента.
4. `count_students` - для подсчета количества студентов с неудовлетворительными оценками и отличников.
Теперь предлагаю написать программу, которая будет выполнять поставленную задачу.
```python
def read_file(filename):
try:
with open(filename, 'r') as file:
lines = file.readlines()
return lines
except FileNotFoundError:
print("Файл не найден!")
return []
def write_file(filename, lines):
try:
with open(filename, 'w') as file:
file.writelines(lines)
except FileNotFoundError:
print("Ошибка записи в файл!")
def get_average_grade(grades):
grades_list = grades.split()
grades_list = [int(grade) for grade in grades_list]
average = sum(grades_list) / len(grades_list)
return round(average, 2)
def count_students(students):
unsatisfactory = 0
excellent = 0
unsatisfactory_students = []
excellent_students = []
for student in students:
data = student.split(',')
name = data[0].strip()
group = data[1].strip()
grades = data[2].strip()
average_grade = get_average_grade(grades)
if average_grade < 3:
unsatisfactory += 1
unsatisfactory_students.append(student)
elif average_grade >= 4.5:
excellent += 1
excellent_students.append(student)
return unsatisfactory, excellent, unsatisfactory_students, excellent_students
# Основной код программы
filename = "students.txt"
output_filename1 = "f1.txt"
output_filename2 = "f2.txt"
lines = read_file(filename)
if len(lines) > 0:
unsatisfactory, excellent, unsatisfactory_students, excellent_students = count_students(lines)
write_file(output_filename1, unsatisfactory_students)
write_file(output_filename2, excellent_students)
print("Студенты с неудовлетворительными оценками:")
for student in unsatisfactory_students:
print(student.strip())
print("\nСтуденты-отличники:")
for student in excellent_students:
print(student.strip())
print("\nКоличество студентов с неудовлетворительными оценками:", unsatisfactory)
print("Количество студентов-отличников:", excellent)
```
Давайте разберем, что происходит в этой программе шаг за шагом:
1. Мы начинаем с определения всех необходимых подпрограмм.
2. Подпрограмма `read_file` открывает файл и считывает все строки из него. Если файл не найден, выводится сообщение об ошибке и возвращается пустой список. Функция возвращает список, содержащий строки из файла.
3. Подпрограмма `write_file` открывает файл и записывает в него строки из переданного списка. Если файл не найден, выводится сообщение об ошибке.
4. Подпрограмма `get_average_grade` принимает оценки студента в виде строки, разделенных пробелами, и возвращает среднюю оценку, округленную до двух знаков после запятой. Для этого сначала разделяем строку на отдельные оценки, затем преобразуем их в целочисленный тип и находим среднее значение.
5. Подпрограмма `count_students` принимает список строк с информацией о студентах. Она инициализирует переменные для подсчета неудовлетворительных и отличных оценок, а также списки для хранения информации о студентах с такими оценками. Затем она проходит по каждой строке, извлекает из нее ФИО, группу и оценки, рассчитывает среднюю оценку с помощью `get_average_grade` и добавляет студента в соответствующий список в зависимости от его оценки. В конце функция возвращает количество студентов с неудовлетворительными оценками, количество отличников и списки студентов с такими оценками.
6. В основной части программы мы указываем имя файла с данными о студентах, а также имена файлов для записи информации о студентах с неудовлетворительными оценками и отличниками.
7. Мы используем подпрограмму `read_file` для чтения данных из файла.
8. Если список строк не пустой, то вызываем подпрограмму `count_students` для подсчета и сохранения информации о студентах с неудовлетворительными оценками и отличников.
9. Затем мы выводим информацию о студентах с неудовлетворительными оценками и отличниках на экран, а также количество таких студентов.
Таким образом, эта программа позволяет извлечь данные из файла с оценками студентов, определить количество студентов с неудовлетворительными оценками и отличников, а затем записать информацию о них в отдельные файлы и вывести на экран. Код написан таким образом, чтобы он был понятен школьнику, с пояснениями и пошаговым решением.