Question

I need help debugging and finishing a program that would: read a file with same number of lines and same number of integer values on each line (this will be a n x n matrix). The program should determines if the matrix is a magic square. example of magic square: "ms.txt" 8,1,6;3,5,7;4,9,2

my code (working in progress), your help would be appreciated

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;
            }
        }
    }
}
}
Was it helpful?

Solution

I edit your solution. This works for rows and columns.

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);
    }

If you have a question go for asking ;)

OTHER TIPS

Just one simple variation about "how to check if square is magical?"(and unit test, for testing purpose):

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);
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top