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.
Отладить программу.
Получить результат.
Показать текст программы и результат ее работы преподавателю.
Сдать и защитить работу.
Защита отчета по лабораторной работе
Отчет по лабораторной работе должен состоять из:
Постановки задачи.
Блок-схемы программы.
Текста программы на языке программирования.
Результата.
Защита отчета по лабораторной работе заключается в предъявлении преподавателю полученных результатов (на экране монитора), демонстрации полученных навыков и ответах на вопросы преподавателя.
Контрольные вопросы
1. Опишите понятия объектно-ориентированного программирования:
класс;
объект;
инкапсуляция;
наследование;
полиморфизм.
Что такое поля и методы классов?
Как производится объявление переменных и методов public, protected, private?
Что такое конструктор и деструктор?