Δημοσιεύτηκε: 05 Μαρ 2012, 21:14
από migf1
Είσαι ωραίος Ηλία ("σε πάω" που έλεγε και ο Χριστόδουλος :lol:). Δεν παρακολούθησα τη λογική του κώδικά σου (ξεκίνησα να ασχολούμαι με το HexVew) αλλά έχω να σου προτείνω 2 βελτιώσεις:

α) Τα macros POSUPNRIGHT() και ROW_LENGTH() μπορείς να τα μετονομάσεις: POSUPRT() και ROWLEN() αντίστοιχα, για να βελτιώσεις το ευανάγνωστο του κώδικα (ή μπορείς και LENROW() το δεύτερο)

β) Εκείνος ο πολλαπλασιασμός (size * size) που κάνεις μέσα στη συνθήκη των for-loops, επαναλαμβάνεται σε ΚΑΘΕ επανάληψη των loops. Μπορείς λοιπόν να το κάνεις μια int μεταβλητή (π.χ. int sizesize;) της οποίας την τιμή θα την υπολογίσεις μια και μόνη φορά, και θα την χρησιμοποιήσεις κατόπιν ήδη υπολογισμένη στις συνθήκες των loops.

Δηλαδή...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
int main(void)
{
int pos, size, sizesize;
printf("Enter size of magic square (odd 1-99): ");
scanf("%d", &size);

sizesize = size * size;
int square[ sizesize ];
memset(square, EMPTY, sizeof(square)); // init table to EMPTY

pos = size / 2;
square[pos] = 1;

for (int i = 2; i < sizesize + 1; i++) {
int uprt = POSUPRT(pos, size);
pos = square[uprt] == EMPTY ? uprt : POSDN(pos, size);
square[pos] = i;
}

// print magic square
for (int i = 0; i < sizesize; i++) {
if (i != 0 && i % size == 0)
putchar('\n');
printf("%4d", square[i]);
}
putchar('\n');

return 0;
}