2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Помогите с задачей C++
Сообщение07.03.2014, 22:33 


07/03/14
2
Цель: считать определитель матрицы 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 
Заслуженный участник


02/08/11
7013
Я вижу три ошибки: отсутствие нормального форматирования и использование двумерных массивов. К сожалению, это не те ошибки, которые ищите вы.
А почему вы считаете, что здесь есть ошибка?

-- 08.03.2014, 00:07 --

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

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение07.03.2014, 23:53 
Заслуженный участник


28/04/09
1933
При вызове функции defMatrix ей передается в качестве параметра не сама матрица, а элемент с несуществующими индексами.
Пару раз загадочные обрамления скобками элементов двумерного массива при вычислении определителя попали не туда: вместо (m стоит m(.
Это я Вам прочитал то, что выдает компилятор. :-)

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

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:02 
Заслуженный участник


02/08/11
7013
EtCetera в сообщении #834017 писал(а):
Они-то в чем провинились?
Они в плюсах неудобоваримы (в плане передачи в функции) и тормозят. Про тормоза правда не проверял лично, в книжке какой-то видел.

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:16 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 00:17 
Заслуженный участник


28/04/09
1933
warlock66613 в сообщении #834020 писал(а):
Они в плюсах неудобоваримы (в плане передачи в функции)
Это еще почему?
Про торможение тоже любопытно узнать подробности.

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 01:49 
Заслуженный участник


02/08/11
7013

(Оффтоп)

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

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 12:41 


07/03/14
2
EtCetera в сообщении #834017 писал(а):
При вызове функции defMatrix ей передается в качестве параметра не сама матрица, а элемент с несуществующими индексами.
Пару раз загадочные обрамления скобками элементов двумерного массива при вычислении определителя попали не туда: вместо (m стоит m(.
Это я Вам прочитал то, что выдает компилятор. :-)

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


Спасибо!!!

 Профиль  
                  
 
 Re: Помогите с задачей C++
Сообщение08.03.2014, 16:07 
Заслуженный участник


28/04/09
1933
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group