diff --git a/TEMA9/M0.py b/TEMA9/M0.py index 3786799..b04e2a9 100644 --- a/TEMA9/M0.py +++ b/TEMA9/M0.py @@ -1,22 +1,19 @@ -# M0.py -import pickle -import pylab +# M0.pyimport sys +import os import M2 -# Получаем данные (они уже прочитаны в M2) -data = M2.original_data +output_lines = [] +output_lines.append("Результаты анализа данных о запасах угля") -# График -pylab.plot(data, marker='o') -pylab.title("Исходные данные") -pylab.xlabel("Номер") -pylab.ylabel("Значение") -pylab.grid(True) -pylab.show() +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("RES2a.bin", "wb") -pickle.dump(data, f) +f = open("Res3030.txt", "w", encoding="utf-8") +for line in output_lines: + f.write(line + "\n") f.close() -print("Исходные данные записаны в RES2a.bin") +print("\nРезультаты записаны в файл Res3030.txt") diff --git a/TEMA9/M1.py b/TEMA9/M1.py index 2878618..0640f04 100644 --- a/TEMA9/M1.py +++ b/TEMA9/M1.py @@ -1,53 +1,42 @@ -# M1.py -import os -import math - -def func1(filename, KK): - numbers = [] - f = open(filename, 'r') - for line in f: - parts = line.split() - for p in parts: - numbers.append(float(p)) - f.close() - - base, ext = os.path.splitext(filename) - f1 = open(base + '1' + ext, 'w') - f2 = open(base + '2' + ext, 'w') - - for x in numbers: - if x > KK: - f1.write(str(x) + '\n') - else: - f2.write(str(x) + '\n') - - f1.close() - f2.close() - return numbers - - -def func2(filename): - numbers = [] - f = open(filename, 'r') - for line in f: - parts = line.split() - for p in parts: - numbers.append(float(p)) - f.close() - - if len(numbers) == 0: - return 0, 0, 0, 0, 0 # пустой файл - - n = len(numbers) - mean = sum(numbers) / n - 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 +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() diff --git a/TEMA9/M2.py b/TEMA9/M2.py index 0f60e76..05b4fec 100644 --- a/TEMA9/M2.py +++ b/TEMA9/M2.py @@ -1,38 +1,25 @@ # M2.py import os +import pickle from M1 import func1, func2 -# Запрос имени файла с проверкой существования -filename = input("Введите имя файла с исходными данными: ") -while not os.path.isfile(filename): - print("Файл не найден.") - filename = input("Введите имя файла с исходными данными: ") +filename = input("Введите имя файла с данными: ").strip() -# Запрос порога -KK = float(input("Введите пороговое значение KK: ")) +f = open(filename, "rb") +data = pickle.load(f) +f.close() -# Вызов func1 -data = func1(filename, KK) +countries, per_capita, overall_ratio = func1(data) -# Имена новых файлов -base, ext = os.path.splitext(filename) -file1 = base + '1' + ext -file2 = base + '2' + ext +print("\nСтраны и ресурс на душу населения:") +for i in range(len(countries)): + print(f"{countries[i]}: {per_capita[i]:.6f} трлн т/млн чел") -# Три вызова func2 -files = [filename, file1, file2] -labels = ["Исходный", "Больше KK", "Не больше KK"] +print(f"\nОбщее отношение суммарных ресурсов к суммарному населению: {overall_ratio:.6f}") -print("\nРезультаты статистики:") -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}") +func2(data) -# Возвращаем исходные данные для M0 -original_data = data +result_countries = countries +result_per_capita = per_capita +result_overall = overall_ratio +result_data = data diff --git a/TEMA9/Res3030.txt b/TEMA9/Res3030.txt new file mode 100644 index 0000000..5ebd531 --- /dev/null +++ b/TEMA9/Res3030.txt @@ -0,0 +1,9 @@ +Результаты анализа данных о запасах угля +США: 0.076821 трлн т/млн чел +Россия: 0.103425 трлн т/млн чел +Австралия: 0.500000 трлн т/млн чел +Китай: 0.009217 трлн т/млн чел +Индия: 0.007279 трлн т/млн чел +Германия: 0.039759 трлн т/млн чел + +Общее отношение ресурсов к населению: 0.023178 diff --git a/TEMA9/Ugol.png b/TEMA9/Ugol.png new file mode 100644 index 0000000..0a24e11 Binary files /dev/null and b/TEMA9/Ugol.png differ diff --git a/TEMA9/create_data.py b/TEMA9/create_data.py new file mode 100644 index 0000000..83bf2b4 --- /dev/null +++ b/TEMA9/create_data.py @@ -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 создан.") diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..250abd9 --- /dev/null +++ b/TEMA9/test.md @@ -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) \ No newline at end of file diff --git a/TEMA9/ugol.dat b/TEMA9/ugol.dat new file mode 100644 index 0000000..fdb49e9 Binary files /dev/null and b/TEMA9/ugol.dat differ diff --git a/TEMA9/Новый текстовый документ.txt b/TEMA9/Новый текстовый документ.txt new file mode 100644 index 0000000..e69de29