ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.11.2019
Просмотров: 13469
Скачиваний: 411
Рис. Л8.3. Примеры СЯС-карт
Шаг третий. Для проверки достаточности или избыточности придуманных классов, а также корректности их взаимодействия строится диаграмма взаимодействия (рис. Л8.4).
Клиент Банкомат
Вводит пароль
Служба безопасности
Передает пароль
Банк
Выдает сообщение с результатом
Вводит сумму г*-
Производит транзакцию с суммой
Передает информацию о возможности выдать сумму
Выдает сумму
I
Рис. Л8.4. Диаграмма взаимодействия
Метод СКС-карточек позволяет провести также инсценировку работы системы. Для этого достаточно раздать карточки с классами участникам проекта. После этого начать ролевую игру. Первый участник встает и читает действие, совершаемое его классом. Другие участники, исходя из своих карточек, сообщают об ответной реакции других классов. Если в какой-то момент реакции не последует, то это признак несовершенства проекта системы. Такая игра может подсказать и об избыточности проекта.
Порядок выполнения работы
-
В соответствии с вариантом задания, предложенным преподавателем, определить действующих лиц (акторов) системы.
-
Определить варианты использования системы и описать их в краткой или полной форме (см. разд. 3.6.2).
-
Построить диаграмму вариантов использования системы (использовать MS Office или MS Visio).
4. Определить классы проектируемой системы.
5. Создать
CRC-карты
для всех классов системы (использо-
вать
MS
Office
или MS
Visio).
6. Построить
диаграмму взаимодействия (использовать
MS
Office
или MS
Visio).
7. Сдать и защитить работу.
Защита отчета по лабораторной работе
Отчет по лабораторной работе должен состоять из:
-
Постановки задачи.
-
Описания действующих лиц и прецедентов системы.
-
Диаграммы прецедентов.
-
СЯС-карты.
-
Диаграммы взаимодействия.
Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.
Контрольные вопросы
-
Охарактеризуйте проектирование ПО при объектном подходе.
-
В чем заключается моделирование предметной области при проектировании ПО?
-
Язык иМ1_. Его назначение, преимущества и недостатки.
-
Опишите варианты использования ПО.
-
Перечислите диаграммы в языке иМ1_.
-
Приведите пример диаграммы прецедентов.
7 Приведите пример диаграммы взаимодействия.
8. В чем состоит назначение и использование СРС-карт?
Варианты заданий
-
Заказ билетов в аэропорту.
-
Электронный магазин.
-
Отправка біш.
-
Система охраны частного дома.
-
Система безопасности тюрьмы.
-
Система безопасности полета самолета.
ЛАБОРАТОРНАЯ РАБОТА № 9. Динамические структуры данных
Цель работы: научиться использовать динамические структуры данных при создании программного обеспечения.
Лабораторная работа рассчитана на 4 академических часа.
Подготовка к лабораторной работе
1. Ознакомиться
с лекционным материалом по теме
«Струк-
тура и формат данных» учебной
дисциплины «Технология разра-
ботки
программного обеспечения».
-
Изучить соответствующие разделы в изданиях [40, 41, 47].
-
Повторить программирование на С++ (Delphi).
-
Ознакомиться с разд. 3.3 данного пособия.
Теоретическая часть. Статические и динамические данные
При написании программ необходимо постоянно использовать переменные для хранения данных. При обычном объявлении переменной целочисленного массива на языке С++ (здесь и далее в качестве языка выбран С++, но аналогичные структуры данных есть и в других языках высокого уровня):
int mas[100];
на этапе компиляции программы происходит автоматическое резервирование памяти под эту переменную (рис Л9.1, а). Это имеет ряд серьезных недостатков:
• невозможность вернуть компьютеру неиспользуемую память. Например, большой массив будет использоваться только один раз, а память нельзя освободить до окончания работы программы;
• захват памяти, которая вообще может не использоваться программой. Эта ситуация, к сожалению, также не редкость. Зачастую трудно заранее определить размер массива, который понадобится для работы, и под него отводят память «с запасом». Для решения описанных проблем используются динамические структуры данных. С помощью этого типа данных необходимую память можно выделять в ходе программы и возвращать компьютеру, когда она становится ненужной для работы. Например:
float *a; //Объявляем указатель на переменную а
//(переменная,
в
которой
хранится
//адрес
ячейки
данных)
a=new
float;
//Выделяем
память
под
переменную
&а=7.89; //Присваиваем
значение
переменной
delete (а); //Удаляем переменную и возвращаем память
А23В:0004
Рис. Л9.1. Распределение памяти при объявлении: а — статических переменных; б — динамических переменных
Указатель — адрес ячейки памяти. При использовании оператора new компьютер выделяет необходимую память, и адрес этой ячейки памяти записывается в переменную-«указатель» (в примере — это переменная а).
Создание списка
Список — последовательность ячеек памяти, хранящих элементы массива данных. Каждая ячейка такого списка состоит как минимум из двух частей: в первой хранится элемент массива, во второй — указатель на следующую такую же ячейку памяти (рис. Л9.2).

