Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций по курсу 'Информатика'.doc
Скачиваний:
4
Добавлен:
14.07.2019
Размер:
483.84 Кб
Скачать

Деревья.

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

считать их как ориентированными так и не ориентированными.

корень

лист поддерево

Операции, определенные для деревьев:

1. Если дерево пустое, то создать.

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

3. Вставка вершины (поддерева).

4. Удаление поддерева, если оно не пусто.

Пример обхода дерева в порядке КЛП ( корень- левое поддерево – правое поддерево).

Цифры определяют порядок обхода.

Очевидно, что осуществить такой обход довольно трудно. Это, как правило, рекурсивная функция.

Опишем структуру дерева.

struct tree

{ char inf [10] ;

tree * left ;

tree *right ;

}

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

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

С++ И ЕГО НОВЫЕ ВОЗМОЖНОСТИ.

ВВОД И ВЫВОД.

С++ предполагает другие возможности ввода-вывода через входной поток с именем сin, и выходной поток с именем cout.

#include<iostream.h>

main()

{ cout << “ введите n “ << endl ; // переход на следующую строку.

cin >> n ;

cout << “ результат =” << n*n ;

}

Можно перенаправить входной и выходной поток в файлы.

ПЕРЕГРУЗКА ФУНКЦИЙ.

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

int max (int , int) ;

float max ( float , float) ;

main()

{ int m,n ;

float a, b ;

cin >> m>> n>>a >>b ;

cout << “максимальное целое “ << max(m, n) ;

cout << “максимальное вещественное “ << max(a, b) ;

}

int max ( int m, int n ) // функция определяющая наибольшее из 2 целых чисел.

{ if (m>=n) return m ;

else return n ;

}

float max ( float a, float b ) // функция определяющая наибольшее из 2 вещественных чисел.

{ if (a>=b) return a ;

else return b ;

}

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

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

gets (text) ;

// вызов функции, параметром которой является адрес строки.

cout << lst( text) ;

// вызов функции, параметром которой является строка заданная явно.

cout << lst( “ fjfhgjkkljll;;;njvh”) ;

int lst ( char *t)

{ for (i=0 ; *(t+i)!=’\0’ ; i++) ; return i ; }

int lst ( char tt[])

{ for (i=0 ; tt[i]!=’\0’ ; i++) ; return i ; }

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

УКАЗАНИЕ ПАРАМЕТРОВ ФУНКЦИИ ПО УМОЛЧАНИЮ.

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

Например:

int fun(int a=10, int b=5)

{ return a+b ; }

main()

{ int x=1 , y=2 ;

cout << fun() ; // распечатается 15

cout << fun(x) ; // распечатается 6

cout << fun(x , y) ; // распечатается 3

}

Примечание: опускать только первый параметр нельзя.

С++ обладает и многими другими интересными возможностями, о которых, по мере необходимости, можно узнать из литературы.

КЛАССЫ.

С++ дает возможность определять новые типы, так что их использование не будет отличаться от использования встроенных (стандартных) типов.

int a=10 , b=20 , c ;

c=a+b ;

cout << c ;

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

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

class cmatr /* заголовок класса

имя класса

дальше в скобках тело класса */

{

определение объектов, необходимых данных;

определение методов, необходимых функций над данными.

}

Начнем заполнение класса, не раскрывая пока его методы.

сlass cmatr { // объекты

float **m ; // адрес матрицы