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

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

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

Transcript

1 7/1/2014 ΣΗΜΑΝΤΙΚΗ ΑΝΑΚΟΙΝΩΣΗ: Όπως ακούσατε και στο σηµερινό µάθηµα, θα υπάρξει ειδική ρύθµιση όσον αφορά τις εξετάσεις για όσους φοιτητές δεν πληρούν τις προϋποθέσεις είτε για τα quiz είτε για τις απουσίες (των τελευταίων εργαστηρίων). Εποµένως, ακόµη κι αν έχετε πάρει τρίτο fail στο lab10, ελάτε στο quiz της ερχόµενης εβδοµάδας. Αντίστροφα, ακόµα και αν φαίνεται να µην περνάτε τα quiz, µην εγκαταλείψετε το εργαστήριο αν δεν έχετε συµπληρώσει 3 απουσίες ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ - Σωστά αποτελέσµατα, γενικά καλή δουλειά - Ο τελευταίος έλεγχος στη συνάρτηση είναι περιττός. Αν έχει φτάσει µέχρι εκεί το πρόγραµµα, τότε αναγκαστικά το µήκος είναι >= του PASSWD_MIN_LEN. - Να κατασκευάζετε πάντα το format string µε χρήση sprintf. 357 PASS - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch. - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνατε και το username. - Σωστή χρήση malloc/free και έλεγχοι για NULL.Αν το ptr_2 είναι NULL, θα πρέπει να κάνετε free το ptr_1 πριν το exit. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10).

2 400 FAIL 402 PASS - Άδεια main - Δεν κάνει compile λόγω λάθους σύνταξης στην κλήση της malloc. Ελάχιστος κώδικας. - Καλή δουλειά. Να διαβάζετε πιο προσεκτικά την εκφώνηση/σχόλια: Οι έλεγχοι στην checkaddress έπρεπε να γίνονται µε διαφορετική σειρά. - Μετά από κάθε κλήση στη malloc πρέπει να ελέγχετε αν επέστρεψε NULL. - Σωστή η άσκηση κατά τα άλλα. - Σωστά αποτελέσµατα, γενικά καλή δουλειά - Ο τελευταίος έλεγχος στη συνάρτηση είναι περιττός. Αν έχει φτάσει µέχρι εκεί το πρόγραµµα, τότε αναγκαστικά το µήκος είναι >= του PASSWD_MIN_LEN. - Να κατασκευάζετε πάντα το format string µε χρήση sprintf. 403 PASS - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch. - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνατε και το username. - Σωστή χρήση malloc/free και έλεγχοι για NULL.Αν το ptr_2 είναι NULL, θα πρέπει να κάνετε free το ptr_1 πριν το exit. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10).

3 Λάθος στο όνοµα του φακέλου. - Όχι µόνο δε βάλατε δικά σας σχόλια, αλλά σβήσατε κι αυτά που υπήρχαν. ΓΙΑΤΙ? - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Τυπικά βάζουµε το πρωτότυπο της συνάρτησης πάνω από τη main και την υλοποίηση κάτω. - Όταν δουλεύετε µε pointers να χρησιµοποιείτε NULL κι όχι FAIL - Είναι επιθυµητό να έχουµε special characters, εποµένως ο σχετικός έλεγχος έπρεπε να ήταν == NULL και όχι!= NULL. - Σωστή κατασκευή format string για την ανάγνωση συµβολοσειρών - Ο έλεγχος τερµατισµού της do/while λειτουργεί σωστά, αλλά δεν είναι πολύ καλά σχεδιασµένος. Τι θα κάνατε αν υπήρχαν 20 πιθανοί κωδικοί λάθους? Θα είχατε ένα σύνθετο µε 20 υποεκφράσεις? Πιο σωστό θα ήταν απλά να γράφατε while (check_user_adr!= VALID_ADDRESS) - Δεν κάνει compile. Δηλώνετε τη µεταβλητή rantevou δύο φορές, µία ως char* και µία ως struct appointmentt * Επίσης, στην ανάγνωση ακεραίων µε scanf πρέπει να χρησιµοποιείτε & πριν το όνοµα της µεταβλητής που διαβάζετε. - Λάθος χρήση malloc. Δεσµεύουµε µνήµη για ραντεβού, όχι για χαρακτήρες. Φαίνεται να κάνατε copy+paste κάτι από τις διαφάνειες.

4 - Τι είναι το j και γιατί το χρησιµοποιείτε? Έχετε ήδη την epistrofh και ξέρετε ότι το loop πρέπει να συνεχίζει όσο αυτή δεν είναι VALID_ADDRESS οπότε γιατί να µπερδέψετε τον κώδικά σας µε µια µεταβλητή που το όνοµά της υπονοεί ότι πρόκειται για µετρητή loop κι ένα κατεβατό από if/else? Τελικά το πρόγραµµα δε λειτουργεί σωστά. Αν το λάθος είναι MISSING_DOT, τότε το πρώτο if (για το MISSING_AT) θα βγει false, οπότε το j θα γίνει 1 και το while θα τερµατίσει χωρίς να πρέπει. - Αντί να βάζετε το \0 και µετά strcat, θα ήταν πολύ πιο κοµψό να είχατε µόνο µια strcpy. - Η printf για το Name έπρεπε να είναι µέσα στο for PASS - Σωστή η checkaddress αλλά προσέξτε τη µορφή του κώδικά σας. Αφήνετε πολλές κενές γραµµές και δε διαβάζεται εύκολα. - Σωστή χρήση malloc, αλλά µετά από κάθε κλήση σε αυτή πρέπει πάντα να ελέγχετε αν επέστρεψε NULL. - Αντί για scanf(formatstr, onoma); strcpy(a_ptr->shmeio, onoma); θα µπορούσατε να είχατε γράψει απευθείας scanf(formatstr, a_ptr->shmeio). - Σωστά κατά τα άλλα, αλλά προσέξτε τα ονόµατα των µεταβλητών/πεδίων σας. Δεν είναι καθόλου περιγραφικά και µερικές φορές παραπλανητικά (πχ το shmeio θα έπρεπε να είναι onoma)

5 1614 οριακό PASS - Καλό θα ήταν να είχατε τον ορισµό του struct έξω από τη main. Τυπικά τον βάζουµε κάτω από τα #define. Δεν είναι λάθος όπως το κάνατε, αλλά αν χρειαζόταν να γράψουµε µια συνάρτηση που να θέλει πρόσβαση στο struct, τότε δε θα ήταν ορατό σε αυτή (τώρα το έχετε δηλώσει τοπικά στη main) - Στη κατασκευή του format string έπρεπε να είχατε STR_MAX_LEN-1. Αφήνουµε πάντα µια θέση για το \0. Επίσης, καλό θα ήταν να είχατε την sprintf έξω από το loop ώστε να καλείται µόνο µια φορά κι όχι σε κάθε µία επανάληψη (έτσι κι αλλιώς, το ίδιο format string φτιάχνει πάντα) - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα ήταν πιο κοµψό να είχατε switch. - Λάθος στη λογική του προγράµµατος: Στη while θα έπρεπε να ξανακαλείτε την checkpasswd µετά από κάθε scanf του password, ώστε να ελέγχεται κάθε φορά το νέο password. - Λάθος στην έξοδο: στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Παρόλο που φτιάξατε format string, στη δεύτερη scanf όχι µόνο δεν το χρησιµοποιείτε αλλά έχετε σκέτο %s που έχουµε πει ότι είναι επικίνδυνο! - Όχι µόνο δε βάλατε σχόλια, αλλά σβήσατε από τη συνάρτηση και τα σωστά, περιγραφικά σχόλια που σας δώσαµε έτοιµα. ΓΙΑΤΙ? - Τυπικά γράφουµε το prototype της συνάρτησης πάνω από τη main και την υλοποίηση µετά τη main. - Μη περιγραφικά ονόµατα µεταβλητών (res, x). - Δεν κάνει compile: Όταν διαβάζετε ακέραιες τιµές µε scanf πρέπει να βάζετε & στη µεταβλητή όπου θα αποθηκευτεί η τιµή. Επίσης σε κάποια έκφραση έχετε λάθος το όνοµα του πεδίου (wra αντί για wres) - Σωστή χρήση malloc/free αλλά πρέπει πάντα να κάνετε typecast το αποτέλεσµα και να ελέγχετε αν επέστρεψε NULL. - Ο υπολογισµός της διαφοράς ώρας δε γίνεται σωστά: δε λαµβάνετε υπόψη την περίπτωση που η diaflepta είναι αρνητική (πχ αν οι ώρες είναι 9:40, 10:10)

6 - Σοβαρό πρόβληµα στην προσπέλαση πινάκων: Και στα δύο for loop βγαίνετε εκτός ορίων. Δε θα έπρεπε να κάνετε τέτοια λάθη σε αυτό το στάδιο. - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα σβήσατε? - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε FAIL - Σωστή υλοποίηση της checkaddress - Δεν κάνει compile. Λάθος typecast στη malloc και λάθος παράµετρος. Αντί για την έκφραση που γράψατε ως παράµετρο, έπρεπε να είχατε sizeof(struct pointt), γιατί δεν είναι εγγυηµένο ότι το µέγεθος του struct θα είναι ακριβώς όσο το άθροισµα των µεγεθών των πεδίων. - Μετά από κάθε κλήση σε malloc πρέπει να ελέγχετε αν επέστρεψε NULL. - Έπρεπε να χρησιµοποιείτε -> κι όχι τελεία για να προσπελάσετε τα πεδία του struct. - Δεν κάνετε free στο τέλος

7 1718 οριακό PASS - Στην checkpasswd, στον έλεγχο για το µήκος έπρεπε να είχατε χρησιµοποιήσει τη σταθερά PASSWD_MIN_LEN και όχι το 8. Έτσι όπως το έχετε, αν αλλάξει η τιµή του PASSWD_MIN_LEN, το πρόγραµµά σας δε θα λειτουργεί σωστά. Επίσης, ο έλεγχος έπρεπε να είναι < και όχι <= - Σωστός έλεγχος αποτελέσµατος κι εκτύπωση µηνυµάτων. Εδώ θα ήταν κατάλληλη και η χρήση switch εφόσον το result είναι ακέραιος. Εναλλακτικά, θα µπορούσατε να είχατε else if. Έτσι, αν πχ το αποτέλεσµα είναι TOO_SHORT, δε θα χρειαστεί να γίνουν οι υπόλοιποι έλεγχοι. - Στο τέλος δεν εκτυπώνονται σωστά τα περιεχόµενα του πίνακα γιατί έχετε τερµατίσει το for µε ; στη γραµµή 72 - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε. - Σωστή χρήση sprintf για τη δηµιουργία format string. - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα αλλάξατε? Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων. - Σωστό struct. - Σωστή χρήση malloc, αλλά θα έπρεπε µετά από κάθε malloc να ελέγχετε για NULL και σε αυτή την περίπτωση να εκτυπώνετε κατάλληλο µήνυµα, να απελευθερώνετε ότι δυναµικά δεσµευµένη µνήµη υπάρχει και να τερµατίζετε. Ειδικά ο τερµατισµός είναι σηµαντικός, γιατί αν τα first_ap, second_ap είναι NULL, το πρόγραµµα θα πετάξει segmentation fault όταν πάτε να τα προσπελάσετε - Ο υπολογισµός της διαφοράς ώρας δε γίνεται σωστά: δε λαµβάνετε υπόψη την περίπτωση που η diafora_min είναι αρνητική (πχ αν οι ώρες είναι 9:40, 10:10) - Σωστή απελευθέρωση µνήµης στο τέλος. - Καλά ονόµατα µεταβλητών, στοίχιση.

8 1719 PASS - Η δεύτερη παράµετρος της sprintf έπρεπε να είναι STR_MAX_LEN-1 κι όχι STR_MAX_LEN, γιατί χρειάζεται χώρος για το \0.Κατά τα άλλα καλή δουλειά. Οι έλεγχοι του αποτελέσµατος της συνάρτησης θα µπορούσαν να είχαν γίνει και µε switch. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10). Κατά τα άλλα καλή δουλειά. Δε χρειάζεται να βάζετε σε κάθε γραµµή σχόλια (από ένα σηµείο και µετά πνίγουν τον κώδικα). Για παράδειγµα, είναι προφανές τι κάνουν οι free. Άσκηση 1; - Λάθος στη λογική της άσκησης. Έπρεπε να είχατε ένα loop που τρέχει NUMUSERS φορές και σε κάθε επανάληψη (1) διαβάζει το username και (2) περιέχει ένα do-while παρόµοιο µε αυτό που γράψατε στο οποίο καλεί την checkpasswd κι ελέγχει το αποτέλεσµά της. Εσείς φαίνεται να ενώσατε τα δύο loops σε ένα. Επίσης, για κάποιο λόγο εκτυπώνετε τα µηνύµατα Username και Password µόνο όταν το i είναι 0. Γιατί? 1720 οριακό PASS - Σωστές οι εκτυπώσεις των µηνυµάτων λάθους. - Όταν δουλεύετε µε pointers να χρησιµοποιείτε NULL κι όχι 0. - Προσέξτε τη στοίχιση - Οι έλεγχοι στην checkpasswd είναι ανάποδα. Είναι επιθυµητό να υπάρχουν ειδικοί χαρακτήρες, εποµένως σε αυτή την περίπτωση πρέπει να ελέγχετε αν το αποτέλεσµα είναι ίσο µε NULL. Αντίθετα, δεν είναι επιθυµητό να περιλαµβάνεται το username εποµένως σε αυτή την περίπτωση έπρεπε να ελέγχετε αν το αποτέλεσµα είναι διάφορο του NULL. - Όταν ορίζετε ένα struct καλό είναι να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή. - Καλή δουλειά όσον αφορά δέσµευση µνήµης και τους ελέγχους (µπράβο για το free όταν το ptr2 είναι NULL). - Δε λαµβάνετε υπόψη την περίπτωση που η διαφορά λεπτών είναι αρνητική (πχ 9:40 µε 10:10) - Το ptr1->rantevou είναι string εποµένως δεν πρέπει να βάλετε & στη scanf - Στο τέλος του προγράµµατος πρέπει να κάνετε free τη δυναµικά δεσµευµένη µνήµη.

