Главная страница
Навигация по странице:

  • -*- coding: CP1251 -*- perm1=input(Mod1: Введите значение = ) print(Mod1: Значение perm1=,perm1)

  • -*- coding: CP1251 -* def alpha(): print(****ALPHA****) t = input (Значение t =) return t

  • vhod.append(A*math.sin((2*i*math.pi)/F)) import MM1 as mod yi1=0;yin1=0;yi2=0 vyhod=[] for xt in vhod

  • Общее контрольное задание. Разработайте программу, состоящую из трех модулей:- Модуль 1

  • Методичка. Методические указания по ПО АС_очники. Методические указания к проведению занятий по дисциплине " Программное обеспечение автоматизированных систем" Москва 2018


    Скачать 0.59 Mb.
    НазваниеМетодические указания к проведению занятий по дисциплине " Программное обеспечение автоматизированных систем" Москва 2018
    АнкорМетодичка
    Дата06.09.2022
    Размер0.59 Mb.
    Формат файлаdoc
    Имя файлаМетодические указания по ПО АС_очники.doc
    ТипМетодические указания
    #663666
    страница9 из 11
    1   2   3   4   5   6   7   8   9   10   11

    Тема 8. Модули и структурирование программы


    Цель работы: Изучение способов разработки программ, состоящих из нескольких частей – модулей, и обеспечения взаимодействия этих частей при выполнении программы.

    1. Запустите интерактивную оболочку IDLE. Откройте окно текстового редактора. В первой строке напишите комментарий с текстом: « Тема 8 <ФИО>». Сохраните содержимое окна редактора в своем рабочем каталоге с именем файла протокола. В ходе выполнения дальнейшей работы все корректно выполненные инструкции и их результаты записывайте в этот текстовый файл. Как это уже было рекомендовано ранее, следует начинать сеанс работы с IDLE со следующих инструкций:

    import os,sys,imp #Импорт трёх важных вспомогательных модулей

    os.chdir('<Путь к рабочему каталогу>') #Делаем рабочий каталог текущим

    os.getcwd() #Контролируем корректность установки текущего каталога
    Большие программы делятся на части-модули, записываемые в отдельные файлы. Это делается для удобства отладки, обеспечения возможности коллективной разработки, создания возможности повторного использования программ и по другим соображениям. При этом возникают 2 проблемы:

    - передача управления от одного модуля к другому в процессе выполнения программы;

    - передача данных между модулями.

    Поэтому техника структурирования программ на любом языке программирования предусматривает изучение способов решения этих проблем.


    1. Создание и использование модулей в среде Python.

    Модулем в среде Python называется любая часть программного кода на этом языке, записанная в отдельном файле1.

    2.1. Запуск модуля на выполнение путем его импорта.

    До сих пор программы, записанные в файлах, запускались на выполнение, главным образом, с использованием предложения из меню, хотя уже с темы 1 должен быть известен другой способ – с использованием команды импорта файла с программой. При этом содержимое модуля становится доступным для исполнения после выполнения процедуры импорта. После импорта модуль становится объектом в пространстве имен той части программы, где осуществлен импорт. Модуль получает имя или псевдоним, заданные в инструкции импорта, а также набор атрибутов. При этом появляется возможность использования всех приемов, применяемых при работе с модулями. В Python импорт является одним из важных способов решения проблемы передачи управления между модулями.

    С помощью текстового редактора оболочки IDLE создайте в своем текущем каталоге файл с именем Mod1.py и запишите в него программу со следующим содержанием

    # -*- coding: CP1251 -*-

    perm1=input('Mod1:Введите значение = ')

    print('Mod1:Значение perm1=',perm1)

    Здесь комментарий в первой строке предназначен для преодоления возможных неприятностей при использовании кириллицы в выводе сообщения.

    Обратите внимание на заголовок окна редактора с текстом модуля: пока введенный или измененный текст в этом окне не сохранен в файле, в заголовке перед именем файла стоит символ «*» (звёздочка).

    Теперь вспомним возможность запуска модуля из командной строки оболочки IDLE. Для этого введите в ней инструкцию

    import Mod1

    При этом управление передается от модуля с именем __main__ (это имя модуля – командной строки) к модулю Mod1, который ищется в файле с именем Mod1.py в рабочем каталоге ( об установке рабочего каталога – см. тему 6). Если бы он находился в другом каталоге, то в инструкции импорта пришлось бы указать не только имя файла с модулем, но и его каталог.

    В ответ на запрос при выполнении программы, записанной в модуле Mod1, введите значение 5.

    После выполнения записанной в модуль программы (после ввода значения объекта perm1 и его отображения) управление возвращается вызывающему модулю, т.е. в данном случае, в командную строку. Объекты, созданные при выполнении модуля, становятся его атрибутами. Получите список атрибутов, как и раньше, с помощью инструкции

    dir(Mod1)

    Получите доступ к значению созданного в модуле объекта perm1 – атрибута модуля Mod1 - с помощью инструкции:

    Mod1.perm1

    Попробуйте повторно выполнить модуль с помощью инструкции импорта и убедитесь, что запуска программы не происходит. Для повторного выполнения ранее импортированного модуля следует применить функцию reload из модуля imp:

    imp.reload(Mod1)

    В ответ на запрос программы, записанной в модуле Mod1, введите значение 3. Проверьте, что это значение стало значением объекта perm1.

      1. Импортированные модули заносятся в словарь – значение атрибута sys.modules. Их можно увидеть по инструкции

    print(sorted(sys.modules.keys()))

    Для обеспечения возможности повторного импорта и, следовательно, выполнения программы из модуля, его надо удалить из этого словаря:

    sys.modules.pop('Mod1')

    Еще раз отобразите словарь, убедитесь, что модуль Mod1 из него исчез, повторите импорт и проверьте, что записанная в нем программа будет снова выполнена. После этого еще раз удалите Mod1 из словаря.

      1. Запуск модуля на выполнение с помощью функции exec

    Запуск модуля на выполнение может быть произведен с использованием ранее изученной функции exec. При этом модуль не требуется импортировать. Функция exec действует так, как будто на месте обращения к ней в программу вставлен код из объекта-аргумента функции.

    Внимание: объект-модуль при этом не создается! Созданные при выполнении модуля объекты становятся объектами главной программы!

    Пример.

    exec(open('Mod1.py').read())

    Эту функцию можно вызывать любое число раз и каждый раз будет выполняться программа из модуля.

    Попробуйте запустить модуль на выполнение 3 раза, каждый раз задавая разные значения в ответ на запрос программы и после этого выводите на экран значение объекта perm1

    perm1

    Попробуйте ввести инструкцию

    dir(Mod1)

    В чем смысл выведенного сообщения об ошибке?

      1. Использование инструкции from … import …

    В одном модуле может содержаться несколько программных единиц (например, функций или пользовательских объектов). Тогда можно осуществлять импорт модуля не целиком, а только часть содержащихся в нем объектов.

    Пример 1.

    from Mod1 import perm1

    Проверьте, появился ли в памяти объект Mod1? Вызвалась ли на выполнение программа из этого модуля? Какое значение имеет объект perm1 и почему?

    Пример 2.

    С помощью текстового редактора создайте еще один модуль Mod2, содержащий две функции

    # -*- coding: CP1251 -*

    def alpha():

    print('****ALPHA****')

    t=input('Значение t=')

    return t
    def beta(q):

    import math

    expi=q*math.pi

    return math.exp(expi)

    Сохраните модуль в текущем каталоге в файле Mod2.py.

    Импортируйте из этого модуля только функцию beta с помощью инструкции

    from Mod2 import beta

    Теперь можно использовать эту функцию:

    g=beta(2)

    Выведите на экран значение объекта g.

    Проверьте, появился ли в памяти объект Mod2?

    Убедитесь, что функция alpha не была импортирована, попробовав запустить ее на выполнение:

    alpha()

    Теперь импортируйте функцию alpha из Mod2 инструкцией

    from Mod2 import alpha as al

    Эта функция была не просто импортирована из модуля, но ей еще был присвоен псевдоним al, поэтому обращаться к ней надо так:

    al()

    Удалите импортированные объекты:

    del al,beta

    Повторите импорт двух функций одной инструкцией

    from Mod2 import alpha as al, beta as bt

    Вновь удалите импортированные объекты.

    Теперь сделайте импорт всего содержимого модуля Mod2 инструкцией

    from Mod2 import *

    tt=alpha() #На запрос введите значение 0.12

    uu=beta(float(tt))

    Какое значение имеет объект uu?

    1. Создание многомодульных программ.

    3.1. Пример простой многомодульной программы.

    С помощью редактора создайте ещё один модуль:

    #Модуль Mod0

    import Mod1

    print('perm1=',Mod1.perm1)

    from Mod2 import alpha as al

    tt=al()

    print('tt=',tt)

    from Mod2 import beta

    qq=beta(float(tt))

    print('qq=',qq)
    Этот модуль содержит программу, вызывающую на выполнение ранее созданные модули Mod1, Mod2, Mod3. Теперь наша программа будет состоять из 5 частей: главная программа, которой является командная строка IDLE и из которой будет вызываться модуль Mod0, и 3 модуля, вызываемых из модуля Mod0.

    Перед проверкой такой программы удалите из словаря sys.modules имена всех этих модулей.

    Запустите программу на выполнение инструкцией

    import Mod0

    Отобразите в командном окне значения объектов, созданных во время выполнения программы:

    Mod0.tt;Mod0.qq;Mod0.Mod1.perm1

    Обратите внимание на доступ к значению объекта perm1: здесь пришлось указывать не только имя модуля Mod0, но и вызываемого модуля Mod1, в котором локализован этот объект.

      1. Еще пример.

    Создайте модуль MM1, включив в него (скопировать из текста темы 7) разработанные при выполнении предыдущей темы функции, реализующие усилитель, реальный двигатель, тахогенератор и нелинейное звено типа «зона нечувствительности». Затем создайте модуль ММ2, включив в него инструкции, обеспечивающие ввод параметров задачи, формирование входного сигнала, импорт модуля ММ1 и реализацию модели при расчете выходного сигнала:

    znach=input('k1,T,k2,Xm,A,F,N=').split(',')

    k1=float(znach[0])

    T=float(znach[1])

    k2=float(znach[2])

    Xm=float(znach[3])

    A=float(znach[4])

    F=float(znach[5])

    N=int(znach[6])
    import math

    vhod=[]

    for i in range(N):

    vhod.append(A*math.sin((2*i*math.pi)/F))
    import MM1 as mod

    yi1=0;yin1=0;yi2=0

    vyhod=[]

    for xt in vhod:

    xt1=xt-yi2 #отрицательная обратная связь

    [yi1,yin1]=mod.realdvig(xt1,k1,T,yi1,yin1)

    yi2=mod.tahogen(yin1,k2,yi2)

    yt=mod.nechus(yin1,Xm)

    vyhod.append(yt)

    Наконец, создайте главную программу – модуль ММ0, запускающую на выполнение модуль ММ2 и выводящую полученный выходной сигнал

    import MM2

    print('y=',MM2.vyhod)

    В ответ на запрос программы введите некоторые, подходящие по смыслу значения параметров задачи и проанализируйте полученный выходной сигнал.

      1. Области действия объектов в модулях.

    В ранее созданных модулях вводятся и используются следующие объекты:

    Mod1: perm1

    Mod2: функции alpha, beta; переменные t, expi

    Mod0: переменные tt,qq

    Проведите следующие эксперименты:

    - Попробуйте вставить в функции alpha обращение к функции beta и, наоборот, из beta – к alpha.

    - Попробуйте отобразить на экране в модуле Mod0 значения объектов t и expi.

    - Попробуйте в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после этого на экране.

    - Попробуйте в командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq.

    Обобщите результаты экспериментов и сделайте выводы об областях действия объектов.

    1. Сохраните созданный текстовый файл протокола в своем рабочем каталоге. Закончите сеанс работы с IDLE.


    Общее контрольное задание.

    Разработайте программу, состоящую из трех модулей:

    - Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.

    - Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.

    - Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.

    Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
    Индивидуальные контрольные задания по теме

    По указанному варианту контрольного вопроса обратитесь к индивидуальным заданиям по теме 7, разработайте функцию, на ее основе создайте модуль. Создайте второй модуль, в котором должны быть инструкции для ввода/создания исходных данных для проверки работы функции, вызов функции и отображение полученных результатов.


    1   2   3   4   5   6   7   8   9   10   11


    написать администратору сайта