dinamic (Динамическое распределение памяти)

2016-07-31СтудИзба

Описание файла

Документ из архива "Динамическое распределение памяти", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "dinamic"

Текст из документа "dinamic"

Министерство высшего и профессионального образования РФ

Уральский государственный технический университет

Радиотехнический факультет

Кафедра Автоматика и информационные технологии

Динамическое распределение памяти

Курсовая работа по дисциплине

основы алгоритмизации и программирования

Выполнил:студент Золин А.С.

группа Р-290Б

Проверил: Трофимов С.П.

Дата:

Екатеринбург 2000

Содержание

Содержание 2

Введение 3

Руководство пользователя 4

Задание №2 4

Задание №6 4

Задание №8 4

Задание №10 4

Задание №12 4

Задание №14 4

Задание №16 4

Руководство программиста 5

Задание №2 5

Задание №6 5

Задание №8 6

Задание №10 8

Задание №12 10

Задание №14 11

Задание №16 12

Библиографический список 15


Введение

Целью работы является демонстрация работы с динамической памятью на примере программ разработанных к заданиям 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=%p\n",x); // Вывод на экран адреса начала блока для *x

printf("Adress of *y=%p\n",y); // --//-- *y

printf("Adress of *z=%p\n",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;i

{

mas[i]=random(11)-3;

printf("N=%i %i\n",i,mas[i]);

}

//Освобождение памяти из под масси ва

free (mas);

return 0;

}

Задание №8

#include

#include

#include

#include

//Структура Matr1, которая содержит размеры матрицы, а также одномерный

//массив элементов матрицы и функцию для задания размеров матрицы

struct Matr1{

int m,n;

int *ptr;

void SetRazm(int mm,int nn)

{

m=mm;

n=nn;

}

};

//Структура Matr1, которая содержит размеры матрицы, а также двумерный

//массив элементов матрицы и функцию для задания размеров матрицы

struct Matr2{

int m,n;

int **ptr;

void SetRazm(int mm,int nn)

{

m=mm;

n=nn;

}

};

int DinMatr1 (Matr1 *matr); //функция выделения памяти для Matr1

int DinMatr2 (Matr2 *matr); //функция выделения памяти для Matr2

void FreeMatr1(Matr1 *matr); //функция освобождения памяти из под Matr1

void FreeMatr2(Matr2 *matr); //функция освобождения памяти из под Matr2

main()

{

clrscr();

Matr1 M1; //Создание экземпляра Matr1

Matr2 M2; //Создание экземпляра Matr2

M1.SetRazm(2,2); //Задание размеров Matr1

M2.SetRazm(2,2); //--//-- Matr2

if (!DinMatr1(&M1)) //Выделение памяти для Matr1

{

printf("Не хватает памяти под M1\n");

exit (1);

}

if (!DinMatr2(&M2)) //--//-- Matr2

{

printf("Не хватает памяти под M2\n");

exit (1);

}

FreeMatr1 (&M1); //Освобождение памяти из под Matr1

FreeMatr2 (&M2); //--//-- Matr2

return 0;

}

int DinMatr1 (Matr1 *matr)

{

if (!((matr->ptr)=(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 ("Intput\n");

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 ((c'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 (c); //Вывод цифры на экран

}

printf ("Output\n");

for (int i=0;i

//Вывод всех чисел на экран

for (i=0;i

//Освобождение памяти

if (mas) free(mas);

return 0;

}

Задание №12

#include

#include

#include

#include

struct Matr{

int m,n;

double **ptr;

void SetRazm(int mm,int nn)

{

m=mm;

n=nn;

}

};

int DinMatr (Matr *matr); //функция выделения памяти для Matr

void FreeMatr(Matr *matr); //функция освобождения памяти из под Matr

void Setelem(Matr *matr,double M[3][3]);

//функция заполнения матрицы элементами

double OctNorm(Matr *matr); //функция вычисления нормы матрицы

main()

{

clrscr();

double M_[3][3]={{1,2,3},{4,5,6},{7,8,9}};

Matr M;

M.SetRazm(3,3);

if (!DinMatr(&M))

{

printf ("Не хватает памяти для матрицы\n");

exit(1);

}

Setelem(&M,M_);

printf ("%f\n",OctNorm(&M));

FreeMatr(&M);

return 0;

}

int DinMatr (Matr *matr)

{

if (!(matr->ptr=(double **)malloc(sizeof(double *)*(matr->m)))) 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 (((c>='0')&&(c<='9'))||(c=='.'))

{

num[pos]=c;

pos++;

flag=1;

}

if ((c==' ')&&(flag))

{

flag=0;

num[pos]=0;

ptr[i][j]=atof(num);

j++;

ptr[i]=(double *)realloc(ptr[i],sizeof(double)*(j+1));

pos=0;

}

if ((c=='\n')&&(flag))

{

flag=0;

num[pos]=0;

ptr[i][j]=atof(num);

i++;

ptr=(double **)realloc(ptr,sizeof(double *)*(i+1));

ptr[i]=(double *)malloc(sizeof(double));

j=0;

pos=0;

}

if (i>n) n=i;

if (j>m) m=j;

}

n--;

fclose (pf);

return 1;

}

void free_()

{

for(int i=0;i<=n;i++) free(ptr[i]);

free (ptr);

}

void print_()

{

for (int i=0;i<=n;i++)

{

for (int j=0;j<=m;j++)

{

printf ("%8.3f ",ptr[i][j]);

}

printf ("\n");

}

}

int write_(char name[80])

{

FILE *pf;

if (!(pf=fopen(name,"wt"))) return 0;

for (int i=0;i<=n;i++)

{

for (int j=0;j<=m;j++)

{

fprintf (pf,"%f ",ptr[i][j]);

}

fprintf (pf,"\n");

}

fclose (pf);

}

};

void main()

{

clrscr();

MATR A;

A.read_("C:\\mas.txt");

A.print_();

A.write_("C:\\out.txt");

A.free_();

}

Библиографический список

  1. Трофимов С.П. Программирование в Си. Динамическое распределение памяти:

Метод. указания. Екатеринбург: изд-во УГТУ, 1998.

  1. Трофимов С.П. Программирование в Си. Организация ввода-вывода:

Метод. указания. Екатеринбург: изд-во УГТУ, 1998.

  1. Хинт К. Си без проблем. Руководство пользователя. М.: Бином, 1997.

15


Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5138
Авторов
на СтудИзбе
443
Средний доход
с одного платного файла
Обучение Подробнее