我正在尝试创建一个程序,用于检查给定矩阵是否为魔方。幻方是垂直,水平和对角线中每个序列中所有数字的总和相同的位置。 无论我输入的数字组合如何,它总是将Magic Square视为真实。 编辑:固定对角线(有点),除了它输出附加信息和对角线。
#include <stdio.h>
#include <stdlib.h>
//#include <stdbool.h>
int main()
{
int nRows;
int nCols;
int sumR;
int sumC;
int sumD = 0;
int sumD2 = 0;
int k;
int p;
//bool isMagic = 1;
//Defining Matrix order
printf("Enter number of Rows: \n");
scanf("%i",&nRows);
printf("Enter number of Columns: \n");
scanf("%i",&nCols);
int matrix[nRows][nCols];
//int SumR[nRows];
//sint SumC[nCols];
//Enterring Coefficients of the Matrix
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
printf("Enter value for Matrix[%i][%i]: ",k,p);
scanf("%i",&matrix[k][p]);
}
}
//Adding diagonal elements
for(k = 0; k < nRows; ++k){
//for(p = 0; p < nCols; ++p){
//if(k == p ){
sumD = sumD + matrix[k][k];
sumD2 = sumD2 + matrix[k][nCols - k - 1];
//sumD2 += matrix[k]
//}
//}
printf("Sum of the Diagonals = %i\n",sumD);
printf("Sum of the Diagonals2 = %i\n",sumD2);
//sumD2 = 0;
//sumD = 0;
}
//Adding the rows
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
sumR += matrix[k][p];
}
printf("Sum of the %i row is = %i\n",k,sumR);
//if(sumR != sumC)
//isMagic = 0;
sumR = 0;
}
//Adding the columns
for(p = 0; p < nRows; ++p){
for(k = 0; k < nCols; ++k){
sumC += matrix[k][p];
}
printf("Sum of the %i column is = %i\n",p,sumC);
//if(sumC != sumR)
//isMagic = 0;
sumC = 0;
}
//Displaying matrix
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
printf("%i\t",matrix[k][p]);
}
printf("\n");
}
if(sumR == sumC == sumD == sumD2){
printf("\nMagic Square!\n");
}
else{
printf("\nNot a Magic Square!\n");
}
return 0;
//col[n]+row[n] == userinput
}
答案 0 :(得分:1)
您在每个循环结束时将sumR
和sumC
设置为零。它们在计算后都具有零值。这就是为什么当你执行检查以确定它们是否相等时,它总是返回true。
在您打印值的那一刻,它们看起来是正确的,但是您将其设置为零并且您正在抛弃该值,以便您以后不能再使用它!您需要存储行总和数组和列总和数组,因此每列和每行都有一个总和。仅int sumR
的Inrtead,使用类似int sumR [nCols];
的内容,类似sumC
答案 1 :(得分:1)
最好的方法是假设它是一个魔术矩阵。定义一个新变量
int isMagic = 1;
您获得对角线的总和。并把它放在sumD。
然后,替换sumR = 0;由
if (sumR != sumD ) isMagic = 0;
和sumC = 0;由
if (sumC != sumD ) isMagic = 0;
和魔法!
if( isMagic) {
printf("\nMagic Square!\n");
}
else{
printf("\nNot a Magic Square!\n");}
答案 2 :(得分:0)
您的代码存在多个问题:
1-您在某个时刻输入的值为2,而不是行数和列数。
2- sumC和sumR在执行结束时设置回0
3-当你有多行和多列时,为什么你有一个SumR和一个SumC?
如果你想存储总和或每行和每列的总和,你需要SumR [nCols]和SumC [nRows]
答案 3 :(得分:0)
好的,所以我使用isMagic方法来解决这个问题,正如@Javier Galan所建议的那样。这是完整的,有效的代码。
#include <stdio.h>
int main()
{
int nRows;
int nCols;
int sumR;
int sumC;
int sumD = 0;
int sumD2 = 0;
int k;
int p;
int isMagic = 1;
//Defining Matrix order
printf("Enter number of Rows: \n");
scanf("%i",&nRows);
printf("Enter number of Columns: \n");
scanf("%i",&nCols);
int matrix[nRows][nCols];
//Enterring Coefficients of the Matrix
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
printf("Enter value for Matrix[%i][%i]: ",k,p);
scanf("%i",&matrix[k][p]);
}
}
//Adding diagonal elements
for(k = 0; k < nRows ; ++k){
sumD += matrix[k][k];
sumD2 += matrix[k][nCols - k - 1];
}
printf("Sum of right Diagonal = %i\n",sumD);
printf("Sum of left Diagonal = %i\n",sumD2);
//Adding the rows
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
sumR += matrix[k][p];
}
printf("Sum of the %i row is = %i\n",k,sumR);
if(sumR != sumD && sumD2)
isMagic = 0;
sumR = 0;
}
//Adding the columns
for(p = 0; p < nRows; ++p){
for(k = 0; k < nCols; ++k){
sumC += matrix[k][p];
}
printf("Sum of the %i column is = %i\n",p,sumC);
if(sumC != sumD && sumD2)
isMagic = 0;
sumC = 0;
}
//Displaying matrix
for(k = 0; k < nRows; ++k){
for(p = 0; p < nCols; ++p){
printf("%i\t",matrix[k][p]);
}
printf("\n");
}
if(isMagic){
printf("\nMagic Square!\n");
}
else{
printf("\nNot a Magic Square!\n");
}
return 0;
}