43661

Обработка динамических списков

Курсовая

Информатика, кибернетика и программирование

Метод нисходящего проектирования (сверху-вниз) предполагает последовательное разложение общей функции обработки данных на простые функциональные элементы. В результате строится иерархическая схема, отражающая состав и взаимоподчиненность отдельных функций.

Русский

2013-11-04

306.65 KB

34 чел.

ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

                        Факультет ИПТ                          Кафедра ВМиС

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОЙ РАБОТЕ ПО ДИСЦИПЛИНЕ  “АЯиП”

На тему: “Обработка динамических списков”

                                                                                 Выполнил студент гр. 10В2 Пономарёв К.А..

                                                                Руководитель: Кутепова  Л.А.     

Проект защищён с оценкой:_____________

2011-2012 уч. Год

З А Д А Н И Е

на курсовое проектирование по курсу

  «Алгоритмические языки и программирование»           

Студенту  Пономарёву К.А.      Группа 10В2           

Тема проекта Создание и обработка динамического списка            

                   

                   

Исходные данные (технические требования на проектирование)

Разработать программу для формирования и редактирования однонаправленного
динамического списка с использованием интерфейса пользователя типа «горизонтальное
меню с выбором по функциональной клавише».              

Программа должна выполнять следующие функции:            

1) создавать динамический список и заполнять поля данных элементов динамического
списка данными из текстового файла;               

2) выводить данные динамического списка в файл в виде таблицы;           

3) производить добавление элемента в начало списка;             

4) производить удаление элемента с заданным номером;            

5) производить обмен местами элементов с заданными ключами.           

Предметная область элементов динамического списка – «планеты солнечной системы». Запись должна содержать не менее 4-х информационных полей.             

При разработке программы использовать заголовочные файлы пользователя ________          _______________________________________________  

                   

                   

                   

                   

                   

                   

                   

                   

                   

                   

                   

Объем работы по курсу

1. Расчетная часть

Отсутствует                  

                   

                   

                   

                   

                   

                   

                   

                   

                   

                   

2. Графическая часть

Схема программы                 

                   

                   

                   

                   

                   

                   

                   

3. Экспериментальная часть

Разработка, отладка и тестирование программы             

                   

                   

                   

                   

                   

                   

                   

Срок выполнения проекта по разделам

1. Постановка задачи     к  20 сентября   2011 г.

2. Метод решения задачи и ее формализация  к  27 сентября   2011 г.

3. Выбор языка программирования   к  04 октября   2011 г.

4. Разработка состава и структуры данных  к  04 октября   2011 г.

5. Разработка алгоритма решения задачи   к  18 октября   2011 г.

6. Разработка программы     к  01 ноября   2011 г.

7. Отладка и тестирование программы   к  22 ноября   2011 г.

8. Оформление ПЗ      к  20 декабря   2011 г.

   Дата выдачи задания «  20  »  сентября  2011 г.

   Дата защиты проекта « »     2011 г.

Руководитель   Л.А.Кутепова

Задание получил «  20  »  сентября 2011  г.

Студент  Пономарев К.А. 


СОДЕРЖАНИЕ

Введение…………………………………………..…………………………………………….....6

  1.  Постановка задачи……………………………….……………………………………………………........7
  2.  Метод решения задачи и её формализация……………………………………………………..….....8
  3.  Выбор языка программирования…………………………………….………………….…………..…11
  4.  Разработка состава и структуры исходных данных результатов……..…………………………12
  5.  Разработка алгоритма решения задачи………………………………………...……………..……..13
  6.  Разработка программы…………………………………………………....…………………………...14
  7.  Отладка и тестирование программы……………………………………..……….…..……………….15

Заключение……………………………………….…………………………………………………………….20

Библиографический список………………………………………………………………………………….20

Приложение 1. Схемы программы………………………………………………………………………...21

Приложение 2. Листинг программы………………………………………..……………………………...25

КР.230101.14.2011  81

Изм.

Лист

