Разделы презентаций


C

Содержание

Задачи, часть перваяКонсольное приложение “Hello World”Инициализация и работа с переменнойИнициализация и работа с массивомНет повторениям

Слайды и текст этой презентации

Слайд 1C

C

Слайд 2Задачи, часть первая
Консольное приложение “Hello World”
Инициализация и работа с переменной
Инициализация

и работа с массивом
Нет повторениям

Задачи, часть перваяКонсольное приложение “Hello World”Инициализация и работа с переменнойИнициализация и работа с массивомНет повторениям

Слайд 3Языки С
язык Си и объектно-ориентированные языки его группы:
C++, Java и C#
Замена ассемблера,

максимально приближены к архитектуре реальных компьютеров
На С разрабатываются ОС, компиляторы

и прикладные программы. В том числе программы использующие API ОС и ПО для микроконтроллерных систем

Языки Сязык Си и объектно-ориентированные языки его группы: C++, Java и C#Замена ассемблера, максимально приближены к архитектуре реальных компьютеровНа С

Слайд 4Структура Си-программы
В языке Си исходные файлы бывают двух типов:
заголовочные, или h-файлы (содержат

описания)
файлы реализации, или Cи-файлы (Файлы реализации)
Представление исходных текстов в виде заголовочных

файлов и файлов реализации необходимо для создания больших проектов, имеющих модульную структуру. Заголовочные файлы служат для передачи информации между модулями. Файлы реализации - это отдельные модули, которые разрабатываются и транслируются независимо друг от друга и объединяются при создании выполняемой программы
Структура Си-программыВ языке Си исходные файлы бывают двух типов:заголовочные, или h-файлы (содержат описания)файлы реализации, или Cи-файлы (Файлы реализации)Представление исходных текстов

Слайд 5Заголовочный файл подключается с помощью директивы препроцессора #include. Например, описания стандартных функций ввода-вывода

включаются с помощью строки
#include
Имена h-файлов, созданных самим программистом в

рамках разрабатываемого проекта и расположенных в текущем каталоге, указываются в двойных кавычках, например,
#include "abcd.h"
Препроцессор - это программа предварительной обработки текста непосредственно перед трансляцией. Команды препроцессора называются директивами. Директивы препроцессора содержат символ диез # в начале строки. Препроцессор используется в основном для подключения h-файлов. В Си также очень часто используется директива #define для задания символических имен констант.
#define PI 3.14159265
В С++ можно обойтись следующей конструкцией
const double PI = 3.14159265;


Заголовочный файл подключается с помощью директивы препроцессора #include. Например, описания стандартных функций ввода-вывода включаются с помощью строки#include Имена h-файлов, созданных

Слайд 6Функции
Функция является основной структурной единицей языка Си.
В других языках функции иногда

называют подпрограммами. 
Функция - это фрагмент программы, который может вызываться из других

программ. 
Функция обычно выполняет алгоритм, который описывается и реализуется отдельно от других алгоритмов.
При вызове функции передаются аргументы, которые могут быть использованы в теле функции.
В результате своей работы функция возвращает значение некоторого типа.
double sin(double x);

ФункцииФункция является основной структурной единицей языка Си. В других языках функции иногда называют подпрограммами. Функция - это фрагмент программы, который может

Слайд 7Hello World
#include
int main() {         printf("Hello, World\n");         return 0;     }

Hello World#include int main() {         printf(

Слайд 8Типы переменных
Базовые типы
Целые
Вещественные
Логический (добавлен для C++)
Конструкции
Массивы
Указатели
Сложные описания
Строки
Структуры

Типы переменныхБазовые типыЦелыеВещественныеЛогический (добавлен для C++)КонструкцииМассивыУказателиСложные описанияСтрокиСтруктуры

Слайд 9Базовые типы: Целочисленные типы
Целочисленные типы различаются по длине в байтах

и по наличию знака.
Их четыре - char, short, int и long.
С модификаторами unsigned или signed для беззнаковых

(неотрицательных) или знаковых целых чисел.
int maxind = 1000; int a = 5, b = 7;
char c; char eof = (-1); char letterA = 'A';
char c = 0; char d = '0';


Базовые типы: Целочисленные типыЦелочисленные типы различаются по длине в байтах и по наличию знака. Их четыре - char, short, int и long.

Слайд 10Базовые типы: Вещественные типы
Вещественных типов два: длинное вещественное число double (переводится как

"двойная точность"), 8 байт
короткое вещественное число float (переводится как "плавающее"), 4

байта. Не рекомендуется к использованию.
double x, y, z; double a = 1.5, b = 1e+6, c = 1.5e-3;

