5. Библиотеки в примерах программ.

6. Программы…

7. Файловая документация и прочая.

 

№2.2

 

Двоичные деревья представляют эффективный способ поиска. Двоичное дерево представляет собой структурированную коллекцию узлов. Коллекция может быть пустой и в этом случае мы имеем пустое двоичное дерево. Если коллекция непуста, то она подразделяется на три раздельных семейства узлов: корневой узел n (или просто корень), двоичное дерево, называемое левым поддеревом для n, и двоичное дерево, называемое правым поддеревом для n. На рис. 1а узел, обозначенный буквой А, является корневым, узел В называется левым потомком А и является корнем левого поддерева А, узел С называется правым потомкомА и является корнем правого поддерева А.

 

struct TREE {
int Info;
TREE *Right;
TREE *Left;
};

 

№3.1.

Литералы

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

Литералы:

- числовые

- символьные

- строковые

Могут быть вещественные с плавающей точкой и целые. Литеральной константе можно дать имя, для этого пишем #define pi 3,14…..

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

Встроенные типы данных.

Тип данных Байты Биты Min Max
signed char 1 8 - 128 127
unsigned char 1 8 0 255
signed short 2 16 -32768 32767
enum 2 16 -32768 32767
unsigned short 2 16 0 65535
signed int 2 16 -32768 32767
unsigned int 2 16 0 65535
signed long 4 32 -2147483648 2147483647
unsigned long 4 32 0 4294967295
Тип данных Байты Биты Min Max
float 4 32 3.4E-38 3.4E+38
double 8 64 1.7E-308 1.7E+308
long double 10 80 3.4E-4932 3.4E+4932

 

№3.2.

 

Включение элементов

template<class T> void SearchTree<T>::insert(T val){ if (root == NULL) { root = new TreeNode<T>(val); return; } else { int result; TreeNode<T> *p, *n = root; while (n) { p = n; result = (*cmp) (val, p->val); if (result < 0) n = p->_lchild; else if (result > 0) n = p->_rchild; else return; } if (result < 0) p->_lchild = new TreeNode<T>(val); else p-> rchild = new TreeNode<T>(val); }}

Удаление элементов

