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

Σχετικά έγγραφα
ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 25/11/12, 22:00

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

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

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

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

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

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Προθεσµία: 10/12/2014, 22:00

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

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

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

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

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

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

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

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσμία: Τετάρτη 9/11/2016, 21:00

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

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

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

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

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Προθεσµία: 9/1/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

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

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

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

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

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

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

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

lab7: Συμβολοσειρές Συμβολοσειρές Ασφάλεια εισόδου Αναγνωσιμότητα κώδικα (σχόλια, στοίχιση, περιγραφικά ονόματα μεταβλητών, κτλ.)

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

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

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

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

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

ΑΕΜ ή username. Sheet2

Προγραμματιστικό Περιβάλλον

ΤΡΙΩΡΗ ΓΡΑΠΤΗ ΔΟΚΙΜΑΣΙΑ

ΟΜΟΣΠΟΝ ΙΑ ΕΚΠΑΙ ΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑ ΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2014 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

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

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

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

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ 23/04/2012. Α. Να απαντήσετε με Σ ή Λ στις παρακάτω προτάσεις:

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

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

Παράδειγμα 2. Λύση & Επεξηγήσεις. Τέλος_επανάληψης Εμφάνισε "Ναι" Τέλος Α2

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

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

Α2. Να γράψετε στο τετράδιο απαντήσεών σας το κατάλληλο τμήμα κώδικα, κάνοντας τις απαραίτητες αλλαγές σύμφωνα με την εκάστοτε εκφώνηση:

CE 120. Φροντιστήριο 14/10/2011

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

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

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

Πρόγραμμα όρασης. Στη συνέχεια θα περιγράψουμε πώς δουλεύει το ρομπότ.

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΠΡΟΣΑΝΑΤΟΛΙΣΜΟΥ (ΝΕΟ ΣΥΣΤΗΜΑ) 27 ΜΑΪΟΥ 2016 ΕΚΦΩΝΗΣΕΙΣ ÊÁËÁÌÁÔÁ

Α4. Όσο επανάλαβε Τέλος_επανάληψης Εμφάνισε Για από μέχρι με_βήμα. Όσο επανάλαβε (Μονάδες 5) Α5. Α[10, 5] Π, Για από μέχρι (1) Για από μέχρι (2) Αν

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

A. Να γράψετε τον αριθμό της κάθε μιας από τις παρακάτω προτάσεις και δίπλα. το γράμμα Σ, εάν είναι σωστή, ή το γράμμα Λ, εάν είναι λανθασμένη.

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

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

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΤΕΛΟΣ 1ΗΣ ΑΠΟ 5 ΣΕΛΙΔΕΣ

ΘΕΜΑ Α. Α2. Να αναφέρετε από τι εξαρτάται η επιλογή του καλύτερου αλγορίθμου ταξινόμησης. Μονάδες 4. Σελίδα 1 από 8

ÁÎÉÁ ÅÊÐÁÉÄÅÕÔÉÊÏÓ ÏÌÉËÏÓ

ΗΥ-100: Εισαγωγή στην Επιστήμη Υπολογιστών 3η σειρά ασκήσεων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΠΡΟΣΑΝΑΤΟΛΙΣΜΟΥ (ΝΕΟ ΣΥΣΤΗΜΑ) 27 ΜΑΪΟΥ 2016 ΕΚΦΩΝΗΣΕΙΣ

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

Διαδικασιακός Προγραμματισμός

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

γραπτή εξέταση στo μάθημα ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Γ ' ΛΥΚΕΙΟΥ

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

