Рефераты. Расчетно-графическая работа по программированию

Расчетно-графическая работа по программированию

Содержание:

1.    Теоретический материал. Матрицы……………………………3 стр

2.    Описание программы……………………………………………4 стр

3.    Текст программы………………………………………………..11 стр

4.    Примеры…………………………………………………………


 

Теоретический материал. Матрицы

Основные определения.

Матрицей А размера т x n называется прямоугольная таблица из m строк и n столбцов, состоящая из чисел или иных математических выражений aij  (называемых элементами матрицы), i=1,2,3…m; j=1,2,3…n. Квадратной матрицей n-го порядка называется матрица размера п x n. Диагональной называется квадратная матрица, у которой все эле­менты вне главной диагонали (т. е. c индексами i != j) равны нулю. Еди­ничной (обозначается Е) называется диагональная матрица с единицами на главной диагонали. Нулевой называется матрица, все элементы кото­рой равны нулю.

Операции над матрицами

Суммой матриц  А = ij) и В =(bij) одинакового разме­ра называется матрица С=(сij) того же размера, причем сij=aij+bij , для любых i,j.

Произведением матрицы А=(аij) на число λ называется матрица В=(bij) того же размера, что и матрица А, причем  bij = λ аij, для любых i,j.

Транспонированной к матрице А = (аij) называется матрица Ат = (атij) такая что,

атij = аji , для любых i,j

Любой квадратной матрице можно поставить в соответствие выражение, которое называется определителем (детерминантом), обозначается det А.





Описание программы

Данная программа предназначена для работы с матрицами. Можно заполнять их самостоятельно, а можно случайным образом, автоматически; причем имеются ввиду дробные числа типа (3/6 или 1*2/3, например). Программа самостоятельно выделяет в дробях целую часть, не зависимо, положительная дробь или отрицательная. В данной программе предусмотрены некоторые действия с матрицами, подробнее о которых речь будет вестись ниже.

В программе работаем с тремя формами, из которых одна основная. В этой форме происходит заполнение матриц, а также находятся кнопки вызова других форм и кнопки действий. Каждый раз результат какого либо действия, кроме нахождения определителя, будет выводится на вторую форму. Если вы хотите умножить матрицу на число, то сначала появится третья форма, предназначенная для ввода числа на которое умножаем матрицы, а потом уже форма с результатом.

В программе использованы визуальные компоненты: Button, RadioButton, String Grid, CSpinEdit, PopupMenu и т.д.

Для работы с дробями, был создан класс drob. Он содержит числитель, знаменатель и целую часть, для выделения которой в классе прописана специальная функция videlen.

class drob

{

    public:

    int chisl;

    int znamen;

    int cel;

    drob ()

    {

        chisl=znamen=cel=0;

    }

    int videlen ()

    {

        if (!cel && chisl && znamen && abs(chisl)>=abs(znamen))

        {

            cel=(int)chisl/znamen;

            chisl=(int)chisl%(int)znamen;

        }

        else

            if (cel && chisl && znamen && abs(chisl)>=abs(znamen))

            {

                cel=cel+((int)chisl/znamen);

                chisl=(int)chisl%(int)znamen;

            }

        return 0;

    }

};

Для считывания числителя и знаменателя любого экземпляра класса дробей, создан класс Анализатора выражений. Который при считывании символа «/»,все что было считано до него заносит в числитель, все что после - в знаменатель. В этом классе прописаны функции преобразования символьных строк в целочисленные значения (Convert), получения (считывания) символов (Get), анализа выражения (что заносить в числитель, что  в знаменатель) (Analiz), и функция вызывающая все эти функции (MAIN).

class Analisation

{

    char *ptr;

    char token [80];

    char ttype;

    drob vrem;

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

    void Analiz(double &result)

    {

        register char op;

        double temp;

        Convert(result);

        while((op=*token)=='*' || op=='/' )

        {

            Get();

            Convert(temp);

            switch (op)

            {

                case '*':

                    vrem.cel=result;

                    break;

                case '/':

                    vrem.chisl=result;

                    vrem.znamen=temp;

                    break;

            }

        }

    }

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

