void identity(int a[4][4], int m){
int i=m, j=m;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(i==j)
a[i][j]=1;
else
a[i][j]=0;
return a[i][j];

}

}
}

void main(){
int a[4][4];
int m=4;
identity(a[4][4], m);
cout<a[i][j]
}

cout<<'\n';
}

My problem
==========

Write a function 'identity' which returns a 1 if the array argument passed to it represents an identity matrix, and returns 0 otherwise. An identity matrix is an m by m array of integers, where the values of the elements on the principle diagonal (row subscript == col subscript)equal 1, and all other elements are 0. for
example:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
is an identity matrix of order 4 by 4,
1 0 0
0 1 0
0 0 1
is an identity matrix of order 3 by 3,and
1 1 5
0 1 0
0 0 1
is NOT an identity matrix. The function identity is passed two arguments: the array, and the order of the matrix ( i e the size of the two dimensions). Thus the prototype of the function would be written as :int identity (int a[][], int m);where a is the array and m represents the number of rows and columns. You may assume that the number of rows always equals the number of columns for the array.

/* no point in passing int m=4 if a[4][4] is hard coded */
/* the question you were given is not possible to answer */
/* exactly as specified. but we cannot do much */
/* about that now... */

/* also the function should return an int not a void */
/* void identity(int a[4][4], int m) { */
int identity(int a[4][4], int m) {
/* no point initializing i and j as they are */
/* set in the loop */
/* int i=m; */
/* int j=m; */
int i;
/* you have hard-coded 4 in the for loops */
/* for(i=0;i<4;i++){ */
/* for(j=0;j<4;j++){ */
/* we should use 'm' instead */
for(i=0;i<m;i++){
/* declare j here where it is used */
/* this is nicer code */
int j;
for(j=0;j<m;j++){
/* this is CREATING an identity matrix */
/* NOT testing for one as was asked */
if(i==j)
a[i][j]=1;
else
a[i][j]=0;
/* this is not what should be returned */
return a[i][j];
}
}
/* no return value from here at all */
/* a good compiler will detect this error */
}

int main(int argc, char* argv[]) {
/* you haven't put any data into a[][] yet */
int a[4][4];
int m=4;
/* you haven't done anything with the */
/* return value from identity */
/* also the call is wrong .. you are passing */
/* the value of the [4][4] item of the array */
/* (which is outside it anyway) instead of the */
/* whole array */
/* identity(a[4][4], m); */
int result = identity(a, m);
/* i and j aren't defined */
/* and you should be printing the result of */
/* the call to identity(...); */
/* BTW: if this is supposed to be 'C' code */
/* then you cannot use 'cout<<' etc */
/* cout<<a[i][j]; */
cout << result;
cout<<'\n';
return 0;
}

/* I suggest you think about the question */
/* a bit more and come back to me */

RONSLOW, I think the assignment might expect a 1-D array that is to be treated as a 2D matrix, that is the only way to make it sizable at run-time. (That or a 1-D array of 1-D array pointers, but that really needs to be a class.)

It could also be that the lecturer who posed the assignment stuffed up by saying "the prototype of the function would be written as :int identity (int a[][], int m)"

Anyway, as posed in the question, one cannot write such as function (it ain't valid C or C++). If a was a flat array of m*m elements then that could be easily done.

0

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

/* no point in passing int m=4 if a[4][4] is hard coded */

/* the question you were given is not possible to answer */

/* exactly as specified. but we cannot do much */

/* about that now... */

/* also the function should return an int not a void */

/* void identity(int a[4][4], int m) { */

int identity(int a[4][4], int m) {

/* no point initializing i and j as they are */

/* set in the loop */

/* int i=m; */

/* int j=m; */

int i;

/* you have hard-coded 4 in the for loops */

/* for(i=0;i<4;i++){ */

/* for(j=0;j<4;j++){ */

/* we should use 'm' instead */

for(i=0;i<m;i++){

/* declare j here where it is used */

/* this is nicer code */

int j;

for(j=0;j<m;j++){

/* this is CREATING an identity matrix */

/* NOT testing for one as was asked */

if(i==j)

a[i][j]=1;

else

a[i][j]=0;

/* this is not what should be returned */

return a[i][j];

}

}

/* no return value from here at all */

/* a good compiler will detect this error */

}

int main(int argc, char* argv[]) {

/* you haven't put any data into a[][] yet */

int a[4][4];

int m=4;

/* you haven't done anything with the */

/* return value from identity */

/* also the call is wrong .. you are passing */

/* the value of the [4][4] item of the array */

/* (which is outside it anyway) instead of the */

/* whole array */

/* identity(a[4][4], m); */

int result = identity(a, m);

/* i and j aren't defined */

/* and you should be printing the result of */

/* the call to identity(...); */

/* BTW: if this is supposed to be 'C' code */

/* then you cannot use 'cout<<' etc */

/* cout<<a[i][j]; */

cout << result;

cout<<'\n';

return 0;

}

/* I suggest you think about the question */

/* a bit more and come back to me */