Решение инженерных задач обработки массивов
Введение
Цель курсовой работы: закрепление знаний и
умений по алгоритмизации и программированию на языке Си с использованием
функций, процедур и различных сложных типов данных, в том числе динамических
массивов, структур и объединений.
Назначение и область применения программы:
программа будет использоваться в учебном процессе для решения инженерных задач
обработки массивов, путём её включения в программы пользователей.
1. Задание на курсовую
работу
.1 Содержательное
описание задачи
Для первой задачи даны три функции , и . Нужно
будет найти элементы матрицы A по формуле
где x=f(i,j) - аргумент
функции , a,b - пределы
интегрирования функции .
Функция представляет
собой арифметическую функцию, проблем с ее вычислением в принципе не должно
возникнуть.
Функцию f2 следует
продифференцировать.
Функция f3 есть
подынтегральное выражение, которое является тригонометрическим выражением,
вычисление будет производиться по формуле
a, b - нижний и
верхний интеграл соответственно
К моменту выполнения второй задачи
будет сформирована матрица. Задача состоит в том, чтобы сформировать вектор,
состоящий из наибольших среди отрицательных элементов i-го столбца.
При решении первой задачи получим
квадратную матрицу, т.е. матрицу. a которой
число строк равно числу столбцов.
Третья задача представляет собой
набор матричных операций. Необходимо перемножить три операнда, представленных в
виде особого вида матрицы или вектора, а также некоторых действий над ними.
Рассмотрим эти операции.
Сначала нужно получить вектор,
состоящий из обратных элементов вектора, полученного во второй части.
Вторым операндом будет квадрат
разности исходной и транспонированной исходной матриц
Произведением матрицы Am*n = (aij) на матрицу
Bn*p = (bjk) называется
матрица Cm*p = (cik) такая, что
т.е. элемент i-й строки и k-го столбца
матрицы произведения C равен сумме произведений элементов i-й строки
матрицы A на
соответствующие элементы k-го столбца матрицы B.
В качестве 3 операнда будет 1/D - вектор,
составленный из обратных элементов главной диагонали матрицы А.
Матрица, полученная из данной
заменой каждой её строки столбцом с тем же номером, называется матрицей
транспонированной к данной. Обозначается AT.
В четвёртой задаче надо произвести
стандартные арифметические действия над элементами матрицы, сформированной в
первой задаче.
1.2
Математическая постановка задачи
Задание состоит из 4-х задач:
.- формирование элементов матрицы A с помощью
функций.
. - формирование вектора X из
элементов матрицы A,
. -матричные операции: Z =
. - комплексное преобразование
массивов
Y= +
1.3 Интерфейс
ввода/вывода
Данные будем вводить с клавиатуры, а результаты
в файл.
1.4 Технические
требования к программе
Программа будет выполняться под оболочкой DOS.
2. ОПИСАНИЕ АЛГОРИТМА
2.1 Расчетные формулы
1 Часть. , b=i+j, a=2,
x= i j+3/i
Часть.
Часть. Z =
Часть Y= +
2.2
Описание переменных
Наименование
переменной
|
Тип
переменной
|
Обозначение
|
Возможные
значения
|
|
|
В
алгоритме
|
В
программе
|
|
Входные
переменные Размерность матрицы
|
целый
|
n
|
n
|
n>0
|
Выходные
данные 1. Матрица А 2. Вектор X 3. Компл. преобр.
массивов Y 4.
Результат матр. операций
|
вещ.
массив вещ. массив вещ. вещ.
|
A = {aij} X = {xi} Y Rez
|
a[i][j] x[i] y rmo
|
любые
любые
любые любые
|
Промежуточные
переменные 1. Номер строки 2. Номер столбца 3. Матрица, возвед. в квадрат
4.Транспонированная матрица 5. 1/X - строка
7. Аргумент функции 8. 1/D - столбец 9.Нижний предел
интегриров. 10.Верхний предел интегриров 11. Разность матриц
|
целый
целый вещ. массив вещ. массив вещ. массив вещ. вещ. массив. вещ .вещ. вещ.
массив
|
i j A2 = {aij} AТ
= {aij} nv= {nvij} x D= {Di} a b razn= {raznij}
|
i j a2[i][j] At[i][j] nv[i][j]
x d[i] a b razn[i][j]
|
1,2,...n 1,2,…n любые
любые 0 или 1 любые любые любые любые любые
|
Структура программы
2.4 Сообщения программы
Программа выведет только одно сообщение “Введите
размерность.n = ”
Также программы выведет вектор X цветными
буквами.
3. ОПИСАНИЕ
ПРОГРАММЫ
#include <conio.h>
#include <stdlib.h>
#include <math.h>
//-------------------------------------------------struct{cl:4;fon:3;bl:1;
} Att;
//-------------------------------------------------union{char
cod;att;
} Mix;
//-------------------------------------------------set_attr(int
b,int fon,int col)
{a1;.att.bl=b;a1.att.fon=fon;a1.att.cl=col;a1;
}
//-------------------------------------------------double
(*fun)(double x);
//-------------------------------------------------prlog(double
x)
{1/(x*log(3));
}
//-------------------------------------------------log3(double
x)
{log(x)/log(3);
}
//-------------------------------------------------logy(double
x)
{log(3)/x;
}
//-------------------------------------------------Tab_fun[2][2]={{&log3,&prlog},{&log,
&log}};Tab_integ[2][2]={{&log,&logy},{&cos,&sin}};
//-------------------------------------------------Integ(fun
ff,double a, double b)
{f1;int
i;(i=0;i<2;i++)(Tab_integ[i][0]==ff)=Tab_integ[i][1];((*f1)(b)-(*f1)(a));
}
//-------------------------------------------------Dif_fun(fun
ff, double x)
{f1;int
i,j;(i=0;i<2;i++)if(Tab_fun[i][0]==ff)=Tab_fun[i][1];(*f1)(x);
}
//-------------------------------------------------form_matr(double
**a, int n){i, j;(i = 1.0; i <= n; i++){(j = 1.0; j <= n;
j++)[i-1][j-1]=tan(M_PI*(8.25+double(i+j)/2.0))*Dif_fun(log3,double(i*j)+3.0/double(i))+Integ(cos,2.0,double(i+j))
;
}
}
//-------------------------------------------------form_vect(double
*x, double **a, int n)
{(int i=0;i<n;i++)
{[i]=-10e20;(int j=0;j<n;j++)
{(a[j][i]<0)
{(a[j][i]>x[i])[i]=a[j][i];
}
}
}
}
//-------------------------------------------------print_matr(double
**a, int n, FILE *F)
{i, j;(i = 0; i < n; i++)
{(j = 0; j < n; j++)
{(F, "%10.5f ",a[i][j]);
}(F, "\n");
}
}
//-------------------------------------------------print_vect(double
*x, int n, FILE *F)
{i;A1;=set_attr(0,RED,YELLOW);(A1.cod);(i
= 0; i < n; i++)
{(F, "%10.5f ", x[i]);
}(i = 0; i < n; i++)
{("%10.5f ", x[i]);
}("\n");
}
//-------------------------------------------------Transpon(double
**At, double **a, int n){i, j;(i = 0; i < n; i++){(j = 0; j < n;
j++)[i][j] = a[j][i];
}
}
//-------------------------------------------------sqrM(double
**a2, double **a, int n){i,j,k;(i = 0; i < n; i++)
{(j = 0; j < n; j++)
{[i][j] = 0.0;(k = 0; k < n;
k++)[i][j] += a[i][k] * a[k][j];
}
}
}
//-------------------------------------------------razn_matr(double
**a1, double **a2, double **razn, int n) {i, j;(i = 0; i < n; i++)(j = 0; j
< n; j++)[i][j] = a1[i][j] - a2[i][j];
}
//-------------------------------------------------umnozh_vm(double
**a,double *v,double *nv,int n)
{s;(int i=0;i<n;i++)
{ s=0;(int
j=0;j<n;j++)=s+v[j]*a[i][j];[i]=s;
}
}
//-------------------------------------------------umnozh_sst(double
*str,double *stl,int n)
}
//-------------------------------------------------**GetMemoryMatr(int
n)
{i;**a;= (double
**)malloc(n*sizeof(double *));(i = 0; i < n; i++)[i] = (double
*)malloc(n*sizeof(double));a;
}
//-------------------------------------------------FreeMemoryMatr(double
**a, int n)
{i;(i = 0; i < n; i++)(a[i]);(a);
}
//-------------------------------------------------*GetMemoryVect(int
n){*v;= (double *)malloc(n*sizeof(double));v;
}
//-------------------------------------------------Fact(int
x)
{s=1;(int i=1;i<=x;i++)=s*i;s;
}
//-------------------------------------------------FreeMemVect(double
*v)
{(v);
}
//-------------------------------------------------GetY(double
**a,double *x,int n)
{min,p1,p2,c;i,k;(i=0;i<n;i++)
{=10e19;=1;(k=i+1;k=0;k--)
{(a[i][k-1]<0)=c*a[i][k-1];
}(c==1) c=0;(c<min)=c;
}=min;S=0;(k=1;k<n;k+=2)
{=S+pow(x[k],Fact(k+1)/(k+1));
}=S;("%f %f",p1,p2);p1+p2;
}
//-------------------------------------------------Get1X(double
*x, double *x1, int n)
{(int i=0;i<n;i++)[i]=1.0/x[i];
}
//-------------------------------------------------GetD(double
**a,double *d, int n)
{(int
i=0;i<n;i++)[i]=1.0/a[i][i];
}
//-------------------------------------------------main()
{();**a,**razn,*x,*x1,**a2,**At,rmo,*d,*nv;*fo=fopen("d:/res.txt",
"w");; n;
printf("Введите размерность n=");
scanf("%d",&n);=GetMemoryMatr(n);razn=GetMemoryMatr(n);=GetMemoryMatr(n);At=GetMemoryMatr(n);=GetMemoryVect(n);x=GetMemoryVect(n);x1=GetMemoryVect(n);=GetMemoryVect(n);d=GetMemoryVect(n);(fo,"Матрица
А:\n\n");
form_matr(a,n);_matr(a,n,fo);
//Part II(fo,"\nВектор
X:\n\n");_vect(x,a,n);_vect(x,n,fo);X(x,x1,n);(fo,"\n\nВектор1/X:\n\n");_vect(x1,n,fo);(a,d,n);(fo,"\n\nСтолбец
1/D:\n\n");_vect(d,n,fo);
//Part III(At,a,n);(fo,"\n\nТранспонированная
матрица: A\n");
print_matr(At,n,fo);_matr(At,a,razn,n);(fo,"\n\nРазность
транспон. и исходной матрицы:\n\n");
print_matr(razn,n,fo);(a2,razn,n);
fprintf(fo,"\nПолученная
разность в квадрате:\n\n");
print_matr(a2,n,fo);_vm(a2,x1,nv,n);(fo,"\nУмножение
вектора 1/X на разность
в квадрате2:\n\n");
print_vect(nv,n,fo);=umnozh_sst(nv,d,n);(fo,"\n\nРезультат
матричных операций (константа): %f\n\n", rmo);
double Y=GetY(a,x,n);(fo,"\n\nРезультат
комплексных преобразований:\n\nY = %f",Y);
FreeMemoryMatr(a,n);FreeMemoryMatr(razn,n);(a2,n);FreeMemoryMatr(At,n);(x);FreeMemVect(x1);(nv);FreeMemVect(d);();getchar();
fcloseall();
}
4.
КОНТРОЛЬНЫЙ ПРИМЕР
Все
расчеты проведем в MathCad’е.
,
То, что вывела программа в файл при
размерности n=2:
Матрица А:
.22756 -0.95023
.02825 -1.50060
Вектор X:
.02825 -0.95023
Вектор 1/X:
.97253 -1.05238
Вектор 1/D:
.39445 -0.66640
Транспонированная матрица: A
.22756 -1.02825
.95023 -1.50060
Разность транспон. и исходной
матрицы:
.00000 -0.07802
.07802 0.00000
Полученная разность в квадрате:
.00609 0.00000
.00000 -0.00609
Умножение вектора 1/X на разность в
квадрате2:
.00592 0.00641
Результат матричных операций
(константа): 0.021746
Результат комплексных
преобразований:= -0.950225
Как видно, программа все шаги
выполнила верно, это подтверждено ручным расчетом.
ВЫВОД
В результате проделанной курсовой работы можно
сделать следующие вывод: разработана корректно работающая программа, способная
решать некоторые инженерные задачи.