
Новичок
Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина
Репутация: нет Всего: нет
|
Люди нужно срочно переделать код с C++ в Delphi. Плиз, завтра нужно защетица. ЗАРАНЕЕ БЛАГОДАРЕН. Код на С++ - | Код | #include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h>
const int SIZE_J=5; const int SIZE_I=4;
void output(float[][SIZE_J]); void gauss(float[][SIZE_J], int, int, int); void kramer(float[][SIZE_I], float[], int); float opred(float[][SIZE_I], int); float opred_obrat(float[][SIZE_I], int, int, int); void matrix(float[][SIZE_I],float[],int); void gauss_tmp(float[][SIZE_J]);
void main() { float mas[SIZE_I][SIZE_J]={{4,5,6,7,1},{8,9,10,11,2},{12,3,3,5,3},{16,-1,-2,-3,4}}; float mas_a[SIZE_I][SIZE_I]={{4,5,6,7},{8,9,10,11},{12,3,3,5},{16,-1,-2,-3}}; float mas_b[SIZE_I]={1,2,3,4}; float sum=0; int kod; printf("1 Gauss\n2 Kramer\n3 Matrix-1\n\n0 Exit\n\n\n"); while(true) { kod=getch(); switch(kod) { case 49: { system("cls"); printf("1 Gauss\n2 Kramer\n3 Matrix-1\n\n0 Exit\n\n\n"); gauss_tmp(mas); }break; case 50: { system("cls"); printf("1 Gauss\n2 Kramer\n3 Matrix-1\n\n0 Exit\n\n\n"); kramer(mas_a,mas_b,SIZE_I); }break; case 51: { system("cls"); printf("1 Gauss\n2 Kramer\n3 Matrix-1\n\n0 Exit\n\n\n"); matrix(mas_a,mas_b,SIZE_I); }break; case 48: { exit(0); }break; } } }
void gauss_tmp(float mas[][SIZE_J]) { float mas_tmp[SIZE_I][SIZE_J]; for(int i=0;i<SIZE_I;i++) { for(int j=0;j<SIZE_J;j++)mas_tmp[i][j]=mas[i][j]; } gauss(mas_tmp,SIZE_I,SIZE_J,0); }
float opred(float mas[][SIZE_I], int size) { float mas_tmp[SIZE_I][SIZE_I]; float sum=0; if(size==2) { sum+= mas[0][0]*mas[1][1] - mas[0][1]*mas[1][0]; return sum; } for(int j=0;j<size;j++) { int k=0; for(int ipos=0;ipos<size;ipos++) { int l=0; for(int jpos=0;jpos<size;jpos++) { if(ipos!=0 && jpos!=j) { mas_tmp[k][l]=mas[ipos][jpos]; l++; if(l==size-1) { l=0; k++; jpos=size; } } } } sum+=pow(-1,j+i)*mas[0][j]*opred(mas_tmp,size-1); } return sum; }
float opred_obrat(float mas[][SIZE_I], int size, int i, int j) { float mas_tmp[SIZE_I][SIZE_I]; float sum=0; int k=0; for(int ipos=0;ipos<size;ipos++) { int l=0; for(int jpos=0;jpos<size;jpos++) { if(ipos!=i && jpos!=j) { mas_tmp[k][l]=mas[ipos][jpos]; l++; if(l==size-1) { l=0; k++; jpos=size; } } } } sum+=pow(-1,j+i)*opred(mas_tmp,size-1); return sum;
}
void matrix(float mas_a[][SIZE_I], float mas_b[], int size) { float mas_tmp[SIZE_I][SIZE_I]; float sum; float opr_main; float tmp; opr_main=opred(mas_a,size); for(int i=0;i<size;i++) { for(int j=0;j<size;j++) { mas_tmp[i][j]=opred_obrat(mas_a,size,i,j)/opr_main*pow(-1,i+j); } } for(i=0;i<size;i++) { for(int j=i;j<size;j++) { tmp=mas_tmp[i][j]; mas_tmp[i][j]=mas_tmp[j][i]; mas_tmp[j][i]=tmp; } } for(i=0;i<size;i++) { sum=0; for(int j=0;j<size;j++) { sum+=mas_tmp[i][j]*mas_b[j]; } printf("x=%f\n",sum); } }
void kramer(float mas_a[][SIZE_I], float mas_b[SIZE_I], int size) { float opr_main; float opr_tmp; float mas_tmp[SIZE_I][SIZE_I]; float x; opr_main=opred(mas_a,SIZE_I); for(int k=0;k<size;k++) { for(int i=0;i<size;i++) { for(int j=0;j<size;j++) { if(j==k) { mas_tmp[i][j]=mas_b[i]; } else mas_tmp[i][j]=mas_a[i][j]; // printf("%.0f ",mas_tmp[i][j]); }//printf("\n"); } opr_tmp=opred(mas_tmp,size); x=opr_tmp/opr_main; printf("x=%f\n",x); } }
void gauss(float mas[][SIZE_J], int size_i, int size_j, int start) { float x, y, z, t; if(start==size_j-2) { int i=0; t=mas[i][size_j-1]/mas[i][start]; i++; start--; z=(mas[i][size_j-1]+t)/mas[i][start]; i++; start--; y=(mas[i][size_j-1]+t+z)/mas[i][start]; i++; start--; x=(mas[i][size_j-1]+t+z+y)/mas[i][start]; i++; start--; printf("x=%f\nx=%f\nx=%f\nx=%f\n",x,y,z,t); return; } float del; float tmp; for(int i=0;i<=size_i-(start+1);i++) { del=mas[i][start]; for(int j=0;j<size_j;j++) { mas[i][j]=mas[i][j]/del; } } for(int j=0;j<size_j;j++) { tmp=mas[0][j]; mas[0][j]=mas[size_i-(start+1)][j]; mas[size_i-(start+1)][j]=tmp; } for(i=0;i<size_i-(start+1);i++) { for(int j=0;j<size_j;j++) { mas[i][j]=mas[size_i-(start+1)][j]-mas[i][j]; } } gauss(mas,size_i,size_j,start+1);
}
void output(float mas[][SIZE_J]) { for(int i=0;i<SIZE_I;i++) { for(int j=0;j<SIZE_J;j++) printf("%.4f ",mas[i][j]); printf("\n"); } }
|
или | Код | #include <tchar.h> #include <iostream>
using namespace std;
/*функция возведения в определённую степень числа -1*/ int mypow(int x){ int y=1; for(int z=1;z<=x;z++){ y*=-1; } return y; }
/*класс матрица*/ class matrix{ public:
/*Конструктор: все элементы 0, размерность 0 */ matrix(){ size=0; for(int x=0;x<=100;x++) for(int y=0;y<=100;y++) m[x][y]; } /*Рекурсивная функция вычисления определителя */ int GetDet(){ int result=0; if(size==1){ //Если у матрицы размерность 2(математическая, С`шная 1), то вычисляем определитель return m[0][0]*m[1][1]-m[0][1]*m[1][0]; } else{ /*Вычисляем определитель путём вычёркивания строк и столбцов. Берём элементы из первой строки. */ for(int x=0;x<=size;x++){ result+= mypow(x+2)*m[0][x]*(GetNew(x)).GetDet(); //рекурсия... } return result; } }
/*Функия получения новой матрицы из старой, путём вычёркивания первой(нулевой) строки и х`овой колонки*/ matrix GetNew(int st){ matrix result; int z=0; result.size=size-1;
for(int x=1;x<=size;x++){ for(int y=0;y<=size;y++){ if(y!=st){ result.m[x-1][z]=m[x][y]; z++; } } z=0; } return result; }
/*Функция вывода на экран квадратной матрицы*/ void echo(void){ for(int x=0;x<=size;x++){ for(int y=0; y<=size;y++){ cout<<m[x][y]<<" "; } cout<<"\r\n"; } } /*Функция вывода на экран матрицы-столбца */ void echoEx(void){ for(int x=0;x<=size;x++){ cout<<m[x][0]<<"\r\n"; } }
/*Функция установки размерности матрицы*/ inline void SetSize(int r){ size=r; }
/*Функция установки значения элемента*/ inline void SetValue(int value, int x , int y){ m[x][y]=value; }
/*Функция замены колонки на матриуц-столбец*/ inline void SetColumn(int column , matrix source){ for(int x=0;x<=size;x++){ m[x][column]=source.m[x][0]; } }
private: int m[100][100]; //сама матрица int size; //размерность
}; int _tmain(int argc, _TCHAR* argv[]) { matrix first,second,temp; //наши матрицы int element,size,maindet; //необходимые переменные bool c=1; //для цикла cout<<"The Kramer method for the system of linear equations. By Ky3bMu4 (c) 2007.\r\n\r\n"; while(c){ cout<<"\r\nInsert size of matrix:"; /*тут небольшая неровность: в математике матрица начинается с 1 столбцы, а в С - с 0-го */ cin>>size; first.SetSize(size); second.SetSize(size);
/* вводим основную матрицу */ for(int x =0; x<=size; x++){ for( int y=0; y<=size;y++){ cout<<"\r\nInsert ["<<x<<";"<<y<<"] element of first matrix:"; cin>>element; first.SetValue(element,x,y); } }
/* вводим матрицу-столбец с числами*/ for(int x=0; x<=size; x++){ cout<<"\r\nInsert "<<x<<" element of second matrix:"; cin>>element; second.SetValue(element,x,0); } maindet = first.GetDet(); //вычисляем основной определитель(на него будем делить) if(maindet!=0){ for(int x=0;x<=size;x++){ //кол-во элементов(переменных в линейном уравнении) == размерности главной матрицы. //Заменяем колонку, вычисляем определитель , делим на главный определитель, пробуем сократить и выводим temp = first; temp.SetColumn(x,second); //заменянем колонку cout<<"\r\nElement "<<x<<" = "<<temp.GetDet()<<"/"<<maindet; // выводим на экран } }else{ //облом, главный определитель == 0, Крамер не прокатит :((( cout<<"\r\nSorry, but the main determinat of first matrix is 0.Stop."; }
// The End cout<<"\r\n\r\nFinish!"; cout<<"\r\nDo you want to again calculate new matrix(1/0)?:"; cin>>c; }
return 0; }
|
Это сообщение отредактировал(а) burcev - 6.6.2008, 01:18
|