Member 13465205 Ответов: 4

Почему выходные данные программы таковы в C++?


Вход 2-2-2 выход junt "4".

Что я должен сделать, чтобы получить правильный результат?

Что я уже пробовал:

#include<iostream>

using namespace std;

int i,j,k,resultt;
float a[10][10],b[10][10];

class result {
public:
//	int a[10][10],b[10][10],mlt[10][10],i,j;

float mlt[10][10];


float multipication_matrices()
{

/*	int i,j,k,result,mult;
for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
{
mlt[i][j]=0;
}	*/

for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
for(k = 0; k < 4; ++k)
{

resultt = mlt[i][j] = a[i][k] * b[k][j];
}	

return resultt;}




}r;

int main()
{



cout << "Enter elements of matrix 1:" << endl;
for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
{
cout << "Enter element a" << i + 1 << j + 1 << " : ";
cin >> a[i][j];
}


cout << "Enter elements of matrix 2:" << endl;
for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
{
cout << "Enter element b" << i + 1 << j + 1 << " : ";
cin >> b[i][j];
}


cout << endl << "Output Matrix: " << endl;
for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
{ 
cout << " " << r.multipication_matrices();
if(j == 4-1)
cout << endl;
}

return 0;
}

Richard MacCutchan

Вы объявили свои массивы в двух местах, поэтому числа хранятся не в том месте.

Patrice T

и что же должен делать этот код?

Member 13465205

ладно, я все исправлю. но опять же. а теперь выходы будут Би 47-47-47.... :)

Member 13465205

4x4 матричное умножение с функцией в классе.

Richard MacCutchan

result = mlt[i][j] += a[i][k] * b[k][j];
А почему у вас есть += в этом заявлении? Я бы подумал просто =.

Member 13465205

но этого недостаточно для бега.

Richard MacCutchan

Что это значит?

Member 13465205

я делаю"=", но этого недостаточно для истинного вывода.

Richard MacCutchan

Извините, но это действительно не помогает. Пожалуйста, отредактируйте свой вопрос с помощью последнего кода, который вы пробовали, и объясните точно, какие значения используются для входных данных и какие результаты вы видите.

Richard MacCutchan

Пожалуйста, прочтите мой предыдущий комментарий еще раз и предоставьте то, что я просил. И, пожалуйста, используйте Улучшить вопрос ссылка для размещения информации в вопросе.

Richard MacCutchan

Последний цикл в вашем коде не имеет никакого смысла. Вызов r.multipication_matrices(); всегда будет возвращать одно и то же значение, которое является результатом последней операции умножения. Дизайн вашего класса на самом деле не помогает вам. То, что вы должны иметь в качестве класса, - это матричный класс, который может динамически создавать новую матрицу при ее создании. Затем вы можете добавить методы для сложения, вычитания, умножения и деления с использованием других матричных объектов.

4 Ответов

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик teh, чтобы выяснить, почему. Поставить точку останова на строке:
cout << " " << r.multipication_matrices();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
2

Richard MacCutchan

Попробуйте что-нибудь вроде этого:

#include<iostream>

using namespace std;


class Matrix {

    int** _matrix;
    int nRows;
    int nColumns;
public:
    Matrix() : Matrix(2, 3)
    {
    }

    Matrix(int rows, int columns)
    {
        nRows = rows;
        _matrix = new int*[nRows];
        nColumns = columns;
        for (int row = 0; row < nRows; ++row)
        {
            _matrix[row] = new int[nColumns];
            for (int column = 0; column < nColumns; ++column)
                _matrix[row][column] = (row + 2) * (column + 1);
        }
    }

    void multiply(Matrix& otherMatrix)
    {
        for (int row = 0; row < nRows; ++row)
        {
            for (int column = 0; column < nColumns; ++column)
            {
                _matrix[row][column] *= otherMatrix._matrix[column][row];
            }
        }
    }

