Решение инженерных задач обработки массивов

Разработка программы для решения инженерных задач с использованием функций, процедур и сложных типов данных, в том числе динамических массивов и объединений. Интерфейс ввода/вывода. Схемы алгоритмов отдельных подзадач. Технические требования к программе.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.11.2012
Размер файла 60,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

Цель курсовой работы: закрепление знаний и умений по алгоритмизации и программированию на языке Си с использованием функций, процедур и различных сложных типов данных, в том числе динамических массивов, структур и объединений.

Назначение и область применения программы: программа будет использоваться в учебном процессе для решения инженерных задач обработки массивов, путём её включения в программы пользователей.

1. Задание на курсовую работу

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-х задач:

1.- формирование элементов матрицы A с помощью функций.

2. - формирование вектора X из элементов матрицы A,

3. -матричные операции: Z =

4. - комплексное преобразование массивов

Y= +

1.3 Интерфейс ввода/вывода

Данные будем вводить с клавиатуры, а результаты в файл.

1.4 Технические требования к программе

Программа будет выполняться под оболочкой DOS.

2. ОПИСАНИЕ АЛГОРИТМА

2.1 Расчетные формулы

1 Часть. , b=i+j, a=2,

x= i j+3/i

2 Часть.

3 Часть. Z =

4 Часть 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 <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

//-------------------------------------------------

typedef struct{

unsigned cl:4;

unsigned fon:3;

unsigned bl:1;

} Att;

//-------------------------------------------------

typedef union{

unsigned char cod;

Att att;

} Mix;

//-------------------------------------------------

Mix set_attr(int b,int fon,int col)

{

Mix a1;

a1.att.bl=b;a1.att.fon=fon;a1.att.cl=col;

return a1;

}

//-------------------------------------------------

typedef double (*fun)(double x);

//-------------------------------------------------

double prlog(double x)

{

return 1/(x*log(3));

}

//-------------------------------------------------

double log3(double x)

{

return log(x)/log(3);

}

//-------------------------------------------------

double logy(double x)

{

return log(3)/x;

}

//-------------------------------------------------

fun Tab_fun[2][2]={{&log3,&prlog},{&log, &log}};

fun Tab_integ[2][2]={{&log,&logy},{&cos,&sin}};

//-------------------------------------------------

double Integ(fun ff,double a, double b)

{

fun f1;int i;

for(i=0;i<2;i++)

if(Tab_integ[i][0]==ff)

f1=Tab_integ[i][1];

return((*f1)(b)-(*f1)(a));

}

//-------------------------------------------------

double Dif_fun(fun ff, double x)

{

fun f1;int i,j;

for(i=0;i<2;i++)if(Tab_fun[i][0]==ff)

f1=Tab_fun[i][1];

return (*f1)(x);

}

//-------------------------------------------------

void form_matr(double **a, int n){

int i, j;

for (i = 1.0; i <= n; i++){

for (j = 1.0; j <= n; j++)

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

}

}

//-------------------------------------------------

void form_vect(double *x, double **a, int n)

{

for(int i=0;i<n;i++)

{

x[i]=-10e20;

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

{

if(a[j][i]<0)

{

if(a[j][i]>x[i])

x[i]=a[j][i];

}

}

}

}

//-------------------------------------------------

void print_matr(double **a, int n, FILE *F)

{

int i, j;

for(i = 0; i < n; i++)

{

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

{

fprintf(F, "%10.5f ",a[i][j]);

}

fprintf(F, "\n");

}

}

//-------------------------------------------------

void print_vect(double *x, int n, FILE *F)

{

int i;

Mix A1;

A1=set_attr(0,RED,YELLOW);

textattr(A1.cod);

for (i = 0; i < n; i++)

{

fprintf(F, "%10.5f ", x[i]);

}

for (i = 0; i < n; i++)

{

cprintf("%10.5f ", x[i]);

}

printf("\n");

}

//-------------------------------------------------

void Transpon(double **At, double **a, int n){

int i, j;

for (i = 0; i < n; i++){

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

At[i][j] = a[j][i];

}

}

//-------------------------------------------------

void sqrM(double **a2, double **a, int n){

int i,j,k;

for (i = 0; i < n; i++)

{

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

{

a2[i][j] = 0.0;

for (k = 0; k < n; k++)

a2[i][j] += a[i][k] * a[k][j];

}

}

}

//-------------------------------------------------