№ докум.

Подп.

Дата

Разраб.

Пономарев К.А.

Создание и обработка динамического списка

Пояснительная записка

Лит.

Лист

Листов

Пров.

Кутепова Л.А.

 3

Н. Контр.

 

    ПГТА, гр. 10В2

Утв.

Введение

Очень часто, при разработке приложений, оперирующих с большим количеством входных данных, возникает вопрос об их хранении во время выполнения программы. Например в массивах. Несомненно, данный тип решает вопрос хранения данных, однако он не лишен недостатков. Главным из них является его фиксированный размер. Это свойство не поддается изменению даже у динамически созданных массивов, что довольно часто заставляет программистов, использующих исключительно их, выделять память "с запасом". Ну а во-первых, даже "запас" ограничен, и никто не может дать гарантии, что и его будет достаточно, а во-вторых, наоборот, "запаса" может хватить настолько, что немалая часть отведенной программе памяти будет занята понапрасну.

Данную проблему решает другой тип хранения данных, которому и посвящен этот курсовой проект - связанный список динамических переменных, или проще - динамический список. Компоненты добавляются и удаляются во время выполнения программы, и их количество зависит исключительно от размера доступной памяти. Однако, за это преимущество приходится расплачиваться недостатком - если в случае с массивом, мы в любой момент получаем доступ к любому компоненту, то в случае со списком, в один момент времени нам доступны максимум 3 компонента (это зависит от способа представления списка в программе). В большинстве случаев, это очень даже приемлемая цена.

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

Элементом списка будет служить структура (составной тип данных, построенный с использованием  других типов).

 

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

Разработать программу для формирования и редактирования однонаправленного динамического списка с использованием интерфейса пользователя типа «вертикальное меню с выбором по функциональной клавише».

Программа должна выполнять следующие функции:

  1.  Создавать динамический список и заполнять поля данных элементов динамического списка данными из текстового файла;
  2.  Выводить данные динамического списка на экран и в файл в виде таблицы;
  3.  Добавлять элемент в список после указанного ключа
  4.  Производить удаление элемента по номеру;
  5.  Работу программы регулировать с помощью меню.

Метод решения задачи и ее формализация.

Для более удобного и простого решения поставленной задачи мы разбиваем её на отдельные подзадачи. Управление динамическим списком происходит в файле funcs.cpp. Функция  Input() принимает введенные данные пользователя и на их основе создаёт динамический список. Функция  Output()  выводит данные на экран и в файл. Функция  Add()  добавляет данные в динамический список. Функция  Del()  удаляет запись из списка после указанного номера. Функция StructSave()  сохраняет структуру и данные динамического списка в файл. Функция  StructLoad()  загружает структуру и данные динамического списка в программу.

В программе используются INFO - тип (структура). Содержит 4 полея. Первое поле типа int (счетчик). Остальные поля типа char (название планеты, площадь, количество спутников).  

Динамический список.

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

Наряду со статическими переменными, для которых выделяется место в оперативной памяти (ОП) в течение всего периода работы программы, в языке  Си++ могут быть использованы динамические переменные, которые создаются и уничтожаются по необходимости (т.е. для них выделяется ОП или от них освобождается ОП). В этом случаи одни и те же участки ОП в различные моменты времени могут быть заняты различными переменными в течение периода работы программы, что позволяет уменьшить требуемый объём памяти по сравнению с использованием статических переменных.

Метод нисходящего проектирования.

Метод нисходящего проектирования ("сверху-вниз") предполагает последовательное разложение общей функции обработки данных на простые функциональные элементы. В результате строится иерархическая схема, отражающая состав и взаимоподчиненность отдельных функций.

