Лабораторная работа №4 Вариант 1.2
.1.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №4
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Программирование рекурсивных алгоритмов
(Циклическая и рекурсивная обработка информации)»
|
Студент |
|
|
|
Ельшаева Н.А. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
Фарафонов А.С. |
|
||||||||
|
|
|
|
|
|
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
-
Задание
Написать программу, формирующую дерево заданного типа на основе данных, считанных из файла или введенных пользователем с клавиатуры. С помощью рекурсивной функции осуществить обход дерева и определить значение заданной функции от содержимого узлов дерева.
Вариант: 1.2.1.
Тип дерева: двоичное(1).
Функция: среднее(2).
Определитель матрицы разложением по столбцу(1).
-
Краткие теоретические сведения
Дерево — одна из наиболее широко распространённых структур данных в информатике, эмулирующая древовидную структуру в виде набора связанных узлов. Является связанным графом, не содержащим циклы. Большинство источников также добавляют условие на то, что рёбра графа не должны быть ориентированными. В дополнение к этим трём ограничениям, в некоторых источниках указываются, что рёбра графа не должны быть взвешенными.
Пошаговый перебор элементов дерева по связям между предками-узлами и потомками-узлами называется обходом дерева, а сам процесс называется обходом по дереву. Зачастую, операция может быть выполнена переходом указателя по отдельным узлам. Обход, при котором каждый узел-предок просматривается прежде его потомков называется предупорядоченным обходом или обходом в прямом порядке (pre-order walk), а когда просматриваются сначала потомки, а потом предки, то обход называется поступорядоченным обходом или обходом в обратном порядке (post-order walk). Существует также симметричный обход, при котором посещается сначала левое поддерево, затем узел, затем — правое поддерево, и обход в ширину, при котором узлы посещаются уровень за уровнем (N-й уровень дерева — множество узлов с высотой N). Каждый уровень обходится слева направо.
Существует два основных типа деревьев. В рекурсивном дереве или неупорядоченном дереве имеет значение лишь структура самого дерева без учёта порядка потомков для каждого узла. Дерево, в котором задан порядок (например, каждому ребру, ведущему к потомку, присвоены различные натуральные числа) называется деревом с именованными рёбрами или упорядоченным деревом со структурой данных, заданной перед именованием и называемой структурой данных упорядоченного дерева.
Упорядоченные деревья являются наиболее распространёнными среди древовидных структур. Двоичное дерево поиска — одно из разновидностей упорядоченного дерева.
Двои́чное де́рево — древовидная структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым сыновьями.
-
Блок-схема программы
нет
нет
да
mytree->right=
addElem(mytree->right, elem); mytree=
(Tree*)malloc(sizeof(Tree));
да
mytree->left= addElem
(mytree->left, elem) ;
return mytree;
нет
да
srednee(mytree->left);
kolvo++;
нет
да
srednee(mytree->right);
да
нет
да prosmotr(mytree->left); printf("%d",mytree->data); prosmotr(mytree->
right);
нет
да
-
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
struct Tree{
int data;
Tree *left;
Tree *right;
};
Tree* addElem(Tree* mytree, int elem);
void srednee(Tree *mytree);
void prosmotr(Tree *mytree);
int sredn=0,kolvo=0;
int main ()
{
FILE *fp;
setlocale(LC_ALL,"Rus");
int elem,p=1;
Tree* mytree = NULL;
while(p!=0)
{
printf("\nЧто вы хотите сделать?\n1. Ввести данные из текстового файла\n2. Ввести данные с клавиатуры\n3. Вывод среднего\n4. Вывод дерева\n0. Выход\n");
scanf("%d",&p);
switch(p)
{
case 1:
fp=fopen("D:/in.txt","r+");
while(!feof(fp))
{
fscanf(fp,"%d ",&elem);
mytree=addElem(mytree,elem);
}
fclose(fp);
break;
case 2:
printf("Введите элемент: ");
scanf("%d",&elem);
mytree=addElem(mytree,elem);
break;
case 3:
srednee(mytree);
float res;
res=(float)sredn/kolvo;
printf("\nСреднее: %f",res);
break;
case 4:
prosmotr(mytree);
break;
}
}
}
Tree* addElem(Tree* mytree, int elem)
{
if(!mytree){
mytree = (Tree*)malloc(sizeof(Tree));
mytree->data = elem;
mytree->left = mytree->right = NULL;
}
else{
if(elem <= mytree->data)
{
mytree->left = addElem(mytree->left, elem);
}
else
{
mytree->right = addElem(mytree->right, elem);
}
}
return mytree;
}
void srednee(Tree *mytree)
{
if(mytree->left)
srednee(mytree->left);
kolvo++;
sredn += mytree->data;
if(mytree->right)
srednee(mytree->right);
}
void prosmotr(Tree *mytree)
{
if(mytree->left)
prosmotr(mytree->left);
printf("%d",mytree->data);
printf(" ");
if(mytree->right)
prosmotr(mytree->right);
}
-
Контрольный пример
-
Выводы о проделанной работе
При выполнении данной лабораторной работы я научилась с помощью рекурсивной функции осуществлять обход дерева и определять значение заданной функции от содержимого узлов дерева.
-
Список использованной литературы
-
Шилдт Г. Искусство программирования на C++. БХВ.2005
-
Шилдт Г. C++ Руководство для начинающих. Вильямс.2005
-
Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004