``````//I have a problem with my program,
// the function rank to find rank of a matrix
//cannot return the result
//somebody help me to correct it!

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

class matrix
{
int n,m;
double A[6][6];
public:
//.....
friend int rank(matrix);
};
int rank(matrix B)
{
int i, j, r, c;
int rankmt=B.m;
i=0;
j=0;
while(i<B.m&&j<B.n)
{
if(B.A[i][j]==0)
{
r=i+1;
while(r<B.m&&B.A[r][j]==0)
r++;
if(r==B.m)
{i++; j++; continue;}

for(c=0; c<B.n; c++)
{
double temp= B.A[r][c];
B.A[r][c]=B.A[i][c];
B.A[i][c]=temp;
}
}
}
while(i<B.m&&j<B.n)
{
if(B.A[i][j]!=0)
{
r=i+1;
while(r<B.m&&B.A[r][j]!=0)
{
for(c=0;c<B.n;c++)
B.A[r][c]-=B.A[i][c]*B.A[r][j]/B.A[i][j];
r++;
if(r==B.m)
break;
}
}
i++;
j++;
continue;
}

for(i=0;i<B.m;i++)
for(j=0;j<B.n;j++)
if(B.A[i][j]!=0)
break;
else
if(j=B.n)
rankmt--;

return rankmt;
}
void main()
{
matrix m1;
//...
cout<<rankmt(m1);
}``````

This is quite a complicated function. It is almost impossible to follow - you have multiple nested loops, one letter variable names, and NO comments!! Just because it is called "code" doesn't mean it has to look like an encrypted document! Every one of those nested loops could probably be …

## All 6 Replies

This is quite a complicated function. It is almost impossible to follow - you have multiple nested loops, one letter variable names, and NO comments!! Just because it is called "code" doesn't mean it has to look like an encrypted document! Every one of those nested loops could probably be broken out into function. I bet you that code contains something like a SumRow(int) function and SumDiagonal(), etc. If you write it modularly like this, then you can test each function individually and see exactly which piece is going wrong.

This is quite a complicated function. It is almost impossible to follow - you have multiple nested loops, one letter variable names, and NO comments!! Just because it is called "code" doesn't mean it has to look like an encrypted document! Every one of those nested loops could probably be broken out into function. I bet you that code contains something like a SumRow(int) function and SumDiagonal(), etc. If you write it modularly like this, then you can test each function individually and see exactly which piece is going wrong.

thank daviddoria!!!
I've corected my program after test each function individually. :icon_cheesygrin:

I'm not good at English
I post my progam after I corect

``````int rank(matran B)
{
int rankmt,i,j,r,c;
rankmt=B.m;
//**************************
for(i=1; i<=B.m; i++)
for(j=1; j<=B.n; j++)
{
if(B.A[i][j]==0&&i==j)
{
for(r=i+1; r<=B.m; r++)
if(B.A[r][j]!=0)
{
for(c=1; c<=B.m; c++)
{
double temp= B.A[r][c];
B.A[r][c]=B.A[i][c];
B.A[i][c]=temp;
}
break;
}
}
else
break;
}
//**************************
for(i=1; i<=B.m; i++)
for(j=1; j<=B.n; j++)
{
if(B.A[i][j]!=0&&i==j)
r=i+1;
while(r<=B.m)
{
double k=B.A[r][j]/B.A[i][j];
for(c=1; c<=B.n; c++)
B.A[r][c]=B.A[r][c]-k*B.A[i][c];
r++;
}
}
//***************************

for(i=1; i<=B.m; i++)
{
for(j=1; j<=B.n; j++)
if(B.A[i][j]!=0)
break;
else
if(j==B.n)
rankmt--;
}
return rankmt;
}``````

Thanks, that is a very important step, so others can see the solution as well.

There should be a section at the bottom of the thread that says "Has this thread been answered?" with a link that says "Mark this Thread as Solved". The idea is that people won't waste time reading your question and trying to answer it because then they can see that it has already been taken care of.

Just a quick note on your code: you should use

``````#include <iostream>
#include <cmath>
#include <iomanip>``````

``````#include <iostream.h>