Transcript:

ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Προθεσµία: 18/12/12, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης 1 Οδηγίες αποστολής άσκησης Διαδικαστικά Η εργασία αυτή µπορεί να γίνει σε οµάδες µέχρι 2 ατόµων. Δεν είναι απαραίτητο να συνεργαστείτε µε το ίδιο άτοµο που κάνατε τα εβδοµαδιαία εργαστήρια ή τα δύο πρώτα σετ ασκήσεων. Μπορείτε να συζητάτε τις ασκήσεις µε συµφοιτητές σας αλλά δεν επιτρέπεται η ανταλλαγή κώδικα µε οποιοδήποτε τρόπο. Ξεκινήστε νωρίς! Ο προγραµµατισµός είναι πάντα ΠΟΛΥ πιο χρονοβόρος από ό,τι περιµένετε και ειδικά σε ασκήσεις µε δυναµική δέσµευση µνήµης. Μη διστάζετε να ζητήσετε βοήθεια! Μπορείτε να χρησιµοποιήσετε το forum προγραµµατισµού (http://infserver.inf.uth.gr/courses/coding/). Αποθηκεύστε το πρόγραµµα σε αρχείο µε όνοµα hw3.c. Θα σας δώσουµε αρκετά αρχεία τα οποία θα µπορείτε να χρησιµοποιήστε ως είσοδο (µε ανακατεύθυνση) για να ελέγξετε την ορθότητα του προγράµµατός σας. Εκπρόθεσµες ασκήσεις δε γίνονται δεκτές.

'Ασκηση: Συστάσεις βιβλίων Εισαγωγή Σε αυτό το σετ ασκήσεων θα γράψετε µια βελτιωµένη υλοποίηση του homework 2, µε χρήση struct και δεικτών. Σας συνιστούµε να ξεκινήσετε τον κώδικα από την αρχή και απλά να χρησιµοποιείτε ιδέες και µικρά κοµµάτια κώδικα από το hw2 όποτε χρειάζεται. Σκοπός είναι να γράψετε ένα πρόγραµµα το οποίο διαβάζει τις βαθµολογίες που έδωσε ένα σύνολο χρηστών για ένα αριθµό βιβλίων, µετά διαβάζει τα στοιχεία και τις βαθµολογίες ενός νέου χρήστη και συστήνει ένα νέο βιβλίο σε αυτό το χρήστη µε βάση τις οµοιότητες ανάµεσα στις προτιµήσεις του και τις προτιµήσεις των υπολοίπων. Περιγραφή του αρχείου δεδοµένων Ανοίξτε το αρχείο sample_data.txt µε έναν επεξεργαστή κειµένου. Η δοµή του αρχείου είναι ως εξής: Η πρώτη γραµµή περιέχει έναν ακέραιο αριθµό ο οποίος αναπαριστά το πλήθος των βιβλίων που είναι διαθέσιµα από ένα online βιβλιοπωλείο. Ακολουθούν οι περιγραφές τόσων βιβλίων όσος είναι ο παραπάνω αριθµός. Τα βιβλία δίνονται µε τη µορφή τίτλος, whitespace, όνοµα συγγραφέα. Διαδοχικά βιβλία χωρίζονται από ένα χαρακτήρα αλλαγής γραµµής. Δεν υπάρχουν χαρακτήρες whitespace ανάµεσα στις λέξεις που αποτελούν τον τίτλο ή το όνοµα του συγγραφέα. Στη γραµµή αµέσως µετά τα βιβλία βρίσκεται ένας ακέραιος αριθµός ο οποίος αναπαριστά το πλήθος χρηστών στο σύστηµα. Ξεκινώντας από την επόµενη γραµµή βρίσκονται πληροφορίες για τις βαθµολογίες που έδωσαν οι χρήστες του online βιβλιοπωλείου. Για κάθε χρήστη, το αρχείο περιλαµβάνει: το όνοµα του χρήστη, το οποίο δεν περιέχει χαρακτήρες whitespace. Τα ονόµατα δεν είναι απαραίτητα µοναδικά το username του χρήστη το οποίο δεν περιέχει χαρακτήρες whitespace. Τα username είναι µοναδικά αλλαγή γραµµής τους βαθµούς που έδωσε αυτός ο χρήστης, έναν για κάθε ένα από τα παραπάνω βιβλία, µε την ίδια σειρά. Οι βαθµοί παίρνουν τις τιµές: -5 (δε µου άρεσε καθόλου), -3 (δε µου άρεσε πολύ), 0 (δεν το έχω διαβάσει), 1 (µέτριο), 3 (µου άρεσε), 5 (µου άρεσε πάρα πολύ). Διαδοχικοί βαθµοί χωρίζονται από whitespace. αλλαγή γραµµής. Στη γραµµή µετά τις βαθµολογίες του τελευταίου χρήστη βρίσκεται το όνοµα του χρήστη ο οποίος αναζητά προτάσεις για νέα βιβλία. Από εδώ και στο εξής θα τον αποκαλούµε "αγοραστή". Στην επόµενη γραµµή βρίσκεται το username του αγοραστή. Ο αγοραστής ΔΕΝ θα πρέπει να είναι ένας από τους χρήστες (θα κάνουµε έλεγχο γι'αυτό). Στην επόµενη γραµµή βρίσκονται οι βαθµοί που έδωσε αυτός ο χρήστης για κάθε ένα από τα βιβλία, µε whitespace ανάµεσα σε διαδοχικούς βαθµούς.

