КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Билет 2. 1. Объявление и реализация классов на языке Паскаль.1. Объявление и реализация классов на языке Паскаль. Для объявления классов (объектных типов) используется зарезервированное слово class. Определим некоторый класс графических примитивов TFigure следующим образом: TFigure = class fColor: Byte; fThickness: Byte; fCanvas: TCanvas; procedure SetColor(Value: Byte); procedure SetThickness(Value: Byte); procedure PrepareCanvas; end; По принятому соглашению имена классов начинаются с заглавной буквы «T», имена полей данных начинаются с буквы «F», и поля класса объявляются до методов. Класс объединяет данные, представленные атрибутами (полями) и алгоритмы (методы) по их обработке. В примере к полям данных класса относятся: поле fColor, хранящее код цвета, поле fThickness, задающее толщину линий и поле fCanvas, представляющее полотно, на котором будет происходить отображение графических примитивов. Методы класса определяют действия, выполняемые над данными. Их совокупность характеризует функциональный аспект поведения класса. Методы представляют собой процедуры и функции, принадлежащие классу. К методам класса относится метод PrepareCanvas, выполняющий подготовку полотна к работе и два метода задания значений полей данных – SetColor и SetThickness. Таким образом, в одной информационной структуре TFigure оказались объединены как исходные параметры, так и необходимые средства по выполнению их реализации. Такое объединение (сокрытие) данных и методов в качестве собственных ресурсов класса получило название инкапсуляции. Для окончательного оформления шаблона требуется поместить класс в интерфейсный раздел модуля и дать реализацию всех методов: unit figures; Interface Type TFigure = class fColor: Byte; fThickness: Byte; fCanvas: TCanvas; procedure SetColor(Value: Byte); procedure SetThickness(Value: Byte); procedure PrepareCanvas; end; Implementation procedure TFigure.SetColor(Value: Byte); Begin If fColor <> Value then fColor:=Color; end; procedure TFigure.SetThickness(Value: Byte); Begin If fThickness <> Value then fThickness:=Value; end; procedure TFigure.PrepareCanvas; Begin { Подготовка полотна для рисования } end; end. Методы SetColor и SetThickness выполняют присвоение внутреннему полю fColor и fThickness значения в том случае, если текущее значение отличается от передаваемого. К полям класса никогда не следует обращаться напрямую, а только посредством специальных методов, обеспечивающих корректность выполнения операции присваивания. Теперь объявим переменную f класса TFigure: Var f: TFigure; Переменную f называют экземпляром класса, объектной ссылкой или просто объектом. Через объект f возможен доступ к методам и полям класса. Однако для начала необходимо создать сам объект. Для этого необходимо вызвать специальную процедуру Create, называемую конструктором: f:=TFigure.Create; Конструктор не объявлен в классе TFigure, однако присутствует в нем благодаря наследованию от класса TObject. В результате будет выделена область памяти в размере, необходимом для хранения объекта f. Обратите внимание, конструктор вызывается с помощью ссылки на тип, а не на экземпляр типа, в отличие от методов, которые всегда вызываются с помощью ссылки на экземпляр. Связано это с тем, что объект f на момент вызова конструктора еще не создан. После создания объекта с ним можно работать: uses figures; Var f: TCircle; Begin f:=TCircle.Create; f.SetColor($FF); f.SetThickness(1); f.PrepareCanvas; f.Free; end. После выполнения методов объект f следует удалить, чтобы он не занимал места в памяти. Удаление выполняет метод Destroy, определенный в классе TObject, но лучше использовать Free, т.к. он инкапсулирует вызов Destroy: в начале определяется, существует ли объект и только затем выполняется вызов Destroy. В противном случае метод Free ничего не делает. Класс Figure можно несколько модифицировать. Например, можно явно добавить к методам конструктор Create с помощью зарезервированного слова constructor и деструктор Destroy с помощью зарезервированного слова destructor: TFigure = class ... constructor Create; virtual; destructor Destroy; override; end; В конструкторе присваиваются полям начальные значения и создается объект полотна: constructor TFigure.Create; Begin fColor:=$FF; fThickness:=1; fCanvas:=TCanvas.Create; end; В деструкторе обычно выполняются действия, связанные с освобождением задействованных в течение работы объекта ресурсов: destructor TFigure.Destroy; Begin { Освобождение ресурсов, используемых в работе объекта } fCanvas.Free; end;
2. Интерфейс. Пользовательский интерфейс. Классификация пользовательских интерфейсов. Пользовательский интерфейс(ПИ) программы – совокупность элементов, позволяющих пользователю программы управлять ее работой и получать требуемые результаты. Пользовательский интерфейс состоит из множества составляющих, таких как: · набор задач пользователя, которые он решает при помощи системы · используемая системой метафора (например, рабочий стол в MS Windows и т.п.) · элементы управления системой · навигация между блоками системы · визуальный (и не только) дизайн экранов программы. Структура и классификация пользовательских интерфейсов В дизайне ПИ можно условно выделить декоративную и активную составляющие. К первой относятся элементы, отвечающие за эстетическую привлекательность программного изделия. Активные элементы подразделяются на операционные и информационные образы моделей вычислений и управляющие средства ПИ, посредством которых пользователь управляет программой. В настоящее время оформилось два принципиально различных подхода к организации ПИ. Первый подход состоит в предоставлении пользователю командного языка, в котором запуск программ оформлен в виде отдельных команд. Этот подход известен как интерфейс командной строки (Command Line Interface - CLI). Альтернативный подход состоит в символическом изображении доступных действий в виде картинок – икон (icons) на экране и предоставлении пользователю возможности выбирать действия при помощи мыши или другого координатного устройства ввода. Этот подход известен как графический пользовательский интерфейс (Graphical User Interface - GUI). Один из подклассов GUI (двухмерный) принято обозначать аббревиатурой WIMP (Windows-Icons-Menus-Pointing device), что отражает задействованные интерактивные сущности - окна, пиктограммы, меню и позиционирующее устройство (обычно мышь). Аргументы в пользу CLI Удачно спроектированные командные языки обеспечивают: высокую скорость обработки, эффективность и экономию использования ресурсов системы. Важными преимуществом хороших командных языков по сравнению с GUI является их алгоритмическая полнота: в GUI пользователь ограничен теми возможностями, для которых разработчик программы нарисовал иконки или сочинил пункты в меню. Командные же языки могут использоваться для решения любых алгоритмизуемых задач, в том числе и таких, о которых разработчики языка никогда и не задумывались. Аргументы в пользу GUI Командные языки требуют затрат времени и усилий для изучения. В этом смысле графические интерфейсы, где все возможности перед глазами, оказываются предпочтительны. Во многих случаях наглядность вариантов оказывается важнее богатства возможностей. Однако в некоторых случаях излишнее богатство вариантов может просто запутать пользователя. Не нужно забывать, что человек способен одновременно оперировать лишь довольно ограниченным количеством объектов и параметров. Кроме того, утверждение о том, что GUI ограничивает возможности пользователя заранее предопределенными возможностями, не всегда соответствует действительности: хорошо продуманные интерфейсы обеспечивают почти такую же гибкость в комбинации операций, как и командные языки. Возможность же записывать и вновь проигрывать последовательности действий (например, макросы) во многих ситуациях может отлично заменить командные файлы. Недостатки WIMP-интерфейсов Помимо обозначенных достоинств, WIMP-интерфейсы принесли с собой и большие проблемы. Во-первых, чем более сложным является приложение, тем труднее осваивать интерфейс, причем эти трудности возрастают нелинейно. Взятые в отдельности интерфейсные особенности и инструменты могут быть вполне простыми, но, будучи в большом количестве интегрированы в одно приложение, они образуют новое качество сложности. Многие современные настольные приложения столь объемны, что пользователь, погрузившись однажды в их функциональность, начинает даже отказываться от новейших версий, продолжая использовать то малое подмножество возможностей, которое удалось изучить. Во-вторых, пользователи проводят слишком много времени, манипулируя интерфейсом, а не работая с самим приложением. В-третьих, WIMP GUI вместе с их 2D- интерфейсными элементами проектировались для работы с двухмерными же приложениями - такими, как обработка текстов, компоновка документов и электронные таблицы. Если же приложение является по своей сути трехмерным, то работа с ним с помощью 2D элементов управления становится не слишком естественной. Нынешние WIMP-интерфейсы для 3D-приложений обычно состоят из управляющих панелей с 2D-кнопками и слайдеров, окружающих 3D-мир, которые используются для управления 3D-курсором, для манипуляций с точкой зрения наблюдателя и для редактирования объектов. Понятно, что 3D-приложения, как правило, имеют много большую визуальную сложность, чем двухмерные, что еще более усиливает связанные с WIMP-интерфейсами проблемы. В-четвертых, не все пользователи способны эффективно использовать мышь и клавиатуру - либо оттого, что им это не кажется естественным в контексте их задачи, либо из-за вызываемых этими устройствами чисто физиологических неудобств, связанных с постоянными нажатиями на клавиши при сильном напряжении зрения (не говоря уже о специальных категориях пользователей с физическими недостатками). Соответственно главным недостатком WIMP-интерфейсов является то, что они никак не используют такие каналы взаимодействия, как речь, слух и прикосновения. Еще одно ограничение WIMP-интерфейсов в том, что они предназначены для одинокого пользователя настольной системы, который управляет объектами, не обладающими автономным поведением, реагирующими в основном на манипуляции с мышью. Соответственно имеется один, не разделяемый во времени полудуплексный канал взаимодействия; система откликается на каждое дискретное событие ввода, и эти события могут быть легко распознаны - они состоят из простых нажатий на клавиши и выбора с помощью мыши. Самый сложный ввод - последовательность позиций мыши, которая может представлять, например, путь закрашивающей кисти. Сегодня развиваются такие новые классы интерфейсов, как SILK (речевой), биометрический (мимический) и семантический (общественный). Начал получать распространение и новый вид пользовательского интерфейса –тактильный.Тактильные устройства, в отличие от других интерактивных устройств, способны как "чувствовать", так и передавать информацию. Эти устройства имеют общую особенность: они снабжены средством силовой обратной связи - таким, как PHANToM, которое получает информацию о положении и жесте, а возвращает величину приложенной в точке силы. Таким образом, пользователь может ощущать форму жесткого объекта, в том числе через несколько слоев различного сопротивления при надавливании на внешнюю поверхность (что полезно, например, в хирургических симуляторах).
3. Написать программу на языке С++, реализующую телефонный справочник. В справочнике содержится следующая информация о каждом абоненте: имя и телефон. Реализовать вывод всей информации из справочника, поиск телефона по имени, поиск имени по телефону. #include <iostream.h> #include <conio.h> #include <string.h> #include <stdio.h> void main() { struct Teleph { char FIO[20]; char Nomer[20]; } spisok [10];
int N,i,K; char Str[20]; do { cout<<"\n 1. Cteate spravochnik"; cout<<"\n 2. Print spravochnik"; cout<<"\n 3. Find po FIO"; cout<<"\n 4. Find po Telephone"; cout<<"\n 5. Exit"; cout<<"\n Vvedite N =="; cin>>N; if(N==1) { cout<<"\n Vvedite kolichestvo =="; cin>>K; for (i=1;i<=K;i++) { cout<<"\n Vvedite FIO =="; cin>>spisok[i].FIO; cout<<"\n Vvedite Telephone =="; cin>>spisok[i].Nomer; } } if(N==2) { cout<<"\n Print..."; for(i=1;i<=K;i++) { cout<<"\n FIO = "<<spisok[i].FIO; cout<<" Telephone = "<<spisok[i].Nomer; } } if(N==3) { cout<<"\n Vvedite FIO == "; cin>>Str; for(i=1;i<=K;i++) if (strcmp(spisok[i].FIO,Str)==0) cout<<"\n Telephone = > "<<spisok[i].Nomer; cout<<"\n"; } if(N==4) { cout<<"\n Vvedite TELEPHONE == "; cin>>Str; for(i=1;i<=K;i++) if(strcmp(spisok[i].Nomer,Str)==0) cout<<"\n FIO => "<<spisok[i].FIO;
cout<<"\n"; } } while (N!=5); }
|