c - 查找矩阵类型的测试用例失败
问题描述
矩阵类型
编写一个 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% 的测试用例通过。测试用例是隐藏的。我已经尝试调试了很多次,但找不到错误。
有人可以帮我调试一下吗?或者是否有一些工具可以生成测试用例来检查这个程序。
解决方案
#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;
}
推荐阅读
- asp.net - getexternallogininfo 在没有 MVC 的简单 asp.net 中的方法上返回 null
- video - 在运动补偿技术中,发送方是否可以只发送有关运动的信息?
- node.js - React 和 axios 的 ERR_CONNECTION_REFUSED
- node.js - 计算所有匹配文档中的字段总和 - MongoDB - Mongoose
- socket.io - 构建失败并出现解决错误
- javascript - 在程序编译期间雪花去除反斜杠?
- html - 带有 SVG 背景的 CSS 网格
- orocommerce - 某些关系无故添加到产品实体中
- django - 如何从没有“attrs”参数的方法访问序列化程序属性
- laravel - 如何将从 vue 前端上传的文件传递到 laravel 控制器?