Проектирование структуры и компонентов программного продукта

 

Содержание


Введение

1. Анализ предметной области разрабатываемого программного продукта

.1 Постановка задачи

.2 Назначение задачи

.3 Выбор технологии и среды разработки

. Проектирование структуры и компонентов программного продукта

.1 Разработка интерфейса пользователя

.2 Разработка структурной схемы программного продукта

.3 Отладка и тестирование

Заключение

Литература

Приложения


Введение


В ходе выполняемой курсовой работы будет разрабатываться игровая программа «Парные картинки», которая и будет являться объектом исследования. Потребуется создать полноценную правильно-функционирующую программу и самостоятельно изучим некоторые процедуры и функции.

Delphi - это комбинация нескольких важнейших технологий:

Высокопроизводительный компилятор в машинный код;

Объектно-ориентированная модель компонент;

Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;

Масштабируемые средства для построения баз данных;

Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре клиент-сервер. Этот компилятор в настоящее время является самым быстрым в мире, его скорость компиляции составляет свыше 120 тысяч строк в минуту на компьютере 486DX33. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, Delphi обеспечивает быструю разработку без необходимости писать вставки на C++ или ручного написания кода (хотя это возможно).


1. Анализ предметной области разрабатываемого программного продукта


.1 Постановка задачи


Разработать программу, реализующую функции тренировки памяти.

Программа должна иметь уровни сложности тренировки, на более сложный нельзя попасть, не пройдя предыдущий.


.2 Назначение задачи


Суть программы состоит в том, что на экран выдается определённое количество парно одинаковых изображений, они открыты на небольшой промежуток времени, после чего закрываются, и пользователю необходимо угадать попарно одинаковые картины за заданное время, если он не успевает этого сделать, то игра возобновится.

Каждое прохождение уровня должно сопровождаться звуковым сигналом


.3 Выбор технологии и среды разработки


Я выбрал среду разработки Borland Delhi7, так как я думаю, что это наиболее благоприятная среда для разработки игр, так же язык программирования Pascal один из наиболее известных языков программирования, используется для обучения программированию в старших классах и на первых курсах вузов, является базой для ряда Delphi - результат развития языка Турбо Паскаль, который, в свою очередь, развился из язык Паскаль.

Язык Паскаль был создан Никлаусом Виртом в 1968-1969 годах после его участия в работе комитета разработки стандарта языка Алгол-68. Язык назван в честь французского математика, физика, литератора и философа Блеза Паскаля, который создал первую в мире механическую машину, складывающую два числа. Первая публикация Вирта о языке датирована 1970 годом, представляя язык, автор указывал в качестве цели его создания - построение небольшого и эффективного языка, способствующего хорошему стилю программирования, использующему структурное программирование и структурированные данные.

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

