Динамічний розподіл пам'яті 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; i
( p>
mas [i] = random (11) -3; p>
printf ( "N =% i% in", i, mas [i]); p>
) p>
// Звільнення
пам'яті з під масси ва p>
free (mas); p>
return 0; p>
) p>
Завдання
№ 8 p>
# include p>
# include p>
# include p>
# include p>
// Структура
Matr1, яка містить розміри матриці, а також одновимірний p>
// масив
елементів матриці і функцію для завдання розмірів матриці p>
struct Matr1 ( p>
int m, n; p>
int * ptr; p>
void
SetRazm (int mm, int nn) p>
( p>
m = mm; p>
n = nn; p>
) p>
); p>
// Структура
Matr1, яка містить розміри матриці, а також двовимірний p>
// масив
елементів матриці і функцію для завдання розмірів матриці p>
struct Matr2 ( p>
int m, n; p>
int ** ptr; p>
void
SetRazm (int mm, int nn) p>
( p>
m = mm; p>
n = nn; p>
) p>
); p>
int DinMatr1 (Matr1 * matr);// функція виділення пам'яті для Matr1 p>
int DinMatr2
(Matr2 * matr);// функція
виділення пам'яті для Matr2 p>
void
FreeMatr1 (Matr1 * matr);// функція
звільнення пам'яті з під Matr1 p>
void
FreeMatr2 (Matr2 * matr);// функція
звільнення пам'яті з під Matr2 p>
main () p>
( p>
clrscr (); p>
Matr1 M1;// Створення екземпляра Matr1 p>
Matr2 M2;// Створення екземпляра Matr2 p>
M1.SetRazm (2,2);// Завдання розмірів Matr1 p>
M2.SetRazm (2,2); //--//--
Matr2 p>
if (! DinMatr1 (& M1))// Виділення
пам'яті для Matr1 p>
( p>
printf ( "Не вистачає пам'яті під M1n"); p>
exit (1); p>
) p>
if
(! DinMatr2 (& M2)) //--//-- Matr2 p>
( p>
printf ( "Не вистачає пам'яті під
M2n "); p>
exit (1); p>
) p>
FreeMatr1 (& M1);// Звільнення пам'яті з під Matr1 p>
FreeMatr2 (& M2); //--//-- Matr2 p>
return 0; p>
) p>
int DinMatr1 (Matr1 * matr) p>
( p>
if
(! ((matr-> ptr) = (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; i m; 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; i m; 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 <'0')||( 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; i
// Виведення всіх
чисел на екран p>
for (i = 0; i
// Звільнення пам'яті p>
if (mas)
free (mas); p>
return 0; p>
) p>
Завдання
№ 12 p>
# include p>
# include p>
# include p>
# include p>
struct Matr ( p>
int m, n; p>
double ** ptr; p>
void
SetRazm (int mm, int nn) p>
( p>
m = mm; p>
n = nn; p>
) p>
); p>
int DinMatr (Matr
* matr);// функція виділення пам'яті для Matr p>
void
FreeMatr (Matr * matr);// функція звільнення пам'яті з під
Matr p>
void Setelem (Matr * matr, double M [3] [3 ]); p>
// функція
заповнення матриці елементами p>
double
OctNorm (Matr * matr);// функція обчислення норми матриці p>
main () p>
( p>
clrscr (); p>
double
M_ [3] [3] = ((1,2,3), (4,5,6), (7,8,9 }}; p>
Matr M; p>
M. SetRazm (3,3); p>
if
(! DinMatr (& M)) p>
( p>
printf ( "Не вистачає пам'яті для
матріциn "); p>
exit (1); p>
) p>
Setelem (& M, M_); p>
printf
( "% fn", OctNorm (& M )); p>
FreeMatr (& M); p>
return 0; p>
) p>
int DinMatr (Matr * matr) p>
( p>
if
(! (matr-> ptr = (double **) malloc (sizeof (double *) * (matr-> m)))) return 0; p>
for (int
i = 0; i m; 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; i m; 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; i m; i ++) p>
( p>
for (int
j = 0; j n; 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; i m; i ++) p>
( p>
max + = matr-> ptr [i] [0]; p>
) p>
for (int
j = 0; j n; j ++) p>
( p>
for
(i = 0; i m; 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')&&( c <= '9'))||( c =='.')) p>
( p>
num [pos] = c; p>
pos ++; p>
flag = 1; p>
) p>
if ((c == '')&&( flag)) p>
( p>
flag = 0; p>
num [pos] = 0; p>
ptr [i] [j] = atof (num); p>
j ++; p>
ptr [i] = (double
*) realloc (ptr [i], sizeof (double) * (j +1 )); p>
pos = 0; p>
) p>
if ((c == 'n')&&( flag)) p>
( p>
flag = 0; p>
num [pos] = 0; p>
ptr [i] [j] = atof (num); p>
i ++; p>
ptr = (double
**) realloc (ptr, sizeof (double *) * (i +1 )); p>
ptr [i] = (double
*) malloc (sizeof (double )); p>
j = 0; p>
pos = 0; p>
) p>
if (i> n) 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 <= n; i + +) free (ptr [i ]); p>
free (ptr); p>
) p>
void print_ () p>
( p>
for (int
i = 0; i <= n; i ++) p>
( p>
for (int
j = 0; j <= m; j ++) p>
( p>
printf
( "% 8.3f", ptr [i] [j ]); p>
) p>
printf
( "n "); p>
) p>
) p>
int
write_ (char name [80]) p>
( p>
FILE * pf; p>
if
(! (pf = fopen (name, "wt"))) return 0; p>
for (int
i = 0; i <= n; i ++) p>
( p>
for (int
j = 0; j <= m; j ++) p>
( p>
fprintf
(pf, "% f", ptr [i] [j ]); p>
) p>
fprintf
(pf, "n "); p>
) p>
fclose (pf); p>
) p>
); p>
void main () p>
( p>
clrscr (); p>
MATR A; p>
A.read_ ( "C: mas.txt "); p>
A.print_ (); p>
A.write_ ( "C: out.txt "); p>
A.free_ (); p>
) p>
Список літератури b>
p>
Трофімов С.П.
Програмування в Сі. Динамічний розподіл пам'яті: p>
Метод. вказівки. Екатеринбург: изд-во УГТУ,
1998. P>
Трофімов С.П.
Програмування в Сі. Організація вводу-виводу: p>
Метод. вказівки. Екатеринбург: изд-во УГТУ,
1998. P>
Хинт К. Сі без
проблем. Керівництво користувача. М.: Бином, 1997. P>
Для підготовки
даної роботи були використані матеріали з сайту http://www.ed.vseved.ru/
p>