
Л.р. №2 (Контроллер памяти)
.docМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Кафедра кибернетики
Лабораторная работа №2
по дисциплине
«Математическое обеспечение ЭВМ»
на тему: «Контроллер памяти»
Выполнила студентка группы М-75
Катышева С.Н.
Проверил проф. д.т.н.
Гостев И.М.
Москва 2009
Задание: Продемонстрировать навыки работы с интерфейсом контроллера памяти.
Программа на языке C реализует следующую задачу:
Формируется матрица A(M,N) указанного размера. Заполняется случайными числами из диапазона от 0 до 99.
Следует найти первый минимальный элемент матрицы и удалить строку, его содержащую.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
int i, j, **a, min, imin, N, M;
//Выделение памяти под массив указателей на строки матрицы
a = (int**)malloc(M * sizeof(int));
if (a==NULL)
{ printf("Net pam'ati\n");
exit(1); }
printf("VVedite 4islo strok i stolbcov: M i N=");
scanf( "%d%d\n\n",&M,&N);
for(i=0; i<M; i++)
a[i] = (int*)malloc(N * sizeof(int)); // Выделение памяти под каждую строку
//Формирование матрицы А
printf("A = \n");
for(i=0; i<M; i++)
{ for(j=0; j<N; j++)
{ a[i][j] = rand()%50;
printf("%3d", a[i][j]);
}
printf("\n");
}
fprintf(stderr,"Vydeleno pam'ati: %d baj't(a)\n", (sizeof **a)*M*N);
//Нахождение минимального элемента
min = a[0][0];
for(i=0; i<M; i++)
for(j=0; j<N; j++)
if(a[i][j] < min)
{
min = a[i][j];
imin = i;
}
free(a[imin]);//Освобождение памяти, выделенной для строки с //минимальным элементом
//Удаление строки с минимальным элементом
for(i=imin; i<M-1; i++)
for(j=0; j<N; j++)
a[i] = a[i+1];
//Печать номера удалённой строки
printf("udalena %d-ja stroka\n", (imin+1));
//Печать новой матрицы
printf("\nNew A = \n");
for(i=0; i<M-1; i++)
{
for(j=0; j<N; j++)
printf("%3d", a[i][j]);
printf("\n");
}
//Освобождение памяти
for(i=0; i<M; i++)
free(a[i]);
free(a);
getch();
return 0;
}
В программе использовались функции:
malloc() - принимает в качестве аргумента размер выделяемой области в байтах; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Содержимое выделяемой области памяти не определено.
#include <stdlib.h>
void *malloc(size_t size);
free() -освобождает ранее выделенную память, на которую ссылается
указатель a и делает её доступной для последующего выделения функциями
malloc(), calloc()или realloc().Если a равен NULL, то ничего не происходит. Аргумент функции free — это указатель на начало выделенной когда-то памяти.
Функция free() ничего не возвращает.
#include <stdlib.h>
void free (void *ptr);
Результат работы программы:
VVedite 4islo strok i stolbcov: M i N=6
7
q
A =
46 30 32 40 6 17 45
15 48 26 4 8 21 29
42 10 12 21 13 47 19
41 40 35 14 9 2 21
29 16 31 1 45 43 34
10 29 45 11 42 39 38
Vydeleno pam'ati: 84 baj't(a)
udalena 5-ja stroka
New A =
46 30 32 40 6 17 45
15 48 26 4 8 21 29
42 10 12 21 13 47 19
41 40 35 14 9 2 21
10 29 45 11 42 39 38
Спасибо Linux forever! за помощь в написании программы)