Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4 Вариант 1.2

.1.doc
Скачиваний:
25
Добавлен:
20.06.2014
Размер:
165.38 Кб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

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

Лабораторная работа №4

по дисциплине

«Программирование на языке высокого уровня»

на тему:

«Программирование рекурсивных алгоритмов

(Циклическая и рекурсивная обработка информации)»

Студент

Ельшаева Н.А.

подпись, дата

фамилия, инициалы

Группа

АС-09

Принял

Фарафонов А.С.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

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

Вариант: 1.2.1.

Тип дерева: двоичное(1).

Функция: среднее(2).

Определитель матрицы разложением по столбцу(1).

  1. Краткие теоретические сведения

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

Пошаговый перебор элементов дерева по связям между предками-узлами и потомками-узлами называется обходом дерева, а сам процесс называется обходом по дереву. Зачастую, операция может быть выполнена переходом указателя по отдельным узлам. Обход, при котором каждый узел-предок просматривается прежде его потомков называется предупорядоченным обходом или обходом в прямом порядке (pre-order walk), а когда просматриваются сначала потомки, а потом предки, то обход называется поступорядоченным обходом или обходом в обратном порядке (post-order walk). Существует также симметричный обход, при котором посещается сначала левое поддерево, затем узел, затем — правое поддерево, и обход в ширину, при котором узлы посещаются уровень за уровнем (N-й уровень дерева — множество узлов с высотой N). Каждый уровень обходится слева направо.

Существует два основных типа деревьев. В рекурсивном дереве или неупорядоченном дереве имеет значение лишь структура самого дерева без учёта порядка потомков для каждого узла. Дерево, в котором задан порядок (например, каждому ребру, ведущему к потомку, присвоены различные натуральные числа) называется деревом с именованными рёбрами или упорядоченным деревом со структурой данных, заданной перед именованием и называемой структурой данных упорядоченного дерева.

Упорядоченные деревья являются наиболее распространёнными среди древовидных структур. Двоичное дерево поиска — одно из разновидностей упорядоченного дерева.

Двои́чное де́рево — древовидная структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым сыновьями.

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

нет

нет

да

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);

нет

да

  1. Листинг программы

#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);

}

  1. Контрольный пример

  1. Выводы о проделанной работе

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

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005

  3. Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004