Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб7 программирование.doc
Скачиваний:
3
Добавлен:
03.05.2019
Размер:
642.56 Кб
Скачать

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 );

}