69119

Динамічні змінні та динамічна пам’ять. Розподіл оперативної пам’яті. Поняття покажчика та його оголошення. Стандартні функції для роботи з адресами

Лекция

Информатика, кибернетика и программирование

Змінні величини, що розглядались у попередніх розділах, були статичними. Статичні змінні характеризуються тим, що їх значення зберігаютъся в ділянках оперативної пам’яті, які визначаються на етапі компіляції программ і не змінюються під час її виконання.

Украинкский

2014-09-30

93.5 KB

6 чел.

Лекція 28. Тема: Динамічні змінні та динамічна пам'ять. 

                          Розподіл оперативної пам'яті. Поняття покажчика та його оголошення. 

                          Стандартні функції для роботи з адресами

План:

1. Динамічні змінні та динамічна пам'ять

2. Розподіл оперативної пам'яті

3. Поняття покажчика та його оголошення

4. Операції над покажчиками

5. Виділення та звільнення динамічної пам’яті

6. Стандартні функції для роботи з адресами

1. Динамічні змінні та динамічна пам'ять

Змінні величини, що розглядались у попередніх розділах, були статичними. Статичні змінні характеризуються тим, що їх значення зберігаютъся в ділянках оперативної пам'яті, які визначаються на етапі компіляції программ і не змінюються під час її виконання. Проте у багатьох задачах обсяг оперативної пам'яті, необхідної для збереження певних даних, неможливо визначита наперед. Для збереження таких даних використовуються змінні, які створюються і знищуються в процесі виконання програми. Такі змінні називаються динамічними, а пам'ять, що для них виділяється, - динамічною пам'яттю. Оскільки обсяг оперативної пам'яті, що використовується для збереження значення динамічної змінної, компілятору не відомий, він не позначає динамічнгу змінну ідентифікатором. Доступ до значення такої змінної здійснюєтъся за її адресою. Отже, на етапі компіляції програми виділяєтъся оперативна пам'ять для збереження адреси динатчної змінної, а пам'ять для збереження її значення виділяєтъся під час виконання програми.

2. Розподіл оперативної пам'яті

Оперативна пам'ять комп'ютера є послідовшстю байтів, або комірок. Розташування таких комірок є впорядкованим, і тому їх можна пронумерувати. Послідовна нумерация байтів цілими числами є зручною з погляду людини, проте процесор використовує інший спосіб доступу до комірок пам'яті — доступ за допомогою адрес. Адреса складаєтъся з двох шістнадцятирічдних чисел, що називаються базисом сегмента та зсуненням. Сегмент — це неперервна область оперативної пам'яті обсягом 64 Кбайт (65 536 байт), що починаєтъся з комірки, номер якої є кратним 16. Базис сегмента — це номер 16-байтової групи, з якої починається сегмент. Таким чином, якщо базис сегмента дорівнює х, то цей сегмент починається з комірки, що має номер 16х Зсунення дорівнює відстані в байтах, на яку комірка віддалена від початку сегмента. В адресі комірки базис сегмента та зсунення записуються, як правило, у шістнадцятковому вигляді і розділяються символом «:». Так, ОООА:ОО1А - це адреса комірки, номер якої дорівнює (А16* 1016) + 1А16= 18610. Зазначимо, що адреси можна зіставляти не лише з окремими комірками, а і з довільними неперервними ділянками пам'яті. Адрссою ділянкн пам'яті вважається адреса її найпершої комірки. Принцип адресації комірок пам'яті ілюструє рис. 10.1.

