Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

Σχετικά έγγραφα
lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

FAIL PASS PASS οριακά

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση.

Στην clearlist: - Όλα ok. οριακό PASS

403 FAIL Λάθος στο πακετάρισµα του αρχείου.

ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ. 812 PASS Καλή δουλειά

lab14grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Βαθμός Σχόλια. lab6 PASS PASS. - Πολύ καλή δουλειά, αλλά προσπάθησε να κάνεις την άσκηση χρησιµοποιώντας συναρτήσεις από το string.

Sheet1_2 FAIL. - To πρόγραµµα δεν κάνει compile Δεν παρέδωσε FAIL

lab6grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Διαδικαστικά: Όλα οκ.

Sheet3_2. Τα literals (3.0, 1.5, κτλ) πρέπει να ορίζονται ως σταθερές.

lab11 - Να εκτυπώνεις πιο κατατοπιστικά µηνύµατα λάθους. Αν είναι όλα ίδια, δεν είναι ξεκάθαρο ποιο αρχείο έχει πρόβληµα.

Βαθμός Σχόλια. lab8. οριακά PASS 1194 PASS

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου!

lab9grades Άσκηση 1 - Σωστοί τύποι (παραµέτρων και επιστρεφόµενης τιµής) της series_cosh.

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

lab5 -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

-Δεν έχεις σχόλια, καλό θα ήταν να έχεις πιο περιγραφικό σχόλιο στην αρχή

lab7grades -Σωστή χρήση της sprintf -Σωστά ανιχνεύετε τον χαρακτήρα που πρέπει να αφαιρέσετε. -Σωστή µεταφορά στοιχείων µια θέση αριστερά.

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

Sheet1_2. - Δεν υπάρχουν σχόλια συναρτήσεων - Να χρησιµοποιείς πιο περιγραφικά ονόµατα µεταβλητών (και σίγουρα όχι απλούς χαρακτήρες όπως c, d) Page 1

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

lab10grades - Το αποτέλεσµα της τοµής θα έπρεπε να εµφανίζετε µέσα σε εισαγωγικά "Helo".

Μ.Σ. lab12grades FAIL. η συνθήκη για έξοδο είναι και αυτή σωστή. Οριακό PASS. στα string. - σωστή και η κλήση της συνάρτησης.

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Λύσεις για τις ασκήσεις του lab5

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

ΑΕΜ ή username. Sheet2

- Ο τελευταίος έλεγχος στη συνάρτηση είναι περιττός. Αν έχει φτάσει µέχρι εκεί το πρόγραµµα, τότε αναγκαστικά το µήκος είναι >= του PASSWD_MIN_LEN.

lab9grades -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings.

to post PASS PASS FAIL

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Sheet PASS 1426 PASS 1428 PASS. Page 1

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εργαστήριο 5. Εαρινό Εξάμηνο

lab6grades - Δεν έχετε δηλώσει το βαθµό βάσης ως σταθερά. - Το µήνυµα εισόδου θέλει χαρακτήρα κενού ' ' στο τέλος και όχι TAB '\t'.

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

lab4grades Παρακαλούµε µη γράφετε σχόλια στα ελληνικά!

Βαθμός Σχόλιο. lab3_grades

- Σωστή χρήση του προσδιοριστή const για την σταθερά pi. Καλό θα ήταν επιλέξετε κεφαλαία γράµµατα για το όνοµα της σταθεράς.

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

lab7grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

lab5grades Διαδικαστικά: όλα οκ, αλλά καθυστερήσατε στην αποστολή. Να προσέχετε να στέλνετε τις ασκήσεις σας εντός της προθεσµίας.

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

lab5grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ ΑΣΚΗΣΗΣ ΑΛΛΑ ΣΧΟΛΙΑ

lab4grades Παράδοση ασκήσεων: -Όλα καλά Άσκηση 1η: -Σωστή 357 PASS

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

οριακό PASS 402 PASS Πολύ σωστά, µπράβο οριακό PASS

Παράδοση άσκησης: Εστάλη με καθυστέρηση. Να μην επαναληφθεί Προσέξτε τις νέες οδηγίες για την ονομασία του φακέλου.

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

