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


Объекты и типы

Содержание

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

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

Слайд 1Объекты и типы
Именование – средство повышения абстракции: использование имени объекта

вместо него самого позволяет отвлечься от деталей его реализации.

Объекты и типыИменование – средство повышения абстракции: использование имени объекта вместо него самого позволяет отвлечься от деталей

Слайд 2Области видимости
Блочная структура – иерархия областей, содержащих определения объектов.
Правило видимости:

объект, определённый в некоторой области виден в ней самой и

всех вложенных областях за исключение тех, где определён одноимённый объект.
Однозначность: в одном блоке не может быть несколько определений одного и того же имени.
Поиск определения: определение для использования объекта с именем X находится в ближайшем охватывающем блоке, содержащем определение объекта с именем X.
Области видимостиБлочная структура – иерархия областей, содержащих определения объектов.Правило видимости: объект, определённый в некоторой области виден в

Слайд 3Блоки
Пример:
int power(float x, int n) { int s = 0;

for (int k = 0; k

{ int ss = s; s *= x; printf(“%f * %f = %f\n”, ss, x, s); }
}

БлокиПример:	int power(float x, int n) {   int s = 0;   for (int k

Слайд 4Области видимости
Присоединяющий оператор with S: блок, определяющий множество имён из

структуры S with S do R.X = X
Квалификация – указание охватывающей

структуры, типа или библиотеки перед использованием имени
R.X A[i]->X System.Drawing.Color.Aquamarine
Области видимостиПрисоединяющий оператор with S: блок, определяющий множество имён из структуры S 	with S do R.X =

Слайд 5Области видимости - исключения
Библиотеки
Конфликты возникают только в момент использования имени
Квалификация

имён: явное и неявное использование библиотеки
Раздельные пространства имён для разных

сортов объектов (SQL):
select select.select from select, where where where.select=select.where;
Области видимости - исключенияБиблиотекиКонфликты возникают только в момент использования имениКвалификация имён: явное и неявное использование библиотекиРаздельные пространства

Слайд 6Области видимости
X:
Lib1:
X:
Y:
Lib2:







Prog:
X:
Y:
X
Lib1.X
with Y

Proc P1:
Y
Lib2.Y

Proc P2:
Y.X
P2
Proc P1:
X

Области видимостиX: Lib1:X:Y:Lib2:         Prog:X:Y:XLib1.Xwith Y Proc P1:YLib2.YProc P2:Y.XP2Proc P1:X

Слайд 7Анонимные объекты
Объекты, не имеющие собственного имени, доступ к которым осуществляется

только через имена других объектов - вычисление имени (адреса).
Массивы: M[(int)

sqrt(R) - 1]
Указатели: *p, *(p->x[i].y->z)

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

Слайд 8Типы данных
Моделируемая категория (например, неотрицательные целые числа)
Синтаксис (например, unsigned int)
Литеральные

значения – запись констант в тексте программы (например, 0x123)
Набор операций

(например, +, -, *)
Реализация (например, машинное слово)
Типы данныхМоделируемая категория (например, неотрицательные целые числа)Синтаксис (например, unsigned int)Литеральные значения – запись констант в тексте программы

Слайд 9Анализ типов
Статический – тип всех выражений можно выполнить во время

трансляции, до исполнения программы
Надёжность
Понимаемость
Динамический – тип выражений определяется во время

исполнения программы
Гибкость (?)
Необходим, если новые типы появляются в процессе выполнения
Анализ типовСтатический – тип всех выражений можно выполнить во время трансляции, до исполнения программыНадёжностьПонимаемостьДинамический – тип выражений

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

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

и результатов.
Разноимённые типы различны (?):
typedef int Apples; /* количество */
typedef int Distance; /* в километрах */
typedef int LocalDistance; /* в метрах */
Статический анализ типовСтрогая типизацияДля каждой переменной, параметра, поля и т.п. указан типДля операций, функций, процедур и т.п.

Слайд 11Динамическая типизация
Пример:
Input x
If x > 0
y = 2
Else
y = “2”
End

If
Print x + y
Введено “5" - напечатано “7”

Введено “-1" - напечатано “-12”

Введено

“Привет!" - ошибка при “If x > 0”

Слайд 12Полиморфизм
Перегрузка операций: разные реализации в зависимости от типов аргументов и

результатов. Например,

1 + 2, 1.2 + 3.4, “Hello” + “2”

void

DrawRectangle(int x, int y, int w, int h);
void DrawRectangle(Location p, Size s);
void DrawRectangle(Rectangle r);
ПолиморфизмПерегрузка операций: разные реализации в зависимости от типов аргументов и результатов. Например,1 + 2, 1.2 + 3.4,

Слайд 13Полиморфизм
Родовые типы – типы, имеющие параметры, в том числе и

типовые.
Реализация операций зависит только от свойств параметров-типов class SortedList {

public void Insert(KeyType k, ElementType e) { … } }
Пример (C#):
SortedList Persons;
SortedList > Matrices;
Persons.Insert(“Mike”, Me);
Matrices.Insert(A.Determinant(), A);
ПолиморфизмРодовые типы – типы, имеющие параметры, в том числе и типовые.Реализация операций зависит только от свойств параметров-типов

Слайд 14Типы данных
Классификация
Предопределённые – предоставляемые языком
Определяемые – описанные в программе
Простые –

неделимые с точки зрения языка, не имеющие компонент
Структурированные – предназначенные

для агрегации компонентов или связи между данными
Неупорядоченные – присваивание, сравнение на равенство и неравенство: =, == и != (C), :=, = и <> (Pascal).
Упорядоченные – кроме того, сравнения <, <=, >, >=
Перечислимые (интегральные) – сопоставление целым
Арифметические – кроме того, сравнения +, -, *, /
Типы данныхКлассификацияПредопределённые – предоставляемые языкомОпределяемые – описанные в программеПростые – неделимые с точки зрения языка, не имеющие

Слайд 15Логические (Pascal)

Логические (Pascal)

Слайд 16Символы (Pascal)

Символы (Pascal)

Слайд 17256 символов – много или мало?
10 цифр + 26 букв

+ ().,;+-*/ - достаточно
С другой стороны
32 управляющие кода: перевод строки,

возврат каретки, перевод страницы,гудок, табуляция,...
32 символа: пробел, 0..9, …
32 буквы: ABC…XYZ + @[\]^_
32 строчные буквы: аbc..xyz + `{|}~…
64 кириллица: АБВ...ЭЮЯабв...эюя
64 псевдографика: ╫╪┘...
Буква ё, диакритика, лигатуры: ùÿÜ…
Греческие: αßπΣΓ...
Катакана, арабский, иврит, санскрит, иероглифы:...
256 символов – много или мало?10 цифр + 26 букв + ().,;+-*/ - достаточноС другой стороны32 управляющие

Слайд 18Многобайтные кодировки
Shift-JIS – специально для японского
Двуязыковая кодировка
«Обычные» символы – одним

байтом
Shift-In, Shift-Out – «скобки» двухбайтовой кодироки
Universal Character Set (Unicode)
Многоязыковые

тексты
около 100,000 абстрактных символов
Кодировки
UCS-2 – два байта на каждый символ
UCS-4 – четыре байта на каждый символ
UTF-8 – от одного до четырёх байтов
Многобайтные кодировкиShift-JIS – специально для японскогоДвуязыковая кодировка«Обычные» символы – одним байтомShift-In, Shift-Out – «скобки» двухбайтовой кодирокиUniversal Character

Слайд 19Целые числа (Pascal)

Целые числа (Pascal)

Слайд 20Множества (Pascal)

Множества (Pascal)

Слайд 21Перечисления (Pascal)

Перечисления (Pascal)

Слайд 22Целые – представление 1
Неотрицательные
bn-1 bn-2 … b0 – последовательность

битов
n – разрядность




Диапазон: 0..2n-1

Целые – представление 1Неотрицательные bn-1 bn-2 … b0 – последовательность битовn – разрядностьДиапазон: 0..2n-1

Слайд 23Целые – представление 1 (пример)
n=8
00000000 = 0
00111110 = 32+16+8+4+2 =

62
10000100 = 128+4=132
11111111 = 128+64+32+16+8+4+2+1 = 255

Целые – представление 1 (пример)n=800000000 = 000111110 = 32+16+8+4+2 = 6210000100 = 128+4=13211111111 = 128+64+32+16+8+4+2+1 = 255

Слайд 24Целые – представление 2
Cо знаком - дополнительный код
bn-1 bn-2 …

b0 – последовательность битов
n – разрядность.
bn-1 - знак (1 –

отрицательные)
Неотрицательные:

Неположительные:

Диапазон: -2n-1-1 .. 2n-1-1
Целые – представление 2Cо знаком - дополнительный кодbn-1 bn-2 … b0 – последовательность битовn – разрядность.bn-1 -

Слайд 25Целые - представление 2 (пример)
n=8
0 0000000 = 0
0 0111110 =

32+16+8+4+2 = 62
1 0000100 = -(64+32+16+8+2+1)=-123
1 1111111 = 0

Целые - представление 2 (пример)n=80 0000000 = 00 0111110 = 32+16+8+4+2 = 621 0000100 = -(64+32+16+8+2+1)=-1231 1111111

Слайд 26Целые – представление 3
Со знаком - двойное дополнение
bn-1 bn-2 …

b0 – последовательность битов
n – разрядность



Диапазон: -2n .. 2n-1

Целые – представление 3Со знаком - двойное дополнениеbn-1 bn-2 … b0 – последовательность битовn – разрядностьДиапазон: -2n

Слайд 27Целые - представление 3 (пример)
n=8
0 0000000 = 0
0 0111110 =

32+16+8+4+2 = 62
1 0000100 = -128+4 = -124
1 1111111 =

-128+64+32+16+8+4+2+1 =-1


Целые - представление 3 (пример)n=80 0000000 = 00 0111110 = 32+16+8+4+2 = 621 0000100 = -128+4 =

Слайд 28Целые – синтаксис и диапазон значений (C)
Algol-68: long long long

Целые – синтаксис и диапазон значений (C) Algol-68: long long long int

Слайд 29Целые – константы (С)
0..9 – десятичная цифра
0..7 – восьмиричная цифра
0..9A..F

– шестнадцатерич-ная цифра
H – short
L – long
U – unsigned
целое

Целые – константы (С)0..9 – десятичная цифра0..7 – восьмиричная цифра0..9A..F – шестнадцатерич-ная цифраH – shortL – longU

Слайд 30Символы-коды (С)
0..7 – восьмиричная цифра

0..9A..F – шестнадцатеричная цифра
код

Символы-коды (С)0..7 – восьмиричная цифра0..9A..F – шестнадцатеричная цифракод

Слайд 31Символы, как целые (C)
Символ – изображение своего кода:
‘\123’ == 0123

Пример:

i-aя буква
Pascal: chr(ord(‘A’) + i – 1)
C: ‘A’ + i

-1
Символы, как целые (C)Символ – изображение своего кода:‘\123’ == 0123Пример: i-aя буква Pascal: chr(ord(‘A’) + i –

Слайд 32Целые, как логические (С)
0 – ложь
Не ноль – истина
Операции
&& -

конъюнкция (и)
|| - дизъюнкция (или)
! - отрицание (не)
Пример:
!1 || ‘A’

&& 0x12L - результат = 1
‘\0’ || (‘A’ == ‘B’) – результат = 0
Целые, как логические (С)0 – ложьНе ноль – истинаОперации&& - конъюнкция (и)|| - дизъюнкция (или)!	- отрицание (не)Пример:

Слайд 33Целые, как битовые шкалы (С)
& - побитовая конъюнкция
| - побитовая

дизъюнкция
^ - побитовый xor (неравенство)
~ побитовое отрицание
- сдвиги

влево и вправо

Целые, как битовые шкалы (С)& - побитовая конъюнкция| - побитовая дизъюнкция^ - побитовый xor (неравенство)~ побитовое отрицание

Слайд 34Целые, как битовые шкалы (С)
Реализация операций над множествами
set of

1..32 - unsigned long int
S1 * S2, S1 + S2,

S1 – S2
S1 & S2, S1 | S2, S1 & ~S2
x in S
(1 << (x-1)) & S
S1 <= S2
S1 & S2 == S1
[x..y]
(y >= x ? ( (1<<(y–x+1)) - 1) << (x-1) : 0)
Целые, как битовые шкалы (С)Реализация операций над множествами set of 1..32 - unsigned long intS1 * S2,

Слайд 35Перечисление как целые
Определение констант
#define red 0
#define green 1
#define blue 2
или
const

int red = 0;
const int green = 1;
const int blue

= 2;
Недостаток – лишняя информация
При добавлении новой константы – перенумеровать
Нестрогая типизация: blue / green, red + 8
Перечисление как целыеОпределение констант#define red 0#define green 1#define blue 2илиconst int red = 0;const int green =

Слайд 36Перечисление
Синтаксис
Пример:
enum StreetColor (red, green, blue)
enum WeekDay ( Mon=1, Tue, Wed,

Thu, Fri, Sat, Sun
)

ПеречислениеСинтаксисПример: enum StreetColor (red, green, blue)enum WeekDay ( 		Mon=1, Tue, Wed, Thu, Fri, Sat, Sun	)

Слайд 37Вещественные – представление 1
С фиксированной точкой
bn-1 bn-2 … b0 –

последовательность битов, n – разрядность, p – размер дробной части
bn

- знак (1 – отрицательные)
Абсолютная величина:


Вещественные – представление 1С фиксированной точкойbn-1 bn-2 … b0 – последовательность битов, n – разрядность, p –

Слайд 38Вещественные – представление 1 (пример)
n=8, p=2
000000 00 = 0
001111 10

= 8+4+2+1+1/2 = 15.5
100001 00 = -(1) = -1
111111 11

= -(16+8+4+2+1+1/2+1/4) = 31.75
Вещественные – представление 1 (пример)n=8, p=2000000 00 = 0001111 10 = 8+4+2+1+1/2 = 15.5100001 00 = -(1)

Слайд 39Вещественные – представление 2
С плавающей точкой
bn-1 bn-2 … bpbp-1…b0 –

последовательность битов,
n – разрядность,
p – размер мантиссы
s –

смещение порядка
bn-1 - знак (1 – отрицательные)
Абсолютная величина:

Порядок e =
Вещественные – представление 2С плавающей точкойbn-1 bn-2 … bpbp-1…b0 – последовательность битов, n – разрядность, p –

Слайд 40Вещественные – представление 2 (пример)
n=8, p=2, s=3
0 000 0000 =

0 (особый случай)
0 001 1110 = 21-3 * (1+0.875) =

0.46875
1 000 0100 = -(20-3 * (1+0.25)) = - 0.03125
1 111 1111 = -(27-3 * (1+0.9375)) = 31
Вещественные – представление 2 (пример)n=8, p=2, s=30 000 0000 = 0 (особый случай)0 001 1110 = 21-3

Слайд 41Вещественные – синтаксис и диапазон значений

Вещественные – синтаксис и диапазон значений

Слайд 42Вещественные – другие представления
Неограниченная точность: неограниченный размер.
Рациональные числа: числитель и

знаменатель.
Символьный: 2*sin(pi/6).
Сумма (бесконечного) ряда, непрерывные дроби

Вещественные – другие представленияНеограниченная точность: неограниченный размер.Рациональные числа: числитель и знаменатель.Символьный: 2*sin(pi/6).Сумма (бесконечного) ряда, непрерывные дроби

Слайд 43Вещественные – константы (С)
0..9 – десятичная цифра
F – short
L –

Double
Неточность:
12L – long int
12.0L – double
12e-5L - double

Вещественные – константы (С)0..9 – десятичная цифраF – shortL – DoubleНеточность: 12L – long int12.0L – double12e-5L

Слайд 44Вещественные – потеря точности
С фиксированной точкой
122.55 / 2 * 2

= 122.50

C плавающей точкой
Большое + маленькое
1.0e+38 + 1.0e-45f = 1.e+38
Преобразование

системы счисления 1.0e-40 = 9.999946E-41
Вещественные – потеря точностиС фиксированной точкой122.55 / 2 * 2 = 122.50C плавающей точкойБольшое + маленькое	1.0e+38 +

Слайд 45Приведение типов
Неявное – типы аргументов арифметической операции приводятся к максимальному
double
float
unsigned

long
long
unsigned char
int
Явное
int x = 30000;
x * 12 - переполнение, больше

32767
(float) x * 12 == 360000f;
Приведение типовНеявное – типы аргументов арифметической операции приводятся к максимальномуdoublefloatunsigned longlongunsigned charintЯвноеint x = 30000;x * 12

Слайд 46Указатели
Описание (простой случай)
Т * p;
Т x;
Операции
Взятие адреса
p = &x
Разыменование

– объект, на который указывает p
*p
Свойства: &(*p) эквивалентно p, *(&x)

эквивалентно x
Литеральная константа: NULL – пустой указатель
Реализация: адрес (ссылка, номер ячейки) указуемого объекта.
УказателиОписание (простой случай)Т * p;Т x;ОперацииВзятие адреса 	p = &xРазыменование – объект, на который указывает p	*pСвойства: &(*p)

Слайд 47Указатели - пример
int i, j;
int * p;

p = &i;
*p =

2;
j = *p + 1;
p = &j;
*p = *p

+1;

p

j

i

2

4

3

Указатели - пример int i, j;int * p;p = &i;*p = 2;j = *p + 1; p

Слайд 48Адресная арифметика
Пусть
p – указатель на объект типа T
p

начинается с байта c номером a
размер Т равен s
тогда p+k

- указатель на объект типа T, который начинается с адреса a + s*k
(Аналогично p-k)

p

p+2

T

T

T

Адресная арифметикаПусть p – указатель на объект типа T p начинается с байта c номером aразмер Т

Слайд 49Адресная арифметика
Указатели – (частично-)упорядоченный тип: порядок определён, только для указателей

полученных из одного и того же указателя
Пусть p1, p2 –

однотипные указатели, k – целое, тогда
p1 + k – допустимо
k + p1 – недопустимо
p1 < p2 – допустимо
p1 – p2 – допустимо, результат целое
p1 + p2 - недопустимо

Адресная арифметикаУказатели – (частично-)упорядоченный тип: порядок определён, только для указателей полученных из одного и того же указателяПусть

Слайд 50Тип void *
Указатель на «нечто» - можно явно привести к

любому типу указателя.

Пример:
extern void * malloc(int c);
float * A

= (float *) malloc(1000);
Тип void *Указатель на «нечто» - можно явно привести к любому типу указателя.Пример: 	extern void * malloc(int

Слайд 51Массивы (C)
Описание: (простой случай) Т-тип размера s, N-константа
T A[N]
Отведение непрерывного

участка памяти размера N*s байт
A – константный указатель на первый

элемент
Операция: выборка компоненты
A[i] эквивалентно *(A+i)
Следствия:
Все массивы нумеруются с нуля.
Индекс последнего элемента равен N-1
Нет контроля границ индексов
Массивы (C)Описание: (простой случай) Т-тип размера s, N-константа		T A[N]Отведение непрерывного участка памяти размера N*s байтA – константный

Слайд 52Массивы (С)
Литеральные значения (только в инициализации)
int A[] = { 5,

4, 3, 2, 1};
float A[2][2] = { {5, 4.0} ,

{3 , 2+2} };

Массивы (С)Литеральные значения (только в инициализации)int A[] = { 5, 4, 3, 2, 1};float A[2][2] = {

Слайд 53Многомерные массивы
Pascal:
var A :
array[1..N, 1..M] of real;
A[i,j]
C
float A[N][M];
A[i-1][j-1]
float

A[N*M];
A[(i-1) * M + (j-1)]
float A[N,M];
A[i,j]
– типичная ошибка

Многомерные массивыPascal:	var A : 		array[1..N, 1..M] 			of real;	A[i,j]Cfloat A[N][M];	A[i-1][j-1] float A[N*M];	A[(i-1) * M + (j-1)]float A[N,M];	A[i,j] 	–

Слайд 54Динамические массивы
Размер определяется в процессе вычислений
Algol-60 C

integer N;
Read Int(N);
begin

real array Data[1:N];

end
int N;
scanf(“%d”,&N);
{
float *

Data =
(float *)
calloc(N,sizeof(float));

free(Data);
}
Динамические массивыРазмер определяется в процессе вычисленийAlgol-60				C	integer N;Read Int(N); begin   real array Data[1:N]; 		…endint N;scanf(“%d”,&N); {

Слайд 55Динамические массивы
Размер массива – часть его представления
Modula-2 C
PROCEDURE
Sum(A

: ARRAY OF CARDINAL)
: CARDINAL;


BEGIN …
FOR i := 0 TO HIGH(A) DO
S := S + A[i];
END;
RETURN S;
END Sum;

unsigned long
Sum(unsigned long A[],
int N)


{
for (i=0; i S = S + A[i];

return S;
}

Динамические массивыРазмер массива – часть его представленияModula-2				CPROCEDURE  Sum(A : ARRAY OF 			   CARDINAL) 	:

Слайд 56Подвижные массивы
Размер может меняться в процессе вычислений
Visual Basic

C
Input x
Cnt = Cnt + 1
If UBound(A) < Cnt

Then
Redim Preserve _
A(0 To UBound(A) + 1000) As Single
End If
A(Cnt) = x;

scanf(“%f”, &x);
Cnt = Cnt + 1;
If (SizeA < Cnt)
{
SizeA = SizeA + 1000;
A = (float*) realloc(A,
SizeA * sizeof(float));
}
A[Cnt] = x;

List A;
float x = float.Parse( Console.ReadLine());
A.Add(x);

C#

Подвижные массивыРазмер может меняться в процессе вычисленийVisual Basic			    CInput xCnt = Cnt + 1If

Слайд 57Подвижные массивы
Размер может меняться в процессе вычислений
C# C
Memcpy(
&(A[i]),

&(A[i+1]), (SizeA - i -1) * sizeof(float));
Cnt =

Cnt - 1;

A.RemoveAt(i);

Подвижные массивыРазмер может меняться в процессе вычисленийC#					CMemcpy(  &(A[i]),    &(A[i+1]),   (SizeA -

Слайд 58Непрямоугольные массивы
Пример: треугольная матрица (С)
float * A[N];
for (i=0; i

A = (float*) malloc(
(i+1) * sizeof(float));

A[k][m]
A[1]
A[0]
A[2]
A[3]
……

Непрямоугольные массивыПример: треугольная матрица (С)float * A[N];for (i=0; i

Слайд 59Массивы-дескрипторы (Автокод Эльбрус)
Подмассив базового массива М2:
Транспонированная матрица
КОНСТ М2Т = ФОРМАВМ

([i,j] = M2[j,i])
Первая строка матрицы
КОНСТ М1СТР = ФОРМАВМ ([j] =

M2[1,j])
Минор
КОНСТ МИНОР = ФОРМАВМ ([i,j] = M2[i=0:K,j=:L])
Диагонали
КОНСТ ДМК = ФОРМАВМ ([i] = M2[i,i])
КОНСТ ПМК = ФОРМАВМ ([i] = M2[i,ЧИТАТР(М2,1,ДЛИНИЗМ) - 1 - i])
Массивы-дескрипторы  (Автокод Эльбрус)Подмассив базового массива М2:Транспонированная матрицаКОНСТ М2Т = ФОРМАВМ ([i,j] = M2[j,i])Первая строка матрицыКОНСТ М1СТР

Слайд 60Операции с массивами (Альфа)
массив A[1:N,1:M], B[1:M,1:K], X, Y[1:N], Z[1:M]
вещественный C

Операции с массивами (Альфа)массив A[1:N,1:M], B[1:M,1:K], X, Y[1:N], Z[1:M]вещественный C

Слайд 61Операции над массивами (Альфа)
Больше, чем перегрузка операций (Algol-68, C++) –

статическая проверка соответствия границ.
Промежуточные массивы размещает сам транслятор (сравните с

C)
(A * B) * X + (2 * Y)
Оптимизация, эффективные (параллельные) алгоритмы
Операции над массивами (Альфа)Больше, чем перегрузка операций (Algol-68, C++) – статическая проверка соответствия границ.Промежуточные массивы размещает сам

Слайд 62Операции над массивами (APL)
APL – A Programming Language язык, ориентированные

на обработку структурных данных
Богатый набор операци на массивами:
сдвиг, перестановка, сжатие,

выбор индексов вхождений, транспонирование, упорядочение, …
Распространение всех элементарных операций на массивы
Оператор редукции
Операции над массивами (APL)APL – A Programming Language язык, ориентированные на обработку структурных данныхБогатый набор операци на

Слайд 63Операции над массивами (APL)
Пример: вычислить полином степени n от x,

заданный массивом коэффициентов A:
/+ (A * (x ι

(n+1)))
/+ (A * (x (0 1 2 … n)))
/+ (A * (x0 x1 x2 … xn))
/+ (A0*x0 A1*x1 A2*x2 … An*xn)
A0*x0 + A1*x1 + A2*x2 + … + An*xn
Операции над массивами (APL)Пример: вычислить полином степени n от x, заданный массивом коэффициентов A:		/+ (A * (x

Слайд 64Строки (Pascal)

Строки (Pascal)

Слайд 65Строки как массивы (С)
Строка – указатель на последовательность символов, заканчивающуюся

‘\0’
unsigned char s[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};

Литеральное

значение: “Hello, \”string\”!\n”
Строки как массивы (С)Строка – указатель на последовательность символов, заканчивающуюся ‘\0’	unsigned char s[] = {‘H’, ‘e’, ‘l’,

Слайд 66Строки как массивы (С)
Достоинства:
Могут иметь произвольную длину
Могут использоваться не только

в инициализации (в отличии от других массивов)
Не требуют специальных операций

для доступа к содержимому

Строки как массивы (С)Достоинства:Могут иметь произвольную длинуМогут использоваться не только в инициализации (в отличии от других массивов)Не

Слайд 67Строки как массивы (С)
Недостатки:
Сложно определить длину (в отличии от Pascal)
Все

недостатки массивов
Нет контроля границ индексов
Нет подвижных массивов – память надо

выделять «вручную»
Строки как массивы (С)Недостатки:Сложно определить длину (в отличии от Pascal)Все недостатки массивовНет контроля границ индексовНет подвижных массивов

Слайд 68Строки как массивы (С)
Операции
strlen(s) – длина s
strcpy(s1,s2) – копирование

строки
strcat(s1,s2) – конкатенация строк
strchr(s,c) – указатель на первое вхождение с

в s

Строки как массивы (С)Операции strlen(s) – длина sstrcpy(s1,s2) – копирование строкиstrcat(s1,s2) – конкатенация строкstrchr(s,c) – указатель на

Слайд 69Строки как массивы (С)
Пример (аналог Copy в Pascal – выборки

подстроки)

unsigned char * PasCopy(unsigned char *source, int i, int l)
{
unsigned

char * dest = (unsigned char *) malloc(l+1);
unsigned char * d = dest;
unsigned char * s = &(source[i]); while ((*d++ = *s++) && l--)
;
d[-1] = ‘\0’;
return dest;
}
Строки как массивы (С)Пример (аналог Copy в Pascal – выборки подстроки)unsigned char * PasCopy(unsigned char *source, int

Слайд 70Описания
Синтаксис:
mип:
описание:
описатель:

ОписанияСинтаксис:mип:описание:описатель:

Слайд 71Описание - примеры
Указатель на массив целых
int (*x)[100]
Массив из указателей на

целые
int * (x[100])
Указатель на массив из массивов из указателей

на указатели на перечисление WeekDay
enum WeekDay ** ((*x)[][100])
Указатель на целое, целое и целое равное 5
long * p, n, m = 5
Описание - примерыУказатель на массив целыхint (*x)[100]Массив из указателей на целыеint * (x[100]) Указатель на массив из

Слайд 72Описание типа
Синтаксис

Пример:
C Pascal
typedef float Matrix[N][N];
Matrix A, *p;
type Matrix =
array[0..N-1]
array

[0..N-1]
of real;
var A : Matrix;

p : ^ Matrix;
Описание типаСинтаксисПример:C						Pascaltypedef float Matrix[N][N];Matrix A, *p;type Matrix = 	array[0..N-1]	 array [0..N-1]	  of real;var A : Matrix;

Слайд 73Структуры
Назначение: объединение разнотипных данных
struct – декартовое произведение
union – объединение
Реализация:
struct –

последовательное выстраивание
union – наложение различной разметки на участок памяти.

СтруктурыНазначение: объединение разнотипных данныхstruct – декартовое произведениеunion – объединениеРеализация:struct – последовательное выстраиваниеunion – наложение различной разметки на

Слайд 74Структуры
Синтаксис:




Операции: . - выборка поля, например,
S.code, A[i].re, (*p).next
(последнее эквивалентно

p->next)

СтруктурыСинтаксис:Операции: . - выборка поля, например,S.code, A[i].re, (*p).next (последнее эквивалентно p->next)

Слайд 75Структуры
Пример struct
typedef struct { re, im : float; } complex;
complex

c1= {-1, 0}, c2 = {3.14,2.78}, c;
c.re = c1.re *

c2.re – c1.im * c2.im;
c.im = c1.re * c2.im + c1.im * c2.re;
Пример union
union { unsigned long l; unsigned char c[4];} b4;
b4.l = 0xAABBCCDD;
b4.c[1] = ‘A’;
(результат b4.l == 0xAA41CCDD)
СтруктурыПример structtypedef struct { re, im : float; } complex;complex c1= {-1, 0}, c2 = {3.14,2.78}, c;c.re

Слайд 76Структуры - пример
struct expr {
unsigned char code;
int tag;

union {
float value;
unsigned char name[8];

struct {
unsigned char op;
struct expr * arg;
} unop;
struct {
unsigned char op;
struct expr * left, * right;
} binop;
} var;
} E;

op

value



name



tag

left



op

arg



right



code

Структуры - примерstruct expr { unsigned char code; int tag; union {  float value;  unsigned

Слайд 77Структуры - пример
struct expr {
int tag;
unsigned char code;

union {
float value;
unsigned char name[8];

struct {
unsigned char op;
struct expr * arg;
} unop;
struct {
unsigned char op;
struct expr * left, * right;
} binop;
} var;
} * E;

type expr = ^ Sexpr;
Sexpr = record
tag : integer;
case code : char of
‘v’ : (value : real);
‘n’ : (name :
array[0..7] of char;)
‘u’ : (unop : char;
arg : expr; )
‘b’ : (binop : char;
left, right : expr;)
end;
var E : expr;

Структуры - примерstruct expr { int tag; unsigned char code; union {  float value;  unsigned

Слайд 78Структуры - выравнивание
struct expr {
int tag;
unsigned char code;

union {
float value;
unsigned char name[8];

struct {
unsigned char op;
struct expr * arg;
} unop;
struct {
unsigned char op;
struct expr * left, * right;
} binop;
} var;
} E;

op

value



name



tag

left



op

arg



right



code

Структуры - выравниваниеstruct expr { int tag; unsigned char code; union {  float value;  unsigned

Слайд 79union – «дыра» в контроле типов
mode node = union

(real, int, compl, string);
node n :=

"1234";
case n in
(real r): print(("real:", r)),
(int i): print(("int:", i)),
(compl c): print(("compl:", c)),
(string s): print(("string:", s))
out print(("?:", n))
esac

Algol-68:

typedef union
{ float r;
int i;
complex c;
char * s
} node;
node n;
n.s = "1234";
printf(“(%f,%f)”, n.c.re, n.c.im);

union – «дыра» в контроле типовmode node = union      (real, int, compl,

Слайд 80sizeof
Размер типа данных или переменной
Пример
char c, * p = “abc”,

s[] = “abc”, a[3]={‘a’,’b’,’c’};
struct T{
unsigned char code;
struct T

* left, * right;
};
sizeofРазмер типа данных или переменнойПримерchar c, * p = “abc”,  s[] = “abc”,  a[3]={‘a’,’b’,’c’};struct T{	unsigned

Слайд 81sizeof
Псевдооперация
Параметр – тип
Вычисление не требует вычисления аргумента, а только его

типа
Использования
динамическое размещение данных
Record * r = (Record*) malloc(sizeof(Record)), *

a = (Record *) calloc(sizeof(*a),100);
копирование массивов
memcpy(dest, source, n * sizeof(*dest))
sizeofПсевдооперацияПараметр – типВычисление не требует вычисления аргумента, а только его типаИспользованиядинамическое размещение данныхRecord * r = (Record*)

Слайд 82Присваивания
Выражение с побочным эффектом (изменением состояния памяти)
Получатель (левая часть присваивания)

– изменяемая переменная
Источник (правая часть присваивания) – присваиваемое значение
Значение присваивания

= присвоенное значение
Приведение типов: тип источника не превосходит типа получателя.
ПрисваиванияВыражение с побочным эффектом (изменением состояния памяти)Получатель (левая часть присваивания) – изменяемая переменнаяИсточник (правая часть присваивания) –

Слайд 83Присваивание - пример
float A[N]; int i, j;
A[i+j] = (i=(j=1)+2) +

4
Вычислить 1
Поместить 1 в j
К значению j прибавить 2
Поместить 3

в i
Вычислить 3+4 (результат 7)
Вычислить i+j
Вычислить элемент массива A[4]
Преобразовать 7 в вещественное 7.0
Поместить 7.0 в A[4]
Результат присваивания – 7.0
Присваивание - примерfloat A[N]; int i, j;A[i+j] = (i=(j=1)+2) + 4Вычислить 1Поместить 1 в jК значению j

Слайд 84Присваивание – побочные эффекты!
Если вдруг в предыдущем примере A[i+j] = (i=(j=1)+2)

+ 4 cначала вычисляется получатель, то изменится A[0], а не A[4]
Не

специфицировано в каком порядке вычисляются операнды, например ((i=(j=2) + i) + (j=(i=1) + j)
может быть равно как 5, так и 3.

Присваивание – побочные эффекты!Если вдруг в предыдущем примере 	A[i+j] = (i=(j=1)+2) + 4 cначала вычисляется получатель, то

Слайд 85Совмещенное присваивание
M[i+1] = М[i+1] + 2
эквивалентно (при отсутсвии побочных

эффектов) M[i+1] += 2
Сокращение записи – наглядность
Соответствие смыслу –

«увеличить M[i+1] на 2»
Экономия вычислений – ячейка M[i+1] вычисляется лишь один раз
Помимо += может быть -=, *=, /=, %=, &=, |=, ^=, <<=, >>=. (Но не может быть <=, &&=, !=)
Совмещенное присваивание	 M[i+1] = М[i+1] + 2		эквивалентно  	(при отсутсвии побочных эффектов)  M[i+1] += 2 Сокращение

Слайд 86Инкремент, декремент
Префиксная форма
++ X эквивалентно X += 1
Постфиксная форма
X ++

эквивалентно (t = X, X+=1, t)
Запомнить X во временной переменной
Увеличить

X на 1
Выдать запомненное значение
Аналогично для --

Инкремент, декрементПрефиксная форма++ X эквивалентно X += 1Постфиксная формаX ++ эквивалентно (t = X, X+=1, t)Запомнить X

Слайд 87Совмещённое присваивание (пример)
(*p++) += 0x40
Запомнить значение указателя p
Извлечь значение символа

*p
Прибавить к нему 0x40
Поместить полученное значение в *p
Взять запомненное на

шаге 1значение указателя p
Увеличить его на 1
Поместить полученный указатель в p (перейти к следующему символу)

Совмещённое присваивание (пример)(*p++) += 0x40Запомнить значение указателя pИзвлечь значение символа *pПрибавить к нему 0x40Поместить полученное значение в

Слайд 88Путаница: = vs ==, & vs &&
Присваивание встречается значительно чаще,

чем сравнение на равенство (?)
В системных программах & встречается чаще,

чем && (?)
Пример. Пусть x = 1, y = 2, тогда условие
x=2 & x-y>0
Реализуется как
x = ( ((2 & x) – y) > 0 ), результат 0, побочно x=0
Путаница: = vs ==, & vs &&Присваивание встречается значительно чаще, чем сравнение на равенство (?)В системных программах

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

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

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

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

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


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

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