В языках высокого уровня обращение к ячейкам памяти происходит не через числовые адреса, а посредством описательных имен. Такие имена называются переменными. При объявлении переменной, принадлежащей к некоторому типу данных на стадии компиляции определяется адрес (относительный) размещения данных, размер данных и их формат. Кроме того, в строго типизированных языках, тип данных определяет диапазон допустимых значений переменных и набор допустимых операций. Структуры данных Алгоритмы + Структуры данных = Программы - Н. Вирт
Простые (базовые) типы данных: целый, вещественный, булевский, символьный Новый (пользовательский) простой тип данных, например: Тип действ вещ Тип день=( Понед, Вторник, Среда, Четверг, Пятница, Суббота, Воскресенье) Тип пол=(муж, жен) день d d=Среда //OK d=9 //Error d=4 // Зависит от компилятора d=(день) 4 //OK пол man hb=муж //OK hb= 3 //Error hb=1 // Зависит от компилятора hb=(пол) 1 //OK [литералы, символьные константы]
Составные типы данных (структуры данных): массивы, структуры (записи). Массив состоит из компонент одного типа, расположенных последовательно в памяти. Последнее обстоятельство позволяет ввести индексацию («адресацию») массива. Структура (запись) состоит из компонент разного типа, расположенных последовательно в памяти. Пример: целый a(5) a(0)=12 //OK a(2)=187 //OK a(5)=21 //Error a(1)=2.54 //Error a(1)=(целый)2.54 //OK Структура Моя_Стр целое a символ b вещ с Конец-структура Моя_Стр->a=456 Моя_Стр->b='d' Моя_Стр->c=1.785 Пример:
вещ X(5) символ a символ b(7) целое d1, d2 a='S' b(0)='S' b(1)='t' b(6)='g' b(7)=0 X(0)=0.87 X(1)= X(4)= d1.785
0 C:5 97A4F010 целый (у)a a=0 целый (у)a=Выделить(2) a(0)=0x97A4 a(1)=0xF010 или (зн)a=0x97A4 (зн)(a+1)=0xF010 При объявлении переменной посредством указателя память для этой переменной может выделяться динамически во время исполнения программы.
Рекурсивные типы данных: линейные списки (односвязные и двусвязные), деревья и т.д. Внутреннее представление Диаграмма Стек Дек (Deq) Дерево
Структура Тест целое a Тест (у)p Конец-структура Тест (у)Stack=0 Реализация рекурсивных типов данных.
Тест (у)tmp=Выделить(3) tmp->a=41846 tmp->p=Stack Stack=tmp
Структура Тест (у)tmp=Выделить(3) tmp->a=0x1012 tmp->p=Stack Stack=tmp
Процедура push(целое с) Тест (у)tmp=Выделить(3) tmp->a=с tmp->p=Stack Stack=tmp Возврат Конец-прцедура Вызов push(0x112A)
Вызов push(0x2011)
Тест (у)tmp tmp=Stack Stack=Stack->p Освободить(tmp) Процедура Тест pop() Тест (у)tmp tmp=Stack Stack=Stack->p Освободить(tmp) Возврат Конец-процедура
Вызов pop()
#include struct tagStack{ double data; struct tagStack *prev; }*stack=0; void push(double d){ struct tagStack* s; s=malloc(sizeof(struct tagStack)); s->prev=stack; s->data=d; stack=s; } Упражнение: переведите программу на язык Pascal
void pop(){ struct tagStack* tmp; fprintf(stdout, "%g\n", stack->data); tmp=stack; stack=stack->prev; free(tmp); } int main(){ double x; for(x=0.0; x