Δημοσιεύτηκε: 05 Μαρ 2012, 20:20
από Ilias95
Να και μια υλοποίηση του 17ου programming project στην σελίδα 181:

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h> // memset()

#define EMPTY 0

#define ROW(pos, size) ( (pos) / size )
#define COL(pos, size) ( (pos) % size )
#define ROW_LENGTH(size) ( ((size) - 1) * (size) )

#define POSUPNRIGHT(pos, size) ( POSRT(POSUP((pos), (size)), (size)) )
#define POSRT(pos, size) ( COL((pos), (size)) == (size) - 1 ? (pos) - ((size) - 1): (pos) + 1 )
#define POSUP(pos, size) ( ROW((pos), (size)) == 0 ? (pos) + ROW_LENGTH((size)) : (pos) - (size) )
#define POSDN(pos, size) ( ROW((pos), (size)) == (size) -1 ? (pos) - ROW_LENGTH((size)) : (pos) + (size) )

int main(void)
{
int pos, size;
printf("Enter size of magic square (odd 1-99): ");
scanf("%d", &size);

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

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

for (int i = 2; i < (size * size) + 1; i++) {
int upnright = POSUPNRIGHT(pos, size);
pos = square[upnright] == EMPTY ? upnright : POSDN(pos, size);
square[pos] = i;
}

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

return 0;
}


Σαν πρότυπο έχει περισσότερο τις υλοποιήσεις του migf1 στο 15ο project και είναι υλοποιημένη με μονοδιάστατο πίνακα.
Δοκίμασα να χρησιμοποιήσω macros αν και ακόμα δεν έχω δει αναλυτικά γι' αυτά, αλλά νομίζω ότι τα έκανα λιγάκι δυσανάγνωστα. :(

Θα την κάνω αργότερα ξανά σε δισδιάστατο πίνακα όπως ζητάει η άσκηση και θα προσέξω ώστε να κάνω τον κώδικα πιο ευανάγνωστο.

Πάντως μου άρεσε πολύ η τεχνική διαχείρισης ενός μονοδιάστατου πίνακα σαν δισδιάστατο η οποία μπορεί να αποδειχθεί πολύ χρήσιμη και σε γλώσσες που δεν υποστηρίζουν multidimensional arrays. :)