Вычисляя детерминант данные, введенные


Эта программа должна вычислить детерминант введенных данных. Я считаю, что это делает. В рамках этих учений мы не сломать для функций, но все из основных. Мы будем разбить его на функции в части A и B это упражнение.

Однако, я не знаю достаточно о матрицах и определителях все-таки знать, если я использую уравнение дано мне правильно. Я знаю, что это помещает данные на экран правильно и формулу Дали, был:

determinant = (AEI) + (BFG) + (CDH) - (BDI) - (AFH) - (CEG)

приравнивает к элементам массива:

00 * 11 * 22 + 01 * 12 * 20 + 02 * 10 * 21- 01 * 10 * 22 - 00 * 12 * 21 - 02 * 11 * 20

Учитывая 3х3 блока, где первый ряд-это букварь, вторую строку Def и третий ряд гхи.

Я прошу его быть проанализированы и подвергнуты критике.

# include <iostream>
# include <stdio.h>
# include <iomanip>

using namespace std;

int main()
{
    int x,y,z,;
    char ch;
    float  My3DMatrix[3][3];
    int mReader[9];
    for (x = 0 ; x <= 8 ; x++)//This array is for accessing the Matrix elements in
    {                     //the prescribed manner to calculate the determ.
        y = x;
        if( x == 3 || x == 8 )y = 1;
        if(x == 4 || x ==6 )y = 2;
        if(x == 5 || x == 7 )y = 0;
        mReader[x] = y;
    }
    do  //This initiates the main loop
    {
        cout<<"Calculation of  3 x 3 Determinant"<<endl<<endl;
        for(x = 0; x<=2 ;x++) // This loop querries the user for 
        {                     //input and feeds the My3DMatrix
            cout<<"What is row "<<x+1<<" of the matrix? ";
            for (y = 0 ; y <=2 ; y++)
            {
                cin>>My3DMatrix[x][y];
            }   //The matrix is now fed
        }
        cout<<"\nThe 3 x 3 Matrix entered is: "<<endl; //Now the Raw
        cout<<setprecision(3)<<fixed; //Matrix data is displayed
        for(x = 0 ; x<=2 ; x++)
        {
            cout<<My3DMatrix[x][0]<<"\t"<<My3DMatrix[x][1]<<"\t"
                <<My3DMatrix[x][2]<<endl;
        }
        float Determinant[6]; //This array is for storing the 6
        y = -1 ; z = 0; //products from each row of the matrix
        for(x = 0 ; x <= 8 ; x++)// There are 9 indexes to create 3 products from
        {   //This loop pulls the correct indexes from My3DMatrix then  creates
            if (z>=3) z = 0; //and stores the products into Determinant[x] 0 - 2
            if ((x % 3) == 0 || x == 0)
            {
                y = y + 1;
                Determinant[y] = 1;
            }
            Determinant[y] =  Determinant[y] * My3DMatrix[z][mReader[x]];
            z = z + 1;
        }
        y = 2 ; z = 0;
        for(x = 9 ; x >= 1 ; x--)// There are 9 indexes to create 3 products from
        {       //This loop pulls the correct indexes from My3DMatrix then creates
            if (z>=3) z = 0;//and stores the products into Determinant[x] 3 - 5
            if ((x % 3) == 0 || x == 0)
            {
                y = y + 1;
                Determinant[y] = 1;
            }
            Determinant[y] =  Determinant[y] * My3DMatrix[z][mReader[x - 1]];
            z = z + 1;
        }
        float myAnswer;
        myAnswer = 0;//Here with Determinant[6] loaded with the correct index products:
        myAnswer = Determinant[0] + Determinant[1] + Determinant[2] ; //The deternm.
        myAnswer = myAnswer -  Determinant[3] - Determinant[4] - Determinant[5]; //and simple calculation is plain 
            cout<<"The determinant of the above matrix is: "<< myAnswer<< endl;
        cout<<"Would you like to Do another Matrix (Y/N)? ";

        cin>>ch ;
    }while(ch == 'Y' || ch == 'y');

    cin.get();

    return 0;
}


209
1
c++
задан 15 ноября 2011 в 10:11 Источник Поделиться
Комментарии
1 ответ

Общие замечания:

Используйте одну строку в переменной.

int x,y,z,;

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

int mReader[9];
for (x = 0 ; x <= 8 ; x++)

// try
int mReader[9];
for (x = 0 ; x < 9 ; x++) // easy to see correlation between x and mReader

Переменные X, Y и Z не используются для передачи информации между различными петлями. Поэтому вместо того, чтобы объявить их в верхней объявить их как можно ближе к точке использования, как это возможно. Ваши петли должны выглядеть примерно так:

for(int x = 0; x<=2 ;x++)
// ^^^ x is local to the loop

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

Этот тест кажется немного излишним:

if ((x % 3) == 0 || x == 0)
// ^^^^^^^^^ Why? if x == 0 then (x % 3) == 0 thus the second part of the
// test will never be evaluated.

Вы уверены, что это правильно?

for(x = 9 ; x >= 1 ; x--)

Похоже, что Х никогда не достигнет 0. Как выясняется, это правильно, даже если это выглядит неправильно. Но вы должны прочитать остальную часть кода, чтобы убедиться, что он правильно используется. Написание кода Вы должны просканировать вперед, чтобы определить правильность-это не очень хорошая идея. Я бы петли таким же образом, как и все другие петли (используя другое имя переменной), а затем отрегулируйте использования.

for(int reverseX = 0 ; reverseX < 9 ; ++reverseX)
{
.....
Determinant[y] = Determinant[y] * My3DMatrix[z][mReader[9 - 1 - reverseX]];

Это работает?

cin.get();

Похоже, вы пытаетесь приостановить программу до завершения. Но для меня это выглядит как его попробовать и проглотить '\н' с момента последнего нажатия клавиши "ввод", и при этом ничего не делать.

3
ответ дан 15 ноября 2011 в 11:11 Источник Поделиться