magic square program help C#

Abner_CV picture Abner_CV · Feb 26, 2014 · Viewed 8.6k times · Source

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

Answer

Sebi picture Sebi · Feb 26, 2014

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