我需要帮助调试和完成一个程序,该程序将:读取每行上具有相同行数和相同数量的整数值的文件(这将是一个n×n矩阵)。程序应该确定矩阵是否是幻方。 魔方的例子:“ms.txt” 8,1,6; 3,5,7; 4,9,2
我的代码(正在进行中),您的帮助将不胜感激
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace MagicSquare
{
class Program
{
static void Main(string[] args)
{
int[,]S;
string line; //to hold one line of file
string[] token; //to hold each token in line
char[] separator = { ',' };
int N;
//open file
try
{
using (StreamReader sr = new StreamReader("..\\..\\ms.txt"))
{
line = sr.ReadLine();
token = line.Split(separator);
N = token.Count();
S = new int[N, N];
for (int i = 0; i < N; i++)
S[0, i] = Convert.ToInt32(token[i]);
for (int r = 1; r < N; r++)
{
line = sr.ReadLine();
token = line.Split(separator);
for (int c = 0; c < N; c++)
S[r, c] = Convert.ToInt32(token[c]);
}
sr.Close();
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
//find Magic Number
int magic = 0;
for (int i = 0; i < N; i++)
magic += S[i, i];
int sum = 0;
for (int i=0;i<N;i++)
sum += S[i,N -1-i];
if (magic!=sum)
{
Console.Write("Not Magic");
return;
}
//check each column
for (int c=0;c<N;c++)
{
int sum1 =0;
for (int r=0;r<N;r++)
sum1 += S[r,c];
if (sum1!=magic)
{
Console.WriteLine("Not magic");
return;
}
}
}
}
}
答案 0 :(得分:0)
我编辑你的解决方案。这适用于行和列。
static void Main(string[] args)
{
int[,] S = null;
int N = 0;
string line; //to hold one line of file
string[] token; //to hold each token in line
char[] separator = { ',' };
//open file
try
{
using (StreamReader sr = new StreamReader(@"C:\Users\sb9923\Desktop\ms.txt"))
{
line = sr.ReadLine();
token = line.Split(separator);
N = token.Count();
S = new int[N, N];
for (int i = 0; i < N; i++)
S[0, i] = Convert.ToInt32(token[i]);
for (int r = 1; r < N; r++)
{
line = sr.ReadLine();
token = line.Split(separator);
for (int c = 0; c < N; c++)
S[r, c] = Convert.ToInt32(token[c]);
}
sr.Close();
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
int magicValue = GetSum(N * N) / N;
//Check for magic
bool isMagic = true;
for (int counterY = 0; counterY < S.GetLength(1); counterY++)
{
int rowValue = 0;
int columnValue = 0;
for (int counterX = 0; counterX < S.GetLength(0); counterX++)
{
rowValue += Convert.ToInt32(S[counterY, counterX]);
columnValue += Convert.ToInt32(S[counterX, counterY]);
}
if (rowValue != magicValue)
{
isMagic = false;
break;
}
if (columnValue != magicValue)
{
isMagic = false;
break;
}
rowValue = 0;
columnValue = 0;
}
if (isMagic)
{
Console.WriteLine("Yeah it is magic! :)");
}
else
{
Console.WriteLine("No magic in the air!");
}
}
private static int GetSum(int maxValue)
{
if (maxValue < 1)
{
return 0;
}
return maxValue + GetSum(maxValue - 1);
}
如果你有问题请去询问;)
答案 1 :(得分:0)
关于“如何检查方形是否神奇?”(和单元测试,用于测试目的)的一个简单变体:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Linq;
using System.IO;
namespace MSquareTest
{
[TestClass]
public class MSquareTest
{
/// <summary>
/// Checks if array of int's
/// is an magick square
/// </summary>
/// <param name="matrix">Input array</param>
/// <returns>True/False</returns>
public bool IsMagicSquare(int[] matrix)
{
if (matrix.Length % 3 != 0)
throw new ArgumentException("Invalid 2D cube!");
// 2x2(6 cells) is minimum
if (matrix.Length < 6)
throw new ArgumentException("Use at least 2x2 cube!");
// Cube face length
int length = matrix.Length / 3;
// calculate first row sum
int excepted = 0;
for (int y = 0; y < length; y++)
excepted += matrix[y];
// calculate and check second and another rows
for (int x = 1; x < length; x++)
{
int actual = 0;
for (int y = 0; y < length; y++)
actual += matrix[(length * x) + y];
if (actual != excepted)
return false;
}
// calculate and check columns
for (int x = 0; x < length; x++)
{
int actual = 0;
for (int y = 0; y < length; y++)
actual += matrix[(length * y) + x];
if (actual != excepted)
return false;
}
return true;
}
[TestMethod]
public void TestMS()
{
var GoodInput = "8,1,6;3,5,7;4,9,2"; // = File.ReadAllText("..\\..\\ms.txt");
var GoodArray = (from x in GoodInput.Split(',', ';') select int.Parse(x)).ToArray();
var BadInput = "6,4,1;3,0,3;1,5,9";
var BadArray = (from x in BadInput.Split(',', ';') select int.Parse(x)).ToArray();
// Good array is magick square, and bad array is not
var Result = IsMagicSquare(GoodArray) && !IsMagicSquare(BadArray);
Assert.IsTrue(Result);
}
}
}