9 - Το µέγεθος του format string δεν έχει ΚΑΜΙΑ σχέση µε το MAX_NAME_LEN. Αντιθέτως, εξαρτάται από το τι θα περιέχει (το %, το πολύ 10 ψηφία για έναν ακέραιο, το s και το \0). Οµοίως και για τη δεύτερη άσκηση. - Η δεύτερη παράµετρος της sprintf έπρεπε να ήταν MAX_NAME_LEN-1 κι όχι MAX_NAME_LEN γιατί χρειάζεται να κρατηθεί µια θέση για το \0. Οµοίως και για τη δεύτερη άσκηση PASS - Καλό θα ήταν ο ορισµός του struct να µην ήταν κρυµµένος µέσα στον κώδικα της main, και τα πεδία να ήταν σε ξεχωριστή γραµµή το καθένα. - Σωστή χρήση switch αλλά µη βάζετε ποτέ πολλαπλές εντολές στην ίδια γραµµή. - Σωστή η cehckaddress αλλά γιατί σβήσατε τα σωστά και καλογραµµένα σχόλια που σας δώσαµε? - Καλή δουλειά, παραλείψατε µόνο να ελέγξετε για NULL µετά από κάθε κλήση στη malloc. - Σωστή λειτουργία. Καλή δουλειά γενικά. - Προσοχή στην έξοδο. Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username και στην τελική εκτύπωση ξεχάσατε το χαρακτήρα αλλαγής γραµµής PASS - Στη συνάρτηση θα µπορούσατε να είχατε κάνει τους ελέγχους απευθείας στην if αντί να αποθηκεύετε το αποτέλεσµα σε µεταβλητή (και µάλιστα µη-περιγραφική). Θα ήταν πιο καθαρός ο κώδικας έτσι, ειδικά αν υπήρχαν και περισσότεροι έλεγχοι. Για παράδειγµα: if (strstr(passwd, username)!= NULL) {... - Στον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch. - Αν η malloc επιστρέψει NULL, είναι καλό να εκτυπώνετε κι ένα µήνυµα λάθους προς τον χρήστη. - Πολύ σωστά, µπράβο.

10 - Σωστή λειτουργία της checkpasswd, αλλά ως συνάρτηση δεν είναι πολύ καλογραµµένη. Αντί να χρησιµοποιείτε τις µεταβλητές prwto_lathos, deutero_lathos κτλ, τα ονόµατα των οποίων δε δίνουν καµία πληροφορία για το τι εννοούν, θα ήταν καλύτερα να έχετε απευθείας το κατάλληλο return µετά από κάθε έλεγχο. Έτσι, ο αναγνώστης θα έβλεπε άµεσα τι επιστρέφει η συνάρτηση σε κάθε περίπτωση, αντί να χρειάζεται να διαβάσει πιο κάτω. Για παράδειγµα, if (strstr(passwd, username)!= NULL) { return INCLUDES_USERNAME; } Επίσης, µε αυτές τις µεταβλητές είναι πολύ πιο εύκολο να γίνει λάθος από τον προγραµµατιστή (δηλαδή να µην επιστρέψει τη σωστή τιµή σε κάποια περίτπωση επειδή πχ µπέρδεψε πού αντιστοιχεί το deutero_lathos. - Σωστή δηµιουργία format string για την ανάγνωση συµβολοσειρών PASS - Καλά ονόµατα µεταβλητών εκτός από το k. Θα µπορούσατε να το είχατε πει errorcode. Εναλλακτικά (και πιο κοµψά) θα µπορούσατε να είχατε χρησιµοποιήσει switch ως εξής: switch ( checkpasswd(elegxos_passwd, xrhstes[i].username) ) { case TOO_SHORT: printf(...) κτλ. - Στην τελική εκτύπωση των περιεχοµένων του πίνακα δεν έχετε χαρακτήρα αλλαγής γραµµής µετά από κάθε password. Επίσης, στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε το username στη θέση του s κι όχι το γράµµα s. - Στην περίπτωση που αποτυγχάνει η malloc έπρεπε να εκτυπώνετε κι ένα µήνυµα προς τον χρήστη για να γνωρίζει γιατί τερµάτισε το πρόγραµµα. Επίσης, οι έλεγχοι για NULL έπρεπε να γίνονται χωριστά. Αν πετύχει το malloc για το radevou1 αλλά αποτύχει αυτό για το radevou2, τότε θα πρέπει να κάνετε πρώτα free το radevou1 πριν τερµατίσει το πρόγραµµα. - Αντί για *. είνα γενικά προτιµότερο (και πιο ξεκάθαρο) να χρησιµοποιείτε -> - Σωστός υπολογισµός διαφοράς ώρας.

11 - Σωστή λειτουργία, αλλά να διαβάζετε πιο προσεκτικά την εκφώνηση: οι εκτυπώσεις έπρεπε να γίνονται στη main κι όχι µέσα στη συνάρτηση. Σκοπός της συνάρτησης ήταν αποκλειστικά ο έλεγχος και η επιστροφή του κωδικού (όπως έλεγαν και τα σχόλια) - Στον ορισµό του struct είναι καλό να βάζετε τα πεδία σε ξεχωριστές γραµµές για να είναι πιο ευανάγνωστος ο κώδικας PASS - Στην κατασκευή του format string έπρεπε να είχατε STR_MAX_LEN-1 κι όχι +1. Θέλουµε να διαβαστεί ένας λιγότερος χαρακτήρας για να µπει και το \0 στην τελευταία θέση. Επίσης, το format string πρέπει να έχει µεγαλύτερο µέγεθος (1 για το %, 1 για το s, µέχρι 10 για τον ακέραιο κι 1 για το \0 --> µέγεθος 13) - Η main σας είναι κάπως απλοποιηµένη εφόσον δεν περιέχει τους κατάλληλους ελέγχους του αποτελέσµατος της συνάρτησης. - Σωστή η τελική εκτύπωση - Σωστή χρήση malloc/free. Μετά από κάθε malloc όµως πρέπει να ελέγχετε οπωσδήποτε αν επέστρεψε NULL. - Στον υπολογισµό της διαφοράς λεπτών έχετε app_2oy_ptr->mins)-(app_2oy_ptr->mins) οπότε βγαίνει πάντα 0. - Καλή προσπάθεια.

12 1725 οριακό PASS ΛΑΘΟΣ ΟΝΟΜΑ ΦΑΚΕΛΟΥ! Πόσες φορές πρέπει να το αναφέρουµε? - Να διαβάζετε πιο προσεκτικά την εκφώνηση. Οι εκτυπώσεις των µηνυµάτων λάθους έπρεπε να γίνονται στη main. - Οι sprintf θα ήταν καλύτερα να βρίσκονται εκτός loop ώστε να καλούνται από µία φορά κι όχι σε κάθε επανάληψη. Έτσι κι αλλιώς το ίδιο πράγµα κατασκευάζουν κάθε φορά. - Μετά από κάθε malloc πρέπει πάντα να ελέγχετε για NULL. - Το ptr_1->name είναι string εποµένως δεν πρέπει να βάλετε & στη scanf. - Για µια ακόµη φορά έχετε ονόµατα της µορφής ptr_1, ptr_2. Αυτή είναι η τελευταία φορά που σας γράφουµε σχόλια βαθµολόγησης, εφόσον προφανώς δεν τα διαβάζετε. - Στην τελική εκτύπωση έπρεπε να εµφανίζονται τα ονόµατα των σηµείων κι όχι τα γράµµατα x, y, z. - Δεν κάνετε free τη δυναµικά δεσµευµένη µνήµη.

13 - Σωστή υλοποίηση της checkpasswd - Προσοχή στη στοίχιση: οι δηλώσεις µεταβλητών στη main έπρεπε να ήταν ένα tab πιο δεξιά - Σωστή κατασκευή του format string. Θα ήταν καλύτερα η sprintf να βρισκόταν έξω από το loop ώστε να εκτελείται µόνο µια φορά κι όχι σε κάθε επανάληψη (άλλωστε το ίδιο format string κατασκευάζεται κάθε φορά) 1726 FAIL - Οι έλεγχοι του αποτελέσµατος της checkpasswd στη main θα µπορούσαν να είχαν γίνει και µε switch. - Γενικά καλά ονόµατα µεταβλητών, αλλά το πεδίο Onomata είναι παραπλανητικό. Το όνοµα ΕΝΟΣ χρήστης αποθηκεύεται σε αυτό. - Το τελευταίο else είναι λάθος. Σε εκείνο το σηµείο, µόλις έχετε οριστικοποιήσει το username και το password για ΕΝΑΝ χρήστη, και για την ακρίβεια για τον χρήστη στη θέση i. Εσείς τα αντιγράφετε σε όλες τις θέσεις του πίνακα χρηστών. Επιπλέον χρησιµοποιείτε πάλι i (παρόλο που το i ελέγχει και το εξωτερικό loop) κι έτσι "καταστρέφετε" την τιµή του. - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Δεν έγινε - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα σβήσατε? 1727 PASS -Σωστή λειτουργία. Οι έλεγχοι για το αποτέλεσµα της συνάρτησης θα µπορούσαν να γίνουν και µε switch. - Σωστή χρήση malloc, αλλά µετά από κάθε κλήση πρέπει να ελέγχετε αν επέστρεψε NULL. - Μη χρησιµοποιείτε ΠΟΤΕ σκέτο %s στη scanf. Έχουµε πει πολλές φορές ότι είναι επικίνδυνο.

14 - Όταν ορίζετε ένα struct είναι καλύτερα να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή για να είναι πιο κατανοητός ο κώδικας. - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε. Επίσης, η συνάρτηση είχε εκτενή και σωστά σχόλια, τα οποία αφαιρέσατε! Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων FAIL - Λάθος στην υλοποίηση της checkaddress που έχει ως αποτέλεσµα ατέρµονο loop. Αν το έχει έστω κι έναν παράνοµο χαρακτήρα έπρεπε να επιστρέφετε HAS_ILLEGAL_CHARS. Εσείς, αν έχει παράνοµο χαρακτήρα καλείτε επαναληπτικά την strpbrk. Το loop θα τερµατίσει αν δεν υπάρχει άλλος παράνοµος χαρακτήρας µετά από αυτόν που βρέθηκε. Αν όµως υπάρχει, δε θα τερµατίσει ποτέ γιατί το address+1 είναι πάντα η ίδια διεύθυνση. Τελικά, επιστρέφετε HAS_ILLEGAL_CHARS αφού ελέγξετε ότι δεν υπάρχουν παράνοµοι χαρακτήρες, που είναι το αντίθετο από αυτό που θέλουµε. - Σωστή δηµιουργία των format string για την ανάγνωση των συµβολοσειρών, αλλά θα ήταν καλύτερα να είχατε τις δύο sprintf έξω από το for ώστε να καλούνται µόνο µια φορά η καθεµία. Άλλωστε, το ίδιο format string κατασκευάζει η κάθε µία κάθε φορά που εκτελείται. - Ο έλεγχος του αποτελέσµατος είναι σωστός. Θα µπορούσε να είχε γίνει και µε switch. - Ο έλεγχος τερµατισµού της do/while λειτουργεί σωστά, αλλά δεν είναι πολύ καλά σχεδιασµένος. Τι θα κάνατε αν υπήρχαν 20 πιθανοί κωδικοί λάθους? Θα είχατε ένα σύνθετο µε 20 υποεκφράσεις? Πιο σωστό θα ήταν απλά να γράφατε while (check_user_adr!= VALID_ADDRESS) - Δεν κάνει compile, ελάχιστος κώδικας. Σωστή η δηµιουργία του struct αλλά οι malloc είναι λάθος. Το size_t(struct) δεν έχει κανένα νόηµα.

15 1731 οριακό PASS - Το πρόγραµµα δεν ακολουθεί τις προδιαγραφές: Τα µηνύµατα για λάθος password έπρεπε να εκτυπώνονται στη main και τα username/passwords έπρεπε να εκτυπώνονται ΑΦΟΤΟΥ έχει γεµίσει ο πίνακας κι όχι µε κάθε εισαγωγή στοιχείων. Κυρίως γι αυτό παίρνετε οριακό pass. - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Σωστή κατασκευή format string, αλλά θα ήταν πιο πρακτικό η sprintf να είναι έξω από το loop ώστε να καλείται µόνο µία φορά - έτσι κι αλλιώς το ίδιο πράγµα κατασκευάζει κάθε φορά - Στη main έπρεπε να χρησιµοποιείτε τον κωδικό VALID_PASSWD κι όχι την τιµή 1. - Όχι µόνο δε βάλατε σχόλια, αλλά σβήσατε και τα σωστά, περιγραφικά σχόλια που σας δώσαµε έτοιµα. ΓΙΑΤΙ? - Τυπικά γράφουµε το prototype της συνάρτησης πάνω από τη main και την υλοποίηση µετά τη main FAIL - Compile µε warnings. - Όταν χρησιµοποιείτε malloc πρέπει να κάνετε #include το stdlib.h - Μετά από κάθε malloc πρέπει να ελέγχετε αν επέστρεψε NULL - Καλό είναι να µην ανακατεύετε δηλώσεις µεταβλητών µε άλλο κώδικα, αλλά να βάζετε τις δηλώσεις στην αρχή. Οι µεταβλητές prwto_rant, deutero_rant τι σκοπό εξυπηρετούν? Έπρεπε να χρησιµοποιείτε σε όλες τις περιπτώσεις τις prwto και deutero. - Ο υπολογισµός της διαφοράς δεν είναι σωστός. Έπρεπε να κάνετε κάτι παρόµοιο µε αυτό που είχαµε στο hw1. - Στο τέλος έπρεπε να κάνετε free τη δυναµικά δεσµευµένη µνήµη. - Δεν κάνει compile. Σοβαρά λάθη σχεδόν σε κάθε γραµµή! - Περιέχει µόνο το struct.

16 1735 οριακό PASS - Καλό θα ήταν να είχατε τον ορισµό του struct έξω από τη main. Τυπικά τον βάζουµε κάτω από τα #define. Δεν είναι λάθος όπως το κάνατε, αλλά αν χρειαζόταν να γράψουµε µια συνάρτηση που να θέλει πρόσβαση στο struct, τότε δε θα ήταν ορατό σε αυτή (τώρα το έχετε δηλώσει τοπικά στη main) - Στη κατασκευή του format string έπρεπε να είχατε STR_MAX_LEN-1. Αφήνουµε πάντα µια θέση για το \0. Επίσης, καλό θα ήταν να είχατε την sprintf έξω από το loop ώστε να καλείται µόνο µια φορά κι όχι σε κάθε µία επανάληψη (έτσι κι αλλιώς, το ίδιο format string φτιάχνει πάντα) - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα ήταν πιο κοµψό να είχατε switch. - Λάθος στη λογική του προγράµµατος: Στη while θα έπρεπε να ξανακαλείτε την checkpasswd µετά από κάθε scanf του password, ώστε να ελέγχεται κάθε φορά το νέο password. - Λάθος στην έξοδο: στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Παρόλο που φτιάξατε format string, στη δεύτερη scanf όχι µόνο δεν το χρησιµοποιείτε αλλά έχετε σκέτο %s που έχουµε πει ότι είναι επικίνδυνο! - Όχι µόνο δε βάλατε σχόλια, αλλά σβήσατε από τη συνάρτηση και τα σωστά, περιγραφικά σχόλια που σας δώσαµε έτοιµα. ΓΙΑΤΙ? - Τυπικά γράφουµε το prototype της συνάρτησης πάνω από τη main και την υλοποίηση µετά τη main. - Μη περιγραφικά ονόµατα µεταβλητών (res, x). - Δεν κάνει compile: Όταν διαβάζετε ακέραιες τιµές µε scanf πρέπει να βάζετε & στη µεταβλητή όπου θα αποθηκευτεί η τιµή. Επίσης σε κάποια έκφραση έχετε λάθος το όνοµα του πεδίου (wra αντί για wres) - Σωστή χρήση malloc/free αλλά πρέπει πάντα να κάνετε typecast το αποτέλεσµα και να ελέγχετε αν επέστρεψε NULL. - Ο υπολογισµός της διαφοράς ώρας δε γίνεται σωστά: δε λαµβάνετε υπόψη την περίπτωση που η diaflepta είναι αρνητική (πχ αν οι ώρες είναι 9:40, 10:10)

17 1736 PASS 1737 PASS - Πολύ καλή δουλειά, µπράβο. Για τον έλεγχο του αποτελέσµατος θα µπορούσατε να είχατε χρησιµοποιήσει και switch. - Πολύ καλή δουλειά, µπράβο.. Άσκηση 1 - Το πρόγραµµά σας έχει κάποια bugs τα οποία καταλήγουν στο να "σκάει" µε µήνυµα "pointer being freed was not allocated": ---Δεσµεύετε στην αρχή µνήµη για το database των χρηστών (το οποίο δεν ήταν απαραίτητο γιατί ξέρουµε το πλήθος τους από πριν, οπότε αρκούσε να χρησιµοποιήσετε στατικό πίνακα). Στη µνήµη αυτή δείχνουν δύο δείκτες, ο userdb και ο current. Μέσα στην additem καλείτε realloc στη µνήµη που δείχνει ο current, εποµένως δεσµεύετε νέα µνήµη και η παλιά απελευθερώνεται. Όταν τελειώσει το πρόγραµµα κάνετε free(userdb) το οποίο προσπαθεί να απελευθερώσει (για µια ακόµη φορά) την αρχική µνήµη. Γι αυτό βγαίνει το µήνυµα λάθους. Το σωστό θα ήταν να είχατε free(current) διότι ο current είναι αυτός που δείχνει πάντα στη σωστή µνήµη που έχετε τους χρήστες. --- Για τον ίδιο λόγο, θα έπρεπε στην τελική εκτύπωση να χρησιµοποιείτε current[i] και όχι userdb[i]. --- Όταν κάνετε realloc την πρώτη φορά, ζητάτε *count κελιά το οποίο είναι όσο το i, το οποίο είναι 0, εποµένως ζητάτε 0 bytes. Έπρεπε να είχατε (*count+1) - Μη χρησιµοποιείτε "τυχαίες" τιµές για κωδικούς λάθους, γιατί µπερδεύουν τον αναγνώστη. Τι σηµαίνει -456 και τι διαφορά έχει από το -3409? Αρκούσε ένα exit(1) ή ένα #define για τον κωδικό MALLOC_ERROR και µετά να επιστρέφετε αυτό. - Σωστή χρήση sprintf για τη δηµιουργία format string. - Σωστή χρήση switch για τον έλεγχο του αποτελέσµατος της συνάρτησης. - Γενικά σωστή η τελική εκτύπωση, εκτός από το θέµα µε το userdb - Γενικά σωστή η additem εκτός από το θέµα µε το *count - Σωστή η checkspecial, αλλά θα ήταν πιο απλό να είχατε χρησιµοποιήσει την strpbrk. - Γενικά οκ, αλλά: --- Να κάνετε πάντα typecast το αποτέλεσµα της malloc --- Να ελέγχετε για NULL µετά από κάθε malloc --- Δεν καλύπτετε την περίπτωση που η διαφορά λεπτών είναι αρνητική (πχ 9:40 µε 10:10) --- Δεν κάνετε free 1738 FAIL Εστάλη λάθος εργαστήριο

18 - Ελάχιστος κώδικας FAIL - Το loop βγαίνει εκτός ορίων πίνακα. - Δε χρησιµοποιείτε κατάλληλο format string στη scanf. - Δεν έγινε 1741 PASS - Η δεύτερη παράµετρος της sprintf έπρεπε να είναι STR_MAX_LEN-1 κι όχι STR_MAX_LEN, γιατί χρειάζεται χώρος για το \0.Κατά τα άλλα καλή δουλειά. Οι έλεγχοι του αποτελέσµατος της συνάρτησης θα µπορούσαν να είχαν γίνει και µε switch. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10). Κατά τα άλλα καλή δουλειά. Δε χρειάζεται να βάζετε σε κάθε γραµµή σχόλια (από ένα σηµείο και µετά πνίγουν τον κώδικα). Για παράδειγµα, είναι προφανές τι κάνουν οι free. - Καλή δουλειά, µπράβο. Ο έλεγχος του αποτελέσµατος της συνάρτησης µπορούσε να γίνει και µε switch. - Στην τελική εκτύπωση δεν έχετε \n 1742 PASS - Καλή δουλειά στη χρήση malloc και στα free στις περιπτώσεις που επεστράφη NULL. - Πριν το τελευταίο return 0 πρέπει να γίνουν και τα 3 σηµεία free, όχι µόνο το p3. - Άσχηµα ονόµατα µεταβλητών. Επίσης, µη χρησιµοποιείτε ποτέ σκέτο %s όταν διαβάζετε strings, αλλά να προσδιορίζετε και µέγεθος (%9s ή δηµιουργία format string µε sprintf). - Ελλιπής άσκηση, αλλά σωστή µέχρι το σηµείο που υλοποιήσατε.

19 - Καλή δουλειά, µπράβο. Ο έλεγχος του αποτελέσµατος της συνάρτησης µπορούσε να γίνει και µε switch. - Στην τελική εκτύπωση δεν έχετε \n 1743 PASS - Καλή δουλειά στη χρήση malloc και στα free στις περιπτώσεις που επεστράφη NULL. - Πριν το τελευταίο return 0 πρέπει να γίνουν και τα 3 σηµεία free, όχι µόνο το p3. - Άσχηµα ονόµατα µεταβλητών. Επίσης, µη χρησιµοποιείτε ποτέ σκέτο %s όταν διαβάζετε strings, αλλά να προσδιορίζετε και µέγεθος (%9s ή δηµιουργία format string µε sprintf). - Ελλιπής άσκηση, αλλά σωστή µέχρι το σηµείο που υλοποιήσατε. Όπως έχουµε αναφέρει ξανά, ΤΟ ΟΝΟΜΑ ΤΟΥ ΦΑΚΕΛΟΥ ΔΕΝ ΑΚΟΛΟΥΘΕΙ ΤΙΣ ΠΡΟΔΙΑΓΡΑΦΕΣ. - Καλή δουλειά γενικά. - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch PASS - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνατε και το username. - Καλή δουλειά. - Σωστή χρήση malloc/free κι έλεγχος για NULL. Αν το datedetails2 είναι NULL, θα πρέπει να κάνετε free το datedetails1 πριν το return. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10). - Είναι καλύτερα να χρησιµοποιείτε -> αντί για *.