Эта технология является неотъемлемой частью создания хорошо структурированных программ. Она начинаем с записи псевдокода вершины. Вершина — это единственное предложение (оператор), выражающее общее назначение программы. Таким образом, вершина отображает всю программу в целом. К сожалению, вершина редко отображает достаточное количество деталей, на основании которых можно написать программу на C++. Поэтому надо начинать процесс детализации. Для этого вершину делят на ряд более мелких задач и записывают их в том порядке, в котором они должны выполняться. В результате получают первую детализацию: здесь использована только структура следования — записанные шаги должны выполняться последовательно один за другим. Каждая детализация, так же, как и сама вершина, является полным описанием алгоритма; меняется только уровень детализации. Многие программы могут быть логически разделены на три этапа: этап задания начальных значений, в котором задаются начальные значения переменных программы; этап обработки данных, в котором вводятся данные и устанавливаются значения соответствующих переменных программы; заключительный этап, в котором вычисляются и печатаются окончательные результаты. Программист завершает процесс нисходящей разработки с пошаговой детализацией, когда алгоритм на псевдокоде настолько детализирован, чтобы его псевдокод можно было бы преобразовать в программу на C++. Реализованная программа на C+ + окажется в этом случае простой и наглядной.

В своей программе я также использую метод нисходящего проектирования. Данный метод можно представить в виде следующей схемы:

 

Выбор языка программирования.

C++ — компилируемый статически типизированный язык программирования общего назначения.

Поддерживает разные парадигмы программирования, сочетает свойства как высокоуровневых, так и низкоуровневых языков[1][2]. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.[2] Название «C++» происходит от названия языка C, в котором унарный оператор ++ обозначает инкремент переменной.

Являясь одним из самых популярных языков программирования,[3][4] C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры). Существует несколько реализаций языка C++ — как бесплатных, так и коммерческих. Наиболее популярный проект GNUMicrosoftIntel и Embarcadero (Borland). C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

При создании C++ Бьёрн Страуструп стремился сохранить совместимость с языком C. Множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико — отчасти благодаря тому, что синтаксис C++ был основан на синтаксисе C.


Достоинства С++ :

  1.  Масштабируемость. На языке C++ разрабатывают программы для самых различных платформ и систем
  2.  Возможность работы на низком уровне с памятью, адресами, портами. Что, при неосторожном использовании, может легко превратиться в недостаток.
  3.  Возможность создания обобщенных алгоритмов для разных типов данных, их специализация, и вычисления на этапе компиляции, используя шаблоны.

Разработка состава и структуры исходных данных и результатов.

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

  1.  Файл созданный ранее.
  2.  Данные для дополнения списка (название планеты, площадь, количество спутников).
  3.  Ключи (номера) элементов которые нужно добавить или удалить.

 

Результатом  работы программы является список, представленный в виде таблицы.


Разработка алгоритма.

Алгоритм работы программы заключается в следующем:

  1.  Вызывается основной метод программы MAIN который отрисовывает  меню для упрощения работы с программой.   
  2.  С помощью меню выбирается нужное действие – в зависимости от нажатой клавиши вызывается метод:

F1 – Input();

F2 – Output();

F3 – StructLoad();

F4 – StructSave();

F5 – Add();

F6 – Del();

ESCexit(0);

Функция Input()  добавляет новые данные в список. В качестве параметров  принимает  данные введенные с клавиатуры.  

Функция Output() выводит данные списка на экран и в файл, для этого используется  цикл while() условием выхода из цикла является нахождение элемента с указателем значение которого равно NULL.

Функция Add() добавляет новый элемент после элемента с заданным ключом. Для  этого в цикле for() осуществляется поиск элемента с ключом и после него добавляется новый элемент. Для добавления метод запрашивает данные о новом элементе.

Функция Del() удаляет элемент с заданным номером.

Функция StructSave() сохраняет текущую структуру и данные в файл.

Функция StrutLoad() загружает в программу структуру данные из файла.

Функция exit() осуществляет выход из программы..

 

Разработка программы.

