ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Динамічний розподіл пам'яті
         

     

    Інформатика, програмування

    Динамічний розподіл пам'яті

    Курсова робота з дисципліни основи алгоритмізації і програмування студента Золін А.С.

    Міністерство вищої та професійної освіти РФ

    Уральський державний технічний університет

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

    Кафедра "Автоматика та інформаційні технології"

    Єкатеринбург 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; i

    (

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

    printf ( "N =% i% in", 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 ( "Не вистачає пам'яті під M1n");

    exit (1);

    )

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

    (

    printf ( "Не вистачає пам'яті під M2n ");

    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; i m; 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; i m; 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 ((c <'0')||( 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 ( "Outputn ");

    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 ( "% fn", 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; i m; i ++)

    (

    if (! (matr-> ptr [i] = (double *) malloc (sizeof (double) * (matr-> n)))) return 0;

    )

    return 1;

    )

    void FreeMatr (Matr * matr)

    (

    for (int i = 0; i m; 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; i m; i ++)

    (

    for (int j = 0; j n; j + +) (matr-> ptr [i] [j]) = M [i] [j];

    )

    )

    double OctNorm (Matr * matr)

    (

    double max = 0;

    double a = 0;

    for (int i = 0; i m; i ++)

    (

    max + = matr-> ptr [i] [0];

    )

    for (int j = 0; j n; j ++)

    (

    for (i = 0; i m; 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_ ();

    )

    Список літератури

    Трофімов С.П. Програмування в Сі. Динамічний розподіл пам'яті:

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

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

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

    Хинт К. Сі без проблем. Керівництво користувача. М.: Бином, 1997.

    Для підготовки даної роботи були використані матеріали з сайту http://www.ed.vseved.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status