Файл: Технол_разраб_прогр_обесп_Гагарина_Кокарева.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 20.11.2019

Просмотров: 13469

Скачиваний: 411

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рис. Л8.3. Примеры СЯС-карт

Шаг третий. Для проверки достаточности или избыточности придуманных классов, а также корректности их взаимодействия строится диаграмма взаимодействия (рис. Л8.4).

Клиент Банкомат

Вводит пароль

Служба безопасности


Передает пароль

Банк

Выдает сообщение с результатом

Вводит сумму г*-

Производит транзакцию с суммой



Передает информацию о возможности выдать сумму

Выдает сумму

I


Рис. Л8.4. Диаграмма взаимодействия

Метод СКС-карточек позволяет провести также инсценировку работы системы. Для этого достаточно раздать карточки с классами участникам проекта. После этого начать ролевую игру. Первый участник встает и читает действие, совершаемое его классом. Другие участники, исходя из своих карточек, сообщают об ответной реакции других классов. Если в какой-то момент реакции не последует, то это признак несовершенства проекта системы. Такая игра может подсказать и об избыточности проекта.


Порядок выполнения работы

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

  2. Определить варианты использования системы и описать их в краткой или полной форме (см. разд. 3.6.2).

  3. Построить диаграмму вариантов использования системы (использовать MS Office или MS Visio).

4. Определить классы проектируемой системы.

5. Создать CRC-карты для всех классов системы (использо-
вать
MS Office или MS Visio).

6. Построить диаграмму взаимодействия (использовать MS
Office или MS Visio).

7. Сдать и защитить работу.


Защита отчета по лабораторной работе


Отчет по лабораторной работе должен состоять из:

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

  2. Описания действующих лиц и прецедентов системы.

  3. Диаграммы прецедентов.

  4. СЯС-карты.

  5. Диаграммы взаимодействия.

Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.


Контрольные вопросы

  1. Охарактеризуйте проектирование ПО при объектном подходе.

  2. В чем заключается моделирование предметной области при проектировании ПО?

  3. Язык иМ1_. Его назначение, преимущества и недостатки.

  4. Опишите варианты использования ПО.

  5. Перечислите диаграммы в языке иМ1_.

  6. Приведите пример диаграммы прецедентов.

7 Приведите пример диаграммы взаимодействия.

8. В чем состоит назначение и использование СРС-карт?



Варианты заданий

  1. Заказ билетов в аэропорту.

  2. Электронный магазин.

  3. Отправка біш.

  4. Система охраны частного дома.

  5. Система безопасности тюрьмы.

  6. Система безопасности полета самолета.

ЛАБОРАТОРНАЯ РАБОТА № 9. Динамические структуры данных






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

Лабораторная работа рассчитана на 4 академических часа.



Подготовка к лабораторной работе


1. Ознакомиться с лекционным материалом по теме «Струк-
тура и формат данных» учебной дисциплины «Технология разра-
ботки программного обеспечения».

  1. Изучить соответствующие разделы в изданиях [40, 41, 47].

  2. Повторить программирование на С++ (Delphi).

  3. Ознакомиться с разд. 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 {

  1. spisok *m,*k;

  2. int

  3. randomize();

  4. k=new spisok;

  5. k->elem=random(5);

  6. l=k;

  7. for (i=l;i<10; {

  1. m=new spisok;

  2. m->elem=random(5);

  1. k->next=m;

  1. k=m; }

(12) k->next=NULL;
}

В строках (1) и (2) объявляются служебные переменные.

Строка (3) — инициализация генератора случайных чисел для последующего присвоения произвольных значений элементам списка.

(4) k=new spisok; Выделяется ячейка память для переменной типа «список», и ее адрес сохраняется в переменной к:

к

(5) k->elem=random(5); Присваивается значение элементу списка:

(6) 1=к; Указатель на первый элемент списка запоминается в переменной /:

  1. for (i=l;i<10;i++). Для создания списка из 10 элементов используется цикл.

  2. 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.

  1. Отладить программу.

  2. Получить результат.

4. Показать текст программы и результат ее работы препода-
вателю.

5. Сдать и защитить работу.


Защита отчета по лабораторной работе


Отчет по лабораторной работе должен состоять из:

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

  2. Блок-схемы программы.

  3. Текста программы на языке программирования.

  4. Результатов.

Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.


Контрольные вопросы

  1. Приведите классификацию данных.

  2. Что такое простые типы данных?

  3. Что такое статические и полустатические структуры данных?

  4. Какие существуют динамические структуры данных?

  5. Как осуществляется размещение переменных в памяти компьютера?



Варианты задания

  1. Создать список. Поменять местами максимальный и минимальный элементы.

  2. Создать список. Удалить из него повторяющиеся элементы.

  3. Создать два списка. Создать 3-й список, состоящий из элементов, которые есть как в первом, так и во втором списке.


4. Создать два списка. Создать 3-й список, объединяющий
первый и второй списки. Удалить максимальный элемент в но-
вом списке.

5. Создать список и отсортировать его по убыванию.

  1. Создать два списка одинаковой длины. Произвести поэлементное вычитание из первого списка элементов второго списка.

  2. Создать два списка. Создать 3-й список, состоящий из неповторяющихся элементов первых двух списков.

  3. Создать список. Вставить в него после максимального элемента копию минимального элемента.

  4. Создать список. После каждого отрицательного элемента вставить элемент, равный 0.

  1. Создать список. Посчитать сумму всех элементов. Полученный результат вставить после минимального элемента списка.

  2. Создать список. Удалить из него все отрицательные элементы.

  3. Создать два списка. Создать 3-й список, состоящий из положительных элементов двух первых списков.


ЛАБОРАТОРНАЯ РАБОТА № 10. Объектно-ориентированное программирование (ООП)

Цель работы: познакомиться с принципами объектно-ориентированного программирования.

Лабораторная работа рассчитана на 4 академических часа.

Подготовка к лабораторной работе

1. Ознакомиться с лекционным материалом по теме «Объ-
ектно-ориентированное программирование» учебной дисципли-
ны «Технология разработки программного обеспечения».

  1. Изучить соответствующие разделы в изданиях [1, 40, 41].

  2. Повторить программирование на С++ (Delphi).

  3. Ознакомиться с разд. 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 () ; }


Порядок выполнения работы

  1. В соответствии с вариантом задания из лабораторной работы № 9 написать программу обработки списка на языке С++ или Delphi.

  2. Отладить программу.

  3. Получить результат.

  4. Показать текст программы и результат ее работы преподавателю.

  5. Сдать и защитить работу.