Чтение онлайн

ЖАНРЫ

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

/// хранимого элемента elem</param>

public void put_left(Figure elem)

{

TwoLinkable newitem = new TwoLinkable;

newitem.Item = elem;

newitem.Next = cursor;

if (empty) //список пуст

{

first = cursor = last = newitem;

index =1; count = 1;

}

else

{

if (index == 1)

first =newitem;

else

cursor.Prev.Next = newitem;

newitem.Prev = cursor.Prev; cursor.Prev = newitem;

count++; index++;

}

}//put_right

/// <summary>

/// require: true;

/// ensure:

добавить новый элемент (elem) справа от курсора;

/// </summary>

/// <param name="еlеm">Тип Figure играет роль родового типа G

/// хранимого элемента elem</param>

public void put_right(Figure elem)

{

TwoLinkable newitem = new TwoLinkable;

newitem.Item = elem;

newitem.Prev = cursor;

if (empty) //список пуст

{

first = cursor = last = newitem;

index =1; count = 1;

}

else

{

if (index == count)

last =newitem;

else

cursor.Next.Prev = newitem;

newitem.Next = cursor.Next; cursor.Next = newitem;

count++;

}

}//put_right

public void remove

{

if (count == 1)

{

first = last = cursor = null;

index=0;

}

else if(index==l)

{

first = cursor.Next;

cursor.Prev = null;

cursor = cursor.Next;

}

else if(index == count)

{

last = cursor.Prev;

cursor.Next = null;

cursor = cursor.Prev;

index--;

}

else

{

cursor.Prev.Next = cursor.Next;

cursor.Next.Prev = cursor.Prev;

cursor = cursor.Next;

}

count--;

}//remove

/// операции с курсором:

/// <summary>

/// start: require: true;

/// ensure: сделать активным первый элемент;

/// </summary>

public void start

{

cursor = first; index = 1;

}//start

/// <summary>

/// finish: require: true;

/// ensure: сделать активным последний элемент;

/// </summary>

public void finish

{

cursor = last; index = count;

}//finish

/// <summary>

/// go_prev: require: not (index = 1);

/// ensure: сделать активным предыдущий элемент;

/// </summary>

public void go_prev

{

cursor = cursor.Prev; index-;

}// go_prev

/// <summary>

/// go_next: require: not (index = count);

/// ensure: сделать активным последующий элемент

/// </summary>

public void go_next

{

cursor = cursor.Next; index++;

}// go_next

/// <summary>

/// go_i(i): require: (i in [1, count]);

/// ensure:

сделать активным элемент с индексом

/// </summary>

/// <param name="i" x/param>

public void go_i(int i)

{

if(i >index)

while (i>index)

{

cursor = cursor.Next; index++;

}

else if(i<index)

while (i<index)

{

cursor = cursor.Prev; index-;

}

}// go_i

/// операции поиска:

/// <summary>

/// search_prev(elem): require: not (index = 1);

/// ensure: сделать активным первый элемент elem слева от курсора;

/// </summary>

/// <param name="elem">искомый элемент</param>

public virtual void search_prev(Figure elem)

{

bool found = false;

while (!found && (index!=1))

{

cursor = cursor.Prev; index-;

found = (elem == item);

}

search_res = found;

}// search_prev

/// <summary>

/// успех или неуспех поиска сохранять в булевской

/// переменной search_res

/// search_next: require: not (index = count);

/// ensure: сделать активным первый элемент elem справа от курсора;

/// успех или неуспех поиска сохранять в булевской

/// переменной search_res

/// </summary>

/// <param name="elem"></param>

public virtual void search_next(Figure elem)

{

bool found = false;

while (!found && (index!=count))

{

cursor = cursor.Next; index++;

found = (elem == item);

}

search_res = found;

}//search_next

}

}

Заметьте, класс подробно документирован. Для методов класса указываются предусловия и постусловия. Обратите внимание, в соответствии с принципами контрактного программирования клиент класса, прежде чем вызвать метод, должен проверить выполнимость предусловия, что повышает корректность работы системы в целом. Именно так и будет реализован вызов этих методов в классе формы, где осуществляется работа со списком.

Классы элементов списка

Рассмотрим классы, описывающие элементы списков — элементы с одним и с двумя указателями:

using System;

namespace Shapes

{

/// <summary>

/// Класс Linkable(T)задает элементы списка, включающие:

/// информационное поле типа Т — item

/// ссылку на элемент типа Linkable — next

/// Функции:

/// конструктор new: —> Linkable

/// запросы:

/// Get_Item: Linkable —> T

/// Get_Next: Linkable —> Linkable

Поделиться с друзьями: