首页 > 解决方案 > 查找矩阵类型的测试用例失败

问题描述

矩阵类型

编写一个 C 程序,使用函数查找方阵的类型:

a) Fn。findSymmetric 如果矩阵对称则返回 1,如果矩阵不对称则返回 0。

b) Fn。findIdentity 如果矩阵是单位矩阵则返回 1,如果矩阵不是单位矩阵则返回 0。

c) Fn。findMagic 如果矩阵是幻方则返回 1,如果矩阵不是幻方则返回 0。魔方是一个方阵,其中每一行和每一列的元素之和都相同。

d) Fn。findUpperTriangular 如果矩阵是上对角矩阵则返回 1,否则返回 0。上三角矩阵是对角线以下的所有元素都等于 0 的矩阵。

e) Fn。findLowerTriangular 如果矩阵是下对角矩阵则返回 1,否则返回 0。

下三角矩阵是对角线以上的所有元素都等于 0 的矩阵。

f) Fn。findEvenTrace 如果矩阵的对角线 (L->R) 元素之和为偶数,则返回 1,否则返回 0。

g) Fn。findNonzero 如果矩阵中的所有元素都非零则返回 1,否则返回 0。

h) Fn。findSpecial 如果整数 n(n 对应于矩阵的行数/列数)存在于矩阵中,则返回 1,否则返回 0。

i) Fn。findSpecialTrace 如果矩阵的 L->R 对角元素之和与矩阵的 R->L 对角元素之和相同,则返回 1,否则返回 0。

j) Fn。findLucky 如果矩阵中的所有元素都可以被矩阵中的行/列数整除,则返回 1,否则返回 0。

使用动态分配内存。(即使用 malloc())。使用函数来读取和显示矩阵。函数模板可以从函数编辑器中下载。

注:参考问题要求。

输入格式:

输入由 (n*n)+1 个整数组成。第一个整数对应于 n,即矩阵中的行数/列数。接下来的“n”个整数对应于矩阵第一行中的元素。接下来的“n”个整数对应于矩阵第二行中的元素,依此类推。

输出格式:

有关格式的详细信息,请参阅示例输出。

样本输入:

3

1

2

3

2

4

5

3

5

6

样本输出:

1 2 3

2 4 5

3 5 6

矩阵是对称的

矩阵不是身份

矩阵不是魔法

矩阵不是 UpperTriangular

矩阵不是LowerTriangular

矩阵不是 EventTrace

矩阵非零

矩阵很特别

矩阵不是 SpecialTrace

矩阵不幸运

Problem Requirements:
int ** readMatrix(int rows, int cols)
void displayMatrix(int** a,int rows, int cols)
int findSymmetric(int ** a, int n)
int findIdentity(int ** a, int n)
int findMagic(int ** a, int n)
int findUpperTriangular(int ** a, int n)
int findLowerTriangular(int ** a, int n)
int findEvenTrace(int ** a, int n)
int findNonZero(int ** a, int n)
int findSpecial(int ** a, int n)
int findSpecialTrace(int ** a, int n)
int findLucky(int ** a, int n)

这是我尝试解决此问题的代码:

#include<stdio.h>
#include <stdlib.h>
int **readMatrix(int rows,int cols){ int i,j;
int **a=malloc (rows*sizeof(int *));
for (i=0;i<rows;i++){
    *(a+i)=malloc (cols*sizeof (int));
}
    for (i=0;i<rows;i++){
    for (j=0;j<cols;j++){
        scanf (" %d",(*(a+i)+j));
        }
    }
    return a;
}
void displayMatrix (int **a,int rows, int cols){ int i,j;
    for (i=0;i<rows;i++){ 
        for (j=0;j<cols;j++){
            printf ("%d ",*(*(a+i)+j));
        }
        printf ("\n");
    }
}
int findSymmetric (int **a,int n){
    int **arr1=(int **) malloc (n*sizeof (int *));
    int i,j;
    for (i=0;i<n;i++){
    *(arr1+i)=malloc (n*sizeof(int));
    }
    
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            (*(*(arr1+i)+j))=(*(*(a+j)+i));
        }
    }
    int isSymmetric=1;
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            if (*(*(arr1+i)+j)!=(*(*(a+i)+j))){
                isSymmetric=0;
                break;
            }
        } if (isSymmetric==0) break;
    }
    if (isSymmetric==1) return 1;
    return 0;
}
int findIdentity(int **a,int n){ int i,j;
    int isIdentity=1;
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            if (*(*(a+i)+j)!=1){
                isIdentity=0;
                break;
            } if (isIdentity==0) break;
        }
    } if (isIdentity==1) return 1;
    return 0;
}
int findMagic(int **a,int n){ int temp=2*n;
    int arr2[temp];
    int i,j;
    for (i=0;i<n;i++){          int sum=0;
        for (j=0;j<n;j++){
            sum+=a[i][j];
    } arr2[i]=sum;
}
int counter=n;
for (i=0;i<n;i++){ int sum1=0;
    for (j=0;j<n;j++){
        sum1+=a[j][i];
    } arr2[counter]=sum1;
    counter++;
}
int isMagic=1;
for (i=0;i<n;i++){
    for (j=i+1;j<n;j++){
        if (arr2[i]!=arr2[j]) {
            isMagic=0;
            break;
        } if (isMagic==0) break;
    }
}
if (isMagic==1) return 1;
    return 0;
}
int findUpperTriangular(int ** a, int n){
    int i,j,isUpperTriangular=1;
    for (i=0;i<n;i++){
        for (j=0;j<i;j++){
            if (a[i][j]!=0){
                isUpperTriangular=0;
                break;
            } if (isUpperTriangular==0) break;
        }
    } if (isUpperTriangular==1) return 1;
    return 0;
}
int findLowerTriangular (int **a, int n){
    int i,j,isLowerTriangular=1;
    for (i=0;i<n;i++){
        for (j=n-1;j>i;j--){
            if (a[i][j]!=0){
                isLowerTriangular=0;
                break;
            } if (isLowerTriangular==0) break;
        }
    } if (isLowerTriangular==1) return 1;
    return 0;
}
int findEvenTrace (int **a,int n){
    int i; int sum=0;
    for (i=0;i<n;i++){
            sum+=a[i][i];
        }
        if (sum%2==0) return 1;
        return 0;
    }
    int findNonZero (int **a, int n){
        int i,j;
        int isNonzero=1;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j]==0){
                    isNonzero=0;
                    break;
                } if (isNonzero==0) break;
            }
        }if (isNonzero==1) return 1;
    return 0;
    }
    int findSpecial(int **a,int n){
        int i,j;
        int isSpecial=0;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j]==n){
                    isSpecial=1;
                    break;
                } if (isSpecial==1) break;
            }
        } if (isSpecial==1) return 1;
        return 0;
    }
    int findSpecialTrace(int **a, int n){
        int i,sum=0,sum1=0;
        for (i=0;i<n;i++) sum+=a[i][i];
        for (i=n-1;i>=0;i--) sum1+=a[n-1-i][i];
        if (sum==sum1) return 1;
        return 0;
    }
    int findLucky (int **a,int n){
        int isLucky=1;
        int i,j;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j] % n!=0){
                    isLucky=0;
                    break;
                } 
            }  if (isLucky==0) break;
        }if (isLucky==1) return 1;
    return 0;
}
int main()
{ int n;
scanf ("%d",&n);
int **a =readMatrix (n,n);
displayMatrix (a,n,n);
    if ((findSymmetric(a,n))==0) printf ("Matrix is not Symmetric\n");
    else if ((findSymmetric(a,n))==1) printf ("Matrix is Symmetric\n");
    if ((findIdentity(a,n))==0) printf ("Matrix is not Identity\n");
    else if ((findIdentity(a,n))==1) printf ("Matrix is Identity\n");
    if ((findMagic(a,n))==1) printf ("Matrix is Magic\n");
    else if ((findMagic(a,n))==0) printf ("Matrix is not Magic\n");
    if ((findUpperTriangular(a,n))==0) printf ("Matrix is not UpperTriangular\n");
    else if ((findUpperTriangular(a,n)==1)) printf ("Matrix is UpperTriangular\n");
    if ((findLowerTriangular(a,n))==0) printf ("Matrix is not LowerTriangular\n");
    else if ((findLowerTriangular(a,n)==1)) printf ("Matrix is LowerTriangular\n");
    if ((findEvenTrace(a,n))==0) printf ("Matrix is not EvenTrace\n");
    else if ((findEvenTrace(a,n))==1) printf ("Matrix is EvenTrace\n");
    if (findNonZero(a,n)==1) printf ("Matrix is NonZero\n");
    else if (findNonZero(a,n)==0) printf ("Matrix is Zero\n");
    if ((findSpecial(a,n)==1)) printf ("Matrix is Special\n");
    else if ((findSpecial(a,n)==0)) printf ("Matrix is not Special\n");
    if ((findSpecialTrace(a,n))==0) printf ("Matrix is not SpecialTrace\n");
    else if ((findSpecialTrace(a,n))==1) printf ("Matrix is SpecialTrace\n");
    if ((findLucky(a,n))==1) printf ("Matrix is Lucky\n");
    else if ((findLucky(a,n)==0)) printf ("Matrix is not Lucky\n");
    return 0;
}

