- •Цели и задача работы
- •2. Краткие теоретические сведения*
- •2.1 Основные функции для работы с динамической памятью
- •2.2. Случай двумерного динамического массива
- •3. Порядок выполнения работы
- •4. Варианты заданий
- •5. Содержание отчета
- •6. Пример решения задачи
- •7. Контрольные вопросы
- •Список рекомендуемой литературы
5. Содержание отчета
Отчет должен содержать:
- программу
- исходные данные (значения матриц A и(или) B и(или) C и(или) D)
- промежуточные результаты вычислений
- результат
Текст программы должен включать подробные комментарии, поясняющие назначения процедур, их параметры, использование переменных, смысл и особенности реализации отдельных программных блоков.
6. Пример решения задачи
#include<conio.h>
#include<stdio.h>
#include<alloc.h>
#include<stdlib.h>
#include<process.h>
/* Вспомогательная функция для обработки случая, когда не хватает памяти*/
/* (не самый лучший подход, но самый простой) */
void *Malloc( size_t size )
{
void *p = malloc(size);
if( p==NULL )
{
printf("Недостаточно памяти!\n");
exit(1); // Экстренное завершение программы
}
return p;
}
/* Конструктор квадратной матрицы общего вида */
double **CreateMatrUsual( int n )
{
double **Matr;
int i, j;
Matr = (double**) Malloc( n * sizeof(double *) );
for(i = 0; i < n; i++)
{
Matr[i] = (double *) Malloc( n * sizeof(double) );
// В данном случае сразу ее и заполним
for( j=0; j<n; j++ )
Matr[i][j] = random(10)/2.0 + 1;
}
return Matr;
}
/* Деструктор матрицы общего вида */
void DelMatrUsual(double *Matr[], int n )
{
int i;
for(i = 0; i<n; i++)
free(Matr[i]); // Сначала удаляем строки
free(Matr); // Затем удаляем вектор указателей на строки
}
/* Конструктор ленточной матрицы */
double **CreateMatrStrip( int n, int w )
{
double **Matr;
int i, j;
// Создаем вектор указателей на полосы ленты
Matr = (double**) Malloc( (w+1) * sizeof(double *) );
for(i = 0; i <= w; i++)
{
// Создаем полосы ленты
Matr[i] = (double *) Malloc( (n-i) * sizeof(double) );
// Инициализируем матрицу случайными значениями от 1 до 6
for( j=0; j<n-i; j++ )
Matr[i][j] = random(10)/2.0 + 1;
}
return Matr;
}
// Функция получения (i;j)-го элемента ленточной матрицы
double GetFromStrip( double *A[], int w, int i, int j )
{
if ( abs(j-i)>w )
return 0;
if ( j>=i )
return A[j-i][i]; // В этих формулах постарайтесь
else
return A[i-j][j]; // разобраться самостоятельно!
}
/* Деструктор ленточной матрицы */
void DelMatrStrip(double *A[], int w )
{
int i;
for(i = 0; i<=w; i++)
free(A[i]); // Сначала удаляем полосы ленты
free(A); // Затем удаляем вектор указателей на эти полосы
}
void main(void)
{
int n = 7, w = 2;
int i, j;
double **A, **Rez;
randomize();
clrscr();
A = CreateMatrStrip (n, w);
Rez = CreateMatrUsual( n );
printf( "Ленточная матрица A \n" );
for( i=0; i<n; i++ )
{
for( j=0; j<n; j++ )
printf("%5.1lf ", GetFromStrip(A, w, i, j) );
printf( "\n" );
}
printf( "\nМатрица общего вида B \n" );
for( i=0; i<n; i++ )
{
for( j=0; j<n; j++ )
printf("%5.1lf ", Rez[i][j] );
printf( "\n" );
}
for( i=0; i<n; i++ )
{
for( j=0; j<n; j++ )
Rez[i][j] = Rez[i][j] +
2*GetFromStrip(A, w, i, j );
}
printf( "\nЗначение выражения: B + 2*A \n" );
for( i=0; i<n; i++ )
{
for( j=0; j<n; j++ )
printf("%6.1lf ", Rez[i][j] );
printf( "\n" );
}
getch();
// Освобождаем память
DelMatrUsual(Rez, n);
DelMatrStrip( A, w );
}