лекции (2009), страница 4
Описание файла
Текстовый-файл из архива "лекции (2009)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 4 страницы текстового-файла онлайн
TYPE Index = [1..N];
ARRAY of D;
Index = CARDINALL[0..N]; //В данном случае индекс задается статически.
PROCEDURE SUM (VAR A: ARRAY OF REAL): REAL;
VAR S: REAL; I: INTEGER;
BEGIN
S:=0.0;
FOR I:=0 TO HIGH(A) DO
S:=S+A[I];
END;
RETURNS
END SUM;
Открытый массив: к нему применима функция HIGH(A) – максимальная длина без единицы.
Общий синтаксис объявления массива в Обероне
TYPE Arr = ARRAY N OF D;
TYPE NAT IS NEW INTEGER RANGE 1..MAX_INT (NEW – означает новый тип)
X: NAT;
I: INTEGER;
X:=I; и I:=X; - нельзя.
X:=NAT(I);
I:=INTEGER(X);
SUBTYPE POS IS INTEGER RANGE 0..MAX_INT;
X: POS; I: INTEGER;
I:=X; X:=I ~ X:=POS(I);
Неограниченный тип массива.
D,I – зафиксированы.
L..R – не фиксируемые левые и правая границы.
TYPE TARR IS ARRAY INTEGER RANGE 0..N REAL;
Атрибуты данных:
A’LENGTH – длина массива
A’FIRST = L
A’LAST = R
A’RANGE RANGE A.FIRST..A.LAST
У неограниченных типов данных – атрибуты динамические, у ограниченных – статические.
Зачем нужны неограниченные типы данных: они нужны для выведения из них других типов данных.
X1: TARR;
X2: Arr; //Нельзя. Компилятор не может распределять память.
Надо: X2: Arr range 0..N;
Function SUM(A: Arr)return real is
S: real := 0.0;
Begin
for i in A’RANGE loop S:=S+A(i); end loop;
return S;
end SUM.
a:=SUM(X2);
C: POS;
D: INTEGER;
C := D; //ok
C: POS:
D: INTEGER := -1;
C := D; //ошибка.
Динамический массив (квазистатический).
procedure P(N: integer) is
A: array(1..N) of real;
C#, Java:
T[] имя;
new имя[len];
int[] a = new int{1,2,3,4,5};
Многомерные массивы.
С, С++: int a[N1][N2];
C#: int [,] a = new a[N1,N2];
int [][] a; //ступенчатый массив, он же разрывный.
Вырезка: подмножество элементов массива.
Фортран:
А(N1,N2)
А(1,*) – 1-я строчка.
А(*,1) – 1-й столбец.
A(2..5,*), A(1..3,2..4) – прямоугольная вырезка.
Ада поддерживает только одномерные непрерывные вырезки.
П.3.2. Записи (струтуры).
struct name {поля}
record последовательность полей end;
Разные типы: тип класс обертка (упаковка, распаковка)
С++: класс – обобщение структуры. (у структур в С собственное пространство имен)
Java: отсутствует запись – она не нужна.
С++: структуры – классы.
Отличия:
1)
Имена
2)
struct – public, class – private.
Delphi:
Новое – класс.
Старое – record.
C#: Типы – значения.
struct c {}
class F{}
С а = new C();
Отличия от класса:
1)
память распределена как под типы значений
2)
или классы. Есть классы-обертки.
class Point { int x,y; }
Point[] pointArray = new Point[1000]; //Неоправданные затраты памяти и времени. Здесь лучше использовать
структуру.
Лекция. Сергеев Николай.
Регулярные комбинировнные типы
-классы
-множества
-файлы
Файлы появились вследствие нужды программистов в средствах ввода и вывода во внешние
устройства.
Впервые файлы были реализованы в Паскале, где они стали частью синтаксиса языка.(writeln(i : 8 : 4) -
такую запись можно написать если в синтаксисе есть правила задания действительных чисел)
Однако правильно ли это? Оказалось, что нет. Со временем стало понятно, что ввод вывод – часть
операционной системы. И правильнее средства ввода и вывода держать в стандартных библиотеках
операционных систем, нежели встраивать в синтаксис языка, и при нужде в свой код эти библиотеки просто
напросто подключать. Это делает код более переносимым(мобильным). Так поступили в С, С++.
Множества также впервые появились в Паскале.
Cтандартный базис операций на множествами:
• set of T : T – множество
• a in T: принадлежит ли a множеству T?
• * S1+S2: объединение множеств
• S1*S2 : пересечение множеств
• S1-S2 : разность двух множеств
• [x] + S: добавить элемент х в множество
• S - [x]: вычесть элемент из множества
Классический пример применения множества - нахождение простых чисел с помощью решета Эратосфена.
Однако удобно ли это? В Паскале множества были реализованы в виде битовой шкалы - структуре данных,
реализованной на каком-либо целочисленном типе данных, где каждым бит отвечал за присутствие или
отсутствие данного числа в множестве. Вследствие того, что все целочисленные типы данных имеют не более
64 бит, такая структура могла оперировать с множествами небольшой мощности. Поэтому множества в
Паскале были маленькими, ущербными.
Как еще можно реализовать множества? Вариантов много : Хэш - таблицы, сбалансированные деревья
поиска, битовые шкалы, что ещё придумаете. Но надо понимать, что не существует универсальной
реализации для любого случая.
Постепенно множество тоже ушло в стандартную библиотеку(STL C++: MAP, SET, MULTISET)
Строки: В стандарте Паскаля строка - упакованный массив символов. В С - строка массив символов, точнее
чисел, который заканчивается нулевым символом. Хотя существовали операции для сравнения двух строк, все
же строки рассматривались как частный случай массива. И что интересно, по мере развития языков
программирования строки не ушли в стандартную библиотеку, а стали частью синтаксиса языка. Давайте
рассмотрим причины произошедшего? В чем специфика строк?
Первое: операции. Сама частая операция над строками это их конкатенация, потом идет поиск подстроки в
строке, вырезка части строки и тому подобное.
В массиве же самая частая операция - это операция индексации - обращение к определенному элементу
массива. Было принято такое решение – сделать строки неизменяемыми с помощью индексации. И теперь
единственный вариант изменить часть строки - предварительно её скопировать - механизм CopyOnWrite.
Управление последовательностью действий.
Любая программа использует циклы, условные выражения, операторы условия и т.д. - всё это операторы,
управляющие последовательностью действий. Здесь же рассматриваются такие вопросы, как порядок
вычислений в арифметических выражениях, оператор GOTO, структуры ветвления.
До 67 - го года все программисты были наполовину математиками, все рисовали Блок - Схемы, переводили
эти блок - схемы в двоичные коды, активно использовали оператор GOTO. Однако в 67 году вышла статься
голландского учёного Дейскстры о вредности оператора GOTO, и много после этого поменялось. А именно,
это событие зародило начало структурному программированию. Надо сказать, что в 67 - ом году впервые
программистов ограничили, их как бы ущемели, сказали, что использовать GOTO - вредно, и надо именно
упрощать структуру кода, ведь главное это изобретать, а не сидеть часами над кодом. В 68 году вышла статья
"Заметки о структурном программировании". В 66 году была доказана полнота множества операторов:
присваивания + оператор while , то есть любую блок-схему можно было реализовать используя только два
этих оператора. Теоретический базис был положен, и нашел свое отражение в таких языках как С и Паскаль,
которые являются структурными языками. Структуру можно определить как черный ящик, у которого есть
вход и есть выход, а то что происходит с входом заложено внутри черного ящика. У программистов принято в