Στάδιο 0: Κατασκευή δοµών ( ) Κατασκευάστε ένα struct το οποίο περιγράφει ένα χρήστη, κι έχει τρία πεδία: όνοµα (συµβολοσειρά µέγιστου µεγέθους 30) username (συµβολοσειρά µέγιστου µεγέθους 20) βαθµολογίες (δείκτης σε ακέραιο, στον οποίο θα αποθηκευτεί η διεύθυνση της αρχής ενός δυναµικά δεσµευµένου πίνακα ακεραίων) Κατασκευάστε ένα struct το οποίο περιγράφει ένα βιβλίο, κι έχει δύο πεδία: τίτλο (συµβολοσειρά µέγιστου µεγέθους 100) όνοµα συγγραφέα (συµβολοσειρά µέγιστου µεγέθους 100) Στάδιο 1: Εισαγωγή δεδοµένων βιβλίων και χρηστών( ) Διαβάστε από το πληκτρολόγιο το πλήθος των βιβλίων. Γράψτε µια συνάρτηση η οποία παίρνει ως παράµετρο το πλήθος των βιβλίων, δεσµεύει δυναµικά τόση µνήµη όση θα χρειαστεί για να αποθηκεύσει αυτό το πλήθος βιβλίων (δηλαδή κατασκευάζει ένα δυναµικά δεσµευµένο πίνακα από struct), διαβάζει τα στοιχεία των βιβλίων (δηλαδή τίτλο και συγγραφέα) από το πληκτρολόγιο και τα αποθηκεύει στον πίνακα, και τέλος επιστρέφει τη διεύθυνση µνήµης όπου βρίσκεται ο πίνακας. Αν έχει γίνει οποιοδήποτε λάθος στη δέσµευση µνήµης, η συνάρτηση πρέπει να επιστρέφει NULL. Καλέστε τη συνάρτηση από τη main για να διαβάσετε τα στοιχεία των βιβλίων και να τα αποθηκεύσετε στον δυναµικό πίνακα. Προσωρινός κώδικας: Εκτυπώστε τα περιεχόµενα του πίνακα και επιβεβαιώστε ότι αυτό το στάδιο λειτουργεί σωστά. Διαβάστε από το πληκτρολόγιο το πλήθος χρηστών και γράψτε µια συνάρτηση η οποία παίρνει ως παράµετρο αυτό το πλήθος και ότι άλλο χρειάζεται, δεσµεύει δυναµικά τόση µνήµη όση θα απαιτηθεί για να αποθηκεύσει τόσους χρήστες (δηλαδή κατασκευάζει ένα δυναµικά δεσµευµένο πίνακα από struct), διαβάζει τα στοιχεία των χρηστών από το πληκτρολόγιο και τα αποθηκεύει στον πίνακα, και τέλος επιστρέφει τη διεύθυνση µνήµης όπου βρίσκεται ο πίνακας. Αν έχει γίνει οποιοδήποτε λάθος στη δέσµευση µνήµης, η συνάρτηση πρέπει να επιστρέφει NULL. Προσοχή! Για κάθε ένα χρήστη θα χρειαστεί να δεσµεύσετε µνήµη και για τον δυναµικό πίνακα βαθµολογιών. Προφανώς ο δυναµικός πίνακας θα πρέπει να αποθηκεύει τόσους ακέραιους όσος είναι και ο αριθµός των βιβλίων. Καλέστε τη συνάρτηση από τη main για να διαβάσετε τα στοιχεία των χρηστών και να τα αποθηκεύσετε στον δυναµικό πίνακα. Προσωρινός κώδικας: Εκτυπώστε τα περιεχόµενα του πίνακα και επιβεβαιώστε ότι αυτό το στάδιο λειτουργεί σωστά. Το πρόγραµµά σας πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε αν αλλάξει το πλήθος βιβλίων ή ο µέγιστος αριθµός χρηστών, να µπορούν να γίνουν εύκολα και γρήγορα οι κατάλληλες αλλαγές στον κώδικα.

