[ SuperC @ 20.11.2006. 09:14 ] @
problem magicnog kvadrata u c++? Npr. da je dato

16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

ovdje je zbir po vertikali i horizontali i dijagonali 34, i potrebno je znaci napisati kod koji ce za bilo broj od 1 do n^2 praviti isto.
[ SuperC @ 20.11.2006. 09:37 ] @
koliko ja shvatam, ovdje bi trebao imati tri varijable: h, v i d za horizontalu , vertikalu i dijagonalu i onda napraviti kao niz [4] koji ce se uporedjivati, odnosno ne oni, nego njihov zbir. kako da to bude uvijek magicni kvadrat?
[ X Files @ 20.11.2006. 09:39 ] @
SuperC,

Shvati da su pravila ovog foruma (koja nisam ja ustanovio) da se OBRIŠU svi
zahtevi da neko uradi nečiji domaći zadatak od POČETKA do KRAJA.

Niko ovde nije ničja besplatna tehnička podrška, i dogovor je da ne želimo da
[ES] postane besplatna berza za izradu domaćih zadataka.

Takođe, zadaci se postavljaju u temama C/C++ za početnike.

95% domaćih zadataka koje profesori postavljaju su generičkog tipa, što će
reći sigurno se negde već urađeni.

Evo, na google-u, ukucaj ključne reči:

c++ Magic square

i dobićeš sijaset rešenja, kao na primer:
http://www.codeproject.com/cpp/Magic_Square.asp
[ SuperC @ 20.11.2006. 09:44 ] @
x-files nisam te ja kritikovao :)) daleko od toga. hvala svima koji mi pomazu da naucim osnove c++. ja nisam prije znao za ovu stranicu, tako da sam novi, u nekim drugim oblastima mozda i ja nesto mogu da pomognem.

uputstvo procitano i zabiljezeno. :))



update; hvala za link, ja sam trazio preko njemackog jezika ili preko nasih jezika, no znaci bolje je na engleskom, ima logike :)) hvala jos jednom
[ SuperC @ 20.11.2006. 11:21 ] @
analiza koda, da zajedno sa mnom prodje kroz kod, bio bih mu zahvalan:

Code:
#include "iostream"
#include <vector>
using namespace std;

void OddMagicSquare(vector<vector<int> > &matrix, int n);
void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n);
void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n);
void MagicSquare(vector<vector<int> > &matrix, int n);
void PrintMagicSquare(vector<vector<int> > &matrix, int n);


int main(int argc, char* argv[])
{
  int n;
  printf("Unesite broj/Geben Sie ein Zahl");
  scanf("%d", &n);

  vector<vector<int> > matrix(n, vector<int> (n, 0));

  if (n<3)
  {
    printf("\nError: n muss sein groesser als/ mora biti vece od  2\n\n");
    return -1;
  }


  MagicSquare(matrix, n);  
  //rezultati stampanja
  PrintMagicSquare(matrix, n);
  return 0;
}

void MagicSquare(vector<vector<int> > &matrix,int n)
{
  if (n%2==1)        //n is Odd
    OddMagicSquare(matrix, n);
  else          //n is even
    if (n%4==0)    //doubly even order
      DoublyEvenMagicSquare(matrix, n);
    else      //singly even order
      SinglyEvenMagicSquare(matrix, n);
}

void OddMagicSquare(vector<vector<int> > &matrix, int n)
{
  int nsqr = n * n;
  int i=0, j=n/2;     // pocetna pozicija
  for (int k=1; k<=nsqr; ++k) 
  {

matrix[i][j] = k;
i--;
j++;
if (k%n == 0) 
   { 
      i += 2; 
      --j; 
    }
    else 
    {
      if (j==n) 
        j -= n;
      else if (i<0) 
        i += n;
    }
  }

}

void DoublyEvenMagicSquare(vector<vector<int> > &matrix, int n)
{
  vector<vector<int> > I(n, vector<int> (n, 0));
  vector<vector<int> > J(n, vector<int> (n, 0));

  int i, j;
  //pripremi I, J
  int index=1;
  for (i=0; i<n; i++)
    for (j=0; j<n; j++)
    {
      I[i][j]=((i+1)%4)/2;
      J[j][i]=((i+1)%4)/2;
      matrix[i][j]=index;
      index++;
    }

   for (i=0; i<n; i++)
    for (j=0; j<n; j++)
    {
      if (I[i][j]==J[i][j])
        matrix[i][j]=n*n+1-matrix[i][j];
    }
}

void SinglyEvenMagicSquare(vector<vector<int> > &matrix, int n)
{
 int p=n/2;


  vector<vector<int> > M(p, vector<int> (p, 0));
  MagicSquare(M, p);
  int i, j, k;

   for (i=0; i<p; i++)
    for (j=0; j<p; j++)
    {
      matrix[i][j]=M[i][j];
      matrix[i+p][j]=M[i][j]+3*p*p;
      matrix[i][j+p]=M[i][j]+2*p*p;
      matrix[i+p][j+p]=M[i][j]+p*p;
    }


  if (n==2)
    return;   

  vector<int> I(p, 0);
  vector<int> J;
  for (i=0; i<p; i++)
    I[i]=i+1;

  k=(n-2)/4;  

  for (i=1; i<=k; i++)
    J.push_back(i);

 
  for (i=n-k+2; i<=n; i++)
    J.push_back(i);

  int temp;
  for (i=1; i<=p; i++)
    for (j=1; j<=J.size(); j++)
    {
      temp=matrix[i-1][J[j-1]-1];
      matrix[i-1][J[j-1]-1]=matrix[i+p-1][J[j-1]-1];
      matrix[i+p-1][J[j-1]-1]=temp;
    }

  //j=1, i
  //i=k+1, k+1+p
 i=k; 
  j=0;
  temp=matrix[i][j]; matrix[i][j]=matrix[i+p][j]; matrix[i+p][j]=temp;
  j=i;
  temp=matrix[i+p][j]; matrix[i+p][j]=matrix[i][j]; matrix[i][j]=temp;
}

 

 

void PrintMagicSquare(vector<vector<int> > &matrix, int n)
{
  for (int i=0; i<n; i++) 
  {
    for (int j=0; j<n; j++)
      printf(" %3d", matrix[i][j]);
    printf("\n");
  }
  printf("\n\n");
}
[ SuperC @ 20.11.2006. 13:15 ] @
shvatih najvecim dijelom program, osim dijela u kojem pravi if petlju na doubly i na simply? moze li mi neko objasniti zasto je to potrebno?