lab2grades - Στη scanf υπολογίζετε τουλάχιστον 5 χαρακτήρες %5.2f προδιαγραφές που ζητούνται στην εκφώνηση. -

Δεν έστειλες την άσκηση 1, και αυτό που έστειλες ήταν σκέτο αρχείο, όχι το tgz που ζητούσε η εκφώνηση.

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Άσκηση 2: -Δεν παραδόθηκε. Το εµαιλ είχε λάθος θέµα. Έπρεπε να είναι CE120 lab6

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

lab10grades Άσκηση 2η: - Δεν κάνει compile: Δείτε την λύση και ξανα προσπαθήστε τα υπόλοιπα στο σπίτι.

Στοίβες με Δυναμική Δέσμευση Μνήμης

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

lab3grades οριακό PASS

Φροντιστήριο 4 Σκελετοί Λύσεων

Εισαγωγή στον Προγραμματισμό (με. τη C)

4. Συνδεδεμένες Λίστες

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

ÔÏÕËÁ ÓÁÑÑÇ ÊÏÌÏÔÇÍÇ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Τα ονόµατα των φακέλων πρέπει να έχουν το επίθετά σας και όχι τα username που χρησιµοποιείτε στα εργαστήρια.

Δομές Δεδομένων & Αλγόριθμοι

Προγραµµατισµός Ι (ΗΥ120)

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 321 FAIL

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 25/11/12, 22:00

Νήµατα. Πολύ σηµαντικό

Transcript:

Επειδή αρκετοί εξακολουθείτε να βάζετε σχόλια στην ίδια γραµµή αλλά πολύ πιο "δεξιά" από τον κώδικα που σχολιάζουν, δείτε παρακάτω πώς µοιάζει ένα τέτοιο πρόγραµµα σε συµβατικό terminal. Όπως έχουµε πει και στο φυλλάδιο "Αρχές καλού προγραµµατισµού", πρέπει να αποφεύγετε να γράφετε πέρα από την 80ή στήλη µιας γραµµής (η οποία µαρκάρεται µε κόκκινη γραµµή στο παρακάτω terminal) Επι τη ευκαιρία, δείτε στο παρακάτω παράδειγµα ότι δεν είναι καθόλου προφανές πού τελειώνει η insertnth και πού ξεκινά η removenth. Εδώ θα βοηθούσε πολύ να υπήρχαν σχόλια συνάρτησης πάνω από τη removenth. Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 451 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 476 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. 1733 - Καλή στοίχιση - ΔΕΝ έχετε σχεδόν καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Η insertνth λειτουργεί µεν, αλλά δεν είναι καλά υλοποιηµένη. Διατρέχετε τη λίστα πολύ περισσότερες φορές από όσες χρειάζεται. Προσπαθήστε να την ξαναγράψετε διατρέχοντας τη λίστα το πολύ µια φορά. Δε χρειάζεται να υπολογίζετε το µήκος της (απλά τσεκάρετε αν φτάσατε σε NULL) και οι µόνες περιπτώσεις που χρειάζεται να χειριστείτε είναι για pos == 0 και για pos > 0 - Όταν η removenth λειτουργεί σωστά είναι κατά λάθος, αν τύχει το count να πάρει αρχική τιµή 0. Δεν το έχετε αρχικοποιήσει. Επίσης, αν κληθεί σε άδεια λίστα, θα πετάξει segmentation fault στο *list_head=(*list_head)->next->next; Επίσης, δε λειτουργεί σωστά στην περίπτωση που ζητηθεί να αφαιρεθεί ο τελευταίος κόµβος (δοκιµάστε αφαίρεση από τη θέση 6 αντί για 20 στην τελευταία κλήση στη main). Όπως ειπώθηκε στο εργαστήριο, πρέπει πάντα να ελέγχετε τις οριακές περιπτώσεις. Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! 1899 FAIL - Λάθος print_list(). Η ανανέωση του δείκτη έπρεπε να ήταν curr = curr->next, όχι curr->next = curr - Τι σκοπό εξυπηρετεί οο πρώτο for στην insertnth? Απλά κάνει το count ίσο µε το pos. Δε χρειάζεται ολόκληρο loop για να κάνετε κάτι τέτοιο! - Μετά από κάθε κλήση της malloc πρέπει να ελέγχετε αν επέστρεψε NULL κι αν ναι να κάνετε κάτι λογικό (στη συγκεκριµένη περίπτωση να επιστρέφετε FAILURE) - Στην insertnth, στην περίπτωση που το pos δεν είναι µηδέν, δεν εισάγετε τον κόµβο στη σωστή θέση. - Στη removenth το loop δεν έχει συνθήκη τερµατισµού. Page 2

Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! 1900 FAIL 1901 - Λάθος print_list(). Η ανανέωση του δείκτη έπρεπε να ήταν curr = curr->next, όχι curr->next = curr - Τι σκοπό εξυπηρετεί οο πρώτο for στην insertnth? Απλά κάνει το count ίσο µε το pos. Δε χρειάζεται ολόκληρο loop για να κάνετε κάτι τέτοιο! - Μετά από κάθε κλήση της malloc πρέπει να ελέγχετε αν επέστρεψε NULL κι αν ναι να κάνετε κάτι λογικό (στη συγκεκριµένη περίπτωση να επιστρέφετε FAILURE) - Στην insertnth, στην περίπτωση που το pos δεν είναι µηδέν, δεν εισάγετε τον κόµβο στη σωστή θέση. - Στη removenth το loop δεν έχει συνθήκη τερµατισµού. - Τα σχόλια τα βάζουµε πάνω από τον κώδικα και όχι δίπλα. - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. 1904 1908 - Σχόλια: Δεν υπήρχαν καθόλου σχόλια. - Υπήρξε πολύ µεγάλη καθυστέρηση στην ολοκλήρωση και αποστολή της άσκησης. Γνωρίζετε πολύ καλά οτι η άσκηση θα πρέπει να έχει αποσταλεί πριν το πέρας της διαθέσιµης ώρας του εργαστηρίου! - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: Ελάχιστα - create_duplicates: --- Διπλασιασµός: ανάθεση δεικνούµενου αντικειµένου πριν γίνει ο έλεγχος για failure (τι θα γίνει αν pointer == NULL στην εντολή *pointer=*current ;). Επίσης, µην κάνετε ποτέ αναθέσεις της µορφής *pointer=*current ; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. --- Επιστροφή: Επιστρέφει 0/1 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν γίνεται σωστή αφαίρεση, έτσι όπως είναι γραµµένο αφαιρεί µόνο τα διαδοχικά ίδια. Δε θα λειτουργήσει αν η λίστα είναι πχ 1 1 2 2 1 1 --- free: ΟΚ. --- Ξανακάντε την άσκηση στο σπίτι µε βάση τις παραπάνω επισηµάνσεις. Page 3