Pascal был уникальным в своём роде - он имел самый быстрый компилятор в мире, да и в нем впервые была разработана технология создания платформенно независимых программ, которая нашла широкое применение в таком языке, как Java. Своё имя он получил в честь великого французкого физика Паскаля. Позднее, разработкой Pascal`ей занялась компания Borland, с помощью которой Pascal встал на серийное производство, надо заметить, что кроме Turbo Pascal компанией выпускался Borland Pascal, который выходил в свет несколько позднее, чем Turbo Pascal, но в отличие от него обладал большими способностями, как-то различные режимы компиляции программы, более расширенный набор функций. Так, версия за версией было выпущенно семь Turbo и Borland Pascal. С появлением Windows у Pascal появилась новая разновидность - Turbo и Borland Pascal for Windows. Данная программа была не чуть не лучше обыкновенного блокнота, разве что только цифры отображала синим. Но время шло, требования к качеству оформления программ росли, а языки программиравания оставались всё теми же - Dos. И вот, наконец, компанией Microsoft был совершен переворот в области прикладного программирования - ими впервые была создана визуальная система разработки прикладных программ, которую они реализовали в Visual Basic. К новому стандарту стали приобщать все языки программирования, не избежал своей участи и Pascal. В тот момент, когда разработчики Pascal в компании Borland наконец добрались до него - находился он довольно в запущенном состоянии. Было пересмотрено и переработано множество функций, добавлено, а вернее сказать создано, многое. И в итоге внесения оказались столь колоссальными, что разработчики создали, можно сказать, новый язык программирования.7 - это достаточно мощная система, предназначенная для быстрой разработки приложений самого разного характера и назначения, в том числе для работы с базами данных (драйверы dbExpress, DB2 7.2, InterBase 6.5, MySQL, MSSQL) и Интернет.

В Delphi 7 достигнут высокий уровень возможностей и нет избыточных и дублирующих друг друга средств.

Скорость и производительность программиста при создании программ на Delphi достигаются благодаря IDE (Integrated Development Environment - интегрированная среда разработки) в которой они создаются.

Интегрированная среда разработки в Delphi 7 - это пользовательский интерфейс, состоящий из множества окон, перечень которых зависит от настроек программиста и соответственно от выполняемых задачь.

Таким образом, разработка приложения в Delphi делиться на 2 основных этапа:

непосредственное создание пользовательского интерфейса

определение функциональности приложения

Пользовательский интерфейс - в данном случае это внешний вид программы (формы), с помощью интерфейса происходит взаимодействие пользователя с приложением.

В Delphi 7 интерфейс создается очень просто - он конструируется элементами управления (компонентами), которые располагаются на форме приложения.

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

Таким образом, разработка приложений сводиться к размещению на форме необходимых компонентов и настройки и написания их свойств, возникающих притом или ином событии.

Многие только переходили к Delphi из DOS, многие использовали Borland Pascal for Windows и работали с Windows API напрямую. Объекты еще были в диковинку, и полное разъяснение новых принципов было просто обязательно.

Но и сейчас писать об этом вполне актуально. Конечно, выросло поколение программистов, которые "с молоком матери" впитали новые понятия. Но от понимания объектов до их грамотного использования - дистанция огромного размера. Для создания более или менее сложных приложений нужны навыки объектно-ориентированного дизайна, а для приложений в свою очередь - четкое знание возможностей вашей среды программирования. Поэтому в данной главе мы постараемся акцентировать внимание читателя на применение ООП в среде Delphi 7.

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


2. Проектирование структуры и компонентов программного продукта


.1 Разработка интерфейса пользователя


Интерфейс пользователя, он же пользовательский интерфейс - разновидность интерфейсов, в котором одна сторона представлена человеком (пользователем), другая - машиной/устройством. Представляет собой совокупность средств и методов, при помощи которых пользователь взаимодействует с различными, чаще всего сложными, машинами, устройствами и аппаратурой.

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

Несколько широко распространённых примеров:

меню на экране телевизора + пульт дистанционного управления;

дисплей электронного аппарата (автомагнитолы, часов) + набор кнопок и переключателей для настройки;

приборная панель (автомобиля, самолёта) + рычаги управления.

Интерфейс двунаправленный (интерактивный) - когда устройство, получив команды от пользователя и исполнив их, выдаёт информацию пользователю наличествующими у неё средствами - визуальными, звуковыми, тактильными и т.п. (приняв которую, пользователь выдаёт устройству последующие команды предоставленными в его распоряжение средствами: кнопки, переключатели, регуляторы, сенсоры, голосом, и т.д.).

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

Рисунок 1. Первая вкладка «Новая игра» при нажатии на нее открываются уровни сложности


Рисунок 2


При нажатии на вторую вкладку «Рекорды» показывает рекорды игроков на три уровня сложности,

Рисунок 3


Во вкладке «Справка» есть два пункта :


Рисунок 4. Правила


Рисунок 5. Компоненты Delphi используемые в программе


.2 Разработка структурной схемы программного продукта


Компонент TMainMenu

TMainMenu - позволяет поместить главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют невидимым (невизуальным) компонентом, поскольку они невидимы во время выполнения программы.


Рисунок 6

Создание меню включает три шага:

1)помещение TMainMenu на форму;

2)вызов Menu Designer

)определение пунктов меню в Menu Designer.


Рисунок 7


Этот компонент доступен из модуля MENUS, и находится на странице Палитры компонентов Standard.

Этот компонент представляет главное меню формы и наследует все методы и свойства TMenu. Особенность его в том, что в нем реализован сложный механизм объединения меню. Это необходимо по следующим причинам:

1.Если в приложении имеется несколько форм со своими меню, то для упрощения работы целесообразно соединить их в одно и управлять меню из главной формы.

2.Объединение меню нужно при работе с интерфейсом MDI и его подокнами.

.Механизм объединения меню используется серверами OLE, запускаемыми по месту нахождения объекта OLE. Загружаясь, сервер дописывает осуществляемые им операции к меню другого приложения.

Для того чтобы реализовать объединение меню, у тех форм, меню которых будут присоединены к главному, необходимо установить в True свойство:

(Pb) property AutoMerge: Boolean;

При этом у главного меню оно должно оставаться равным False, иначе главное меню будет вообще невидимым. Объединение будет происходить автоматически при активизации новых форм или серверов OLE. Кроме автоматического режима, объединение меню можно выполнить при вызове метода:

procedure Merge(Menu: TMainMenu);

Компонент TLabel


Рисунок 8


TLabel - служит для отображения текста на экране. Можно изменить шрифт и цвет метки, если дважды щелкнуть на свойство Font в Инспекторе Объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.

Этот компонент доступен из модуля STDCTRLS, и находится на странице Палитры компонентов Standard.

Компонент представляет собой статический текст. С помощью этого компонента на рабочей поверхности формы можно отобразить информацию, сделать пояснения и показать названия других компонентов. Но он имеет и другую важную функцию - если в составе текста TLabel есть символы-акселераторы, информация об их нажатии может передаваться от TLabel другому элементу управления.

Компонент TPanel

TPanel - управляющий, похожий на TGroupBox, используется в декоративных целях. Чтобы использовать TPanel, просто поместите его на форму и затем положите другие компоненты на него. Теперь при перемещении TPanel будут передвигаться и эти компоненты. TPanel используется также для создания панели инструментов и окна статуса.

Этот компонент доступен из модуля EXTCTRLS, и находится на странице Палитры компонентов Standard.

Этот компонент - является несущей конструкцией для размещения других элементов управления. В отличие от простой рамки (TBevel) панель сама является оконным элементом управления и родителем для всех размещенных на ней компонентов. Часто ее используют для создания панелей инструментов, строк состояния и т. п.

На границах панели размещаются две специальные окаймляющие рамки (bevels): BevelInner и BevelOuter. При помощи комбинации белого и серого цветов они имитируют трёхмерность - приподнятость (bvRaised) или утопленность (bvLowered). Также рамки могут быть невидимыми (bvNone).

Выравнивание текста заголовка панели определяется при помощи свойства:

(Pb) property Alignment: TAlignment;

Компонент TImage - отображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу.

Этот компонент доступен из модуля EXTCTRLS, и находится на странице Палитры компонентов Additional.

Этот компонент служит надстройкой над классом TPicture и замыкает всю иерархию графических объектов VCL. Он предназначен для показа на форме изображения: битовой карты (TBitmap), метафайла (TMetafile), значка (TIcon).

Компонент TImageListпредставляет собой контейнер для хранения множества рисунков одинакового размера. Он может быть полезен при программном создании набора инструментальных кнопок, секций управляющего заголовка, при разработке программ, использующих анимационные эффекты, и вообще там, где требуется индексированный доступ к изображениям. Воспринимает форматы BMP, ICO.

При помещении TImageList на форму это выглядит, как просто иконка. Иконки данного типа называют невидимым (невизуальным) компонентом, поскольку они невидимы во время выполнения программы. Этот компонент находится на странице Палитры компонентов Win 32.

Компонент TTimer(таймер) служит для отсчета интервалов реального времени. Его свойство interval определяет интервал времени в миллисекундах, который должен пройти от включения таймера до наступления события onTimer. Таймер включается при установке значения True в его свойство Enabled. Раз включенный таймер все время будет возбуждать события onTimer до тех пор, пока его свойство Enabled не примет значения False.

программа интерфейс игровой delphi

2.3 Отладка и тестирование


Описание пользовательского интерфейса

ØФайл ? Новая игра - начало новой игры.

ØФайл ? Выход - выход из программы.

ØСправка ? О программе - Вывод дополнительной информации о программе и о её создателе.


Заключение


В результате выполнения данной курсовой работы мной была разработана игровая программа под названием Крестики-нолики. Было проведено исследование компонентов программной среды Borland Delphi 6.0, которые использовались при создании программы, использовалось множество процедур и функций. Была использована и изучена процедура блокировки кнопки максимизации.

При создании программы использовались следующие компоненты: TMainMenu, TLabel, TPanel, TImage, TImageList, TTimer.

Также использовались и другие программы:

·Adobe Photoshop CS v8.0 - использовался для создания дополнительных надписей на картинке для формы О программе;

·Restorator 2005 v3.50 build 1442 - использовался для изменения иконки EXE файла игры;

·Microsoft Paint v5.1 - использовался для создания рисунков к данному курсовому проекту.

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


Список используемой литературы


1.Михаил Фленов «Библия Delphi» БХВ-Петербург, 2004 г. - 880с.

.Интернет портал #"justify">Приложение 1


Исходный текст


unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, unit2, ExtCtrls, ComCtrls, unit3, StdCtrls, ImgList;

type= class(TForm): TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TPanel;: TTimer;: TImageList;AboutMenuItemClick(Sender: TObject);Panel2Click(Sender: TObject);Panel5Click(Sender: TObject);Panel8Click(Sender: TObject);Panel3Click(Sender: TObject);Panel6Click(Sender: TObject);Panel9Click(Sender: TObject);Panel4Click(Sender: TObject);Panel7Click(Sender: TObject);Panel10Click(Sender: TObject);Timer1Timer(Sender: TObject);NewMenuItemClick(Sender: TObject);FormCreate(Sender: TObject);N4Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm1;

{$R *.dfm}clean; // Процедура общего сброса ("Новая игра")

begin.Timer1.Enabled:=false; // Для надежности выключаем таймер.Panel2.BevelInner:=bvNone; // Меняем стиль панели на начальный.Panel2.Caption:=''; // Убираем заголовок панели

Form1.Panel3.BevelInner:=bvNone;.Panel3.Caption:='';.Panel4.BevelInner:=bvNone;.Panel4.Caption:='';.Panel5.BevelInner:=bvNone;.Panel5.Caption:='';.Panel6.BevelInner:=bvNone;.Panel6.Caption:='';.Panel7.BevelInner:=bvNone;.Panel7.Caption:='';.Panel8.BevelInner:=bvNone;.Panel8.Caption:='';.Panel9.BevelInner:=bvNone;.Panel9.Caption:='';.Panel10.BevelInner:=bvNone;.Panel10.Caption:='';.Tag:=0;.Timer1.Enabled:=true; // Возобновляем работу таймера;TForm1.AboutMenuItemClick(Sender: TObject);

begin.ShowModal; // Вызываем окно "О программе"

end;TForm1.Panel2Click(Sender: TObject);

beginPanel2.Caption<>'' then exit; // Проверка на заголовок панели (анти-мухлеж).BevelInner:=bvLowered; // Присваиваем стиль при нажатии на панельForm1.Tag=0 // Меняем tag формы (для чередования X и O).Caption:='X'; // если таг=0 тогда вписываем X

Form1.Tag:=1;.Caption:='O'; // если таг=1 тогда вписываем O.Tag:=0;;TForm1.Panel5Click(Sender: TObject);Panel5.Caption<>'' then exit;.BevelInner:=bvLowered;Form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel8Click(Sender: TObject);Panel8.Caption<>'' then exit;.BevelInner:=bvLowered;Form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel3Click(Sender: TObject);Panel3.Caption<>'' then exit;.BevelInner:=bvLowered;form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel6Click(Sender: TObject);Panel6.Caption<>'' then exit;.BevelInner:=bvLowered;form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel9Click(Sender: TObject);Panel9.Caption<>'' then exit;.BevelInner:=bvLowered;form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel4Click(Sender: TObject);Panel4.Caption<>'' then exit;.BevelInner:=bvLowered;Form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel7Click(Sender: TObject);Panel7.Caption<>'' then exit;.BevelInner:=bvLowered;Form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Panel10Click(Sender: TObject);Panel10.Caption<>'' then exit;.BevelInner:=bvLowered;Form1.Tag=0.Caption:='X';.Tag:=1;.Caption:='O';.Tag:=0;;TForm1.Timer1Timer(Sender: TObject); // Процедура проверки на выигрыш;

begin // защита от непредвиденных ошибок

if (Panel2.BevelInner=bvLowered) and (Panel4.BevelInner=bvLowered) and (Panel3.BevelInner=bvLowered) then

// Если панели нажаты, то проверяем заголовки

if (Panel2.Caption=Panel3.Caption) and (Panel2.Caption=Panel4.Caption) .Label1.Caption:=Form1.Panel2.Caption; // Если выигрышная комбинация то присваиваем Х или О в Лейбл формы поздравления

Form3.ShowModal; // Открываем окно поздравления ":-)"; // Очистка игрового поля ;

if (Panel7.BevelInner=bvLowered) and (Panel5.BevelInner=bvLowered) and (Panel6.BevelInner=bvLowered) then(Panel5.Caption=Panel6.Caption) and (Panel5.Caption=Panel7.Caption).Label1.Caption:=Form1.Panel5.Caption;.ShowModal;;;(Panel9.BevelInner=bvLowered) and (Panel10.BevelInner=bvLowered) and (Panel8.BevelInner=bvLowered) then(Panel8.Caption=Panel9.Caption) and (Panel8.Caption=Panel10.Caption).Label1.Caption:=Form1.Panel10.Caption;.ShowModal;;;(Panel5.BevelInner=bvLowered) and (Panel2.BevelInner=bvLowered) and (Panel8.BevelInner=bvLowered) then(Panel2.Caption=Panel5.Caption) and (Panel2.Caption=Panel8.Caption).Label1.Caption:=Form1.Panel2.Caption;.ShowModal;;;(Panel9.BevelInner=bvLowered) and (Panel3.BevelInner=bvLowered) and (Panel6.BevelInner=bvLowered) then(Panel6.Caption=Panel3.Caption) and (Panel6.Caption=Panel9.Caption).Label1.Caption:=Form1.Panel3.Caption;.ShowModal;;;(Panel4.BevelInner=bvLowered) and (Panel7.BevelInner=bvLowered) and (Panel10.BevelInner=bvLowered) then(Panel4.Caption=Panel7.Caption) and (Panel10.Caption=Panel4.Caption).Label1.Caption:=Form1.Panel4.Caption;.ShowModal;;;(Panel6.BevelInner=bvLowered) and (Panel2.BevelInner=bvLowered) and (Panel10.BevelInner=bvLowered) then(Panel2.Caption=Panel6.Caption) and (Panel2.Caption=Panel10.Caption).Label1.Caption:=Form1.Panel2.Caption;.ShowModal;;;(Panel6.BevelInner=bvLowered) and (Panel8.BevelInner=bvLowered) and (Panel4.BevelInner=bvLowered) then(Panel4.Caption=Panel6.Caption) and (Panel8.Caption=Panel4.Caption).Label1.Caption:=Form1.Panel4.Caption;.ShowModal;;;;;TForm1.NewMenuItemClick(Sender: TObject);

begin; // Очистка игрового поля для новой игры

end;TForm1.FormCreate(Sender: TObject);

var:DWORD; // Процедура блокировки кнопки "Развернуть"

begin:=GetWindowLong(Self.Handle,GWL_STYLE);:=l and not(WS_MAXIMIZEBOX);:=SetWindowLong(Self.Handle,GWL_STYLE,l);;TForm1.N4Click(Sender: TObject);

begin; // Выход из программы;

end.

Unit2;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, jpeg, ExtCtrls;= class(TForm): TImage;: TLabel;: TLabel;: TLabel;: TLabel;Image1Click(Sender: TObject);Label1Click(Sender: TObject);Label2Click(Sender: TObject);Label3Click(Sender: TObject);Label4Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm2;

{$R *.dfm}TForm2.Image1Click(Sender: TObject);

begin; // Закрытие окна при нажатии на него

end;TForm2.Label1Click(Sender: TObject);;;TForm2.Label2Click(Sender: TObject);;;TForm2.Label3Click(Sender: TObject);;;TForm2.Label4Click(Sender: TObject);;;

Unit3;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, jpeg;

TForm3 = class(TForm): TImage;: TLabel;: TLabel;: TLabel;FormShow(Sender: TObject);Image1Click(Sender: TObject);Label1Click(Sender: TObject);Label2Click(Sender: TObject);Label3Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm3;Unit1;

{$R *.dfm}TForm3.FormShow(Sender: TObject);.Timer1.Enabled:=False; // Выключаем таймер;TForm3.Image1Click(Sender: TObject);

begin; // Закрытие окна при нажатии на него

end;TForm3.Label1Click(Sender: TObject);;;TForm3.Label2Click(Sender: TObject);;;TForm3.Label3Click(Sender: TObject);;;


Приложение 2


Блок схема



Содержание Введение 1. Анализ предметной области разрабатываемого программного продукта .1 Постановка задачи .2 Назначение задачи .3 Выбор

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