Στάδιο 2: Εισαγωγή προτιµήσεων αγοραστή ( ) Αφαιρέστε τον προσωρινό κώδικα που γράψατε στο στάδιο 1. Γράψτε µια συνάρτηση στην οποία: Εκτυπώνετε το µήνυµα: Hi, what's your name? ακολουθούµενο από ένα κενό και διαβάζετε από το πληκτρολόγιο το όνοµα του αγοραστή. Εκτυπώνετε το µήνυµα Hello X! ακολουθούµενο από χαρακτήρα αλλαγής γραµµής, όπου X το όνοµα που διαβάσατε. Εκτυπώνετε το µήνυµα Enter a username: ακολουθούµενο από ένα κενό, και διαβάζετε από το πληκτρολόγιο το όνοµα του αγοραστή. Ελέγχετε αν αυτό το username είναι µοναδικό κι αν βρείτε ότι δεν είναι, τότε εκτυπώστε το µήνυµα Username exists. Enter a different username: ακολουθούµενο από ένα κενό, κι επαναλάβετε µέχρις ότου δοθεί µοναδικό username. Συστήνουµε να χρησιµοποιήσετε µια νέα βοηθητική συνάρτηση για τον έλεγχο. Δεσµεύετε δυναµικά µνήµη για την αποθήκευση του αγοραστή και αποθηκεύετε σε αυτή το όνοµα και το username. Η συνάρτηση πρέπει να επιστρέφει τη διεύθυνση στην οποία είναι αποθηκευµένος ο αγοραστής ή NULL αν έχει υπάρξει οποιοδήποτε πρόβληµα µνήµης. Προσωρινός κώδικας: Εκτυπώστε τα µέχρι τώρα στοιχεία του αγοραστή όπως αυτός επιστρέφεται από τη συνάρτηση (όνοµα και username µόνο) και επιβεβαιώστε ότι είναι σωστά. Γράψτε µια συνάρτηση η οποία παίρνει ως παράµετρο τη διεύθυνση στην οποία είναι αποθηκευµένα τα στοιχεία του αγοραστή και ότι άλλο χρειάζεται, δεσµεύει µνήµη για το δυναµικό πίνακα ακεραίων στον οποίο θα αποθηκευτούν οι βαθµολογίες αυτού του αγοραστή, και µετά διαβάζει από το πληκτρολόγιο τις βαθµολογίες και τις αποθηκεύει στον πίνακα. Η συνάρτηση επιστρέφει τη διεύθυνση του αγοραστή ή NULL αν έχει συµβεί οποιοδήποτε πρόβληµα στη δέσµευση µνήµης. Προσωρινός κώδικας: Εκτυπώστε τα µέχρι τώρα στοιχεία του αγοραστή, συµπεριλαµβανοµένων των βαθµών που έχει δώσει, και επιβεβαιώστε ότι είναι σωστά. Στάδιο 3: Εύρεση συνιστώµενου βιβλίου ( ) Αφαιρέστε τον προσωρινό κώδικα που γράψατε στο στάδιο 2. Γράψτε µια συνάρτηση η οποία παίρνει ως παραµέτρους ότι χρειάζεται και διατρέχει τον πίνακα χρηστών υπολογίζοντας για κάθε έναν το βαθµό οµοιότητας ανάµεσα στις βαθµολογίες του εν λόγω χρήστη και του αγοραστή. Για να υπολογίσουµε το βαθµό οµοιότητας των βαθµολογιών δύο χρηστών αντιµετωπίζουµε τις βαθµολογίες που έδωσαν ως δύο διανύσµατα και υπολογίζουµε το εσωτερικό τους γινόµενο. Η συνάρτηση εκτυπώνει το όνοµα του χρήστη που βρήκε, ένα κενό, το βαθµό οµοιότητας κι ένα χαρακτήρα αλλαγής γραµµής. Αφού βρεθεί ο χρήστης µε το µεγαλύτερο βαθµό οµοιότητας, η συνάρτηση εντοπίζει το πρώτο βιβλίο που άρεσε σε αυτόν και που δεν το έχει διαβάσει ακόµη ο αγοραστής. Αν βρεθεί κατάλληλο βιβλίο, εκτυπώνει το µήνυµα We recommend: X by Y ακολουθούµενο από χαρακτήρα αλλαγής γραµµής, όπου X ο τίτλος του βιβλίου και Υ ο συγγραφέας. Αν δε βρεθεί κατάλληλο βιβλίο, εκτυπώνει το µήνυµα No recommendations ακολουθούµενο από χαρακτήρα αλλαγής γραµµής.

