
№1.1.
/* Программа `Привет мир!` */ #include <stdio.h> /* подключение файла библиотеки */ void main(void) /* главная функция */ { /* начало блока */ printf(“Hello world!\n”); /* вывод на экран сообщения */ } /* конец блока */
stdio.h |
библиотека стандартного ввода-вывода, например, для использования функций ввода с клавиатуры и вывода на экран scanf() и printf(), ввода/вывода в файл fprintf()и fscanf() |
conio.h |
библиотека консольного ввода-вывода, например, для функций ввода одиночного символа getch(), конольного ввода/вывода cscanf() и cprintf(), очистки экрана clrscr(), перемещения курсора gotoxy(), изменения цвета символов textcolor() |
math.h |
математическая библиотека, например, для функций sqrt(), sin(), cos(), log(), exp() |
graphics.h |
графическая библиотека, например, для функций инициализации графики initgraph(), рисования графических примитивов line(), rectangle() |
Помимо обычного текста в строке можно указать специальные символы, позволяющие вывести значения переменных, выполнить перевод строки, горизонтальную табуляцию, подать звуковой сигнал и т.д. Специальный символ начинается с символа обратного слеша, например: \n – перевод строки; \t – горизонтальная табуляция (перенос курсора вправо на несколько позиций); \а – подача звукового сигнала.
№1.2.
Контрольные точки
Программа, запущенная под управлением отладчика IDE, исполняется как обычно, т. е. с полной скоростью, пока не будет встречена контрольная точка (breakpoint). Тогда отладчик приостанавливает программу, и вы можете исследовать и изменять содержимое переменных, исполнять операторы в пошаговом режиме и т. д.
Контрольные точки в исходном коде
Это самый распространенный вид контрольных точек. Точка представляет собой маркер, установленный на некоторой строке исходного кода. Когда управление достигает этой строки, программа приостанавливается.
Проще всего установить контрольную точку такого типа прямо в редакторе кода, щелкнув кнопкой мыши на пробельном поле редактора (слева от текста) рядом со строкой, на которой требуется приостановить программу. В пробельном поле появится красный маркер, и сама строка будет выделена красным цветом фона (рис. 5.2). Повторное нажатие кнопки мыши удаляет контрольную точку.
Рис. 5.2 Установка контрольных точек
Если теперь запустить программу кнопкой Run, она будет остановлена на контрольной точке (рис. 5.3).
Рис. 5.3 Остановка программы на контрольной точке
Зеленая пометка на маркере контрольной точки означает, что точка проверена и признана действительной. Могут быть и недействительные контрольные точки — такие, что установлены на строках, не генерирующих исполняемого кода. Это могут быть комментарии, объявления, пустые строки или операторы, исключенные при оптимизации программы.
Текущая точка исполнения показана в пробельном поле зеленой стрелкой. Она указывает строку, которая должна исполняться следующей. Программу можно продолжить кнопкой Run или выполнять ее операторы в пошаговом режиме, о чем будет сказано ниже.
То, что мы сейчас показали — это простые контрольные точки в исходном коде; контрольные точки могут быть также условными, со счетчиком проходов или комбинированного типа.
№2.1
Разработка программ на С++ идет с помощью специальных комплексов программ, называемые системой программирования и позволяет создать программы на определенные реализации или версии того или иного языка программ. Система программирования даже одного производителя имеют разные версии, которые отражают развитие технологии программ и эволюцию среды выполнения программ. Например Visual Studio:
5.0
6.0
2001 net
2003 net
2005 net
2008 net
2010 net
Такое развитие характерихует максимальное использование стандартных средств языка, чтобы снизить затраты на модификацию программ при изменении среды выполнения или переходе на другую версию языка.
Процесс создания программ:
Написание и редактирование исходного кода программы с сохранением в виде исходного файла или модуля.
Компиляция программы. При получении её на определенном языке с сохраниние в виде обьектного файла или модуля.
Построение исполняемого файла или модуля, путем объединения, компоновки, полученного объектного модуля с другими модулями стандартных и специализированных библиотек.
Отладка программы, проводится с помощью специального средства – отладчика, которое помечает обнаруженные ошибки.
Основные компоненты систем программирования являются:
Средства программирования
Редактор связей – компоновщик, линковщик.
Библиотеки заголовочных файлов.
Стандартные и специализированные библиотеки.
Библиотеки в примерах программ.
Программы…
Файловая документация и прочая.
№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.
Все эти переменные являются локальными. К каждой из них можно обращаться только в пределах объявляющей ее функции. Поэтому, кстати, имена локальных переменных не обязаны быть уникальными. Если две функции описывают переменную с одним и тем же именем, то это две совершенно различные переменные и никакой неоднозначности не возникает. Анализ трафика цифровой телефонной сети Измерения нагрузки Распределения поступления вызовов Системы с потерями
П
араметры
в определении функции (формальные
параметры) можно рассматривать как
локальные переменные, инициализируемые
значениями аргументов при ее вызове.
В противоположность локальным глобальные переменные не относятся ни к какой функции и объявляются совершенно независимо. В пределах текущего модуля имя глобальной переменной, естественно, должно быть уникальным. Областью действия глобальных переменных является по умолчанию вся программа.
№ 6.2
floatGetFuguresS(void** ppFigures, intcount)
{
floatS = 0;
for(inti = 0; i < count; i++)
{
void* p = ppFigures[i];
Figures kind = *((Figures*)p);
switch(kind)
{
caseFCyrcle:
S += pow((float)((Cyrcle*)p)->Rad,2)*3.14;
break;
caseFRectangle:
S += ((Rect*)p)->width*((Rect*)p)->len;
break;
caseFTriangle:
{
Triangle* t = (Triangle*)p;
floatpper = (t->side_a+t->side_b+t->side_c)/2;
// ɩɥɨɳɚɞɶ ɬɪɟɭɝɨɥɶɧɢɤɚ
S+= sqrtf(pper*(pper - t->side_a)
*(pper - t->side_b)
*(pper - t->side_c));
break;
}
default:
printf("Error in ɋalculation of Square!!! \n");
return0;
}
}
returnS;
}
№7.1.
Время жизни переменных программы определяется классом памяти. В языке Си принято различать статические (static), автоматические (auto) и динамические данные.
Статические переменные создаются и инициализируются в момент запуска программы в сегменте статических данных и существуют до ее останова, не меняя своего местоположения в памяти ЭВМ.
Все глобальные переменные по умолчанию статические и не могут быть иными, спецификатор static для глобальных переменных используется для ограничения доступа, а не для изменения класса памяти (см. предыдущий раздел).
Локальную переменную функции или блока тоже можно сделать статической, используя ключевое слово static