Базовые типы: Вещественные типыВещественных типов два: длинное вещественное число double (переводится как

Слайд 11Базовые типы: Логический тип
В языке Си специального логического типа нет,

вместо него используются переменные целого типа. Значению "истина" соответствует любое

ненулевое целое число, значению "ложь" - ноль. Например, в Си допустим такой фрагмент программы:
int b; double s; . . . if (b) {     s = 1.0; }

if (b != 0) {     s = 1.0; }
В С++
bool a, b; bool c = false, d = true;


Базовые типы: Логический типВ языке Си специального логического типа нет, вместо него используются переменные целого типа. Значению

Слайд 12Оператор sizeof
Переменная одного и того же типа на разных платформах

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

возможность получить размер элемента данного типа или размер переменной в байтах, для этого служит оператор sizeof. Аргумент sizeof указывается в круглых скобках, он может быть типом или переменной.
int i; char c; short s; long l; double d; float f; bool b;

Оператор sizeofПеременная одного и того же типа на разных платформах может занимать различное число байтов памяти. Язык

Слайд 13void
Слово void означает "пустота". Тип void в Си обозначает отсутствие чего-либо там, где обычно

предполагается описание типа. Например, функция, не возвращающая никакого значения, в

Си описывается как возвращающая значение типа void:
void f(int x);
Другое применение ключевого слова void состоит в описании указателя общего типа, когда заранее не известен тип объекта, на который он будет ссылаться.

voidСлово void означает

Слайд 14Конструирование новых типов
Массивы
Описание массива в Си состоит из имени базового

типа, названия массива и его размера, который указывается в квадратных

скобках. Размер массива обязательно должен быть целочисленной константой или константным выражением:
int a[10]; char c[256]; double d[1000];

Конструирование новых типовМассивыОписание массива в Си состоит из имени базового типа, названия массива и его размера, который

Слайд 15Указатели
Указатели - это переменные, которые хранят адреса объектов. Указатели -

фамильная принадлежность языка Си. В неявном виде указатели присутствовали и

в других языках программирования, но в Си они используются гораздо чаще, а работа с указателями организована максимально «просто».
int *a, *b, c, d; char *e; void *f;
С указателями возможны следующие два действия:
присвоить указателю адрес некоторой переменной. Для этого используется операция взятия адреса, которая обозначается амперсандом  «&»: a = &c; //указателю a присваивает значение адреса переменной c ;
получить объект, адрес которого содержится в указателе; для этого используется операция звездочка  «*», которая записывается перед указателем. (Заметим, что звездочкой обозначается также операция умножения.) Например, строка d = *a; присваивает переменной d значение целочисленной переменной, адрес которой содержится в a. Так как ранее указателю был присвоен адрес переменной c, то в результате переменной d присваивается значение c, т.е. данная строка эквивалентна следующей: d = c;


УказателиУказатели - это переменные, которые хранят адреса объектов. Указатели - фамильная принадлежность языка Си. В неявном виде

Слайд 16Сложные описания
Конструкции массива и указателя при описании типа можно применять

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

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

Слайд 17для группировки можно использовать круглые скобки, например, описание int *(x[10]); означает "массив

из 10 элементов типа указатель на int";
при отсутствии скобок приоритеты конструкций

описания распределены следующим образом:
- операция * определения указателя имеет самый низкий приоритет. Например, описание int *x[10]; означает "массив из 10 элементов типа указатель на int". Здесь к имени переменной x сначала применяется операция определения массива [] (квадратные скобки), поскольку она имеет более высокий приоритет, чем звездочка. Затем к полученному массиву применяется операция определения указателя. В результате получается "массив указателей", а не указатель на массив! Если нам нужно определить указатель на массив, то следует использовать круглые скобки при описании: int (*x)[10]; Здесь к имени x сначала применяется операция * определения указателя;
операции определения массива [] (квадратные скобки после имени) и определения функции (круглые скобки после имени) имеют одинаковый приоритет, более высокий, чем звездочка. Примеры: int f(); Описан прототип функции f без аргументов, возвращающей значение типа int. int (*f())[10]; Описан прототип функции f без аргументов, возвращающей значение типа указатель на массив из 10 элементов типа int ;
последний пример уже не является очевидным. Общий алгоритм разбора сложного описания можно охарактеризовать как чтение изнутри. Сначала находим описываемое имя. Затем определяем, какая операция применяется к имени первой. Если нет круглых скобок для группировки, то это либо определение указателя (звездочка слева от имени), либо определение массива (квадратные скобки справа от имени), либо определение функции (круглые скобки справа от имени). Таким образом получается первый шаг сложного описания. Затем находим следующую операцию описания, которая применяется к уже выделенной части сложного описания, и повторяем это до тех пор, пока не исчерпаем все описание
для группировки можно использовать круглые скобки, например, описание int *(x[10]); означает

Слайд 18Строки
Специального типа данных "строка" в Си нет. Строки представляются массивами символов

(а символы - их числовыми кодами). Последним символом массива, представляющего

строку, должен быть символ с нулевым кодом.
char str[10]; str[0] = 'e'; str[1] = '2'; str[2] = 'e'; str[3] = '4'; str[4] = 0;

char t[] = "abc"; //Здесь мы не указываем в квадратных скобках размер массива t, компилятор его вычисляет сам, 4(!) байта.


СтрокиСпециального типа данных 

Слайд 19Строковые константы заключаются в Си в двойные апострофы, в отличие

от символьных, которые заключаются в одинарные. Значением строковой константы является

адрес ее первого символа. Когда компилятор встречает строковую константу в программе, он записывает ее текст в область статической памяти, обычно защищенную от изменения, и использует этот адрес.
const char *s = "abcd";

Строковые константы заключаются в Си в двойные апострофы, в отличие от символьных, которые заключаются в одинарные. Значением

Слайд 20const
Константы в Си можно задавать двумя способами:
с помощью директивы #define

препроцессора. Например, строка #define MILLENIUM 1000 задает символическое имя MILLENIUM для константы 1000. Препроцессор всюду в

тексте заменяет это имя на константу 1000, используя текстовую подстановку. Это не очень хороший способ, поскольку при таком задании отсутствует контроль типов;
с помощью модификатора const. При описании любой переменной можно добавить модификатор типа const. Например, вместо #define можно использовать следующее описание: const int MILLENIUM = 1000; Модификатор const означает, что переменная MILLENIUM является константой, т.е. менять ее значение нельзя. Попытка присвоить новое значение константе приведет к ошибке компиляции: MILLENIUM = 100; // Ошибка: константу нельзя изменять

constКонстанты в Си можно задавать двумя способами:с помощью директивы #define препроцессора. Например, строка #define MILLENIUM 1000 задает символическое

Слайд 21const char *p;
описан указатель на константную строку (массив символов, менять

который запрещено).
Указатели на константные объекты используются в Си чрезвычайно часто.

Причина состоит в том, что константный указатель позволяет прочесть объект и при этом гарантирует, что объект не будет испорчен в результате ошибки программирования, т.к. константный указатель не дает возможности изменить объект.
Константный указатель ссылается на константный объект, однако, содержимое самого указателя может изменяться.
const char *str = "e2e4"; //Константный указатель
str = "c7c5"; // записываем адрес другой константы


const char *p;описан указатель на константную строку (массив символов, менять который запрещено).Указатели на константные объекты используются в

Слайд 22В Си можно также описать указатель, значение которого не может

быть изменено; для этого модификатор const указывается после звездочки. Например, фрагмент кода
int i; int

* const p = &i;
навечно записывает в указатель p адрес переменной i, перенаправить указатель p на другую переменную уже нельзя. Строка
p = &n; //Ошибка

В Си можно также описать указатель, значение которого не может быть изменено; для этого модификатор const указывается после звездочки. Например,

Слайд 23volatile
Слово volatile в переводе означает "изменчивый, непостоянный". В Си к описанию переменной

следует добавлять слово volatile, если ее значение может изменяться не

в результате выполнения программы, а из-за каких-либо внешних событий. Например, переменная может измениться при выполнении программы-обработчика аппаратного прерывания. Другой причиной "внезапного" изменения значения переменной может быть переключение между нитями при параллельном программировании и модификация переменной в параллельной нити.
Необходимо обязательно сообщать компилятору о таких изменчивых переменных. Дело в том, что процессор выполняет все действия с регистрами, а не с элементами памяти. Оптимизирующий компилятор держит значения большинства переменных в регистрах, сводя к минимуму обращения к памяти. Непостоянная переменная может изменить свое значение в памяти, но программа будет по-прежнему использовать значение в регистре, которое осталось прежним. Из-за этого выполнение программы нарушится.
Модификатор volatile запрещает даже временно помещать переменную в регистр процессора.
volatile int inputPort;


volatileСлово volatile в переводе означает

Слайд 24Оператор typedef
В языке Си можно задать имя типа, если его

описание достаточно громоздко и его не хочется повторять много раз.

В дальнейшем можно использовать имя типа при описании переменных. Для определения типа применяется оператор typedef. Синтаксически оператор typedef аналогичен обычному описанию переменной, к которому в самом начале добавлено слово typedef. При этом вместо переменной определяется имя нового типа. Сравните следующее описание переменной " real " и определение нового типа "Real ":
double real;         // Описание переменной real typedef double Real; // Определение нового типа Real,                          // эквивалентного типу double.
Мы как бы описываем переменную, добавляя к описанию слово typedef. При этом описываемое имя становится именем нового типа. Его можно использовать затем для задания переменных:
Real x, y, z;

Оператор typedefВ языке Си можно задать имя типа, если его описание достаточно громоздко и его не хочется

Слайд 25Выражения
Выражения в Си составляются из переменных или констант, к которым применяются различные операции.

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

таких, как сложение или умножение, в Си существует ряд операций, несколько непривычных для начинающих. Например, запятая и знак равенства (оператор присваивания) являются операциями в Си; помимо операции сложения +, есть еще операция увеличить на += и операция увеличения на единицу ++. Зачастую они позволяют писать эстетически красивые, но не очень понятные для начинающих программы.
Все непривычные операции можно не использовать, заменяя их традиционными.
ВыраженияВыражения в Си составляются из переменных или констант, к которым применяются различные операции. Для указания порядка операций можно использовать круглые

Слайд 26Оператор присваивания
Оператор присваивания является основой любого алгоритмического языка. В Си

он записывается с помощью символа равенства, например, строка
x = 100;
означает

присвоение переменной x значения 100. Для сравнения двух значений используется двойное равенство ==, например, строка
bool f = (2 + 2 == 5);
присваивает логической переменной f значение false (поскольку 2+2 не равно пяти, логическое выражение в скобках ложно).
Непривычным для начинающих может быть то, что оператор присваивания " = " в Си - бинарная операция, такая же, как, например, сложение или умножение. Значением операции присваивания = является значение, которое присваивается переменной, стоящей в левой части. Это позволяет использовать знак присваивания внутри выражения, например,
x = (y = sin(z)) + 1.0;
Здесь в скобках стоит выражение y = sin(z), в результате вычисления которого переменной y присваивается значение sin z. Значением этого выражения является значение, присвоенное переменной y, т.е. sin z. К этому значению затем прибавляется единица, т.е. в результате переменной x присваивается значение sin (z)+1.
Выражения, подобные приведенному в этом примере, иногда используются, когда необходимо запомнить значение подвыражения (в данном случае sin (z) ) в некоторой переменной (в данном случае y ), чтобы затем не вычислять его повторно. Еще один пример:
n = (k = 3) + 2;
В результате переменной k присваивается значение 3, а переменной n - значение 5. Конечно, в нормальных программах такие выражения не встречаются.

Оператор присваиванияОператор присваивания является основой любого алгоритмического языка. В Си он записывается с помощью символа равенства, например,

Слайд 27Арифметические операции
К четырем обычным арифметическим операциям сложения +, вычитания -, умножения * и деления / в

Си добавлена операция нахождения остатка от деления первого целого числа

на второе, которая обозначается символом процента %. Приоритет у операции вычисления остатка % такой же, как и у деления или умножения. Отметим, что операция % перестановочна с операцией изменения знака (унарным минусом), например, в результате выполнения двух строк
x = -(5 % 3); y = (-5) % 3;
обеим переменным x и y присваивается отрицательное значение -2.

Арифметические операцииК четырем обычным арифметическим операциям сложения +, вычитания -, умножения * и деления / в Си добавлена операция нахождения остатка от деления

Слайд 28Операции увеличения и уменьшения
В Си добавлены операции увеличения и уменьшения

на единицу, которые, к примеру, очень удобно применять к счетчикам.

Операция увеличения записывается с помощью двух знаков сложения ++, операция уменьшения - с помощью двух минусов --. Например, операция ++, примененная к целочисленной переменной i, увеличивает ее значение на единицу:
++i;   эквивалентно i = i+1
Операции увеличения и уменьшения на единицу можно применять только к дискретным типам - целочисленным переменным различного вида и указателям. Операцию нельзя применять к вещественным переменным! Например, следующий фрагмент программы является ошибочным:
double x; . . . ++x;  // Ошибка! Операция ++ неприменима к вещ. Переменной

Операции увеличения и уменьшенияВ Си добавлены операции увеличения и уменьшения на единицу, которые, к примеру, очень удобно

Слайд 29Для указателей операция ++ увеличивает значение переменной на размер одного элемента того типа, на который ссылается

указатель
double a[100]; double *p = &(a[15]); // в p записывается адрес                      

// элемента массива a[15] ++p; // в p будет адрес элемента a[16]      // (адрес увеличивается на sizeof(double) == 8)
Операции увеличения ++ и уменьшения -- на единицу имеют префиксную и суффиксную формы. В префиксной форме операция записывается перед переменной, как в приведенных выше примерах. В суффиксной форме операция записывается после переменной:
++x;    // Префиксная форма x--;    // Суффиксная форма
Разница между префиксной и суффиксной формами проявляется только при вычислении сложных выражений. Если используетсяпрефиксная форма операции ++, то сначала переменная увеличивается, и только после этого ее новое значение используется в выражении. При использовании суффиксной формы значение переменной сначала используется в выражении и только затем увеличивается.
Для указателей операция ++ увеличивает значение переменной на размер одного элемента того типа, на который ссылается указательdouble a[100]; double *p = &(a[15]); //

Слайд 30Операции "увеличить на", "домножить на" и т.п.
double a[100]; double s; int i; .

. . s = 0.0; i = 0; while (i < 100) {    

s = s + a[i];     ++i; }
Здесь сумма элементов массива накапливается в переменной s. В строке
s = s + a[i];
к сумме s прибавляется очередной элемент массива a[i], т.е. значение s увеличивается на a[i]. В Си существует сокращенная запись операции увеличения:
s += a[i];
Оператор += читается как "увеличить на". Строка
x += y;    // Увеличить значение x на y
эквивалентна в Си строке
x = x + y; // x присвоить значение x + y,

Операции

Слайд 31Логические операции
|| логическое "или" (логическое сложение) && логическое "и" (логическое умножение)

! логическое "не" (логическое отрицание)
Логические константы "истина" и "ложь" обозначаются

через true и false (это ключевые слова языка). Примеры логических выражений:
bool a, b, c, d; int x, y;
a = b || c;            // логическое "или" d = b && c;            // логическое "и" a = !b;                // логическое "не" a = (x == y);          // сравнение в правой части a = false;             // ложь b = true;              // истина c = (x > 0 && y != 1); // c истинно, когда                            // оба сравнения истинны


Слайд 32Самый высокий приоритет у операции логического отрицания, затем следует логическое

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

логического сложения и умножения является так называемое "сокращенное вычисление" результата. А именно, при вычислении результата операции логического сложения или умножения всегда сначала вычисляется значение первого аргумента. Если оно истинно в случае логического сложения или ложно в случае логического умножения, то второйаргумент операции не вычисляется вовсе!
Самый высокий приоритет у операции логического отрицания, затем следует логическое умножение, самый низкий приоритет у логического сложения.Чрезвычайно

Слайд 33Операции сравнения
Операция сравнения сравнивает два выражения. В результате вырабатывается логическое

значение - true или false (истина или ложь) в зависимости от значений выражений. Примеры:
bool

res; int x, y; res = (x == y); // true, если x равно y, иначе false res = (x == x); // всегда true res = (2 < 1);  // всегда false
Операции сравнения в Си обозначаются следующим образом:
== равно,  != не равно, > больше,  >= больше или равно, < меньше,  <= меньше или равно.

Операции сравненияОперация сравнения сравнивает два выражения. В результате вырабатывается логическое значение - true или false (истина или ложь) в зависимости от

Слайд 34Побитовые логические операции
& побитовое логическое умножение ("и") | побитовое логическое сложение

("или") ~ побитовое логическое отрицание ("не") ^ побитовое сложение по модулю 2

(исключающее "или")
Операции сдвига
int x, y; . . . x = (y >> 3);   // Сдвиг на 3 позиции вправо y = (y << 2);   // Сдвиг на 2 позиции влево
При сдвиге влево на k позиций младшие k разрядов результата устанавливаются в ноль. Сдвиг влево на k позиций эквивалентен умножению на число 2k. Сдвиг вправо более сложен, он по-разному определяется для беззнаковых и знаковых чисел. При сдвиге вправо беззнакового числа на k позиций освободившиеся k старших разрядов устанавливаются в ноль. Сдвиг вправо на k позиций соответствует целочисленному делению на число 2k

Слайд 35Арифметика указателей
С указателями можно выполнять следующие операции:
сложение указателя и целого

числа, результат - указатель;
увеличение или уменьшение переменной типа указатель, что

эквивалентно прибавлению или вычитанию единицы;
вычитание двух указателей, результат - целое число.
Прибавление к указателю p целого числа n означает увеличение адреса, который содержится в переменной p, на суммарный размер n элементов того типа, на который ссылается указатель. Указатель как бы сдвигается на n элементов вправо, если считать, что индексы элементов массива возрастают слева направо. Аналогично вычитание целого числа n из указателя означает сдвиг указателя влево на n элементов
Арифметика указателей С указателями можно выполнять следующие операции:сложение указателя и целого числа, результат - указатель;увеличение или уменьшение

Слайд 36Связь между указателями и массивами
В языке Си имя массива a

является указателем на его первый элемент, т.е. выражения a и &(a[0]) эквивалентны. Учитывая арифметику

указателей, получаем эквивалентность следующих выражений:
a[i]  ~  *(a+i)
Действительно, при прибавлении к a целого числа i происходит сдвиг на i элементов вправо. Поскольку имя массива является адресом его начального элемента, получается адрес i -го элемента массива a. Применяя операцию звездочка *, получаем сам элемент a[i]. Точно так же эквивалентны выражения
&(a[i])  ~  a+i    (адрес эл-та a[i]).

Связь между указателями и массивамиВ языке Си имя массива a является указателем на его первый элемент, т.е.

Слайд 37Операция приведения типа
Операция приведения типа используется, когда значение одного типа

преобразуется к другому типу, в том случае, если существует некоторый

разумный способ такого преобразования. Операция обозначается именем типа, заключенным в круглые скобки; она записывается перед ее единственным аргументом. Рассмотрим два примера. Пусть требуется преобразовать целое число к вещественному типу. Как известно, целые и вещественные числа по-разному представляются в компьютере, см. раздел 3.3.1. Тем не менее, существует однозначный способ преобразования целого числа типа int к вещественному типу double. В первом примере значение целой переменной n приводится к вещественному типу и присваивается вещественной переменной x:
double x; int n; . . . x = (double) n; // Операция приведения к типу double


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

Слайд 38Управляющие конструкции
Управляющие конструкции позволяют организовывать циклы и ветвления в программах. В Си всего

несколько конструкций, причем половину из них можно не использовать (они

реализуются через остальные).
Фигурные скобки
Оператор if
Выбор из нескольких возможностей: if...else if...
Цикл while
Выход из цикла break, переход на конец цикла continue
Оператор перехода на метку goto
Цикл for
Операция "запятая" и цикл for
Цикл do...while
Оператор switch (вычисляемый goto)







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

Слайд 39Представление программы в виде функций
Перед использованием или реализацией функции необходимо

описать ее прототип. Прототип функции сообщает информацию об имени функции, типе

возвращаемого значения, количестве и типах ее аргументов.
int gcd(int x, int y);
Описан прототип функции gcd, возвращающей целое значение, с двумя целыми аргументами. Имена аргументов x и y здесь являются лишь комментариями, не несущими никакой информации для компилятора. Их можно опускать, например, описание
int gcd(int, int);

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

Слайд 40Передача параметров функциям
В языке Си функциям передаются значения фактических параметров. При вызове

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

формальных параметров в теле функции не приводит к изменению переменных вызывающей программы, передаваемых функции при ее вызове, - ведь функция работает не с самими этими переменными, а с копиями их значений! Рассмотрим, например, следующий фрагмент программы:
void f(int x);  // Описание прототипа функции
int main() {     . . .     int x = 5;     f(x);     // Значение x по-прежнему равно 5     . . . }
void f(int x) {     . . .     x = 0;  // Изменение формального параметра     . . .   // не приводит к изменению фактического             // параметра в вызывающей программе }

Передача параметров функциямВ языке Си функциям передаются значения фактических параметров. При вызове функции значения параметров копируются в аппаратный стек. Следует четко

Слайд 41Работа с памятью
В традиционных языках программирования, таких как Си, Фортран, Паскаль, существуют

три вида памяти: статическая, стековая идинамическая. Конечно, с физической точки

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

Слайд 42Статическая память
Статическая память выделяется еще до начала работы программы, на стадии

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

запуска программы и не изменяющийся в процессе ее работы. Статические переменные создаются и инициализируются до входа в функцию main, с которой начинается выполнение программы.
Существует два типа статических переменных:
глобальные переменные - это переменные, определенные вне функций, в описании которых отсутствует слово static. Обычно описания глобальных переменных, включающие слово extern, выносятся в заголовочные файлы (h-файлы). Слово extern означает, что переменная описывается, но не создается в данной точке программы. Определения глобальных переменных, т.е. описания без слова extern, помещаются в файлы реализации (c-файлы или cpp-файлы).
статические переменные - это переменные, в описании которых присутствует слово static. Как правило, статические переменные описываются вне функций. Такие статические переменные во всем подобны глобальным, с одним исключением: область видимости статической переменной ограничена одним файлом, внутри которого она определена, - и, более того, ее можно использовать только после ее описания, т.е. ниже по тексту. По этой причине описания статических переменных обычно выносятся в начало файла. В отличие от глобальных переменных, статические переменные никогда не описываются в h-файлах (модификаторы extern и static конфликтуют между собой). Совет: используйте статические переменные, если нужно, чтобы они были доступны только для функций, описанных внутри одного и того же файла. По возможности не применяйте в таких ситуациях глобальные переменные, это позволит избежать конфликтов имен при реализации больших проектов, состоящих из сотен файлов.
Слово static может присутствовать и в заголовке функции. При этом оно используется только для того, чтобы ограничить область видимости имени функции рамками одного файла. Пример: static int gcd(int x, int y);  // Прототип ф-ции . . . static int gcd(int x, int y) { // Реализация     . . . } Совет: используйте модификатор static в заголовке функции, если известно, что функция будет вызываться лишь внутри одного файла. Слово static должно присутствовать как в описании прототипа функции, так и в заголовке функции при ее реализации
Статическая память Статическая память выделяется еще до начала работы программы, на стадии компиляции и сборки. Статические переменные имеют

Слайд 43Стековая, или локальная, память
Локальные, или стековые, переменные - это переменные,

описанные внутри функции. Память для таких переменных выделяется в аппаратном стеке.

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

Стековая, или локальная, памятьЛокальные, или стековые, переменные - это переменные, описанные внутри функции. Память для таких переменных выделяется

Слайд 44Динамическая память, или куча
Помимо статической и стековой памяти, существует еще

практически неограниченный ресурс памяти, которая называетсядинамическая, или куча ( heap ). Программа может захватывать

участки динамической памяти нужного размера. После использования ранее захваченный участок динамической памяти следует освободить.
В языке Си для захвата и освобождения динамической памяти применяются стандартные функции malloc и free, описания их прототипов содержатся в стандартном заголовочном файле "stdlib.h". (Имя malloc является сокращением от memory allocate- "захват памяти".) Прототипы этих функций выглядят следующим образом:
void *malloc(size_t n); // Захватить участок памяти                         // размером в n байт void free(void *p); // Освободить участок                     // памяти с адресом p

Динамическая память, или кучаПомимо статической и стековой памяти, существует еще практически неограниченный ресурс памяти, которая называетсядинамическая, или куча ( heap ).

Слайд 45Операторы new и delete языка C++
В языке C++ для захвата и освобождения

динамической памяти используются операторы new и delete. Они являются частью языка C++, в отличие

от функций malloc и free, входящих в библиотеку стандартных функций Си.
Пусть T - некоторый тип языка Си или C++, p - указатель на объект типа T. Тогда для захвата памяти размером в один элемент типа T используется оператор new:
T *p; p = new T;
Например, для захвата восьми байтов под вещественное число типа double используется фрагмент
double *p; p = new double;
При использовании new, в отличие от malloc, не нужно приводить указатель от типа void* к нужному типу: оператор newвозвращает указатель на тип, записанный после слова new.

Операторы new и delete языка C++В языке C++ для захвата и освобождения динамической памяти используются операторы new и delete. Они являются частью

Слайд 46С помощью оператора new можно захватывать память под массив элементов заданного типа. Для этого

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

любым целочисленным выражением. Например, в следующем фрагменте в динамической памяти захватывается область для хранения вещественной матрицы размера m*n:
double *a; int m = 100, n = 101; a = new double[m * n];
Такую форму оператора new иногда называют векторной
Если память под массив была захвачена с помощью векторной формы оператора new, то для ее освобождения следует использоватьвекторную форму оператора delete, в которой после слова delete записываются пустые квадратные скобки:
double *a = new double[100]; // Захватываем массив . . . delete[] a; // Освобождаем массив

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

Слайд 47Структуры
Структура — это конструкция, которая позволяет объединить несколько переменных с

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

новые типы данных языка Си. В других языках программирования структуры называют записями или кортежами.
Описание структуры выглядит следующим образом:
struct R3Vector {     double x;     double y;     double z; };

СтруктурыСтруктура — это конструкция, которая позволяет объединить несколько переменных с разными типами и именами в один составнойобъект.

Слайд 48struct R3Vector u, v; . . . u = v;  // Копируем

вектор как единое целое
В этом примере вектор v копируется в вектор u ; копирование структур сводится к переписыванию

области памяти. Сравнивать структуры нельзя:
struct R3Vector u, v; . . . if (u == v) { // Ошибка! Сравнивать структуры нельзя     . . . }
Имеется также возможность работать с полями структуры. Для этого используется операция точка " .": пусть s — объект типа структура, f — имя поля структуры. Тогда выражение
s.f //является полем f структуры s, с ним можно работать как с обычной переменной

struct R3Vector u, v; . . . u = v;  // Копируем вектор как единое целоеВ этом

Слайд 49Структуры и указатели
struct S { . . . }; //

Определение структуры S struct S *p; // Описание указателя на структуру

S
Указатели на структуры используются довольно часто. Указатель на структуру S описывается обычным образом, в качестве имени типа фигурирует struct S*
Списки и последовательности – частое применение структур
struct TreeNode {   // Вершина дерева     struct TreeNode *parent; // Указатель на отца,     struct TreeNode *left;   //   на левого сына,     struct TreeNode *right;  //   на правого сына     void *value;             // Значение в вершине };


Структуры и указателиstruct S { . . . }; // Определение структуры S struct S *p; //

Слайд 50Для доступа к полям структуры через указатель на структуру служит

операция стрелочка, которая обозначается двумя символами ->(минус и знак больше), их

нужно рассматривать как одну неразрывную лексему (т.е. единый знак, единое слово). Пусть S — имя структуры, f — некоторое поле структуры S, p — указатель на структуру S. Тогда выражение
p->f
обозначает поле f структуры S (само поле, а не указатель не него!). Это выражение можно записать, используя операцию звездочка (доступ к объекту через указатель),
p->f    ~    (*p).f
но, конечно, первый способ гораздо нагляднее. (Во втором случае круглые скобки вокруг выражения *p обязательны, поскольку приоритет операции точка выше, чем операции звездочка.)

Для доступа к полям структуры через указатель на структуру служит операция стрелочка, которая обозначается двумя символами ->(минус и

Слайд 51Структуры и оператор определения типа typedef
Возможно анонимное определение структуры, когда имя

структуры после ключевого слова struct опускается; в этом случае список описываемых переменных

должен быть непустым (иначе такое описание совершенно бессмысленно).
struct { double x; double y; } t, *p;
чаще анонимное определение структуры комбинируют с оператором определения имени типа typedef
typedef struct {     double x;     double y; } R2Point, *R2PointPtr;
Такая технология довольно популярна среди программистов и применяется в большинстве системных h-файлов. Преимущество ее состоит в том, что в дальшейшем при описании переменных структурного типа не нужно использовать ключевое слово struct, например,
R2Point a, b, c;    // Описываем три точки a, b, c R2PointPtr p;       // Описываем указатель на точку R2Point *q;         // Эквивалентно R2PointPtr q;
Структуры и оператор определения типа typedefВозможно анонимное определение структуры, когда имя структуры после ключевого слова struct опускается; в этом случае

Слайд 52Терминология объектно-ориентированного программирования
Объектно-ориентированное программирование позволяет оперировать в терминах классов: определять

классы, конструировать производные классы, создавать объекты, принадлежащие классу, - экземпляры

класса.
Сначала в некоторых языках программирования появился тип struct, расширением которого стал тип class.
Класс определяет данные (переменные) и поведение (методы). Данные и методы класса также называют членами класса. Класс рассматривается как определяемый пользователем тип данных.
Объектом называется экземпляр некоторого класса. Объект создается как переменная типа класса, которая используется для доступа к данным - членам класса и для вызова методов - членов класса.

Терминология объектно-ориентированного программированияОбъектно-ориентированное программирование позволяет оперировать в терминах классов: определять классы, конструировать производные классы, создавать объекты, принадлежащие

Слайд 53Наследованием называется механизм, позволяющий производному классу наследовать структуру данных и

поведение другого класса, а также наследовать поведение, объявленное в интерфейсах

и абстрактных классах.
Наследование позволяет определять новые классы в терминах существующих классов.
В объектно-ориентированном программировании наследование может быть:
множественным, позволяющим производному классу наследоваться одновременно от нескольких классов (например, так реализован механизм наследования в С++);
простым, когда производный класс имеет только один наследуемый класс (например, так реализованы языки Java и Object Pascal).
Наследуемый класс принято называть базовым классом, или родительским классом (классом - предком, суперклассом).

Наследованием называется механизм, позволяющий производному классу наследовать структуру данных и поведение другого класса, а также наследовать поведение,

Слайд 54Производный класс, наследующий структуру данных и поведение своего базового класса,

иногда также называется дочерним классом (классом - потомком, подклассом).
В производном

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


Производный класс, наследующий структуру данных и поведение своего базового класса, иногда также называется дочерним классом (классом -

Слайд 55Полиморфизмом называется способность различных объектов по-разному обрабатывать одинаковые сообщения.
Инкапсуляция позволяет

работать в терминах объектов и скрывать их переменные и методы.

Использование инкапсуляции дает возможность модифицировать внутреннюю реализацию объекта без влияния на программу в целом до тех пор, пока не изменяется интерфейс с объектом.
В языках программирования инкапсуляция поддерживается реализацией модификаторов доступа, таких как protected - для защищенных членов класса на уровне класса, и private - для полностью защищенных членов класса.

Полиморфизмом называется способность различных объектов по-разному обрабатывать одинаковые сообщения.Инкапсуляция позволяет работать в терминах объектов и скрывать их

Слайд 56Объявление и реализация класса в языке С++
Создаваемый класс должен быть

объявлен и реализован.
Объявление класса в языке С++ может иметь следующее

формальное описание:
class имя_класса : список_базовых_классов
{
// Модификатор доступа относится ко всем перечисленным
// после него членам до следующего модификатора доступа
public: // Объявление общедоступных членов класса
protected: // Объявление членов класса, доступных только для производных
// классов
private: // Объявление защищенных членов класса
};
Объявление и реализация класса в языке С++Создаваемый класс должен быть объявлен и реализован.Объявление класса в языке С++

Слайд 57Список базовых классов указывается после имени класса через символ двоеточия

( :), разделяется запятыми и может иметь модификаторы доступа.
class MyClass

: public ClassA, public ClassB, private ClassC {};
В языке С++ считается, что если модификатор доступа для класса или члена класса не указан, то по умолчанию предполагается модификатор доступа private (защищенный доступ). Для членов структур, объявляемых ключевым словом struct, по умолчанию модификатор доступа предполагается равным public.
Список базовых классов указывается после имени класса через символ двоеточия ( :), разделяется запятыми и может иметь

Слайд 58Модификатор доступа базового класса позволяет определить, какие переменные и методы

базового класса будут доступны из производного класса. Модификатор доступа, указываемый

перед именем базового класса, определяет следующие правила доступа к переменным и методам базового класса из производного класса:
public - в производном классе доступны все переменные и методы базового класса с модификаторами доступа public и protected, и эти члены класса имеют те же права доступа;
protected - члены базового класса с модификаторами доступа public и protected доступны как protected, а с модификатором доступа private - недоступны.
private - члены базового класса с модификаторами доступа public и protected доступны как private, а с модификатором доступа private - недоступны.

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

Слайд 59В теле объявления класса указываются модификаторы доступа, описывающие права доступа

для переменных и методов класса:
модификатор доступа относится ко всем перечисленным

после него членам до следующего модификатора доступа;
один и тот же модификатор доступа может указываться несколько раз;
после модификатора доступа ставится символ двоеточие;
если модификатор доступа не указан, то по умолчанию предполагается private.
Для доступа к членам класса используется операция принадлежности ::, указываемая после идентификатора класса. Для доступа к членам экземпляра класса используются операции . и ->.
Для доступа к объекту самого класса внутри метода члена класса используется ключевое слово this.

В теле объявления класса указываются модификаторы доступа, описывающие права доступа для переменных и методов класса:модификатор доступа относится

Слайд 60class A
{
public:
int i;
Func1();
}
A::Func1() { return

this->i; } // this - указатель класса A

class A { public: int i; Func1();} A::Func1() { return this->i; } // this - указатель класса

Слайд 61Конструкторы класса
Конструктором называется метод, вызываемый при создании объекта данного класса.

Класс может иметь несколько конструкторов, отличающихся списком параметров.
Деструктором называется метод,

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

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

Слайд 62Создание объекта
Для создания объекта (экземпляра данного класса) следует объявить переменную

типа указатель на класс, а затем создать объект, выполнив оператор

new с указанием используемого конструктора.
A* ca;
ca= new A();
Эти же действия можно записать одним оператором.
A* ca= new A();
Для того чтобы можно было использовать конструктор с параметрами, значения параметров необходимо указать при создании объекта.



Создание объектаДля создания объекта (экземпляра данного класса) следует объявить переменную типа указатель на класс, а затем создать

Слайд 63Вложенные классы
Язык С++ допускает использование вложенных классов - внутри тела

одного класса содержится объявление других классов.
class A
{
public:
A(void);


~A(void);
class B { // Вложенный класс
B(void) {};
~B(void) {};
char sStr2[3];
};
};

Вложенные классыЯзык С++ допускает использование вложенных классов - внутри тела одного класса содержится объявление других классов.class A

Слайд 64Объектные типы
Тип данных всегда определяет размер памяти, которая будет выделена

под переменную данного типа при ее создании.
При объявлении переменной объектного

типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.
Переменная, объявленная как указатель на класс, применяется для доступа к методам и переменным членам класса.

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

Слайд 65Преобразование объектных типов
Указатель на класс может быть преобразован к указателю

на базовый класс в двух случаях:
если базовый класс является доступным

и преобразование однозначно;
если указано явное преобразование типа указателя.
Указатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.
Квалификация имен
Квалификация имен используется для однозначного понимания указываемого имени.
Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).

Преобразование объектных типовУказатель на класс может быть преобразован к указателю на базовый класс в двух случаях:если базовый

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика