Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Решение систем линейных уравнений методом Крамера, Решение систем линейных уравнений методо 
:(
    Опции темы
burcev
Дата 6.6.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2008
Где: Украина

Репутация: нет
Всего: нет



Люди нужно срочно переделать код с C++ в Delphi.
Плиз, завтра нужно защетица.
ЗАРАНЕЕ БЛАГОДАРЕН. smile 

Код на С++
-
Код

#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
PM MAIL ICQ   Вверх
Alexeis
Дата 6.6.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Krazy
Дата 7.10.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Готовое решение на Delphi http://plagiata.net.ru/?p=336 есть. И переделывать не надо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.