intrebare magic square


bobocbbb


am codul urmator si imi merge pana la nr 15,apoi este o problema,ma poate ajuta cineva?
codul e urmatorul:

CODE
#include <stdio.h>
#include <stdbool.h>
/*
"write a program that print n x n magic square witch the sums of rows columns and diagonals are all the same.
Start by placeing nr 1 in the middle of row 0 and the remaining nr's 2,3,n*n by moving up one row and over 1 column.
If an element is occupied put the nr bellow previously stored nr."
*/
int main(void)
{
int i,j,nr;
int count;
bool flag;

printf("Enter size of magic square: ");
scanf("%d", &nr);

int matrix[nr][nr];

for(i = 0; i < nr; i++)
for(j = 0; j < nr; j++)
matrix[i][j] = 0; // initializez toate elementele 0 ca sa pot vedea apoi care sunt libere si care nu

i = 0;
j = (nr - 1) / 2; // j = mijlocul randului 0
count = 1;

while(count <= nr*nr)
{
matrix[i--][j++] = count++; //scad 1 rand si cresc o coloana
if(i < 0) // daca randul = -1 el devine nr -1
i = nr - 1;
if(j == nr) // daca coloana = nr,va deveni 0
j = 0;
if(matrix[i][j] != 0) // daca elementul urmator nu e liber scad o coloana
si 2 randuri in loc de 1 pentru a aloca valoarea lui count sub nr alocat mai devreme
{
i += 2;
j -= 1;
}
}
for(i = 0; i < nr; i++)
{
for(j = 0; j < nr; j++)
printf("%2d ",matrix[i][j]);
printf("\n");
}
return 0;
}
msmihai
CODSURSA
int matrix[nr][nr];


Nu are cum sa-ti mearga, initializarea de mai sus este sintactic incorecta.
 
bobocbbb
CITAT (msmihai @ 25th October 2009, 19:14) *
CODSURSA
int matrix[nr][nr];


Nu are cum sa-ti mearga, initializarea de mai sus este sintactic incorecta.


nu are legatura cu locul unde este matricea declarata,daca o declaram pana sa aloc o valoare variabilei nr imi dadea eroare la compilare.
Problema este undeva in corpul lui while,mai exact aici: if(matrix[i][j] != 0) dar nu stiu ce lipseste.
msmihai
bobocbbb , nu stiu din lumea carui limbaj vii, dar in C/C++ nu poti sa aloci array-uri static decat folosind expresii constante.
Incearca, de pilda, sa rulezi urmatorul program, complet echivalent :

CODSURSA
#include <stdio.h>

int main(){
    int val;
    val = 4;
    int mat[val][val];
    return 0;
}
secretalex92
@msmihai exemplul tau chiar merge w00t.gif compilat cu code::blocks
mda ... nu-i ortodox ce faci wink.gif
Gasesti niste informati utile aici
bobocbbb
CITAT (secretalex92 @ 25th October 2009, 19:30) *
mda ... nu-i ortodox ce faci wink.gif
Gasesti niste informati utile aici



in cartea din care invat scrie ca toate variabilele ar trebui declarate la inceput dar nu e o regula iar la problema mea specifica,daca merge sa declar matricea sub forma care am facut-o eu e ok,daca nu sa o declar 99x99
multumesc pentru informatii.
secretalex92
CITAT (bobocbbb @ 25th October 2009, 18:32) *
in cartea din care invat scrie ca toate variabilele ar trebui declarate la inceput dar nu e o regula iar la problema mea specifica,daca merge sa declar matricea sub forma care am facut-o eu e ok,daca nu sa o declar 99x99
multumesc pentru informatii.

Nu stiu din ce carte inveti dar nu te invata bine, daca vrei sa aloci o matrice cu numar variabil de elemente aloci dinamic memoria analog la un vector, sub VC++ nu mai merge smecheria wink.gif
 
msmihai
After some researching : se pare ca acest lucru ( alocare in stiva runtime ) este foarte posibil in versiunile mai noi de GCC.
Se pare ca s-a luat decizia asta pentru a da putina "eleganta" codului .
De exemplu, am nevoie de o matrice de dimensiunea relativ mica ( 10 x 10 sa zicem ) dar a carei dimensiuni nu le stiu decat la runtime. Pentru asta , in C codul arata destul de urat :

CODSURSA
    int a,b;
     a = 6;
     b = 7;

     int **m = (int**)malloc(a * sizeof(int*));
     for(int i=0;i<a;i++)
         m[i] = (int*)malloc(b* sizeof(int));


cand totul poate fi rezolvat foarte rapid in cateva linii de cod.
Aceasta este o versiune simplificatã a paginii originale. Pentru a vizita versiunea originala click aici.