20 1746 οριακό PASS - Σωστή λειτουργία. Προσέξτε λίγο το output όσον αφορά τις προδιαγραφές. - Σκοπός των #define για τους κωδικούς λάθους είναι να κάνουν πιο ευανάγνωστο το πρόγραµµα αλλά και πιο εύκολο στη συντήρηση. Με το να χρησιµοποιείτε -1 αντί για TOO_SHORT στη main, όχι µόνο αναγκάζετε τον αναγνώστη να ψάξει να βρει τι σηµαίνει το -1, αλλά αυξάνετε και την πιθανότητα να "σπάσει" το πρόγραµµα αν αργότερα αλλάξουν οι τιµές των σταθερών (πχ µετά από προσθήκη νέων κωδικών λάθους) ή απλά να γίνει κάποιο λάθος από µέρους του προγραµµατιστή (πχ να γράψετε -1 ενώ θέλατε -2) - Το µέγεθος του format string δεν έχει ΚΑΜΙΑ σχέση µε το STR_MAX_LEN. Αντιθέτως, εξαρτάται από το τι θα περιέχει (το %, το πολύ 10 ψηφία για έναν ακέραιο, το s και το \0) - Δεν κάνει compile. Ξεχάσατε το ; στο τέλος του ορισµού του struct, µπερδέψατε τις παρενθέσεις στις scanf και ξεχάσατε το & σε 2 σηµεία. - Καλό είναι να αποφεύγετε το *. γιατί κάνει πιο πολύπλοκες τις εκφράσεις (όπως φάνηκε και στις scanf σας). Είναι πολύ πιο απλό και κατανοητό το &(rantevou1->hour) από το &((*rantevou1).hour). - Καλή προσπάθεια, παρά τα λάθη.

21 1747 οριακό PASS - Όταν ορίζετε ένα struct να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή για να είναι πιο ξεκάθαρος ο κώδικας. - Προσέξτε τη στοίχιση. Είναι ασυνεπής (αλλού tab, αλλού κενό) και σε αρκετά σηµεία λάθος. - Θα µπορούσατε να είχατε ένα format string για κάθε περίπτωση και να καλέσετε τις δύο sprintf έξω από τα loops. Έτσι θα είχατε δύο µόνο κλήσεις της sprintf αντί για πολλαπλές µέσα στις επαναλήψεις. Έτσι κι αλλιώς το ίδιο πράγµα κατασκευάζεται κάθε φορά. - Ο έλεγχος του αποτελέσµατος της συνάρτησης θα µπορούσε να γίνει και µε switch. - Σωστή υλοποίηση της checkaddress, αλλά άσχηµα ονόµατα µεταβλητών. Δεν είναι καν απαραίτητα: µπορείτε να κάνετε όλους τους ελέγχους µέσα στις if. - Λείπει το \n στην τελική εκτύπωση. - Απαράδεκτα ονόµατα µεταβλητών! Ειδικά τα LA, LB είναι τραγικά (και τα κεφαλαία υπονοούν σταθερές). Οριακό pass γιατί σας έχουµε ξαναπεί να δίνετε καλύτερα ονόµατα. Περιµένουµε βελτίωση την επόµενη φορά. - Να ελέγχετε χωριστά για NULL σε κάθε malloc. Αν το p2 είναι NULL πρέπει να γίνει free το p1, κι αν το p3 είναι NULL πρέπει να γίνουν free τα p1, p2. Επίσης, σε κάθε περίπτωση πρέπει να εκτυπώνεται ένα µήνυµα ώστε να ξέρει ο χρήστης γιατί τερµάτισε το πρόγραµµα. - Στη scanf για το όνοµα δεν πρέπει να έχετε & γιατί διαβάζετε string. - Σωστά κατά τα άλλα.