void razn_matr(double **a1, double **a2, double **razn, int n) {

int i, j;

for (i = 0; i < n; i++)

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

razn[i][j] = a1[i][j] - a2[i][j];

}

//-------------------------------------------------

void umnozh_vm(double **a,double *v,double *nv,int n)

{

double s;

for(int i=0;i<n;i++)

{ s=0;

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

s=s+v[j]*a[i][j];

nv[i]=s;

}

}

//-------------------------------------------------

double umnozh_sst(double *str,double *stl,int n)

{

double c;

for(int i=0;i<n;i++)

c=c+str[i]*stl[i];

return c;

}

//-------------------------------------------------

double **GetMemoryMatr(int n)

{

int i;

double **a;

a = (double **)malloc(n*sizeof(double *));

for (i = 0; i < n; i++)

a[i] = (double *)malloc(n*sizeof(double));

return a;

}

//-------------------------------------------------

void FreeMemoryMatr(double **a, int n)

{

int i;

for (i = 0; i < n; i++)

free(a[i]);

free(a);

}

//-------------------------------------------------

double *GetMemoryVect(int n){

double *v;

v = (double *)malloc(n*sizeof(double));

return v;

}

//-------------------------------------------------

int Fact(int x)

{

int s=1;

for(int i=1;i<=x;i++)

s=s*i;

return s;

}

//-------------------------------------------------

void FreeMemVect(double *v)

{

free(v);

}

//-------------------------------------------------

double GetY(double **a,double *x,int n)

{

double min,p1,p2,c;

int i,k;

for (i=0;i<n;i++)

{

min=10e19;

c=1;

for(k=i+1;k=0;k--)

{

if (a[i][k-1]<0)

c=c*a[i][k-1];

}

if(c==1) c=0;

if(c<min)

min=c;

}

p1=min;

double S=0;

for(k=1;k<n;k+=2)

{

S=S+pow(x[k],Fact(k+1)/(k+1));

}

p2=S;

printf("%f %f",p1,p2);

return p1+p2;

}

//-------------------------------------------------

void Get1X(double *x, double *x1, int n)

{

for(int i=0;i<n;i++)

x1[i]=1.0/x[i];

}

//-------------------------------------------------

void GetD(double **a,double *d, int n)

{

for(int i=0;i<n;i++)

d[i]=1.0/a[i][i];

}

//-------------------------------------------------

void main()

{

clrscr();

double **a,**razn,*x,*x1,**a2,**At,rmo,*d,*nv;

FILE *fo=fopen("d:/res.txt", "w");;

int n;

printf("Введите размерность n=");

scanf("%d",&n);

a=GetMemoryMatr(n);razn=GetMemoryMatr(n);

a2=GetMemoryMatr(n);At=GetMemoryMatr(n);

nv=GetMemoryVect(n);x=GetMemoryVect(n);x1=GetMemoryVect(n);

d=GetMemoryVect(n);d=GetMemoryVect(n);

fprintf(fo,"Матрица А:\n\n");

form_matr(a,n);

print_matr(a,n,fo);

//Part II

fprintf(fo,"\nВектор X:\n\n");

form_vect(x,a,n);

print_vect(x,n,fo);

Get1X(x,x1,n);

fprintf(fo,"\n\nВектор1/X:\n\n");

print_vect(x1,n,fo);

GetD(a,d,n);

fprintf(fo,"\n\nСтолбец 1/D:\n\n");

print_vect(d,n,fo);

//Part III

Transpon(At,a,n);

fprintf(fo,"\n\nТранспонированная матрица: A\n");

print_matr(At,n,fo);

razn_matr(At,a,razn,n);

fprintf(fo,"\n\nРазность транспон. и исходной матрицы:\n\n");

print_matr(razn,n,fo);

sqrM(a2,razn,n);

fprintf(fo,"\nПолученная разность в квадрате:\n\n");

print_matr(a2,n,fo);

umnozh_vm(a2,x1,nv,n);

fprintf(fo,"\nУмножение вектора 1/X на разность в квадрате2:\n\n");

print_vect(nv,n,fo);

rmo=umnozh_sst(nv,d,n);

fprintf(fo,"\n\nРезультат матричных операций (константа): %f\n\n", rmo);

double Y=GetY(a,x,n);

fprintf(fo,"\n\nРезультат комплексных преобразований:\n\nY = %f",Y);

FreeMemoryMatr(a,n);FreeMemoryMatr(razn,n);

FreeMemoryMatr(a2,n);FreeMemoryMatr(At,n);

FreeMemVect(x);FreeMemVect(x1);

FreeMemVect(nv);FreeMemVect(d);

getchar();getchar();

fcloseall();

}

