Динамічний розподіл пам'яті b>
p>
Курсова
робота з дисципліни основи алгоритмізації і програмування студента Золін
А.С. h2>
Міністерство вищої та професійної освіти РФ h2>
Уральський державний технічний університет h2>
Радіотехнічний факультет h2>
Кафедра "Автоматика та інформаційні технології" h2>
Єкатеринбург 2000 b>
p>
Введення b>
p>
Метою роботи
є демонстрація роботи з динамічною пам'яттю на прикладі програм
розроблених до завдань 2, 6, 8, 10, 12, 14, 16 з методичного вказівки [1]. p>
Динамічне
розподіл пам'яті надає програмісту великі можливості при
зверненні до ресурсів пам'яті в процесі виконання програми, і коректна
робота програми з динамічною пам'яттю в істотному ступені залежить від
знання функцій для роботи з нею. p>
Керівництво
користувача b>
p>
Завдання
№ 2
p>
Для того щоб
переконатися що для кожного з однобайтових даних в купі виділено 16 байт тобто 1
параграф потрібно порівняти три адреси, які з'являться на екран у рез-ті
дії цієї програми. Якщо числа в цих адресах стоять до двокрапки
увелічіваютя (від першого до останнього) на еденічку, то це означає що на
кожен блок виділений один параграф в купі = 16 байт. Для отримання цих адрес
в відладчик досить натиснути Alt + F4 (в режимі відладчика) потім, що з'явиться
запиті ввести * x з'явиться меню, вгорі якого і буде потрібну адресу,
аналогічно для * y, * z. p>
Завдання № 6
p>
Програма
виділяє пам'ять під 20 змінних типу int, заповнює їх випадковими числами з
інтервалу [-3; 7] і виводить їх на екран. p>
Завдання № 8
p>
Програма
зберігає матриці у вигляді двох структур: p>
Struct
Matr1 (int m, n; int * ptr); p>
Struct Matr2 (int m, n; int ** ptr); p>
І виділяє
пам'ять під них за допомогою наступних функцій: p>
Int
DinMatr1 (Matr1 * matr); p>
Int DinMatr2 (Matr2 * matr); p>
Завдання № 10
p>
Програма
отримує з клавіатури натуральні числа, зберігаючи їх у купі, кінець вводу --
число 0. Після закінчення введення числа виводяться на екран. P>
Завдання № 12
p>
Програма
обчислює октоедріческую норму матриці довільних розмірів. p>
Завдання № 14
p>
Програма
обчислює загальний розмір вільної купи. p>
Завдання № 16
p>
Програма
виконує зчитування матриці довільних розмірів з файлу (роздільниками
є пробіли), висновок цієї матриці на екран, а також запис у файл. p>
Керівництво програміста b>
p>
У цьому розділі
будуть приведені листинги програм з коментарями. p>
Завдання
№ 2 p>
# include p>
# include p>
# include p>
int main (void) p>
( p>
char * x, * y, * z;// Оголошення
змінних p>
x = (char *) malloc (sizeof (char));// Виділення
динамічної пам'яті для * x p>
y = (char *) malloc (sizeof (char));//
--//-- * Y p>
z = (char *) malloc (sizeof (char));//
--//-- * Z p>
clrscr ();//
Очищення екрану p>
printf ( "Adress of * x =% pn", x);// Вивід на екран адреси
початку блоку для * x p>
printf ( "Adress of
* y =% pn ", y);//
--//-- * Y p>
printf ( "Adress of * z =% pn", z);// --//-- * z p>
free (z);//
Звільнення блоку виділеного для * z p>
free (y);// --//-- * y p>
free (x);// --//-- * x p>
/* p>
Для того щоб переконатися що для кожного з
однобайтових даних в купі p>
виділено 16 байт тобто 1 параграф потрібно
порівняти три адреси, які поя- p>
вяться на екран у рез-ті дії цієї
програми. Якщо числа в цих адресах p>
стоять до двокрапки увелічіваютя (від першого
останній) на еденічку, то p>
це означає що на кожен блок виділений один
параграф в купі = 16 байт. p>
Для отримання цих адрес в відладчик
достатньо натиснути Alt + F4 (в режимі p>
відладчика) потім у запиті, що з'явилося, ввести
* x з'явиться меню, вгорі p>
якого і буде потрібну адресу, аналогічно для
* y, * z. p>
*/ p>
return 0; p>
) p>
Завдання
№ 6 p>
# include p>
# include p>
# include p>
# include p>
# include p>
// N_var - число
елементів масиву p>
# define N_var 20 p>
main () p>
( p>
clrscr (); p>
// Ініціалізація
генератора случ. чисел p>
randomize (); p>
int * mas; p>
// Виділення
пам'яті під масив p>
if (! (mas = (int *) malloc (sizeof (int) * N_var ))) p>
( p>
printf
( "Не достатньо пам'яті для виділення массіваn "); p>
exit (1); p>
) p>
// Заповнення
масиву случ. числами в діапазоні від -3 до 7 з одночасним p>
// виводом на
екран p>
for (int i = 0; iptr) = (int *) malloc (sizeof (int) * (matr-> m) * (matr-> n)))) return
0; p>
return 1; p>
) p>
int DinMatr2 (Matr2 * matr) p>
( p>
if
(! (matr-> ptr = (int **) malloc (sizeof (int *) * (matr-> m)))) return 0; p>
for (int
i = 0; im; i + +) p>
( p>
if
(! (matr-> ptr [i] = (int *) malloc (sizeof (int) * (matr-> n)))) return 0; p>
) p>
return 1; p>
) p>
void FreeMatr1 (Matr1 * matr) p>
( p>
if
(matr-> ptr) free (matr-> ptr); p>
) p>
void FreeMatr2 (Matr2 * matr) p>
( p>
for (int
i = 0; im; i ++) p>
( p>
if
(matr-> ptr [i]) free (matr-> ptr [i ]); p>
) p>
if
(matr-> ptr) free (matr-> ptr); p>
) p>
Завдання
№ 10 p>
# include p>
# include p>
# include p>
# include p>
main () p>
( p>
clrscr (); p>
char ** mas; p>
int c, m = 0, n = 0; p>
mas = (char **) malloc (sizeof (char *));// Виділення пам'яті під перше число p>
mas [0] = (char *) malloc (sizeof (char));// Виділення пам'яті під першу позицію// цифри в числі p>
printf ( "Intputn"); p>
while ((c = getch ())-' 0 ')// Пока
не ввели 0 p>
( p>
if (c == 13)// При
натисканні Enter виділення пам'яті p>
(//під нове число p>
mas [m] [n] = 0; p>
m + +; p>
if
(! (mas = (char **) realloc (mas, sizeof (char *) * (m +1)))) p>
( p>
printf ( "Не вистачає памятіn"); p>
exit (1); p>
) p>
n = 0; p>
putch (10);// Переклад
карреткі та перекладів рядка p>
putch (13);// при
виведення на екран p>
) p>
if ((c'9 ')) continue;// Перевірка
ввести тільки цифр p>
if ((! n) & & (m))// Виділення пам'яті під першу позицію p>
(//в наступному числі p>
if (! (mas [m] = (char
*) malloc (sizeof (char)))) p>
( p>
printf ( "Не вистачає памятіn "); p>
exit (1); p>
) p>
) p>
mas [m] [n] = c;// Занесення цифри на потрібну позицію p>
n + +;// в число p>
if (n)// Виділення пам'яті під наступну p>
(//позицію в числі p>
if (! (mas [m] = (char
*) realloc (mas [m], sizeof (char) * (n +1 )))) p>
( p>
printf ( "Не вистачає памятіn "); p>
exit (1); p>
) p>
) p>
putch (c);// Вивід цифри на екран p>
) p>
printf
( "Outputn "); p>
for (int
i = 0; im)))) return 0; p>
for (int
i = 0; im; i ++) p>
( p>
if
(! (matr-> ptr [i] = (double *) malloc (sizeof (double) * (matr-> n)))) return 0; p>
) p>
return 1; p>
) p>
void FreeMatr (Matr * matr) p>
( p>
for (int
i = 0; im; i ++) p>
( p>
if
(matr-> ptr [i]) free (matr-> ptr [i ]); p>
) p>
if
(matr-> ptr) free (matr-> ptr); p>
) p>
void Setelem (Matr * matr, double M [3] [3]) p>
( p>
for (int
i = 0; im; i ++) p>
( p>
for (int
j = 0; jn; j + +) (matr-> ptr [i] [j]) = M [i] [j]; p>
) p>
) p>
double OctNorm (Matr * matr) p>
( p>
double max = 0; p>
double a = 0; p>
for (int
i = 0; im; i ++) p>
( p>
max + = matr-> ptr [i] [0]; p>
) p>
for (int
j = 0; jn; j ++) p>
( p>
for
(i = 0; im; i ++) p>
( p>
a + = matr-> ptr [i] [j]; p>
) p>
if (a> max)
max = a; p>
a = 0; p>
) p>
return max; p>
) p>
Завдання
№ 14 p>
# include p>
# include p>
# include p>
# include p>
void main (void) p>
( p>
long N = 1; p>
char * A; p>
A = (char *) calloc (N, 1024);// Виділення в купі місця p>
do p>
( p>
free (A);// Звільнення
масиву p>
A = (char *) calloc (N, 1024);// Виділення пам'яті під більший масив p>
N + +;// Збільшення лічильника p>
) p>
while (A! = NULL);// Продовжувати поки
пам'ять виділяється p>
printf ( "nMaximum size of heap
N =% iKb ", N);// Висновок результатів p>
) p>
Завдання
№ 16 p>
# include p>
# include p>
# include p>
# include p>
# include p>
struct MATR p>
( p>
int n, m; p>
double ** ptr; p>
int read_ (char
name [80]) p>
( p>
FILE
* pf; p>
int
i = 0, j = 0; p>
char c; p>
char
num [10]; p>
int
pos = 0, flag = 1; p>
m = 0; p>
n = 0; p>
if
(! (pf = fopen (name, "rt"))) return 0; p>
ptr = (double
**) malloc (sizeof (double *)); p>
ptr [0] = (double
*) malloc (sizeof (double )); p>
while
((c = fgetc (pf))! = EOF) p>
( p>
if
(((c> = '0')&&( cn) n = i; p>
if (j> m) m = j; p>
) p>
n -; p>
fclose
(pf); p>
return
1; p>
) p>
void free_ () p>
( p>
for (int
i = 0; i