22 - Τι είναι το j και γιατί το χρησιµοποιείτε? Έχετε ήδη την epistrofh και ξέρετε ότι το loop πρέπει να συνεχίζει όσο αυτή δεν είναι VALID_ADDRESS οπότε γιατί να µπερδέψετε τον κώδικά σας µε µια µεταβλητή που το όνοµά της υπονοεί ότι πρόκειται για µετρητή loop κι ένα κατεβατό από if/else? Τελικά το πρόγραµµα δε λειτουργεί σωστά. Αν το λάθος είναι MISSING_DOT, τότε το πρώτο if (για το MISSING_AT) θα βγει false, οπότε το j θα γίνει 1 και το while θα τερµατίσει χωρίς να πρέπει. - Αντί να βάζετε το \0 και µετά strcat, θα ήταν πολύ πιο κοµψό να είχατε µόνο µια strcpy. - Η printf για το Name έπρεπε να είναι µέσα στο for PASS - Σωστή η checkaddress αλλά προσέξτε τη µορφή του κώδικά σας. Αφήνετε πολλές κενές γραµµές και δε διαβάζεται εύκολα. - Σωστή χρήση malloc, αλλά µετά από κάθε κλήση σε αυτή πρέπει πάντα να ελέγχετε αν επέστρεψε NULL. - Αντί για scanf(formatstr, onoma); strcpy(a_ptr->shmeio, onoma); θα µπορούσατε να είχατε γράψει απευθείας scanf(formatstr, a_ptr->shmeio). - Σωστά κατά τα άλλα, αλλά προσέξτε τα ονόµατα των µεταβλητών/πεδίων σας. Δεν είναι καθόλου περιγραφικά και µερικές φορές παραπλανητικά (πχ το shmeio θα έπρεπε να είναι onoma) - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε PASS - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα έσβησες? Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων. - Σωστός κώδικας. Ο έλεγχος του αποτελέσµατος της συνάρτησης θα µπορούσε να είχε γίνει και µε switch. - Καλή δουλειά, µπράβο. - Στον έλεγχο για το αν η malloc επέστρεψε NULL, Αν ένα από τα ptr[i] είναι NULL θα πρέπει να γίνουν free τα προηγούµενα πριν το return.

23 1750 PASS - Καλή δουλειά. Να διαβάζετε πιο προσεκτικά την εκφώνηση/σχόλια: Οι έλεγχοι στην checkaddress έπρεπε να γίνονται µε διαφορετική σειρά. - Μετά από κάθε κλήση στη malloc πρέπει να ελέγχετε αν επέστρεψε NULL. - Σωστή η άσκηση κατά τα άλλα. - Στα προηγούµενα εργαστήρια είχατε σωστά κατασκευάσει format string για την ανάγνωση συµβολοσειρών. Γιατί χρησιµοποιήσατε το πολύ επικίνδυνο %s αυτή τη φορά? - Να διαβάζετε προσεκτικά την εκφώνηση. Η εκτύπωση των µηνυµάτων έπρεπε να γίνεται στη main µετά τον έλεγχο του αποτελέσµατος της συνάρτησης. Επίσης, στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνατε και το username. - Όλα σωστά κατά τα άλλα PASS - Όταν ελέγχετε αν η malloc επέστρεψε NULL είναι πιο σωστό να το κάνετε ξεχωριστά για κάθε δείκτη. Για παράδειγµα, αν ο app1_ptr είναι οκ, αλλά ο app2_ptr είναι NULL, τότε πριν τερµατίσετε θα πρέπει να κάνετε free τον app1_ptr. Με τον τρόπο που το έχετε τώρα αυτό δε µπορεί να γίνει βολικά. - Δεν καλύπτετε την περίπτωση το minute_difference να είναι αρνητικό (πχ να έχετε 9:40 και 10:10). - Είναι γενικά προτιµότερο να χρησιµοποιείτε -> αντί για *. - Καλή δουλειά γενικά - Πολύ καλή δουλειά, µπράβο. ο έλεγχος του αποτελέσµατος της συνάρτησης θα µπορούσε να γίνει και µε switch PASS - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα σβήσατε? - Σωστή χρήση malloc κι έλεγχοι. Αν το point2 είναι NULL πρέπει να κάνετε free το point1 πριν το return. Αντίστοιχα και για το point3. - Καλή δουλειά

24 1753 οριακό PASS - Όταν ορίζετε ένα struct να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή για να είναι πιο ξεκάθαρος ο κώδικας. - Προσέξτε τη στοίχιση. Είναι ασυνεπής (αλλού tab, αλλού κενό) και σε αρκετά σηµεία λάθος. - Θα µπορούσατε να είχατε ένα format string για κάθε περίπτωση και να καλέσετε τις δύο sprintf έξω από τα loops. Έτσι θα είχατε δύο µόνο κλήσεις της sprintf αντί για πολλαπλές µέσα στις επαναλήψεις. Έτσι κι αλλιώς το ίδιο πράγµα κατασκευάζεται κάθε φορά. - Ο έλεγχος του αποτελέσµατος της συνάρτησης θα µπορούσε να γίνει και µε switch. - Σωστή υλοποίηση της checkaddress, αλλά άσχηµα ονόµατα µεταβλητών. Δεν είναι καν απαραίτητα: µπορείτε να κάνετε όλους τους ελέγχους µέσα στις if. - Λείπει το \n στην τελική εκτύπωση. - Απαράδεκτα ονόµατα µεταβλητών! Ειδικά τα LA, LB είναι τραγικά (και τα κεφαλαία υπονοούν σταθερές). Οριακό pass γιατί σας έχουµε ξαναπεί να δίνετε καλύτερα ονόµατα. Περιµένουµε βελτίωση την επόµενη φορά. - Να ελέγχετε χωριστά για NULL σε κάθε malloc. Αν το p2 είναι NULL πρέπει να γίνει free το p1, κι αν το p3 είναι NULL πρέπει να γίνουν free τα p1, p2. Επίσης, σε κάθε περίπτωση πρέπει να εκτυπώνεται ένα µήνυµα ώστε να ξέρει ο χρήστης γιατί τερµάτισε το πρόγραµµα. - Στη scanf για το όνοµα δεν πρέπει να έχετε & γιατί διαβάζετε string. - Σωστά κατά τα άλλα.

25 - Σωστή υλοποίηση της checkpasswd - Προσοχή στη στοίχιση: οι δηλώσεις µεταβλητών στη main έπρεπε να ήταν ένα tab πιο δεξιά - Σωστή κατασκευή του format string. Θα ήταν καλύτερα η sprintf να βρισκόταν έξω από το loop ώστε να εκτελείται µόνο µια φορά κι όχι σε κάθε επανάληψη (άλλωστε το ίδιο format string κατασκευάζεται κάθε φορά) 1760 FAIL - Οι έλεγχοι του αποτελέσµατος της checkpasswd στη main θα µπορούσαν να είχαν γίνει και µε switch. - Γενικά καλά ονόµατα µεταβλητών, αλλά το πεδίο Onomata είναι παραπλανητικό. Το όνοµα ΕΝΟΣ χρήστης αποθηκεύεται σε αυτό. - Το τελευταίο else είναι λάθος. Σε εκείνο το σηµείο, µόλις έχετε οριστικοποιήσει το username και το password για ΕΝΑΝ χρήστη, και για την ακρίβεια για τον χρήστη στη θέση i. Εσείς τα αντιγράφετε σε όλες τις θέσεις του πίνακα χρηστών. Επιπλέον χρησιµοποιείτε πάλι i (παρόλο που το i ελέγχει και το εξωτερικό loop) κι έτσι "καταστρέφετε" την τιµή του. - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username. - Δεν έγινε - Να διαβάζετε πιο προσεκτικά την εκφώνηση και τα σχόλια: οι εκτυπώσεις των µηνυµάτων έπρεπε να γίνονται στη main. - Σωστή η checkpasswd αλλά θα ήταν πιο καθαρογραµµένος ο κώδικας αν κάνατε τις συγκρίσεις µέσα στις if. Δε χρειάζονταν τόσες "προσωρινές" µεταβλητές PASS - Καλή δουλειά, µπράβο. - Αν το δεύτερο appointment είναι NULL, πρέπει να κάνετε free το πρώτο πριν τερµατίσετε τη main. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10).

26 - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα σβήσατε? - Στην περίπτωση είναι πιο κατάλληλη η χρήση strchr (αλλά δεν είναι λάθος αυτό που κάνατε). - Στην περίπτωση του dot έπρεπε να ελέγχετε αν εµφανίζεται τελεία οπουδήποτε µετά Η χρήση strpbrk σε αυτή την περίπτωση είναι λάθος γιατί θα επιστρέψει non-null τιµή αν υπάρχει είτε. σε κάποιο σηµείο του string. - Στην περίπτωση παράνοµων χαρακτήρων, θέλουµε να επιστραφεί ο κωδικός λάθος αν υπάρχουν αυτοί οι χαρακτήρες κι όχι αν δεν υπάρχουν. Εποµένως η σύγκριση έπρεπε να ήταν!= NULL 1762 FAIL - Το τελικό if στη συνάρτηση είναι περιττό. Αν δεν έχει ήδη επιστρέψει µέχρι αυτό το σηµείο, τότε προφανώς είναι όλα οκ και πρέπει να επιστραφεί VALID_ADDRESS - Παρόλο που δεν είναι λάθος το βασικό σας loop στη main, δέχεται αρκετές βελτιώσεις: -- Οι sprintf θα µπορούσαν να είναι εκτός του loop. Κάθε φορά κατασκευάζουν το ίδιο πράγµα, οπότε αρκεί να κληθούν µια φορά στην αρχή κι όχι σε κάθε µία επανάληψη. -- Αντί να κάνετε δύο φορές copy+paste τον κώδικα µε τους ελέγχους, θα µπορούσατε να είχατε χρησιµοποιήσει do-while (σκεφτείτε να είχαµε και περισσότερους από 3 ελέγχους) -- Αντί να καλείτε τέσσερις φορές την checkaddress µέσα στο for,θα έπρεπε να την καλείτε µια φορά, να αποθηκεύετε το αποτέλεσµά της σε µια µεταβλητή και µετά να κάνετε τους ελέγχους χρησιµοποιώντας τη µεταβλητή. Η κλήση συναρτήσεων έχει σχετικά µεγάλο κόστος στο χρόνο εκτέλεσης ενός προγράµµατος, οπότε δεν πρέπει να γίνεται άσκοπα. - Ο έλεγχος θα µπορούσε να γίνει και µε switch. - Δεν έγινε. - Πολύ καλή δουλειά, µπράβο PASS - Στην checkpasswd θα ήταν πιο ευανάγνωστος ο κώδικας (ειδικά αν υπήρχαν περισσότερα είδη λαθών) αν κάνατε τους ελέγχους απευθείας στις if αντί να αποθηκεύετε το αποτέλεσµα σε µεταβλητές µε µη-περιγραφικά ονόµατα και µετά να ελέγχετε αυτές. Για παράδειγµα: if ( strstr(passwd, username)!= NULL) {... - Μετά από κάθε ένα malloc πρέπει να ελέγχετε αν επέστρεψε NULL - Πολύ καλή δουλειά κατά τα άλλα.

27 Όπως έχουµε αναφέρει ξανά, ΤΟ ΟΝΟΜΑ ΤΟΥ ΦΑΚΕΛΟΥ ΔΕΝ ΑΚΟΛΟΥΘΕΙ ΤΙΣ ΠΡΟΔΙΑΓΡΑΦΕΣ. - Καλή δουλειά γενικά. - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch PASS - Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνατε και το username. - Καλή δουλειά. - Σωστή χρήση malloc/free κι έλεγχος για NULL. Αν το datedetails2 είναι NULL, θα πρέπει να κάνετε free το datedetails1 πριν το return. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10). - Είναι καλύτερα να χρησιµοποιείτε -> αντί για * οριακό PASS - Όταν δουλεύετε µε pointers να χρησιµοποιείτε NULL κι όχι 0. - Να διαβάζετε πιο προσεκτικά την εκφώνηση. Το πρόγραµµά σας δε διαβάζει σωστά τα δεδοµένα. Εσείς διαβάζετε πρώτα όλα τα ονόµατα και µετά όλες τις διευθύνσεις ενώ έπρεπε για κάθε ένα όνοµα να διαβάζετε και την αντίστοιχη διεύθυνση. Επίσης, οι εκτυπώσεις των µηνυµάτων λάθους έπρεπε να γίνονται στη main, όχι στην checkaddress. - Σωστή χρήση malloc, αλλά µετά από κάθε κλήση πρέπει να ελέγχετε αν επέστρεψε NULL. - Καλή δουλειά κατά τα άλλα.

28 - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε. - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα έσβησες? Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων PASS - Δε διαβάσατε προσεκτικά την εκφώνηση και τα σχόλια: τα µηνύµατα λάθους έπρεπε να εκτυπώνονται στη main, όχι στη checkaddress. Επίσης, λείπει το \n από την τελική εκτύπωση. - Μετά από κάθε κλήση στη malloc πρέπει να ελέγχετε αν επέστρεψε NULL. - Μη χρησιµοποιείτε µεταβλητές µε όνοµα flag. Δεν είναι καθόλου περιγραφικό. Το κάνατε και στις δύο ασκήσεις. - Σωστή η άσκηση κατά τα άλλα.

