Форум программистов, компьютерный форум CyberForum.ru

STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 - C++

Восстановить пароль Регистрация
 
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.03.2011, 20:02     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 #1
Привет.
Пытаюсь написать консольную программку для поиска определителя матрицы и нахождения корней линейного уравнения.
Делаю с помощью STL векторов.

Код в принципе скомпилировался,но программа не запустилась.
Есть сообщение,но не могу его понять.
Подскажите где может быть ошибка?
Компилятор выдаёт сообщение такого плана:

[Linker Error] undefined reference to `determinant(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&)'
ld returned 1 exit status
C:\Documents and Settings\All Users\Äîêóìåíòû\Objects\MingW\Output\MingW\Kursovoy_proj_13_03_2011\Makefile.win [Build Error] [Output/MingW/Kursovoy_Project.exe] Error 1

Сам код:

Код
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
void showMenu();
void showInputMatrix(std::vector< std::vector<double> > sq_matrix);
void showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf);
                    
double determinant(std::vector< std::vector<double> > &matrix);
void slau_funct(std::vector< std::vector<double> >& sl_matrix, std::vector<double>& lf, std::vector<double>& lx);
int main(int argc, char *argv[])
{
    
    int choice;
    double dtm;
         
   showMenu();
   cin>>choice;
   
   while(choice != 0){
   switch(choice)
   {
     case 1:
          {
          vector<vector<double> > square_matrix; 
          vector<double> line;
          int n; //=3;
          cout<<"Vvedite razmernost' matrix:\n";
          cin>>n;
          double temp;
          cout<<"Vvedite znachenie:\n";
          for(int i=0;i<n;i++)
          {
            line.clear();
             for(int j=0;j<n;j++)
             {
               cin>>temp;
               line.push_back(temp);                  
                cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);
          }
    
          showInputMatrix(square_matrix);
          
          dtm = determinant(square_matrix);
          cout<<"Determinant = ";
          dec(cout);
          cout<<dtm<<endl;
     break;}
    
     case 2:
    
          {vector<vector<double> > slau_matrix; 
          vector<double> line2;
          vector<double> line_x;
          vector<double> line_f;    // *****slau_matrix * line_x = line_f*****
    
        int m,i2,j2;
        double temp2;
        double temp_f;
        cout<<"Vvedite razmernost' matrix:\n";
        cin>>m;
        cout<<"Vvedite znacheniya v matrix:\n";
           for( i2=0;i2<m;i2++)
           {
             line2.clear();             //ochishaem vector line
             line_x.clear();           //ochishaem vector line_x
             for(j2=0;j2<m;j2++)
             {
                cin>>temp2;
                line2.push_back(temp2);                  
                cout<<"Vvedite znacheniya v matrix:\n";
             }
      
            slau_matrix.push_back(line2);    //sozdaem 2merny massiv
           }
    
            cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            for(i2=0;i2<m;i2++)
            {
               cin>>temp_f;
               line_f.push_back(temp_f);      //zanosim znachenia v vector line_f
               cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            }
    
         showInputMatrix_Vector(slau_matrix, line_f);
         slau_funct(slau_matrix, line_f, line_x);
         
         cout<<"Naidennie znachenia x:\n";
         for(i2=0;i2<line_x.size();i2++)
         {
                cout<<line_x[i2]<<"|";
         }
         
     break;}
     
     default :
            cout<<"exit...\n";
     break;   
   }//end switch
  
   showMenu();
  cin>>choice;
}//end while 


    system("PAUSE");
    return EXIT_SUCCESS;
}


void showInputMatrix(std::vector< std::vector<double> > matrix)
{    
     cout<<"Matrix\n";
       for(int i=0;i<matrix.size();i++)
       {
         for(int j=0;j<matrix.size();j++)
         { 
           dec(cout);
           cout.width(11);
           cout.precision(10);
           cout<<matrix[i][j]<<"|";
         }
        cout<<endl;
       }
}


void showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf)
{       
      int i,j;
        cout<<"Sistema lineynih uravneniy\n";
          for(i=0;i<sl_matrix.size();i++)
          {
            for(int j=0;j<sl_matrix.size();j++)
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<sl_matrix[i][j]<<"|";
            }
           cout<<endl;
          } 
           
           for(j=0;j<lf.size();j++)   //vivod vectora line_f
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<lf[j]<<"\n";
            } 
            
}


void showMenu()
 {
    cout<<"vvedite 1,2 ili 0:\n"
    "1 - Vichislyaem opredelitel matrizcy\n"
    "2 - Reshaem sistemu lineinih uravneny\n"
    "0 - Vihod\n";
 }
 
double determinant(std::vector< std::vector<double> > matrix)
{   //function find determinant
    //
    int i=0, j=0;
    double koef = 1;
    double lastKoef = 0;
    bool checkKoefIsNull = false;
    int length = matrix.size();
    int fullCol = length;
     for(i=0; i<length && koef; i++)
    {
        if(matrix[i][j] != 0)
        {
            if(matrix[i][j] < 0)
            {
                for(int j=0; j<fullCol; j++)
                    matrix[i][j] *= -1;
                koef *= -1;
            }
            double lastKoef = matrix[i][j];
            for(int k=0; k<fullCol; k++)
                matrix[i][k] /= lastKoef;
            koef *= lastKoef;
            for(int nextRow=i+1; nextRow<length; nextRow++)
            {
                lastKoef = matrix[nextRow][j];
                for(int nextCol=j; nextCol<fullCol; nextCol++)
                    matrix[nextRow][nextCol] -= lastKoef*matrix[i][nextCol];
            }
            ++j;
            checkKoefIsNull=false;
        }
        else
        {
            for(int k=0; k<fullCol; k++)
                std::swap(matrix[i][k],matrix[length-1][k]);
            --i;
            koef *= -1;
            if(checkKoefIsNull)
            {
                ++i;
                koef = 0;
            }
            checkKoefIsNull = true;
        }
    }

        return koef;
}


void slau_funct(std::vector< std::vector<double> >& sl_matrix, std::vector<double>& lf, std::vector<double>& lx)
{   //function find x1,x2,...xn in s.l.a.u. 
    int n = lx.size();
    int l = n - 1;
    int j;
    int m;
    double sum;
    lx[l] = lf[l] / sl_matrix[l][l];     // *****slau_matrix * line_x = line_f*****
    for(m = l-1; m > -1; m--)    
    {
      sum = 0;
         for(j = m+1; j < n; j++) 
         {  
          sum = sum + (sl_matrix[m][j] * lx[j]);   
         }
    
      lx[m] = ( 1 /  sl_matrix[m][m]  ) * ( lf[m]  -  sum );
    }
}
Спасибо всем откликнувшимся.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2011, 20:02     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3
Посмотрите здесь:

Граф - WxDev C++ C++
wxDev-C++ C++
Есть-ли поиск по полю в STL? C++
Поиск в STL C++
C++ stl сортировка,поиск
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.03.2011, 20:21     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 #2
C++
1
double determinant(std::vector< std::vector<double> > &matrix);
Прототип.
C++
1
double determinant(std::vector< std::vector<double> > matrix)
Определение.

Разницу сами видите?
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.03.2011, 20:35  [ТС]     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 #3
Подправил спасибо.
Код
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
void showMenu();
void showInputMatrix(std::vector< std::vector<double> > sq_matrix);
void showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf);
                    
double determinant(std::vector< std::vector<double> >& matrix);
void slau_funct(std::vector< std::vector<double> >& sl_matrix, std::vector<double>& lf, std::vector<double>& lx);
int main(int argc, char *argv[])
{
    
    int choice;
    double dtm;
         
   showMenu();
   cin>>choice;
   
   while(choice != 0){
   switch(choice)
   {
     case 1:
          {
          vector<vector<double> > square_matrix; 
          vector<double> line;
          int n; //=3;
          cout<<"Vvedite razmernost' matrix:\n";
          cin>>n;
          double temp;
          cout<<"Vvedite znachenie:\n";
          for(int i=0;i<n;i++)
          {
            line.clear();
             for(int j=0;j<n;j++)
             {
               cin>>temp;
               line.push_back(temp);                  
                cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);
          }
    
          showInputMatrix(square_matrix);
          
          dtm = determinant(square_matrix);
          cout<<"Determinant = ";
          dec(cout);
          cout<<dtm<<endl;
     break;}
    
     case 2:
    
          {vector<vector<double> > slau_matrix; 
          vector<double> line2;
          vector<double> line_x;
          vector<double> line_f;    // *****slau_matrix * line_x = line_f*****
    
        int m,i2,j2;
        double temp2;
        double temp_f;
        cout<<"Vvedite razmernost' matrix:\n";
        cin>>m;
        cout<<"Vvedite znacheniya v matrix:\n";
           for( i2=0;i2<m;i2++)
           {
             line2.clear();             //ochishaem vector line
             line_x.clear();           //ochishaem vector line_x
             for(j2=0;j2<m;j2++)
             {
                cin>>temp2;
                line2.push_back(temp2);                  
                cout<<"Vvedite znacheniya v matrix:\n";
             }
      
            slau_matrix.push_back(line2);    //sozdaem 2merny massiv
           }
    
            cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            for(i2=0;i2<m;i2++)
            {
               cin>>temp_f;
               line_f.push_back(temp_f);      //zanosim znachenia v vector line_f
               cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            }
    
         showInputMatrix_Vector(slau_matrix, line_f);
         slau_funct(slau_matrix, line_f, line_x);
         
         cout<<"Naidennie znachenia x:\n";
         for(i2=0;i2<line_x.size();i2++)
         {
                cout<<line_x[i2]<<"|";
         }
         
     break;}
     
     default :
            cout<<"exit...\n";
     break;   
   }//end switch
  
   showMenu();
  cin>>choice;
}//end while 


    system("PAUSE");
    return EXIT_SUCCESS;
}


void showInputMatrix(std::vector< std::vector<double> > matrix)
{    int i,j;
     cout<<"Matrix\n";
       for(i=0;i<matrix.size();i++)
       {
         for(j=0;j<matrix.size();j++)
         { 
           dec(cout);
           cout.width(11);
           cout.precision(10);
           cout<<matrix[i][j]<<"|";
         }
        cout<<endl;
       }
}


void showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf)
{       
      int i,j;
        cout<<"Sistema lineynih uravneniy\n";
          for(i=0;i<sl_matrix.size();i++)
          {
            for(j=0;j<sl_matrix.size();j++)
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<sl_matrix[i][j]<<"|";
            }
           cout<<endl;
          } 
           
           for(j=0;j<lf.size();j++)   //vivod vectora line_f
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<lf[j]<<"\n";
            } 
            
}


void showMenu()
 {
    cout<<"vvedite 1,2 ili 0:\n"
    "1 - Vichislyaem opredelitel matrizcy\n"
    "2 - Reshaem sistemu lineinih uravneny\n"
    "0 - Vihod\n";
 }
 
double determinant(std::vector< std::vector<double> >& matrix)
{   //function find determinant
    //
    int i=0, j=0;
    double koef = 1;
    double lastKoef = 0;
    bool checkKoefIsNull = false;
    int length = matrix.size();
    int fullCol = length;
     for(i=0; i<length && koef; i++)
    {
        if(matrix[i][j] != 0)
        {
            if(matrix[i][j] < 0)
            {
                for(int j=0; j<fullCol; j++)
                    matrix[i][j] *= -1;
                koef *= -1;
            }
            double lastKoef = matrix[i][j];
            for(int k=0; k<fullCol; k++)
                matrix[i][k] /= lastKoef;
            koef *= lastKoef;
            for(int nextRow=i+1; nextRow<length; nextRow++)
            {
                lastKoef = matrix[nextRow][j];
                for(int nextCol=j; nextCol<fullCol; nextCol++)
                    matrix[nextRow][nextCol] -= lastKoef*matrix[i][nextCol];
            }
            ++j;
            checkKoefIsNull=false;
        }
        else
        {
            for(int k=0; k<fullCol; k++)
                std::swap(matrix[i][k],matrix[length-1][k]);
            --i;
            koef *= -1;
            if(checkKoefIsNull)
            {
                ++i;
                koef = 0;
            }
            checkKoefIsNull = true;
        }
    }

        return koef;
}


void slau_funct(std::vector< std::vector<double> >& sl_matrix, std::vector<double>& lf, std::vector<double>& lx)
{   //function find x1,x2,...xn in s.l.a.u. 
    int n = lx.size();
    int l = n - 1;
    int j;
    int m;
    double sum;
    lx[l] = lf[l] / sl_matrix[l][l];     // *****slau_matrix * line_x = line_f*****
    for(m = l-1; m > -1; m--)    
    {
      sum = 0;
         for(j = m+1; j < n; j++) 
         {  
          sum = sum + (sl_matrix[m][j] * lx[j]);   
         }
    
      lx[m] = ( 1 /  sl_matrix[m][m]  ) * ( lf[m]  -  sum );
    }
}

Щас вылетает окно с сообщением
An Access Violation (Segmentation Fault) has been raised in your programm.

Что это??
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
19.03.2011, 20:36  [ТС]     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 #4
прошу прощения что-то опять сбоит
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.03.2011, 21:32     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3 #5
USHЁL, Ошибка в программе значит. Может где выход за пределы. Может еще что. Дебаггер в руки и вперед.
Yandex
Объявления
19.03.2011, 21:32     STL,Поиск определителя и решение с.л.а.у.,WxDev-C++7.3.1.3
Ответ Создать тему
Опции темы

Текущее время: 06:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru