Устройства Устройства ввода

Скачать презентацию Устройства    Устройства  ввода Скачать презентацию Устройства Устройства ввода

Динамические переменные2012.ppt

  • Количество слайдов: 40

>Устройства    Устройства  ввода    вывода   Системная Устройства Устройства ввода вывода Системная магистраль (шина) Процессор Память Внутренняя Внешняя оперативная постоянная

>     Оперативная       память Оперативная память ОС и Область данных Свободная память Код программы другие программы Сегмент данных Стек

>Сегмент данных (64 Кб) - предназначен для хранения: § типизированных констан (Const),  § Сегмент данных (64 Кб) - предназначен для хранения: § типизированных констан (Const), § глобальных переменных (Var). Стек (16 Кб) - предназначен для хранения : § локальных переменных, § параметров процедур и функций.

>Program primer 1; Var s, a, b: real;      Program primer 1; Var s, a, b: real; Область данных function Sum(x, y: real): real; Сегмент Стек begin данных sum: =x+y; s x end; begin write('Введите значения а и b'); readln(a, b); a y s: =Sum(a, b); writeln(‘Сумма: ’, s); end. b

>Program primer 1; Var    Сегмент данных N: byte;  a: array Program primer 1; Var Сегмент данных N: byte; a: array [1. . 100] of integer; n 5 … a Begin … write('Введите значение N'); readln(n); for i: =1 to n do a[i]: =random(50); … end.

>Анализируются два основных фактора: § время выполнения алгоритмов, § требуемый объем памяти.  Вывод Анализируются два основных фактора: § время выполнения алгоритмов, § требуемый объем памяти. Вывод - объявлять массив из десятков и сотен тысяч элементов на всякий случай - не рационально!!!

>     Оперативная       память Оперативная память ОС и Область данных Свободная память Код программы другие программы Динамическая Статическая память память

>Динамическая память - это оперативная память компьютера, предоставляемая программе при ее работе, за вычетом Динамическая память - это оперативная память компьютера, предоставляемая программе при ее работе, за вычетом кода программы, сегмента данных и стека. Размер по умолчанию - определяется всей доступней памятью ПК и, как правило, для Pascal составляет не менее 200. . 300 Кбайт.

>Существуют следующие способы выделения памяти под переменные: 1) Статическая память 2) Динамическая память Классификация Существуют следующие способы выделения памяти под переменные: 1) Статическая память 2) Динамическая память Классификация переменных, в зависимости от способа выделения памяти: 3) Статические переменные 4) Динамические переменные

> Динамическая переменная - переменная, которая создается и уничтожается в динамической памяти по ходу Динамическая переменная - переменная, которая создается и уничтожается в динамической памяти по ходу выполнения программы. Особенности § не описываются заранее в разделе Var и не имеют своего собственного имени; § размещаются в куче (динамическая память); § память под них захватывается (выделяется) в соответствиями с инструкциями программы; § работать с переменными в куче можно только через указатели.

>  Адрес ячейки памяти  Содержимое 0000101011101010  0101  Указатель - это Адрес ячейки памяти Содержимое 0000101011101010 0101 Указатель - это переменная, предназначенная для хранения адреса памяти. Указатель занимает четыре байта в памяти.

>1. Типизированный указатель  —  это  указатель на переменную определенного  типа 1. Типизированный указатель — это указатель на переменную определенного типа . При описании используется символ ^ ( каре, крышка) перед указанием типа данных. 2. Нетипизированный указатель — это адрес первого байта области памяти, в которой может размещаться любая информация вне зависимости от ее типа. При описании используется зарезервированное слово pointer.

>Type mas=array[1. . 100] of real;  k=^word; Var p 1: ^integer; типизированный Type mas=array[1. . 100] of real; k=^word; Var p 1: ^integer; типизированный указатель p 2: ^string; типизированный указатель pmas: ^mas; типизированный указатель x: k; типизированный указатель p 3: ^pointer; нетипизированный указатель …

>1. Присваивание:  p 1: =p 2;  p 1: =nil; Стандартная константа nil 1. Присваивание: p 1: =p 2; p 1: =nil; Стандартная константа nil означает, что указатель не ссылается на какую- либо конкретную ячейку памяти. 2. Проверка на равенство и неравенство: if p 1=p 2 then … ;

>3.  Операция получения указателя на переменную @ 4.  Функция получения указателя на 3. Операция получения указателя на переменную @ 4. Функция получения указателя на переменную addr(<имя переменной>) var w: word; pw: ^word; . . . pw: =@w; {или} pw: =addr(w);

>5. Операция разадресации  (разыменов а ния).      Предназначена 5. Операция разадресации (разыменов а ния). Предназначена для обращения к значению динамической переменной, адрес которой хранится в указателе. Обозначается с помощью символа ^ справа от имени указателя. Например: var pw: ^word; Begin pw^: =2; inc(pw^); writeln(pw^);

