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












![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; типизированный](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-14.jpg)




![Type mas=array[1. . 100] of real; Var p 1: ^integer; p Type mas=array[1. . 100] of real; Var p 1: ^integer; p](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-19.jpg)

![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;](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-21.jpg)




![Type mas=array[1. . 10] of integer; Var b: ^mas; {указатель на массив Type mas=array[1. . 10] of integer; Var b: ^mas; {указатель на массив](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-27.jpg)

![type massiv=array [1. . 1000, 1. . 1000] of integer; var mas: type massiv=array [1. . 1000, 1. . 1000] of integer; var mas:](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-29.jpg)
![type massiv=array [1. . 1000, 1. . 1000] of integer; var mas: ^massiv; type massiv=array [1. . 1000, 1. . 1000] of integer; var mas: ^massiv;](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-30.jpg)




![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.](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-36.jpg)



![Сделаны следующие описания: type massiv=array[1. . 10000] of real; Сделаны следующие описания: type massiv=array[1. . 10000] of real;](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-41.jpg)
![Сделаны следующие описания: Type mas=array[1. . 20] of real; Var b: Сделаны следующие описания: Type mas=array[1. . 20] of real; Var b:](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-42.jpg)
![Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real; Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real;](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-43.jpg)
![Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real; Сделаны следующие описания: Type mas=array[1. . 20, 1. . 20] of real;](https://present5.com/presentation/3/38480991_156015229.pdf-img/38480991_156015229.pdf-44.jpg)
Динамические переменные2012.ppt
- Количество слайдов: 40
Устройства Устройства ввода вывода Системная магистраль (шина) Процессор Память Внутренняя Внешняя оперативная постоянная
Оперативная память ОС и Область данных Свободная память Код программы другие программы Сегмент данных Стек
Сегмент данных (64 Кб) - предназначен для хранения: § типизированных констан (Const), § глобальных переменных (Var). Стек (16 Кб) - предназначен для хранения : § локальных переменных, § параметров процедур и функций.
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 [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) Динамическая память Классификация переменных, в зависимости от способа выделения памяти: 3) Статические переменные 4) Динамические переменные
Динамическая переменная - переменная, которая создается и уничтожается в динамической памяти по ходу выполнения программы. Особенности § не описываются заранее в разделе Var и не имеют своего собственного имени; § размещаются в куче (динамическая память); § память под них захватывается (выделяется) в соответствиями с инструкциями программы; § работать с переменными в куче можно только через указатели.
Адрес ячейки памяти Содержимое 0000101011101010 0101 Указатель - это переменная, предназначенная для хранения адреса памяти. Указатель занимает четыре байта в памяти.
1. Типизированный указатель — это указатель на переменную определенного типа . При описании используется символ ^ ( каре, крышка) перед указанием типа данных. 2. Нетипизированный указатель — это адрес первого байта области памяти, в которой может размещаться любая информация вне зависимости от ее типа. При описании используется зарезервированное слово pointer.
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 означает, что указатель не ссылается на какую- либо конкретную ячейку памяти. 2. Проверка на равенство и неравенство: if p 1=p 2 then … ;
3. Операция получения указателя на переменную @ 4. Функция получения указателя на переменную addr(<имя переменной>) var w: word; pw: ^word; . . . pw: =@w; {или} pw: =addr(w);
5. Операция разадресации (разыменов а ния). Предназначена для обращения к значению динамической переменной, адрес которой хранится в указателе. Обозначается с помощью символа ^ справа от имени указателя. Например: var pw: ^word; Begin pw^: =2; inc(pw^); writeln(pw^);
Для типизированных указателей: Процедура new(p), где p – типизированный указатель Для указателей типа pointer: Процедура getmem(p: pointer; size: word ) где size – размер захватываемой памяти в байтах. Эту процедуру можно применять и для типизированных указателей.
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) — освобождает память, на которую указывал указатель p; Для нетипизированных указателей : freemem(p, size) — освобождает size байтов, начиная с адреса на который указывает указатель р. Замечание Значение указателя после вызова этих процедур становится неопределенным.
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 — возвращает количество байт, которая занимает переменная х 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; 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 для работы с динамическими структурами данных.
Задан одномерный массив 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; {указатель на массив целых чисел} 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
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; {указатель на массив целых чисел} 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 — возвращает общий размер свободной памяти в байтах; § Max. Avail — возвращает размер наибольшего непрерывного участка свободной памяти. Например: {проверяем хватит ли памяти под переменную} if n*n*sizeof(integer)< Max. Avail then freemem(mas, n*n*sizeof(integer));
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. . 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, для чего повторить теоретические сведения по теме «Статическое и динамическое распределение памяти. Указатели» При повторении можно использовать следующие источники на выбор: § собственный конспект лекций; § cборник презентаций «Курс лекций Pascal» (KIT/Федорчук/ОАИП/Лекции/); § электронная книга «Программирование на языке Pascal» , Рапаков Г. Г. , Ржеуцкая С. Ю. гл. 18 стр. 339 -350 (KIT/Федорчук/ОАИП/Литература/).
Сделаны следующие описания: 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; Выберите допустимые присваивания: 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; 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: ^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; 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; Var b: ^mas; n, i, k: integer; Begin write(‘Введите размерность массива N’); readln(n); getmem(b, n*n*sizeof(real)); …