    void Convert(double &result)

    {

        result=(double)atof(token);

        Get();

        return;

    }

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

    void Get()

    {

        register char *temp;

        ttype=0;

        temp=token;

        *temp='\0';

        if(!*ptr)return;

        while(isspace(*ptr))++ptr;

        if(strchr("/*",*ptr))

        {

            ttype=DELIM;

            *temp++=*ptr++;

        }

        else if(isdigit(*ptr))

        {

            while(!isdelim(*ptr))*temp++=*ptr++;

            ttype=NUMB;

        }

        *temp='\0';

    }

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

    int isdelim(char c)

    {

        if (strchr("/*",c))return 1;

        else return 0;

    }

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

    public:

    Analisation()

    {

        ptr=NULL;

    }

    drob MAIN(char*exp)

    {

        double result;

        ptr=exp;

        Get();

        Analiz(result);

        return vrem;

    }

};

Сами матрицы создаются как экземпляры класса matrix, который содержит поля:

размерность матрицы, непосредственно матрицу (типа drob), ее определитель (det), а также функции получения значений размеров матрицы, функцию считывания значений элементов матрицы из StringGrida и функцию нахождения определителя. Помимо всего прочего в классе используется перегрузка операторов сложения, вычитания, умножения и т.д.

class matrix

{

    protected:

    int x,y;

    drob det;

    public:

    drob **matr;

    matrix (int x1, int y1);

    int Getx () { return x; };

    int Gety () { return y; };

    void Read (TStringGrid *sg, Analisation &obj);

    matrix operator* (drob number);

    matrix operator* (int num);

    drob Determinant ();

};

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

matrix::matrix (int x1, int y1)

{

    x=x1;

    y=y1;

    det.chisl=det.znamen=det.cel=0;

    matr=new drob *[x];

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

        matr[i]=new drob [y];

}

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

void matrix::Read (TStringGrid *sg, Analisation &obj)

{

    char ***temp;

    temp=new char **[x];

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

        temp[i]=new char *[y];

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

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

            temp[i][j]=sg->Cells[j][i].c_str();

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

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

        {

            matr[i][j]=obj.MAIN(temp[i][j]);

        }

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

        delete temp[i];

    delete [] temp;

}

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

matrix matrix::operator* (drob number)

{

    matrix res (x,y);

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

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

        {

            res.matr[i][j].chisl=number.chisl*matr[i][j].chisl;

            res.matr[i][j].znamen=number.znamen*matr[i][j].znamen;

        }

    return res;

}

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

matrix matrix::operator* (int num)

{

    matrix res (x,y);

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

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

        {

            res.matr[i][j].chisl=num*matr[i][j].chisl;

            res.matr[i][j].znamen=matr[i][j].znamen;

        }

    return res;

   

}

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


drob matrix::Determinant ()

{

    drob det1;

    drob det2;

    if (x!=y) MessageBox(NULL,"Ну кто так делает :)",

    "ЧАЙНИК!!",MB_ICONEXCLAMATION);

    if(x==2 && y==2)

    {

        det1=matr[0][0]*matr[1][1];

        det2=matr[0][1]*matr[1][0];

        det=det1-det2;

        det.videlen();

    }

    if (x==1 && y==1)

    {

        det=matr[0][0];

        det.videlen();

    }

    return det; }

Текст программы:

#include <vcl.h>

#include <fstream.h>

#pragma hdrstop

#include "matrix.h"

#include "Resultunit.h"

#include "Numberunit.h"

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

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"

TMainForm *MainForm;

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

///КЛАСС ДРОБЕЙ///

class drob

{

    public:

    int chisl;

    int znamen;

    int cel;

    drob ()

    {

        chisl=znamen=cel=0;

    }

    int videlen ()

    {

        if (!cel && chisl && znamen && abs(chisl)>=abs(znamen))

        {

            cel=(int)chisl/znamen;

            chisl=(int)chisl%(int)znamen;

        }

        else

            if (cel && chisl && znamen && abs(chisl)>=abs(znamen))

            {

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.