Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сука лаби.docx
Скачиваний:
17
Добавлен:
12.05.2015
Размер:
848.39 Кб
Скачать

Додаток 3

Програма-прототип :

Розрахунок значень вхідного струму( у амперах) та вихідної напруги (у вольтах) дільника напруги на двох послідовно з’єднаних резисторах при заданих значеннях напруги джерела (у вольтах) та опорів резисторів (у омах).

#include <iostream.h>

// результати у вигляді структури

struct cur_vol

{

float strum;

float napryga;

};

// функція повертає структуру

cur_vol function(float E,float R1,float R2)

{

cur_vol a;

a.strum = E/(R1+R2);

a.napryga=a.strum*R2;

return a;

}

void main()

{

float e=10, r1=5,r2=5;

cur_vol b=function(e,r1,r2);

cout<<"\n strum="<<b.strum<<" amper";

cout<<"\n napryga="<<b.napryga<<" volt";

}

Лабораторна робота №17

ВИВЧЕННЯ РОЗПОДIЛУ ПАМ"ЯТI

Мета роботи :вивчення розташування різних типів даних у пам’яті комп’ютера ,ознайомлення із способами встановлення класу пам’яті даних та створення динамічних об’єктів ( змінних та масивів) і складання відповідних комп’ютерних програм.

Порядок виконання роботи

А.При пiдготовцi :

1. Ознайомитися із програмами lab14.cpp , lab14a.cpp , lab14b.cpp , у яких наведені приклади роботи із даними різних класів пам’яті . Одномодульна програма lab14.cpp розбита на два модулі lab14a.cpp і lab14b.cpp . Деякі корисні відомості розміщені у додатку А.

2. На базі цих програм скласти програму із двох файлів.

У програмі першого файлу задіяти глобальні : змінну VARG, одновимірний масив А , вказівник PG та інші у разі потреби. У функції main теж треба мати локальні змінні та вказівники для створення автоматичних динамічних масивів .

У другому файлі із функцією ARRAY_PROD ввести у програму статичні змінні та вказівники для збереження інформації при багаторазових зверненнях до функції .

Програма працює за таким алгоритмом:

1. Ввести із клавіатури значення елементів одновимірного глобального масиву А розміру n2 ( значення n вибирає студент ).

2.Із додатних елементів цього масиву у функції main створити динамічний масив B .Для читання масиву А використати глобальний вказівник PG . Передбачити перевірку правильності адресації елемента масиву А , щоб не допустити вихід за межі масиву .

3. Розбити масив А на n рядків і створити двовимірний динамічний масив С m = n * n .

4. Транспонувати масив С та передати його у функцію ARRAY_PROD для ініціювання там автоматичного масиву і обчислення добутку його елементів. Значення добутку передати у перший файл і присвоїти глобальній змінний VARG .Масив у функцію ARRAY_PROD передавати по одному елементу . Задіяти статичні дані.

3. Для визначення розташування змінних, вказівників , масивів у пам’яті передбачити виведення на екран відповідних адрес.

4. Письмово відповісти на контрольне запитання:

Як правильно ініціювати вказівник ?

5.Підготувати шаблон звіту.

В.У лабораторii:

1.Виконати програму lab14.cpp .Побудувати карту пам’яті.

Визначити, як працюють оператори new i delete .

2.Виконати програму із двох файлів lab14a.cpp ,lab14b.cpp

Порівняти результати та зробити висновки.

3. Виконати підготовлену програму. Побудувати карту пам’яті.

4.Заповнити звіт.

Змiст звiту:

1.Алгоритми розрахунків та програми. Результати виконання. 2.Порівняння результатів та відповідні висновки.

3.Пропозиції по роботі.

ДОДАТОК А

Програма пам’яті

(64 K)

Адреси

0

........

0xFFFF

Постійна пам’ять (глобальні дані)

0

.............

Купа (heap)

..........

Стек (stack)

...........

0xFFFF