В программе используются следующие стандартные процедуры,  функции и операторы:

  1.  Оператор new – выделяет место в динамической памяти.
  2.  Оператор delete – освобождает место в динамической памяти.
  3.  Функция getch()  - обрабатывает нажатие клавиши.
  4.  Функция exit() – производит выход из программы.
  5.  Функция strcmp() – для сравнения строк.
  6.  Функция fopen() – для открытия файла.
  7.  Функция fread () – считывает строку из файла.
  8.  Функция fwrite () – записывает строку в файл.
  9.  Метод fclose () закрывает файл.
  10.  Оператор scanf – ввод с клавиатуры
  11.  Оператор printf – вывод на экран

В программе используются следующие стандартные заголовочные файлы:

  1.  stdio.h – для выполнения операций ввода/вывода.
  2.  conio.h – для вызова функции getch().
  3.  string.h – для работы со строками.
  4.  locale.h – для вывода сообщений на экран на кириллице.

Программа состоит из трех файлов (DynamicList1.cpp, funcs.cpp, funcs.h)

Заголовочный файл funcs.h  подключаются к главному файлу DynamicList1.cpp в котором описана главная функция  main().

Описание  заголовочного файла funcs.h находится в файле  funcs.cpp.

Отладка и тестирование программы.

Для обнаружения и устранения ошибок в программе выполняется её отладка.

Для этого в интегрированной среде Microsoft Visual Studio существуют встроенные средства – отладчик.

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

Примеры тестовых наборов разрабатываемой программы.

Главное меню:

Ввод данных:

Вывод данных:

Добавить  запись:


 

Заключение.

Для разработки программы были проведены следующие виды работ:

Вначале мы определились с методом решения задачи и её формализации, что позволило нам понять общий подход для решения поставленной задачи. Затем мы выбрали

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

Библиографический список.

  1.  В.В Подбельский “ Язык Си++” Финансы и статистика 2001.
  2.  http://study.pgta.ru/course/view.php?id=171

Приложение 2. Схемы программы.

Схема метода Add


Схема функции Del:

Схема функции Input:

Схема функции Main:

Схема функции Output:

Схема функции Struct:

Приложение 2. Листинг программы.

Код файла funcs.cpp

#include "stdio.h"

#include "conio.h"

#include "windows.h"

// Две константы, одна используется для имени, в которую выведится файл с таблицей ( данные)

// Вторая для хранения структуры

#define OUTPUT_FILE "./OUTPUT.TXT"

#define STRUCT_FILE "./STRUCT.DAT"

// Структура, для записи

struct info

{

 int id;

 char key1[100];// Номер по порядку

 char key2[100];// Кол-во населения

 char key3[100]; // Имя президента

};

//Динамический список, хранит себе список и ссылку на следующий элемент

struct node

{

info har;

node *next;

};

// Переменные-указатели, через которые мы работаем со списком

node *first, *last, *list, *addM;

// Общий глобальный счетчик записей

int n;

// Функция для ввода данных

void Input()

{

// Переменная, в которую будет записываться клавиша, для продолжения ввода данных

 char key;

 

system("cls");

printf ("** ВВОД ДАННЫХ: ** \n");

// Проверка, есть ли уже введенные данные, тогда указатель first будет не пустой

 if (first!=NULL) {

 printf("\nОшибка! Данные уже введены.");

 getch();

 return;

}

// Выделяем память под первую запись, и увеличиваем счетчик записей на +1

n = 1;

// Выделяем память под первую запись

first = new node;

// Присваиваем ключу id номер

 (*first).har.id = n;

printf ("\nВведите название: ");

 scanf ("%s", (*first).har.key1);

printf ("\nВведие площадь: ");

scanf ("%s", (*first).har.key2);

printf ("\nВведите кол-ко спутников: ");

 scanf ("%s", (*first).har.key3);

// Указатель на следующий элемент присваиваем ноль

 first->next = NULL;

last = first;

 while (true) {

 printf ("\nПродолжить? (Нажмите Y) ");

 scanf("%s", &key);

 if (key!='y' && key!='Y')

  return;

  

 system("cls");

 printf ("** ВВОД ДАННЫХ: ** \n");

 n++;

 list = new node;

 (*list).har.id = n;

printf ("\nВведите название: ");

  scanf ("%s", (*list).har.key1);

 printf ("\nВведие площадь: ");

 scanf ("%s", (*list).har.key2);

 printf ("\nВведите кол-ко спутников: ");

 scanf ("%s", (*list).har.key3);

 

list->next = NULL;

 last->next = list;

 last = list;

}

}

