ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 οριακό PASS - Η µεταβλητή aukswn_aritmos είναι περιττή. Μπορούσες να χρησιµοποιήσεις i+1 στη θέση της. - Σωστή αριθµητική δεικτών - Καλή στοίχιση, σχόλια 451 PASS -Καλή στοίχιση -Καλά σχόλια -Καλά ονόµατα µεταβλητών. --Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings. -Το output του προγράµµατος δεν ήταν ίδιο µε αυτό που ζητούσε η άσκηση (Κατά την είσοδο των strings) -Το αποτέλεσµα της άσκησης ήταν σωστό -Σωστή χρήση δεικτών. 476 οριακό PASS Καλή στοίχιση -Καλά ονόµατα µεταβλητών -Το output του προγράµµατος ήταν καλό. (Σου ξέφυγε ένα \n στο τύπωµα της τελευταίας printf) -Το πρόγραµµα δεν έβγαζε σωστά αποτελέσµατα. Τις περισσότερες φορές έβγαζε +1 απο την σωστή απάντηση. Ήσουν κοντά δηλαδη. Δεν δούλευε για όλες τις περιπτώσεις όµως. -Καλή στοίχιση -Καλά σχόλια -Καλά ονόµατα µεταβλητών --Κάνεις scanf string και δεν ορίζετε τους χαρακτήρες που θα κάνετε scanf (π.χ. %50s).Αυτό είναι λανθασµένη πρακτική -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings. -Το πρόγραµµα δεν βγάζει το αναµενόµενο αποτέλεσµα, τυπώνει το πρώτο sting + to glue για οποιοδήποτε αριθµό strings δώσει ο χρήστης. Έκανες λάθος στην αύξηση του counter. -Η στοίχιση δεν ήταν καλή. -Έβγαζε ενα warning στο compile. -Έµπαινε σε ατέρµων loop. Page 1
Διαδικαστικά: ΟΚ Άσκηση 1η 1733 PASS - Σωστή στοίχιση και σχόλια. - Τα ονόµατα των µεταβλητών που έχετε επιλέξει είναι λίγο περίεργα (π.χ. δεν καταλαβαίνει κανείς από το όνοµα τι είναι το bstr) - Σωστή επίλυση της άσκησης. Άσκηση 2η - Σωστή στοίχιση και σχόλια. - Σωστή υλοποίηση της my_strlen(). - Έχετε υλοποιήσει την copy σε αρκετά καλό επίπεδο. Έχετε λάθος στις γραµµές 44, 45. Γιατί length = my_strlen(&string1[0]) - 3? Αν έλειπε αυτή η γραµµή και δεν είχατε το +1 στην επόµενη το πρόγραµµα σας θα δούλευε σωστά. Συνολικά καλή δουλειά. Προσπαθήστε όσα δεν κάνατε στο σπίτι. 1779 PASS - Καλή στοίχιση - Δεν υπάρχουν σχόλια - Εκτός από τα ptr1, ptr έχετε καλά ονόµατα µεταβλητών. Τα ptr1, ptr θα µπορούσαν να λέγονται first_occur, sec_occur ή first, second - Σωστά σκεφτήκατε να ελέγξετε το str_num αλλά θα έπρεπε να βεβαιώνεστε και ότι είναι >0 ή έστω >=0 - Σωστή αριθµητική δεικτών, αλλά το glue string δε θα έπρεπε να εκτυπώνεται στο τέλος. Μπορούσατε να το αποφύγετε µε ένα απλό έλεγχο και πρόωρο break από το loop. - Δεν εκτυπώνετε το τελικό µήνυµα ακριβώς όπως ζητήθηκε. - Σωστά υπολογίζετε το min. Προσπαθήστε να τελειώσετε την άσκηση στο σπίτι. Page 2
1899 PASS - Προσοχή στη στοίχιση: έπρεπε όλες οι εντολές να είναι ένα tab πιο δεξιά. Διαβάστε ΠΡΟΣΕΚΤΙΚΑ το φυλλάδιο "Αρχές καλού προγραµµατισµού" - Καλό θα ήταν να ελέγχατε την εγκυρότητα του strn (αν είναι θετικός και µικρότερος του ROWS). - Μέτρια ονόµατα µεταβλητών. Μην κόβετε τα φωνήεντα γιατί δεν είναι πάντα αναγνωρίσιµες οι λεξεις. Τα glstr, strn δε δίνουν καµία ένδειξη για το τι περιέχουν οι µεταβλητές. Ειδικά το strn είναι προβληµατικό γιατί παραπέµπει σε string ενώ είναι ακέραιος. Καλύτερα ονόµατα θα ήταν glue_str και num_words - Σωστή έξοδος - Tο πρόγραµµά σας δε θα λειτουργήσει σωστά αν αλλάξουν οι τιµές που έχουν γίνει #define. Έπρεπε να κατασκευάσετε κατάλληλο format string µε χρήση sprintf. - Σωστή χρήση αριθµητικής δεικτών. - Δεν υπάρχουν σχόλια - Καλή στοίχιση αυτή τη φορά, αλλά πάλι δεν υπάρχουν σχόλια. - Ισχύουν τα ίδια για το format string. - Καλή προσπάθεια, αλλά όχι ολοκληρωµένη. Προσπαθήστε να κάνετε στο σπίτι το κοµµάτι που λείπει. - Το 1000 είναι κάπως τυχαίο και δε θα λειτουργήσει σωστά αν αλλάξει το µέγεθος του αρχικού string σε κάτι µεγαλύτερο του 100. Μπορείτε να σκεφτείτε µια αρχική τιµή που θα είναι πάντα σωστή? 1900 PASS - Προσοχή στη στοίχιση: έπρεπε όλες οι εντολές να είναι ένα tab πιο δεξιά. Διαβάστε ΠΡΟΣΕΚΤΙΚΑ το φυλλάδιο "Αρχές καλού προγραµµατισµού" - Καλό θα ήταν να ελέγχατε την εγκυρότητα του strn (αν είναι θετικός και µικρότερος του ROWS). - Μέτρια ονόµατα µεταβλητών. Μην κόβετε τα φωνήεντα γιατί δεν είναι πάντα αναγνωρίσιµες οι λεξεις. Τα glstr, strn δε δίνουν καµία ένδειξη για το τι περιέχουν οι µεταβλητές. Ειδικά το strn είναι προβληµατικό γιατί παραπέµπει σε string ενώ είναι ακέραιος. Καλύτερα ονόµατα θα ήταν glue_str και num_words - Σωστή έξοδος - Tο πρόγραµµά σας δε θα λειτουργήσει σωστά αν αλλάξουν οι τιµές που έχουν γίνει #define. Έπρεπε να κατασκευάσετε κατάλληλο format string µε χρήση sprintf. - Σωστή χρήση αριθµητικής δεικτών. - Δεν υπάρχουν σχόλια - Καλή στοίχιση αυτή τη φορά, αλλά πάλι δεν υπάρχουν σχόλια. - Ισχύουν τα ίδια για το format string. - Καλή προσπάθεια, αλλά όχι ολοκληρωµένη. Προσπαθήστε να κάνετε στο σπίτι το κοµµάτι που λείπει. - Το 1000 είναι κάπως τυχαίο και δε θα λειτουργήσει σωστά αν αλλάξει το µέγεθος του αρχικού string σε κάτι µεγαλύτερο του 100. Μπορείτε να σκεφτείτε µια αρχική τιµή που θα είναι πάντα σωστή? Page 3
Διαδικαστικά ΟΚ 1901 FAIL Άσκηση 1η - Καλή σοτίχιση - Δεν υπάρχουν σχόλια - Καλά ονόµατα µεταβλητών εκτός από το temp - H άσκηση παράγει segmentation fault. Προσπαθήστε να την κάνετε στο σπίτι. "Ζωγραφίστε" τον πίνακα στο χαρτί, και πού δείχνουν οι διάφοροι pointers που έχετε για να βρείτε το λάθος σας. Άσκηση 2η - Το πρόγραµµα δεν µεταγλωτίζεται. Προσπαθήστε να την κάνετε στο σπίτι. 1904???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. Επίσης δεν τον αρχικοποιείτε σωστά γιατί το εσωτερικό for-loop είτε δεν εκτελείται ποτέ είτε δεν τερµατίζει ποτέ ανάλογα µε την τιµή της σταθεράς STRLEN, το πρόγραµµά σας τυχαίνει να λειτουργεί σωστά. Τέλος, καλό είναι να µην χρησιµοποιείτε "<=" αν µπορείτε να χρησιµοποιήσετε "<". Πχ το "i<=n-1" είναι ισοδύναµο µε "i<n". -Σωστές πράξεις αλλά δεν παίρνετε υπόψιν σας πως µία είσοδος µπορεί να είναι της µορφής "κείµενοdelimiterκείµενο". -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές, *οπωσδήποτε*. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Η άσκηση ζητούσε την χρήση pointers. -Λύστε την 2η άσκηση *οπωσδήποτε*. 1908???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Λύστε την 2η άσκηση *οπωσδήποτε*. Page 4
1909 FAIL -Σχόλια: Εντάξει -Στοίχιση: Εντάξει - Τα περισσότερα ονόµατα που χρησιµοποιήτε είναι τελείως λάθος καθώς δεν υποδηλώνουν τη χρήση της κάθε µεταβλητής. Αποφεύγουµε να αριθµούµε τις µεταβλητές µας και να βάζουµε γενικά ονόµατα όπως str και array. Διαβάστε πάλι τον οδηγό µε τις οδηγίες για τη σωστή χρήση ονοµάτων µεταβλητών. - Δεν έχετε χρησιµοποιήσει την sprintf για να διαβάζετε την είσοδο ακόµη και αν ο πίνακας σας δηλώνεται διαφορετικά κάθε φορά. Δείτε στις διαφάνειες πως χρησιµοποιείται η sprintf και να κάνετε κάποια παραδείγµατα για να σιγουρευτείτε οτι καταλαβαίνετε πως λειτουργεί. - Το πρόγραµµα σας βγάζει κάποιες προειδοποιήσεις τις οποιες δεν έχετε λύσει και έτσι υπάρχουν κάποια προβλήµατα που το κάνουν να µην είναι σε θέση να τρέξει σωστά. Διορθώνουµε πάντα όλα τα warnings και αν δεν καταλαβαίνουµε τι εννοούν τότε ρωτάµε τους βοηθούς. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. - Λάθος πράξεις. Χρησιµοποιείτε τη µεταβλητή flag (ποιος είναι ο λόγος που χρησιµοποιήσατε αυτό το όνοµα; ) η οποία στην αρχή δεν έχει αρχικοποιηθεί. - Στη γραµµή 30 έχετε κάνει λάθος ανάθεση την οποία σας τονίζει και ο compiler. Βάζετε σε περιεχόµενο ενός δείκτη το δείκτη ενός άλλου πίνακα. -Στην εκτύπωση της εξόδου γιατί δεν χρησιµοποιείτε %s και το εκτυπώνετε χαρακτήρα χαρακτήρα; - Λύστε οπωσδήποτε την άσκηση 1910???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Λύστε την 2η άσκηση *οπωσδήποτε*. 1911 FAIL Στείλατε την άσκηση του lab 8. ΑΝΟΙΓΟΥΜΕ ΤΟ MAIL που µας έρχεται όταν κάνουµε CC. Page 5
Διαδικαστικά: 8 λεπτά εκπρόθεσµη 1913 FAIL - σχόλια: πολύ λίγα - στοίχιση: σε κάποια σηµεία είναι λίγο εκτός, πχ στο 2ο for. Επίσης δε χρειάζεται να αφήνεται τόσα πολλά κενά µέχρι το return! - σταθερές: OK - ονόµατα µεταβλητών: num,temp_len, temp_len1 είναι αρκετά άσχηµα, δοκιµάστε κάτι πιο περιγραφικό! - format string: Δεν χρησιµοποιήθηκε και τα µεγέθη στη scanf είναι λάθος γιατί δεν αφήνετε χώρο για το \0 - αριθµητική δεικτών: η γραµµή point[temp_len]= '\0' ; πρέπει να σας βγάζει το segmentation. Διότι πριν από αυτή αλλάζετε το point και µετά πάτε να πειράξετε µια θέση από το τέλος του string που µόλις προσπεράσατε + το µεγεθός του, το οποίο δεν βγάζει νόηµα. - χρήση strncpy: ΟΚ - Μην αγνοείτε τα warnings του compiler. Το str_glue έπρεπε να είναι δηλωµένο ως συµβολοσειρά, όχι ως χαρακτήρας. Επίσης στη scanf που γεµίζετε τον πίνακα έπρεπε να είχατε str_table[i]. Τέτοιου είδους λάθη προκαλούν segfault. - Δεν εκτυπώνετε το string στο τέλος. - γενικά: Θα πρέπει να ξαναδοκιµάσετε! Προσπαθήστε να καταλάβετε καλύτερα την αριθµητική µε δείκτες. Δεν κάνει compile. Γενικά, πρέπει να µάθετε να διαβάζετε τα errors του compiler. Διαδικαστικά OK. - Σωστή στοίχιση. - Τα περισσότερα σχόλια δεν προσφέρουν κάποια έξτρα πληροφορία πέραν του προφανούς. - Σωστή δηµιουργία των format strings µε χρήση της sprintf(). - Σωστή χρήση strncpy() και υπολογισµός µεγέθους. 1914 PASS - Καθόλου σχόλια! - Για τη λειτουργία "copy": το όριο της επανάληψης στην περίπτωση συµβολοσειρών ίσου µεγέθους αρκεί να είναι strlen1 (ή strlen2). για strlen1>strlen2, η µεταβλητή pos δεν αλλάζει τιµή µέσα στην επανάληψη, οδηγώντας σε ατέρµων βρόχο, και η συνθήκη στο σώµα του βρόχου είναι πάντα αληθής (pos<string_length). - Η εκφώνηση απαγορεύει ρητά τη χρήση πινάκων οπουδήποτε αλλού πέραν της αρχικοποίησησς τους. Λύστε την άσκηση αποκλειστικά µε χρήση δεικτών. Page 6
1915???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. Επίσης δεν τον αρχικοποιείτε σωστά γιατί το εσωτερικό for-loop είτε δεν εκτελείται ποτέ είτε δεν τερµατίζει ποτέ ανάλογα µε την τιµή της σταθεράς STRLEN, το πρόγραµµά σας τυχαίνει να λειτουργεί σωστά. Τέλος, καλό είναι να µην χρησιµοποιείτε "<=" αν µπορείτε να χρησιµοποιήσετε "<". Πχ το "i<=n-1" είναι ισοδύναµο µε "i<n". -Σωστές πράξεις αλλά δεν παίρνετε υπόψιν σας πως µία είσοδος µπορεί να είναι της µορφής "κείµενοdelimiterκείµενο". -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές, *οπωσδήποτε*. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Η άσκηση ζητούσε την χρήση pointers. -Λύστε την 2η άσκηση *οπωσδήποτε*. Διαδικαστικά: οκ 1917???? -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός του ptr και σωστή χρήση σταθερών. -Έπρεπε να βάλετε κάποιον έλεγχο για τα πόσα string µπορεί να δώσει ο χρήστης -Μέσα στους ελέγχους µπορείτε αντί i<=string_num-1 να γράφεται i<string_num -Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστή µορφοποίηση εξόδου -Δεν έγινε Page 7
Διαδικαστικά OK. 1920 FAIL Άσηση 1η: - Δεν έχετε βάλει περιορισµό στο µέγεθος της εισόδου που διαβάζει η scanf(), δείτε στις διαφάνειες πως γίνεται αυτό µε γενικό τρόπο χρησιµοποιώντας την sprintf() για τη δηµιουργία του format string. Αυτό είναι σοβαρό λάθος! - Δεν ελέγχετε την τιµή που επιστρέφει η strstr() µέσα στο while. Εάν ο delimiter δεν υπάρχει, η επιστρεφόµενη τιµή είναι NULL και οποιαδήποτε απόπειρα εγγραφής/ανάγνωσης από αυτή τη διεύθυνση προκαλεί segmentation fault και τερµατίζει το πρόγραµµα. Επίσης, να χρησιµοποιείτε NULL και όχι 0 όταν πρόκειται για pointers. - Για την περίπτωση που δεν υπάρχει καθόλου ο delimiter, το µέγεθος που περνάτε στην strlen() δεν είναι το σωστό. Θέλουµε το µήκος της συµβολοσειράς και όχι το περιεχόµενο (χαρακτήρα) της τελευταίας θέσης. - Το πρόγραµµα τερµατίζει µε segmentation fault. - Δεν έχετε υλοποιήσει κάτι. - Λύστε την 2η άσκηση *οπωσδήποτε*. 1921 FAIL -Καλή στοίχιση -Θα µπορούσατε να είχατε καλύτερα σχόλια -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings. Επιπλέον, το %50s είναι λάθος γιατί δε λαµβάνει υπόψη το \0 -Το output του προγράµµατος ήθελε περισσότερη προσοχή. -Το πρόγραµµα έβγαζε warning κατα το compilation. Λόγω αυτού του warning έβγαζε segmentation fault. Σας ξέφυγε το & στην scanf (Εκεί που διαβάζετε τον ακέραιο) -Ακόµα και να υπήρχε η δίορθωση, το πρόγραµµα σας δεν εκτυπώνει κάτι σαν αποτέλεσµα.(δεν βάλατε printf.) - Τι σκοπό εξυπηρετή η µεταβλητή tab στο πρώτο for? Δε χρησιµοποιείται πουθενά εφόσον της δίνετε άλλη τιµή λίγο πριν το δεύτερο for. - Να χρησιµοποιείτε strlen για να υπολογίζετε µήκος. - Η for που διαβάζει τα αρχικά δεδοµένα εκτελείται µια φορά λιγότερη από ότι θα έπρεπε. - Κάνετε πάντα strcpy το tab, το οποίο είναι &table[0][0] οπότε το τελικό string θα γεµίσει µε πολλες εµφανίσεις της πρώτης µόνο λέξης. -Έβγαζε και αυτή warning στο compile, για διάφορα σηµαντικά λάθη (έλλειψη & σε scanf, άσκοπη χρήση *) -H στοίχιση είναι καλή. -Δεν έχετε καθόλου σχόλια Γενική συµβουλή: φαίνεται σα να προσπαθείτε να γράψετε όσο πιο πολύ κώδικα µπορείτε και µετά να ελέγχετε αν κάνει compile και είναι σωστός. Αυτό είναι λάθος τακτική. Πρέπει να γράφετε κάθε πρόγραµµα κοµµάτι-κοµµάτι, να βεβαιώνεστε ότι αυτό που γράψατε κάνει compile και λειτουργεί µέχρι στιγµής, και µετά να συνεχίζετε. Page 8
1922???? -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: πολύ καλή - Μπορείτε να χρησιµοποιείτε ακόµη καλύτερα ονόµατα µεταβλητών. Για παράδειγµα το όνοµα array_2d είναι πολύ γενικό και δεν υποδηλώνει τη χρήση του. Σωστή χρήση σταθερών. - Σωστή χρήση της sprintf() -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Σωστός υπολογισµός του µεγέθους του string, ο εντοπισµός και η αντιγραφή του. - Σωστά εντοπίζετε την τελευταία λέξη µε ειδική µεταχείριση. - Πολύ καλή δουλειά -Λύστε οπωσδήποτε την άσκηση Διαδικαστικά: - Να προσέχετε περισσότερο το tar που κάνετε. Δεν είχατε φάκελο. Κάνατε.tgz το lab9a.c µόνο. 1925 FAIL -Καλή στοίχιση -Έβγαζε αρκετά warning κατα το compile. -ΔΕΝ έχετε καθόλου σχόλια -Κάνετε scanf string και δεν ορίζετε τους χαρακτήρες που θα κάνετε scanf (π.χ. %49s).Αυτό είναι λανθασµένη πρακτική -Το output του προγράµµατος ήθελε περισσότερη προσοχή.(\n) -To πρόγραµµα σας έβγαζε segmentation fault. -Όταν κάνετε strncpy πρεπει να βάζετε έσεις το '\0' στο τέλος του string. Επίσης, να αρχικοποιείτε πάντα τους pointers. Για παράδειγµα, κάνετε strncpy χρησιµοποιώντας το ptr, το οποίο δεν έχει κάποια αρχική τιµή, (µάλλον γι αυτο σας έβγαζε segmentation fault) Page 9
Διαδικαστικά: οκ 1926 PASS -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός του ptr -Έπρεπε να κάνετε define και τις γραµµές του πίνακα ROW 10. -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. Θα µπορούσατε να κάνετε το ίδιο και για το glue -Στον έλεγχο για πόσα string θα δώσετε έπρεπε να ελέγχετε να µην ξεπεράσει το 10 αφού ο διδιάστατος πίνακας είναι 10 γραµµών. Με αποτέλεσµα να βγαίνετε εκτός ορίων του πίνακα. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστή µορφοποίηση εξόδου 1927 FAIL Δεν ελήφθη άσκηση -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός των ptr1 και ptr2 -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστά βάζετε \0 στο τέλος γιατί η strncpy δεν το κάνει -Σωστή µορφοποίηση εξόδου Διαδικαστικά OK. - Σωστή στοίχιση. - Τα περισσότερα σχόλια δεν προσφέρουν κάποια έξτρα πληροφορία πέραν του προφανούς. - Σωστή δηµιουργία των format strings µε χρήση της sprintf(). - Σωστή χρήση strncpy() και υπολογισµός µεγέθους. 1928 PASS - Καθόλου σχόλια! - Για τη λειτουργία "copy": το όριο της επανάληψης στην περίπτωση συµβολοσειρών ίσου µεγέθους αρκεί να είναι strlen1 (ή strlen2). για strlen1>strlen2, η µεταβλητή pos δεν αλλάζει τιµή µέσα στην επανάληψη, οδηγώντας σε ατέρµων βρόχο, και η συνθήκη στο σώµα του βρόχου είναι πάντα αληθής (pos<string_length). - Η εκφώνηση απαγορεύει ρητά τη χρήση πινάκων οπουδήποτε αλλού πέραν της αρχικοποίησησς τους. Λύστε την άσκηση αποκλειστικά µε χρήση δεικτών. Page 10
1929 FAIL -Σχόλια: Εντάξει -Στοίχιση: Καµία. -Λάθος ονόµατα µεταβλητών αλλά σωστή χρήση σταθερών. -Λάθος χρήση και κλήση sprintf() για τον ορισµό µεγέθους εισόδου. Αρχικά ο κώδικας δεν κάνει αυτό που νοµίζετε, επίσης ακόµα κι αν κάνατε σωστή κλήση οι πίνακές σας είναι κατά 1 χαρακτήρα µικρότεροι από ότι έπρεπε να είναι. Αυτό το λάθος σας το δείχνει και ο compiler µε τη µορφή warnings. ΚΟΙΤΑΜΕ την έξοδο του compiler, το γεγονός πως το πρόγραµµα έκανε compile χωρίς errors αλλά µε 10 warnings δεν σηµαίνει πως είναι εντάξει. -Λάθος χρήση δεικτών. -Δοκιµάσετε να κάνετε την άσκηση *οπωσδήποτε*. -Σωστή µορφοποίηση εξόδου. -H άσκηση ζητούσε την χρήση δεικτών. -Λύστε την 2η άσκηση *οπωσδήποτε*. 1931???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Μερικώς σωστά ονόµατα µεταβλητών αλλά σωστή χρήση σταθερών. Τα i/k πλέον δεν είναι απλοί iterators. Βρείτε περιγραφικό όνοµα για κάποια/και τις δύο µεταβλητές. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Θα µπορούσατε να µετράτε πόσες εκφράσεις εξαγάγατε και µετά στην εκτύπωση να είχατε έναν 2ο iterator, δεν ήταν ανάγκη να αυξάνετε και το i και το k. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Σχόλια: Εντάξει -Στοίχιση: Εντάξει, αλλά έχετε λάθος στο return της main() και να χρησιµοποιείτε είτε tabs είτε spaces για την στοίχιση όχι και τα 2. Φροντίστε να µην γίνει ξανά τέτοια παράλειψη. -Το ζητούµενο της άσκησης ήταν να συνθέσετε τους πίνακες και όχι να εκτυπώσετε µηνύµατα που να προσοµοιώνουν την σύνθεση κάνοντας χρήση δεικτών. -Λύστε την 2η άσκηση *οπωσδήποτε* µε τις παραπάνω αλλαγές. Page 11
1932 PASS - Καλή δουλειά! - Καλή στοίχιση. - Σωστά κάνατε τον προσδιορισµό µήκους στο format string της scanf για κάθε string µε sprintf µε βάση τα #defined µεγέθη. - Δεν υπάρχουν σχόλια. - Σωστή αριθµητική δεικτών, αλλά δεν κάνατε copy το τελευταίο substring. Θα µπορούσατε να το κάνετε µε σκέτο strcpy, δείτε την λύση. - Πολύ καλή δουλειά! - Σωστή στοίχιση αλλά δεν έχετε σχόλια. - Σωστή υλοποίηση της my_strlen(). - Σωστή υλοποιήση της catenate και copy. 1934 FAIL - Καθόλου σχόλια! - Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά. - Η αναζήτηση του delimiter µέσα στην εντολή for δεν ξεκινάει από το start_str. - Δεν υπολογίζετε σωστά την νέα τιµή του length πριν την χρησιµοποιήσετε στην strncpy(). - Επίσης δεν κάνετε έλεγχο της τιµής που επιστρέφει η strstr(). Εάν ο delimiter δεν βρέθηκε, η επιστρεφόµενη τιµή είναι NULL και οποιαδήποτε απόπειρα εγγραφής/ανάγνωσης από αυτήν την διεύθυνση προκαλεί segmentation fault και τερµατισµό του προγράµµατος. - Δεν είναι σωστή η δεύτερη παράµετρος της strncpy. Έπρεπε να είναι start_str κι όχι str - Η εκτύπωση του τελικού πίνακα έπρεπε να γίνεται αφού αυτός γεµίσει. - Προσπαθήστε να λύσετε σωστά την άσκηση. - Δεν κάνει compile. - Λύστε την 2η άσκηση κάνοντας χρήση δεικτών *οπωσδήποτε*. 1935 FAIL Εστάλη η άσκηση του lab8 1936???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Στην εκτύπωση των αποτελεσµάτων ελέγχετε αν η επόµενη γραµµή ξεκινά µε '\0' αυτό µπορεί να οδηγήσει σε σφάλµα µνήµης και είναι λάθος. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Λύστε την 2η άσκηση κάνοντας χρήση δεικτών *οπωσδήποτε*. Page 12
1942 FAIL -Σχόλια: Εντάξει -Στοίχιση: Εντάξει - Τα περισσότερα ονόµατα που χρησιµοποιήτε είναι τελείως λάθος καθώς δεν υποδηλώνουν τη χρήση της κάθε µεταβλητής. Αποφεύγουµε να αριθµούµε τις µεταβλητές µας και να βάζουµε γενικά ονόµατα όπως str και array. Διαβάστε πάλι τον οδηγό µε τις οδηγίες για τη σωστή χρήση ονοµάτων µεταβλητών. - Δεν έχετε χρησιµοποιήσει την sprintf για να διαβάζετε την είσοδο ακόµη και αν ο πίνακας σας δηλώνεται διαφορετικά κάθε φορά. Δείτε στις διαφάνειες πως χρησιµοποιείται η sprintf και να κάνετε κάποια παραδείγµατα για να σιγουρευτείτε οτι καταλαβαίνετε πως λειτουργεί. - Το πρόγραµµα σας βγάζει κάποιες προειδοποιήσεις τις οποιες δεν έχετε λύσει και έτσι υπάρχουν κάποια προβλήµατα που το κάνουν να µην είναι σε θέση να τρέξει σωστά. Διορθώνουµε πάντα όλα τα warnings και αν δεν καταλαβαίνουµε τι εννοούν τότε ρωτάµε τους βοηθούς. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. - Λάθος πράξεις. Χρησιµοποιείτε τη µεταβλητή flag (ποιος είναι ο λόγος που χρησιµοποιήσατε αυτό το όνοµα; ) η οποία στην αρχή δεν έχει αρχικοποιηθεί. - Στη γραµµή 30 έχετε κάνει λάθος ανάθεση την οποία σας τονίζει και ο compiler. Βάζετε σε περιεχόµενο ενός δείκτη το δείκτη ενός άλλου πίνακα. -Στην εκτύπωση της εξόδου γιατί δεν χρησιµοποιείτε %s και το εκτυπώνετε χαρακτήρα χαρακτήρα; - Λύστε οπωσδήποτε την άσκηση Διαδικαστικά ΟΚ Άσκηση 1η 1946???? - Η στοίχιση σας είναι σωστή. - Τα σχόλια σας είναι ιδιαίτερα εκτενή. Θέλουµε λίγα και περιεκτικά και όχι σχόλιο σε κάθε γραµµή. Η περιγραφή του προγράµµατος στην αρχή αρκεί εάν ο κώδικας είναι ευανάγνωστος. Εάν υπάρχουν δυσνόητα σηµεία στον κώδικα βάζουµε και εκεί µία επεξήγηση. - To πρόγραµµα σας είναι σωστό! Άσκηση 2η - H επιστρεφόµενη τιµή της my_strlen() δεν είναι σωστή. Επιστρέφει το σωστό µήκος -1. Page 13
1947 οριακό PASS lab9grades Διαδικαστικά: 6 λεπτά εκπρόθεσµη - σχόλια: σχεδόν τίποτα. Αυτά πλέον είναι πολύ σηµαντικά λάθη - στοίχιση: OK - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: θα έπρεπε να είναι STRLEN αντί για SIZE! Επίσης, θα έπρεπε να χρησιµοποείτε format string και για το glue - αριθµητική δεικτών: OK - γενικά: Αρκετά καλά! - σχόλια: OK - στοίχιση: Πολύ κακή, τα άγκιστρα φαίνεται να είναι τυχαία τοποθετηµένα (ή ξεχάσατε κανένα;) - σταθερές: OK - ονόµατα µεταβλητών: Άσχηµα ονόµατα, δοκιµάστε να είναι πιο περιγραφικά - format string: δεν έγινε - αριθµητική δεικτών: δεν βγάζω νόηµα από αυτό που πάτε να κάνετε, ίσως αν άλλαζε τιµή ο ptr µέσα στο loop να γινόταν κάτι. - γενικά: Δοκιµάστε να την κάνετε σπίτι. Διαδικαστικά: 5 λεπτά εκπρόθεσµη 1949 PASS - σχόλια: ΟΚ - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: ΟΚ - αριθµητική δεικτών: ΟΚ - γενικά: Πολύ καλά τα βλέπω τα πράγµατα! - σχόλια: Κανένα σχόλιο - στοίχιση: OK - σταθερές: OK - ονόµατα µεταβλητών: OK - format string: OK - αριθµητική δεικτών: Κάπου πρέπει να έχετε κάνει λάθος στις προσθαφαιρέσεις µε το 1 - γενικά: αρκετά καλή αλλά δοκιµάστε να την ξαναδείτε. Page 14
1950???? -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: πολύ καλή -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Λάθος χρήση sprintf() για τον ορισµό µεγέθους εισόδου, καθώς δεν δεσµεύετε χώρο για το \0 που θα χρειαστεί να βάλει η scanf. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Για να βρείτε το µέγεθος της κάθε έκφρασης πρέπει να κάνετε τέλος-αρχή, εσείς κάνατε το αντίθετο. Κάτι τέτοια λάθη τα βρίσκουµε µε debugger. - Γίνεται αρχικοποίηση της µεταβλητής pos_to_print (απο το όνοµά της δεν µπορεί να καταλάβει κάποιος τι θέλετε να κάνετε µε αυτή) µε λάθος τιµή. Της δίνετε την πρώτη γραµµή του split πίνακα ενώ θα έπρεπε να ήταν η αρχή του input_str. Για αυτό τον λόγο και τον παραπάνω το πρόγραµµά σας σκάει. Επίσης δεν έχετε λάβει υπ'οψιν σας τη τελευταία λέξη του input_str. -Λύστε *οπωσδήποτε* την άσκηση. -Στη δεύτερη άσκηση έπρεπε να χρησιµοποιήσετε pointers και όχι πίνακες για τη λύση σας. Επίσης, το format µπορεί να είναι και εκτός της while. - Λύστε την άσκηση χρησιµοποιώντας µόνο pointers για να εξοικειωθείτε. 1955 FAIL -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: Έχετε προβλήµατα στη στοίχιση σας. Δεν είναι αποδεκτό να µην υπάρχει σωστή στοίχιση σε αυτό το σηµείο που βρίσκεστε στον προγραµµατισµό - Τα ονόµατα των µεταβλητών σας δεν είναι και τα καλύτερα. Επίσης όταν ενώνετε 2 λέξεις για να δηµιουργήσετε ένα καινούριο όνοµα καλό είναι είτε να βάζετε _ είτε η δεύτερη λέξη να ξεκινάει µε κεφαλαίο γράµµα. Σωστή χρήση σταθερών. Επίσης να αποφεύγετε να αριθµήτε τις µεταβλητές σας. -Δεν έχετε καταλάβει καθόλου πως λειτουργεί η συνάρτηση strstr µε αποτέλεσµα να τη χρησιµοποιήτε εντελώς λάθος και το πρόγραµµά σας να µη λειτουργεί. Η strstr επιστρέφει pointer στο πρώτο σηµείο που βρίσκει τη γραµµατοσειρά delimeter και ΟΧΙ κάποιον αριθµό. Επίσης, δε χρησιµοποιούµε ΠΟΤΕ το όνοµα της συνάρτησης σα να είναι ισοδύναµο µε την τιµή που επέστρεψε όπως κάνετε στη γραµµή 36 - Διαβάστε τη χρήση της strstr, δείτε κάποια παραδείγµατα και προσπαθήστε να εξοικειωθείτε µε τους pointers. -Να λύσετε την άσκηση µε τη χρήση µόνο pointers. Page 15
1956 FAIL -Καλή στοίχιση -Θα µπορούσατε να είχατε καλύτερα σχόλια -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings. Επιπλέον, το %50s είναι λάθος γιατί δε λαµβάνει υπόψη το \0 -Το output του προγράµµατος ήθελε περισσότερη προσοχή. -Το πρόγραµµα έβγαζε warning κατα το compilation. Λόγω αυτού του warning έβγαζε segmentation fault. Σας ξέφυγε το & στην scanf (Εκεί που διαβάζετε τον ακέραιο) -Ακόµα και να υπήρχε η δίορθωση, το πρόγραµµα σας δεν εκτυπώνει κάτι σαν αποτέλεσµα.(δεν βάλατε printf.) - Τι σκοπό εξυπηρετή η µεταβλητή tab στο πρώτο for? Δε χρησιµοποιείται πουθενά εφόσον της δίνετε άλλη τιµή λίγο πριν το δεύτερο for. - Να χρησιµοποιείτε strlen για να υπολογίζετε µήκος. - Η for που διαβάζει τα αρχικά δεδοµένα εκτελείται µια φορά λιγότερη από ότι θα έπρεπε. - Κάνετε πάντα strcpy το tab, το οποίο είναι &table[0][0] οπότε το τελικό string θα γεµίσει µε πολλες εµφανίσεις της πρώτης µόνο λέξης. -Έβγαζε και αυτή warning στο compile, για διάφορα σηµαντικά λάθη (έλλειψη & σε scanf, άσκοπη χρήση *) -H στοίχιση είναι καλή. -Δεν έχετε καθόλου σχόλια Γενική συµβουλή: φαίνεται σα να προσπαθείτε να γράψετε όσο πιο πολύ κώδικα µπορείτε και µετά να ελέγχετε αν κάνει compile και είναι σωστός. Αυτό είναι λάθος τακτική. Πρέπει να γράφετε κάθε πρόγραµµα κοµµάτι-κοµµάτι, να βεβαιώνεστε ότι αυτό που γράψατε κάνει compile και λειτουργεί µέχρι στιγµής, και µετά να συνεχίζετε. 1957 FAIL -Δεν έγινε καµία άσκηση. 1959 PASS - Καλή στοίχιση - Δεν υπάρχουν σχόλια - Εκτός από τα ptr1, ptr έχετε καλά ονόµατα µεταβλητών. Τα ptr1, ptr θα µπορούσαν να λέγονται first_occur, sec_occur ή first, second - Σωστά σκεφτήκατε να ελέγξετε το str_num αλλά θα έπρεπε να βεβαιώνεστε και ότι είναι >0 ή έστω >=0 - Σωστή αριθµητική δεικτών, αλλά το glue string δε θα έπρεπε να εκτυπώνεται στο τέλος. Μπορούσατε να το αποφύγετε µε ένα απλό έλεγχο και πρόωρο break από το loop. - Δεν εκτυπώνετε το τελικό µήνυµα ακριβώς όπως ζητήθηκε. - Σωστά υπολογίζετε το min. Προσπαθήστε να τελειώσετε την άσκηση στο σπίτι. Page 16
Διαδικαστικά: οκ 1960 PASS -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός από το ptr και σωστή χρήση σταθερών. Στο CUT_LEN µπορούσατε να βάλετε κατευθείαν 500 αφού σας το λέει η εκφώνηση -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Στο τελευταίο for αντί να έχετε i<input-1 για να µην αντιγράφετε στο τέλος το συνδετικό µπορούσατε να χρησιµοποιήσετε κάποιον έλεγχο. -Σωστή µορφοποίηση εξόδου -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός των ptr1 και ptr2 -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστά βάζετε \0 στο τέλος γιατί η strncpy δεν το κάνει -Σωστή µορφοποίηση εξόδου 1962???? - Προσέξτε λίγο την στοίχισή σας, έχετε κάποια παραπάνω κενά και enters. - Σωστά κάνατε τον προσδιορισµό µήκους στο format string της scanf για κάθε string µε sprintf µε βάση τα #defined µεγέθη. - Λίγο πιο επεξηγηµατικά σχόλια. - Σχεδόν σωστή αριθµητική δεικτών, έχετε bug γιατί η συνθήκη στο while (end_str==null) σπάει αµέσως (το end_str είναι µόνο µία φορα NULL, στο τέλος. - Δεν εστάλη. Page 17
1964???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Μερικώς σωστά ονόµατα µεταβλητών αλλά σωστή χρήση σταθερών. Τα i/k πλέον δεν είναι απλοί iterators. Βρείτε περιγραφικό όνοµα για κάποια/και τις δύο µεταβλητές. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Θα µπορούσατε να µετράτε πόσες εκφράσεις εξαγάγατε και µετά στην εκτύπωση να είχατε έναν 2ο iterator, δεν ήταν ανάγκη να αυξάνετε και το i και το k. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Σχόλια: Εντάξει -Στοίχιση: Εντάξει, αλλά έχετε λάθος στο return της main() και να χρησιµοποιείτε είτε tabs είτε spaces για την στοίχιση όχι και τα 2. Φροντίστε να µην γίνει ξανά τέτοια παράλειψη. -Το ζητούµενο της άσκησης ήταν να συνθέσετε τους πίνακες και όχι να εκτυπώσετε µηνύµατα που να προσοµοιώνουν την σύνθεση κάνοντας χρήση δεικτών. -Λύστε την 2η άσκηση *οπωσδήποτε* µε τις παραπάνω αλλαγές. Διαδικαστικά: 5 λεπτά εκπρόθεσµη 1965 PASS - σχόλια: ΟΚ - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: ΟΚ - αριθµητική δεικτών: ΟΚ - γενικά: Πολύ καλά τα βλέπω τα πράγµατα! - σχόλια: Κανένα σχόλιο - στοίχιση: OK - σταθερές: OK - ονόµατα µεταβλητών: OK - format string: OK - αριθµητική δεικτών: Κάπου πρέπει να έχετε κάνει λάθος στις προσθαφαιρέσεις µε το 1 - γενικά: αρκετά καλή αλλά δοκιµάστε να την ξαναδείτε. Page 18
1968 FAIL -Σχόλια: Καθόλου σχόλια -Στοίχιση: Καλή αν και χάνει σε κάποια σηµεία - Μπορείτε να χρησιµοποιείτε ακόµη καλύτερα ονόµατα µεταβλητών. Για παράδειγµα το όνοµα pinakas είναι πολύ γενικό και δεν υποδηλώνει τη χρήση του. Σωστή χρήση σταθερών. - Δεν έχετε χρησιµοποιήσει sprintf(). Δείτε τα παραδείγµατα στις διαφάνειες και κάντε κάποιο παράδειγµα για να καταλάβετε πως δουλεύει. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. - Πήρατε την πρωτοβουλία να δηµιουργήσετε µια συνάρτηση η οποία δεν κάνει αυτό που χρειαζόµαστε και έχει πολλά λάθη. Γενικά όλες οι πράξεις µπορούν να γίνουν µε συναρτήσεις που µας παρέχει η βιβλιοθήκη string.h και δεν χρειάζονταν να δηµιουργήσετε εσείς. Η συνάρτηση σας επιστρέφει έναν χαρακτήρα ενώ απο ότι κατάλαβα έπρεπε να επιστρέφει string. Έχετε υπόψη όµως ότι είναι παράνοµο στη C να επιστρέφετε πίνακα από συνάρτηση ή να βάζετε ολόκληρο πίνακα στο αριστερό µέρος µιας ανάθεσης. -Λύστε την παραπάνω άσκηση χρησιµοποιώντας τις συναρτήσεις strlen και strstr. -Λύστε οπωσδήποτε την άσκηση Διαδικαστικά: 5 λεπτά εκπρόθεσµη 1973 PASS - σχόλια: Ίσως θα ήταν καλύτερο να βάζατε κανένα σχόλιο στην αρχή που να εξηγεί τι κάνει το πρόγραµµά σας - στοίχιση: ΟΚ - σταθερές: CATENATED_LEN πρέπει να είναι 500! - ονόµατα µεταβλητών: ΟΚ - format string: ΟΚ - αριθµητική δεικτών: ΟΚ - γενικά: Αρκετά καλά! - σχόλια: πολύ λίγα - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ίσως θα έπρεπε να είναι λίγο πιο περιγραφικά - format string: ΟΚ - αριθµητική δεικτών: ΟΚ γενικά αλλά σας ξεφεύγει κάτι, πχ δείτε το 3ο παράδειγµα. Μπορείτε να καταλάβετε γιατί δε δουλεύει; - γενικά: σκεφτείτε πως να βγαίνετε από το do χωρίς break. Είναι αρκετά άσχηµο έτσι όπως το έχετε. Κατά τα άλλα νοµίζω καλά τα πήγατε! Page 19
1975???? - Προσέξτε την στοίχισή σας, έχετε πολλά άσκοπα κενά και enters. - Σωστά κάνατε τον προσδιορισµό µήκους στο format string της scanf για κάθε string µε sprintf µε βάση τα #defined µεγέθη. - Δεν υπάρχουν σχόλια. - Σχεδόν σωστή αριθµητική δεικτών, έχετε bug γιατί δεν αρχικοποιήσατε τον start_str pointer και σκάει το πρόγραµµά σας. Τους δείκτες *πάντα* πρέπει να τους αρχικοποιούµε. Επίσης, στο if µετά τη while έπρεπε να είχατε split[i] και όχι split[i+1] γιατί το i έχει ήδη αυξηθεί - Το x είναι περιττό. Αρκούσε i+1 στη θέση του. - Δεν εστάλη. 1980 οριακό PASS Διαδικαστικά: 6 λεπτά εκπρόθεσµη - σχόλια: σχεδόν τίποτα. Αυτά πλέον είναι πολύ σηµαντικά λάθη - στοίχιση: OK - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: θα έπρεπε να είναι STRLEN αντί για SIZE! Επίσης, θα έπρεπε να χρησιµοποείτε format string και για το glue - αριθµητική δεικτών: OK - γενικά: Αρκετά καλά! - σχόλια: OK - στοίχιση: Πολύ κακή, τα άγκιστρα φαίνεται να είναι τυχαία τοποθετηµένα (ή ξεχάσατε κανένα;) - σταθερές: OK - ονόµατα µεταβλητών: Άσχηµα ονόµατα, δοκιµάστε να είναι πιο περιγραφικά - format string: δεν έγινε - αριθµητική δεικτών: δεν βγάζω νόηµα από αυτό που πάτε να κάνετε, ίσως αν άλλαζε τιµή ο ptr µέσα στο loop να γινόταν κάτι. - γενικά: Δοκιµάστε να την κάνετε σπίτι. Page 20
Διαδικαστικά: οκ 1983 PASS -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός του ptr -Έπρεπε να κάνετε define και τις γραµµές του πίνακα ROW 10. -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. Θα µπορούσατε να κάνετε το ίδιο και για το glue -Στον έλεγχο για πόσα string θα δώσετε έπρεπε να ελέγχετε να µην ξεπεράσει το 10 αφού ο διδιάστατος πίνακας είναι 10 γραµµών. Με αποτέλεσµα να βγαίνετε εκτός ορίων του πίνακα. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστή µορφοποίηση εξόδου -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός των ptr1 και ptr2 -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστά βάζετε \0 στο τέλος γιατί η strncpy δεν το κάνει -Σωστή µορφοποίηση εξόδου 1984???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Στην εκτύπωση των αποτελεσµάτων ελέγχετε αν η επόµενη γραµµή ξεκινά µε '\0' αυτό µπορεί να οδηγήσει σε σφάλµα µνήµης και είναι λάθος. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Λύστε την 2η άσκηση κάνοντας χρήση δεικτών *οπωσδήποτε*. Page 21
Διαδικαστικά ΟΚ Άσκηση 1η 1985???? - Η στοίχιση σας είναι σωστή. - Τα σχόλια σας είναι ιδιαίτερα εκτενή. Θέλουµε λίγα και περιεκτικά και όχι σχόλιο σε κάθε γραµµή. Η περιγραφή του προγράµµατος στην αρχή αρκεί εάν ο κώδικας είναι ευανάγνωστος. Εάν υπάρχουν δυσνόητα σηµεία στον κώδικα βάζουµε και εκεί µία επεξήγηση. - To πρόγραµµα σας είναι σωστό! Άσκηση 2η - H επιστρεφόµενη τιµή της my_strlen() δεν είναι σωστή. Επιστρέφει το σωστό µήκος -1. 1986???? -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: πολύ καλή -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Λάθος χρήση sprintf() για τον ορισµό µεγέθους εισόδου, καθώς δεν δεσµεύετε χώρο για το \0 που θα χρειαστεί να βάλει η scanf. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Για να βρείτε το µέγεθος της κάθε έκφρασης πρέπει να κάνετε τέλος-αρχή, εσείς κάνατε το αντίθετο. Κάτι τέτοια λάθη τα βρίσκουµε µε debugger. - Γίνεται αρχικοποίηση της µεταβλητής pos_to_print (απο το όνοµά της δεν µπορεί να καταλάβει κάποιος τι θέλετε να κάνετε µε αυτή) µε λάθος τιµή. Της δίνετε την πρώτη γραµµή του split πίνακα ενώ θα έπρεπε να ήταν η αρχή του input_str. Για αυτό τον λόγο και τον παραπάνω το πρόγραµµά σας σκάει. Επίσης δεν έχετε λάβει υπ'οψιν σας τη τελευταία λέξη του input_str. -Λύστε *οπωσδήποτε* την άσκηση. -Στη δεύτερη άσκηση έπρεπε να χρησιµοποιήσετε pointers και όχι πίνακες για τη λύση σας. Επίσης, το format µπορεί να είναι και εκτός της while. - Λύστε την άσκηση χρησιµοποιώντας µόνο pointers για να εξοικειωθείτε. Page 22
1988 οριακό PASS lab9grades Διαδικαστικά: 7 λεπτά εκπρόθεσµη - σχόλια: Κανένα σχόλιο - στοίχιση: το τελευταίο IF είναι άσχηµα στοιχισµένο µε τον κώδικά του - σταθερές: Δεν ορίστηκε το SIZE ως σταθερά - ονόµατα µεταβλητών: σχετικά κακά ονόµατα, πχ k, ptr, δοκιµάστε να είστε πιο περιγραφικοί - format string: ΟΚ. - δοκιµάστε να κάνετε την τελευταία for χωρίς το if που έχει µέσα, δεν είναι δύσκολο... - αριθµητική δεικτών: ΟΚ - γενικά: Αρκετά καλά παιδιά, λίγα µικρά λάθη, αλλά πρέπει οπωσδήποτε να µάθετε να βάζετε σχόλια - σχόλια: Εξαιρετικά ακριβή - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: δεν έγινε χρήση - αριθµητική δεικτών: Δεν καταλαβαίνω τι κάνετε. Το πρώτο for απλά βρίσκει πόσες φορές υπάρχει ο character. Το δεύτερο κάνει τόσες φορές το ίδιο strchr. - γενικά: Πολλά compiler warnings, πρέπει να µάθετε να τα διαβάζετε. Αν θέλετε να τυπώσετε pointer, δοκιµάστε το %p. Στην συγκεκριµένη άσκηση δε χρειαζόταν κάτι τέτοιο. Διαδικαστικά ΟΚ Άσκηση 1η 1992???? - Σχόλια πολύ καλά. Περιγράφετε τι κάνει το πρόγραµα µαζί µε την είσοδο έξοδο, χωρίς περιττές επεξηγήσεις που κουράζουν. - Η στοίχιση φαίνεται σωστή, αλλά δεν είναι. Στην γραµµή 19 ορίζετε σχεδόν όλες τις µεταβλητές τύπου char, char* σε µία γραµµή. Για να µην βγείτε εκτός ορίων αλλάζετε γραµµή και συµπληρώνετε την στοίχιση µε space. Αυτό είναι µια κακή πρακτική καθώς η στοίχιση σας θα εµφανίζεται διαφορετικά, εάν ανοίξετε το πρόγραµµα µε διαφορετικές ρυθµίσεις στον editor. Αντί για space χρησιµοποιείτε πάντοτε tab! - Σωστή αρχικοποίηση διδιάστατου πίνακα µε '\0'. - Σωστή χρήση sprintf(). - Τις γραµµές 37-41 θα µπορούσατε να τις αντικαταστήσετε µε την συνάρτηση strlen(). - Η υλοποίηση σας δουλεύει σωστά, µε εξαίρεση το τελευταίο string που το αγνοείτε. Προσπαθήστε να το διορθώσετε στο σπίτι. - Προσπαθήστε να υλοποιήσετε την ίδια άσκηση χωρίς να αρχικοποιήσετε τον διδιάστατο πίνακα. Άσκηση 2η - Η άσκηση σας δεν κάνει compile. - Έχετε υλοποιήσει εντελώς λάθος στη my_strlen(), ενώ έχετε υλοποιήσει σωστά την λειτουργία της στην 1η άσκηση (γραµµές 37-41). Page 23
Διαδικαστικά OK. 1994???? - Καθόλου σχόλια! - Σωστή χρήση sprintf για την κατασκευή format string - Δεν ελέχετε το αποτέλεσµα που επιστρέφει η strstr() πριν την while(). Εάν ο delimiter δεν υπάρχει µέσα στην αρχική συµβολοσειρά, το πρόγραµµα τερµατίζει µε segmentation fault. - Η συνθήκη στο while() πρέπει να ξεκινάει τον έλεγχο από το στοιχείο που βρίσκεται στη θέση end_str + strlen(delimiter). - Η τελευταία γραµµή δεν εκτυπώνεται, η συνθήκη στο for πρέπει να είναι k<=i επειδή το i δεν είναι µετρητής αλλά δείκτης (θέλουµε να εκτυπώσουµε ΚΑΙ την θέση που δείχνει). - Για την περίπτωση της τελευταίας φράσης στο τέλος του str (όπου δεν υπάρχει delimiter µετά), δεν ανανεώνετε το start_str για να προσπεράσετε τον τελευταίο delimiter που βρέθηκε. - Δεν στάλθηκε. - Λύστε την 2η άσκηση *οπωσδήποτε*. 1996 PASS - Καλή στοίχιση - Δεν υπάρχουν σχόλια - Καλά ονόµατα µεταβλητών. Η κόλλα είναι glue όχι glou. - Καλό θα ήταν να ελέγχατε αν το string_num είναι µεταξύ 0 και ROWS - Σωστή χρήση αριθµητικής δεικτών. - Πολύ καλή δουλειά, µπράβο. 1999???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Μερικώς σωστά ονόµατα µεταβλητών αλλά σωστή χρήση σταθερών. Το όνοµα pin δεν υποδηλώνει τη χρήση του πίνακα και τον λόγο που τον χρησιµοποιείτε. - Δεν έχετε χρησιµοποιήσει την sprintf για να διαβάζετε την είσοδο ακόµη και αν ο πίνακας σας δηλώνεται διαφορετικά κάθε φορά. Δείτε στις διαφάνειες πως χρησιµοποιείται η sprintf και να κάνετε κάποια παραδείγµατα για να σιγουρευτείτε οτι καταλαβαίνετε πως λειτουργεί. Το σηµαντικότερο λάθος που κάνατε είναι οτι δεν βάλατε περιορισµό στον αριθµό των γραµµάτων που πρέπει να διαβάσει η scanf µε αποτέλεσµα να υπάρχει κίνδυνος να βγεί εκτός µνήµης. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. Δεν αναγνωρίζετε το τελευταίο string της λέξης που εισάγεται. Για να αναγνωρίσετε τη τελευταία λέξη χρειάζεται να το κάνετε εκτός του loop. Προσπαθήστε να ολοκληρώσετε τη λύση σας. - Τέλος δεν χρειάζεται να εκτυπώνετε όλες τις γραµµές του πίνακα αλλά µόνο αυτές που έχουν γεµίσει. Σκεφτείτε πως µπορεί να γίνει αυτό. -Σωστή µορφοποίηση εξόδου. - Λύστε οπωσδήποτε την άσκηση Page 24
2000 FAIL -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: Έχετε προβλήµατα στη στοίχιση σας. Δεν είναι αποδεκτό να µην υπάρχει σωστή στοίχιση σε αυτό το σηµείο που βρίσκεστε στον προγραµµατισµό - Τα ονόµατα των µεταβλητών σας δεν είναι και τα καλύτερα. Επίσης όταν ενώνετε 2 λέξεις για να δηµιουργήσετε ένα καινούριο όνοµα καλό είναι είτε να βάζετε _ είτε η δεύτερη λέξη να ξεκινάει µε κεφαλαίο γράµµα. Σωστή χρήση σταθερών. Επίσης να αποφεύγετε να αριθµήτε τις µεταβλητές σας. -Δεν έχετε καταλάβει καθόλου πως λειτουργεί η συνάρτηση strstr µε αποτέλεσµα να τη χρησιµοποιήτε εντελώς λάθος και το πρόγραµµά σας να µη λειτουργεί. Η strstr επιστρέφει pointer στο πρώτο σηµείο που βρίσκει τη γραµµατοσειρά delimeter και ΟΧΙ κάποιον αριθµό. Επίσης, δε χρησιµοποιούµε ΠΟΤΕ το όνοµα της συνάρτησης σα να είναι ισοδύναµο µε την τιµή που επέστρεψε όπως κάνετε στη γραµµή 36 - Διαβάστε τη χρήση της strstr, δείτε κάποια παραδείγµατα και προσπαθήστε να εξοικειωθείτε µε τους pointers. -Να λύσετε την άσκηση µε τη χρήση µόνο pointers. 2001 PASS - Καλή δουλειά, µπράβο. - Καλό θα ήταν να είχες κι έναν έλεγχο για το αν το number είναι µεταξύ 0 και str_rows - Τα ονόµατα των #defined τιµών πρέπει να γράφονται πάντα µε κεφαλαία. - Σωστά έφτιαξες format string για την ανάγνωση των λέξεων, αλλά έπρεπε να κάνεις το ίδιο και για το glue. Ειδικά το σκέτο %s που χρησιµοποίησες είναι πολύ επικίνδυνο. Πρέπει οπωσδήποτε να προσδιορίζεις και µέγεθος πριν το s. - Χρειάζεται αρκετή δουλειά ακόµη. Προσπάθησε να την ολοκληρώσεις στο σπίτι. hint: Οι δύο strchr που έχεις θα σου δώσουν ακριβώς το ίδιο αποτέλεσµα. Page 25
2004???? -Σχόλια: Αρκετά και σε σωστά σηµεία -Στοίχιση: πολύ καλή - Μπορείτε να χρησιµοποιείτε ακόµη καλύτερα ονόµατα µεταβλητών. Για παράδειγµα το όνοµα array_2d είναι πολύ γενικό και δεν υποδηλώνει τη χρήση του. Σωστή χρήση σταθερών. - Σωστή χρήση της sprintf() -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Σωστός υπολογισµός του µεγέθους του string, ο εντοπισµός και η αντιγραφή του. - Το µόνο σφάλµα της άσκησης είναι οτι δεν εντοπίζει την τελευταία λέξη. Η τελευταία λέξη χρειάζεται ειδική διαχείριση και δεν εντοπίζεται όπως οι προηγούµενες. Προσπαθείστε να διορθώσετε αυτή την έλειψη για να είναι ολοκληρωµένη η άσκηση. - Καλή δουλειά -Λύστε οπωσδήποτε την άσκηση Διαδικαστικά: οκ 2005 FAIL -Σχόλια: οκ - Μη χρησιµοποιείτε ποτέ σκέτο %s σε scanf. Πρέπει πάντα να προσδιορίζετε µέγεθος, και κατά προτίµηση να δηµιουργείτε το format string µε sprintf -Στοίχιση: οκ αλλά σας ξέφυγε σε κάποια σηµεία -Δεν ανανεώνετε σωστά το µήκος και γι αυτό δεν αντιγράφονται σωστά οι λέξεις στο str. Επίσης, η πρώτη strcpy στο loop αντιγράφει πάντα στην αρχή του str. -Δεν έγινε Διαδικαστικά OK. 2007???? - Καθόλου σχόλια! - Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά. - Ο έλεγχος για την τελευταία φράση κανονικά έπρεπε να µπει µετά την while και να ελέγχετε εάν υπάρχει διαθέσιµη γραµµή στον πίνακα split. Επίσης ο υπολογισµός του µεγέθους σε αυτή την περίπτωση δεν είναι σωστός. Υπολογίζετε την απόσταση µεταξύ της αρχής του str και του start_str αντί του start_str και του τέλους του str. - Δεν στάλθηκε. - Λύστε την 2η άσκηση *οπωσδήποτε*. Page 26
2010 PASS - Καλή δουλειά. - Καλή στοίχιση - Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό θα ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά - Δεν έχετε σχόλια. - Σωστή αριθµητική δεικτών. - Σωστή εκτύπωση αποτελέσµατος. - Πολύ καλή δουλειά! - Σωστή στοίχιση αλλά δεν έχετε σχόλια. - Σωστή υλοποίηση της my_strlen(). - Σωστή υλοποιήση της catenate και copy. Διαδικαστικά: οκ 2012 PASS -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός από το ptr και σωστή χρήση σταθερών. Στο CUT_LEN µπορούσατε να βάλετε κατευθείαν 500 αφού σας το λέει η εκφώνηση -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Στο τελευταίο for αντί να έχετε i<input-1 για να µην αντιγράφετε στο τέλος το συνδετικό µπορούσατε να χρησιµοποιήσετε κάποιον έλεγχο. -Σωστή µορφοποίηση εξόδου -Σχόλια: οκ -Στοίχιση: οκ -Σωστά ονόµατα µεταβλητών εκτός των ptr1 και ptr2 -Σωστά κατασκευάζετε το format string µε sprintf µε βάση τα #defined µεγέθη. -Σωστή χρήση pointers και αριθµητική µε pointers -Σωστά βάζετε \0 στο τέλος γιατί η strncpy δεν το κάνει -Σωστή µορφοποίηση εξόδου Page 27
2013???? -Σχόλια: Εντάξει -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Σωστή χρήση sprintf() για τον ορισµό µεγέθους εισόδου και γενικά σωστή είσοδος. -Στην εκτύπωση των αποτελεσµάτων ελέγχετε αν η επόµενη γραµµή ξεκινά µε '\0' αυτό µπορεί να οδηγήσει σε σφάλµα µνήµης και είναι λάθος. -Δοκιµάσετε να κάνετε την άσκηση µε τις παραπάνω αλλαγές. -Σωστές πράξεις. -Σωστή µορφοποίηση εξόδου. -Καλή δουλειά. -Λύστε την 2η άσκηση κάνοντας χρήση δεικτών *οπωσδήποτε*. 2017 PASS -Καλή στοίχιση -Καλά σχόλια -Καλά ονόµατα µεταβλητών. -Σωστό αποτέλεσµα του προγράµµατος. -Σωστή χρήση δεικτών. -Έπρεπε να χρησιµοποιήσετε την sprintf για το formatting των strings. -Έβγαζε ένα warning στο compile. Διοτι είχατε δηλωµένη µια µεταβλητή που δεν την χρησιµοποιήσατε. -Καλή στοίχιση -ΔΕΝ έχετε σχόλια -Καλά ονόµατα µεταβλητών -Σωστό αποτέλεσµα του προγράµµατος για όλες τις περιπτώσεις. -Πάρα πολυ καλή δουλειά. Page 28
Διαδικαστικά: 5 λεπτά εκπρόθεσµη 2020 PASS - σχόλια: Ίσως θα ήταν καλύτερο να βάζατε κανένα σχόλιο στην αρχή που να εξηγεί τι κάνει το πρόγραµµά σας - στοίχιση: ΟΚ - σταθερές: CATENATED_LEN πρέπει να είναι 500! - ονόµατα µεταβλητών: ΟΚ - format string: ΟΚ - αριθµητική δεικτών: ΟΚ - γενικά: Αρκετά καλά! - σχόλια: πολύ λίγα - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ίσως θα έπρεπε να είναι λίγο πιο περιγραφικά - format string: ΟΚ - αριθµητική δεικτών: ΟΚ γενικά αλλά σας ξεφεύγει κάτι, πχ δείτε το 3ο παράδειγµα. Μπορείτε να καταλάβετε γιατί δε δουλεύει; - γενικά: σκεφτείτε πως να βγαίνετε από το do χωρίς break. Είναι αρκετά άσχηµο έτσι όπως το έχετε. Κατά τα άλλα νοµίζω καλά τα πήγατε! 2022 FAIL -Σχόλια: Κανένα -Στοίχιση: Εντάξει -Σωστά ονόµατα µεταβλητών και σωστή χρήση σταθερών. -Λάθος χρήση sprintf() για τον ορισµό µεγέθους εισόδου, οι πίνακές σας είναι κατά ένα χαρακτήρα µικρότεροι από ότι χρειάζεται. -Δοκιµάσετε να κάνετε την άσκηση µε την παραπάνω αλλαγή. -Για να βρείτε το µέγεθος της κάθε έκφρασης πρέπει να κάνετε τέλος-αρχή, εσείς κάνατε το αντίθετο. Κάτι τέτοια λάθη τα βρίσκουµε µε debugger. Γενικά οι υπολογισµοί σας είναι µπερδεµένοι. Δοκιµάστε να σχεδιάσετε τους πίνακες και pointers στο χαρτί για να καταλάβετε καλύτερα τι γίνεται. -Λύστε *οπωσδήποτε* την άσκηση. -Λύστε την 2η άσκηση *οπωσδήποτε*. Page 29
2024 οριακό PASS lab9grades Διαδικαστικά: 7 λεπτά εκπρόθεσµη - σχόλια: Κανένα σχόλιο - στοίχιση: το τελευταίο IF είναι άσχηµα στοιχισµένο µε τον κώδικά του - σταθερές: Δεν ορίστηκε το SIZE ως σταθερά - ονόµατα µεταβλητών: σχετικά κακά ονόµατα, πχ k, ptr, δοκιµάστε να είστε πιο περιγραφικοί - format string: ΟΚ. - δοκιµάστε να κάνετε την τελευταία for χωρίς το if που έχει µέσα, δεν είναι δύσκολο... - αριθµητική δεικτών: ΟΚ - γενικά: Αρκετά καλά παιδιά, λίγα µικρά λάθη, αλλά πρέπει οπωσδήποτε να µάθετε να βάζετε σχόλια - σχόλια: Εξαιρετικά ακριβή - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: δεν έγινε χρήση - αριθµητική δεικτών: Δεν καταλαβαίνω τι κάνετε. Το πρώτο for απλά βρίσκει πόσες φορές υπάρχει ο character. Το δεύτερο κάνει τόσες φορές το ίδιο strchr. - γενικά: Πολλά compiler warnings, πρέπει να µάθετε να τα διαβάζετε. Αν θέλετε να τυπώσετε pointer, δοκιµάστε το %p. Στην συγκεκριµένη άσκηση δε χρειαζόταν κάτι τέτοιο. Διαδικαστικά OK. 2026???? - Καθόλου σχόλια! - Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά. - Ο έλεγχος για την τελευταία φράση κανονικά έπρεπε να µπει µετά την while και να ελέγχετε εάν υπάρχει διαθέσιµη γραµµή στον πίνακα split. Επίσης ο υπολογισµός του µεγέθους σε αυτή την περίπτωση δεν είναι σωστός. Υπολογίζετε την απόσταση µεταξύ της αρχής του str και του start_str αντί του start_str και του τέλους του str. - Δεν στάλθηκε. - Λύστε την 2η άσκηση *οπωσδήποτε*. 2028 FAIL Στείλατε την άσκηση του lab 8. ΑΝΟΙΓΟΥΜΕ ΤΟ MAIL που µας έρχεται όταν κάνουµε CC. Page 30
Διαδικαστικά: 9 λεπτά εκπρόθεσµη 2029 PASS - σχόλια: ΟΚ, αλλά δοκιµάστε στην αρχή να βάζετε και ένα σχόλιο που θα περιγράφει όλο σας το πρόγραµµα - στοίχιση: ΟΚ - σταθερές: Δεν ζητήσαµε πουθενά το η συγκολητική συµβολοσειρά να έχει 10 γράµµατα. - ονόµατα µεταβλητών: ΟΚ - format string: Δεν το χρησιµοποιείτε πουθενά - αριθµητική δεικτών: ΟΚ αν και το τελευταίο if µέσα στη for δε το χρειάζεστε - γενικά: Αρκετά καλά - σχόλια: ΟΚ, αλλά δοκιµάστε στην αρχή να βάζετε και ένα σχόλιο που θα περιγράφει όλο σας το πρόγραµµα - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: Δεν το χρησιµοποιείτε και πάλι - αριθµητική δεικτών: αρκετά καλά, όµως δείτε το 3ο παράδειγµα από αυτά που δώσαµε στην εκφώνηση. Μπορείτε να βρείτε το λάθος σας; - γενικά: αρκετά καλά PASS 2030 FAIL Εστάλη η άσκηση του lab8 Διαδικαστικά: 9 λεπτά εκπρόθεσµη 2031 PASS - σχόλια: ΟΚ, αλλά δοκιµάστε στην αρχή να βάζετε και ένα σχόλιο που θα περιγράφει όλο σας το πρόγραµµα - στοίχιση: ΟΚ - σταθερές: Δεν ζητήσαµε πουθενά το η συγκολητική συµβολοσειρά να έχει 10 γράµµατα. - ονόµατα µεταβλητών: ΟΚ - format string: Δεν το χρησιµοποιείτε πουθενά - αριθµητική δεικτών: ΟΚ αν και το τελευταίο if µέσα στη for δε το χρειάζεστε - γενικά: Αρκετά καλά - σχόλια: ΟΚ, αλλά δοκιµάστε στην αρχή να βάζετε και ένα σχόλιο που θα περιγράφει όλο σας το πρόγραµµα - στοίχιση: ΟΚ - σταθερές: ΟΚ - ονόµατα µεταβλητών: ΟΚ - format string: Δεν το χρησιµοποιείτε και πάλι - αριθµητική δεικτών: αρκετά καλά, όµως δείτε το 3ο παράδειγµα από αυτά που δώσαµε στην εκφώνηση. Μπορείτε να βρείτε το λάθος σας; - γενικά: αρκετά καλά PASS Page 31
Διαδικαστικά ΟΚ Άσκηση 1η 2033???? - Σχόλια πολύ καλά. Περιγράφετε τι κάνει το πρόγραµα µαζί µε την είσοδο έξοδο, χωρίς περιττές επεξηγήσεις που κουράζουν. - Η στοίχιση φαίνεται σωστή, αλλά δεν είναι. Στην γραµµή 19 ορίζετε σχεδόν όλες τις µεταβλητές τύπου char, char* σε µία γραµµή. Για να µην βγείτε εκτός ορίων αλλάζετε γραµµή και συµπληρώνετε την στοίχιση µε space. Αυτό είναι µια κακή πρακτική καθώς η στοίχιση σας θα εµφανίζεται διαφορετικά, εάν ανοίξετε το πρόγραµµα µε διαφορετικές ρυθµίσεις στον editor. Αντί για space χρησιµοποιείτε πάντοτε tab! - Σωστή αρχικοποίηση διδιάστατου πίνακα µε '\0'. - Σωστή χρήση sprintf(). - Τις γραµµές 37-41 θα µπορούσατε να τις αντικαταστήσετε µε την συνάρτηση strlen(). - Η υλοποίηση σας δουλεύει σωστά, µε εξαίρεση το τελευταίο string που το αγνοείτε. Προσπαθήστε να το διορθώσετε στο σπίτι. - Προσπαθήστε να υλοποιήσετε την ίδια άσκηση χωρίς να αρχικοποιήσετε τον διδιάστατο πίνακα. Άσκηση 2η - Η άσκηση σας δεν κάνει compile. - Έχετε υλοποιήσει εντελώς λάθος στη my_strlen(), ενώ έχετε υλοποιήσει σωστά την λειτουργία της στην 1η άσκηση (γραµµές 37-41). 2034 FAIL - Καθόλου σχόλια! - Σωστά κάνετε το προσδιορισµό µήκους στο format string της scanf για κάθε string. Καλό ήτανε να κατασκευάζατε το format string µε sprintf µε βάση τα #defined µεγέθη. Αν δεν ξέρετε πως γίνεται διαβάστε το έτσι ώστε να το ξέρετε για την επόµενη φορά. - Η αναζήτηση του delimiter µέσα στην εντολή for δεν ξεκινάει από το start_str. - Δεν υπολογίζετε σωστά την νέα τιµή του length πριν την χρησιµοποιήσετε στην strncpy(). - Επίσης δεν κάνετε έλεγχο της τιµής που επιστρέφει η strstr(). Εάν ο delimiter δεν βρέθηκε, η επιστρεφόµενη τιµή είναι NULL και οποιαδήποτε απόπειρα εγγραφής/ανάγνωσης από αυτήν την διεύθυνση προκαλεί segmentation fault και τερµατισµό του προγράµµατος. - Δεν είναι σωστή η δεύτερη παράµετρος της strncpy. Έπρεπε να είναι start_str κι όχι str - Η εκτύπωση του τελικού πίνακα έπρεπε να γίνεται αφού αυτός γεµίσει. - Προσπαθήστε να λύσετε σωστά την άσκηση. - Δεν κάνει compile. - Λύστε την 2η άσκηση κάνοντας χρήση δεικτών *οπωσδήποτε*. Page 32