>Для типизированных указателей:  Процедура new(p),  где p – типизированный указатель  Для Для типизированных указателей: Процедура new(p), где p – типизированный указатель Для указателей типа pointer: Процедура getmem(p: pointer; size: word ) где size – размер захватываемой памяти в байтах. Эту процедуру можно применять и для типизированных указателей.

>Type  mas=array[1. . 100] of real; Var  p 1: ^integer;  p Type mas=array[1. . 100] of real; Var p 1: ^integer; p 2: ^string; pmas: ^mas; p 3: ^pointer; begin New(p 1); New(p 2); New(pmas); Get. Mem(p 3, 6); p 1^: =5; P 2^: =‘любая строка текста’; Pmas^[i]: =5. 6; p 3^: =123. 567; …

>Для типизированных указателей :  dispose(p)  — освобождает память, на которую указывал указатель Для типизированных указателей : dispose(p) — освобождает память, на которую указывал указатель p; Для нетипизированных указателей : freemem(p, size) — освобождает size байтов, начиная с адреса на который указывает указатель р. Замечание Значение указателя после вызова этих процедур становится неопределенным.

>Type mas=array[1. . 20] of real; Var  pmas: ^mas;  p 1: ^integer; Type mas=array[1. . 20] of real; Var pmas: ^mas; p 1: ^integer; p 2: ^string; p 3: ^pointer; Begin New(p 1); New(p 2); New(pmas); Getmem(p 3, 6); … Dispose(p 1); Dispose (p 2); Dispose (pmas); Freemem(p 3, 6); …

> Size. Of(x): word — возвращает количество байт,    которая занимает переменная Size. Of(x): word — возвращает количество байт, которая занимает переменная х type massiv 2=array[1. . 1000, 1. . 1000] of integer; var n: word; { реальное количество элементов массива} p: ^massiv; begin Get. Mem(p, n*n*sizeof(integer)); … Free. Mem(p 2, n*n*sizeof(integer));

>{1 – объявление указателей под динамические переменные}  Var   p 1: ^integer; {1 – объявление указателей под динамические переменные} Var p 1: ^integer; p 3: pointer; … {2 - захват памяти под динамические переменные} New(p 1); getmem(p 3, 200); … {3 - работа с динамическими переменными} p 1^: =5; write(p 2^); {4 - освобождение памяти динамических переменных} Dispose(p 1); freemem(p 3, 200);

>  Динамические переменные используются в основном в двух ситуациях:  y для работы Динамические переменные используются в основном в двух ситуациях: y для работы с массивами больших размеров; y для работы с динамическими структурами данных.

> Задан одномерный массив B состоящий из 10 -ти случайных элементов целого типа в Задан одномерный массив B состоящий из 10 -ти случайных элементов целого типа в диапазоне [-15. . 50]. Разработать программу, в которой необходимо подсчитать количество нулевых элементов динамического массива B. - 0 23 41 0 0 13 37 -3 0 14