Середовище програмування Borland Pascal 7.0 підтримує роботу з базовою оперативною пам'яттю, обсяг якої становить 640 Кбайт. Цього обсягу достатньо для розв'язання задач, в яких використовуються структури даних досить великої вимірності. Під час робота програми базова пам'ять комп'ютера розподіляється так.

  Перед виконанням будь-якого ехе-файла виділяється спеціальна область пам'яті, що називається префіксним сегментом програми. Дані з цієї області пам'яті обсяг якої становить 256 байт, використовуються для керування процесом виконання програми. Зокрема, ця область містить адреси підпрограм, що здійснюють обробку переривань під час натискання клавіш Ctrl+Break, обробку критичних помилок операційної системи, завершення програми тощо. Після префіксного сегмента програми розміщується сегмент коду основної програми, обсяг якого становить 64 Кбайт. Кожному програмному   модулю також   виділяється сегмент коду обсягом 64 Кбайт. Крім того, сегмент коду виділяється для модуля SYSTEM, який автоматично приєднується до будь-якої програми, створеної в середовищі Borland Pascal 7.0. Типізовані константи та глобальні змінні, оголошені в розділах const і var основної програми, розташовуються в сегменті даних, що має обсяг 64 Кбайт. За сегментом даних розташований сегмент стеку, обсяг якого становить 16 Кбайт, але може бути змінений директивою компілятора {$M}. Сегмент стеку використовується для тимчасового зберігання адреси, за якою здійснюватиметься повернення до основної програми під час виклику процедури або функції, параметрів, що передаються підпрограмі, а також для зберігання значень оголошених в ній локальних змінних. Решта базової пам’яті є динамічною пам’яттю, що використовується для  збереження значень динамічних змінних. Тому у загальному випадку за допомогою динамічних змінних у пам’яті можна зберігати більші обсяги даних, ніж за допомогою статитних.

Отже, динамічна пам'ять є неперервним масивом байтів. Ця область пам’яті називається купою, або Неар-областю (від лат. heap - купа). Початкова адреса Неар-області зберігаєтъся у стандартній змінній HeapOrg, кінцева адреса – у стандартній змінній HeapEnd. Адреса, якою розділяються зайната та вільна частини купи, зберігається у стандартній змінній HeapPtr. Кожного разу після виділення динамічної пам’яті значення покажчика HeapPtr збільшуєтъся. У базовій пам’яті виділено також спеціальну область для збереження записів, що реєструють рух ділянок купи. У стандартній змінній FreePtr зберігається початкова адреса цієї області пам’яті, а кожний запис у ній міститъ інформацію про розташування певної динамічної змінної.

3. Поняття покажчика та його оголошення

3 погляду програміста, статична змінна складається з ідентифікатора і значення. Після компіляції програми та завантаження її до оперативної пам'ті ту саму змінну можна розглядати як об'єкт, що має адресу і значення. Отже, адресу можна вважати машинним варіантом ідентифікатора змінної. Доступ до динамічних змінних здійснюється лише за їх адресами, але не за ідентифікаторами, оскільки місцезнаходження таких змінних у пам'яті стає відомим лише під час виконання програми. Для збереження адрес динамічних змінних використовуються покажчики — статичні змінні посилального типу. Значенням покажчика є адреса області пам'яті, в якій зберігається певний елемент даних. Цим елементом даних може бути значення змінної або константи, адреса іншої змінної тощо. Для збереження значення покажчика виділяється 4 байт пам'яті. У перших двох байтах записується базис сегмента, у двох інших - зсунення. Якшо область пам'яті, в якій зберігається значення змінної, складається з кількох байтів, покажчик адресує її перший байт. Зазначимо, що покажчик застосовується для посилання не лише на динамічні, але й на статичні змінні. Ця властивість покажчика робнть його потужним засобом непрямого посилання.

У мові Раsсаl розрізняють типізовані та нетипізовані покажчики. Пожакчик, який може посилатися лише на дані певного типу, називаєтъся типізованпм, а відповідний тип даних називається базовим. Для оголошення типізованого покажчика використовується символ «^», який записується перед іменем базового типу даних.

var<ім’я покажчика>: ^<ім’я базового типу>;

Лексема ^<ім'я базового типу> є ідентифікатором певного посилального типу. Проте в розділі оголошень типів даних type для посилалъного типу можна оголосити і окреме ім'я, яке згодом використовуватиметься для оголошення покажчиків у розділі vаr:

type <ім’я посилального типу>= ^<ім’я базового типу>;

var <ім’я покажчика>:<ім’я посилального типу>;

Існує правило, згідно з яким будь-який ідентифікатор у мові Раsсаl вперше має згадуватнсь у його оголошенні. Це правило не розповсюджується на ідентифікатори типів даних, що згадуються як базові типи в оголошеннях покажчиків. Інакше кажучи, можна огалосити покажчик на змінні ще не оголошеного базового типу.

Наведемо приклади оголошення типізованих покажчиків.

type        {оголошення типів}

   vector = array[1..5] of integer;

   filetype = file of integer;

   BytePrt = ^Byte;     {тип покажчика на змінні типу Byte}

   IdentPrt = ^IdentRec;   {тип покажчика, що посилається на ще не оголошений тип запису}

   IdentRec = record      {тип запису, компонентом якого є покажчик типу IdentPrt}

                      Ident:string[15];

                      Next:IdentPrt;

                  end;

   ArrayPrt = ^vector;     {тип покажчика на масиви типу vector}

   TextPtr = ^text;       {тип покажчика на текстові файли}

   FilePtr = ^filetype;    {тип покажчика на типізовані файли}

var

   pbyte : BytePtr;

   prec : IdentPtr;

   parray : ArrayPtr;

   pfile : FilePtr;

Нетипізований покажчик не зв'язується з певним типом даних і оголошується як змінна типу pointer. Такі покажчики доцільно використовувати для посилання на данні, тип і структура яких змінюються під час виконання програми. Оголошення нетипізованих покажчиків здійснюється згідно з таким синтаксисом:

var <ім’я покажчика>:pointer;

4. Операції над покажчиками

Над покажчиками допустимі три операції: присвоєння, порівняння та розіменування. Розглянемо синтаксис і семантику цих операцій.

Покажчику можна присвоїти значення адреси статичної змінної або підпрограми, значення іншого покажчика, а також значення адреси, що його повертає розглянута в розділі 10.1.4 функція Ptr. У такому разі для отримання адреси змінної або підпрограми використовується унарна операція визначення адреси, що позначається символом «@»:

<ідентифікатор покажчика> :=@<ідентифікатор>;

Тут <ідентифікатор> — ім'я змінної будь-якого типу, процедури або функції.

Покажчики можна порівнювати, використовуючи при цьому операції = (рівність) та <> (нерівність). Інші операції порівняння не застосовані до операндів посилального типу. Результат порівняння покажчиків, як і результат будь-якого іншого порівняння, належить до логічного типу даних, і тому операції порівняння покажчиків можна використовувати в булевих виразах, наприклад:

if Ptr1=Ptr2 then writeln (‘pointers are equal’);

Зауважимо, що порівнювати значення покажчиків, а також присвоювати значення одного покажчика іншому можна лише в таких випадках, коли:

принаймні один із покажчиків є нетипізованим;

обидва покажчики посилаютъся на один і той самий базовий тип даних.

Щоб отримати значення, на яке посилається покажчик, потрібно виконати операцію розіменування покажчика. Ця операція позначаєтъся символом «^», що записується після імен покажчика. Її можна записувати як у правій, так і в лівій частині оператора присвоєння:

<ідентифікатор змінної>:=<ідентифікатор покажчика>^;

<ідентифікатор покажчика>^:=<вираз>;

Операцію розіменування можна застосовувати лише до покажчиків, яким надано значення певної адреси динамичної пам'яті. Розглянемо дві змінні: змінну variable типу integer і покажчик ptr на дані типу integer. Нехай покажчику ptr надано адресу змінної variable, тобто виконано операцію ptr:=@variable. Тоді значення виразів variable i ptr^ завжди будуть однаковими. Якщо ж присвоєння ptr:=@variable замінити операцією ptr^:=variable, то змінні ptr^ та variable будутъ різними, хоча, можливо, і матимутъ протягом певного часу однакові значення. У прикладі 10.1 наведені й інші варіанти використання операцій із покажчиками.