1909 - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια, αλλά το if είναι περιττό και δείχνει µη-κατανόηση της λειτουργίας της for: Εφόσον ο µόνος τρόπος να µπούµε στο σώµα της for είναι η συνθήκη curr!=null, τότε προφανώς η συνθήκη της if θα είναι πάντα αληθής. 1911 1914 - Σωστή duplicate_list(). Για την περίπτωση που η malloc() είναι σωστότερο να επιστρέφουµε απλά FAILURE, αφήνοντας αυτόν που κάλεσε την duplicate_list() να διαχειριστεί όπως θέλει την αποτυχία δέσµευσης µνήµης. - Σωστή remove_duplicates(). - Στοίχιση: ΟΚ - Ονόµατα µεταβλητών: ΟΚ - Σχόλια: Κανένα Σχόλιο! - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: OK - remove duplicates: --- Αφαίρεση: η γραµµή iter_prev = current->next; θα έπρεπε να είναι iter_prev = iter και να βρίσκεται πριν το iter=iterm->next. Ίσως να µην καταλάβατε την εκφώνηση, προσπαθήστε να την ξανακάνετε σπίτι. Σαν τέστ, αλλάξτε την print_list ώστε να εκτυπώνει και τη διεύθυνση, και στην remove πριν κάνετε free τον κόµβο, εκτυπώστε επίσης τη διεύθυνση και τα περιεχόµενα. Θα δείτε ότι τελικά δε σβήνετε όλους τους κόµβους, αλλά βάζετε τα βελάκια έτσι ώστε να παρακάµψετε κάποιους. --- free: ΟΚ 1927 - Η print_list() δεν είναι σωστή. Αν κληθεί σε άδεια λίστα, το list_head θα είναι NULL οπότε θα πετάξει segmentation fault στην προσπέλαση list_head- >data.το σωστό θα ήταν να είχες αρχικοποιήσει το curr που είναι µέσα στο loop σε list_head και κάθε εκτύπωση να γίνεται µόνο µέσα στο loop (οπότε και το curr θα είναι εγγυηµένα διάφορο του NULL) - Σωστή insertnth() αλλά έχεις πολύ επιπλέον κώδικα. Διατρέχεις δύο φορές τη λίστα ενώ θα µπορούσες να τη διατρέξεις µία φορά έως ότου είτε φτάσεις σε NULL είτε προχωρήσεις κατά pos κόµβους. Γενικά είναι πολύ µπερδεµένη συνάρτηση. Προσπάθησε να την ξαναφτιάξεις ώστε να είναι πιο συνοπτική. - Σωστή removenth() και υλοποιηµένη µε πιο συνοπτικό τρόπο. - Καθόλου σχόλια και αρκετά άσχηµη στοίχιση. Μην αφήνεις τόσες πολλές κενές γραµµές. Page 4

