Динамическое розподіл пам'яті
Mas=(char *)malloc (sizeof (char)); //Виділення пам’яті під перший позицію //цифри в числе. Виділено 16 байт тобто. 1 параграф потрібно порівняти три адреси, які поя; Программа обчислює октоэдрическую норму матриці довільних размеров. Вяться на екран в рез-те дії цієї програми. Якщо вересня цих адресах. Потім у який з’явився запиті запровадити *x з’явиться меню, вверху. Для отримання цих адрес… Читати ще >
Динамическое розподіл пам'яті (реферат, курсова, диплом, контрольна)
Динамическое розподіл памяти.
Курсовая робота з дисципліни основи алгоритмізації та програмування студента Золін А.С.
Министерство вищого й фахової освіти РФ
Уральский державний технічний университет
Радиотехнический факультет
Кафедра «Автоматика і інформаційні технологии»
Екатеринбург 2000.
Целью роботи є демонстрація роботи з динамічної пам’яттю з прикладу програм розроблених до завданням 2, 6, 8, 10, 12, 14, 16 з методичного вказівки [1].
Динамическое розподіл пам’яті надає програмісту великі можливості при зверненні до ресурсів пам’яті у виконання програми, і коректна робота програми з динамічної пам’яттю істотно залежить від знання функцій до роботи з ней.
Руководство пользователя.
Завдання № 2.
Для здобуття права переконатися що кожного з однобайтовых даних купи виділено 16 байт тобто. 1 параграф потрібно порівняти три адреси, які появяться на екран в рез-те дії програмних засобів. Якщо вересня цих адреси які стоять до двокрапки увеличиваютя (від першого до останнього) на еденичку, це означатиме що у кожен блок виділено один параграф купи = 16 байт. Для отримання цих адрес в отладчике досить натиснути Alt+F4 (як отладчика) потім у який з’явився запиті запровадити *x з’явиться меню, вгорі якого і буде потрібний адресу, аналогічно для *y, *z.
Задание № 6.
Программа виділяє пам’ять під 20 змінних типу int, заповнює їх випадковими числами з інтервалу [-3;7] і виводить на экран.
Задание № 8.
Программа зберігає матриці як двох структур:
Struct Matr1{int m, n; int *ptr};
Struct Matr2{int m, n; int **ptr};
И виділяє пам’ять під їх із допомогою наступних функций:
Int DinMatr1(Matr1 *matr);
Int DinMatr2(Matr2 *matr);
Задание № 10.
Программа отримує з клавіатури натуральні числа, зберігаючи в багатьох, кінець введення — число 0. Після закінчення введення числа виводяться на экран.
Задание № 12.
Программа обчислює октоэдрическую норму матриці довільних размеров.
Задание № 14.
Программа обчислює загальний розмір вільної кучи.
Задание № 16.
Программа виконує зчитування матриці довільних розмірів з файла (роздільниками є прогалини), висновок цієї матриці на екран, і навіть запис в файл.
Руководство программиста.
В цьому розділі буде приведено листинги програм з комментариями.
Задание № 2.
#include.
#include.
#include.
int main (void).
{.
char *x,*y,*z; //Оголошення переменных.
x=(char *)malloc (sizeof (char)); //Виділення динамічної пам’яті для *x.
y=(char *)malloc (sizeof (char)); // —//— *y.
z=(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.
free (x); // —//— *x.
/*.
Щоб переконатися що кожного з однобайтовых даних в куче.
виділено 16 байт тобто. 1 параграф потрібно порівняти три адреси, які поя;
вяться на екран в рез-те дії цієї програми. Якщо вересня цих адресах.
які стоять до двокрапки увеличиваютя (від першого до останнього) на еденичку, то.
це що у кожен блок виділено один параграф купи = 16 байт.
Для отримання цих адрес в отладчике досить натиснути Alt+F4 (в режиме.
отладчика) потім у який з’явився запиті запровадити *x з’явиться меню, вверху.
якого і буде потрібний адресу, аналогічно для *y, *z.
*/.
return 0;
}.
Задание № 6.
#include.
#include.
#include.
#include.
#include.
//N_var — число елементів масиву.
#define N_var 20.
main ().
{.
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);
}.
Задание № 10.
#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.
{.
if (c==13) //При натисканні Enter виділення пам’яті.
{ //під нове число.
mas[m][n]=0;
m++;
if (!(mas=(char **)realloc (mas, sizeof (char *)*(m+1)))).
{.
printf («Бракує памятиn »);
exit (1);
}.
n=0;
putch (10); //Переклад карретки і переклад строки.
putch (13); //при виведення на екран.
}.
if ((з «9 »)) continue; //Перевірка на введення лише цифр
if ((!n)&&(m)) //Виділення пам’яті під перший позицію.
{ //наступного числі.
if (!(mas[m]=(char *)malloc (sizeof (char)))).
{.
printf («Бракує памятиn »);
exit (1);
}.
}.
mas[m][n]=c; //Занесення цифри на потрібну позицию.
n++; //в число.
if (n) //Виділення пам’яті під следующую.
{ //позицію у числе.
if (!(mas[m]=(char *)realloc (mas[m], sizeof (char)*(n+1)))).
{.
printf («Бракує памятиn »);
exit (1);
}.
}.
putch (з); //Висновок цифри на экран.
}.
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;
}.
Задание № 14.
#include.
#include.
#include.
#include.
void main (void).
{.
long N=1;
char *A;
A=(char *)calloc (N, 1024); //Виділення купи місця.
do.
{.
free (A); //Звільнення масиву.
A=(char *)calloc (N, 1024); //Виділення пам’яті під більший масив.
N++; //Збільшення счетчика.
}.
while (A≠NULL); //Продовжувати поки пам’ять выделяется.
printf («nMaximum size of heap N=%iKb », N);//Вывод результатів.
}.
Задание № 16.
#include.
#include.
#include.
#include.
#include.
struct MATR.
{.
int n, m;
double **ptr;
int read_(char name[80]).
{.
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).
{.
if (((з>= «0 »)&&(cn) n=i;
if (j>m) m=j;
}.
n—;
fclose (pf);
return 1;
}.
void free_().
{.
for (int i=0;i.