Расчетно-графическая работа по программированию — страница 2
предназначенная для ввода числа на которое умножаем матрицы, а потом уже форма с результатом. В программе использованы визуальные компоненты: 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++)
Похожие работы
- Рефераты
- Рефераты