1928 1929 1931 1932 1934 - Στοίχιση: ΟΚ - Ονόµατα µεταβλητών: ΟΚ - Σχόλια: Κανένα Σχόλιο! - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: OK - remove duplicates: --- Αφαίρεση: η γραµµή iter_prev = current->next; θα έπρεπε να είναι iter_prev = iter και να βρίσκεται πριν το iter=iterm->next. Ίσως να µην καταλάβατε την εκφώνηση, προσπαθήστε να την ξανακάνετε σπίτι. Σαν τέστ, αλλάξτε την print_list ώστε να εκτυπώνει και τη διεύθυνση, και στην remove πριν κάνετε free τον κόµβο, εκτυπώστε επίσης τη διεύθυνση και τα περιεχόµενα. Θα δείτε ότι τελικά δε σβήνετε όλους τους κόµβους, αλλά βάζετε τα βελάκια έτσι ώστε να παρακάµψετε κάποιους. --- free: ΟΚ - Σχόλια: OK - Έπρεπε να χρησιµοποιήσετε SUCCESS/FAILURE αντί για 1/0, αλλά µην κάνετε ποτέ αναθέσεις της µορφής *new_node=*ptr; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. Επίσης, στην περίπτωση που αποτυγχάνει η malloc έπρεπε να επιστρέφετε FAILURE. Σε κάθε περίπτωση, πριν τον τερµατισµό ενός προγράµµατος πρέπει να ελευθερώνετε τη δυναµικά δεσµευµένη µνήµη. - Σχόλια: OK - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. Page 5

1942 - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια 1946 1949 Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! - Το πρόγραµµα τερµατίζει µε segmentation fault µόλις πάει να αφαιρέσει το τελευταίο στοιχείο της λίστας, γιατί έχετε υλοποιήσει λάθος τη removenth - Σχόλια και στοίχιση οκ - Η κλήση της malloc είναι (listt *) malloc(sizeof(listt)) - Σωστή υλοποίηση της insertnth - Δεν υλοποιείτε σωστά την removenth: --- Δεν υλοποιείτε την περίπτωση διαγραφής από την αρχή της λίστας (την κεφαλή της λίστας) --- Γράφοντας στο while( i<pos+1) έτσι όπως υλοποιείτε στη συνέχεια τον κώδικα το curr πλέον έχει πάει στον επόµενο κόµβο έτσι δε διαγράφεται το σωστό κόµβο αλλά τον επόµενο µε αποτέλεσµα να πετάει Segmentation fault µόλις πάει να αφαιρεθεί το τελευταίο στοιχείο της λίστας 1950 Πολύ καλή δουλειά! - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 1959 -Σχόλια και στοίχιση οκ -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth -Μέσα στην removenth το current->next= NULL πριν τη free δεν χρειαζόταν Page 6