在我的编码平台上,当我提交此代码时,它显示 94% 的测试用例通过。测试用例是隐藏的。我已经尝试调试了很多次,但找不到错误。

有人可以帮我调试一下吗?或者是否有一些工具可以生成测试用例来检查这个程序。

标签: cpointersdebugging

解决方案


    #include<stdio.h>
#include <stdlib.h>
int ** readMatrix(int rows, int cols);
void displayMatrix(int** a,int rows, int cols);
int findSymmetric(int ** a, int n);
int findIdentity(int ** a, int n);
int findMagic(int ** a, int n);
int findUpperTriangular(int ** a, int n);
int findLowerTriangular(int ** a, int n);
int findEvenTrace(int ** a, int n);
int findNonZero(int ** a, int n);
int findSpecial(int ** a, int n);
int findSpecialTrace(int ** a, int n);
int findLucky(int ** a, int n);
int **readMatrix(int rows,int cols){ 
    int i,j;
int **a=malloc(rows*sizeof(int *));
for (i=0;i<rows;i++){
    *(a+i)=malloc(cols*sizeof (int));
}
    for (i=0;i<rows;i++){
    for (j=0;j<cols;j++){
        scanf (" %d",(*(a+i)+j));
        }
    }
    return a;
}
void displayMatrix (int **a,int rows, int cols){ int i,j;
    for (i=0;i<rows;i++){ 
        for (j=0;j<cols;j++){
            printf ("%d ",*(*(a+i)+j));
        }
        printf ("\n\n");
    }
}
int findSymmetric (int **a,int n){
    int **arr1=(int **) malloc (n*sizeof (int *));
    int i,j;
    for (i=0;i<n;i++){
    *(arr1+i)=malloc (n*sizeof(int));
    }
    
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            (*(*(arr1+i)+j))=(*(*(a+j)+i));
        }
    }
    int isSymmetric=1;
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            if (*(*(arr1+i)+j)!=(*(*(a+i)+j))){
                isSymmetric=0;
                break;
            }
        } if (isSymmetric==0) break;
    }
    if (isSymmetric==1) return 1;
    return 0;
}
int findIdentity(int **a,int n){ int i,j;
    int isIdentity=1;
    for (i=0;i<n;i++){
        for (j=0;j<n;j++){
            if (*(*(a+i)+j)!=1){
                isIdentity=0;
                break;
            } if (isIdentity==0) break;
        }
    } if (isIdentity==1) return 1;
    return 0;
}
int findMagic(int **a,int n){ int temp=2*n;
    int arr2[temp];
    int i,j;
    for (i=0;i<n;i++){          int sum=0;
        for (j=0;j<n;j++){
            sum+=a[i][j];
    } arr2[i]=sum;
}
int counter=n;
for (i=0;i<n;i++){ int sum1=0;
    for (j=0;j<n;j++){
        sum1+=a[j][i];
    } arr2[counter]=sum1;
    counter++;
}
int isMagic=1;
for (i=0;i<n;i++){
    for (j=i+1;j<n;j++){
        if (arr2[i]!=arr2[j]) {
            isMagic=0;
            break;
        } if (isMagic==0) break;
    }
}
if (isMagic==1) return 1;
    return 0;
}
int findUpperTriangular(int ** a, int n){
    int i,j,isUpperTriangular=1;
    for (i=0;i<n;i++){
        for (j=0;j<i;j++){
            if (a[i][j]!=0){
                isUpperTriangular=0;
                break;
            } if (isUpperTriangular==0) break;
        }
    } if (isUpperTriangular==1) return 1;
    return 0;
}
int findLowerTriangular (int **a, int n){
    int i,j,isLowerTriangular=1;
    for (i=0;i<n;i++){
        for (j=n-1;j>i;j--){
            if (a[i][j]!=0){
                isLowerTriangular=0;
                break;
            } if (isLowerTriangular==0) break;
        }
    } if (isLowerTriangular==1) return 1;
    return 0;
}
int findEvenTrace (int **a,int n){
    int i; int sum=0;
    for (i=0;i<n;i++){
            sum+=a[i][i];
        }
        if (sum%2==0) return 1;
        return 0;
    }
    int findNonZero (int **a, int n){
        int i,j;
        int isNonzero=1;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j]==0){
                    isNonzero=0;
                    break;
                } if (isNonzero==0) break;
            }
        }if (isNonzero==1) return 1;
    return 0;
    }
    int findSpecial(int **a,int n){
        int i,j;
        int isSpecial=0;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j]==n){
                    isSpecial=1;
                    break;
                } if (isSpecial==1) break;
            }
        } if (isSpecial==1) return 1;
        return 0;
    }
    int findSpecialTrace(int **a, int n){
        int i,sum=0,sum1=0;
        for (i=0;i<n;i++) sum+=a[i][i];
        for (i=n-1;i>=0;i--) sum1+=a[n-1-i][i];
        if (sum==sum1) return 1;
        return 0;
    }
    int findLucky (int **a,int n){
        int isLucky=1;
        int i,j;
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                if (a[i][j] % n!=0){
                    isLucky=0;
                    break;
                } 
            }  if (isLucky==0) break;
        }if (isLucky==1) return 1;
    return 0;
}
int main()
{ int n;
scanf ("%d",&n);
int **a =readMatrix (n,n);
displayMatrix (a,n,n);
    if ((findSymmetric(a,n))==0) printf ("Matrix is not Symmetric\n\n");
    else if ((findSymmetric(a,n))==1) printf ("Matrix is Symmetric\n\n");
    if ((findIdentity(a,n))==0) printf ("Matrix is not Identity\n\n");
    else if ((findIdentity(a,n))==1) printf ("Matrix is Identity\n\n");
    if ((findMagic(a,n))==1) printf ("Matrix is Magic\n\n");
    else if ((findMagic(a,n))==0) printf ("Matrix is not Magic\n\n");
    if ((findUpperTriangular(a,n))==0) printf ("Matrix is not UpperTriangular\n\n");
    else if ((findUpperTriangular(a,n)==1)) printf ("Matrix is UpperTriangular\n\n");
    if ((findLowerTriangular(a,n))==0) printf ("Matrix is not LowerTriangular\n\n");
    else if ((findLowerTriangular(a,n)==1)) printf ("Matrix is LowerTriangular\n\n");
    if ((findEvenTrace(a,n))==0) printf ("Matrix is not EvenTrace\n\n");
    else if ((findEvenTrace(a,n))==1) printf ("Matrix is EvenTrace\n\n");
    if (findNonZero(a,n)==1) printf ("Matrix is NonZero\n\n");
    else if (findNonZero(a,n)==0) printf ("Matrix is Zero\n\n");
    if ((findSpecial(a,n)==1)) printf ("Matrix is Special\n\n");
    else if ((findSpecial(a,n)==0)) printf ("Matrix is not Special\n\n");
    if ((findSpecialTrace(a,n))==0) printf ("Matrix is not SpecialTrace\n\n");
    else if ((findSpecialTrace(a,n))==1) printf ("Matrix is SpecialTrace\n\n");
    if ((findLucky(a,n))==1) printf ("Matrix is Lucky\n\n");
    else if ((findLucky(a,n)==0)) printf ("Matrix is not Lucky\n\n");
    return 0;
}

推荐阅读