//Функция вывода данных

void Output()

{

// Инициализция файла

// Переменная (дескриптор) в которй будет хранится ссылка на открытый файл

FILE *fil;

// Открываем файл, параметр w - файл для записи

 fil = fopen(OUTPUT_FILE, "w");

// Перемещаем курсор файла на начало

fseek(fil, 0, SEEK_SET);

system("cls");

printf("+-----------------------------------+\n");

printf("| # | Название | Площадь | Спутники |\n");

 printf("+-----------------------------------+\n");

fprintf(fil, "+-----------------------------------+\n");

fprintf(fil, "| # | Название | Площадь | Спутники |\n");

 fprintf(fil, "+-----------------------------------+\n");

 // Делаем ссылку лист на начало списка

 list = first;

 int i = 1;

 while (list) {

 printf("| %d |  %s  |  %s  |  %s  \n", (*list).har.id, (*list).har.key1, (*list).har.key2, (*list).har.key3);

 fprintf(fil, "| %d |  %s  |  %s  |  %s  \n", (*list).har.id, (*list).har.key1, (*list).har.key2, (*list).har.key3);

 

// Перемещаемся на следующую позицию списка

 list = list->next;

 }

 

printf("+----------------------------------------+\n");

fprintf(fil, "+----------------------------------------+\n");

// Закрываем файл

fclose(fil);

getch();

}

//Функция добавления записи

void Add()

{

// переменная, которая будет хранить имя ключа, после которого добавить значение

 char cur3[100];

system("cls");

printf ("** ДОБАВИТЬ ЗАПИСЬ: ** \n");

 printf("\nВведите номер ключа, после которого нужно добавить данные: ");

 scanf("%s", &cur3);

last = first;

list = first;

 while (list) {

// Сравнивает строки

 if (strcmp((*list).har.key1, cur3)==NULL)

  break;

 last = last->next;

 list = list->next;

}

n++;

list = new node;

(*list).har.id=n;

printf ("\nВведите название: ");

 scanf ("%s", (*list).har.key1);

printf ("\nВведие площадь: ");

scanf ("%s", (*list).har.key2);

printf ("\nВведите кол-ко спутников: ");

 scanf ("%s", (*list).har.key3);

list->next=last->next;

last->next=list;

 printf ("Хорошо!\n");

getch();

}

// Функция удаления

void Del()

{

list = first;

while(list->next) {

 last = list;

 list = list->next;

}

last->next = NULL;

delete list;

 

printf("\nПоследняя запись удалена.");

 getch();

}

void StructSave()

{

FILE *fil;

 

fil = fopen(STRUCT_FILE, "w+b");

fseek(fil, 0, SEEK_END);

 

list = first;

 while (list) {

 fwrite(list, sizeof(info), 1, fil);

 list = list->next;

}

 

fclose(fil);

}

void StructLoad()

{

FILE *fil;

info h;

int res;

 

fil = fopen (STRUCT_FILE, "r+b");

if (!fil) {

 printf("\nОшибка! Файл со структурой не существует! Загрузка невозможна.");

 getch();

 return;

}

fseek (fil, 0, SEEK_SET);

res = fread (&h, sizeof(info), 1, fil);

if (res == 1) {

 first = new node;

 (*first).har = h;

 first ->next = NULL;

 last = first;

}

do {

 res = fread (&h, sizeof(info), 1, fil);

 if (res == 1){

  list = new node;

  (*list).har = h;

  list->next = NULL;

  last->next = list;

  last=list;

 }

}

while (res == 1);

fclose(fil);

getch();

}

