AEM 0001 0002 COMMENTS οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 7 -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. -Το πρόγραµµά σου παράγει segmentation fault σε κάθε είσοδο! -Όταν δηλώνεις nodet *after; δεν µπορείς να πεις αµέσως after- >next=runner->next γιατί ο δείκτης after δεν έχει αρχικοποιηθεί να δείχνει πουθενά. Άρα προσπελαύνεις και αλλάζεις το περιεχόµενο µιας διεύθυνσης που δεν σου ανήκει. -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Ο κώδικας που έγραψες είναι αρκετά πολύπλοκος. Η λύση είναι πολύ πιο απλή. -Δεν έχεις µεριµνήσει για την περίπτωση step=0 και step=1. -Πολύ καλός σχολιασµός. 0003 0004 (διορθωτική) - Το πρόγραµµα δε διαχειρίζεται τις περιπτώσεις step = 0, step = 1 καλέσεις την συνάρτηση RemoveAtStep µε step=1. 0005 0006 0008 0009 Page 1
0010 0011 0012 - Αρχικοποιείς previous=null και µετά προσπελαύνεις το previous->next µε αποτέλεσµα να γίνεται πάντα segmentation fault. - Δε διαχειρίζεσαι τις περιπτώσεις που το step είναι 0 ή 1. - Δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας(µε το free(head) απελευρώνεις µόνο την κεφαλή όχι όλη τη λίστα) οριακά - Η συνάρτηση RemoveAtStep δεν λειτουργεί σωστά για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1. Επίσης, η εντολή '' runner = runner->next '' στην αντίστοιχη εντολή while οδηγεί σε προσπέλαση µνήµης που έχει αποδεσµευθεί κατά την προηγούµενη επανάληψη. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. Page 2
0013 0014 0015 - Οι δηλώσεις των µεταβλητών που χρησιµοποιούνται θα πρέπει να προηγούνται των εντολών του προγράµµατος. Εποµένως, η δήλωση της µεταβλητής k στην συνάρτηση RemoveAtStep θα έπρεπε να βρίσκεται µετά την δήλωση της µεταβλητής torr, δηλαδή να προηγείται και των διαφόρων εντολών αρχικοποίησης. Γι' αυτό σε ενηµερώνουν κάποια από τα compilation warnings. - Θα ήταν καλό να µην έχεις σχόλια C++ ( // ) στο πρόγραµµά σου. - Τα σχόλια συναρτήσεων δεν συµµορφώνονται µε αυτά του αντίστοιχου φυλλαδίου. - το µόνο λάθος που έχεις είναι ότι στη scanf στο dowhile να γίνεται η επανάληψη όσο ο χρήστης δίνει βήµα αρνητικό δηλ. step<0 - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. 0016 0018 Page 3
0019 0020 -Το πρόγραµµά σου παράγει segmentation fault σε κάθε είσοδο! -Η συνάρτηση RemoveAtStep είναι λάθος. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Δεν έχεις µεριµνήσει για την περίπτωση step=1. -Δεν έχεις βάλει καθόλου σχόλια! Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό! - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. 0021 0022 0023 - Για step = 1 θα έπρεπε πρώτα free(runner); και µετά runner=runner->next; γιατί έτσι όπως το έχεις δεν ελευθερώνεις των πρώτο κόµβο. - δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας πρίν το τέλος των διαδικασιών οριακά - Θα έπρεπε τις ενολές prev = runner; runner = runner->next; να τις έχεις µέσα σε else για να σου δουλέψει σωστά - για step =1 η εντολή prev = runner;που είναι µετά το free είναι περιττή.(γιατί την έχεις και ώς πρώτη). Επίσης θα έπρεπε να κάνεις κι έναν έλεγχο στο τέλος και αν το βήµα είναι 1 να µην επιστρέφεις την κεφαλή αλλά NULL (γιατί έτσι όπως το έχεις υλοποιήσει η κεφαλή χάνεται) - δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας πρίν το τέλος των διαδικασιών Page 4
0025 0026 0027 0028 0030 0033 οριακά -O compiler σου εµφανίζει warning: "/*" within comment και δεν το διορθώνεις! -Στην είσοδο 7 πέφτεις σε ατέρµονο βρόγχο. Το πρόγραµµα σου δεν δουλεύει σωστά για step=1. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Να βάζεις σχόλια και µέσα στον κώδικα, όχι µόνο πριν από κάθε συνάρτηση. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Έχεις βάλει πολύ λίγα σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. οριακά -Το πρόγραµµά σου δεν δουλέυει σωστά για step=0. Επιπλέον αφήνεις αρκετή δεσµευµένη µνήµη χωρίς να έχεις κανέναν τρόπο για να την ξαναπροσπελάσεις. -Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό! - Καλή προσπάθεια - ελευθερώνεις τη µνήµη της λίστας µετά το τέλος των διαδικασιών - Αλλά µε τον τρόπο που το εχεις υλοποιήσει σβήνεις µόνο την πρώτη φορά. Η µεταβλητή l δε χρειάζεται όπως επίσης δε χρειάζεται να αυξάνεις και το step. Αν µετά το do while απλά έθετες το k=0 και τιποτα άλλο ο κώδικάς σου θα δούλευε κανονικά - θα έπρεπε στην συνθήκη να έχεις step<=0 γιατί έτσι όπως το έχεις δε καλύπτεις την περίπτωση step=0 -Πολύ καλή δουλειά, συνέχισε έτσι! -Να βάζεις σχόλια και µέσα στον κώδικα, όχι µόνο πριν από κάθε συνάρτηση. 0034 Page 5
1072 -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Το πρόγραµµά σου παράγει segmentation fault για τις εισόδους 6,7. -Το πρόγραµµά σου δουλεύει σωστά για τις εισόδους: 1-5. Πολύ καλή δουλειά. -Έχεις βάλει πολύ λίγα σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. 1073 1074 1075 οριακά -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο για την είσοδο 7! -Το πρόγραµµά σου δεν δουλέυει σωστά για step=1. Κοίταξε καλά τον κώδικά σου και προσπάθησε να καταλάβεις ποιον κόµβο σβήνεις κάθε φορά. -Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό! - δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας πρίν το τέλος των διαδικασιών(µε το free(head) απελευρώνεις µόνο την κεφαλή όχι όλη τη λίστα) Page 6
1077 1079 1080 - Η εντολή return(null) εντός της δοµής while για την περίπτωση που η τιµή της µεταβλητής step είναι ίση µε 1 είναι λανθασµένη καθώς έχει ως αποτέλεσµα την διαγραφή µόνο του πρώτου κόµβου της λίστας. - Η εντολή '' runner = runner->next '' στην συνάρτηση RemoveAtStep για την περίπτωση που η τιµή της παραµέτρου step ισούται µε 1 είναι περιττή. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. - Το ότι χρησιµοποιείς επανάληψη για να µάθεις το πλήθος των κόµβων δε το χρησιµοποιείς πουθενά αργότερα στον κώδικά σου. - αφού έχεις ειδική περίιιπτωση το step=1 θα έπρεπε να αρχικοποιείς metrhths=2 αντί για metrhths=0 γιατί 0%κατι ειναι πάντα 0 οπότε θα σβήνει πάντα το δεύτερο στοιχείο της λίστας ότι κι αν είναι το βήµα - θα έπρεπε να έχεις head = RemoveAtStep(head,step); έτσι ώστε αν το βήµα=1, που εσύ στην υλοποίησή σου αλλάζεις τη θέση του head, µε την ανάθεση αυτή το head να πάρει τη νέα τιµή που είναι NULL. - δεν ελευθερώνεις τη µνήµη της λιστας µέτα το τέλος των διαδικασιών οριακά -Η συνάρτηση main έπρεπε να εµφανίζεται πρώτη. -Η υλοποίηση για την περίπτωση step=1 είναι λάθος. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Έχεις βάλει πολύ λίγα σχόλια. Page 7
1081 -Το πρόγραµµά σου δεν κάνει compile. Απαράδεκτο το ότι δεν διόρθωσες ένα τόσο εύκολο λάθος. -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο σε κάθε είσοδο! -Δεν διαβάζεις πουθενά την µεταβλητή step. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. -Πρόσεξε την στοίχισή σου! 1082 1084 1085 1086 - Προσοχή στην στοίχιση. - Η συνάρτηση RemoveAtStep δεν λειτουργεί πλήρως ορθά στην περίπτωση που η τιµή της παραµέτρου step ισούται µε 1. Σε αυτή την περίπτωση, η αρχικοποίηση '' prev = head '' έχει ως αποτέλεσµα η εντολή '' runner = prev->next '' να οδηγεί σε προσπέλαση µνήµης που έχει αποδεσµευτεί από την αµέσως προηγούµενη εντολή free. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Θα ήταν καλό στην συνάρτηση main να υπάρχει µία δοµή if-else if και όχι τρεις εντολές if, αφού οι αντίστοιχες συνθήκες είναι αµοιβαίως αποκλειόµενες. - ok Page 8
1087 1088 1089 1091 οριακά - Η συνάρτηση RemoveAtStep δεν λειτουργεί σωστά για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1. - Θα ήταν καλό τα άγκιστρα '' { '' να µην διαχωρίζονται µε πολλά κενά από την εντολή στην οποία αντιστοιχούν. - Προσοχή στα σχόλια των συναρτήσεων. Ως preconditions και postconditions περιγράφονται οι συνθήκες που πρέπει να ισχύουν για την ορθή λειτουργία και οι αλλαγές που επιφέρει η κλήση της συνάρτησης αντίστοιχα. -Το πρόγραµµά σου δεν δουλέυει σωστά για step=0. Επιπλέον αφήνεις αρκετή δεσµευµένη µνήµη χωρίς να έχεις κανέναν τρόπο για να την ξαναπροσπελάσεις. -Ο υπόλοιπος κώδικας είναι σωστός, έκανες καλή δουλειά. οριακά - Δε διαχειρίζεσαι τις περιπτώσεις που το step είναι 0 ή 1. - Δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας οριακά -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο στο in7. -Η υλοποίηση για την περίπτωση step=1 είναι λάθος. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. καλέσεις την συνάρτηση RemoveAtStep µε step=1. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. Page 9
1093 1095 1097 -Το πρόγραµµά σου δεν κάνει compile. Πολλά συντακτικά λάθη. -Διάβασε την θεωρία για το πως καλούµε µια συνάρτηση. -Δεν υλοποιείς καθόλου την συνάρτηση που ζητείται. -Το πρόγραµµά σου δουλεύει σωστά για τις εισόδους: 1, 5 -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 2, 3, 4, 6, 7 -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Όταν κάνεις free(run), δεν µπορείς µετά να πεις prev- >next=run->next γιατί το run->next δεν είναι πλέον έγκυρη διεύθυνση! -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. οριακά -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head). Τι γίνεται µε τους άλλους κόµβους που παραµένουν στην µνήµη;; -Το πρόγραµµά σου δεν δουλεύει σωστά για step=1. Ο βρόγχος while (runner!=null) τελειώνει στην πρώτη επανάληψη γιατί κάνεις free(runner). -Δεν έχεις βάλει σχεδόν καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. -Πρόσεξε την στοίχισή σου! 1098 Page 10
1100 1101 1102 1104 - Την περίπτωση όπου το βήµα είναι 1 έχεις segmentation fault κι αυτό γιατί το if(step==1) είναι στο τέλος οπότε ακόµα κι αν το βήµα είναι 1 η επανάληψη για την αφαίρεση κόµβων εκτελείται κανονικά. Και δεύτερον θα πρέπει να απελευθερώνεις τη µνήµη για όλους τους κόµβους κι όχι απλά να κάνεις head=null - δεν ελευθερώνεις τη µνήµη της λιστας µέτα το τέλος των διαδικασιών (πρέπει να απελευθερώνεις τη µνήµη για όλους τους κόµβους) - καλά τα σχόλια σου αλλά δε χρειάζεται να εξηγείς κάθε φορά ότι γίνετα ι κλήση µια συνάρτησης -η εντολή '' previous = runner '' στο for οδηγεί σε προσπέλαση µνήµης που έχει αποδεσµευθεί κατά την τρέχουσα επανάληψη. - Δεν χειρίζεσαι τις περιπτώσεις που το step είναι 0 ή 1. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. - Η εντολή '' runner = runner->next '' στην συνάρτηση RemoveAtStep για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1 είναι λανθασµένη καθώς οδηγεί σε προσπέλαση µνήµης που έχει απελευθερωθεί από την αµέσως προηγούµενη εντολή free. - Οι δηλώσεις των µεταβλητών που χρησιµοποιούνται θα πρέπει να προηγούνται των εντολών του προγράµµατος. Εποµένως, η δήλωση της µεταβλητής head στην συνάρτηση main θα έπρεπε να προηγείται της εντολής '' temp = 1 ''. Οµοίως και στην συνάρτηση RemoveAtStep. Γι' αυτό σε ενηµερώνουν τα compilation warnings. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - ΟΚ ελευθερώνεις και τη µνήµη όλων των κόµβων της λίστας πριν το τέλος των διαδικασιών ΑΛΛΑ δεν έχεις σχόλια Page 11
1105 - Πολύ µπερδεµένη λογική, και τελικά δε δουλεύει σωστά για καµια περίπτωση. 1109 1110 1111 1113 1114 οριακά -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο για την είσοδο 7! -Η συνάρτηση RemoveAtStep είναι λάθος για step=1. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Πολύ καλός σχολιασµός. - Δε διαχειρίζεσαι τις περιπτώσεις που το step είναι 0 ή 1. - Δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας - Κάνεις runner = help->next αµέσως αφότου απελευθερώνεις τη µνήµη όπου δείχνει το help. - Σε περίπτωση που η τιµή της µεταβλητής step ισούται µε 1 δεν θα έπρεπε να καλείς ξανά την συνάρτηση RemoveAtStep για την απελευθέρωση της υπολειπόµενης µνήµης καθώς έχει ήδη απελευθερωθεί όλη η µνήµη που έχει δεσµευθεί για την λίστα. - Προσοχή στα σχόλια των συναρτήσεων. Ως preconditions και postconditions περιγράφονται οι συνθήκες που πρέπει να ισχύουν για την ορθή λειτουργία και οι αλλαγές που επιφέρει η κλήση της συνάρτησης αντίστοιχα. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Προσοχή στην στοίχιση. Page 12
1115 1116 -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head). Τι γίνεται µε τους άλλους κόµβους που παραµένουν στην µνήµη; -Πολύ καλή δουλειά, συνέχισε έτσι! - Δεν έχει υλοποιηθεί η λογική του προγράµµατος για την περίπτωση που ο χρήστης δώσει τιµή για την παράµετρο step ίση µε 1. - Το κενό µεταξύ του χαρακτήρα '' και του % στην εντολή scanf της συνάρτησης main είναι περιττό. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. 1117 1118 1119 1120 1121 - OK, πολύ καλά σχόλια και ελευθερώνεις και τη µνήµη όλων των κόµβων της λίστας στο τέλος των διαδικασιών - δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας πρίν το τέλος των διαδικασιών(µε το free(head) απελευρώνεις µόνο την κεφαλή όχι όλη τη λίστα) Page 13
1122 lab10 οριακά - Η συνάρτηση RemoveAtStep δεν λειτουργεί σωστά για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1. Επίσης, η εντολή '' runner = runner->next '' στην αντίστοιχη εντολή while οδηγεί σε προσπέλαση µνήµης που έχει αποδεσµευθεί κατά την προηγούµενη επανάληψη. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την τιµή που εισάγει ο χρήστης για την µεταβλητή step. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. Επίσης, τα άγκιστρα '' } '' θα πρέπει να βρίσκονται στην ίδια στήλη µε την εντολή την οποία ''κλείνουν''. 1123 1124 1126 οριακά -Το πρόγραµµά σου παράγει segmentation fault για την είσοδο 7. -Το πρόγραµµα σου δεν δουλεύει σωστά για step=1. Όταν γράφεις free(runner) δεν µπορείς µετά να πεις runner=runner->next αφού το runner->next µόλις το έσβησες µε την free!!! -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Να βάζεις σχόλια και µέσα στον κώδικα, όχι µόνο πριν από κάθε συνάρτηση. -Πολύ καλός σχολιασµός, συνέχισε έτσι. -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο για όλες τις εισόδους. -Έχεις λογικά λάθη. 1127 Page 14
1128 1129 1130 1131 οριακά -Το πρόγραµµά σου παράγει segmentation fault για την είσοδο 6. -Το πρόγραµµά σου παράγει segmentation fault σε κάθε είσοδο! καλέσεις την συνάρτηση RemoveAtStep µε step=1. -Δεν έχεις µεριµνήσει για την περίπτωση step=0 και step=1. -Η στοίχισή σου είναι απαράδεκτη. -Πολύ σωστά τα σχόλια που έβαλες, διάβασε όµως το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. - segfault στην περίπτωση step = 1 οριακά -Στην είσοδο 7 πέφτεις σε ατέρµονο βρόγχο. Το πρόγραµµα σου δεν δουλεύει σωστά για step=1. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Να βάζεις σχόλια και µέσα στον κώδικα, όχι µόνο πριν από κάθε συνάρτηση. Page 15
1133 1135 οριακά - Η συνάρτηση RemoveAtStep δεν λειτουργεί σωστά για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. - Προσοχή στην στοίχιση. - Καλή Προσπάθεια 1137 1139 οριακά - Δε διαχειρίζεσαι τις περιπτώσεις που το step είναι 0 ή 1. - Δεν ελευθερώνεις τη µνήµη για όλα τα στοιχεία της λίστας 1141 1142 οριακά -Το πρόγραµµά σου παράγει segmentation fault για την είσοδο 7. -Το πρόγραµµά σου δεν δουλέυει σωστά για step=1. Όταν γράφεις free(runner) δεν µπορείς µετά να πεις runner=runner->next αφού το runner->next µόλις το έσβησες µε την free!!! -Πολύ καλός σχολιασµός, συνέχισε έτσι. - OK, ελευθερώνεις και τη µνήµη όλων των κόµβων στο τέλος - καλά τα σχόλια σου αλλά δε χρειάζεται να εξηγείς κάθε φορά ότι γίνεται κλήση µια συνάρτησης Page 16
1144 1145 1146 1148 -Η συνάρτηση RemoveAtStep είναι λάθος για step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο, όπως πολύ σωστά κάνεις στην main. Αν το είχες κάνει αυτό, θα αρκούσε να καλέσεις την συνάρτηση RemoveAtStep µε step=1 για να απελευθερώσεις όλη την µνήµη που δέσµευσες. -Γενικά όµως, πολύ καλή εργασία µε σωστή σκέψη και πρότυπα σχόλια. -Δεν έχεις βάλει καθόλου σχόλια! Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό! -Το πρόγραµµά σου παράγει segmentation fault γιατι αρχικοποιείς prev=null και µετά προσπελαύνεις το prev->next καλέσεις την συνάρτηση RemoveAtStep µε step=1. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. πολύ οριακά -Το µήνυµα "give step" είναι περιττό. -Το πρόγραµµά σου παράγει segmentation fault για τις εισόδους 6 και 7. -Η υλοποίηση για την περίπτωση step=1 είναι λάθος. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. Page 17
1149 1150 1152 - Μπερδεµένη λογικήπου καταλήγει σε segmentation fault σε όλες τις περιπτώσεις - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Θα ήταν καλό στην συνάρτηση RemoveAtStep να υπάρχει µία δοµή if-else if και όχι δύο εντολές if, αφού οι δύο συνθήκες είναι αµοιβαίως αποκλειόµενες. - Τα σχόλια των συναρτήσεων δεν συµµορφώνονται µε αυτά του αντίστοιχου φυλλαδίου. οριακά -Δεν απελευθερώνεις καθόλου την µνήµη που δέσµευσες. Αρκούσε να -Το πρόγραµµά σου δεν δουλεύει σωστά για step=1. -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head). Τι γίνεται µε τους άλλους κόµβους που παραµένουν στην µνήµη;; -Δεν έχεις βάλει σχεδόν καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. 1155 1157 -Το πρόγραµµά σου παράγει segmentation fault σε κάθε είσοδο εκτός από τις 6,7. Κι εκεί όµως τα αποτελέσµατα είναι λάθος. -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. 1158 Page 18
1159 1160 1161 1171 - Οι δηλώσεις των µεταβλητών που χρησιµοποιούνται θα πρέπει να προηγούνται των εντολών του προγράµµατος. Εποµένως, η δήλωση της µεταβλητής runner στην συνάρτηση main θα έπρεπε να προηγείται της εντολής '' newrunner = head ''. Οµοίως και στην συνάρτηση RemoveAtStep. Γι' αυτό σε ενηµερώνουν τα compilation warnings. - Τα σχόλια των συναρτήσεων δεν συµµορφώνονται πλήρως µε αυτά του αντίστοιχου φυλλαδίου. - Προσοχή στην στοίχιση. - πολύ καλή υλοποίηση - δεν ελευθερώνεις τη µνήµη της λιστας µέτα το τέλος των διαδικασιών - θα έπρεπε να κάνεις ένα έλεγχο στο τέλος της RemoveAt και αν step=1 να επιστρέφεις NULL και όχι το head (το head έχει χαθεί σε αυτή την περίπτωση) -Το πρόγραµµά σου δεν κάνει compile. -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Δεν τυπώνεις πουθένα αποτελέσµατα! -Πολύ καλός σχολιασµός. - Μη χρησιµοποιείς \n στο format string του scanf - Δεν αποδεσµεύεις όλη τη δυναµικά δεσµευµένη µνήµη στο τέλος του προγράµµατος. Θα µπορούσες να το είχες κάνει πολύ απλά, καλώντας τη RemoveAtStep µε βήµα 1. - Στην περίπτωση που step = 1, η συνάρτησή σου θα έπρεπε να επιστρέφει NULL (ή να είχες θέσει το head σε NULL πριν το επιστρέψεις) - Άσχηµη στοίχιση - Λίγο πολύπλοκη η λογική του προγράµµατος, αλλά δουλεύει. Page 19
1172 1177 -Το πρόγραµµά σου πέφτει σε ατέρµονο βρόγχο για όλες τις εισόδους. -Η συνάρτηση RemoveAtStep είναι παντελώς λάθος. Δεν κάνεις καµία αφαίρεση κόµβου. -Ο compiler σου εµφανίζει το µήνυµα "warning: unused variable 'next'" αλλά δεν έκανες τίποτα για να το διορθώσεις. -Δεν έχεις βάλει σχεδόν καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. -Πρόσεξε την στοίχισή σου! οριακά - Η συνάρτηση RemoveAtStep δεν λειτουργεί σωστά για την περίπτωση που η τιµή της µεταβλητής step ισούται µε 1. Επίσης, η εντολή '' curr = curr->next '' στην αντίστοιχη εντολή while οδηγεί σε προσπέλαση µνήµης που έχει αποδεσµευθεί κατά την τρέχουσα επανάληψη. - Θα ήταν χρήσιµο να υπάρχει κώδικας στην συνάρτηση main που θα ελέγχει την εγκυρότητα της τιµής που εισάγει ο χρήστης για την µεταβλητή step. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. 1178 1180 -Πολύ καλή δουλειά, συνέχισε έτσι! -Να βάζεις σχόλια και µέσα στον κώδικα, όχι µόνο πριν από κάθε συνάρτηση. Page 20
1181 οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 6, 7 -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Για να απελευθερώσεις την µνήµη µιας λίστας δεν αρκεί να κάνεις free(head)! -Πολύ καλός σχολιασµός. 1184 1185 1186 1187 οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 6, 7 -Η υλοποίηση για την περίπτωση step=1 είναι λάθος. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον βρόγχο. -Δεν έχεις βάλει καθόλου σχόλια. Διάβασε το φυλλάδιο µε τις οδηγίες για πρότυπο σχολιασµό. - Η εκφώνηση της άσκησης αναφέρει ότι ο αριθµός που εισάγεται από τον χρήστη είναι µη αρνητικός. Εποµένως, ο έλεγχος στην συνάρτηση main θα έπρεπε να είναι '' d < 0 '' και θα έπρεπε να υπήρχε έλεγχος για τιµή της παραµέτρου step ίση µε µηδέν στην συνάρτηση RemoveAtStep. - Σε περίπτωση που η τιµή της µεταβλητής step ισούται µε 1 δεν θα έπρεπε να καλείς ξανά την συνάρτηση RemoveAtStep για την απελευθέρωση της υπολειπόµενης µνήµης καθώς έχει ήδη απελευθερωθεί όλη η µνήµη που έχει δεσµευθεί για την λίστα. Αυτό έχει ως αποτέλεσµα το segmentation fault όταν ο χρήστης δώσει την τιµή 1 ως είσοδο. Επίσης, σε αυτή την περίπτωση, η συνάρτηση RemoveAtStep θα έπρεπε να επιστρέφει NULL. - Δεν υπάρχουν σχόλια συναρτήσεων. Η ύπαρξη σχολίων αποτελούσε και ζητούµενο της άσκησης. 1191 Page 21