ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 Η strcpy αντιγράφει µια γραµµή, οπότε δεν έπρεπε να βρίσκεται µέσα σε διπλό loop. Η εκτύπωση δεν έπρεπε να βρίσκεται µέσα στο loop που γίνεται η αντιγραφή, αλλά να είναι ανεξάρτητη (ώστε να είναι φανερό αν έγινε σωστά η αντιγραφή ή όχι). 451 476 Η strcpy αντιγράφει µια γραµµή, οπότε δεν έπρεπε να βρίσκεται µέσα σε διπλό loop. Η εκτύπωση δεν έπρεπε να βρίσκεται µέσα στο loop που γίνεται η αντιγραφή, αλλά να είναι ανεξάρτητη (ώστε να είναι φανερό αν έγινε σωστά η αντιγραφή ή όχι). - #define: Δε χρησιµοποιείς σχεδόν πουθενά τις τιµές ROWS, COLUMNS αλλά χρησιµοποιείς 10. Αν αλλάξουν τα ROWS, COLUMNS, το πρόγραµµά σου δε θα λειτουργεί. Το 15 έπρεπε επίσης να είναι ορισµένο ως σταθερά. - scanf : σωστή - Στοίχιση: σωστή - Ονόµατα µεταβλητών: οκ, εκτός από το temp. - Έλεγχοι: Λίγο "περίεργος" ο έλεγχος για το µέγεθος, αλλά σωστός. Θα ήταν πιο κοµψή η χρήση strlen. Καλό είναι να αποφεύγεις άσκοπη χρήση flags (όπως το islarge). Δες πώς γίνεται στη λύση. Το loop πρέπει να τερµατίζει αν δοθεί η λέξη "$" αλλά όχι αν δοθεί λέξει που ξεκινά µε δολλάριο. - Λειτουργία: οκ, αλλά δες τα σχόλια για τους ελέγχους. - Εκτύπωση: Σωστή - Δεν έγινε. 486 FAIL Δεν ελήφθη άσκηση 1733 Oριακό Διαδικαστικά: Να προσέχετε όταν κάνετε tar τον φάκελο. -Καλή στοίχιση -Σωστά χρησιµοποιείτε τα defines για τα όρια των loops. -Σωστοί έλεγχοι για την είσοδο.για τον έλεγχο των κεφαλαίων γραµµάτων θα µπορούσατε να χρησιµοποιείτε την isupper() συνάρτηση. - Ο έλεγχος i!=rows δεν είναι λάθος, αλλά συνηθίζεται να γράφουµε i<rows όταν διατρέχουµε πίνακα. -Το πρόγραµµα τερµατίζει σωστά όταν δοθεί $ ή αφαιρεθούν όλα τα γράµµατα. -Σωστό το output του προγράµµατος. -Η άσκηση ήταν ηµιτελής σε αρχικό στάδιο και δεν έκανε compile. -Όταν κάνετε scanf για strings να µην χρησιµποιείτε το %s σκετο. Να βάζετε και τον αριθµό των γραµµάτων που διαβάζετε π.χ. %14s 1756 FAIL Διαδικαστικά: Έκανες απλά copy+paste το πρόγραµµα στο email!! : Δεν κάνει compile. Page 1
1779 Οριακό : - Χρήση #define: ΟΚ - scanf: ΟΚ - Στοίχιση: ΟΚ - Ονόµατα Μεταβλητών: Άσχηµα. Τ σηµαίνει temp? - Χρήση loop: ΟΚ - Έλεγχοι: θα έπρεπε να ήταν if(len>=columns), µην ξεχνάτε και τον χαρακτήρα τερµατισµού! - Τερµατισµός: OK - Προσθήκη λέξης: OK - Εκτύπωση: OK - scanf: Λάθος. Δε χρησιµοποιούµε ΠΟΤΕ σκέτο %s στη scanf. Πάντα προσδιορίζουµε µέγιστο µήκος συµβολοσειράς που θα διαβαστεί. - Σύγκριση συµβολοσειρών: ΟΚ - Ορθότητα element: θα πρέπει να µετράτε από δεξιά προς τα αριστερά! - Ορθότητα copy: Δεν έγινε - Γενικά: Πολύ λίγα σχόλια στο πρόγραµµά σας! 1899 : - Χρήση #define: OK - scanf: OK - Στοίχιση: Kακή στοίχιση στο do - Ονόµατα Μεταβλητών: Μέτρια. Το tmp είναι κακό, και το strwrd είναι σαν πολωνέζικη λέξη. Γιατί όχι word? - Χρήση loop: OK - Έλεγχοι: OK - Τερµατισµός: Θα πρέπει να τερµατίζει µε το $ αλλά το "$abv" είναι έγκυρη λέξη! - Προσθήκη λέξης: ΟΚ - Εκτύπωση: ΟΚ - Γενικά: Κανένα σχόλιο στο πρόγραµµά σας! - scanf: λάθος format, ζητάµε περιορισµούς στο µέγεθος του string που διαβάζεται. - Σύγκριση συµβολοσειρών: ΟΚ - Ορθότητα element: Δεν δουλεύει αρκετά καλά, το y>n θα έπρεπε να αντικατασταθεί από strlen(in1). Δεν υπάρχει δοµή επανάληψης. - Ορθότητα copy: Δεν έγινε Page 2
1900 1901 : - Χρήση #define: OK - scanf: OK - Στοίχιση: Kακή στοίχιση στο do - Ονόµατα Μεταβλητών: Μέτρια. Το tmp είναι κακό, και το strwrd είναι σαν πολωνέζικη λέξη. Γιατί όχι word? - Χρήση loop: OK - Έλεγχοι: OK - Τερµατισµός: Θα πρέπει να τερµατίζει µε το $ αλλά το "$abv" είναι έγκυρη λέξη! - Προσθήκη λέξης: ΟΚ - Εκτύπωση: ΟΚ - Γενικά: Κανένα σχόλιο στο πρόγραµµά σας! - scanf: λάθος format, ζητάµε περιορισµούς στο µέγεθος του string που διαβάζεται. - Σύγκριση συµβολοσειρών: ΟΚ - Ορθότητα element: Δεν δουλεύει αρκετά καλά, το y>n θα έπρεπε να αντικατασταθεί από strlen(in1). Δεν υπάρχει δοµή επανάληψης. - Ορθότητα copy: Δεν έγινε - #define: Σωστή χρήση - scanf : Σωστό - Στοίχιση: Ο κώδικας είναι σωστά στοιχισµένος αλλά τα σχόλια άσχηµα. Πρέπει να στοιχίζονται στην ίδια ευθεία µε τον κώδικα και πάντα να αποφεύγετε να γράφετε πέραν της 80ής στήλης - Ονόµατα µεταβλητών: Μέτρια. Ειδικά το flag δεν είναι καθόλου περιγραφικό και δεν είναι προφανές τι κάνει - Έλεγχοι: Λάθος έλεγχος ορθότητας εισόδου. Δεν είναι δυνατό ένας χαρακτήρας να είναι ταυτόχρονα µικρότερος του 'A' και µεγαλύτερος του 'Z' - Λειτουργία: Το πρόγραµµα λειτουργεί σωστά, αλλά δέχεται βελτίωση στη λογική του. Για κάποιο λόγο έχετε την ανάγνωση του χαρακτήρα και έξω από το loop και µέσα. Γιατί να µη χρησιµοποιήσετε ένα do-while? Η χρήση της flag είναι τελείως περιττή. Προσπαθήστε να το ξαναγράψετε χωρίς αυτή. Στη µεταφορά των χαρακτήρων δε χρειάζεται να γίνει αντιµετάθεση. Έτσι κι αλλιώς, θέλουµε να σβηστεί ο χαρακτήρας που βρέθηκε. Ο έλεγχος if (k==(columns-1)) είναι περιττός. Σε κάθε περίπτωση, ο µόνος τρόπος να βγούµε από το παραπάνω loop είναι όταν το k θα έχει γίνει COLUMNS-1 - Εκτύπωση: Σωστή. - Δεν κάνει compile. Page 3
" lab7grades 1904 η: -Στοίχιση: Χάνει σε κάποια σηµεία η στοίχιση σας. -Σωστή χρήση #define. Τα ονόµατα που έχετε δώσει δεν είναι και τα καλύτερα. Είναι σηµαντικό να δίνετε προσοχή στα ονόµατα που διαλέγετε. Επίσης, έχετε γράψει λάθος τη λέξη character. -Καθόλου σχόλια. -Σωστός έλεγχος εισόδου. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). - Σωστές οι πράξεις που κάνατε. Η λύση σας όµως τρέχει κάθε γραµµή όσες είναι και οι στήλες µε αποτέλεσµα να µην είναι καθόλου αποτελεσµατική. Σκεφτείτε τι θα µπορούσε να είναι σαν βελτίωση. Hint: Κάθε πότε πρέπει να γίνεται ξανά διάτρεξη της ίδιας γραµµής πάνω απο µία φορά και πως µπορεί να γίνει χωρίς επιπλέον επανάληψη. Τέλος, για κάποιο λόγο έχετε µια γραµµή η οποία δεν συνεισφέρει στη λύση σας και το µόνο που κάνει είναι να βάζει ξανά το γράµµα που θέλετε να διώξετε στην επόµενη θέση. Το πρόγραµµα σας πρέπει να τρέχει σωστά και χωρίς αυτή τη γραµµή. η: - Η scanf που χρησιµοποιείτε είναι σωστά ορισµένη. - Επιλογή elements: - Υπάρχει ένα βασικό λάθος που είναι οτι εµφανίζετε το γράµµα απο το string string(βλέπετε τώρα πόσο λάθος είναι το όνοµα που έχετε δώσει) και όχι το γράµµα απο το string που ζητήσατε να σας δώσει ο χρήστης. - Επιλογή catenate: -Διαβάζετε σωστά τα 2 strings αλλά δεν τα ενώνετε σωστά µε την εντολή strcat. Είναι πολύ απλή εντολή και θα µπορούσατε να τη βάλετε µέσα σε ένα printf. - Επιλογή mix: - Δεν έχει υλοποιηθεί. Προσπαθήστε να τελειώσετε σωστά την άσκηση καθώς η χρήση συναρτήσεων για διαχείριση strings θα πρέπει να είναι κάτι το οποίο θα πρέπει να το κάνετε µε ευκολία." Το συµπιεσµένο αρχείο πρέπει να έχει κατάληξη.tgz. 1908 : - Λείπουν τα γενικά σχόλια προγράµµατος. - Για να διαβάσουµε έναν χαρακτήρα µε την scanf(), χρησιµοποιούµε "%c" και όχι "%1s". Το δεύτερο αποθηκεύει ΚΑΙ ένα \0 στο επόµενο byte στη µνήµη εποµένως µπορεί να "σβήσει" κάποια άλλη τιµή µεταβλητής που τυχαίνει να βρίσκεται εκεί. - Η συνθήκη στο 'µεγάλο' while() µπορεί να απλοποιηθεί. Αρκεί να ελέγχετε µόνο εάν ο χαρακτήρας είναι διαφορετικός απο τον '$' από την στιγµή που έχετε σωστό τον έλεγχο εισόδου (εάν δεν είναι '$', τότε είναι σίγουρα κεφαλαίο γράµµα). - Δείτε πως δουλεύει η isupper() και προσπαθήστε να αλλάξετε τον κώδικά σας χρησιµοποιώντας την. - Για τον έλεγχο του πλήθους των στοιχείων που έχουν αποµείνει στον πίνακα µπορείτε να χρησιµοποιήσετε τον πίνακα counter που ήδη κρατάει τον αριθµό των χαρακτήρων ανά γραµµή. - Επίσης το όνοµα counter δεν είναι περιγραφικό, είναι καλύτερο θα ήταν το remaining_characters. - Το πρόγραµµα βγάζει warning για αχρησιµοποίητη µεταβλητή. - Ο έλεγχος για την µεταβλητή position πρέπει να ελέγχει εάν η τιµή είναι µεγαλύτερη ή ίση του 1. Εάν ο χρήστης ζητήσει την θέση 0, τότε το πρόγραµµα θα διαβάσει µια θέση εκτός πίνακα. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Page 4
Διαδικαστικά: ΟΚ 1909 FAIL - Σωστή στοίχιση. - Ανύπαρκτα σχόλια. - Το πρόγραµµα σας αναζητά σωστά το επόµενο στοιχείο για αντικατάσταση, αλλά κατά την αντιγραφή του στοιχείου χάνεται. - Επίσης, στην γραµµή 54 γράφετε array[i][columns]='\0'; πράγµα που δείχνει ότι δεν έχετε κατανοήσει τα όρια των πινάκων. Σε ένα πίνακα µεγέθους Ν τα στοιχεία αριθµούνται από 0 έως N-1. - Δεν κάνει compile. Το συµπιεσµένο αρχείο πρέπει να έχει κατάληξη.tgz. 1910 : - Λείπουν τα γενικά σχόλια προγράµµατος. - Για να διαβάσουµε έναν χαρακτήρα µε την scanf(), χρησιµοποιούµε "%c" και όχι "%1s". Το δεύτερο αποθηκεύει ΚΑΙ ένα \0 στο επόµενο byte στη µνήµη εποµένως µπορεί να "σβήσει" κάποια άλλη τιµή µεταβλητής που τυχαίνει να βρίσκεται εκεί. - Η συνθήκη στο 'µεγάλο' while() µπορεί να απλοποιηθεί. Αρκεί να ελέγχετε µόνο εάν ο χαρακτήρας είναι διαφορετικός απο τον '$' από την στιγµή που έχετε σωστό τον έλεγχο εισόδου (εάν δεν είναι '$', τότε είναι σίγουρα κεφαλαίο γράµµα). - Δείτε πως δουλεύει η isupper() και προσπαθήστε να αλλάξετε τον κώδικά σας χρησιµοποιώντας την. - Για τον έλεγχο του πλήθους των στοιχείων που έχουν αποµείνει στον πίνακα µπορείτε να χρησιµοποιήσετε τον πίνακα counter που ήδη κρατάει τον αριθµό των χαρακτήρων ανά γραµµή. - Επίσης το όνοµα counter δεν είναι περιγραφικό, είναι καλύτερο θα ήταν το remaining_characters. - Το πρόγραµµα βγάζει warning για αχρησιµοποίητη µεταβλητή. - Ο έλεγχος για την µεταβλητή position πρέπει να ελέγχει εάν η τιµή είναι µεγαλύτερη ή ίση του 1. Εάν ο χρήστης ζητήσει την θέση 0, τότε το πρόγραµµα θα διαβάσει µια θέση εκτός πίνακα. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Page 5
1911 Οριακό Διαδικαστικά: ΟΚ - Σωστή στοίχιση. - Ανύπαρκτα σχόλια. - Γραµµή 32, χρησιµοποιείτε τις σταθερές που κάνετε #define όπου είναι δυνατόν. counter = ROWS*COLUMNS. - H επιλογή να βάλετε τη συνθήκη ελέγχου if 2 φορές είναι ανορθόδοξη. Αντιµετωπίζει το πρόβληµα των κολλητών εγγραφών του ίδιου χαρακτήρα αν αυτός εµφανιστεί 2 φορές, αλλά όχι αν εµφανιστεί περισσότερες από δύο φορές. - Η χρήση δεκαεξαδικών κωδικών για τους χαρακτήρες µειώνει αισθητά την αναγνωσιµότητα του προγράµµατος. Κανείς δεν ξέρει απέξω τους κωδικούς. Γιατί δε χρησιµοποιείτε την πιο φυσιολογική αναπαράσταση 'A' κτλ.? - Το πρόγραµµα σας λειτουργεί σωστά. - Το πρόγραµµα κάνει compile µε warnings. - Γραµµή 21. Η συνθήκη στο while() είναι λάθος. Εάν δίνεται σωστό νούµερο το πρόγραµµα δεν βγαίνει ποτέ από το while. - Γραµµή 22. Ο χρήστης ζητά του χαρακτήρες από 1 έως Ν. Εκτυπώνουµε τους χαρακτήρες αφαιρώντας από την θέση input την µονάδα, µιας και η αρίθµηση στον πίνακα είναι 0 έως Ν-1. Page 6
1913 lab7grades -define: στο skeleton είχε οριστεί define 10 για τις γραµµές και τις στήλες του πίνακα άρα µέσα στα for loops έπρεπε να χρησιµοποιήσετε τα ονόµατα row και columns που έχουν γίνει define και όχι τις τιµές τους, επίσης έπρεπε να κάνετε define και το µέγεθος του string -scanf:σωστά χρησιµοποιείτε %14s για την ανάγνωση του string -Στοίχιση:Σωστή, αλλά µην αφήνετε τόσες κενές γραµµές. Το πρόγραµµα δε διαβάζεται εύκολα γιατί δε χωράει µεγάλο µέρος του στην οθόνη. -Ελάχιστα σχόλια -Ονόµατα µεταβλητών: Την επόµενη φορά χρησιµοποιήστε ποιο περιγραφικά ονόµατα γενικά το array και flag δεν είναι περιγραφικά και δεν θεωρούνται καλά ονόµατα -Χρήση loop: Σωστά χρησιµοποιείτε do-while για το εξωτερικό loop -Έλεγχοι: σωστά κάνετε έλεγχο άµα δόθηκε $ αλλά έτσι πως έχετε γράψει τον έλεγχο άµα δοθεί οποιαδήποτε λέξη που περιέχει στην αρχή δολάριο το πρόγραµµα πάλι θα τερµατίζει, σωστά ελέγχετε αν η λέξη σας είναι µεγαλύτερη από τα όρια του διδιάστατου πίνακα αλλά µετά το υλοποιείτε λάθος γράφοντας στο for (j=0;j<leng;j++) αυτό σηµαίνει ότι θα προσπαθήσει να βάλει όλη τη λέξη µέσα στον διδιάστατο πίνακα και θα βγει εκτός ορίων. Το θέµα είναι άµα δεν χωράει η λέξη να µην αντιγράφετε καθόλου στον πίνακα. -scanf: σωστά χρησιµοποιείτε στη πρώτη scanf %29s για την ανάγνωση του string στις υπόλοιπες όµως είναι λάθος να γράφετε απλό %s γιατί άµα εισάγουµε συµβολοσειρά µε περισσότερους από 29 χαρακτήρες θα υπάρξει πρόβληµα καθώς αυτοί θα αποθηκευτούν εκτός ορίων του πίνακα - Σύγκριση συµβολοσειρών (για τις επιλογές): Σωστά χρησιµοποιείτε την strcmp - Ορθότητα element: σωστή αλλά δεν κάνετε τους απαραίτητους ελέγχους άµα δοθεί κάποια τιµή µεγαλύτερη από το µήκος του αλφαριθµητικού ή µικρότερη του 1 - Δεν υλοποιείτε σωστά τη strncpy και στις 2 περιπτώσεις θέλουµε το string2 να αποθηκεύεται στο string1 εσείς στη δεύτερη περίπτωση αντιγράφεται το πρώτο στο δεύτερο. Page 7
lab7grades η: -Στοίχιση: Καλή. -Σωστή χρήση #define. Μπορείτε να προσπαθήσετε και άλλο για τα ονόµατα των µεταβλητών. Θα µπορούσατε να διευκρινίσετε µε ένα καλύτερο όνοµα τι κάνει το flag που έχετε βάλει. Για παράδειγµα, θα µπορούσατε να βάλετε acceptable_char. -Ελλειπή σχόλια καθώς δεν βάλατε τι κάνει το πρόγραµµά σας στην αρχή σαν περιγραφή. -Σωστός ο έλεγχος για την είσοδο που έδωσε ο χρήστης. - Μια παρατήρηση που µπορεί να γίνει είναι ότι κάνετε 2 φορές τη διάτρεξη του πίνακα. Η πρώτη είναι όταν λαµβάνετε ένα γράµµα για να δείτε αν υπάρχει µέσα στον πίνακα και η δεύτερη είναι για να αφαιρέσετε τα γράµµατα απο τον πίνακα. Αυτό έχει σαν αποτέλεσµα να απορρίπτετε γράµµατα τα οποία µπορεί να µην ανήκουν µέσα στον πίνακα αλλά είναι νόµιµα σαν είσοδο. Επίσης, κάνετε έλεγχο ο οποίος δε ζητήθηκε και φορτώνει επιπλέον το πρόγραµµα. Για να ελέγχετε την είσοδο θα µπορούσατε να χρησιµοποιήσετε την συνάρτηση isupper() που συζητήθηκε στο µάθηµα. Αλλάξτε το πρόγραµµα σας για να δουλεύει µε τη συνάρτηση αυτή. Τέλος, θα έπρεπε να ελέγχετε οτι το $ είναι µόνο του όταν το δίνει και όχι απλά η αρχή σε ένα string εισόδου(θα έπρεπε να ελέγχετε οτι ο χρήστης δίνει µοναδικό χαρακτήρα σαν είσοδο). -Σωστές πράξεις, αλλά δεν χρειαζόταν να κάνετε αντιµετάθεση για να σβήνετε τους χαρακτήρες. -Γενικά καλά. 1914 η: - Σωστή η χρήση του scanf για να διαβάζετε τις διάφορες συµβολοσειρές - Στην επιλογή element έχετε κάνει διάφορα λάθη: - Αρχικά ελέγχετε το string str1 για να δείτε αν είναι element αυτό που δίνει ο χρήστης ενώ σε όλα τα υπόλοιπα το έχετε βάλει σωστά. - Δεν ζητάτε να σας δώσει ο χρήστης µια συµβολοσειρά µε αποτέλεσµα να ελέγχετε ένα κενό πινακα(στην πραγµατικότητα έχει σκουπίδια µέσα). - Επίσης εκεί που έχετε βάλει printf για να δώσει ο χρήστης µια συµβολοσειρά εµφανίζετε και τα περιεχόµενα των πινάκων str1 και str2 οι οποίοι σε αυτό το σηµείο δεν είναι αρχικοποιηµένοι. - Με µικρές διορθώσεις µπορείτε να κάνετε το πρόγραµµα για αυτή την περίπτωση να δουλεύει σωστά. - Όταν διαβάζετε και ολοκληρώνετε την εκτέλεση µιας απο τις επιλογές που έχει δώσει ο χρήστης θα πρέπει να µπορούσε να βάζει και άλλη επιλογή γιατί έτσι πως είναι το πρόγραµµα δεν µπορεί να τερµατίσει ποτέ η εκτέλεση. - Σωστή χρήση της strcmp - Σωστή χρήση της strcat - Σε πολλά σηµεία έχετε χρησιµοποιήσει for loops(µε σωστό τρόπο) για να βρείτε το µέγεθος που έχει το string. Την ίδια διαδικασία µπορείτε να την κάνετε και µε την εντολή strlen. - Στη συγχώνευση των strings έχετε χρησιµοποιήσει λάθος συνθήκες στα for loops. Σαν σκέψη είναι σωστή αλλά πρέπει να δείτε λίγο καλύτερα πως θα βάλετε τις συνθήκες. Σε περίπτωση που το ένα string είναι µεγαλύτερο απο το άλλο τότε η λύση σας δεν δουλεύει. -Η στοίχιση σας είχε αρκετά λάθη και ίσως να είναι αυτός ο λόγος που ξεχάσατε πολλά απο τα πράγµατα που προαναφέρθηκαν. Προσπαθείτε να στοιχίζετε τον κώδικα όπως γράφετε το πρόγραµµα και όχι στο τέλος. Προσπαθήστε να διορθώσετε τα λάθη καθώς είστε πολύ κοντά στη σωστή λύση. Page 8
lab7grades 1915 η: -Στοίχιση: Χάνει σε κάποια σηµεία η στοίχιση σας. -Σωστή χρήση #define. Τα ονόµατα που έχετε δώσει δεν είναι και τα καλύτερα. Είναι σηµαντικό να δίνετε προσοχή στα ονόµατα που διαλέγετε. Επίσης, έχετε γράψει λάθος τη λέξη character. -Καθόλου σχόλια. -Σωστός έλεγχος εισόδου. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). - Σωστές οι πράξεις που κάνατε. Η λύση σας όµως τρέχει κάθε γραµµή όσες είναι και οι στήλες µε αποτέλεσµα να µην είναι καθόλου αποτελεσµατική. Σκεφτείτε τι θα µπορούσε να είναι σαν βελτίωση. Hint: Κάθε πότε πρέπει να γίνεται ξανά διάτρεξη της ίδιας γραµµής πάνω απο µία φορά και πως µπορεί να γίνει χωρίς επιπλέον επανάληψη. Τέλος, για κάποιο λόγο έχετε µια γραµµή η οποία δεν συνεισφέρει στη λύση σας και το µόνο που κάνει είναι να βάζει ξανά το γράµµα που θέλετε να διώξετε στην επόµενη θέση. Το πρόγραµµα σας πρέπει να τρέχει σωστά και χωρίς αυτή τη γραµµή. η: - Η scanf που χρησιµοποιείτε είναι σωστά ορισµένη. - Επιλογή elements: - Υπάρχει ένα βασικό λάθος που είναι οτι εµφανίζετε το γράµµα απο το string string(βλέπετε τώρα πόσο λάθος είναι το όνοµα που έχετε δώσει) και όχι το γράµµα απο το string που ζητήσατε να σας δώσει ο χρήστης. - Επιλογή catenate: -Διαβάζετε σωστά τα 2 strings αλλά δεν τα ενώνετε σωστά µε την εντολή strcat. Είναι πολύ απλή εντολή και θα µπορούσατε να τη βάλετε µέσα σε ένα printf. - Επιλογή mix: - Δεν έχει υλοποιηθεί. Προσπαθήστε να τελειώσετε σωστά την άσκηση καθώς η χρήση συναρτήσεων για διαχείριση strings θα πρέπει να είναι κάτι το οποίο θα πρέπει να το κάνετε µε ευκολία. 1916 FAIL Στείλατε το lab6. Διαδικαστικά: 6 λεπτά εκπρόθεσµη. tar.gz αντί για tgz. 1917 : - Χρήση #define: ΟΚ - scanf: ΟΚ - Στοίχιση: Το τελευταίο if έχει πολύ κακή στοίχιση, γενικά βάζετε πολλές αλλαγες γραµµής. Σας έχει ξαναγίνει σύσταση για στοίχιση - ΜΗΝ το αγνοείτε - Ονόµατα Μεταβλητών: πολύ άσχηµα ονόµατα, Κ, flag κτλ. Καλό είναι να έχετε πιο περιγραφικά. - Χρήση loop: ΟΚ - Έλεγχοι: ΟΚ, αλλά να αποφεύγετε άσκοπη χρήση flags, γιατί τείνουν να κάνουν δυσνόητο τον κώδικα. - Τερµατισµός: ΟΚ - Προσθήκη λέξης: ΟΚ - Εκτύπωση: ΟΚ - scanf: Η scanf του oper θα έπρεπε να είναι µέσα στο do! - Σύγκριση συµβολοσειρών: η strcmp επιστρέφει 0 όταν οι συµβολοσειρές είναι ίδιες. Άρα όλα σας τα condition στα if θα έπρεπε να είναι µε! - Ορθότητα element: Νοµίζω θα δούλευε αν είχατε σωστά το if - Ορθότητα catenate/copy: Νοµίζω θα δούλευε αν είχατε σωστά το if - Γενικά: Δεν έχετε κανένα σχόλιο στο πρόγραµµά σας. Page 9
1920 Οριακό η: -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Ελλειπή σχόλια, τι κάνει το πρόγραµµά σας; -Λάθος έλεγχος εισόδου, αν ο χρήστης δώσει 'a' την πρώτη φορά τι γίνεται; Προσπαθήστε να µεταφέρετε την είσοδο σε 1 σηµείο. - Όταν διαβάζουµε χαρακτήρες µε scanf, βάζουµε ένα κενό ανάµεσα στο " και στο %c. - Τι σκοπό εξυπηρετεί το array[w][z-2]='\0'; Σε εκείνο το σηµείο το z είναι ίσο µε COLUMNS, οπότε πάντα κάνετε τον ίδιο χαρακτήρα \0 -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Σωστές πράξεις, αλλά δεν χρειαζόταν να κάνετε αντιµετάθεση για να σβήνετε τους χαρακτήρες. -Γενικά καλά. η: -Το πρόγραµµα δεν έκανε compile, δοκιµάστε να το τελειώσετε. 1921 FAIL : - Χρήση #define: Και το µέγεθος του επιτρεπτού string θα µπορούσε να είναι σταθερά. Εκτός από τις αρχικοποιήσεις και τις δηλώσεις, δεν φαίνεται να χρησιµοποιείτε αλλού τις σταθερές σας. - scanf: ΟΚ - Στοίχιση: ΟΚ - Ονόµατα Μεταβλητών: OK - Χρήση loop: Τα όρια στα loop µπορεί να ξεφεύγουν από το µέγεθος του αλφαριθµητικού που διαβάζεται. - Αποφεύγετε την άσκοπη χρήση flags γιατί τείνουν να κάνουν δυσνόητα τα προγράµµατα. - Έλεγχοι: Στο τελευταίο if Θα έπρεπε να είναι str[0] αντί για str[1] και να βγει το j==1. Αυτό είναι το κυριότερο λάθος του προγράµµατος, διότι έτσι όποια λέξη δεν έχει µέγεθος 1 τότε θα τερµατίζει το loop και θα πηγαίνει το πρόγραµµα στο στάδιο της εκτύπωσης! Επίσης το if θα έπρεπε να είναι έξω από το loop. - Αν δοθεί λέξη µεγαλύτερου µεγέθους το πρόγραµµα πέφτει σε ατέρµονο loop γιατί δεν διαβάζετε νέα λέξη εντός του while οπότε το stop είναι πάντα 0. - Τερµατισµός: Δείτε και παραπάνω για τους ελέγχους. - Προσθήκη λέξης: ΟΚ - Εκτύπωση: Έτσι όπως το κάνατε, θα τύπωνε µια αλλαγή γραµµής µετά από κάθε γράµµα! - Γενικά. Δεν χρησιµοποιείτε συναρτήσεις strings. Θα σας διευκόλυναν αρκετά. Compiler errors Page 10
1922 1925 Οριακό Οριακό lab7grades Διαδικαστικά: Στείλατε χύµα τα αρχεία σας χωρίς να περιέχονται σε φάκελο epwnumo1_aem1_epwnumo2_aem2 - Σωστή στοίχιση. - Ανύπαρκτα σχόλια. - Γραµµές 30,33, 54,57. Ο κωδικός για ανάγνωση χαρακτήρα είναι %c κι όχι %1c - Γραµµές 31, 54. Η συνθήκη είναι λάθος. Δεν υπάρχει χαρακτήρας για τον οποίο ισχύει η συνθήκη (input<'a' && input>'z'). Λόγω αυτής της συνθήκης το πρόγραµµα σας δεν δουλεύει καθόλου. - Κατά την αντιγραφή των στοιχείων, γραµµές 44-47 χρειάζεστε άλλον ένα µετρητή. Ο τρόπος που επιλέγετε είναι λάθος διότι α. η συνθήκη while(j<3) είναι αυθαίρετη β. αλλάζετε τον µετρητή j µέσα στο while µε συνέπεια µετά την έξοδο από το while ο µετρητής να έχει άλλη τιµή από αυτή µε την οποία µπήκε. - Δεν εκτυπώνετε τον πίνακα σε κάθε βήµα, όπως ζητούνταν από την εκφώνηση. - Σωστή στοίχιση. - Ανύπαρκτα σχόλια. - Σωστή χρήση %29s για το διάβασµα ενός strings που να χωράει σε πίνακα 30 χαρακτήρων. - Η γραµµή 54 είναι λάθος µε αποτέλεσµα να µην τρέχει το πρόγραµµα σας 2η επανάληψη. Η σωστή εντολή είναι η παρακάτω printf("operation: "); - Κατά τα άλλα το πρόγραµµα σας δουλέυει σωστά. - Προσπαθήστε να κάνετε την mix στο σπίτι. : - Χρήση #define: το µέγεθος του string γιατί να µην είναι σταθερά; - scanf: ΟΚ - Στοίχιση: Θέλει λίγη προσοχή, τα κενά εµφώλευσης είναι ή παρα πολλά ή πολύ λίγα. Χρειάζεται να είστε συνεπείς σε αυτό. - Ονόµατα Μεταβλητών: ΟΚ - Χρήση loop: ΟΚ - Έλεγχοι: ΟΚ αν και θα µπορούσατε να χρησιµποιήσετε την strcmp - Τερµατισµός: OK - Προσθήκη λέξης: OK - Εκτύπωση: OK - Γενικά: Κανένα σχόλιο στο πρόγραµµά σας! does not compile. Page 11
1926 : - Χρήση #define: OK - scanf: OK - Στοίχιση: OK - Ονόµατα Μεταβλητών: OK - Χρήση loop: OK - Έλεγχοι: OK - Τερµατισµός: OK - Προσθήκη λέξης: OK - Εκτύπωση: OK - Γενικά σχόλια: πολύ καλό παιδιά! - scanf: OK - Σύγκριση συµβολοσειρών: OK - Ορθότητα element: OK - Ορθότητα copy: OK - Γενικά σχόλια: Πολύ ωραία! Λίγο άσχηµα ονόµατα µεταβλητών όµως, πχ c 1927 -Σωστά χρησιµοποιείτε τα define στα for loops -scanf: σωστά χρησιµοποιείτε %14s για την ανάγνωση του string -Στοίχιση: Γενικά καλή σας ξέφυγε σε κάποια σηµεία -Ονόµατα µεταβλητών: Γενικά καλά το array και help δεν θεωρούνται πολύ περιγραφικά -Χρήση loop: Σωστά χρησιµοποιείτε do-while για το εξωτερικό loop -Σωστή χρήση του continue -Σωστά βρίσκετε το µήκος του πίνακα µπορούσατε να κάνετε και χρήση της συνάρτησης strlen, σωστά ελέγχεται το µήκος της λέξης άµα χωράει στον πίνακα. Κάνοντας έλεγχο αν help[0]!='$' να τερµατίσει το πρόγραµµα τότε θα τερµατίζει γενικά άµα δοθεί οποιαδήποτε λέξη που το πρώτο γράµµα της θα είναι $, το ζητούµενο της άσκησης ήτανε να τερµατίζει το πρόγραµµα άµα δίνονταν αποκλειστικά µόνο του το $ -Σωστά γεµίζεται τον πίνακα Άσκηση2 -scanf:σωστά χρησιµοποιείτε στη scanf %29s για την ανάγνωση του string - Σύγκριση συµβολοσειρών (για τις επιλογές): Σωστά χρησιµοποιείται την strcmp, δεν ελέγχετε άµα ο χρήστης ζητήσει κάτι άσχετο από τα ζητούµενα της άσκησης να βγάζει το µήνυµα unrecognizable command. Try again! -Ορθότητα element: σωστή αλλά έχετε λάθος έλεγχο για άµα ο χρήστης ζητήσει κάποια θέση εκτός ορίων του πίνακα. Διαβάστε ξανά πως δουλεύουν τα && και το -Δεν υλοποιείται ακριβώς αυτό που ζητάει η άσκηση διαβάστε τι κάνει η strncpy και σκεφτείτε πως θα µπορούσατε να λύσετε το ζητούµενο της άσκησης Page 12
lab7grades η: -Στοίχιση: Καλή. -Σωστή χρήση #define. Μπορείτε να προσπαθήσετε και άλλο για τα ονόµατα των µεταβλητών. Θα µπορούσατε να διευκρινίσετε µε ένα καλύτερο όνοµα τι κάνει το flag που έχετε βάλει. Για παράδειγµα, θα µπορούσατε να βάλετε acceptable_char. -Ελλειπή σχόλια καθώς δεν βάλατε τι κάνει το πρόγραµµά σας στην αρχή σαν περιγραφή. -Σωστός ο έλεγχος για την είσοδο που έδωσε ο χρήστης. - Μια παρατήρηση που µπορεί να γίνει είναι ότι κάνετε 2 φορές τη διάτρεξη του πίνακα. Η πρώτη είναι όταν λαµβάνετε ένα γράµµα για να δείτε αν υπάρχει µέσα στον πίνακα και η δεύτερη είναι για να αφαιρέσετε τα γράµµατα απο τον πίνακα. Αυτό έχει σαν αποτέλεσµα να απορρίπτετε γράµµατα τα οποία µπορεί να µην ανήκουν µέσα στον πίνακα αλλά είναι νόµιµα σαν είσοδο. Επίσης, κάνετε έλεγχο ο οποίος δε ζητήθηκε και φορτώνει επιπλέον το πρόγραµµα. Για να ελέγχετε την είσοδο θα µπορούσατε να χρησιµοποιήσετε την συνάρτηση isupper() που συζητήθηκε στο µάθηµα. Αλλάξτε το πρόγραµµα σας για να δουλεύει µε τη συνάρτηση αυτή. Τέλος, θα έπρεπε να ελέγχετε οτι το $ είναι µόνο του όταν το δίνει και όχι απλά η αρχή σε ένα string εισόδου(θα έπρεπε να ελέγχετε οτι ο χρήστης δίνει µοναδικό χαρακτήρα σαν είσοδο). -Σωστές πράξεις, αλλά δεν χρειαζόταν να κάνετε αντιµετάθεση για να σβήνετε τους χαρακτήρες. -Γενικά καλά. 1928 η: - Σωστή η χρήση του scanf για να διαβάζετε τις διάφορες συµβολοσειρές - Στην επιλογή element έχετε κάνει διάφορα λάθη: - Αρχικά ελέγχετε το string str1 για να δείτε αν είναι element αυτό που δίνει ο χρήστης ενώ σε όλα τα υπόλοιπα το έχετε βάλει σωστά. - Δεν ζητάτε να σας δώσει ο χρήστης µια συµβολοσειρά µε αποτέλεσµα να ελέγχετε ένα κενό πινακα(στην πραγµατικότητα έχει σκουπίδια µέσα). - Επίσης εκεί που έχετε βάλει printf για να δώσει ο χρήστης µια συµβολοσειρά εµφανίζετε και τα περιεχόµενα των πινάκων str1 και str2 οι οποίοι σε αυτό το σηµείο δεν είναι αρχικοποιηµένοι. - Με µικρές διορθώσεις µπορείτε να κάνετε το πρόγραµµα για αυτή την περίπτωση να δουλεύει σωστά. - Όταν διαβάζετε και ολοκληρώνετε την εκτέλεση µιας απο τις επιλογές που έχει δώσει ο χρήστης θα πρέπει να µπορούσε να βάζει και άλλη επιλογή γιατί έτσι πως είναι το πρόγραµµα δεν µπορεί να τερµατίσει ποτέ η εκτέλεση. - Σωστή χρήση της strcmp - Σωστή χρήση της strcat - Σε πολλά σηµεία έχετε χρησιµοποιήσει for loops(µε σωστό τρόπο) για να βρείτε το µέγεθος που έχει το string. Την ίδια διαδικασία µπορείτε να την κάνετε και µε την εντολή strlen. - Στη συγχώνευση των strings έχετε χρησιµοποιήσει λάθος συνθήκες στα for loops. Σαν σκέψη είναι σωστή αλλά πρέπει να δείτε λίγο καλύτερα πως θα βάλετε τις συνθήκες. Σε περίπτωση που το ένα string είναι µεγαλύτερο απο το άλλο τότε η λύση σας δεν δουλεύει. -Η στοίχιση σας είχε αρκετά λάθη και ίσως να είναι αυτός ο λόγος που ξεχάσατε πολλά απο τα πράγµατα που προαναφέρθηκαν. Προσπαθείτε να στοιχίζετε τον κώδικα όπως γράφετε το πρόγραµµα και όχι στο τέλος. Προσπαθήστε να διορθώσετε τα λάθη καθώς είστε πολύ κοντά στη σωστή λύση. Page 13
Διαδικαστικά: ΟΚ 1929 FAIL - Ελάχιστα σχόλια. - Η µεταβλητή g έπρεπε να έχει πιο περιγραφικό όνοµα - Λάθος στοίχιση στις γραµµές 50-58. - Οι έλεγχοι στις συνθήκες ελέγχου και ανακύκλωσης είναι λάθος. Το πρόγραµµα δεν δουλεύει σωστά. Για παράδειγµα, η συνθήκη στο do-while έπρεπε να είναι count!= 0 ή count > 0 - Γίνεται προσπέλαση εκτός ορίων πίνακα (όταν το j είναι COLUMNS-1 το array[i+1][j+1] θα είναι array[i+1][columns] - Κάνει compile µε warnings. - Πολύ λάθος στοίχιση! - Γραµµές 14 και 27. Δεν µπορούµε να ελέγξουµε την ισότητα δύο αλφαριθµητικών µε τον τελεστή ==. Χρησιµοποιήστε τη συνάρτηση strcmp. Τα απλά εισαγωγικά ' ' µπορούν να περιέχουν χαρακτήρες και όχι αλφαριθµητικό. Το αλφαριθµητικό περιέχεται σε διπλά εισαγωγικά. - Γραµµή 20. Λάθος έλεγχος των ορίων του pos. Το σωστό είναι (position>lenght position<1) - Γραµµή 25. Λάθος επιλογή θέσης χαρακτήρα. Η σωστή θέση είναι string[position-1] - Η λογική υλοποίησης της συνάρτησης catenate είναι εντελώς λάθος. 1931 FAIL Στείλατε το lab6. 1932 Διαδικαστικά:ΟΚ -Καλή στοίχιση. -Δεν έχετε καθόλου σχόλια. -Σωστά χρησιµοποιείτε τα defines για τα όρια των loops. -Σωστός έλεγχος για unacceptable characters. Για τον έλεγχο για τα κεφαλαία γράµµατα θα µπορούσατε να χρησιµοποιήσετε την συνάρτηση isupper(). -Σωστά τερµατίζει το πρόγραµµα µε το $. -Το output του προγράµµατος είναι σωστό. -Το πρόγραµµά σας έχει ένα bug. Δεν κάνετε σωστά τα shift και την προσθήκη του \0 και εµφανίζονται κάποιοι χαρακτήρες της κάτω γραµµής στην πάνω. Επίσης βγαίνει στο τέλος του πίνακα ένας χαρακτήρας σκουπίδι. Ένα σοβαρό λάθος είναι η ανάθεση στο array[i] [COLUMNS] το οποίο βρίσκεται εκτός των ορίων της γραµµής i (και κατ'επέκταση του πίνακα). Επίσης ξαναβγαίνετε εκτός των ορίων του πίνακα στο for ακριβώς πάνω από αυτή τη γραµµή. Κάνετε προσπέλαση του array[i][a+1] αλλά όταν το a γίνει ίσο µε COLUMNS-1 τότε πάει στο array[i][columns]. - Η χρήση while δεν είναι κατάλληλη. Θα έπρεπε να χρησιµοποιούσατε do-while και να µην έχετε την εισαγωγή δεδοµένων σε δύο σηµεία. -Πάρα πολλά warning στο compilation -To πρόγραµµα δεν κάνει τίποτα. -Προσπαθείτε να κάνετε σύγκριση µεταξύ 2 strings χρησιµοποιώντας το ==, πράγµα που είναι λάθος. Για να γίνει σύγκριση 2 strings πρέπει να γίνει µε την χρήση συναρτήσεων για τα strings (strcmp) Page 14
1934 η: -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Καλά σχόλια. -Λάθος έλεγχος εισόδου, προσπαθήστε να µεταφέρετε την είσοδο ώστε να γίνεται στην κύρια επανάληψη -Σωστές πράξεις, αλλά δεν χρειαζόταν να κάνετε αντιµετάθεση για να σβήνετε τους χαρακτήρες. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Πολύ καλή δουλειά. 1935 η: -Λάθος στοίχιση, προσέξτε το. -Δεν χρειαζόταν να κάνετε έλεγχο εισόδου 2 φορές, σκεφτείτε µια λύση µε if()/else -Κάνετε χρήση της strncat(),strncpy() -Ο έλεγχος για το µέγεθος του τελικού αποτελέσµατος πρέπει να γίνει πριν κάνετε την συνένωση. -Γενικά, καλά. η: - Στοίχιση: Καλή. - Καλά ονόµατα µεταβλητών και σωστή χρήση #define. - Ελλειπή σχόλια, τι κάνει το πρόγραµµά σας; - Σχεδόν σωστός έλεγχος εισόδου. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). - Οι πράξεις σας δεν είναι σωστές. Δεν κάνετε σωστά την αντιµετάθεση καθώς έχετε µπερδέψει τα j, k µε αποτέλεσµα να µην γίνεται σωστά η αντικατάσταση των γραµµάτων. Το array[i][j]=array[i][j+1] συνεπώς είναι λάθος. Μπορείτε να δείτε πως θα έπρεπε να ήταν το σωστό µε τη χρήση του k αντι για το j; Επίσης, δεν θα το θεωρήσουµε λάθος αλλά δείτε πως θα µπορούσατε να κάνετε τη λύση σας µε τέτοιο τρόπο έτσι ώστε να διαγράφει όλα τα ίδια γράµµατα που είναι το ένα δίπλα στο άλλο. - Αν τα j, k ήταν σωστά, θα κάνατε προσπέλαση εκτός των ορίων µιας γραµµής του πίνακα. Όταν το k (ουσιαστικά το j) είναι ίσο µε COLUMNS-1 το array[i][j+1] γίνεται array[i][columns] η: - Δεν κάνει compile. Προσπαθείστε να την ολοκληρώσετε και να είστε εξικοιωµένοι µε τις συναρτήσεις που κάνουν πράξεις πάνω σε strings όπως strcpy, srcmp, strlen και ότι άλλες υπάρχουν στις διαφάνειες καθώς θα τις χρειαστείτε στη συνέχεια. Page 15
Διαδικαστικά: Λάθος όνοµα αρχείου. 1936 -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Ελλειπή σχόλια. -Σωστή είσοδος. -Σωστές πράξεις. - Ο κώδικας στις γραµµές 52-54 δε θα εκτελεστεί ποτέ, γιατί σε εκείνο το σηµείο το k θα είναι πάντα ίσο µε COLUMNS (γιατί όταν γίνει ίσο µε COLUMN θα γινει για πρώτη φορά false η συνθήκη του παραπάνω for) -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Πολύ καλή δουλειά. η: -Εφόσον επιλέξατε να βάλετε τις διαφορετικές εισόδους σε πίνακα έπρεπε να τις ορίσετε σαν σταθερές και να τα αντίστοιχα ονόµατα να είναι µε κεφαλαία γράµµατα. -Δεν χρειαζόταν να κάνετε έλεγχο εισόδου 2 φορές, σκεφτείτε µια λύση µε if()/else -Κάνετε χρήση της strncat(),strncpy() -Ο έλεγχος για το µέγεθος του τελικού αποτελέσµατος πρέπει να γίνει πριν κάνετε την συνένωση. -Γενικά, καλά. 1940 FAIL -define: σωστά κάνετε define τα ονόµατα row columns και size αλλά δεν τα χρησιµοποιείτε όλα µέσα στα for loops -scanf: Στη scanf έπρεπε να γράφατε %14s για να διαβάσουµε το πολύ 14 χαρακτήρες εκτός από το /0 που θα αποθηκευτεί ως τελευταίος χαρακτήρας της συµβολοσειράς, είναι λάθος να γράφετε απλό %s γιατί άµα εισάγουµε συµβολοσειρά µε περισσότερους από 14 χαρακτήρες θα υπάρξει πρόβληµα καθώς αυτοί θα αποθηκευτούν εκτός ορίων του πίνακα -Στοίχιση: Καθόλου καλή -Ονόµατα µεταβλητών: Την επόµενη φορά προσπαθήστε να χρησιµοποιείτε πιο περιγραφικά ονόµατα γενικά το array και str δεν είναι περιγραφικά και δεν θεωρούνται καλά ονόµατα -Χρήση loop: Δεν χρησιµοποιείτε κάποιο while, do-while για το εξωτερικό loop -Έλεγχοι: σωστά πάτε να ελέγξετε άµα δόθηκε $ αλλά έτσι πως έχετε γράψει τον έλεγχο άµα δοθεί οποιαδήποτε λέξη που περιέχει στην αρχή δολάριο το πρόγραµµα πάλι θα τερµατίζει, δεν γεµίζετε σωστά τον πίνακα, δεν αντιγράφεται σωστά το string στον πίνακα. Δεν κάνετε έλεγχο να µπαίνουν µόνο γράµµατα από Α έως Ζ και όχι άλλοι χαρακτήρες. Δεν κάνετε σωστό έλεγχο για το µέγεθος του string δεν λαµβάνετε υπόψη τον χαρακτήρα /0 που αποθηκεύεται στο τέλος του string το strlen επιστρέφει το µέγεθος του string χωρίς το /0 -Δεν υλοποιείτε σωστά τη βασική λειτουργία της προσθήκης λέξεις στον πίνακα -Δεν εκτυπώνετε τον πίνακα Δεν έγινε Page 16
Διαδικαστικά: ΟΚ 1942 FAIL - Σωστή στοίχιση. - Ανύπαρκτα σχόλια. - Το πρόγραµµα σας αναζητά σωστά το επόµενο στοιχείο για αντικατάσταση, αλλά κατά την αντιγραφή του στοιχείου χάνεται. - Επίσης, στην γραµµή 54 γράφετε array[i][columns]='\0'; πράγµα που δείχνει ότι δεν έχετε κατανοήσει τα όρια των πινάκων. Σε ένα πίνακα µεγέθους Ν τα στοιχεία αριθµούνται από 0 έως N-1. - Δεν κάνει compile. 1946 η: -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Ελλειπή σχόλια, τι κάνει το πρόγραµµά σας; - Σωστός έλεγχος εισόδου. Το λάθος που έχετε κάνει είναι οτι στην scanf που έχετε βάλει µέσα στις επαναλήψεις θα πρέπει να έχει ένα κενό πριν το %c (θα πρέπει να είναι scanf( %c )). Ο λόγος είναι οτι κάθε φορά που βάζετε ένα γράµµα πατάτε και το enter το οποίο είναι ένας έξτρα ειδικός χαρακτήρας. Διαβάζεται το πρώτο γράµµα αλλά το enter µένει στη µνήµη µε αποτέλεσµα στην επόµενη επανάληψη να το διαβάζει χωρίς να το δώσετε εσείς και να το θεωρεί λανθασµένο χαρακτήρα. Προσέξτε το την επόµενη φορά ή χρησιµοποιήστε το getchar() για να είστε πιο ασφαλείς. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Σωστές πράξεις. Δεν θα το θεωρήσουµε λάθος αλλά δείτε πως θα µπορούσατε να κάνετε τη λύση σας µε τέτοιο τρόπο έτσι ώστε να διαγράφει όλα τα ίδια γράµµατα που είναι το ένα δίπλα στο άλλο. η: -Εντυπωσιακή η χρήση του sprintf σε αυτό το στάδιο για να φτιάξετε ένα string το οποίο θα διαβάζει το σωστό αριθµό γραµµάτων για κάθε µέγεθος πίνακα! - Για τις περιπτώσεις element και catenate το πρόγραµµά σας λειτουργεί σωστά. Δεν έχετε υλοποιήσει τις υπόλοιπες δυνατότητες. Επίσης, θα έπρεπε να µην τελειώνει το πρόγραµµα σας µέχρι να το ζητήσει ο χρήστης. - Έχετε χρησιµοποιήσει έναν δείκτη για να βάλετε το περιεχόµενο που επιστρέφει η strcat. Δεν χρειαζόταν να τον χρησιµοποιήσετε το δείκτη καθώς αν δείτε την διατύπωση της εντολής αυτό που κάνει είναι να βάζει το αποτέλεσµα στη θέση του πρώτου string που δίνετε σαν όρισµα. Με λίγα λόγια ορίζεται σαν strcat(destination, source). Φυσικά και αυτό που έχετε κάνει δεν είναι λάθος αλλά δεν χρειαζόταν. - Γενικά καλή δουλειά Page 17
1947 Οριακό : - Δεν χρησιµοποιείτε τα #defines στα loops.( θα έπρεπε len > ROWS - 1 αντί για hardcoded if (len+1>=11) - Σωστή χρήση του %14s στην scanf. - Χρησιµοποιήστε πιο περιγραφικά ονόµατα στις µεταβλητές σας. - Σωστά χρησιµοποιείτε do-while και for loops. - Προσέξτε την στοίχισή σας, έχετε πολλές κένες γραµµές και παράξενα άγκιστρα. - Σωστός αλγόριθµος της βασικής λειτουργίας. - Σχεδον σωστοί έλεγχοι. Ο αλγόριθµος δεν τερµατίζει αν γεµίσουν οι γραµµές του πίνακα. - Δεν κάνει compile το πρόγραµµα σας. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. (ο κώδικας σας, δείχνει οτι έχετε καταλάβει τα ζητούµενα) : 1949 - Καλή δουλειά! - Δεν χρησιµοποιείτε τα #defines στα loops.( θα έπρεπε ROWS - 1 αντί για hardcoded 9) - Στην scanf χρειάζεται %14s και όχι %9s, µιας και αναφέρεστε στον πίνακα char word[15]. - Σωστά χρησιµοποιείτε do-while και for loops. - Σωστός αλγόριθµος της βασικής λειτουργίας. - Σχεδον σωστοί έλεγχοι. Εφόσον έχετε %9s στην scanf, το while (len>9) θα είναι πάντα false. Δείτε το στο σπίτι. 1950 - Καλή προσπάθεια! - Σωστή χρήση της strcmp για τα strings εισόδου. - Σωστή χρήση του %29s. - Σχεδόν σωστή υλοποίηση της element. Τα εκτυπώνετε ανάποδα δηλαδή, Ν-οστή θέση αντί για 1η. - Σωστή χρήση της strcpy στην copy λειτουργία. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Αποστολή ΟΚ : - Καθόλου σχόλια! - Ο βρόχος do {} while (); που µετακινεί τα επόµενα στοιχεία του πίνακα δεξιότερα, έπρεπε να γραφτεί κάνοντας πρώτα έλεγχο και µετά µετακίνηση (δηλαδή µε while () {}). Εάν σβήνουµε τον τελευταίο χαρακτήρα της γραµµής (k=j=columns - 1), τότε η πρώτη επανάληψη θα διαβάσει το στοιχείο k+1 που είτε ανήκει στην επόµενη γραµµή είτε είναι εκτός του πίνακα. Η ανάθεση του '\0' µετά τον βρόχο κρύβει την προσπέλαση εκτός ορίων αλλα δεν την διορθώνει! - Επίσης ο 'µεγάλος' βρόχος do {} while (); πρέπει να αλλάξει σε while () {}. Εάν ο χρήστης δώσει σαν πρώτη είσοδο το '$', το πρόγραµµα τρέχει µια επανάληψη πριν τερµατίσει. - Δεν κανει compile. Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Page 18
1955 Οριακό Διαδικαστικά: ΟΚ - Σωστή στοίχιση. - Αρκετά σχόλια. Λείπει η περιγραφή του προγράµµατος στην αρχή. - Η αντιµετάθεση που κάνετε στις γραµµές 49-52 δεν είναι σωστή και δεν τεκµηριώνεται από τα σχόλια. Σε αρκετές περιπτώσεις το πρόγραµµα σας δουλεύει, αλλά σε άλλες βγάζει λάθη. - Το for() στην γραµµή 48 κάνει σε κάθε ανακύκλωση το ίδιο πράγµα. Συνεπώς είναι περιττό. - Σωστή στοίχιση - Γραµµή 54. Η συνθήκη στο while είναι λάθος. Θα έπρεπε να είναι η αντίστροφη. - element: Tα όρια που προσδιορίζει ο χρήστης είναι από 1 έως Ν και ο πίνακας έχει θέσεις από 0 έως Ν-1. Εσείς δέχεστε τιµες από 0 έως Ν που βγαίνουν εκτός ορίων του πίνακα. - Η catenate είναι λάθος και δεν εκτυπώνει κανένα αποτέλεσµα. 1956 FAIL : - Χρήση #define: Και το µέγεθος του επιτρεπτού string θα µπορούσε να είναι σταθερά. Εκτός από τις αρχικοποιήσεις και τις δηλώσεις, δεν φαίνεται να χρησιµποιείτε αλλού τις σταθερές σας. - scanf: ΟΚ - Στοίχιση: ΟΚ - Ονόµατα Μεταβλητών: OK - Χρήση loop: Τα όρια στα loop µπορεί να ξεφεύγουν από το µέγεθος του αλφαριθµητικού που διαβάζεται. - Έλεγχοι: Στο τελευταίο if Θα έπρεπε να είναι str[0] αντί για str[1] και να βγει το j==1. Αυτό είναι το κυριότερο λάθος του προγράµµατος, διότι έτσι όποια λέξη δεν έχει µέγεθος 1 τότε θα τερµατίζει το loop και θα πηγαίνει το πρόγραµµα στο στάδιο της εκτύπωσης! Επίσης το if θα έπρεπε να είναι έξω από το loop. - Τερµατισµός: Δείτε και παραπάνω για τους ελέγχους. - Προσθήκη λέξης: ΟΚ - Εκτύπωση: Έτσι όπως το κάνατε, θα τύπωνε µια αλλαγή γραµµής µετά από κάθε γράµµα! Έτ - Γενικά. Δεν χρησιµοποιείται συναρτήσεις strings. Γιατί; Compiler errors Αποστολή ΟΚ 1957 FAIL : - Καθόλου σχόλια! - Δεν έχετε υλοποιήσει τα ζητούµενα της άσκησης. - Δεν στάλθηκε. Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Page 19
1959 Οριακό : - Χρήση #define: ΟΚ - scanf: ΟΚ - Στοίχιση: ΟΚ - Ονόµατα Μεταβλητών: Άσχηµα. Τ σηµαίνει temp? - Χρήση loop: ΟΚ - Έλεγχοι: θα έπρεπε να ήταν if(len>=columns), µην ξεχνάτε και τον χαρακτήρα τερµατισµού! - Τερµατισµός: OK - Προσθήκη λέξης: OK - Εκτύπωση: OK - scanf: Λάθος. Δε χρησιµοποιούµε ΠΟΤΕ σκέτο %s στη scanf. Πάντα προσδιορίζουµε µέγιστο µήκος συµβολοσειράς που θα διαβαστεί. - Σύγκριση συµβολοσειρών: ΟΚ - Ορθότητα element: θα πρέπει να µετράτε από δεξιά προς τα αριστερά! - Ορθότητα copy: Δεν έγινε - Γενικά: Πολύ λίγα σχόλια στο πρόγραµµά σας! 1960 η: -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Ελλειπή σχόλια, τι κάνει το πρόγραµµά σας; -Σωστός έλεγχος εισόδου. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Σωστές πράξεις, αλλά δεν χρειαζόταν να κάνετε αντιµετάθεση για να σβήνετε τους χαρακτήρες. -Διαβάζετε κι ελέγχετε την είσοδο από το χρήστη σε δύο σηµεία. Καλό θα ήταν να είχατε χρησιµοποιήσει do-while για να αποφύγετε κάτι τέτοιο. η: -Στοίχιση: Καλή -Καλά ονόµατα µεταβλητών, αλλά έχετε λάθος µεγέθη για τους πίνακες. -Σωστό φίλτρο εισόδου. -Σωστές πράξεις. -Πολύ καλή δουλειά. Page 20
Διαδικαστικά: Δεν έχετε σωστό όνοµα αρχείου, προσέξτε το. 1961 FAIL η: -Δεν παραδίδουµε άσκηση που έχει warning, για τις ανάγκες του µαθήµατος θεωρείστε πως κάθε warning ισοδυναµεί µε error. Πολλές φορές ένα warning κρύβει από πίσω του κάποιο σοβαρό λογικό/συντακτικό λάθος. -Πολλές κενές γραµµές χωρίς λόγο στο κείµενο, και άσχηµη στοίχιση. Προσέξτε το. -Λάθος έλεγχος εισόδου. Δεν είναι δυνατό το γράµµα να είναι ταυτόχρονα µεγαλύτερο του 'Ζ' και µικρότερο του 'Α'. - Όταν διαβάζετε χαρακτήρα µε scanf να βάζετε ένα κενό ανάµεσα στο " και στο %c - Αλλάζετε το j δύο φορές µέσα στο loop που κάνει τη µεταφορά. Γιατί? - Έπρεπε να εκτυπώνετε τα στοιχεία του πίνακα µετά την ολοκλήρωση της µεταφοράς σε κάθε επανάληψη. Με το να εκτυπώνετε ένα-ένα χαρακτήρα στο σηµείο που το κάνετε, δεν συνειδητοποιείτε ότι τελικά το πρόγραµµα δε λειτουργεί σωστά. Δοκιµάστε να βάλετε ένα loop που εκτυπωνει τον πίνακα µετά τη γραµµή 53 και θα δείτε τι τελικά περιέχει ο πίνακας. - Το while(j==columns) θα προκαλέσει ατέρµονο loop γιατί δεν αλλάζει το j µέσα σε αυτό. Ο µόνος λόγος που φαίνεται να λειτουργεί είναι επειδή το j δεν πρόκειται να έχει ποτέ την τιµή COLUMNS σε αυτό το σηµείο. -Κάντε την άσκηση στο σπίτι σας, δεν φαίνεστε εξοικειωµένοι µε την C. 1962 Οριακό η: -Κάντε την άσκηση στο σπίτι. Διαδικαστικά:ΟΚ -Καλή στοίχιση -Σωστά χρησιµοποείτε τα define για τα όρια των loops -Σωστο output του προγράµµατος. -Σωστά κάνετε έλεγχο για τα κεφαλαία γράµµατα.(θα µπορούσατε να χρησιµοποιείτε και την συνάρτηση isupper() για αυτό τον έλεγχο.) -Γινονται σωστοί έλεγχοι για τις υπόλοιπες περιπτώσεις εισόδου. - Προσοχή στα όρια των loops: Όταν το k πάρει τιµή COLUMNS-1 τότε το array[i][k+1] θα είναι array[i][columns] το οποίο είναι εκτός ορίων γραµµής (και κατ'επέκταση πίνακα). - Λάθος η χρήση while σε αυτή την άσκηση. Το πιο σωστό θα ήταν do-while για να αποφύγετε να κάνετε παρόµοια είσοδο δεδοµένων σε δύο σηµεία. -Το πρόγραµµά σας δουλεύει σωστά ΑΛΛΑ όχι για όλους τους χαρακτήρες (Δεν τερµατίζει όταν αφαιρεθούν όλοι οι χαρακτήρες απο τον πίνακα). Τερµατίζει είτε µε το $ είτε αν δοθούν καποιοι χαρακτήρες προς αφαίρεση. (Συνήθως 5 ήταν αυτός ο αριθµός.) Αφαιρείτε πολλαπλές φορές από το πλήθος γραµµάτων. -Δεν στάλθηκε.προσπαθήστε την στο σπίτι για εξάσκηση. 1964 FAIL Στείλατε το lab6. Page 21
: 1965 - Καλή δουλειά! - Δεν χρησιµοποιείτε τα #defines στα loops.( θα έπρεπε ROWS - 1 αντί για hardcoded 9) - Στην scanf χρειάζεται %14s και όχι %9s, µιας και αναφέρεστε στον πίνακα char word[15]. - Σωστά χρησιµοποιείτε do-while και for loops. - Σωστός αλγόριθµος της βασικής λειτουργίας. - Σχεδον σωστοί έλεγχοι. Εφόσον έχετε %9s στην scanf, το while (len>9) θα είναι πάντα false. Δείτε το στο σπίτι. - Καλή προσπάθεια! - Σωστή χρήση της strcmp για τα strings εισόδου. - Σωστή χρήση του %29s. - Σχεδόν σωστή υλοποίηση της element. Τα εκτυπώνετε ανάποδα δηλαδή, Ν-οστή θέση αντί για 1η. - Σωστή χρήση της strcpy στην copy λειτουργία. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. Αποστολή ΟΚ 1968 FAIL : - Καθόλου σχόλια! - Ατέρµων βρόχος, εάν ο χρήστης δώσει έγκυρο χαρακτήρα εισόδου, το πρόγραµµα δεν ζητάει νέο χαρακτήρα. - Μετά το σβήσιµο του χαρακτήρα, οι επόµενοι χαρακτήρες δεν µετακινούνται δεξιότερα. - Η εκτύπωση έπρεπε να γίνεται µετά την ολοκλήρωση του σβησίµατος του χαρακτήρα - Όταν διαβάζετε χαρακτήρα µε scanf, να βάζετε ένα κενό ανάµεσα στο " και στο %c - Δεν στάλθηκε. Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. 1973 -Σωστά χρησιµοποιείτε τα define στα for loops -scanf:σωστά χρησιµοποιείτε %14s για την ανάγνωση του string -Στοίχιση: Γενικά καλή -Οι δηλώσεις γίνονται στην αρχή του προγράµµατος και όχι στη µέση -Ονόµατα µεταβλητών: Γενικά καλά το flag δεν θεωρείται περιγραφικό όνοµα -Χρήση loop: Σωστά χρησιµοποιείτε do-while για το εξωτερικό loop -Το εξωτερικό for δεν χρειάζονταν αλλά µάλλον σας ξέφυγε από τα σχόλια -Σωστή χρήση break και continue -Σωστά ελέγχετε το µήκος της λέξης άµα χωράει στον πίνακα, σωστά ελέγχετε αν δοθεί µόνο $ να τερµατίζεται το πρόγραµµα, δεν έχετε πουθενά έλεγχο έτσι ώστε να γίνονται δεκτοί µόνο λέξεις αποτελούµενες από χαρακτήρες από Α-Ζ -Σωστά γεµίζεται τον πίνακα Άσκηση2 -scanf: σωστά χρησιµοποιείτε στη scanf %29s για την ανάγνωση του string - Σύγκριση συµβολοσειρών (για τις επιλογές): Σωστά χρησιµοποιείτε την strcmp - Ορθότητα element: σωστή αλλά στον έλεγχο άµα δοθεί θέση εκτός ορίων δεν έπρεπε να βάλετε µεγαλύτερο του 29 αλλά το µήκους κάθε φορά της λέξης που δίνετε, µπορούσατε ναχρησιµοποιήσετε την strlen - Δεν υλοποιείται ακριβώς αυτό που ζητάει η άσκηση διαβάστε τι κάνει η strncpy και προσπαθήστε να σκεφτείτε πως θα µπορούσατε να λύσετε το ζητούµενο της άσκησης Page 22
1975 1980 Οριακό Οριακό lab7grades Διαδικαστικά:ΟΚ -Καλή στοίχιση -Σωστά χρησιµοποιείτε τις defined τιµές για τα όρια των loops. -Δεν είναι σωστοί οι έλεγχοι για unacceptable τιµές. Μπαίνει σε ατέρµων loop. Χρησιµποιείτε continue µετά τον έλεγχο για τα γράµµατα και µετά δεν ξαναδιαβάζετε καινούριο γράµµα οπότε µπαίνει σε ατέρµων loop. -Τερµατίζει σωστά το πρόγραµµα όταν δώσεις είσοδο $. -To output του προγράµµατος είναι σωστό. -Το πρόγραµµά σας δεν δουλεύει σωστά. Δεν βάζετε σωστά το '\0'. Το σωστό θα ήταν να µπαίνει στη στήλη COLUMNS-1. Μην ξεχνάτε ότι για να βγούµε από το παραπάνω loop πρέπει να γίνει ψευδής η συνθήκη κι αυτό γίνεται όταν το k γίνει ίσο µε COLUMNS οπότε το array[i][k] είναι ουσιαστικά εκτός των ορίων της γραµµής (και κατ'επέκταση του πίνακα) - Ανύπαρκτη στοίχιση. Μην ξαναστείλετε πρόγραµµα σε αυτή τη µορφή. -Πολλά warnings στο compilation. -Βγάζει segmentation fault για όλα τα operations. Έχετε δίαφορα λάθη. Ένα βασικό είναι οτι δεν έχετε ξεχωρίσει την διαφορά του ' ' από το " " για τα strings. Επίσης όταν συγκρίνεις string µε string το κάνετε µε το == που είναι λάθος. Πρέπει να χρησιµοποιείτε τις συναρτήσεις για τα strings.(strcmp είναι για την σύγκιρση.) -Όταν διαβάζετε ενα string µεγέθους 10 πρέπει να το διαβάζετε µε %9s διότι το string είναι (9 χαρακτήρες + '\0')=10. Εσείς διαβάζατε µε %10s. : - Δεν χρησιµοποιείτε τα #defines στα loops.( θα έπρεπε len > ROWS - 1 αντί για hardcoded if (len+1>=11) - Σωστή χρήση του %14s στην scanf. - Χρησιµοποιήστε πιο περιγραφικά ονόµατα στις µεταβλητές σας. - Σωστά χρησιµοποιείτε do-while και for loops. - Προσέξτε την στοίχισή σας, έχετε πολλές κένες γραµµές και παράξενα άγκιστρα. - Σωστός αλγόριθµος της βασικής λειτουργίας. - Σχεδον σωστοί έλεγχοι. Ο αλγόριθµος δεν τερµατίζει αν γεµίσουν οι γραµµές του πίνακα. - Δεν κάνει compile το πρόγραµµα σας. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. (ο κώδικας σας, δείχνει οτι έχετε καταλάβει τα ζητούµενα) 1983 : - Χρήση #define: OK - scanf: OK - Στοίχιση: OK γενικά, αλλά σας ξέφυγε σε κάποια σηµεία. - Ονόµατα Μεταβλητών: OK - Χρήση loop: OK - Έλεγχοι: Δεν έπρεπε να τερµατίζει αν απλά η λέξη περιέχει $. Μόνο αν η λέξη _είναι_ "$". - Τερµατισµός: OK - Προσθήκη λέξης: OK - Εκτύπωση: OK - scanf: OK - Σύγκριση συµβολοσειρών: OK - Ορθότητα element: OK - Ορθότητα copy: OK - Γενικά σχόλια: Πολύ ωραία! Λίγο άσχηµα ονόµατα µεταβλητών όµως, πχ c Page 23
1984 Οριακό : - Σωστά χρησιµοποιείτε τα #defines στα loops. - Σωστή χρήση του %14s στην scanf. - Σωστή χρήση for loops. Θα µπορούσατε να χρησιµοποιήσετε και do-while στο σηµείο όπου κάνετε τον έλεγχο τερµατισµού. - Καλή στοίχιση. - Σωστός αλγόριθµος της βασικής λειτουργίας. - Σωστοί έλεγχοι. Πρέπει να εκτυπώνετε τα περιεχόµενα του πίνακα σε κάθε εισαγωγή input string και όχι µόνο στο τελος, όπως το κάνετε τώρα. - Δεν εστάλη. - Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. 1985 η: -Στοίχιση: Καλή. -Καλά ονόµατα µεταβλητών και σωστή χρήση #define. -Ελλειπή σχόλια, τι κάνει το πρόγραµµά σας; - Σωστός έλεγχος εισόδου. Το λάθος που έχετε κάνει είναι οτι στην scanf που έχετε βάλει µέσα στις επαναλήψεις θα πρέπει να έχει ένα κενό πριν το %c (θα πρέπει να είναι scanf( %c )). Ο λόγος είναι οτι κάθε φορά που βάζετε ένα γράµµα πατάτε και το enter το οποίο είναι ένας έξτρα ειδικός χαρακτήρας. Διαβάζεται το πρώτο γράµµα αλλά το enter µένει στη µνήµη µε αποτέλεσµα στην επόµενη επανάληψη να το διαβάζει χωρίς να το δώσετε εσείς και να το θεωρεί λανθασµένο χαρακτήρα. Προσέξτε το την επόµενη φορά ή χρησιµοποιήστε το getchar() για να είστε πιο ασφαλείς. -Αλλάξτε τον κώδικα σας για να κάνετε χρήση της isupper(). -Σωστές πράξεις. Δεν θα το θεωρήσουµε λάθος αλλά δείτε πως θα µπορούσατε να κάνετε τη λύση σας µε τέτοιο τρόπο έτσι ώστε να διαγράφει όλα τα ίδια γράµµατα που είναι το ένα δίπλα στο άλλο. η: -Εντυπωσιακή η χρήση του sprintf σε αυτό το στάδιο για να φτιάξετε ένα string το οποίο θα διαβάζει το σωστό αριθµό γραµµάτων για κάθε µέγεθος πίνακα! - Για τις περιπτώσεις element και catenate το πρόγραµµά σας λειτουργεί σωστά. Δεν έχετε υλοποιήσει τις υπόλοιπες δυνατότητες. Επίσης, θα έπρεπε να µην τελειώνει το πρόγραµµα σας µέχρι να το ζητήσει ο χρήστης. - Έχετε χρησιµοποιήσει έναν δείκτη για να βάλετε το περιεχόµενο που επιστρέφει η strcat. Δεν χρειαζόταν να τον χρησιµοποιήσετε το δείκτη καθώς αν δείτε την διατύπωση της εντολής αυτό που κάνει είναι να βάζει το αποτέλεσµα στη θέση του πρώτου string που δίνετε σαν όρισµα. Με λίγα λόγια ορίζεται σαν strcat(destination, source). Φυσικά και αυτό που έχετε κάνει δεν είναι λάθος αλλά δεν χρειαζόταν. - Γενικά καλή δουλειά Page 24
1986 Αποστολή ΟΚ : - Καθόλου σχόλια! - Ο βρόχος do {} while (); που µετακινεί τα επόµενα στοιχεία του πίνακα δεξιότερα, έπρεπε να γραφτεί κάνοντας πρώτα έλεγχο και µετά µετακίνηση (δηλαδή µε while () {}). Εάν σβήνουµε τον τελευταίο χαρακτήρα της γραµµής (k=j=columns - 1), τότε η πρώτη επανάληψη θα διαβάσει το στοιχείο k+1 που είτε ανήκει στην επόµενη γραµµή είτε είναι εκτός του πίνακα. Η ανάθεση του '\0' µετά τον βρόχο κρύβει την προσπέλαση εκτός ορίων αλλα δεν την διορθώνει! - Επίσης ο 'µεγάλος' βρόχος do {} while (); πρέπει να αλλάξει σε while () {}. Εάν ο χρήστης δώσει σαν πρώτη είσοδο το '$', το πρόγραµµα τρέχει µια επανάληψη πριν τερµατίσει. - Δεν κανει compile. Δείτε την λύση και προσπαθείστε να υλοποιήσετε τις λειτουργίες στο σπίτι. 1988 FAIL Δεν ελήφθη άσκηση 1992 Διαδικαστικά:ΟΚ -Καλή στοίχιση γενικά, αλλά σας έχει ξεφύγει σε κάποια σηµεία. -Δεν έχετε καθόλου σχόλια. -Σωστά χρησιµοποιείτε τις defined τιµές για τα όρια των loops. -Σωστοί έλεγχοι για την είσοδο. Για τον έλεγχο των κεφαλαίων γραµµάτων θα µπορούσατε να χρησιµοποιείτε την συνάρτηση isupper(). -To πρόγραµµά σας τερµατίζει µόνο όταν δοθεί το $. Όταν τελιώσουν τα γράµµατα απο τον πίνακα συνεχίζει να εκτελείται. Το πρόβληµα είναι ότι µειώνετε τον counter µε κάθε µεταφορά χαρακτήρων εντός της γραµµής και τελικά γίνεται αρνητικός πολύ γρήγορα (αν είχατε >0 στη συνθήκη θα τερµάτιζε, αν και πάλι όχι σωστά). Έπρεπε το counter-- να είναι έξω από το εσωτερικό for. Επίσης δεν αφαιρούνται 2 ίδιοι χαρακτήρες απο την ίδια γραµµή. - Δεν υπάρχει λόγος να κάνετε αντιµετάθεση. Αρκεί να µεταφέρετε κάθε χαρακτήρα µια θέση αριστερά. -Σωστό output του προγράµµατος. -Πάρα πολλά errors και warnings στο compilation. -Να προσέχετε να διορθώνετε τα errors πριν στείλετε την άσκηση, διότι φαίνεται οτί την δουλέψατε αλλά δεν "τρέχει". Page 25