ответвлено от main/python-labs
190 строки
7.3 KiB
Markdown
190 строки
7.3 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()
|
|
```
|
|
|
|
|