Files
python-labs/TEMA9/test.md

188 строки
7.1 KiB
Markdown

# Общее контрольно задание по Теме 9
Соловьёва Екатерина, А-01-23
## Задание:
1) Создайте модуль М1, содержащий 2 функции:
- функция 1: аргумент - список или кортеж с отсчетами некоторого сигнала; функция должна определить и вернуть число элементов, значение которых превышает значение предыдущего элемента;
- функция 2: аргумент - список или кортеж с последовательностью отсчетов сигнала; функция должна рассчитать список с накопленными суммами: первый элемент равен первому элементу исходной последовательности, второй - равен сумме двух первых элементов последовательности, третий - сумме первых трех элементов и т.д.
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
- запрашивается имя бинарного файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;
- выборка вводится из файла;
- с помощью функции 1 производится определение числа элементов со значениями, превышающими значения их предшественников;
- с помощью функции 2 рассчитывается список с кумулятивными суммами;
- выборка отображается в виде графика.
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.
4) Проведите расчеты при 2-х разных исходных файлах.
## Решение:
M1.py
```py
def count_increasing_elements(sequence):
""" Функция 1: подсчитывает число элементов, значение которых превышает значение предыдущего элемента"""
if len(sequence) <= 1:
return 0
count = 0
for i in range(1, len(sequence)):
if sequence[i] > sequence[i-1]:
count += 1
return count
def cumulative_sum(sequence):
"""Функция 2: рассчитывает список с накопленными суммами"""
result = []
current_sum = 0
for value in sequence:
current_sum += value
result.append(current_sum)
return result
```
M2.py
```py
import os
import struct
import matplotlib.pyplot as plt
from M1 import count_increasing_elements, cumulative_sum
def read_binary_file(filename):
"""
Читает бинарный файл с числами с плавающей точкой
"""
data = []
try:
with open(filename, 'rb') as f:
while True:
bytes_data = f.read(8)
if not bytes_data:
break
value = struct.unpack('d', bytes_data)[0]
data.append(value)
except Exception as e:
print(f"Ошибка при чтении файла: {e}")
return data
def display_plots(original_data, cumulative_data):
"""
Отображает графики исходных данных и кумулятивных сумм
"""
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
ax1.plot(original_data, 'b-', linewidth=1.5, label='Исходный сигнал')
ax1.set_xlabel('Отсчеты')
ax1.set_ylabel('Амплитуда')
ax1.set_title('Исходный сигнал')
ax1.grid(True, alpha=0.3)
ax1.legend()
ax2.plot(cumulative_data, 'r-', linewidth=1.5, label='Накопленные суммы')
ax2.set_xlabel('Отсчеты')
ax2.set_ylabel('Сумма')
ax2.set_title('Кумулятивные суммы сигнала')
ax2.grid(True, alpha=0.3)
ax2.legend()
plt.tight_layout()
plt.show()
def process_signal_data():
""" Основная функция модуля M2 - выполняет все требуемые операции """
while True:
filename = input("Введите имя бинарного файла с выборкой: ").strip()
if os.path.exists(filename):
print(f"Файл '{filename}' найден.")
break
else:
print(f"Файл '{filename}' не существует. Пожалуйста, попробуйте еще раз.")
print("Чтение данных из файла...")
signal_data = read_binary_file(filename)
if not signal_data:
print("Файл пуст или содержит некорректные данные.")
return None, None, None
print(f"Прочитано {len(signal_data)} отсчетов сигнала.")
increasing_count = count_increasing_elements(signal_data)
print(f"Количество элементов, превышающих предыдущий: {increasing_count}")
cumulative_sums = cumulative_sum(signal_data)
print("Список с кумулятивными суммами рассчитан.")
display_plots(signal_data, cumulative_sums)
return signal_data, increasing_count, cumulative_sums
if __name__ == "__main__":
process_signal_data()
```
M0.py
```py
from M2 import process_signal_data
def main():
"""
Главная функция программы
"""
print("=" * 60)
print("ПРОГРАММА ОБРАБОТКИ СИГНАЛОВ")
print("=" * 60)
print("\n" + "=" * 60)
print("РАСЧЕТ №1")
print("=" * 60)
data1, count1, sums1 = process_signal_data()
if data1:
print(f"\nРезультаты расчета №1:")
print(f" • Общее количество отсчетов: {len(data1)}")
print(f" • Элементов, превышающих предыдущий: {count1}")
print(f" • Процент возрастающих элементов: {count1/len(data1)*100:.2f}%")
print("\n" + "=" * 60)
print("РАСЧЕТ №2")
print("=" * 60)
data2, count2, sums2 = process_signal_data()
if data2:
print(f"\nРезультаты расчета №2:")
print(f" • Общее количество отсчетов: {len(data2)}")
print(f" • Элементов, превышающих предыдущий: {count2}")
print(f" • Процент возрастающих элементов: {count2/len(data2)*100:.2f}%")
print("\n" + "=" * 60)
print("ОБРАБОТКА ЗАВЕРШЕНА")
print("=" * 60)
if __name__ == "__main__":
main()
```