Зазначимо, що результат розіменування нетипізованого покажчика має невизначений тип, і тому вираз ptr^, де ptr — нетипізований покажчик, не може входити до складу інших виразів.

Нарешті, спробуємо встановити, яке значення має ще не ініціалізований покажчик. У більшості випадків компілятор надає йому спеціальне значення, що позначається зарезервованим словом nil . Якщо значення певного покажчика становить ni1 , то вважається, що покажчик не посилається на жоден елемент даних. Тому значення ni1 називають ще порожньою адресою. Результат розіменування покажчика, значення якого дорівнює ni1 , є непередбачуваним.

Приклад 10.1

Наведемо програму, що призначена для демонстрації принципів використання операцій над покажчиками. Зазначимо, що покажчики не можна використовувати як аргументи підпрограм. Із цього, зокрема, випливає внсновок про неможливість надрукувати значення покажчика за допомогою стандартних процедур write i writeln. Спроба зробити це призведе до появи помилки Егтог 64: Сannot Read or Write variables of this type (Не можна вводити або виводити змінні даного типу.). Тому значення покажчиків, використані в програмі ех10_1, можна переглядати лише під час налагодження програми у вікні Watch. Зв'язок між покажчиком і динамічною змінною, на яку він посилається, проілюстрованний на рис. 10.2. Результати робота програми ех10_1 зображено на рис. 10.3.

program ex10_1;

uses ctr;

type

   vector = array [1..5] of integer;

   typefile = file of integer;

   IdentPtr = ^IdentRec;

   IdentRec = record

            Ident:string[15];

            Next:IdentPtr;

   end;

var pbyte : ^Byte;

   pint1,pint2 : ^integer;

   parray : ^vector;

   pfile : ^typefile;

   untyped : pointer;

   prec : IdentPtr;

   x : byte;

   y : integer;

   arr : vector;

   f : file of integer;

  list : IdentRec;

begin

  clrscr;

  y :=1;

  pint1 :=@y;

  y :=2;

  pint1 :=@y;     {покажчики pint1 та pint2 посилаються на ту самузмінну - у}

  write(‘pint1 and pint2 are the same: ’);

  writeln(‘(pint1=pint2)=’,pint1=pint2);    {порівняння покажчиків}

  writeln(‘pint1^=’,pint1^,’pint2^=’,pint2^,’y=’,y);

  pbyte :=@x;

   untyped :=pbyte;    {використання нетипізованого}

   pint1:=untyped;    {покажчика, pint1 та pbyte}

   x:=4;      {посилаються на одну й ту саму змінну}

   writeln(‘pbyte^=’,pbyte^,’pint1^=’,pint1^,’x=’,x);{використання покажчиків для посилання на елементи масивів та записів}

   parray:=@arr;

   parray^[1]:=1;

   prec:=@list;

   prec^.Ident:=’Pointers !!!’;

   writeln(‘arr[1]=’,arr[1],’parray^[1]=’,parray^[1]);

   write(‘list.Ident=’,list.Ident);

   write(‘prec^.Ident=’,prec^.Ident);{використання покажчика на файлову змінну }

   assign(f,’newfile.txt’);

   pfile:=@f;

   rewrite(f);

   write(pfile^,y);   {до файлу ‘newfile.txt’ буде записано}

   close(pfile^);  {значення змінної у}

   readln;

end.

5. Виділення та звільнення динамічної пам’яті

У мові Pascal використовуються три методи роботи з пам’яттю, яка динамічно розподіляється:

за допомогою процедур New i Dispose;

за допомогою процедур GetMem i FreeMem;

за допомогою процедур Mark i Release;

