40гг первые цифровые компьютеры программирование путем коммутации проводов
Вид материала | Документы |
СодержаниеКласс памяти Бинарные операции Присваивание адреса в явном виде Связь массивов и указателей Динамические массивы |
- Рабочая программа учебной дисциплины «Системы коммутации» Направление подготовки, 204.68kb.
- Неоднородный полупроводниковый носитель информации в переменном магнитном поле, 107.68kb.
- Темы Лекции Практика, 13.65kb.
- Общие принципы построения вычислительных сетей, 1480.56kb.
- Курс лекций "интернет технологии", 1261.62kb.
- А) Представление информации в цифровых автоматах (ЦА), 34.28kb.
- Информатика. Лекции. Краткая история компьютерной техники Первые компьютеры: Z3, Colossus,, 3630.67kb.
- Курс лекций для студентов очного и заочного отделений по специальности 210406 «Сети, 3045.9kb.
- Радумльская средняя школа, 28.4kb.
- Лекция №7. Обобщенная задача коммутации Важной задачей построения сетей ЭВМ является, 67.2kb.
тип_возвращаемого_значения имя ([параметры ])
{
операторы, составляющие тело функции
}
- Если функция не должна возвращать значение, указывается тип void.
- Тело функции заключается в фигурные
скобки;
- Функции не могут быть вложенными;
Описание переменной
[класс памяти] [const] тип имя [инициализатор];
- Необязательный класс памяти может принимать одно из значений auto, extern, static и register.
- Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто константой.
- При описании можно присвоить переменной начальное значение, это называется инициализацией. Инициализатор можно записывать в двух формах
- со знаком равенства: = значение
- в круглых скобках: ( значение )
- Константа должна быть инициализирована при объявлении.
- В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми.
Примеры описания переменных
short int а = 1:
const char С = ‘С’;
char s, sf = 'f’;
char t (54);
float с = 0.22, x(3), sum;
Область действия идентификатора
- Другое название – область видимость переменной
- Область действия идентификатора - это часть программы, в которой его можно использовать для доступа к связанной с ним области памяти.
- Если переменная определена внутри блока она называется локальной, область ее действия — от точки описания до конца блока, включая все вложенные блоки.
- Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.
Класс памяти
- auto — автоматическая переменная. Память под нее выделяется при необходимости и инициализируется каждый раз при выполнении оператора, содержащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни — с момента описания до конца блока.
- extern — означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту).
- static — статическая переменная. Время жизни — постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной.
- register — аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto.
Этапы создания исполняемой программы
![](images/15522-nomer-218bd1f8.png)
С++. Базовые средства описания действий
Основные вопросы
- Операции
- Выражения
- Операторы ветвления
- Операторы цикла
- Операторы передачи управления
Унарные операции
++ -- sizeof ~ ! - & * new delete (type) | увеличение на 1 уменьшение на 1 размер a=sizeof(float) à a=4; поразрядное отрицание логическое отрицание арифметическое отрицание (унарный минус) получение адреса разыменование указателя выделение памяти освобождение памяти преобразование типа |
Бинарные операции
* / %
+ -
<< >>
< > <= >=
= = !=
& |
&& ||
=
*= /=
%=
+= -=
<<= >>=
&= |=
=
Тернарная операция
- ? :
- a=(b>c)?b:c
#include
int main(){
int a = 11, b = 4, max;
max = (b > a)? b : a;
printf("Наибольшее число: %i", max);
return 0;
}
Выражения
- Выражения состоят из операндов, знаков операций и скобок и используются для вычисления некоторого значения определенного типа
- Каждый операнд является:
- выражением
- константой
- переменной.
Примеры выражений
- (а + 0.12)/6
- х && у || !z
- (t * sin(x)-1.05e4)/((2 * k + 2) * (2 * k + 3))
Приоритеты операций
- Операции выполняются в соответствии с приоритетами.
- Для изменения порядка выполнения операций используются круглые скобки.
- Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо.
- Например:
- а = b = с означает а = (b=с),
- а + b + с означает (а + Ь) + с.
- Порядок вычисления подвыражений внутри выражений не определен.
- Например, нельзя считать, что в выражении (sin(x + 2) + cos(у + 1)) обращение к синусу будет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем y+1.
Операторы ветвления
- Оператор if
- Оператор switch
Условный оператор if
- Условный оператор if используется для разветвления процесса вычислений на два направления.
- Формат оператора:
- if ( выражение ) оператор_1; [else оператор_2;]
- Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя.
- Если оно не равно нулю (имеет значение true), выполняется первый оператор, иначе — второй.
- После этого управление передается на оператор, следующий за условным.
Примеры условного оператора (1)
if(a<0)
b = 1;
if(ad || a==0))
b++;
else
{
b*=a;
a = 0;
}
Примеры условного оператора (2)
if(a
{
if(a
m = a;
else
m = c;
}
else
{
if(b
m = b;
else
m = c;
}
Оператор switch
- Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений.
- Формат оператора:
switch(выражение){
case константное_выражение_1: [список_операторов_1]
case константное_выражение_2: [список_операторов_2]
…
case константное_выражение_п: [список_операторов_п]
[default: операторы ]
}
Пример использования switch
#include
int a,b,res;
char op;
cout « "\пВведите 1й операнд : ”; cin » a;
cout « "\пВведите знак операции : ”; cin » op;
cout « "Введите 2й операнд : “ cin » b;
bool f = true;
switch (op){
case ‘+’ : res = a+b; break;
case ‘-’ : res = a-b; break;
case ‘/’ : res = a/b; break;
case ‘*’ : res = a*b; break;
default: cout « “Неизвестная операция"; f=false;
}
if (f) cout « “Результат : “ << res;
return 0;
}
Операторы цикла
- Цикл с предусловием (while)
- Цикл с постусловием (do while)
- Цикл с параметром (for)
Цикл с предусловием (while)
- Цикл с предусловием имеет вид:
- while ( выражение ) оператор;
- Выражение определяет условие повторения тела цикла, представленного простым или составным оператором.
- Выполнение оператора начинается с вычисления выражения.
- Если оно истинно (не равно false), выполняется оператор цикла.
- Если при первой проверке выражение равно false, цикл не выполнится ни разу.
- Выражение вычисляется перед каждой итерацией цикла.
Пример цикла while
#include
int main(){
int num;
cout « "Введите число : ";
cin » num;
int half = num / 2; // половина числа
int div = 2; // кандидат на делитель
while (div <= half){
if(!(num % div))
cout « div <<"\n”;
div++;
}
return 0;
}
Цикл с постусловием (do while)
- Цикл с постусловием имеет вид:
- do оператор while (выражение);
- Сначала выполняется простой или составной оператор, составляющий тело цикла.
- Вычисляется выражение.
- Если оно истинно (не равно f al se), тело цикла выполняется еще раз.
- Цикл завершается, когда выражение станет равным false.
Пример использования
do … while
#include
int main(){
char answer;
do{
cout « "\пКупи слоника! ";
cin » answer;
}while (answer != 'y');
return 0;
}
Цикл с параметром (for)
- Цикл с параметром имеет следующий формат:
- for (инициализация; выражение; модификации) оператор;
- Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. Инициализация выполняется один раз в начале исполнения цикла.
- Выражение определяет условие выполнения цикла: если его результат равен true, цикл выполняется. Цикл с параметром реализован как цикл с предусловием.
- Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла.
- Простой или составной оператор представляет собой тело цикла.
- Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).
Пример цикла for
#include
int main(){
int num;
cout « "Введите число : ": cin » num:
for (int half=num/2,div=2;div<=half;div++)
if (!(num % div))
cout« div <<"\n“;
return 0;
}
Операторы передачи управления
- оператор безусловного перехода goto;
- оператор выхода из цикла break;
- оператор перехода к следующей итерации цикла continue;
- оператор возврата из функции return.
Оператор goto
- Оператор безусловного перехода goto имеет формат:
- goto метка;
- В теле той же функции должна присутствовать ровно одна конструкция вида:
- метка: оператор;
- Оператор goto передает управление на помеченный оператор.
- Метка — это обычный идентификатор, областью видимости которого является функция, в теле которой он задан.
Оператор break
- Оператор break используется внутри операторов цикла или switch для обеспечения перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находится break.
Пример использования
break
#include
int main(){
char answer;
while(true){
cout « "\пКупи слоника! ";
cin » answer;
if(answer == ‘y’)
break;
}
return 0;
}
Оператор continue
- Оператор перехода к следующей итерации цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.
Пример использования
continue
#include
int main(){
int num;
cout « "Введите число : ": cin » num:
for (int i=0;i<=num;i++){
if(i%2)
continue;
cout« i <<"\n“;
}
return 0;
}
Оператор return
- Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Вид оператора:
- return [ выражение ];
- Если тип возвращаемого функцией значения описан как void выражение должно отсутствовать.
Пример оператора return
int max(int a, int b){
if(a>b)
return a;
else
return b;
}
С++. Указатели и массивы
Основные вопросы
- Понятие указателя
- Инициализация указателей
- Операции с указателями
- Ссылки
- Массивы
- Строки
Имя и адрес переменной
Запись в программе:
int i = 10;
Понятие указателя
- Указатель – тип данных, предназначенный для хранения адресов областей памяти.
- Виды указателей (различаются свойствами и набором допустимых операций)
Указатель на объект данных
Указатель на функцию
Указатель на область памяти (void)
- Переменные – указатели подчиняются общим правилам области видимости и времени жизни переменных
Указатель на объект данных
- Содержит адрес области памяти, в которой содержаться данные определенного типа.
- Объявление указателя: тип *имя;
- К моменту описания указателя тип должен быть объявлен, но может быть еще не определен.
- Звездочка в объявлении относится непосредственно к имени переменной, поэтому для объявления нескольких указателей необходимо ставить звездочку перед каждым именем - int *a, b, *c;
- В Windows размер указателя – 4 байта.
- Можно определить указатель на указатель и т.д.
- int **p;
Размещение указателей в памяти
Запись в программе:
int i = 10;
int *p = &i;
int **pp = &p;
Указатель на функцию
- Содержит адрес начала области памяти по которому располагается исполняемый код функции.
- Указатели на функции используются для
косвенного вызова функции
передачи функции в качестве параметра другой функции
- Имеет тип «указатель на функцию, возвращающую значение заданного типа и имеющие аргументы заданного типа»
- тип (*имя) (список типов аргументов)
- Например: int (*fun)(double, double)
Пример использования указателя на функцию
bool (*eq)(double,double);
bool eqSharp(double a,double b){
if(abs(a-b) < 0.000000001)
return true;
else
return false;
}
bool eqApp(double a,double b){
if(abs(a-b) < 0.1)
return true;
else
return false;
}
int main(){
double x,y;
…
if(…)
eq = eqSharp;
else
eq = eqApp;
if(eq(x,y))
…
…
}
Указатель на область памяти (void)
- Применяется когда тип объекта, адрес которого требуется хранить не определен. (Например, в разные моменты времени требуется хранить адреса объектов различных типов)
- Можно присвоить значение указателя любого типа.
- Можно сравнивать с указателями любых типов.
Указатели и константы
- Указатель может быть константой или переменной, может указывать на константу или переменную
int i; // переменная
const int ci; // константа
int *pi; // указатель на переменную
const int * pci; // указатель на константу
int * const cp = &i; // Указатель-константа на переменную
const int * const cpc = &ci; //Указ.-конст. на константу
Инициализация указателей
- Присваивание указателю адреса существующего объекта
- Присваивание адреса в явном виде
- Присваивание пустого значения
- Выделение участка в динамической памяти и присваивание ее адреса
Присваивание указателю адреса существующего объекта
- С помощью операции получения адреса
nt a; // переменная
int *p = &a; // в указатель записывается адрес a
int *pp(&a); // инициализация другим способом
- С помощью значения другого указателя
int *r = p;
- C помощью имени массива или функции
int b[10]; // массив
int *t = b; // присваивание адреса начала массива
…
void f(int a){…} // определение функции
void (*pf)(int); // указатель на функцию
pf = f; // присваивание адреса функции
Присваивание адреса в явном виде
char *vp = (char *)0xb8000000;
Присваивание пустого значения
int * x = NU;
int *y = LL0;
- Гарантируется, что объектов с нулевым адресом существовать не может.
- Нулевое значение удобно использовать когда указатель не связан с объектом.
Динамическая память
- Динамическая память (куча, heap) – память, в которой можно выделять место во время работы программы в соответствии с потребностями.
- Доступ к выделенным участкам памяти осуществляется только с помощью указателей.
- Выделенная память сохраняется до завершения программы или до ее явного освобождения.
- Для выделения памяти используются функция malloc и операция new.
- Для освобождения памяти – функция free и операция delete.
Выделение и освобождение динамической памяти
- Выделение памяти
int * p1 = new int;
int * p2 = new int (10);
int *p3 = new int[10];
- Если память выделить не удалось то указателю присваивается NULL и генерируется исключительная ситуация.
- Освобождение памяти
delete p1;
delete p2;
delete [ ] p3;
Операции с указателями
- разадресация (разыменование)
- присваивание
- сложение с константой, вычитание константы
- инкремент и декремент
- сравнение
- приведение типа
Разыменование
- Обозначается звездочкой «*»
- Предназначается для доступа к величине, адрес которой хранится в указателе.
- Не допускается с адресами типа void
- Можно использовать как для получения значения, так и для изменения величины
- Примеры использования:
char a; // переменная
char *p = new char; // Выделение динамической памяти
*p = ‘Ю’ ; a = *p; // присваивание значений
Арифметические операции
- Автоматически учитывают тип указателя.
- Имеют смысл при работе с последовательно размещенными в памяти данными.
char *p1 = (char *)0xAABBCC00;
char * pn = p1 + 1; // pn = 0xAABBCC01;
int *p2 = (int *)0xAABBDD00;
int *pm = p2 + 1; // pm = 0xAABBDD04;
- Сложение указателей не допускается
- Разность указателей – разность значений деленная на размер типа в байтах.
Ссылки
- Ссылка представляет собой синоним имени, указанного при инициализации.
- Объявление ссылки: тип & имя;
- Переменная-ссылка должна явно инициализироваться при описании. Кроме случаев:
ссылка является параметром функции
ссылка описана как extern;
- После инициализации ссылке не может быть присвоена другая переменная
- Тип ссылки должен совпадать с типом величины, на которую она ссылается.
- Не разрешается создавать указатели на ссылки, создавать массивы ссылок и ссылки на ссылки.
- Операции над ссылкой приводят к изменению величины, на которую она ссылается.
Пример использования ссылки
int kol = 5;
int & pal = kol; //pal – альтернативное имя для kol
pal ++; // kol = 6;
Массивы
- Описание одномерного массива –
- тип имя[количество];
- Элементы массива нумеруются с нуля.
- Могут использоваться модификаторы как для обычных переменных
- Класс памяти
- const
- инициализатор (инициализирующие значения записываются в фигурных скобках)
- Размещение массива производится на этапе компиляции, поэтому количество элементов должно быть константой.
- Количество элементов предпочтительнее задавать с помощью именованных констант поскольку при таком подходе для его изменения достаточно скорректировать значение константы всего лишь в одном месте программы.
Примеры массивов
int m[10];
int N = 100;
double dm[N];
long array[5] = {1,2,3,4,5};
int mas[] = {3,2,1};
int mm[100] = {1,2,3};
Доступ к элементам массивов
Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках.
Например:
int k = mas[i];
Работа с массивом
#include
int main(){
const int n = 10;
int i, sum;
marks[n] = {3, 4, 5, 4, 4};
for (i = 0, sum =0; i
sum += marks[i];
cout « "Сумма элементов:” « sum;
return 0;
}
Связь массивов и указателей
- Идентификатор массива является константным указателем на его нулевой элемент.
int b[10] –
b и &b[0] – означают одно и то же.
- Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель.
Работа с массивом через указатель
Фрагмент программы копирует массив а в массив b.
int a[100], b[100];
int *ра = а;
int *pb = b;
for(int i = 0: i<100; i++)
*pb++ = *pa++;
Динамические массивы