29 - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα αλλάξατε? Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων. - Πολύ άσχηµη στοίχιση. Έχετε αλλού tabs κι αλλού κενά (spaces) και δεν είναι πάντα σωστά ευθυγραµµισµένες οι εντολές. - Σωστή υλοποίηση της checkaddress 1768 FAIL - Σωστή κατασκευή των format strings, και σωστά τα δηµιουργείτε µία µόνο φορά έξω από τη for. - Να διαβάζετε πιο προσεκτικά την εκφώνηση. Η εκτύπωση των περιεχοµένων του πίνακα έπρεπε να γίνεται µόνο αφού έχει ήδη γεµίσει ο πίνακας, κι όχι µετά από την ανάγνωση κάθε ονόµατος/ . - Λάθος στη συνθήκη της do-while. Έπρεπε να συνεχίζει όσο το αποτέλεσµα είναι διάφορο του VALID_ADDRESS, όχι όσο είναι ίσο. - Σωστός ο έλεγχος του αποτελέσµατος της συνάρτησης. Θα µπορούσατε να είχατε χρησιµοποιήσει και switch σε αυτό το σηµείο. Δεν έγινε.

30 Άσκηση 1 - Το πρόγραµµά σας έχει κάποια bugs τα οποία καταλήγουν στο να "σκάει" µε µήνυµα "pointer being freed was not allocated": ---Δεσµεύετε στην αρχή µνήµη για το database των χρηστών (το οποίο δεν ήταν απαραίτητο γιατί ξέρουµε το πλήθος τους από πριν, οπότε αρκούσε να χρησιµοποιήσετε στατικό πίνακα). Στη µνήµη αυτή δείχνουν δύο δείκτες, ο userdb και ο current. Μέσα στην additem καλείτε realloc στη µνήµη που δείχνει ο current, εποµένως δεσµεύετε νέα µνήµη και η παλιά απελευθερώνεται. Όταν τελειώσει το πρόγραµµα κάνετε free(userdb) το οποίο προσπαθεί να απελευθερώσει (για µια ακόµη φορά) την αρχική µνήµη. Γι αυτό βγαίνει το µήνυµα λάθους. Το σωστό θα ήταν να είχατε free(current) διότι ο current είναι αυτός που δείχνει πάντα στη σωστή µνήµη που έχετε τους χρήστες. --- Για τον ίδιο λόγο, θα έπρεπε στην τελική εκτύπωση να χρησιµοποιείτε current[i] και όχι userdb[i]. --- Όταν κάνετε realloc την πρώτη φορά, ζητάτε *count κελιά το οποίο είναι όσο το i, το οποίο είναι 0, εποµένως ζητάτε 0 bytes. Έπρεπε να είχατε (*count+1) 1769 PASS - Μη χρησιµοποιείτε "τυχαίες" τιµές για κωδικούς λάθους, γιατί µπερδεύουν τον αναγνώστη. Τι σηµαίνει -456 και τι διαφορά έχει από το -3409? Αρκούσε ένα exit(1) ή ένα #define για τον κωδικό MALLOC_ERROR και µετά να επιστρέφετε αυτό. - Σωστή χρήση sprintf για τη δηµιουργία format string. - Σωστή χρήση switch για τον έλεγχο του αποτελέσµατος της συνάρτησης. - Γενικά σωστή η τελική εκτύπωση, εκτός από το θέµα µε το userdb - Γενικά σωστή η additem εκτός από το θέµα µε το *count - Σωστή η checkspecial, αλλά θα ήταν πιο απλό να είχατε χρησιµοποιήσει την strpbrk. - Γενικά οκ, αλλά: --- Να κάνετε πάντα typecast το αποτέλεσµα της malloc --- Να ελέγχετε για NULL µετά από κάθε malloc --- Δεν καλύπτετε την περίπτωση που η διαφορά λεπτών είναι αρνητική (πχ 9:40 µε 10:10) --- Δεν κάνετε free

31 - Ο ορισµός του struct είναι κάπως κρυµµένος κάτω από το prototype. Τυπικά µπαίνει ανάµεσα στα #define και στα prototypes και έπρεπε να είναι ένα tab πιο αριστερά. - Σοβαρό λάθος στα loops: Βγαίνετε εκτός ορίων πίνακα γιατί το i πάει µέχρι και NUM_USERS Οµοίως, στη δηµιουργία του format string έπρεπε να είχατε STR_MAX_LEN-1 και όχι STR_MAX_LEN, για να υπάρχει και µία θέση για το \ PASS - Η κλήση στην sprintf θα µπορούσε να ήταν έξω από το loop ώστε να εκτελείται µόνο µια φορά και όχι σε κάθε επανάληψη. Έτσι κι αλλιώς, το ίδιο πράγµα κατασκευάζεται κάθε φορά. - Να διαβάζετε πιο προσεκτικά την εκφώνηση και τα σχόλια. Οι εκτυπώσεις έπρεπε να γίνονται στη main κι όχι µέσα στη συνάρτηση. Σκοπός της συνάρτησης ήταν αποκλειστικά ο έλεγχος και η επιστροφή του κωδικού. - Να χρησιµοποιείτε NULL και όχι 0 όταν δουλεύετε µε pointers. - Να κάνετε πάντα typecast το αποτέλεσµα της malloc και να ελέγχετε για κάθε κλήση της malloc αν επεστράφη NULL - Ο υπολογισµός της διαφοράς ώρας δε γίνεται σωστά: δε λαµβάνετε υπόψη την περίπτωση που η diaflepta είναι αρνητική (πχ αν οι ώρες είναι 9:40, 10:10) - Κατά τα άλλα σωστά. - Πολύ καλή δουλειά, µπράβο PASS - Στην checkpasswd θα ήταν πιο ευανάγνωστος ο κώδικας (ειδικά αν υπήρχαν περισσότερα είδη λαθών) αν κάνατε τους ελέγχους απευθείας στις if αντί να αποθηκεύετε το αποτέλεσµα σε µεταβλητές µε µη-περιγραφικά ονόµατα και µετά να ελέγχετε αυτές. Για παράδειγµα: if ( strstr(passwd, username)!= NULL) {... - Μετά από κάθε ένα malloc πρέπει να ελέγχετε αν επέστρεψε NULL - Πολύ καλή δουλειά κατά τα άλλα.

32 - Όταν ορίζετε ένα struct να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή για να είναι πιο ξεκάθαρος ο κώδικας. - Τυπικά, γράφουµε το πρότυπο (prototype) της συνάρτησης πάνω από τη main, και την υλοποίηση µετά τη main, ακριβώς όπως στον έτοιµο κώδικα που σας δώσαµε. - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα έσβησες? Τα σχόλια των συναρτήσεών σας πρέπει να είναι πάντα σαν αυτά που σας δώσαµε και όπως περιγράφονται στο φυλλάδιο για το σχολιασµό προγραµµάτων PASS - Το µέγεθος του format string δεν έχει ΚΑΜΙΑ σχέση µε το MAX_NAME_LEN. Αντιθέτως, εξαρτάται από το τι θα περιέχει (το %, το πολύ 10 ψηφία για έναν ακέραιο, το s και το \0). - Σωστή η χρήση switch, αλλά οι εντολές για κάθε περίπτωση πρέπει να είναι σε ξεχωριστές γραµµές για να είναι ευανάγνωστος ο κώδικας. - Καλή δουλειά γενικά, αλλά θα έπρεπε να είχατε το 10 ορισµένο ως σταθερά. Επίσης, αν τα ptr2, ptr3 είναι NULL, τότε πρέπει να απελευθερωθεί η ήδη δεσµευµένη µνήµη πριν το return. - Πολύ καλή δουλειά, µπράβο. ο έλεγχος του αποτελέσµατος της συνάρτησης θα µπορούσε να γίνει και µε switch PASS - Σας δώσαµε σωστά και πλήρη σχόλια για τη συνάρτηση. Γιατί τα σβήσατε? - Σωστή χρήση malloc κι έλεγχοι. Αν το point2 είναι NULL πρέπει να κάνετε free το point1 πριν το return. Αντίστοιχα και για το point3. - Καλή δουλειά

33 - Να διαβάζετε πιο προσεκτικά την εκφώνηση και τα σχόλια: οι εκτυπώσεις των µηνυµάτων έπρεπε να γίνονται στη main. - Σωστή η checkpasswd αλλά θα ήταν πιο καθαρογραµµένος ο κώδικας αν κάνατε τις συγκρίσεις µέσα στις if. Δε χρειάζονταν τόσες "προσωρινές" µεταβλητές PASS - Καλή δουλειά, µπράβο. - Αν το δεύτερο appointment είναι NULL, πρέπει να κάνετε free το πρώτο πριν τερµατίσετε τη main. - Δεν καλύπτετε την περίπτωση η διαφορά λεπτών να είναι αρνητική (πχ να έχετε 9:40 και 10:10). - Όταν ορίζετε ένα struct να βάζετε κάθε πεδίο σε ξεχωριστή γραµµή για να είναι πιο ξεκάθαρος ο κώδικας. - Να διαβάζετε πιο προσεκτικά την εκφώνηση και τα σχόλια που σας δίνουµε. Η εκτύπωση των µηνυµάτων λάθους έπρεπε να γίνεται στη main κι όχι στην checkaddress. - Δεν εκτυπώνετε στο τέλος τα περιεχόµενα του πίνακα PASS - Κάπως µπερδεµένη η λογική σας στην checkaddress. Θα ήταν πιο κατανοητός ο κώδικας αν είχατε κάθε έλεγχο χωριστά, κι όχι σε εµφωλευµένα if: if ((has_at = strchr(address, '@'))==NULL) return MISSING_AT; if (strchr(has_at, '.') == NULL) return MISSING_DOT; if (strpbrk(address, ILLEGAL_CHARS)!=NULL) return HAS_ILLEGAL_CHARS; return VALID_ADDRESS; - Όταν χρησιµοποιείτε malloc πρέπει πάντα να κάνετε το κατάλληλο typecast και οπωσδήποτε να ελέγχετε αν επεστράφη NULL. - Σωστά κατά τα άλλα.