1960 1962 FAIL -Στοίχιση οκ - Κακογραµµένα σχόλια. Είναι πολύ µακρυά από τον κώδικα που σχολιάζουν και κάνουν wrap στις επόµενες γραµµές µε αποτέλεσµα άσχηµη µορφή του προγράµµατος. Να τα βάζετε σε ξεχωριστή γραµµή πριν τον κώδικα που σχολιάζουν, ή σε µορφή παραγράφου. -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth - Warning στο compile γιατί δεν επιστρέφετε τίποτα από την insertnth - Καλή στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Αλλά δεν δουλεύει σωστά η insertnth. Κάθε φορά που θέλετε ένα νέο κόµβο, πρέπει να δεσµεύετε µνήµη εκ νέου. Επίσης, δε διατρέχετε ποτέ τη λίστα. - Η removenth δεν είναι υλοποιηµένη καθόλου 1964 - Σωστή duplicate_list(). Για την περίπτωση που η malloc() είναι σωστότερο να επιστρέφουµε απλά FAILURE, αφήνοντας αυτόν που κάλεσε την duplicate_list() να διαχειριστεί όπως θέλει την αποτυχία δέσµευσης µνήµης. - Σωστή remove_duplicates(). 1965 -Καλή στοίχιση -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Λάθος insertnth, βάζετε το στοιχείο µία θέση πιο µετά από αυτή που σας ζητήθηκε. Επίσης ο έλεγχος µε το LIST_LENGTH είναι άκυρος διότι αυτή η σταθερά απλά σας δείχνει πόσο µεγάλη αρχικοποιήθηκε η λίστα και δεν αντικατοπτρίζει το µήκος της ανά πάσα στιγµή. -Λάθος removenth, προσπαθείτε να κάνετε free ακόµα και αν σας ζητήσουν έναν κόµβο που έχει "index" κατά ένα µεγαλύτερο από το µήκος της λίστας -Γενικά δεν χρειάζεται να µετράτε το µήκος της λίστας, δοκιµάστε να κάνετε την άσκηση µε 1 for-loop ανά function 1973 -Δεν γράψατε σωστά το θέµα στο mail. -Η στοίχιση σε αρκετά σηµεία είναι λάθος. -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Τα for σας επίσης έπρεπε να είναι πιο προσεκτικά γραµµένα ώστε να µην κάνουν wrap. -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Σωστή insertnth -Σωστή removenth Page 7

1975 FAIL - Warning στο compile γιατί δεν επιστρέφετε τίποτα από την insertnth - Καλή στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Αλλά δεν δουλεύει σωστά η insertnth. Κάθε φορά που θέλετε ένα νέο κόµβο, πρέπει να δεσµεύετε µνήµη εκ νέου. Επίσης, δε διατρέχετε ποτέ τη λίστα. - Η removenth δεν είναι υλοποιηµένη καθόλου 1984 -Σωστή στοίχιση -Καλά σχόλια -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Στην insertnth τα σχόλιά σας είναι λάθος για την εισαγωγή κόµβου στο τέλος της λίστας. Η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας, εποµένως είναι λάθος να χρησιµοποιείται σε κάθε εισαγωγή. Να προσέχετε τις συµβουλές που δίνονται την ώρα του εργαστηρίου. -Λάθος removenth η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας. 1985 - Σχόλια: Δεν υπήρχαν καθόλου σχόλια. - Υπήρξε πολύ µεγάλη καθυστέρηση στην ολοκλήρωση και αποστολή της άσκησης. Γνωρίζετε πολύ καλά οτι η άσκηση θα πρέπει να έχει αποσταλεί πριν το πέρας της διαθέσιµης ώρας του εργαστηρίου! 1986 - Σχόλια: OK 1988 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλή στοίχιση - Τα σχόλια τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Page 8

