- •Алгоритмічні мови та програмування Методичні вказівки
- •Алгоритмічні мови та програмування Методичні вказівки
- •03056, Київ, вул..Політехнічна, 12, корп. 17
- •Порядок виконання роботи
- •Загальні відомості для виконання лабораторної роботи
- •0X число (шістнадцяткове),
- •0 Число(число (вісімкове),
- •Результат виконання
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Додаток 1
- •Додаток 2
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Доступ до елемента масиву
- •Запис вектора у стовпець (рядок) масиву
- •Зміна стовпців масиву
- •Додаткові засоби
- •Теоретична частина
- •Порядок виконання роботи
- •Теоретична частина
- •Порядок виконання роботи
- •Додаток
- •Порядок виконання роботи
- •Результати виконання програми
- •Результати виконання програми
- •Порядок виконання роботи
- •Добирання формул за дослiдними даними згiдно методу найменших квадратiв
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Додаток 1
- •Додаток 2
- •Додаток 3
- •Порядок виконання роботи
- •//Функція
- •//Динамічні масиви
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
Додаток 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;
}