    void print()
    {
        for (int row = 0; row < nRows; ++row)
        {
            for (int column = 0; column < nColumns; ++column)
            {
                cout << "    " << _matrix[row][column] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }
};

int main()
{
    Matrix foo(2, 3);
    Matrix bar(3, 2);

    cout << "foo : " << endl;
    foo.print();
    cout << "bar : " << endl;
    bar.print();

    foo.multiply(bar);
    cout << "foo : " << endl;
    foo.print();

    cin.get();

    return 0;
}


Рейтинг:
2

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию.

#include<iostream>

using namespace std;

int i,j,k,resultt;
float a[10][10],b[10][10];

class result {
    public:
        //  int a[10][10],b[10][10],mlt[10][10],i,j;
        float mlt[10][10];
        float multipication_matrices()
        {
            for(i = 0; i < 4; ++i)
                for(j = 0; j < 4; ++j)
                    for(k = 0; k < 4; ++k)
                    {
                        resultt = mlt[i][j] = a[i][k] * b[k][j];
                    }
            return resultt;
        }
    }r;

    int main()
    {
        cout << "Enter elements of matrix 1:" << endl;
        for(i = 0; i < 4; ++i)
            for(j = 0; j < 4; ++j)
            {
                cout << "Enter element a" << i + 1 << j + 1 << " : ";
                cin >> a[i][j];
            }
        cout << "Enter elements of matrix 2:" << endl;
        for(i = 0; i < 4; ++i)
            for(j = 0; j < 4; ++j)
            {
                cout << "Enter element b" << i + 1 << j + 1 << " : ";
                cin >> b[i][j];
            }
        cout << endl << "Output Matrix: " << endl;
        for(i = 0; i < 4; ++i)
            for(j = 0; j < 4; ++j)
            {
                cout << " " << r.multipication_matrices();
                if(j == 4-1)
                    cout << endl;
            }
        return 0;
    }

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
----
Вы можете упростить свой код, изменив это:
for(i = 0; i < 4; ++i)
    for(j = 0; j < 4; ++j)
    {
        cout << " " << r.multipication_matrices();
        if(j == 4-1)
            cout << endl;
    }

до настоящего времени
for(i = 0; i < 4; ++i)
{
    for(j = 0; j < 4; ++j)
    {
        cout << " " << r.multipication_matrices();
    }
    cout << endl;
}

Это всего лишь мелочь в этом коде, но в реальном проекте это облегчает понимание вещей.
-----
Цитата:
вход 2-2-2 выход junt "4". как я это делаю ?
для истинного результата ?

Ваш код делает именно то, что он должен делать, вы только забыли сказать нам, что вы хотите, чтобы он делал, что вы ищете.
Таким образом, никто не может помочь вам в этом, я могу только предложить вам изучить отладчик и исследовать ваш код.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

CPallini

Я бы не стал делать класс result В простой (хотя и наивной) реализации я бы предпочел сделать класс Matrix.

#include <iostream>

enum { N = 4 };

struct Matrix
{
  int x[N][N];

  void input(); 
  void output();
};

void Matrix::input()
{
  for (int r = 0; r < N; ++r)
    for (int c = 0; c < N; ++c)
    {
      std::cout << "enter item [" <<  (r+1) << "][" << (c+1) "]"<< std::endl;
      std::cin >> x[r][c];
    }
}

void Matrix::output()
{
  for (int r = 0; r < N; ++r)
  {
    for (int c = 0; c < N; ++c)
    {
      std::cout << x[r][c] << " ";
    }
    std::cout << std::endl;
  }
}

<pre>Matrix multiply(const Matrix & a, const Matrix & b)
{
  Matrix mul;

  for (int r = 0; r < N; ++r)
    for (int c = 0; c < N; ++c)
    {
      mul.x[r][c] = 0;
      for (int k = 0; k < N; ++k)
        mul.x[r][c] += a.x[r][k] * b.x[k][c];
    }
  return mul;
}

int main()
{
  Matrix a,b,ab;

  std::cout << "please enter the items of the first matrix" << std::endl;
  a.input();

  std::cout << "please enter the items of the second matrix" << std::endl;
  b.input();

  ab = multiply(a,b);
  std::cout << "here you are the product of the matrices" << std::endl;
  ab.output();
}


Использование более продвинутых технологий C++ языковые функции (например, шаблоны) вы могли бы написать более элегантный код.


Member 13465205

спасибо за помощь. :) "используя более продвинутые функции языка C++ (например, шаблоны), вы могли бы написать более элегантный код". но я должен использовать класс.

CPallini

Ну, шаблоны и классы не являются взаимоисключающими.

Member 13465205

я должен использовать функцию в классе. код хочет сначала 16 чисел и снова 16 чисел и взять память, затем функцию в классе вычислить умножение матрицы, затем этот расчет будет выведен... я делаю код, но он не содержит класса или функции, я должен преобразовать этот код.

CPallini

Почему "ты должен"? Это домашнее задание?

Member 13465205

yes.so-я должен это сделать