>Type  mas=array[1. . 10] of integer; Var  b: ^mas; {указатель на массив Type mas=array[1. . 10] of integer; Var b: ^mas; {указатель на массив целых чисел} i, {индекс элемента массива} k: integer; {количество нулевых элементов} Begin randomize; k: =0; new(b); {Захват памяти под массив} {Заполнение, вывод на экран элементов массива, подсчет количества нулевых элементов} for i: =1 to 10 do begin b^[i]: =random(50)-15; write(b^[i]: 4); if b^[i]=0 then inc(k); End; dispose(b); {Освобождение памяти из под массива} writeln(’ k=’, k); End.

>  Задана квадратная матрица A размерностью N (2<N<= 100 0) , состоящая из Задана квадратная матрица A размерностью N (2

>type  massiv=array [1. . 1000, 1. . 1000] of integer; var  mas: type massiv=array [1. . 1000, 1. . 1000] of integer; var mas: massiv; { массив целых чисел} n, i, j: integer; {размерность, индексы массива} s: longint; {сумма элементов массива} Begin writeln(‘введите размерность массива n’); readln(n); s: =0; for i: =1 to n do begin for j: =1 to n do begin mas[i, j]: =random(50); write(mas[i, j]: 4); s: =s+mas[i, j]; end; writeln; End; writeln(’ s=’, s);

>type  massiv=array [1. . 1000, 1. . 1000] of integer; var mas: ^massiv; type massiv=array [1. . 1000, 1. . 1000] of integer; var mas: ^massiv; {указатель на массив целых чисел} n, i, j: integer; {размерность, индексы массива} s: longint; {сумма элементов массива} begin readln(n); s: =0; getmem(mas, n*n*sizeof(integer)); for i: =1 to n do begin for j: =1 to n do begin mas^[i, j]: =random(50); write(mas^[i, j]: 4); s: =s+mas^[i, j]; end; writeln; End; freemem(mas, n*n*sizeof(integer)); writeln(’ s=’, s); end.

>§ Mem. Avail — возвращает общий размер    свободной памяти в байтах; § Mem. Avail — возвращает общий размер свободной памяти в байтах; § Max. Avail — возвращает размер наибольшего непрерывного участка свободной памяти. Например: {проверяем хватит ли памяти под переменную} if n*n*sizeof(integer)< Max. Avail then freemem(mas, n*n*sizeof(integer));

>Mark(p) - запоминает в указателе р адрес начала области динамической памяти; Release (р) - Mark(p) - запоминает в указателе р адрес начала области динамической памяти; Release (р) - очищает всю память, начиная с адреса р.

> Динамическая переменная - переменная, которая создается и уничтожается в динамической памяти по ходу Динамическая переменная - переменная, которая создается и уничтожается в динамической памяти по ходу выполнения программы. Указатель - это переменная, предназначенная для хранения адреса памяти. Указатель занимает 4 байта в памяти. Var p 1: ^integer; типизированный указатель p 3: ^pointer; нетипизированный указатель

>   Статическая  Динамическая    переменная Тип данных  заранее Статическая Динамическая переменная Тип данных заранее не определен в известен разделе Var Распределение выполняет продумывает памяти под компилятор программист переменную Обращение к выполняется по выполняется переменной в имени через программе указатели

>type  massiv 1=array[1. . 10000] of real;  massiv 2=array[1. . 1000, 1. type massiv 1=array[1. . 10000] of real; massiv 2=array[1. . 1000, 1. . 1000] of integer; var p 1: ^massiv 1; p 2: ^massiv 2; {для массивов постоянных размеров} New(p 1); New(p 2); … Dispose(p 1); Dispose(p 2); {для массивов переменных размеров, где n - реальное количество элементов массива} Get. Mem(p 1, n*sizeof(real); Get. Mem(p 2, n*n*sizeof(integer); … Free. Mem(p 1, n*sizeof(real); Free. Mem(p 2, n*n*sizeof(integer);

> Подготовиться к выполнению лабораторной работы № 15, для чего повторить теоретические сведения по Подготовиться к выполнению лабораторной работы № 15, для чего повторить теоретические сведения по теме «Статическое и динамическое распределение памяти. Указатели» При повторении можно использовать следующие источники на выбор: § собственный конспект лекций; § cборник презентаций «Курс лекций Pascal» (KIT/Федорчук/ОАИП/Лекции/); § электронная книга «Программирование на языке Pascal» , Рапаков Г. Г. , Ржеуцкая С. Ю. гл. 18 стр. 339 -350 (KIT/Федорчук/ОАИП/Литература/).

>Сделаны следующие описания:  var  i, x: integer;   p: ^integer; Выберите Сделаны следующие описания: var i, x: integer; p: ^integer; Выберите допустимые присваивания: 1)x: =@p; 2)p^: =p^+2; 3)p^: =nil; 4)p^: =i+2; 5)p: =addr(i); 6)p: =nil;

>Сделаны следующие описания:  var  i, x: integer;   p: ^integer; Выберите Сделаны следующие описания: var i, x: integer; p: ^integer; Выберите допустимые присваивания: 1)x: =@p; 2)p^: =p^+2; 3)p^: =nil; 4)p^: =i+2; 5)p: =addr(i); 6)p: =nil;

>Сделаны следующие описания:   type   massiv=array[1. . 10000] of real; Сделаны следующие описания: type massiv=array[1. . 10000] of real; pmassiv=^massiv; var p: pmassiv; Сколько памяти будет выделено под переменную P? 1)10000 байт 2)6 байт 3)60 000 байт 4)4 байта 5)40 000 байт 6)4 Кб

> Сделаны следующие описания: Type  mas=array[1. . 20] of real; Var  b: Сделаны следующие описания: Type mas=array[1. . 20] of real; Var b: ^mas; n, i, k: integer; Begin write(‘Введите размерность массива N’); readln(n); new(b); … Сколько памяти будет выделено под переменную b^? 20*6=60 байт 20*size. Of(real)=60 байт

> Сделаны следующие описания: Type  mas=array[1. . 20, 1. . 20] of real; Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real; Var b: ^mas; n, i, k: integer; Begin write(‘Введите размерность массива N’); readln(n); getmem(b, n*sizeof(real)); … Сколько памяти нужно выделить под переменную b^? Исправьте ошибку.

> Сделаны следующие описания: Type  mas=array[1. . 20, 1. . 20] of real; Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real; Var b: ^mas; n, i, k: integer; Begin write(‘Введите размерность массива N’); readln(n); getmem(b, n*n*sizeof(real)); …