34 - Σωστή λειτουργία. Καλή δουλειά γενικά. - Προσοχή στην έξοδο. Στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε και το username και στην τελική εκτύπωση ξεχάσατε το χαρακτήρα αλλαγής γραµµής PASS - Στη συνάρτηση θα µπορούσατε να είχατε κάνει τους ελέγχους απευθείας στην if αντί να αποθηκεύετε το αποτέλεσµα σε µεταβλητή (και µάλιστα µη-περιγραφική). Θα ήταν πιο καθαρός ο κώδικας έτσι, ειδικά αν υπήρχαν και περισσότεροι έλεγχοι. Για παράδειγµα: if (strstr(passwd, username)!= NULL) {... - Στον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει switch. - Αν η malloc επιστρέψει NULL, είναι καλό να εκτυπώνετε κι ένα µήνυµα λάθους προς τον χρήστη. - Πολύ σωστά, µπράβο. - Σωστή λειτουργία της checkpasswd, αλλά δεν είναι καλογραµµένη: έπρεπε για τις τιµές που επιστρέφει να είχατε χρησιµοποιήσει τις σταθερές για να είναι πιο κατανοητός ο κώδικας. Επίσης, γιατί σβήσατε τα σχόλια της συνάρτησης? - Πολύ άσχηµο όνοµα πίνακα στη main. Να µη χρησιµοποιείτε ποτέ ονόµατα του ενός γράµµατος για οτιδήποτε εκτός από µετρητές for FAIL - Σωστή χρήση sprintf για την κατασκευή format string. Θα ήταν προτιµότερο να είχατε την sprintf έξω από το loop ώστε να εκτελείται µόνο µια φορά κι όχι σε κάθε επανάληψη (έτσι κι αλλιώς, πάντα το ίδιο πράγµα κατασκευάζει). Επίσης, αρκεί µια sprintf εφόσον τα format string είναι ίδια για όλα τα strings του προγράµµατος. - Για τον έλεγχο του αποτελέσµατος της συνάρτησης θα µπορούσατε να είχατε χρησιµοποιήσει και switch. - Δεν έγινε.

35 1784 οριακό PASS - Σωστή υλοποίηση της checkaddress - Σωστή δηµιουργία format string για την ανάγνωση των συµβολοσειρών. Καλό θα ήταν να είχατε δύο διαφορετικά format string (ένα για τα ονόµατα ένα για τις διευθύνσεις) και να βάζατε τις sprintf έξω από το for ώστε κάθε µία να εκτελείται µία φορά κι όχι σε κάθε επανάληψη. - Η συνθήκη τερµατισµού της while δεν είναι πολύ ξεκάθαρη. Εφόσον θέλουµε να εκτελείται όσο δεν είναι έγκυρη η διεύθυνση, θα ήταν πιο σωστό να είχατε χρησιµοποιήσει τη σταθερά VALID_ADDRESS κι όχι το 1. - Σωστός έλεγχος του αποτελέσµατος της checkaddress. Θα µπορούσατε να είχατε χρησιµοποιήσει και switch σε αυτό το σηµείο. - Σωστή εκτύπωση των περιεχοµένων του πίνακα - Δεν κάνει compile. Έπρεπε να είχατε χρησιµοποιήσει -> και όχι. για την προσπέλαση των πεδίων. Επίσης, όταν διαβάζετε ακεραίους (πχ. ptr_3->x) θα έπρεπε να είχατε %d στη scanf και φυσικά & πριν τις µεταβλητές (δηλαδή &(ptr_3->x). - Άσχηµα ονόµατα µεταβλητών. - Μετά από κάθε µία malloc θα έπρεπε να ελέγχατε αν απέτυχε (αν επέστρεψε NULL) και σε αυτή την περίπτωση να απελευθερώνετε ότι δυναµικά δεσµευµένη µνήµη υπάρχει και να τερµατίζετε. - Σωστή απελευθέρωση µνήµης στο τέλος.

36 - Σωστή λειτουργία, αλλά στο µήνυµα "Includes username" έπρεπε να εµφανίζεται το username στη θέση του s. - Στη συνάρτηση checkpasswd θα ήταν πιο κατανοητός ο κώδικας (και λιγότερο πιθανό να γίνει λάθος) αν είχατε τις κλήσεις στις strlen, κτλ κατευθείαν µέσα στις if και όχι πιο πριν και αποθηκευµένα τα αποτελέσµατα σε µη-περιγραφικά ονόµατα µεταβλητών (τι διαφορά έχει το found από το found1? Αν είχαµε κι άλλους ελέγχους, πόσα found θα φτιάχνατε?) - Να διαβάζετε προσεκτικά την εκφώνηση και τα σχόλια. Οι printf έπρεπε να είναι στη main. Σκοπός της συνάρτησης ήταν ΜΟΝΟ ο έλεγχος και η επιστροφή κατάλληλου κωδικού PASS - Σωστή χρήση sprintf για τη δηµιουργία format string - Στη main έπρεπε να ελέγχετε το αποτέλεσµα της συνάρτησης χρησιµοποιώντας τον κατάλληλο κωδικό (VALID_PASSWD κι όχι 1) - Προσοχή στη στοίχιση. Το do-while έπρεπε να είναι ένα tab πιο µέσα. - Compile µε warnings - Όταν χρησιµοποιείτε malloc να κάνετε #include το stdlib.h - Μετά από κάθε µία malloc πρέπει να ελέγχετε πάντα αν επέστρεψς NULL. - Στη scanf, όταν διαβάζετε ακέραιες τιµές έπρεπε να είχατε και & πριν την αντίστοιχη µεταβλητή. - Δεν καλύπτετε την περίπτωση που η διαφορά λεπτών είναι αρνητική (πχ 9:40 µε 10:10) - Σωστό το free.

37 - Σωστή λειτουργία της checkpasswd, αλλά ως συνάρτηση δεν είναι πολύ καλογραµµένη. Αντί να χρησιµοποιείτε τις µεταβλητές prwto_lathos, deutero_lathos κτλ, τα ονόµατα των οποίων δε δίνουν καµία πληροφορία για το τι εννοούν, θα ήταν καλύτερα να έχετε απευθείας το κατάλληλο return µετά από κάθε έλεγχο. Έτσι, ο αναγνώστης θα έβλεπε άµεσα τι επιστρέφει η συνάρτηση σε κάθε περίπτωση, αντί να χρειάζεται να διαβάσει πιο κάτω. Για παράδειγµα, if (strstr(passwd, username)!= NULL) { return INCLUDES_USERNAME; } Επίσης, µε αυτές τις µεταβλητές είναι πολύ πιο εύκολο να γίνει λάθος από τον προγραµµατιστή (δηλαδή να µην επιστρέψει τη σωστή τιµή σε κάποια περίτπωση επειδή πχ µπέρδεψε πού αντιστοιχεί το deutero_lathos. - Σωστή δηµιουργία format string για την ανάγνωση συµβολοσειρών PASS - Καλά ονόµατα µεταβλητών εκτός από το k. Θα µπορούσατε να το είχατε πει errorcode. Εναλλακτικά (και πιο κοµψά) θα µπορούσατε να είχατε χρησιµοποιήσει switch ως εξής: switch ( checkpasswd(elegxos_passwd, xrhstes[i].username) ) { case TOO_SHORT: printf(...) κτλ. - Στην τελική εκτύπωση των περιεχοµένων του πίνακα δεν έχετε χαρακτήρα αλλαγής γραµµής µετά από κάθε password. Επίσης, στην περίπτωση INCLUDES_USERNAME έπρεπε να εκτυπώνετε το username στη θέση του s κι όχι το γράµµα s. - Στην περίπτωση που αποτυγχάνει η malloc έπρεπε να εκτυπώνετε κι ένα µήνυµα προς τον χρήστη για να γνωρίζει γιατί τερµάτισε το πρόγραµµα. Επίσης, οι έλεγχοι για NULL έπρεπε να γίνονται χωριστά. Αν πετύχει το malloc για το radevou1 αλλά αποτύχει αυτό για το radevou2, τότε θα πρέπει να κάνετε πρώτα free το radevou1 πριν τερµατίσει το πρόγραµµα. - Αντί για *. είνα γενικά προτιµότερο (και πιο ξεκάθαρο) να χρησιµοποιείτε -> - Σωστός υπολογισµός διαφοράς ώρας.

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

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h Α.Μ. 1375 FAIL 1413 1417 1420 1421 FAIL 1422 FAIL 1424 1425 FAIL 1426 FAIL - Πρώτα να ελέγχετε αν η malloc επέστρεψε NULL και µετά να προσπαθείτε να προσπελάσετε τη δεσµευµένη µνήµη - Όταν διαβάζετε string

Διαβάστε περισσότερα

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

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών. Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Δεν κάνει compile και το λάθος είναι σηµαντικό: Το head1 είναι δείκτης σε struct, εποµένως η προσπέλαση πεδίου γίνεται 321 FAIL µε head1->next και όχι head1.next. Επιπλέον, έχετε λάθος

Διαβάστε περισσότερα

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

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα. Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1349 FAIL Δεν ελήφθη άσκηση 1482 1556 1559 1562 1563 1565 1566 FAIL - Στην initialize πρέπει να κάνετε έλεγχο αν η malloc αποτυγχάνει για κάθε κλήση της, άρα και για δέσµευση χώρου για

Διαβάστε περισσότερα

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 00497 -Δεν ελέγχετε αν η createlist εκτελλέστικε σωστά και δεν τερµατίζετε το πρόγραµµα σε διαφορετική -Σωστά βρίσκετε το σηµείο στο οποίο πρέπει να προστεθεί ο κόµβος. -Σωστά τερµατίζετε

Διαβάστε περισσότερα

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

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση. Sheet1_2 AEM 0001 0002 0003 0004 0006 COMMENTS - Segmentation fault λόγω λάθους στην αναδροµή. Δες τη λύση, αλλά προσπάθησε να το ξανακάνεις και στο σπίτι για εξ - Πρόσεχε λίγο τη στοίχιση - Καλή δουλειά

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

FAIL PASS PASS οριακά

FAIL PASS PASS οριακά AEM 0001 0002 COMMENTS οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 7 -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον

Διαβάστε περισσότερα

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

Τα ονόµατα των φακέλων πρέπει να έχουν το επίθετά σας και όχι τα username που χρησιµοποιείτε στα εργαστήρια. Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Άσκηση 1η - Θα µπορούσατε να κάνετε µία do while για τον έλεγχο της επιλογής και κατά συνέπεια, µια printf/scanf για την επιλογή - ΛΑΘΟΣ: δηλώσατε το τύπο της επιλογής σαν char ενώ θα

Διαβάστε περισσότερα

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

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά Α. Μ. Βαθμός Σχόλια 1183 1194 1238 1239 1240 1241 - Καλή δουλειά 1242 1243 1244 1245 - Κακή χρήση συναρτήσεων. Κάνεις τον ίδιο έλεγχο και εντός και εκτός της συνάρτησης. Θα έπρεπε να έχεις βρεί ένα τρόπο

Διαβάστε περισσότερα

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

lab10grades - Το αποτέλεσµα της τοµής θα έπρεπε να εµφανίζετε µέσα σε εισαγωγικά Helo. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ - Δεν χρησιµοποιείτε καλά ονόµατα µεταβλητών και παραµέτρων στις συναρτήσεις. - Σωστή χρήση της fgets. - Σωστός εντοπισµός του \n και αντικατάσταση µε \0. - Ο χαρακτήρας τερµατισµού \0

Διαβάστε περισσότερα

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

lab7grades -Σωστή χρήση της sprintf -Σωστά ανιχνεύετε τον χαρακτήρα που πρέπει να αφαιρέσετε. -Σωστή µεταφορά στοιχείων µια θέση αριστερά. 00497 Άσκηση1 -Σωστή στοίχιση. -Σωστή χρήση σταθερών. -Σωστά ονόµατα µεταβλητών. -Σωστή χρήση της sprintf. Το sprintf(formatstring, "%%%ds", INIT_SIZE 1); αρκεί να γραφτεί µια φορά. -Σωστή χρήση των συναρτήσεων

Διαβάστε περισσότερα

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

403 FAIL Λάθος στο πακετάρισµα του αρχείου. ΑΕΜ ΒΑΘΜΟΣ 357 FAIL Λάθος στο πακετάρισµα του αρχείου. ΣΧΟΛΙΑ 400 FAIL 402 Έπρεπε να στείλετε ΜΟΝΟ το lab11.c Λάθος αλγόριθµος. Αµέσως µόλις συναντήστε κόµβο όπου το curr->number είναι διάφορο του number,

Διαβάστε περισσότερα

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

lab9grades Άσκηση 1 - Σωστοί τύποι (παραµέτρων και επιστρεφόµενης τιµής) της series_cosh. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ - Μέτρια σχόλια. 00497 PASS - Σωστοί τύποι (παραµέτρων και επιστρεφόµενης τιµής) της factorial. - Σωστοί τύποι (παραµέτρων και επιστρεφόµενης τιµής) της series_cosh. - Καλά ονόµατα µεταβλητών

Διαβάστε περισσότερα

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1 ΑΕΜ ΒΑΘΜΟΣ 449 PASS 451 PASS 476-1733 PASS 1779-1899 FAIL 1900 FAIL Page 1 1901 PASS 1904 PASS 1908 PASS 1909 PASS 1910 - Page 2 1911 PASS 1914 Οριακό PASS 1915 PASS 1926 PASS Page 3 1927 PASS 1928 Οριακό

Διαβάστε περισσότερα

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

Sheet1_2 FAIL. - To πρόγραµµα δεν κάνει compile Δεν παρέδωσε FAIL AEM 0001 0002 0003 COMMENTS οριακά -Η σταθερά για το µέγιστο µέγεθος του πίνακα έπρεπε να έχει τιµή 101 και όχι 100. -Έπρεπε να δεσµέυσεις δυναµικά και την µνήµη του αρχικού string και να το κάνεις free

Διαβάστε περισσότερα

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

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα. Α. Μ. Βαθμός Σχόλιο 1183 lab2 - Πολύ καλή δουλειά κατά τα άλλα 1194 1238 1239 FAIL 1240 1241 1242 1243 1244 1245 1246 - πολύ καλό (*υπάρχουν οι τελεστές = ). Ο κώδικας είναι καλά σχολιασµένος -

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2013-2014 Προθεσµία: 7/1/2014, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης 1 Οδηγίες αποστολής άσκησης Πριν ξεκινήσετε (ΔΙΑΒΑΣΤΕ

Διαβάστε περισσότερα

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

Βαθμός Σχόλια. lab6 PASS PASS. - Πολύ καλή δουλειά, αλλά προσπάθησε να κάνεις την άσκηση χρησιµοποιώντας συναρτήσεις από το string. Α. Μ. Βαθμός Σχόλια 1183 1194 1238 1239 1240 1241 1242 1243 - Πολύ καλή δουλειά κατά τα άλλα, µπράβο. - Πολύ καλή δουλειά, αλλά προσπάθησε να κάνεις την άσκηση χρησιµοποιώντας συναρτήσεις από το string.h

Διαβάστε περισσότερα

ΑΕΜ ή username. Sheet2

ΑΕΜ ή username. Sheet2 ΑΕΜ ή username ΒΑΘΜΟΣ 357 ΣΧΟΛΙΑ - Σωστοί τύποι και περιγραφικά ονόµατα µεταβλητών. Αν το price_euro το είχατε price_euro_liter (όπως κάνατε και µε το price_dollar_gallon) δε θα χρειαζόταν καν διευκρινιστικό

Διαβάστε περισσότερα

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

lab9grades -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 οριακό PASS - Η µεταβλητή aukswn_aritmos είναι περιττή. Μπορούσες να χρησιµοποιήσεις i+1 στη θέση της. - Σωστή αριθµητική δεικτών - Καλή στοίχιση, σχόλια 451 PASS -Καλή στοίχιση -Καλά

Διαβάστε περισσότερα

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

Μ.Σ. lab12grades FAIL. η συνθήκη για έξοδο είναι και αυτή σωστή. Οριακό PASS. στα string. - σωστή και η κλήση της συνάρτησης. ΒΑΘΜΟΣ ΣΧΟΛΙΑ - στην malloc που χρησιµοποιήσατε, δεν έχετε αφήσει χώρο για το \0 και χρησιµοποιείτε sizeof µε λάθος τρόπο. Στο τέλος που βάζετε το \0 είναι στην πραγµατικότητα σε µνήµη που δεν έχετε δεσµεύσει

Διαβάστε περισσότερα

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

lab5grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ ΑΣΚΗΣΗΣ ΑΛΛΑ ΣΧΟΛΙΑ 00497 PASS 02103 PASS - Δεν έχει γίνει καθόλου χρήση σταθερών όπως έχουµε ζητήσει να γίνεται για όλες τις σταθερές τιµές. - Υπάρχουν σχόλια αλλά θα µπορούσαν να ήταν πιο επεξηγηµατικά και λίγο περισσότερα

Διαβάστε περισσότερα

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

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την AEM ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1413. Σκέψου πώς θα µπορούσες να την 1417 κάνεις χωρίς χρήση της βοηθητικής µεταβλητής curr - Πρώτη άσκηση οκ - Στη δεύτερη άσκηση το free(head) δεν έπρεπε να είναι στο else, αλλά να

Διαβάστε περισσότερα

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

-Δεν έχεις σχόλια, καλό θα ήταν να έχεις πιο περιγραφικό σχόλιο στην αρχή Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Λάθος θέµα e-mail. -Πολύ καλή προσπάθεια, σωστά αποτελέσµατα χωρίς λάθη αλλά µε Υπάρχει µια προειδοποίηση σχετικά µε την εκτύπωση printf της θέσης. -Ωραία περιγραφικά σχόλια, αλλα καλό

Διαβάστε περισσότερα

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

Βαθμός Σχόλια. lab8. οριακά PASS 1194 PASS Α. Μ. Βαθμός Σχόλια 1183 1194 1195 FAIL 1238 1239 - Άσχηµα ονόµατα µεταβλητών (s, t) - Δε δεσµεύεις αρκετή µνήµη για τις λέξεις που αποθηκεύονται στον πίνακα (και γι αυτό τελικά το πρόγραµµά σου κάνει

Διαβάστε περισσότερα

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

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου! AEM 0001 0002 0003 COMMENTS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου! -Τυπώνεις 1,2,3 αντί για AVAILABLE, RESERVED,

Διαβάστε περισσότερα

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

lab14grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 00497 lab14grades - Σωστός έλεγχος του argc για όλες τις περιπτώσεις. - Θα έπρεπε να καλέσεις τη συνάρτηση strlen_r και στην περίπτωση του κενού string, strlen_r("\0"). - Σωστή χρήση

Διαβάστε περισσότερα

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

lab6grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Διαδικαστικά: Όλα οκ. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Διαδικαστικά: Όλα οκ. 449 451 οριακό PASS οριακό PASS, αλλά τα ονόµατα σταθερών γράφονται πάντα µε κεφαλαία για να ξεχωρίζουν. Το max έπρεπε να ήταν MAX. - Ονόµατα µεταβλητών: Καλά, εκτός

Διαβάστε περισσότερα

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

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS lab7 Α. Μ. Βαθμός Σχόλια 1183 1194 1238 1239 1240 1241 1242 1243 1244 1246 - Η συνθήκη του do/while είναι λάθος µε αποτέλεσµα να µπορεί ο χρήστης να βάζει στοιχεία περισσότερα του SIZE. - Στην συνθήκη

Διαβάστε περισσότερα

to post PASS PASS FAIL

to post PASS PASS FAIL AEM COMMENTS - Να δίνεις περιγραφικά ονόµατα σε όλες τις µεταβλητές (τι είναι τα k, flag, temp?) - Το.katastash πρέπει να γίνεται reset σε 0 στην euresh_grammatos, µετά από κάθε κλήση στη search_the_word.

Διαβάστε περισσότερα

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

Άσκηση 2: -Δεν παραδόθηκε. Το εµαιλ είχε λάθος θέµα. Έπρεπε να είναι CE120 lab6 Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Λάθος όνοµα αρχείου.το επίθετο βάζουµε όχι το όνοµα. 1058 FAIL -Έχεις συντακτικά λάθη και προειδοποιήσεις στο πρόγραµµα σου. -Υπαρξη σχολίου στη πρώτη γραµµή. -Σωστή δήλωση και χρήση

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Προθεσµία: 18/12/12, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης 1 Οδηγίες αποστολής άσκησης Διαδικαστικά Η εργασία

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2011-2012 Προθεσµία: 8/1/12, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης Οδηγίες αποστολής άσκησης Πριν ξεκινήσετε (ΔΙΑΒΑΣΤΕ

Διαβάστε περισσότερα

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

lab4grades Παράδοση ασκήσεων: -Όλα καλά Άσκηση 1η: -Σωστή 357 PASS ΑΕΜ ΒΑΘΜΟΣ -Όλα καλά ΣΧΟΛΙΑ η: -Σωστή 357 PASS η: -Ο κώδικας για την είσοδο του µητρώου πρέπει να δοµηθεί αλλιώς γιατί εµφανίζει λάθος πριν καν δοθεί για πρώτη φορά το µητρώο. -Σωστή στοίχιση, µοναδική

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2015-2016 Προθεσµία: Πέµπτη 17/12/2015, 22:00 Διαβάστε πριν ξεκινήσετε Διαβάστε την εκφώνηση προσεκτικά και σχεδιάστε το πρόγραµµά σας πριν

Διαβάστε περισσότερα

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

Παράδοση άσκησης: οκ, αλλά προσέξτε τις νέες οδηγίες για την ονοµασία του φακέλου. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Άσκηση 1: -Σωστά αποτελέσµατα και σωστή έξοδος. -Δεν έχετε περιορισµό στην scanf για την ανάγνωση strings. Δηµιουργείτε το format του string µε χρήση της µεθόδου µε το sprintf αλλά δεν

Διαβάστε περισσότερα

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

Δεν έστειλες την άσκηση 1, και αυτό που έστειλες ήταν σκέτο αρχείο, όχι το tgz που ζητούσε η εκφώνηση. Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Οκ 321 PASS -Το σχόλιο στην αρχή του προγράµµατος δεν είναι περιγραφικό. -Προσπάθησε να χρησιµοποιείς πιο περιγραφικά ονόµατα µεταβλητών για να αποφεύγεις και τα πολλά σχόλια στον κώδικα.

Διαβάστε περισσότερα

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

Sheet1_2. - Δεν υπάρχουν σχόλια συναρτήσεων - Να χρησιµοποιείς πιο περιγραφικά ονόµατα µεταβλητών (και σίγουρα όχι απλούς χαρακτήρες όπως c, d) Page 1 AEM 0001 0002 0003 0004 0005 0006 0007 COMMENTS οριακά -Υπολογίζεις λάθος τα στατιστικά. -Δεν βάζεις τα σχόλια µε βάση τις προδιαγραφές του φυλλαδίου. -Πρόσεξε λίγο την στοίχιση σε κάποια σηµεία. - Τα

Διαβάστε περισσότερα

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

lab6grades - Δεν έχετε δηλώσει το βαθµό βάσης ως σταθερά. - Το µήνυµα εισόδου θέλει χαρακτήρα κενού ' ' στο τέλος και όχι TAB '\t'. 00497 PASS - Τα ονόµατα των µεταβλητών θα µπορούσαν να ήταν λίγο πιο περιγραφικά. - Το µήκος του πίνακα θα έπρεπε να δωθεί ως σταθερά πριν τη main µε την εντολή #define SIZE 5 και όχι ως const. - Πολύ

Διαβάστε περισσότερα

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

lab5 -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο AEM 0001 0002 0003 0004 0005 0006 0007 0008 0009 0012 COMMENTS -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο commenting_standard.pdf.

Διαβάστε περισσότερα

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

Λύσεις για τις ασκήσεις του lab5 Εισαγωγή Λύσεις για τις ασκήσεις του lab5 Επειδή φάνηκε να υπάρχουν αρκετά προβλήματα σχετικά με τον τρόπο σκέψης για την επίλυση των προβλημάτων του lab5, θα συνοδεύσουμε τις λύσεις με αρκετές επεξηγήσεις,

Διαβάστε περισσότερα

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Τετάρτη 7/12/2016, 21:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Τετάρτη 7/12/2016, 21:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2016-2017 Προθεσµία: Τετάρτη 7/12/2016, 21:00 Διαβάστε πριν ξεκινήσετε Διαβάστε όλη την εκφώνηση προσεκτικά πριν ξεκινήσετε να γράφετε κώδικα.

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

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

ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ. 812 PASS Καλή δουλειά ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 812 Καλή δουλειά 887 926 FAIL 1040 FAIL Μη αναγνωρίσιµο φορµατ 1060 1138 FAIL Ηµιτελές - Άσχηµα ονόµατα µεταβλητών/πεδίων που κάνουν δυσνόητο τον κώδικα. Μη χρησιµοποιείτε µεταβλητές

Διαβάστε περισσότερα

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

lab2grades - Στη scanf υπολογίζετε τουλάχιστον 5 χαρακτήρες %5.2f προδιαγραφές που ζητούνται στην εκφώνηση. - Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1375 - Καλή στοίχηση, σωστά ονόµατα µεταβλητών, όµως δεν έχετε δηλώσει ως σταθερές το ΦΠΑ και την τιµή ανά τετραγωνικό µέτρο για τη µοκέτα. - Στη scanf υπολογίζετε τουλάχιστον 5 χαρακτήρες

Διαβάστε περισσότερα

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

Στην clearlist: - Όλα ok. οριακό PASS Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Στη main: - Αποθηκεύετε το αποτέλεσµα της removepart στη µεταβλητή curr, αλλά στην κλήση της clearlist µετά περνάτε την παλιά κεφαλή της λίστας (µεταβλητή list) η οποία δεν είναι πια

Διαβάστε περισσότερα

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

Βαθμός Σχόλιο. lab3_grades Α. Μ. Βαθμός Σχόλιο 1183 1194 - Το πρόγραµµα πέφτει σε ατέρµονο loop γιατί στο while δεν έχει scanf ώστε να διαβάζει νέα επιλογή, η τιµή της επιλογής δε µπορεί να γίνει ποτέ 5 ή 6 για να τερµατίσει. -

Διαβάστε περισσότερα

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

- Σωστή χρήση του προσδιοριστή const για την σταθερά pi. Καλό θα ήταν επιλέξετε κεφαλαία γράµµατα για το όνοµα της σταθεράς. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ - Σωστή χρήση του προσδιοριστή const για την σταθερά p. Καλό θα ήταν επιλέξετε κεφαλαία γράµµατα για το όνοµα της σταθεράς. - Στην printf("enter radius: \n"); ο χαρακτήρας αλλαγής γραµµής

Διαβάστε περισσότερα

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

lab4grades Παρακαλούµε µη γράφετε σχόλια στα ελληνικά! 02103 - Κατα σύµβαση οι σταθερές είναι δηλωµένες µε ΚΕΦΑΛΑΙΑ - Λάθος χρήση της scanf. Το γεγονός ότι η scanf είναι αρκετά "έξυπνη" δεν σηµαίνει ότι το µοτίβο που χρησιµοποιήσατε είναι σωστό. Έπρεπε να

Διαβάστε περισσότερα

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

οριακό PASS 402 PASS Πολύ σωστά, µπράβο οριακό PASS ΑΕΜ ΒΑΘΜΟΣ 357 402 Πολύ σωστά, µπράβο ΣΧΟΛΙΑ Λάθος στον υπολογισµό του πλήθους αστερίσκων. Δε µετράτε αυτούς της "κάτω" σειράς, οπότε το αποτέλεσµα δεν είναι σωστό. Η πράξη που κάνετε στη main είναι λάθος

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις

ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις Με µαύρο τα κοµµάτια από την εκφώνηση. Με µπλε απαντήσεις κι επεξηγήσεις. Με κόκκινο τα πιο συχνά λάθη που είδαµε. Άσκηση Παρασκευής ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις Σε αυτή την άσκηση θα γράψετε ένα πρόγραµµα

Διαβάστε περισσότερα

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

lab7grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 Η strcpy αντιγράφει µια γραµµή, οπότε δεν έπρεπε να βρίσκεται µέσα σε διπλό loop. Η εκτύπωση δεν έπρεπε να βρίσκεται µέσα στο loop που γίνεται η αντιγραφή, αλλά να είναι ανεξάρτητη

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Προθεσµία: 13/1/13, 22:00 Περιεχόµενα Διαδικαστικά Εκφώνηση άσκησης (Στάδιο 0, Στάδιο 1, Στάδιο 2, Στάδιο 3, Στάδιο 4, Στάδιο 5) Οδηγίες

Διαβάστε περισσότερα

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

lab11 - Να εκτυπώνεις πιο κατατοπιστικά µηνύµατα λάθους. Αν είναι όλα ίδια, δεν είναι ξεκάθαρο ποιο αρχείο έχει πρόβληµα. Α. Μ. Βαθμός Σχόλια 1183 FAIL - Πρώτα ελέγχουµε το argc και µετά κάνουµε προσπάθεια να προσπελάσουµε το argv. - Λάθος στην ανάγνωση του πρώτου αρχείου. Κάθε φορά που κάνεις fgetc διαβάζεις τον επόµενο

Διαβάστε περισσότερα

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

Παράδοση άσκησης: Εστάλη με καθυστέρηση. Να μην επαναληφθεί Προσέξτε τις νέες οδηγίες για την ονομασία του φακέλου. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Παράδοση άσκησης: Εστάλη με καθυστέρηση. Να μην επαναληφθεί Προσέξτε τις νέες οδηγίες για την ονομασία του φακέλου. 357 - Σωστά αποτελέσματα - Περιγραφικά ονόματα μεταβλητών. - Δεν έχετε

Διαβάστε περισσότερα

Sheet PASS 1426 PASS 1428 PASS. Page 1

Sheet PASS 1426 PASS 1428 PASS. Page 1 Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ -Δεν εκτελείτε κάποιο loop για το πλήθος των επαναλήψεων που 1413 FAIL θα κληθεί η ανάγνωση και η εγγραφή από το αρχείο. -Το άνοιγµα και κλείσιµο του αρχείου γίνεται σωστά. Έχετε αποστείλει

Διαβάστε περισσότερα

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής Στο εργαστήριο αυτό θα δούμε πώς ορίζονται και πώς χρησιμοποιούνται οι συμβολοσειρές στην C. Επίσης, θα μελετήσουμε κάποιες από τις συναρτήσεις

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

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

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 321 FAIL Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 321 FAIL Άσκηση 1η: - Δεν βάζετε σχόλια στην αρχή του κώδικα - Στοίχιση οκ, τα ονόµατα των µεταβλητών καλό είναι να είναι πιο περιγραφικά - Δεν χρησιµοποιείτε #define για να ορίσετε

Διαβάστε περισσότερα

char name[5]; /* define a string of characters */

char name[5]; /* define a string of characters */ Συµβολοσειρές (Strings) Συµβολοσειρά (string) είναι µια σειρά αλφαριθµητικών χαρακτήρων (γενικά εκτυπώσιµων συµβόλων ASCII). Όταν λέµε σειρά εννοούµε διαδοχικές θέσεις µνήµης που µπορούν να αντιµετωπισθούν

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2013-2014 Προθεσμία: 17/1/14, 22:00 Περιεχόμενα Διαδικαστικά Οδηγίες Αποστολής Εκφώνηση άσκησης (Στάδιο 0, Στάδιο 1, Στάδιο 2, Στάδιο 3, Στάδιο

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2016-2017 Προθεσµία: 22/12/2016, 21:00 Διαδικαστικά Η εργασία αυτή µπορεί να γίνει σε οµάδες µέχρι 2 ατόµων. Δεν είναι απαραίτητο να συνεργαστείτε

Διαβάστε περισσότερα

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

Sheet3_2. Τα literals (3.0, 1.5, κτλ) πρέπει να ορίζονται ως σταθερές. AEM LAB2 0001 Δεν είναι στοιχισµένες σωστά οι εντολές µέσα στη main. 0002 Η απόδειξη εκτυπώνεται όλη σε µία γραµµή, όχι όπως ζητά η εκφώνηση: Να χρησιµοποιείς \n στο printf. 0003 0004 Οι µεταβλητές πρέπει

Διαβάστε περισσότερα

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

Διαβάστε περισσότερα

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας

Διαβάστε περισσότερα

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

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Στόχοι Συµβολοσειρές, πίνακες Πριν ξεκινήσετε Βήµα 1: Πηγαίνετε στο φάκελο ce120 και κατασκευάστε µέσα σε αυτόν ένα φάκελο µε όνοµα

Διαβάστε περισσότερα

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ Επανάληψη για τις Τελικές εξετάσεις (Διάλεξη 24) Εισαγωγή Το μάθημα EPL032 έχει ως βασικό στόχο την επίλυση προβλημάτων πληροφορικής με την χρήση της γλώσσας προγραμματισμού C. Επομένως πρέπει: Nα κατανοήσετε

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

Διαβάστε περισσότερα

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ. οριακό PASS

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ. οριακό PASS Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 321 οριακό 1058 FAIL - Καλή δουλειά γενικά. - Πρόσεχε λίγο τα ονόµατα συναρτήσεων/µεταβλητών. Για παράδειγµα, το όνοµα integer δεν είναι καθόλου καλό γιατί δεν περιγράφει τι κάνει η

Διαβάστε περισσότερα

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1 Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1 Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μνήμη I CS100,

Διαβάστε περισσότερα

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης Η συνάρτηση printf() Η συνάρτηση printf() χρησιμοποιείται για την εμφάνιση δεδομένων στο αρχείο εξόδου stdout (standard output stream), το οποίο εξ ορισμού συνδέεται με την οθόνη Η συνάρτηση printf() δέχεται

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

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

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια: Εργαστήριο 6: 6.1 Δομές Επανάληψης Βρόγχοι (Loops) Όταν θέλουμε να επαναληφθεί μια ομάδα εντολών τη βάζουμε μέσα σε ένα βρόχο επανάληψης. Το αν θα (ξανα)επαναληφθεί η εκτέλεση της ομάδας εντολών καθορίζεται

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό (με. τη C) Υποχρεωτικό Μάθημα 3 ου Εξαμήνου Χειμερινό Εξάμηνο Ακ. Έτους 20 Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Εισαγωγή στον Προγραμματισμό (με τη C) Διδάσκουσα: Φατούρου Παναγιώτα faturu [at] csd.uoc.gr

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

lab3grades - Δεν παραδόθηκε. - Προσπαθήστε να κάνετε την άσκηση στο σπίτι.

lab3grades - Δεν παραδόθηκε. - Προσπαθήστε να κάνετε την άσκηση στο σπίτι. 02103 FAIL προγράµµατος µε κενές γραµµές -Δεν έχετε συµπεριλάβει καθόλου σχόλια!!! -Τα ονόµατα των σταθερών είναι µε ΚΕΦΑΛΑΙΑ. Επίσης, το 20 και το 1000 έπρεπε να είναι αποθηκευµένα σε σταθερές. - Έχετε

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 8: Πίνακες, Αλφαριθμητικά Πίνακες Ο πίνακας είναι μια ειδική δομή για την αποθήκευση μιας σειράς από δεδομένα του ίδιου τύπου. Η δήλωση ενός πίνακα γίνεται όπως για μια

Διαβάστε περισσότερα

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

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ: ΟΝΟΜΑΤΕΠΩΝΥΜΟ: AEM: ΜΕΡΟΣ Α: ΕΡΩΤΗΣΕΙΣ ΠΟΛΛΑΠΛΩΝ ΕΠΙΛΟΓΩΝ [15 µονάδες] ΣΗΜΑΝΤΙΚΕΣ ΔΙΕΥΚΡΙΝΙΣΕΙΣ: Επιλέξτε ΜΙΑ σωστή απάντηση για κάθε ερώτηση. Λάθος απαντήσεις βαθµολογούνται αρνητικά Σε ερωτήσεις που

Διαβάστε περισσότερα

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

Διαβάστε περισσότερα

Επανάληψη για τις Τελικές εξετάσεις

Επανάληψη για τις Τελικές εξετάσεις Επανάληψη για τις Τελικές εξετάσεις ( ιάλεξη 21) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Εισαγωγή Το µάθηµα EPL032 έχει ως βασικό στόχο την επίλυση προβληµάτων πληροφορικής µε την χρήση της γλώσσας προγραµµατισµού

Διαβάστε περισσότερα

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 10/11/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 10/11/2015, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 1 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2015-2016 Προθεσµία: Τρίτη 10/11/2015, 22:00 Διαβάστε πριν ξεκινήσετε Διαβάστε την εκφώνηση προσεκτικά και σχεδιάστε το πρόγραµµά σας στο χαρτί.

Διαβάστε περισσότερα

lab3grades οριακό PASS

lab3grades οριακό PASS ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ - Αποστολή email: διαδικαστικά οκ, αλλά στείλατε την άσκηση µε δέκα λεπτά καθυστέρηση. Στο µέλλον τόσο µεγάλη καθυστέρηση θα είναι λόγος για fail γιατί η άσκηση θα θεωρείται εκπρόθεσµη.

Διαβάστε περισσότερα

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2014-2015 Στόχοι Αναδροµή Σηµείωση: Απαγορεύονται static και global µεταβλητές. Πριν ξεκινήσετε Πηγαίνετε στο φάκελο ce120 και κατασκευάστε µέσα

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59 ΣΕΤ ΑΣΚΗΣΕΩΝ 2 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2009-20010 Προθεσµία: 15/11/09, 23:59 Στόχοι Χρήση συναρτήσεων Χρήση µονοδιάστατων πινάκων Διαχείριση συµβολοσειρών Φορµαρισµένη έξοδος δεδοµένων

Διαβάστε περισσότερα

lab3_all Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ

lab3_all Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1375 1389 1413 - Γράφετε αρκετά καθαρά τον κώδικα, µπράβο! Έχετε δώσει καλά ονόµατα στις µεταβλητές και ορίζετε ως σταθερές τις τιµές ταχυτήτων των κυνηγών - Μετατρέπετε όλο το χρόνο

Διαβάστε περισσότερα

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings) Κεφάλαιο 9.1-9.2 Αλφαριθµητικές Σειρές Χαρακτήρων (Strings) ( ιάλεξη 19) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 1) Strings στη C Ένα string είναι µία ακολουθία αλφαριθµητικών χαρακτήρων, σηµείων στίξης κτλ. Π.χ.

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση με τον ορισμό, τη δήλωση και τη χρήση των χαρακτήρων, συνεπώς και των αλφαριθμητικών, της Γλώσσας

Διαβάστε περισσότερα

Ενδεικτικές λύσεις και στατιστικά

Ενδεικτικές λύσεις και στατιστικά Προγραμματισμός 1 Σύντομο Quiz 25/9/9 Ενδεικτικές λύσεις και στατιστικά Ερώτηση 1: Γράψτε παρακάτω συνάρτηση η οποία δέχεται ως παραμέτρους ένα string και ένα χαρακτήρα και επιστρέφει τον αριθμό των εμφανίσεων

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59 ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010-2011 Προθεσµία: 5/12/10, 23:59 Στόχοι structs Πίνακες Συναρτήσεις Συµβολοσειρές Χρήση µεταβλητών και σταθερών Χρήση τελεστών Χρήση δοµών

Διαβάστε περισσότερα

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

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C Κεφάλαιο 9.1-9.2 Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C Ένα string είναι μία ακολουθία αλφαριθμητικών χαρακτήρων, σημείων στίξης κτλ. Π.χ. Hello How are you? 121212 *Apple#123*%

Διαβάστε περισσότερα

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 2:Αλφαριθμητικές Σειρές Χαρακτήρων (Strings)- Επανάληψη Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγικές Έννοιες σε Strings(Αρχικοποίηση, Ανάγνωση & Εκτύπωση) Πίνακες από Strings

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59 ΣΕΤ ΑΣΚΗΣΕΩΝ 2 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010-2011 Προθεσµία: 15/11/10, 23:59 Στόχοι Πίνακες Συναρτήσεις Συµβολοσειρές Χρήση µεταβλητών και σταθερών Χρήση τελεστών Χρήση δοµών ελέγχου

Διαβάστε περισσότερα

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

Εργαστήριο 5. Εαρινό Εξάμηνο Τομέας Υλικού και Αρχιτεκτονικής Υπολογιστών ΗΥ134 - Εισαγωγή στην Οργάνωση και Σχεδίαση Η/Υ 1 Εργαστήριο 5 Εαρινό Εξάμηνο 2012-2013 Στό χόι τόυ εργαστηρι όυ Χρήση στοίβας Αναδρομή Δομές δεδομένων Δυναμική

Διαβάστε περισσότερα

abistarakis PASS - Σωστή κατασκευή tgz και ονοµασία αρχείων

abistarakis PASS - Σωστή κατασκευή tgz και ονοµασία αρχείων Στις επόµενες σελίδες µπορείτε να δείτε ενδεικτικούς βαθµούς και σχόλια για το lab1. Επειδή αυτό ήταν το πρώτο εργαστήριο, οι βαθµοί δε θα µετρήσουν (δηλαδή όποιος βαθµολογήθηκε µε fail δε θα πάρει απουσία)

Διαβάστε περισσότερα

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής Στο εργαστήριο αυτό θα δούμε πώς ορίζονται και πώς χρησιμοποιούνται οι συμβολοσειρές στην C. Επίσης, θα μελετήσουμε κάποιες από τις συναρτήσεις

Διαβάστε περισσότερα

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

lab5grades Διαδικαστικά: όλα οκ, αλλά καθυστερήσατε στην αποστολή. Να προσέχετε να στέλνετε τις ασκήσεις σας εντός της προθεσµίας. ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Διαδικαστικά: όλα οκ, αλλά καθυστερήσατε στην αποστολή. Να προσέχετε να στέλνετε τις ασκήσεις σας εντός της προθεσµίας. : 449 οριακό - Λάθος στους υπολογισµούς. Σε κάθε µία επανάληψη

Διαβάστε περισσότερα

Ενδεικτική περιγραφή μαθήματος

Ενδεικτική περιγραφή μαθήματος ΜΑΘΗΜΑ: ΔΙΔΑΣΚΩΝ: ΤΜΗΜΑ: Προγραμματισμός Η/Υ Συνδουκάς Δημήτριος Διοίκησης Επιχειρήσεων (Γρεβενά) Ενδεικτική περιγραφή μαθήματος 1. Εισαγωγή: Εισαγωγή στον προγραμματισμό, γλώσσες προγραμματισμού, μεταγλωτιστές.

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δείκτες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Τι είναι ο δείκτης Ένας δείκτης είναι μια μεταβλητή που περιέχει μια διεύθυνση μνήμης. Θυμηθείτε πως

Διαβάστε περισσότερα