2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите с задачей C++
Сообщение07.03.2014, 22:33 
Цель: считать определитель матрицы 3х3. Помогите найти ошибку...

Код:
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

int detMatrix(int m[3][3]);

int main(int nArg, char* pszArgs[])
{
  cout << "Эта программа предназначена для "
       << " вычисление определителя матрицы  3x3\n\n";
 
  int matrix[3][3],i,j;
   
 
//Введение значений элементов матрицы
  for(i=0 ; i<=2 ; i++)
  {
    for( j=0 ; j<=2 ; j++)
    {
    cout << "Введите элемент строки №  "
         << i+1 << " столбца №  " << j+1
         << ": ";
    cin  >> matrix[i][j];
    }
  }
//Вывод матрицы на экран
  cout << "\nМатрица: \n";
  for(i=0 ; i<=2 ; i++)
  {
    for( j=0 ; j<=2 ; j++)
    {
    cout << matrix[i][j] << "\t";   
    }
    cout << "\n";
  }

//Вывод определителя на экран
  cout << "Определитель матрицы равен: "
          << detMatrix(matrix[3][3]);
       
  system("PAUSE");
  return 0;
}

int detMatrix(int m[3][3])
  {
   int localDeterminant;
   localDeterminant = (((m[0][0])*(m[1][1])*(m[2][2])) - ((m[0][0])*(m[1][2])*m([2][1])) - ((m[0][1])*(m[1][0])*(m[2][2])) + ((m[0][1])*m([1][2])*(m[2][0])) + ((m[0][2])*(m[1][0])*(m[2][1])) - ((m[0][2])*(m[1][1])*(m[2][0])));
   return localDeterminant;
  }

 
 
 
 Re: Помогите с задачей C++
Сообщение07.03.2014, 23:06 
Я вижу три ошибки: отсутствие нормального форматирования и использование двумерных массивов. К сожалению, это не те ошибки, которые ищите вы.
А почему вы считаете, что здесь есть ошибка?

-- 08.03.2014, 00:07 --

А, это C++. Тогда ещё четвёртая: отрыв объявлений переменных от инициализации.

 
 
 
 Re: Помогите с задачей C++
Сообщение07.03.2014, 23:53 
При вызове функции defMatrix ей передается в качестве параметра не сама матрица, а элемент с несуществующими индексами.
Пару раз загадочные обрамления скобками элементов двумерного массива при вычислении определителя попали не туда: вместо (m стоит m(.
Это я Вам прочитал то, что выдает компилятор. :-)

warlock66613 в сообщении #834003 писал(а):
использование двумерных массивов
Они-то в чем провинились?

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:02 
EtCetera в сообщении #834017 писал(а):
Они-то в чем провинились?
Они в плюсах неудобоваримы (в плане передачи в функции) и тормозят. Про тормоза правда не проверял лично, в книжке какой-то видел.

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:16 
warlock66613 в сообщении #834020 писал(а):
EtCetera в сообщении #834017 писал(а):
Они-то в чем провинились?
Они в плюсах неудобоваримы (в плане передачи в функции) и тормозят. Про тормоза правда не проверял лично, в книжке какой-то видел.
Они в плюсах ничем не отличаются от них же в C. И тормозов никаких нет.
Вы наверное слышали про нюанс с любыми массивами при передаче их в качестве аргумента в фунцию, да забыли, какой именно нюанс. Опять же, от простого C здесь отличий нет.

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:17 
warlock66613 в сообщении #834020 писал(а):
Они в плюсах неудобоваримы (в плане передачи в функции)
Это еще почему?
Про торможение тоже любопытно узнать подробности.

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 01:49 

(Оффтоп)

EtCetera в сообщении #834026 писал(а):
Это еще почему?
Ну как почему? Потому что все размеры кроме последнего обязательно фиксированы. Как только вам нужны обе размерности переменными, приходится переходить к более общей схеме на основе одномерного массива.
EtCetera в сообщении #834026 писал(а):
Про торможение тоже любопытно узнать подробности.
Подробностей я не знаю. Кажется у Флёнова где-то было написано, что многомерные массивы тормозят и лучше пользоваться одномерными. Но я не помню, чтобы у него в свою очередь были подробности. Я прочитал и обрадовался, что есть такой отличный предлог.
Щас проверил на простом тесте на gcc. Вариант с многомерным массивом чуть быстрее при рандомном доступе и сильно быстрее при последовательном (хотя, конечно, если при последовательном доступе в "одномерном" варианте добавить бегущий пойнтер, то наверно будет одинаково).

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 12:41 
EtCetera в сообщении #834017 писал(а):
При вызове функции defMatrix ей передается в качестве параметра не сама матрица, а элемент с несуществующими индексами.
Пару раз загадочные обрамления скобками элементов двумерного массива при вычислении определителя попали не туда: вместо (m стоит m(.
Это я Вам прочитал то, что выдает компилятор. :-)

warlock66613 в сообщении #834003 писал(а):
использование двумерных массивов
Они-то в чем провинились?


Спасибо!!!

 
 
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 16:07 
warlock66613 в сообщении #834036 писал(а):
Потому что все размеры кроме последнего обязательно фиксированы. Как только вам нужны обе размерности переменными, приходится переходить к более общей схеме на основе одномерного массива.
Вы, вероятно, имеете в виду статические массивы (поскольку в C++ нет многомерных динамических массивов). Однако про статические массивы многое известно уже на этапе компиляции, поэтому все размеры можно "освободить" с помощью шаблонов:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <iomanip>

template <size_t n, size_t m>
void fill_array(int (&x)[n][m])
{
    int k = 0;
   
    for (size_t i = 0; i < n; ++i)
    {
        for (size_t j = 0; j < m; ++j)
        {
            x[i][j] = ++k;
        }
    }
}

template <size_t n, size_t m>
void print_array(const int (&x)[n][m])
{
    std::cout << "n = " << n << ", m = " << m << std::endl;
    for (size_t i = 0; i < n; ++i)
    {
        for (size_t j = 0; j < m; ++j)
        {
            std::cout << std::setw(5) << x[i][j];
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}

int main()
{
    int a[2][5];
    int b[4][3];
   
    fill_array(a);
    print_array(a);
    fill_array(b);
    print_array(b);
}
warlock66613 в сообщении #834036 писал(а):
Щас проверил на простом тесте на gcc. Вариант с многомерным массивом чуть быстрее при рандомном доступе и сильно быстрее при последовательном (хотя, конечно, если при последовательном доступе в "одномерном" варианте добавить бегущий пойнтер, то наверно будет одинаково).
Что ж, теперь можно расслабиться и спокойно продолжать пользоваться многомерными массивами. :-)

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group