Процедура New виділяє область динамічної пам’яті з урахуванням типу покажчика  і присвоює адресу пам'яті. що виділена, цьому покажчикові. Отже, процедура New створює динамічну змінну того типу, що є базовим для покажчика. Якщо покажчик посилається на тип даних, для якого потрібно пам’яті більше, ніж доступно для розподілу в Неар-області, компілятор генерує помилку Error 203: Heap overflow error (переповнення купи). Синтаксис виклику процедури New є таким:

New(<ідентифікатор покажчика>);

Процедуру New можна викликати як функцію, що повертає значення покажчика на тип даних, який передається процедурі як параметр. Наприклад, якщо означено посилальний тип indicator=^integer і покажчик ptr:indicator, то наступні два оператори єквівалентні:

New(ptr);

ptr:=New(indicator);

Використання покажчиків, яким не було надано певного значення за допомогою процедури New або операції отримання адреси @, може призвести до непередбачуваних наслідків.

Процедура Dispose звільняє область динамічної пам'яті, на яку посилається її параметр-покажчик, після чого ця область стає доступною для розподілення між іншими динамічними змінними. Отже, процедура Dispose видаляє динамічну змінну, що адресується її параметром-покажчиком. Синтаксис виклику процедури Dispose такнй;

Dispose(<ідентифікатор покажчика>);

Процедура Dispose не змінює значення покажчика, а лише повертає до купи пам'ять, що раніше була з ним зв'язана. Застосування процедури до порожнього покажчика призведе до виникнення помилки Егтог 204: Invalid point operation (Неприпустима операція з покажчиком.).

Для роботи з нетипізованими покажчиками можна використовувати процедури GetMem i FreeMem. Процедура GetMem виділяє область динамічної пам'яті заданого обсягу. Початкова адреса області пам'яті, яка буде виділена, запам'ятовується у покажчику, що є параметром процедури. Виклик процедури GetMem має такий синтаксис:

GetMem(<ідентифікатор покажчика>,<обсяг пам’яті>);

Тут <ідентифікатор покажчика> — змінна типу pointer; <обсяг пам'яті> — змінна або вираз типу word. Обсяг пам'яті задається в байтах. Обсяг пам'яті, що виділяється для однієї динамічної змінної, не може перевищувати 65 521 байт. Крім того, не можна виділити ділянок пам'яті, довжина яких перевищує довжину найбільшої вільної ділянки в купі, що її повертає функція МахАvаil. Тому для забезпечення коректності роботи процедури GetMem бажано перед її викликом перевіряти наявність достатньо великої вільної ділянки пам'яті

if MaxAvail>9999 then

   GetMem(ptr,10000)

else

   write(‘No sufficient memory’);

Зазначимо, що загальний обсяг усіх вільних ділянок динамічної пам'яті обчислює функція MemAvail.

Процедура FreeMem звільняє пам'ять, адресовану покажчиком, який є параметром процедури. Обсяг пам'яті, що звілъняється, зазначається як другий параметр процедури FreeMem. Наведемо синтаксис виклику процедури:

FreeMem(<ідентифікатор покажчика>,<обсяг пам’яті>);

Слід пам’ятати, що розподіл динамічної пам'яті за допомогою процедури GetMem потребує її звільненя за допомогою процедури FreeMem. Під час застосування цих процедур до одного й того самого покажчика значення параметрів, що задають обсяг динамічної пам'яті, мають збігатися.

У результаті багатьох викликів процедур New i Dispose, а також GetMem i FreeMem динамічна пам'ять фрагментується. В ній з'являються несуміжні вільні ділянки. Щоб мати можливість звільняти динамічну пам'ять, використовуються процедури Mark i Release.

Синтаксис виклику цих процедур такий:

Mark(<ідентифікатор покажчика>);

Release(<ідентифікатор покажчика>);

