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