Ниже приводится код программы для работы со списком на языке С++. Используя его, познакомимся с технологией создания списка.
Для работы со списками, как говорилось выше, используется структура, состоящая как минимум из двух элементов:
struct spisok {
int elem; //Данные
spisok *next; //Указатель, адрес следующего элемента };
В отличие от простого объявления переменной, для динамических данных добавляется значение «звездочка» (оно означает, что это адрес памяти, где расположен элемент, но не он сам). Чтобы в ходе программы получить значение элемента по известному адресу или, наоборот, присвоить значение, используется знак & (&а-56).
1. Далее в программе следует строка:
spisok *1;
Это адрес первого элемента списка. Его необходимо знать всегда.
2. Рассмотрим построчно процедуру создания списка (для объяснения строки пронумерованы):
void FormSpisokO {
-
spisok *m,*k;
-
int
-
randomize();
-
k=new spisok;
-
k->elem=random(5);
-
l=k;
-
for (i=l;i<10; {
-
m=new spisok;
-
m->elem=random(5);
-
k->next=m;
-
k=m; }
(12) k->next=NULL;
}
В строках (1) и (2) объявляются служебные переменные.
Строка (3) — инициализация генератора случайных чисел для последующего присвоения произвольных значений элементам списка.
(4) k=new spisok; Выделяется ячейка память для переменной типа «список», и ее адрес сохраняется в переменной к:
к
(5) k->elem=random(5); Присваивается значение элементу списка:
(6) 1=к; Указатель на первый элемент списка запоминается в переменной /:
-
for (i=l;i<10;i++). Для создания списка из 10 элементов используется цикл.
-
m=new spisok; Выделяется еще один участок памяти под переменную spisok. Адрес памяти запоминается в переменную т:
V
/
(9) m->elem=random(5); Заносим значение в переменную: к 1
v
/
(10) k->next=m; Связываем существующие две ячейки:
к і
/
(11) к=ш; Для создания остальных элементов меняем значение указателя к, как показано на рисунке:

Далее действия повторяются в цикле:

(12) k->next=NULL; Для задания значения «последующий» для последнего элемента используется значение NULL.

NULL
Пример программы по работе со списками на языке С++
#include<conio.h> #include<stdlib.h> #include<iostream.h> #include<stdio.h>
struct spisok {
int elem; spisok *next; };
spisok *1;
//Процедура создания списка
void FormSpisokO
{
spisok *m,*k; int i;
randomize ();
k=new spisok; k->elem=random(5); l=k;
for (i=l;i<10;
{
m=new spisok;
m->elem=random(5);
k->next=m;
k=m;
}
k->next=NULL;
void vivodSpisok() {
spisok *m; m=l;
while (m!=NULL)
{
cout«m->elem«1 ';
m=m->next;
}
void Vstavka() {
spisok *m, *k, *r; int i,a,s; m=l;
cout«endl«"BBeflMTe позицию, после которой нужно вставить новый элемент: cin»a;
cout<<"BBeflHTe значение элемента: cin»s;
for (i=l;i<a-l; m=m->next;
k=new spisok;
k->elem=s;
r=m->next;
m->next=k;
k->next=r;
void Del() {
spisok *m,*k,*r; int i,a;
cout<<endl<<"Vvedite posiciju: cin>>a;
if (a==0) {
m=l;
l=l->next; delete (m) ; }
else
i
m=l;
for (i=l;i<a-l; m=m->next; //Поиск позиции
// удаления
k=m->next; r=k->next;
m->next=r; delete(k);
void main() {
clrscr(); FormSpisok() ; vivodSpisok(); VstavkaO ; vivodSpisok(); Del() ;
vivodSpisok();
getch ();
}
Пример программы на Delphi по работе со списками
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
TForml class(TForm) Buttonl: TButton; Button2: TButton; Button3: TButton; Button4: TButton; vivod: TEdit; BitBtnl: TBitBtn; Labell: TLabel; Edit2: TEdit; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Editl: TEdit;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject); private
{ Private declarations } public
{ Public declarations end;
var
Forml: TForml;
implementation
{$R .DFM} const n=10; type spisok=/4zveno; zveno record elem:integer; next:spisok; end;
var 1:spisok;
procedure TForml.ButtonlClick(Sender: TObject); var m, k:spisok; :integer;
begin randomize;
new(k);
кл.elem:=random (5); l:=k;
for :=1 to n-1 do begin new(m);
тл.elem:=random(5); кл.next:=m; k:=m; end; кл.next:=nil;
end;
procedure TForml.Button2Click(Sender: TObject); var m:spisok;
str:string[100] ; begin
str:='' //Добавил
m: =1 ;
while monil do begin
str:=str+IntToStr(mA.elem)+' *; // write(тЛ.elem, '); m:=тЛ.next;
end;
vivod.Text:=str;
end;
procedure TForml.Button3Click(Sender: TObject); var m,к,r:spisok; :integer;
begin m: =1 ;
for :=1 to StrToInt(Edit3.Text)-1 do m:=mA.next; //Поиск позиции вставки
new(k);
k^.elem.-^StrToInt (Edit2.Text); //Создали элемент
г:=тЛ.next; тЛ.next:=k; кЛ.next:=r;
end;
procedure TForml.Button4Click(Sender: TObject); var m,к,r:spisok;
: integers-begin
if Editl.Text='0' then begin m:=l;
l:=lA.next; dispose(m); end
else begin m:=l;
for i:=l to StrToInt(Editl.Text)-1 do m:=mA.next; //Поиск позиции удаления к:=тЛ.next; г:=кЛ.next;
тЛ.next:=r; dispose(к); ends-end;
end.
Порядок выполнения работы
1. В
соответствии с вариантом задания
написать программу
обработки списка
на языке С++ или Delphi.
-
Отладить программу.
-
Получить результат.
4. Показать
текст программы и результат ее работы
препода-
вателю.
5. Сдать и защитить работу.
Защита отчета по лабораторной работе
Отчет по лабораторной работе должен состоять из:
-
Постановки задачи.
-
Блок-схемы программы.
-
Текста программы на языке программирования.
-
Результатов.
Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.
Контрольные вопросы
-
Приведите классификацию данных.
-
Что такое простые типы данных?
-
Что такое статические и полустатические структуры данных?
-
Какие существуют динамические структуры данных?
-
Как осуществляется размещение переменных в памяти компьютера?
Варианты задания
-
Создать список. Поменять местами максимальный и минимальный элементы.
-
Создать список. Удалить из него повторяющиеся элементы.
-
Создать два списка. Создать 3-й список, состоящий из элементов, которые есть как в первом, так и во втором списке.
4. Создать
два списка. Создать 3-й список,
объединяющий
первый и второй списки.
Удалить максимальный элемент в но-
вом
списке.
5. Создать список и отсортировать его по убыванию.
-
Создать два списка одинаковой длины. Произвести поэлементное вычитание из первого списка элементов второго списка.
-
Создать два списка. Создать 3-й список, состоящий из неповторяющихся элементов первых двух списков.
-
Создать список. Вставить в него после максимального элемента копию минимального элемента.
-
Создать список. После каждого отрицательного элемента вставить элемент, равный 0.
-
Создать список. Посчитать сумму всех элементов. Полученный результат вставить после минимального элемента списка.
-
Создать список. Удалить из него все отрицательные элементы.
-
Создать два списка. Создать 3-й список, состоящий из положительных элементов двух первых списков.
ЛАБОРАТОРНАЯ РАБОТА № 10. Объектно-ориентированное программирование (ООП)
Цель работы: познакомиться с принципами объектно-ориентированного программирования.
Лабораторная работа рассчитана на 4 академических часа.
Подготовка к лабораторной работе
1. Ознакомиться
с лекционным материалом по теме
«Объ-
ектно-ориентированное
программирование» учебной дисципли-
ны
«Технология разработки программного
обеспечения».
-
Изучить соответствующие разделы в изданиях [1, 40, 41].
-
Повторить программирование на С++ (Delphi).
-
Ознакомиться с разд. 6.1 данного пособия.
Теоретическая часть. Основные понятия
Класс — абстрактный тип данных, включающий в себя свойства объекта (поля) и методы. Класс позволяет упростить процесс программирования, так как человеку проще представлять любой объект из реальности, обладающий некоторыми характеристиками (свойствами) и действиями, которые может совершать объект или которые можно совершать над ним.
Класс — это тип данных. Объект класса — переменная типа «класс».
Из определения класса следует первое свойство ООП — инкапсуляция. Инкапсуляция данных означает, что данные являются не глобальными — доступными всей программе, а локальными — доступными только малой ее части. Инкапсуляция автоматически подразумевает защиту данных. Для этого в структуре class используется спецификатор раздела private, содержащий данные и методы, доступные только для самого класса. Если данные и методы содержатся в разделе public, они доступны извне класса. Раздел protected содержит данные и методы, доступные из класса и любого его производного класса:
class Stek {
private:
spisok *1; public: Stek() ;
void PrintSpisok();
void AddElem(int pos,int element);
void DelElem(int pos);
};
Вторым по значимости понятием является наследование. Новый (производный) класс может быть создан на основе уже имеющегося (базового) класса. При этом новый класс сохраняет все свойства старого: данные объекта базового класса включаются в данные объекта производного, а методы базового класса могут быть вызваны для объекта производного класса. Иначе говоря, новый класс наследует как данные старого класса, так и методы их обработки. Если объект наследует свои свойства от одного родителя, то говорят об одиночном наследовании. Если же объект наследует атрибуты от нескольких базовых классов, то говорят о множественном наследовании:
class PotomokSteka: public Stek
private: spisok *z;
public: PotomokSteka() ; void SortSpisok();
};
Третьим по значимости понятием является полиморфизм. Полиморфной называется функция, независимо определенная в каждой из группы производных классов и имеющая в них общее имя. Полиморфная функция обладает тем свойством, что при отсутствии полной информации о том, объект какого из производных классов в данный момент обрабатывается, она тем не менее корректно вызывается в том виде, в каком она была определена для данного конкретного класса.
Теперь поговорим о реализации классов в программе. Для инициализации объекта класса принято создавать дополнительный метод, называемый конструктором. Эта функция должна называться так же, как и класс. Возможно создать несколько конструкторов для разных методов первоначальной инициализации объекта:
class Stek {
private:
spisok *1; public:
StekO; //По умолчанию создается список
//из 10 элементов Stek(int q); //Количество элементов в списке
//передается в виде параметра
Stek::Stek() {
spisok *m, *k; int
// randomize();
k=new spisok; k->elem=random(5); l=k;
for (i=l;i<10;
{
m=new spisok;
m->elem=random(5);
k->next=m;
k=m;
}
k->next=NULL;
Stek::Stek(int g) {
spisok *m,*k; int i;
randomize(); k=new spisok; k->elem=random(5); l=k;
for ;i<g;
{
m=new spisok;
m->elem=random(5);
k->next=m;
k=m;
}
k->next=NULL;
void main() {
Stek stl,st2(7); //Создание объектов класса в программе
Существует также понятие деструктора класса. Это метод класса, предназначенный для уничтожения объекта класса. Допустим, он может быть полезен, если нужно удалить динамический список, освободив память:
class Stek {
private:
spisok *1; public: Stek() ; Stek(int q) ; ~Stek(); //Деструктор
Stek::~Stek() {
spisok *m; m=l;
while (m!=NULL)
{
l=m->next;
delete(m); m=l;
cout«"Stek was deleted";
Работу деструктора можно увидеть, например, если создать указатель на объект класса «динамический список». Тогда при выполнении операции delete будет вызван деструктор класса:
void main() {
Stek *st3; st3=new Stek;
cout«endl<<"Creat new steck:"; st3->PrintSpisok(); delete(st3);
Пример программы на языке С++
#include<conio.h> #include<stdlib.h> #include<iostream.h> #include<stdio.h>
struct spisok {
int elem; spisok *next; };
class Stek {
private: spisok public: Stek() ; Stek(int q); -Stek () ;
void PrintSpisok();
void AddElem(int pos,int element);
void DelElem(int pos);
};
Stek::Stek() {
spisok *m,*k; int i; // randomize();
k=new spisok;
k~>elem=random(5);
l=k;
for (i=l;i<10;
{
m=new spisok;
m->elem=random(5);
k->next=m;
k=m;
}
k->next=NULL;
Stek::Stek(int g) {
spisok *m, *k; int i; // randomize();
k=new spisok;
k->elem=random(5);
l=k;
for (i=l;i<g;
{
m=new spisok;
m->elem=random(5);
k->next=m;
k=m;
}
k->next=NULL;
void Stek::PrintSpisok() {
spisok *m;
m=l;
while (m!=NULL)
{
cout<<m->elem« *
m=m->next;
}
cout«endl; }
Stek: :~Stek()' {
spisok *m; m=l;
while (m!=NULL)
{
l=m->next; delete(m); m=l;
}
cout«"Stek was deleted";
void Stek::AddElem(int pos,int element) {
spisok *m,*k,*r; int m=l;
for (i=l;i<pos-l; m=m->next;
k=new spisok;
k->elem=element;
r=m->next;
m->next=k;
k->next=r;
void Stek::DelElem(int pos) {
spisok *m,*k,*r; int i,a;
if (pos==0) {
m=l;
l=l->next; delete(m); }
else
{
m=l;
for(i=l;i<pos-l; m=m->next; //Поиск позиции
//удаления
k=m->next; r=k->next;
m->next=r; delete(k);
class PotomokSteka: public Stek {
private: spisok *z;
public: PotomokSteka() ;
};
PotomokSteka::PotomokSteka() {
spisok *m,*k; int i;
randomize();
k=new spisok; k->elem=random(5); z=k;
for (i=l;i<10;
{
m=new spisok;
m->elem=random(5) ;
k->next=m;
k=m;
}
k->next=NULL;
void main() {
clrscr();
Stek stl,St2(7); cout«endl«"stl: stl.PrintSpisok(); cout«endl«"st2: st2.PrintSpisok();
cout«endl<<"Add element in 1-st spisok"«endl; stl.AddElem(3,1000); stl.PrintSpisok();
cout<<endl<<"Delete element from 1-st spisok"«endl; stl.DelElem(2); stl.PrintSpisok();
Stek *st3; st3=new Stek;
cout<<endl«"Creat new steck:"; st3->PrintSpisok(); delete(st3);
PotomokSteka pst4; cout«endl«endl«"pst4 : pst4.PrintSpisok() ;
getch () ; }
Порядок выполнения работы
-
В соответствии с вариантом задания из лабораторной работы № 9 написать программу обработки списка на языке С++ или Delphi.
-
Отладить программу.
-
Получить результат.
-
Показать текст программы и результат ее работы преподавателю.
-
Сдать и защитить работу.