Процедура Mark запам'ятовує поточне значення покажчика HеapPtr у покажчику, що є параметром процедури. Нагадаємо,що покажчик HeapPtr містить адресу початку вілъної динамічної пам'яті. Процедура Release починаючи від комірки, що адресується параметром процедури, до кінця динамічної пам’яті. Один виклик процедури Release знищує список усіх вільних фрагментів у динамічній пам'яті, створених викликами процедури Dispose, а також усі динамічні змінні, створені після виклику процедури Mark. Використовувати два різні механізми звільнення динамічної пам'яті(за допомогою процедур Dispose i Release) в межах однієї програми небажано, оскільки доведеться стежити за тим, щоб процедура Dispose не звільняла змінні, що вже були звільнені процедурою Release.

Приклад 10.2

Програма ех10_2 демонструє механізм роботи процедур New i Dispose, а також Mark i Release. Стан динамічної пам'яті під час роботи програми показано на рис.10.4.

program ex10_2;

var

  ptr,p1,p2,p3,p4:^integer;

begin

  New(p1);   {виділити пам’ять для цілого числа}

  Mark(ptr);   {запам’ятати адресу початку вільної області}

  New(p2);   {виділити пам’ять ще для трьох цілих чисел}

  New(p3);   

  New(p4);   

  Dispose(p3);  {звільнити пам’ять від p3^}

  Release(ptr);  {звільнення пам’яті від p2^,p3^,p4^}

 {Dispose(p4); помилка: змінну p4^ вже видалено!!!}

end.  

6. Стандартні функції для роботи з адресами

Мова Раsсa1 не дає можливості записувати адреси як константи, а також виконувати арифметичні операції безпосередньо над адресами. Проте ці дії можна виконати за допомогою стандартних функцій, які будуть розглянуті нижче.

Функція Addr використовується для отримання адреси змінної або підпрограми може застосовуватися замість операції визначення адреси @. Формат виклику функції Addr є таким:

<ідентифікатор покажчика> := Addr(<ім'я змінної або підлрограми>);

Функція Cseg повертає значення типу word, що зберігається в регістрі СS процесора. Коли програма починає роботу, в регістр СS завантажується базис сегмента коду програми. Функція не має параметрів.

Функція Оfs повертає значення типу word. Це значення дорівнює зміщенню адреси змінної, яка зберігається в сегменті даних, або зміщенню адреси підпрограми,  що записана у сегменті коду. Синтаксис виклику функції такий:

<ідентифікатор змінної типу word>:=Ofs(<ім’я змінної або підпрограми>);

Функція Ptr перегворює пару цілих чисел — значення базису сегмента та значення зсунення — на адресу, тобто на значення типу pointer. Виклик функції має такий синтаксис:

<ідентифікатор покажчика>:=Рtr(<Segment>.<Offset>);

Туг <ідентифікатор покажчика> - ідентифікатор змінної типу pointer; <Segment> -базис сегмента; <Offset> — зсунення елемента даних у межах сегмента.

Контрольні питання

1. Динамічні змінні та динамічна пам'ять

2. Розподіл оперативної пам'яті

3. Поняття покажчика та його оголошення

4. Операції над покажчиками

5. Виділення та звільнення динамічної пам’яті

6. Стандартні функції для роботи з адресами


 

А также другие работы, которые могут Вас заинтересовать

81001. Категории детей с нарушениями зрения, их развитие и обучение 28.26 KB
  Кроме того следует отметить что в школьной практике очень часто встречаются прогрессирующие нарушения зрения: близорукость и дальнозоркость. Принимая за основу степень нарушения зрительной функции детей со стойкими дефектами зрения делят на слепых и слабовидящих. Различают разные степени потери зрения: ♦ абсолютная слепота при которой полностью отсутствуют зрительные ощущения светоощущение и цветоразличие; ♦ практическая слепота при которой сохраняется или светоощущение на уровне различения света от темноты или остаточное зрение...
81002. Категории детей с речевыми нарушениям, их развитие и обучение 30.41 KB
  Дисфония – отсутствие или расстройство фонации вследствие патологических изменений голосового аппарата. Проявляется либо в отсутствии фонации (афония), либо в нарушении силы, высоты и тембра голоса (дисфония).
81003. Категории детей с нарушениями опорно-двигательного аппарата. Развитие и обучение детей с церебральным параличом 27.91 KB
  Развитие и обучение детей с церебральным параличом Отмечают различные виды патологии опорнодвигательного аппарата. Эти расстройства обнаруживаются у детей уже в первые месяцы жизни ребенка. Нарушения интеллектуального развития часто незначительны и многие из таких детей могут обучаться в массовой школе.
81004. Категории детей со сложным (комбинированным) дефектом. Особенности развития и обучения слепоглухонемых детей 29.08 KB
  Особенности развития и обучения слепоглухонемых детей К сложным нарушениям детского развития относят сочетание двух или более психофизических нарушений зрения слуха речи умственного развития и др. Разделение детей со сложными нарушениями по выраженности каждого из имеющихся дефектов позволяет определить их основные трудности и построить программу их обучения и воспитания. Возможность социальной адаптации таких детей включение их в организованное обучение во многом определяются тем в каком возрасте наступила потеря зрения и слуха.
81005. Развитие аутичных детей, особенности коррекционной работы с ними 34.07 KB
  Дети I группы 8 с аутистической отрешенностью от окружающего характеризуются наиболее тяжелыми нарушениями психического тонуса и произвольной деятельности. Эти дети мутичны. Наиболее тяжелые проявления аутизма: дети не имеют потребности в контактах не осуществляют даже самого элементарного общения с окружающими не овладевают навыками социального поведения самообслуживания. Дети II группы 62 с аутистическим отвержением окружающего характеризуются определенной возможностью активной борьбы с тревогой и многочисленными страхами за счет...
81006. Особенности развития детей-психопатов, особенности коррекционной работы с ними 30 KB
  Врожденная недостаточность отдельных мозговых систем проявляется в ряде особенностей личности и поведения детей. Для детей этой категории характерны: замкнутость повышенная впечатлительность вялость нерешительность боязнь нового затруднения в общении с детьми предпочтение общества взрослых. Движения таких детей неловки медлительны.
81007. Коррекционное обучение и воспитание детей с психопатическими формами поведения 28.34 KB
  Несмотря на то что интеллект у детей с органической психопатией не нарушен продуктивность в обучении у них часто бывает недостаточно высокой поскольку они приступают к выполнению задания без предварительного обдумывания не сосредоточены на нем. Этих детей не затрудняет усвоение чтения письма и счета но они плохо вовлекаются в деятельность не доводят начатой работы до конца выполняют ее небрежно неряшливо. Следовательно самое главное при обучении детей с органической психопатией настойчиво приучать их к тщательному выполнению...
81008. Особенности коррекционной работы с детьми, имеющими астеническое, реактивное состояние, конфликтные переживания 31.78 KB
  Причины течения данных нарушений разные но их объединяет следующее: у этих детей нет органического поражения головного мозга. Во время работы у таких детей быстро наступает утомляемость происходит нервное истощение возникают головные боли. Особенности астении при заболевании внутренних органов наиболее характерно проявляются у детей с медленно текущей туберкулезной интоксикацией. Эмоциональное состояние у таких детей нестабильное поэтому они чутко реагируют на неблагоприятную обстановку в классе и дома.
81009. Психолого-педагогические методы коррекции 31.95 KB
  Общепедагогические методы: словесные методы наглядные практические методы стимулирования метод оценки. Специфические методы коррекции: метод игнорирования метод переключения внимания на другую деятельность метод испытаний метод естественных последствий метод фиктивной выдуманной коррекции метод заставания врасплох метод парадоксальной интенции метод обратного действия.Словесные методы Преподаватель свои общепедагогические и специфические функции в значительной мере реализует с помощью слова: ставит перед занимающимися задачи...