Στάδιο 4: Αποδέσµευση δυναµικά δεσµευµένης µνήµης ( ) Προσθέστε κώδικα σε σηµεία του προγράµµατος έτσι ώστε πριν τον τερµατισµό του προγράµµατος να απελευθερώνεται όλη η δυναµικά δεσµευµένη µνήµη. Επίσης, φροντίστε να ελέγχετε αν οι συναρτήσεις επιστρέφουν άκυρες τιµές (NULL) γιατί σε αυτές τις περιπτώσεις το πρόγραµµα πρέπει να τερµατίζει. Στάδιο 5: Τελικός έλεγχος ορθότητας Το πρόγραµµά σας πρέπει να λειτουργεί σωστά και να εκτυπώνει όλα τα µηνύµατα και αποτελέσµατα µε τον τρόπο που σας περιγράφουµε. Θα σας δώσουµε ενδεικτικά αρχεία εισόδου και εξόδου. Χρησιµοποιήστε ανακατεύθυνση εισόδου/εξόδου και την εντολή diff όπως κάνατε και στο δεύτερο σετ ασκήσεων για να επιβεβαιώσετε ότι το πρόγραµµά σας βγάζει ακριβώς την αναµενόµενη έξοδο. Πρέπει το πρόγραµµα που θα µας παραδώσετε να παράγει έξοδο που δεν έχει διαφορές από τη δική µας. Σε αρκετά σηµεία µπορείτε να γράψετε επιπλέον βοηθητικές συναρτήσεις (για παράδειγµα για τον υπολογισµό του εσωτερικού γινοµένου ή για τον έλεγχο ύπαρξης του username) οι οποίες θα βελτιώσουν την ποιότητα του κώδικά σας. Όπως πάντα, φροντίστε να έχετε καλογραµµένο κώδικα που ακολουθεί τις αρχές που περιγράφονται σε αυτά τα φυλλάδια. Αρχείο προς παράδοση: hw3.c Πώς να παραδώσετε τη δουλειά σας (Ακολουθείστε τις οδηγίες ακριβώς αλλιώς µπορεί να µη δούµε τα αρχεία σας) Προσθέστε σε σχόλια στην αρχή του κάθε αρχείου µε κώδικα τα πλήρη ονόµατα και ΑΜ των µελών της οµάδας. Παρακαλούµε να γράφετε τα σχόλια ΜΟΝΟ µε λατινικούς χαρακτήρες. Κατασκευάστε ένα φάκελο µε όνοµα epwnumo1_am1_epwnumo2_am2 και αντιγράψτε µέσα σε αυτόν το hw3.c Πηγαίνετε στο φάκελο µέσα στον οποίο βρίσκεται το κατασκευάσατε και γράψτε την παρακάτω εντολή: tar czvf epwnumo1_am1_epwnumo2_am2.tgz epwnumo1_am1_epwnumo2_am2 που epwnumo1_am1_epwnumo2_am2 Στείλτε email: στη διεύθυνση ce120lab@gmail.com αντίγραφο (CC) στον άλλο µέλος της οµάδας σας θέµα (subject) CE120 hw3 και επικολληµένο αρχείο το epwnumo1_am1_epwnumo2_am2.tgz Ασκήσεις που έχουν λάθος format ή είναι εκπρόθεσµες ΔΕ θα γίνουν δεκτές.