Pavel 2 месяцев назад
Родитель 9c0613275b
Сommit 8d3534f462

@ -1,22 +1,19 @@
# M0.py # M0.pyimport sys
import pickle import os
import pylab
import M2 import M2
# Получаем данные (они уже прочитаны в M2) output_lines = []
data = M2.original_data output_lines.append("Результаты анализа данных о запасах угля")
# График for country, value in zip(M2.result_countries, M2.result_per_capita):
pylab.plot(data, marker='o') line = f"{country}: {value:.6f} трлн т/млн чел"
pylab.title("Исходные данные") output_lines.append(line)
pylab.xlabel("Номер")
pylab.ylabel("Значение") output_lines.append(f"\nОбщее отношение ресурсов к населению: {M2.result_overall:.6f}")
pylab.grid(True)
pylab.show()
# Запись в бинарный файл f = open("Res3030.txt", "w", encoding="utf-8")
f = open("RES2a.bin", "wb") for line in output_lines:
pickle.dump(data, f) f.write(line + "\n")
f.close() f.close()
print("Исходные данные записаны в RES2a.bin") print("\nРезультаты записаны в файл Res3030.txt")

@ -1,53 +1,42 @@
# M1.py import pylab
import os def func1(data_dict):
import math """
Аргумент: словарь {страна: [население, ресурс]}
def func1(filename, KK): Возвращает:
numbers = [] - список стран,
f = open(filename, 'r') - список ресурс/душу,
for line in f: - общее отношение суммарных ресурсов к суммарному населению
parts = line.split() """
for p in parts: countries = []
numbers.append(float(p)) per_capita = []
f.close() total_pop = 0.0
total_res = 0.0
base, ext = os.path.splitext(filename)
f1 = open(base + '1' + ext, 'w') for country, values in data_dict.items():
f2 = open(base + '2' + ext, 'w') pop = values[0]
res = values[1]
for x in numbers: countries.append(country)
if x > KK: per_capita.append(res / pop if pop != 0 else 0)
f1.write(str(x) + '\n') total_pop += pop
else: total_res += res
f2.write(str(x) + '\n')
overall_ratio = total_res / total_pop if total_pop != 0 else 0
f1.close() return countries, per_capita, overall_ratio
f2.close()
return numbers
def func2(data_dict):
"""
def func2(filename): столбиковая диаграмма распределения ресурсов по странам.
numbers = [] """
f = open(filename, 'r') countries = list(data_dict.keys())
for line in f: resources = []
parts = line.split() for country in countries:
for p in parts: resources.append(data_dict[country][1])
numbers.append(float(p))
f.close() pylab.figure(figsize=(10, 5))
pylab.bar(countries, resources, color='blue')
if len(numbers) == 0: pylab.title("Распределение угля по странам (трлн т)")
return 0, 0, 0, 0, 0 # пустой файл pylab.xlabel("Страны")
pylab.ylabel("Запасы угля")
n = len(numbers) pylab.tight_layout()
mean = sum(numbers) / n pylab.show()
min_val = min(numbers)
max_val = max(numbers)
std_dev = math.sqrt(sum((x - mean) ** 2 for x in numbers) / n)
sorted_nums = sorted(numbers)
if n % 2 == 1:
median = sorted_nums[n // 2]
else:
median = (sorted_nums[n // 2 - 1] + sorted_nums[n // 2]) / 2
return mean, median, min_val, max_val, std_dev

@ -1,38 +1,25 @@
# M2.py # M2.py
import os import os
import pickle
from M1 import func1, func2 from M1 import func1, func2
# Запрос имени файла с проверкой существования filename = input("Введите имя файла с данными: ").strip()
filename = input("Введите имя файла с исходными данными: ")
while not os.path.isfile(filename):
print("Файл не найден.")
filename = input("Введите имя файла с исходными данными: ")
# Запрос порога f = open(filename, "rb")
KK = float(input("Введите пороговое значение KK: ")) data = pickle.load(f)
f.close()
# Вызов func1 countries, per_capita, overall_ratio = func1(data)
data = func1(filename, KK)
# Имена новых файлов print("\nСтраны и ресурс на душу населения:")
base, ext = os.path.splitext(filename) for i in range(len(countries)):
file1 = base + '1' + ext print(f"{countries[i]}: {per_capita[i]:.6f} трлн т/млн чел")
file2 = base + '2' + ext
# Три вызова func2 print(f"\nОбщее отношение суммарных ресурсов к суммарному населению: {overall_ratio:.6f}")
files = [filename, file1, file2]
labels = ["Исходный", "Больше KK", "Не больше KK"]
print("\nРезультаты статистики:") func2(data)
print("-" * 50)
for i in range(3):
mean, median, minv, maxv, std = func2(files[i])
print(f"\n{labels[i]} файл:")
print(f" Среднее: {mean:.4f}")
print(f" Медиана: {median:.4f}")
print(f" Минимум: {minv:.4f}")
print(f" Максимум: {maxv:.4f}")
print(f" Ст. откл.: {std:.4f}")
# Возвращаем исходные данные для M0 result_countries = countries
original_data = data result_per_capita = per_capita
result_overall = overall_ratio
result_data = data

@ -0,0 +1,9 @@
Результаты анализа данных о запасах угля
США: 0.076821 трлн т/млн чел
Россия: 0.103425 трлн т/млн чел
Австралия: 0.500000 трлн т/млн чел
Китай: 0.009217 трлн т/млн чел
Индия: 0.007279 трлн т/млн чел
Германия: 0.039759 трлн т/млн чел
Общее отношение ресурсов к населению: 0.023178

Двоичные данные
TEMA9/Ugol.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 29 KiB

@ -0,0 +1,15 @@
import pickle
data = {
"США": [302, 23.2],
"Россия": [146, 15.1],
"Австралия": [28, 14.0],
"Китай": [1443, 13.3],
"Индия": [1415, 10.3],
"Германия": [83, 3.3]
}
f = open("ugol.dat", "wb")
pickle.dump(data, f)
f.close()
print("Бинарный файл ugol.dat создан.")

@ -0,0 +1,165 @@
## Индивидуальное контрольное задание по теме 9 вариант 6
Анисенков Павел А-01-23
## Задание
1) Создайте модуль М1, содержащий две функции:
- функция 1: аргумент - словарь с исходными данными (ключи - страны, значения - списки с 2 значениями: население, объем некоторого ресурса); функция должна создать два списка: список стран и список с элементами - для каждой страны значение ресурса на душу населения, а также значение отношения суммарных ресурсов к суммарному населению;
- функция 2: аргумент - словарь, такой же, как в функции1; функция должна построить столбиковую диаграмму, демонстрирующую распределение ресурса по странам.
2) Создайте еще один модуль М2, в котором должны выполняться операции:
- запрашивается и вводится имя бинарного файла, проверяется его наличие, и если он существует, то из него считывается объект-словарь с исходными данными;
- вызывается функция 1 и отображаются результаты;
- вызывается функция 2.
3) Создайте модуль М0 - главную программу, которая вызывает М2 и после завершения ее работы записывает полученные результаты в текстовый файл Res3030.txt.
4) Проверьте программу с данными о запасах угля в разных странах:
США 302 23.2
Россия 146 15.1
Австралия 28 14
Китай 1443 13.3
Индия 1415 10.3
Германия 83 3.3
## Решение
Сначала создадим бинарный файл с данными:
```py
import pickle
data = {
"США": [302, 23.2],
"Россия": [146, 15.1],
"Австралия": [28, 14.0],
"Китай": [1443, 13.3],
"Индия": [1415, 10.3],
"Германия": [83, 3.3]
}
f = open("ugol.dat", "wb")
pickle.dump(data, f)
f.close()
print("Бинарный файл ugol.dat создан.")
M1
import pylab
def func1(data_dict):
"""
Аргумент: словарь {страна: [население, ресурс]}
Возвращает:
- список стран,
- список ресурс/душу,
- общее отношение суммарных ресурсов к суммарному населению
"""
countries = []
per_capita = []
total_pop = 0.0
total_res = 0.0
for country, values in data_dict.items():
pop = values[0]
res = values[1]
countries.append(country)
per_capita.append(res / pop if pop != 0 else 0)
total_pop += pop
total_res += res
overall_ratio = total_res / total_pop if total_pop != 0 else 0
return countries, per_capita, overall_ratio
def func2(data_dict):
"""
столбиковая диаграмма распределения ресурсов по странам.
"""
countries = list(data_dict.keys())
resources = []
for country in countries:
resources.append(data_dict[country][1])
pylab.figure(figsize=(10, 5))
pylab.bar(countries, resources, color='blue')
pylab.title("Распределение угля по странам (трлн т)")
pylab.xlabel("Страны")
pylab.ylabel("Запасы угля")
pylab.tight_layout()
pylab.show()
M2
import os
import pickle
from M1 import func1, func2
filename = input("Введите имя файла с данными: ").strip()
f = open(filename, "rb")
data = pickle.load(f)
f.close()
countries, per_capita, overall_ratio = func1(data)
print("\nСтраны и ресурс на душу населения:")
for i in range(len(countries)):
print(f"{countries[i]}: {per_capita[i]:.6f} трлн т/млн чел")
print(f"\nОбщее отношение суммарных ресурсов к суммарному населению: {overall_ratio:.6f}")
func2(data)
result_countries = countries
result_per_capita = per_capita
result_overall = overall_ratio
result_data = data
M0
import os
import M2
output_lines = []
output_lines.append("Результаты анализа данных о запасах угля")
for country, value in zip(M2.result_countries, M2.result_per_capita):
line = f"{country}: {value:.6f} трлн т/млн чел"
output_lines.append(line)
output_lines.append(f"\nОбщее отношение ресурсов к населению: {M2.result_overall:.6f}")
f = open("Res3030.txt", "w", encoding="utf-8")
for line in output_lines:
f.write(line + "\n")
f.close()
print("\nРезультаты записаны в файл Res3030.txt")
```
Отображение результата:
```py
Введите имя файла с данными: ugol.dat
Страны и ресурс на душу населения:
США: 0.076821 трлн т/млн чел
Россия: 0.103425 трлн т/млн чел
Австралия: 0.500000 трлн т/млн чел
Китай: 0.009217 трлн т/млн чел
Индия: 0.007279 трлн т/млн чел
Германия: 0.039759 трлн т/млн чел
Общее отношение суммарных ресурсов к суммарному населению: 0.023178
Результаты записаны в файл Res3030.txt
```
![](Ugol.png)

Двоичные данные
TEMA9/ugol.dat

Двоичный файл не отображается.
Загрузка…
Отмена
Сохранить