1. У моделі пам’яті SMALL системи програмування код програми розташовується у першому сегменті пам’яті на 64 К.Тип вказівників NEAR . У другому сегменті на 64 К знаходяться постійна статична пам’ять (глобальні дані, статичні дані , константи ,неініційовані дані ) , динамічна пам’ять (купа) і стек( рис.14.1) . Діапазон адрес 0...0xFFFF (0 ...65535). Вершина стеку за адресою 0xFFFF , при запису у стек адреса вказівника стеку зменшується , тобто стек росте у сторону зменшення адреси. Автоматичні дані записуються у стек.

Рис.14.1.Сегменти пам’яті моделі SMALL.

2. Опис даних

клас_пам’яті тип ім’я = значення;

Клас пам’яті

Область доступу

Час існування

Коментар

EXTERN

програма

програма

неявно поза функцій

STATIC зовнішні

модуль

програма

STATIC внутрішні

блок

програма

AUTO

блок

блок

неявно у функції

REGISTER

блок

блок

Аргумент функції

функція

функція

неявно

3. Вказівники

3.1. void *ptr; // вказівник на будь-який тип

*(тип*) ptr // значення вказаного типу за адресою вказівника

3.2. тип * const ptr = & змінна;

// константний вказівник , вміст постійний

3.3. тип ** ptr ; // подвійна вказівка

приклад

double x; double * ptr1 = &x; double ** ptr2 = & ptr1;

3.4. тип * ptr = new тип; //резервування місця у пам’яті

delete ptr ; //звільнення місця у пам’яті

тип * ptr = new тип [n] ; // для масиву

delete [] ptr ;

функція new повертає 0 , якщо немає місця у пам’яті

3.5. Одновимірний масив тип array1 [n];

array1 - адреса масиву , константний вказівник ;

& array1 [i] (array1 +i ) - адреса елемента масиву;

array1 [i] *( array1 + i) - значення елемента масиву ;

якщо встановити додатковий вказівник на масив

тип * ptr = array1; або тип * ptr = &array1[0]; ,

то тоді

ptr + і - адреса елемента масиву ,

*(ptr + і ) - значення елемента масиву,

*(ptr + + ) – перегляд значень елементів масиву зі зміною вмісту ptr

3.6. Двовимірний масив тип array2 [n1][n2];

array2 - адреса масиву , константний вказівник ,

array2[i] - адреса рядка масиву ,

&array2[i][j] - aдреса елемента масиву ,

array2[i][j] - значення елемента масиву ,

*(*( array2 + i ) + j ) -значення елемента масиву ,

якщо встановити додатковий вказівник на масив

тип * ptr = array2; або тип * ptr = &array2[0][0]; ,

то тоді

(ptr + і*n2 +j) - адреса елемента масиву ,

*(ptr + і*n2 +j) -значення елемента масиву

*(ptr + + ) – перегляд значень елементів масиву зі зміною вмісту ptr ,

для наступного використання вказівника треба у ньому поновити початкову адресу масиву ,наприклад, ptr = ptr - n1*n2;

ДОДАТОК B

/*Лабораторна робота 14 (файл LAB14.CPP)*/

/*Вивчення розподiлу пам"ятi */

#include <conio.h>

#include <iostream.h>

// макрокоманди

#define pt cout << "\n"

#define pta(z) cout << " Address "#z" = "<<&z

#define ptv(v) cout << " Value "#v"= "<<v

#define ptvp(p) cout << " Value at pointer "#p" = "<<*p

//Глобальнi змiнна y1 та вказiвник на змiнну цiлого типу y2

int y1 = 1, *y2;

main ()