4. КОНТРОЛЬНЫЙ ПРИМЕР

Все расчеты проведем в MathCad'е.

,

То, что вывела программа в файл при размерности n=2:

Матрица А:

0.22756 -0.95023

-1.02825 -1.50060

Вектор X:

-1.02825 -0.95023

Вектор 1/X:

-0.97253 -1.05238

Вектор 1/D:

4.39445 -0.66640

Транспонированная матрица: A

0.22756 -1.02825

-0.95023 -1.50060

Разность транспон. и исходной матрицы:

0.00000 -0.07802

0.07802 0.00000

Полученная разность в квадрате:

-0.00609 0.00000

0.00000 -0.00609

Умножение вектора 1/X на разность в квадрате2:

0.00592 0.00641

Результат матричных операций (константа): 0.021746

Результат комплексных преобразований:

Y = -0.950225

Как видно, программа все шаги выполнила верно, это подтверждено ручным расчетом.

ВЫВОД

В результате проделанной курсовой работы можно сделать следующие вывод: разработана корректно работающая программа, способная решать некоторые инженерные задачи.

Размещено на Allbest.ru


Подобные документы

  • Понятие массива и правила описания массивов в программах на языке С. Рассмотрение основных алгоритмов обработки одномерных массивов. Примеры программ на языке С для всех рассмотренных алгоритмов. Примеры решения задач по обработке одномерных массивов.

    учебное пособие [1,1 M], добавлен 22.02.2011

  • Ознакомление с основными понятиями и организацией ввода-вывода, обработкой массивов. Описание одномерных и двумерных массивов. Описание строк и операции с ними. Комбинированный тип данных - записи. Характеристика записей, использующих вариантную часть.

    реферат [84,6 K], добавлен 09.02.2011

  • Объявление, выделение, освобождение памяти под динамические массивы. Обращение к элементам. Решение задач с использованием динамических массивов на языке C++. Разработка и реализация программы для формирования и обработки динамического двумерного массива.

    курсовая работа [813,4 K], добавлен 13.06.2014

  • Организация файлов и доступ к ним. Файловые операции. Программирование с использованием встроенных функций ввода-вывода; линейных, разветвляющихся и циклических вычислительных процессов с использованием If-else, оператора выбора Case; массивов и матриц.

    курсовая работа [5,8 M], добавлен 24.05.2014

  • Характеристика и основные особенности языка Pascal. Создание числового массива с использованием встроенной функции. Использование записей, массивов и файлов. Обработка и графическая визуализация данных средствами табличного процессора и пакета MathCAD.

    курсовая работа [1,0 M], добавлен 22.08.2012

  • Разработка программы, реализующей алгоритм обработки двухмерных и одномерных массивов. Область применения, требования к программным средствам. Язык программирования Turbo Pascal. Арифметические операции и выражения. Используемые модули и операторы.

    курсовая работа [439,3 K], добавлен 21.12.2015

  • Программирование линейных алгоритмов. Процедуры ввода READ и READLN и вывода WRITE и WRITELN. Примеры решения задач на языке Паскаль. Оператор присваивания и выражения. Основные способы формирования структурных операторов. Операторы вызова процедур.

    курсовая работа [44,3 K], добавлен 18.03.2013

  • Изучение понятия и основных видов массивов. Ввод массива с клавиатуры и вывод на экран. Сортировка массивов. Метод простых обменов (пузырьковая сортировка). Сортировка простым выбором и простым включением. Решение задач с использованием массивов Паскаля.

    курсовая работа [82,1 K], добавлен 18.03.2013

  • Характеристика принципов решения инженерных задач с помощью различных информационных компьютерных комплексов. Решение задачи на языке программирования Pascal, с помощью средств математического пакета MathCAD, так же с помощь табличного процессора Excel.

    курсовая работа [218,1 K], добавлен 22.08.2013

  • Символьные типы данных, работа со строками, составление блок-схемы алгоритма и программы для работы с массивами. Организация программы с использованием процедур и функций. Процедуры и функции, использующиеся при обработке файлов; компонентные файлы.

    контрольная работа [52,9 K], добавлен 03.10.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.