template<class T> void SearchTree<T>::remove(Т val){ _remove(val, root); } template<class T>void SearchTree<T>::_remove(Т val, TreeNode<T> * &n){ if (n == NULL) return; int result = (*cmp) (val, n->val); if (result < 0) _remove(val, n->_lchild); else if (result > 0) _remove (val, n->_rchild); else { // случай 1 if (n->_lchild == NULL) { TreeNode<T> *old = n; n = old->_rchild; delete old; } else if (n->_rchild == NULL { // случай 2 TreeNode<T> *old = n; n = old->_lchild; delete old; } else { // случай 3 TreeNode<T> *m = _findMin(n->_rchild); n->val = m->val; remove(m->val, n->_rchild); } }}

Параметр n (типа ссылки) служит в качестве псевдонима для поля ссылки, которое содержит ссылку вниз на текущий узел. При достижении узла, подлежащего удалению (old), n обозначает поле ссылки (в предке узла old), содержащее ссылку вниз на old. Следовательно команда n=old->_rchild заменяет ссылку на old ссылкой на правого потомка узла old.

Компонентная функция removeMin удаляет из дерева поиска наименьший элемент и возвращает его:

template<class Т> Т SearchTree<T>::removeMin (void){ Т v = findMin(); remove (v); return v;}

Древовидная сортировка — способ сортировки массива элементов — реализуется в виде простой программы, использующей деревья поиска. Идея заключается в занесении всех элементов в дерево поиска и затем в интерактивном удалении наименьшего элемента до тех пор, пока не будут удалены все элементы. Программа heapSort(пирамидальная сортировка) сортирует массив s из n элементов, используя функцию сравнения cmp:

template<class T> void heapSort (T s[], int n, int(*cmp) (T,T) ){ SearchTree<T> t(cmp); for (int i = 0; i < n; i++) t.insert(s[i]); for (i = 0; i < n; i++) s[i) = t.removeMin();}

 

 

№.4.1.

Переменные.

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

Short I;

Char quit = ‘Q’;

Float f1, factor = 30, f2

Таблица 2 - операции

Знак операции Назначение операции
( ) Вызов функции
[ ] Выделение элемента массива
. Выделение элемента записи
-> Выделение элемента записи
! Логическое отрицание
~ Поразрядное отрицание
- Изменение знака
++ Увеличение на единицу
-- Уменьшение на единицу
& Взятие адреса
* Обращение по адресу
(тип) Преобразование типа (т.е. (float) a)
sizeof( ) Определение размера в байтах
* Умножение
/ Деление
% Определение остатка от деления
+ Сложение
- Вычитание
<< Сдвиг влево
>> Сдвиг вправо
< Меньше, чем
<= Меньше или равно
> Больше, чем
>= Больше или равно
= = Равно
!= Не равно
& Поразрядное логическое "И"
^ Поразрядное исключающее "ИЛИ"
| Поразрядное логическое "ИЛИ"
&& Логическое "И"
|| Логическое "ИЛИ"
?: Условная (тернарная) операция
= Присваивание
+=, - =, *=, /=, %=, <<=, >>=, &=, |=, ^= Бинарные операции (например, а *= b (т.е. a = a * b) и т.д.)
, Операция запятая

 

 

№.4.2.

циклы

опера тор - цикла:

while ( выражение ) оператор

do оператор while ( выражение ) ;

for ( выражениенеоб ; выражениенеоб ; выражениенеоб ) оператор

 

for ( выражение1 ; выражение2 ; выражениеЗ ) оператор

выражение! ;

while ( выражение2 ) {

опера тор

выражениеЗ ;

}

 

switch(key)

{

case 'a':

case 'A':

realCount = AddFigures(ppFigArray);

if(!realCount)

printf("No figures were putted for calculation!!!\n");

break;

case 's':

...

№ 5.1.

В соответствии с синтаксисом языка СИ определение функции имеет следующую форму:

[спецификатор-класса-памяти] [спецификатор-типа] имя-функции ([список-формальных-параметров]) { тело-функции }

 

Заголовок функции:

Int main()

 

№.5.2. из последней методы

Cyrcle* CreateCyrcle()

{

intr;

printf("Enter Cyrcle: r = ");

scanf("%d", &r);

if(r < 0)

returnNULL;

Cyrcle* p = (Cyrcle*)malloc(sizeof(Cyrcle));

if(p != NULL)

returnNULL;

printf("Cyrcle was created. \n");

p->kind = 1;

p->Rad = r;

returnp;

}

№6.1. Типизированные константы

Разновидностью переменных являются типизированные константы. Это переменные, значение которых (заданное при инициализации) нельзя изменить. Создание типизированной константы ничем не отличается от инициализации переменной, за исключением того, что перед оператором объявления ставится ключевое слово const:

const тип имя_константы = значение [, ...];

Например:

const double Pi = 3.14159265;

Ранее мы демонстрировали определение символической константы:

#define PI 3.14159265

Область действия переменных и связанные с ней понятия

Теперь, когда мы более-менее разобрались с принципами функциональной организации программы, следует обсудить некоторые весьма важные вопросы относительно переменных.

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

Область действия

Область действия — это та часть программы, где переменная в принципе доступна для программного кйда (что означает это “в принципе”, выяснится чуть позже). По своей области действия переменные делятся на локальные и глобальные.

Локальные переменные объявляются внутри функции и вне ее тела недоступны. Вернитесь к последнему примеру. Там программа состоит из двух функций. В main () объявляются переменные number, s и name (две последних — не простые переменные, а массивы, но это несущественно). В функции Convert объявлены grp1, grp2 и grp3.

Все эти переменные являются локальными. К каждой из них можно обращаться только в пределах объявляющей ее функции. Поэтому, кстати, имена локальных переменных не обязаны быть уникальными. Если две функции описывают переменную с одним и тем же именем, то это две совершенно различные переменные и никакой неоднозначности не возникает. Анализ трафика цифровой телефонной сети Измерения нагрузки Распределения поступления вызовов Системы с потерями