Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α13.8 · Δυναμική δέσμευση μνήμης για δισδιάστατο πίνακα

Εργαστήριο 7, Άσκηση 3 · Δυσκολία ★★☆ · programming · Κεφάλαια: 13, 12

3.1 Κατασκευάστε το πρόγραμμα mines.c που να διαβάζει από την είσοδο τις διαστάσεις ενός δισδιάστατου πίνακα χαρακτήρων (έστω N x M), να δεσμεύει χώρο N x M θέσεων δυναμικά και έπειτα να τον αρχικοποιεί διαβάζοντας από την είσοδο χαρακτήρες.

Στην συνέχεια παραθέτουμε τρόπους για να δεσμεύσουμε και να αποδεσμεύσουμε μνήμη δυναμικά για δισδιάστατους πίνακες. Αντίστοιχα μπορείτε να διαχειριστείτε πίνακες με περισσότερες διαστάσεις. Στην τελική εξέταση θα χρειαστεί να διαχειριστείτε δεδομένα δυναμικής φύσης (δηλαδή δεδομένα που πρέπει να χωρέσουν σε πίνακες των οποίων τα μεγέθη δεν γνωρίζουμε εκ των προτέρων) και επομένως είναι καλό να εξοικειωθείτε με την διαδικασία δέσμευσης/αποδέσμευσης μνήμης.

Δυναμική δέσμευση μνήμης για δισδιάστατο πίνακα διάστασης N x M:

    int i;
    ΤΔ **p;
    p = malloc(N * sizeof(ΤΔ *));
    if (p == NULL) {
        fprintf(stderr, "Failed to allocate rows\n");
        exit(1);
    }
    for (i = 0 ; i < N ; i++) {
        p[i] = malloc(M * sizeof(ΤΔ));
        if (p[i] == NULL) {
            fprintf(stderr, "Failed to allocate row %d\n", i);
            exit(1);
        }
    }

Αποδέσμευση μνήμης για δυναμικά δεσμευμένο πίνακα N x M:

    int i;
    for (i = 0 ; i < N ; i++)
        free(p[i]);
    free(p);

3.2 Κατασκευάστε το αρχείο mines.txt που αναπαριστά τα δεδομένα ενός ναρκοπεδίου. Συγκεκριμένα, στην πρώτη γραμμή του αρχείου υπάρχουν οι διαστάσεις του ναρκοπεδίου (N και M) και μετά ακολουθούν γραμμή-γραμμή τα περιεχόμενα των κελιών, που είναι ο χαρακτήρας . όταν δεν υπάρχει νάρκη και ο χαρακτήρας * όταν υπάρχει νάρκη.

3 4
..*.
.**.
*.*.

3.3 Επεκτείνετε το πρόγραμμά σας, ώστε να εκτυπώνονται τα περιεχόμενα του πίνακα που διαβάστηκε. Εκτελέστε το πρόγραμμα σας με ανακατεύθυνση εισόδου από το αρχείο mines.txt.

3.4 Επεκτείνετε το πρόγραμμα σας, ώστε να εκτυπώνεται μια τροποποιημένη μορφή του ναρκοπεδίου, στην οποία, στα κελιά που υπάρχει νάρκη να εμφανίζεται πάλι το *, ενώ στα κελιά που δεν υπάρχει νάρκη να φαίνεται ένας αριθμός που δείχνει σε πόσα γειτονικά κελιά υπάρχει νάρκη. Σαν γειτονικά θεωρούνται όχι μόνο συνεχόμενα οριζόντια ή κατακόρυφα κελιά, αλλά και συνεχόμενα σε διαγώνια κατεύθυνση. Για παράδειγμα, για το ναρκοπέδιο που είδαμε, θα πρέπει να εμφανίζεται η έξοδος:

13*2
2**3
*4*2

Μπορείτε να δοκιμάσετε το πρόγραμμά σας και με μεγαλύτερα πλέγματα προκειμένου να επιβεβαιώσετε ότι λειτουργεί σωστά.

Υπόδειξη

Κατά την ανάγνωση των κελιών προσέξτε τις αλλαγές γραμμής: αγνοήστε όποιον χαρακτήρα δεν είναι . ή *. Για κάθε κελί εξετάστε τα έως 8 γειτονικά του με δύο μικρούς βρόχους για μετατόπιση \(-1, 0, +1\) σε γραμμή και στήλη, ελέγχοντας πάντα ότι ο γείτονας είναι μέσα στα όρια του πίνακα (οι γωνίες και οι άκρες έχουν λιγότερους γείτονες).

Αριθμός στον οδηγό: Α13.8 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab07-mines · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab07-mines.html · Markdown (GitHub)