1992 - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: OK - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: Πρέπει να επιστρέφει 1/0 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν δουλεύει. Σκέψου τι θα γίνει αν βρεις ένα duplicate. Το current θα γίνει free (οπότε δε δείχνει πια σε έγκυρη διεύθυνση), κι αµέσως µετά κάνεις προσπέλαση του current->next. Εφόσον το current δεν είναι έγκυρο, το current->next µπορεί να προκαλέσει segmentation fault. --- free: ΟΚ 1994 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Καλά σχόλια και στοίχιση 1996 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 2001 2010 2012 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. -Στοίχιση οκ - Κακογραµµένα σχόλια. Είναι πολύ µακρυά από τον κώδικα που σχολιάζουν και κάνουν wrap στις επόµενες γραµµές µε αποτέλεσµα άσχηµη µορφή του προγράµµατος. Να τα βάζετε σε ξεχωριστή γραµµή πριν τον κώδικα που σχολιάζουν, ή σε µορφή παραγράφου. -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth Page 9

2013 lab12grades -Σωστή στοίχιση -Καλά σχόλια -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Στην insertnth τα σχόλιά σας είναι λάθος για την εισαγωγή κόµβου στο τέλος της λίστας. Η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας, εποµένως είναι λάθος να χρησιµοποιείται σε κάθε εισαγωγή. Να προσέχετε τις συµβουλές που δίνονται την ώρα του εργαστηρίου. -Λάθος removenth η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας. 2017 2020 2028 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. -Δεν γράψατε σωστά το θέµα στο mail. -Η στοίχιση σε αρκετά σηµεία είναι λάθος. -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Τα for σας επίσης έπρεπε να είναι πιο προσεκτικά γραµµένα ώστε να µην κάνουν wrap. -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Σωστή insertnth -Σωστή removenth Πολύ καλή δουλειά! - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 Page 10

2029 lab12grades Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! - Το πρόγραµµα τερµατίζει µε segmentation fault µόλις πάει να αφαιρέσει το τελευταίο στοιχείο της λίστας, γιατί έχετε υλοποιήσει λάθος τη removenth - Σχόλια και στοίχιση οκ - Η κλήση της malloc είναι (listt *) malloc(sizeof(listt)) - Σωστή υλοποίηση της insertnth - Δεν υλοποιείτε σωστά την removenth: --- Δεν υλοποιείτε την περίπτωση διαγραφής από την αρχή της λίστας (την κεφαλή της λίστας) --- Γράφοντας στο while( i<pos+1) έτσι όπως υλοποιείτε στη συνέχεια τον κώδικα το curr πλέον έχει πάει στον επόµενο κόµβο έτσι δε διαγράφεται το σωστό κόµβο αλλά τον επόµενο µε αποτέλεσµα να πετάει Segmentation fault µόλις πάει να αφαιρεθεί το τελευταίο στοιχείο της λίστας 2030 - Σχόλια: OK - Έπρεπε να χρησιµοποιήσετε SUCCESS/FAILURE αντί για 1/0, αλλά µην κάνετε ποτέ αναθέσεις της µορφής *new_node=*ptr; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. Επίσης, στην περίπτωση που αποτυγχάνει η malloc έπρεπε να επιστρέφετε FAILURE. Σε κάθε περίπτωση, πριν τον τερµατισµό ενός προγράµµατος πρέπει να ελευθερώνετε τη δυναµικά δεσµευµένη µνήµη. 2031 -Καλή στοίχιση -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Λάθος insertnth, βάζετε το στοιχείο µία θέση πιο µετά από αυτή που σας ζητήθηκε. Επίσης ο έλεγχος µε το LIST_LENGTH είναι άκυρος διότι αυτή η σταθερά απλά σας δείχνει πόσο µεγάλη αρχικοποιήθηκε η λίστα και δεν αντικατοπτρίζει το µήκος της ανά πάσα στιγµή. -Λάθος removenth, προσπαθείτε να κάνετε free ακόµα και αν σας ζητήσουν έναν κόµβο που έχει "index" κατά ένα µεγαλύτερο από το µήκος της λίστας -Γενικά δεν χρειάζεται να µετράτε το µήκος της λίστας, δοκιµάστε να κάνετε την άσκηση µε 1 for-loop ανά function 2034 - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 Page 11

