Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4.9 KiB

Тест по модулю 3, вариант 16

1. Задание

Создайте модуль М1, содержащий две функции:

  • функция 1: аргументы - имя бинарного файла, содержащего кортеж KRT с элементами-отсчетами некоторого сигнала и числовой параметр Т; в функции должны вводиться данные из файла, вычисляться и возвращаться список SPS, элементы которого определяются по правилу: SPS[0] равен среднему значению по кортежу, SPS[i]=(KRT[i]+SPS[i-1]*T)/(1+T) (для i от 1 до длины KRT);
  • функция 2: аргумент - список SPS1 с числовыми значениями; по нему рассчитывается и возвращается среднее значение приращений SPS[i]-SPS[i-1] для i от 1 до длины списка.

Решение

import pickle

def func1(filename, T):
    fp = open(filename, 'rb')
    KRT = pickle.load(fp)
    fp.close()
    SPS = []
    SPS.append(sum(KRT) / len(KRT))
    for i in range(1, len(KRT)):
        v = (KRT[i] + SPS[i-1] * T) / (1 + T)
        SPS.append(v)
    return SPS

def func2(SPS1):
    prirash = []
    
    for i in range(1, len(SPS1)):
        inc = SPS1[i] - SPS1[i-1]
        prirash.append(inc)
    if prirash:
        return sum(prirash) / len(prirash)
    else:
        return 0.0

2. Задание

Создайте еще один модуль М2, в котором должны выполняться операции:

  • запрашивается и вводится имя бинарного файла с данными; проверяется наличие файла и при отсутствии - повторение запроса;

  • запрашивается значение параметра Т (проверить Т>0);

  • вызывается функция 1 и отображаются результаты ее работы;

  • применяется функция 2 со списком, полученным из функции 1, и отображается результат ее работы.

Решение

import os
import M1

def M2_main():
    while True:
        fname = input("Введите имя файла: ")
        if not fname.endswith('.bin'):
            fname = fname + '.bin'
        if os.path.exists(fname):
            print("Файл найден")
            break
        else:
            print("Файл не найден, попробуйте еще раз")
    
    
    while True:
        try:
            T = float(input("Введите T (больше 0): "))
            if T > 0:
                break
            else:
                print("T должен быть больше 0")
        except:
            print("Введите число")
    

    SPS = M1.func1(fname, T)
    
    print("\nРезультаты (первые 5 значений):")
    for i in range(min(5, len(SPS))):
        print(f"SPS[{i}] = {SPS[i]}")
    
    if len(SPS) > 5:
        print("...")
        print(f"SPS[{len(SPS)-1}] = {SPS[-1]}")
    

    sred = M1.func2(SPS)
    print(f"\nСреднее приращение: {sred}")
    
    return SPS

3. Задание

Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика полученный из функции 1 список, а также выводит этот список в бинарный файл с именем RES77.bin.

Решение

import pickle
import matplotlib.pyplot as plt
import M2

def main():
    print("Начало работы")

    SPS = M2.M2_main()
    
    if SPS:

        fp = open('RES77.bin', 'wb')
        pickle.dump(SPS, fp)
        fp.close()
        print("Сохранено в RES77.bin")
        
        plt.plot(SPS)
        plt.title("График SPS")
        plt.show()
        
        print("Конец работы")

if __name__ == "__main__":
    main()

4. Задание

Подготовьте 2 файла с исходными данными: первый - со 40 значениями : 0,0,1,1,1,:, второй - с 40 отсчетами синусоидального сигнала с некоторым периодом и амплитудой.

Решение

import pickle
import math
KRT1 = []
for i in range(40):
    if i % 5 == 0 or i % 5 == 1:
        KRT1.append(0)
    else:
        KRT1.append(1)

KRT1 = tuple(KRT1)
fp = open('data1.bin', 'wb')
pickle.dump(KRT1, fp)
fp.close()



KRT2 = []
for i in range(40):
    x = 10 * math.sin(2 * math.pi * i / 8) + 5
    KRT2.append(x)

KRT2 = tuple(KRT2)
fp = open('data2.bin', 'wb')
pickle.dump(KRT2, fp)
fp.close()