Код файла DynamicList1.cpp

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

#include "windows.h"

#include <locale>

#include "funcs.h"

void main()

{

char globalKey;

 

SetConsoleCP(866);

SetConsoleOutputCP(866);

setlocale(LC_ALL, "russian_russia.1251");

while (true) {

 // UI

 system("cls");

 printf("+----------------------------+\n");

 printf("+- - - - ГЛАВНОЕ МЕНЮ - - - -+\n");

 printf("+----------------------------+\n");

 printf("+ Планеты солнечной системы  +\n");

 printf("+----------------------------+\n");

 printf("|  1. Ввод ------------------|\n");

 printf("|  2. Вывод -----------------|\n");

 printf("|  3. Загрузка структуры ----|\n");

 printf("|  4. Сохранение структуры --|\n");

 printf("|  5. Добавить запись -------|\n");

 printf("|  6. Удалить запись --------|\n");

 printf("+----------------------------+\n");

 printf("| ESC. Выход ----------------|\n");

 printf("+----------------------------+\n");

 // Menu switch

 globalKey = getch();

 switch (globalKey)

 {

  case '1':

   Input();

   break;

  case '2':

   Output();

   break;

  case '3':

   StructLoad();

   break;

  case '4':

   StructSave();

   break;

  case '5':

   Add();

   break;

  case '6':

   Del();

   break;

  case 27:

   exit(0);

 }

}

}


 

А также другие работы, которые могут Вас заинтересовать

53484. Зарубіжний досвід соціального страхування 84 KB
  Державне соціальне страхування є невідємною складовою соціальної системи будь-який економічно розвиненої країни. Будь-яке держава зацікавлена в тому, щоб у суспільстві не відбувалися соціальні потрясіння, а розвиток країни йшло стабільно і планомірно.
53485. Московське царство за Івана ІV 58 KB
  Московське царство за Івана ІV Мета: ознайомити учнів зі змінами в житті Московського царства в період завершення централізації країни; розглянути основні напрямки внутрішньої і зовнішньої політики Івана ІV; удосконалювати вміння учнів встановлювати причиннонаслідкові зв`язки працювати з історичною картою характеризувати роль історичних діячів. Правління Івана ІV Васильовича 15331584: а прихід Івана ІV до влади; б держава і церква; в реформи Вибраної ради; г зовнішня політика; д опричнина; 1. Перш ніж перейти до розгляду питання...
53486. Процедура правого поворота для AVL дерева и ее особенности 41.46 KB
  В 1962 году советские математики Адельсон-Вельский Г.М. и Ландис Е.А. предложили метод балансировки, требующий после включения или исключения узла лишь локальные изменения вдоль пути от корня к данному узлу, то есть времени не более O(log2n)
53488. Процедура вставки вершин в AVL дерева и ее особенности 19.29 KB
  Показатель сбалансированности в дальнейшем будем интерпретировать как разность между высотой левого и правого поддерева, а алгоритм будет основаться на типе TAVLTree, описанном выше. Непосредственно при вставке (листу) присваивается нулевой баланс
53489. УРОКИ МАТЕМАТИКИ В НАЧАЛЬНОЙ ШКОЛЕ 415 KB
  Издание содержит основные требования к урокам математики в начальной школе нормы оценок устных и письменных работ учащихся схемы анализа уроков и контрольных работ. Предложены типы уроков математики раскрыты особенности их построения приведены типичные причины затруднений практикантов на уроках. Содержание Введение 4 Этапы планирования и подготовки урока студентом 5 Действия практиканта при планировании и конкретизации задач урока. 9 Примерное содержание комбинированного урока 11 Образцы оформления конспектов...
53492. Построение таблицы по бинарному дереву поиска 22.96 KB
  Уровень узла в бинарном дереве определяется следующим образом: уровень корня всегда равен нулю, а далее номера уровней при движении по дереву от корня увеличиваются на 1 по отношению к своему непосредственному предку