2036 FAIL - Warning στο compile - Μέτρια στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - H insertnth δεν δουλεύει σωστά. Δεν δίνετε τιµή στο nodeptr->data. Το newnode δεν είναι δείκτης και δε προφανώς δε δείχνει σε δυναµικά δεσµευµένη µνήµη. Τι σκοπό εξυπηρετεί? - Η removenth είναι υλοποιηµένη αλλά ούτε αυτή δουλεύει σωστά. - Το output του προγράµµατος δεν είναι προσεγµενο. 2041 -Σχόλια και στοίχιση οκ -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth -Μέσα στην removenth το current->next= NULL πριν τη free δεν χρειαζόταν 2045 - Καλή στοίχιση - ΔΕΝ έχετε σχεδόν καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Η insertνth λειτουργεί µεν, αλλά δεν είναι καλά υλοποιηµένη. Διατρέχετε τη λίστα πολύ περισσότερες φορές από όσες χρειάζεται. Προσπαθήστε να την ξαναγράψετε διατρέχοντας τη λίστα το πολύ µια φορά. Δε χρειάζεται να υπολογίζετε το µήκος της (απλά τσεκάρετε αν φτάσατε σε NULL) και οι µόνες περιπτώσεις που χρειάζεται να χειριστείτε είναι για pos == 0 και για pos > 0 - Όταν η removenth λειτουργεί σωστά είναι κατά λάθος, αν τύχει το count να πάρει αρχική τιµή 0. Δεν το έχετε αρχικοποιήσει. Επίσης, αν κληθεί σε άδεια λίστα, θα πετάξει segmentation fault στο *list_head=(*list_head)->next->next; Επίσης, δε λειτουργεί σωστά στην περίπτωση που ζητηθεί να αφαιρεθεί ο τελευταίος κόµβος (δοκιµάστε αφαίρεση από τη θέση 6 αντί για 20 στην τελευταία κλήση στη main). Όπως ειπώθηκε στο εργαστήριο, πρέπει πάντα να ελέγχετε τις οριακές περιπτώσεις. 2046 FAIL - Warning στο compile - Μέτρια στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - H insertnth δεν δουλεύει σωστά. Δεν δίνετε τιµή στο nodeptr->data. Το newnode δεν είναι δείκτης και δε προφανώς δε δείχνει σε δυναµικά δεσµευµένη µνήµη. Τι σκοπό εξυπηρετεί? - Η removenth είναι υλοποιηµένη αλλά ούτε αυτή δουλεύει σωστά. - Το output του προγράµµατος δεν είναι προσεγµενο. 2047 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. Page 12

2048 2052 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Καλά σχόλια και στοίχιση 2062 - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: Ελάχιστα - create_duplicates: --- Διπλασιασµός: ανάθεση δεικνούµενου αντικειµένου πριν γίνει ο έλεγχος για failure (τι θα γίνει αν pointer == NULL στην εντολή *pointer=*current ;). Επίσης, µην κάνετε ποτέ αναθέσεις της µορφής *pointer=*current ; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. --- Επιστροφή: Επιστρέφει 0/1 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν γίνεται σωστή αφαίρεση, έτσι όπως είναι γραµµένο αφαιρεί µόνο τα διαδοχικά ίδια. Δε θα λειτουργήσει αν η λίστα είναι πχ 1 1 2 2 1 1 --- free: ΟΚ. --- Ξανακάντε την άσκηση στο σπίτι µε βάση τις παραπάνω επισηµάνσεις. Διαδικαστικά ΟΚ 2071 - Μη χρησιµοποιείς επιπλέον παρανθέσεις.το if ((i==pos)) έπρεπε να ήταν if (i==pos) - Σωστή print_list() - Σωστή insertnth() - Σωστή removenth() - Καλή στοίχιση αλλά δεν υπάρχουν σχόλια. 2074 2075 - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. Page 13

2076 2084 2088 2089 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Γενικά καλά σχόλια, αλλά και µερικά περιττά: Δε χρειάζεται να πεις τι κάνουν οι malloc και free - Τα σχόλια τα βάζουµε πάνω από τον κώδικα και όχι δίπλα. - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια, αλλά το if είναι περιττό και δείχνει µη-κατανόηση της λειτουργίας της for: Εφόσον ο µόνος τρόπος να µπούµε στο σώµα της for είναι η συνθήκη curr!=null, τότε προφανώς η συνθήκη της if θα είναι πάντα αληθής. - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια Page 14