{

clrscr(); pt;

//Адреси та значення глобальних даних

pta(y1); ptv(y1); pt; pta(y2); ptv(y2); pt;

y2 = &y1; //встановлення вказiвника у2 на змiнну у1

pta(y2); ptv(y2); ptvp(y2); pt; // новi параметри вказiвника у2

// auto variables and pointers

int x = 10, *x1, **x2, *x3;

pta(x); ptv(x); pt; //address and value of локальної змiнної x

pta(x1); ptv(x1); ptvp(x1); pt; //address and value of вказiвника x1

x1 = &x; //встановлення вказiвника х1 на змiнну х

pta(x1); ptv(x1); ptvp(x1); pt; //новi параметри вказiвника х1

pta(x3); ptv(x3); ptvp(x3); pt; //параметри вказiвника х3

x3 = new int; //резервування мiсця для змiнної

pta(x3); ptv(x3); ptvp(x3); pt; //новi параметри вказiвника х3

x3 = x1; //вказiвники вказують на ту ж саму змiнну х

pta(x3); ptv(x3); ptvp(x3); pt; //новi параметри вказiвника х3

pta(x2); ptv(x2); ptvp(x2); pt; // параметри вказiвника х2

ptv(x3); //значення змiнної х

++x3; //змiна адреси у вказiвниковi

ptv(x3); pt; //значення у пам'ятi за цiєю адресою

*x3 = 100; //запис туди нового значення

x2 = &x3; //запис адреси вказiвника х3 у вказiвник х2-

// створення подвiйної (непрямої) вказiвки на нову змiнну

// iз значенням 100 , у якої немає iменi

pta(x2); ptv(x2); pt; //звернення за значенням до нової змiнної

delete x3;

int a[4]={1,2,3,4}, *a1, i; //описи змiнних

pta(a); pta(a1); pt; //адреси масиву та вказiвника а1

ptvp(a); ptvp(a1); pt; // значення за цими адресами

a1 = a; //встановлення вказiвника а1 на початок масиву

ptv(a1); ptvp(a1); pt; //новi параметри вказiвника а1

int *b; pta(b); ptv(b); ptvp(b); pt; // параметри вказiвника b

b = new int[4]; //створення динамiчного масиву b у пам'ятi

pta(b); ptv(b); ptvp(b); pt; //новi параметри вказiвника b

//запис значень у масив b та виведення на екран

cout << "\n array b \n";

for(i = 0 ;i < 4; i ++)

{

// b[i] = a[i]; //класична адресацiя елементiв масиву

// *b++=*a1++;// адресацiя через вказiвники,змiна значень вказiвникiв

*b ++ = a[i];

// b[i] = *a1++;

// *(b+i)=*(a+i); //адресацiя через вказiвники,але без змiни їх значень

}

b -=4 ; //повернення звернення на початок массиву

for(i = 0; i < 4; i ++)

{

cout << " "<< b[i]; //контроль створення масиву b

}

delete []b; getch();

//динамічні масиви

int a2[3][3]={1,2,3,4,5,6,7,8,9}, a3[3][3], *a4, j;

pt; pta(a2); pta(a3); pta(a4); pt; //адреси масивiв та вказiвника а4

ptv(a2); ptvp(a2); pt; //значення за цими адресами

ptv(a2[0][0]); ptv(a3[0][0]); pt; //значення перших елементiв масивiв

a4 = new int[9]; //створення динамiчного масиву а4 у пам'ятi

pta(a4); ptvp(a4); pt; //новi параметри вказiвника а4

// iнiцiалiзацiя масивiв а3 та а4

cout << "\n array a3 \n";

for(i = 0; i < 3; i ++)

for(j = 0; j < 3; j ++)

{

// a3[i][j] = *(*(a2+i)+j);

*(*(a3+i)+j) = *(*(a2+i)+j);

// a3[i][j] = a2[i][j];

cout << " " << a3[i][j];

*a4++ = a3[i][j];

}

a4 = a4 - 9; pt; //повернення звернення на початок масиву

for ( i = 0; i < 3; i ++)

for(j = 0; j < 3; j ++)

{

cout << " " << *(a4 + i*3 + j);

}

int function (int *x ), s1; //прототип функцiї

//s1 = function(&a2[0][0]);

s1 = function(a4);

//розрахунок суми заданої iз клавiатури кiлькостi елементiв n

cout << " s1 = " << s1;

delete []a4; getch();

return 0;

}