Εισαγωγή. Interface της εφαρμογής. Κ24: Προγραμματισμός Συστήματος - 1η Εργασία, Εαρινό Εξάμηνο 2019 Προθεσμία Υποβολής: Παρασκευή 15 Μαρτίου, 23:59

Σχετικά έγγραφα
0 The quick brown fox leaped over the lazy lazy dog 1 Quick brown foxes leaped over lazy dogs for fun

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

ABC3341, CCD2345, ,... CCDA2345, , ,00E

an:3 are:6 a:10

50 Ketseo,Theoni Sarif,Omar 104

$./MirrorInitiator -n <MirrorServerAddress> -p <MirrorServerPort> \\ -s <ContentServerAddress1:ContentServerPort1:dirorfile1:delay1, \\

fall2018/k22/home m1436+at-di.

./mydiz {-c -a -x -m -d -p -j} <archive-file> <list-of-files/dirs>

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Για το μέρος αυτό της άσκησης θα υλοποιήσετε μια εφαρμογή κελύφους η οποία θα χρησιμοποιείται ως εξής:

waitpid(), read(), write(), pipe(), mkfifo() κ.α.).

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

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

Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα).

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

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

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 5 Ανάπτυξη Προγράμματος Συμπίεσης/Αποσυμπίεσης Αρχείων

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

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

Kitchen Doormam. Floor with Tables. Restaurant Floorplan and Operation

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

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

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

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Προγραμματιστική Εργασία - 2o Μέρος

Συνοπτικά, το σύστημά σας θα πρέπει να υλοποιεί τις παρακάτω λειτουργίες:

Πληροφορική & Τηλεπικοινωνίες

Πληροφορική 2. Δομές δεδομένων και αρχείων

'Ασκηση 1: Στατικός Κατακερματισμός. Εισαγωγή. Ρουτίνες υλοποίησης κατακερματισμού. (Ημερομηνία Παράδοσης: Παρασκευή, 16/5/2008, 5μμ) HT_Init()

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο M. Χατζόπουλος. Προθεσμία: 19/01/2015

φροντιστήρια Θέματα Ανάπτυξης Εφαρμογών σε Προγραμματιστικό Περιβάλλον Γ λυκείου Προσανατολισμός Σπουδών Οικονομίας και Πληροφορικής

Τυπικές χρήσεις της Matlab

7.7 Πρωτόκολλο ARP. 1. Το πρωτόκολλο ARP μετατρέπει τις διευθύνσεις IP στις αντίστοιχες φυσικές. Σ Λ

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

Προγραμματισμός ΙI (Θ)

Α2. Να γράψετε στο τετράδιο σας τον αριθμό 1-4 κάθε πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

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

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΜΗΜΑ: Γ2

... s12 s13 s14. Σχήμα1: ΙεραρχίαΔιεργασιώνμε l=3καιβάθος d=3. Οκάθεεργάτης(worker)δουλεύειμετο 1/27του αρχείου των ψήφων.

Δομές Δεδομένων και Αλγόριθμοι

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΤΑΞΗ / ΤΜΗΜΑ : Γ ΛΥΚΕΙΟΥ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΑΠΡΙΛΙΟΣ 2019 ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ : 7 (ΕΠΤΑ)

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX. Συστήματα Αρχείων. Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης Δρ. Α. Γαλάνη

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

Προτεινόμενα Θέματα ΑΕΠΠ

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


Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

HTTP API v1.6 SMSBOX.GR HTTP API v

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

Ακρότατα πίνακα, χωρίς min, max, μόνο με pos

HY-486 Αρχές Κατανεμημένου Υπολογισμού

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

ΤΕΛΙΚΟ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ

Εργαστήριο Βάσεων Δεδομένων

«Μηχανή Αναζήτησης Αρχείων» Ημερομηνία Παράδοσης: 30/04/2015, 09:00 π.μ.

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

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Εργαστήριο Τεχνολογίας και Επεξεργασίας Δεδομένων Δομές Δεδομένων

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

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

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Μάθημα 8: Επικοινωνία Συσκευών με τον Επεξεργαστή

HY Λογική Διδάσκων: Δ. Πλεξουσάκης Εαρινό Εξάμηνο. Φροντιστήριο 6

Δομημένος Προγραμματισμός

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

Προγραμματισμός ΙΙ Εαρινό εξάμηνο Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 131: ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I ΕΡΓΑΣΙΑ 2

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

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Κατακερματισμός (Hashing)

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 7 ο Τι πρέπει να έχουμε υπ όψιν μας για την επιλογή της κατάλληλης γλώσσας προγραμματισμού;

Εγχειρίδιο Χρήσης για Διαχειριστές. Πλατφόρμα Μεταφόρτωσης και Μετατροπής Βίντεο

Standard Template Library (STL) C++ library

Σχηματίζοντας Γραφικές Παραστάσεις για Ημίτονο και Συνημίτονο και Ελέγχοντας Περιορισμούς σε Συστάδες Καρτών Τόμπολας

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ. Για i από 1 μέχρι Μ Εμφάνισε A[4,i] Τέλος_επανάληψης. (μονάδες 6) ΤΕΛΟΣ 1ης ΑΠΟ 7 ΣΕΛΙΔΕΣ

Εργαστήριο 10 Πίνακες. Πίνακες. Η έννοια της δόμησης δεδομένων στη PASCAL. Σκοπός

ΠΡΩΤΟΚΟΛΟ HTTP ΕΝΤΟΛΩΝ ΔΙΑΣΥΝΔΕΣΗΣ ΕΚΔΟΣΗ 1.2

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Transcript:

Κ24: Προγραμματισμός Συστήματος - 1η Εργασία, Εαρινό Εξάμηνο 2019 Προθεσμία Υποβολής: Παρασκευή 15 Μαρτίου, 23:59 Εισαγωγή Στην εργασία αυτή θα υλοποιήσετε ένα πρόγραμμα που θα δέχεται, θα επεξεργάζεται, θα καταγράφει και θα απαντάει ερωτήματα για Bitcoin συναλλαγές. Συγκεκριμένα θα υλοποιήσετε ένα σύνολο δομών (hash tables, linked lists, trees) που επιτρέπουν την εισαγωγή και επερωτήσεις σε μεγάλο όγκο εγγραφών τύπου bitcointransaction. Αν και τα δεδομένα της άσκησης θα προέρχονται από αρχεία, τελικά όλες οι εγγραφές θα αποθηκεύονται μόνο στην κύρια μνήμη. Interface της εφαρμογής Η εφαρμογή θα ονομάζεται bitcoin και θα χρησιμοποιείται ως εξής:./bitcoin -a bitcoinbalancesfile t transactionsfile -v bitcoinvalue h1 senderhashtablenumofentries h2 receiverhashtablenumofentries b bucketsize όπου: - Η παράμετρος bitcoinvalue λέει στην εφαρμογή ποια είναι η αξία (σε $) ενός bitcoin. - Η παράμετρος senderhashtable1numofentries είναι ο αριθμός θέσεων ενός πίνακα κατακερματισμού που θα κρατάει η εφαρμογή για την εντόπιση πληροφοριών αποστολέων συναλλαγών. - Η παράμετρος receiverhashtable1numofentries είναι ο αριθμός θέσεων ενός πίνακα κατακερματισμού που θα κρατάει η εφαρμογή για την εντόπιση πληροφοριών παραληπτών συναλλαγών. - Η παράμετρος bucketsize είναι ο αριθμός των Bytes που δίνει το μέγεθος του κάθε bucket στους πίνακες κατακερματισμού. - To bitcoinbalancesfile (ή κάποιο άλλο όνομα αρχείου) είναι ένα αρχείο που περιλαμβάνει τα αρχικά balances των χρηστών που συμμετέχουν στο bitcoin network. Κάθε γραμμή του αρχείου αυτού είναι μια λίστα με τα bitcoin IDs που έχει στη κατοχή του ένας συγκεκριμένος χρηστής (userid). Για παράδειγμα αν τα περιεχόμενα του αρχείου είναι: Mia 123 337 880 667 Kylian 456 767 898 Katerina 222 567 003 σημαίνει πως έχουμε αρχικά τρεις χρήστες που συμμετέχουν στο network. Η Mia έχει τέσσερα bitcoins, με bitcoinids 123, 337, 880, 667, ο Kylian έχει τρία bitcoins με IDs 456, 767, 898, κοκ. Μπορείτε να θεωρήσετε πως το όνομα του χρήστη δεν περιέχει κενά. - To transactionsfile (ή κάποιο άλλο όνομα αρχείου) είναι ένα αρχείο που περιέχει μια σειρά από αιτήματα (συναλλαγές) προς επεξεργασία. Κάθε γραμμή του αρχείου αυτού περιγράφει μια συναλλαγή με τα userid του αποστολέα και του παραλήπτη και το ποσόν (σε $) που στέλνει ο αποστολέας. Για παράδειγμα αν τα περιεχόμενα του αρχείου είναι: 889 Maria Ronaldo 50 25-12-2018 20:08 776 Lionel Antonella 150 14-02-2019 10:05 σημαίνει πως έχουμε δυο συναλλαγές όπου η Maria ζητάει να στείλει $50 στον Ronaldo στις 25-12-2018, ώρα 8:08 το βράδυ και ο Lionel ζητάει να στείλει στην Antonella $150 στις 14-2-2019, ώρα 10:05 το πρωί. Μπορείτε να θεωρήσετε πως τα περιεχόμενα του αρχειου με τα transactions θα είναι ταξινομημένα ανά ημερομηνία και ώρα. Συγκεκριμένα, μια εγγραφή /αίτημα συναλλαγής είναι μια γραμμή ASCII κειμένου που αποτελείται από τα εξής στοιχεία: 1. transactionid: μια συμβολοσειρά (μπορεί να έχει και μόνο ψηφία) που με μοναδικό τρόπο καθορίζει την κάθε τέτοια εγγραφή. 2. senderwalletid: μια συμβολοσειρά που αποτελείται από γράμματα. 3. receiverwalletid: μια συμβολοσειρά που αποτελείται από γράμματα. 4. value: το ποσό την συναλλαγής (μπορείτε να υποθέσετε πως είναι ακέραιος αριθμός).

5. date: ημερομηνία που γίνεται το αίτημα συναλλαγής. Πρέπει να έχει την μορφή DD-MM-YYYY όπου το DD εκφράζει την ημέρα, το MM το μήνα, και το YYYY το χρόνο του αιτήματος. 6. time: ώρα στο 24ωρο που γίνεται το αίτημα συναλλαγής. Πρέπει να έχει την μορφή HH:MM όπου το HH εκφράζει την ώρα και το ΜΜ το λεπτό. Ξεκινώντας, η εφαρμογή σας θα πρέπει να ανοίξει τα αρχεία bitcoinbalancesfile και transactionsfile, να διαβάσει μία-μία τις γραμμές και να αρχικοποιήσει και να αποθηκεύσει στη μνήμη τις δομές δεδομένων που θα χρησιμοποιεί κατά την εκτέλεση ερωτημάτων. θα Πρέπει να ελέγχετε πως τα στοιχεία στα αρχεία είναι έγκυρα. Για παράδειγμα, αν στο αρχείο bitcoinbalancesfile, υπάρχουν χρήστες που έχουν στη κατοχή τους το ίδιο bitcoin, θα πρέπει να χειριστείτε το λάθος παρουσιάζοντας το κατάλληλο μήνυμα και βγαίνοντας από την εφαρμογή. Επίσης, αν κατά τη διάρκεια επεξεργασίας του transactionsfile εντοπίσετε μια συναλλαγή που δεν είναι έγκυρη, τότε η εφαρμογή θα πρέπει να παρουσιάσει ένα μήνυμα πως η συναλλαγή δεν είναι εφικτή και ακυρώνεται. Μια τέτοια περίπτωση είναι όταν σε μια συναλλαγή, ο αποστολέας δεν έχει αρκετά χρήματα στο wallet του για να γίνει η συναλλαγή. Όταν η εφαρμογή τελειώσει την επεξεργασία των bitcoinbalancesfile και transactionsfile αρχείων, θα περιμένει είσοδο από το χρήστη από το πληκτρολόγιο. Ο χρήστης θα μπορεί να δίνει τις ακόλουθες εντολές: - /requesttransaction senderwalletid receiverwalletid amount date time Ο χρήστης ζητά να σταλούν amount χρήματα από τον χρήστη με userid senderwalletid στον χρήστη με userid receiverwalletid. Το date και time θα πρέπει να είναι μεταγενέστερα της τελευταίας συναλλαγής που έχει καταγράψει η εφαρμογή, αλλιώς απορρίπτεται το αίτημα. Αν δεν έχουν δοθεί date και time, η εφαρμογή χρησιμοποιεί τη τρέχουσα ώρα για την καταγραφή ώρας εκτέλεσης της συναλλαγής. Επίσης, η εφαρμογή θα πρέπει να ελέγχει αν υπάρχουν επαρκή χρήματα για να εκτελεστεί επιτυχώς η συναλλαγή. Αν υπάρχουν, ενημερώνει τις κατάλληλες δομές (δείτε παρακάτω) και παρουσιάζει μήνυμα επιτυχίας εκτέλεσης στον χρήστη με τις λεπτομέρειες της συναλλαγής. Αν δεν υπάρχουν, η εφαρμογή παρουσιάζει μήνυμα αποτυχίας στον χρήστη. - /requesttransactions senderwalletid receiverwalletid amount date time; senderwalletid2 receiverwalletid2 amount2 date2 time2; senderwalletidn receiverwalletidn amountn daten timen; Ο χρήστης ζητά μια σειρά από συναλλαγές να εκτελεστούν. Οι συναλλαγές διαχωρίζονται με ελληνικό ερωτηματικό. Η εφαρμογή ελέγχει την εγκυρότητα κάθε συναλλαγής και αναλόγως ενημερώνει τις δομές δεδομένων τις και παρουσιάζει μήνυμα αποτελέσματος στον χρήστη. - /requesttransactions inputfile Ο χρήστης ζητά να εκτελεστούν συναλλαγές που περιγράφονται στο inputfile. Οι συναλλαγές διαχωρίζονται με ελληνικό ερωτηματικό και έχουν την ίδια μορφή με συναλλαγές των ερωτημάτων requesttransaction(s). Η εφαρμογή ελέγχει την εγκυρότητα κάθε συναλλαγής και αναλόγως, ενημερώνει τις δομές δεδομένων και παρουσιάζει μήνυμα αποτελέσματος στον χρήστη. - /findearnings walletid [time1][year1][time2][year2] Η εφαρμογή πρώτα επιστρέφει το συνολικό ποσόν που έχει λάβει μέσω συναλλαγών ο χρηστής με userid walletid (με επιλογή στο εύρος χρόνου ή/και ημερομηνίας). Αν υπάρχει ορισμός για [time1] θα πρέπει να υφίσταται και ορισμός για [time2]. Επίσης το ίδιο ισχύει και για την χρήση των μη υποχρεωτικών

παραμέτρων [year1] και [year2]. Στη συνεχεία, παρουσιάζει όλες τις εγγραφές συναλλαγών του χρήστη (ως παραλήπτης) που εκτελέστηκαν επιτυχώς μέσα στο συγκεκριμένο διάστημα. Αν δεν ορίζεται διάστημα, τότε η εφαρμογή θα παρουσιάζει την πλήρη ιστορία συναλλαγών όπου το walletid είναι παραλήπτης. - /findpayments walletid [time1][year1][time2][year2] Η εφαρμογή επιστρέφει το συνολικό ποσόν που έχει στείλει επιτυχώς μέσω συναλλαγών ο χρηστής με userid walletid (με επιλογή στο εύρος χρόνου ή/και ημερομηνίας). Στη συνεχεία, παρουσιάζει όλες τις εγγραφές συναλλαγών του χρήστη (ως αποστολέας) που εκτελέστηκαν επιτυχώς μέσα στο διάστημα που έχει δοθεί στη γραμμή εντολής. Αν δεν ορίζεται διάστημα, τότε η εφαρμογή θα παρουσιάζει την πλήρη ιστορία συναλλαγών όπου το walletid είναι αποστολέας. - /walletstatus walletid Η εφαρμογή επιστρέφει το τρέχον ποσόν που είναι στο wallet walletid. - /bitcoinstatus bitcoinid Η εφαρμογή επιστρέφει την αρχική αξία του bitcoin me ID bitcoinid, τον αριθμό των συναλλαγών στις οποίες έχει χρησιμοποιηθεί, και το ποσόν του bitcoinid που έχει μείνει unspent (δηλαδή δεν έχει χρησιμοποιηθεί ακόμα σε συναλλαγή). Παράδειγμα output: 124 10 50 σημαίνει πως το bitcoin 124 έχει χρησιμοποιηθεί σε 10 transactions ενώ 50 μονάδες της αξίας του δεν έχει χρησιμοποιηθεί ακόμα σε συναλλαγή. - /tracecoin bitcoinid Η εφαρμογή επιστρέφει την ιστορία συναλλαγών στο οποίο εμπλέκεται το bitcoin bitcoinid. Παράδειγμα output: /tracecoin 124 889 Maria Ronaldo 50 25-12-2018 20:08 776 Lionel Antonella 150 14-02-2019 10:05 Η Maria έδωσε στον Ronaldo 50 μονάδες στις 25/12/2018 (μέσω συναλλαγής #889) και ο Lionel 150 μονάδες στην Antonella στις 14/2/2019 (μέσω συναλλαγής #776). - /exit Έξοδος από την εφαρμογή. Βεβαιωθείτε πως ελευθερώνετε σωστά όλη τη δεσμευμένη μνήμη. Δομές δεδομένων Για την υλοποίηση της εφαρμογής μπορείτε να χρησιμοποιήσετε C ή C++. Δεν μπορείτε να χρησιμοποιήσετε όμως την Standard Template Library (STL). Όλες οι δομές δεδομένων θα πρέπει να υλοποιηθούν από εσάς. Βεβαιωθείτε πως δεσμεύετε μόνο όση μνήμη χρειάζεστε, π.χ. η ακόλουθη τακτική δε συνιστάται: int wallets[512];// store up to 512 wallets, but really we don t know how many Επίσης βεβαιωθείτε πως απελευθερώνετε τη μνήμη σωστά και κατά την εκτέλεση του προγράμματός σας αλλά και κατά την έξοδο. Για να ολοκληρώσετε την άσκηση θα χρειαστεί, μεταξύ άλλων, να υλοποιήσετε τις εξής δομές δεδομένων.

1. Δύο πίνακες κατακερματισμού ( senderhashtable και receiverhashtable ) που με index προσφέρουν γρήγορες προσπελάσεις σε στοιχεία συναλλαγών που έχουν εκτελεσθεί επιτυχώς. Ο πρώτος πίνακας κατακερματισμού ουσιαστικά παρέχει προσπέλαση για στοιχεία συναλλαγών όπου ο walletid είναι αποστολέας. Ο δεύτερος πίνακας κάνει το αντίστροφο: για κάθε walletid παρέχει προσπέλαση για στοιχεία συναλλαγών όπου ο walletid είναι παραλήπτης. Οι πίνακες κατακερματισμού θα χρησιμοποιούν κουβάδες για να εξυπηρετήσουν walletids που παρουσιάζουν «σύγκρουση»/collision (δηλαδή, το αποτέλεσμα της συνάρτησης κατακερματισμού οδηγεί στο ίδιο στοιχείο του hash table). Αν χρειάζονται πιο πολλοί από ένα κουβάδες για να αποθηκευτούν δεδομένα, δημιουργούνται δυναμικά και διατάσσονται σε μια λίστα. 2. Για κάθε walletid που γίνεται hashed σε ένα στοιχείο του senderhashtable, υπάρχει ένα σύνολο από συναλλαγές στις οποίες είναι αποστολέας. Αυτό το σύνολο τοποθετείται σε μια δυναμική linked list. Κάθε κόμβος της λίστας περιέχει προσπέλαση σε στοιχεία μιας συναλλαγής. Αντίστοιχες δομές θα πρέπει να φτιαχτούν και με το receiverhashtable. 3. Για κάθε walletid, μια δομή (δικής σας σχεδιαστικής επιλογής) που να περιέχει προσπέλαση σε στοιχεία του wallet (όπως π.χ., το συνολικό τρέχον balance του walletid, τα bitcoinids που έχει ο walletid στην κατοχή του και το υπόλοιπό τους, κλπ). Όταν η εφαρμογή επεξεργάζεται μια συναλλαγή, πρέπει να ελέγχει αν υπάρχουν αρκετά χρήματα συνολικά στο wallet του αποστολέα πριν προχωρήσει στην ολοκλήρωση της συναλλαγής. Στην περίπτωση που υπάρχουν, κατά την εκτέλεση της συναλλαγής, θα πρέπει να ενημερωθούν σωστά όλες οι κατάλληλες δομές δεδομένων. 4. Ένα δέντρο για κάθε bitcoinid το οποίο θα κρατάει όλη την ιστορία συναλλαγών του bitcoin και θα δημιουργείται δυναμικά καθώς επεξεργάζονται συναλλαγές που εμπλέκουν το συγκεκριμένο bitcoin. Η ρίζα-κόμβος του δέντρου θα περιέχει το walletid του αρχικού ιδιοκτήτη του bitcoinid, και την αρχική αξία του bitcoinid. Για την εκτέλεση μιας συναλλαγής, αν χρειαστούν κάποια χρήματα από το bitcoinid (από το wallet του αποστολέα), η εφαρμογή θα προσθέτει στο δέντρο ένα νέο κόμβο (φύλλο) στο δέντρο που θα περιέχει το walletid του παραλήπτη που έλαβε τα χρήματα και το ποσόν που έλαβε. Επίσης, σε περίπτωση που υπάρχει υπόλοιπο στο το bitcoin μετά την μεταφορά, θα πρέπει να προστεθεί ένας δεύτερος νέος κόμβος που κατοπτρίζει το υπόλοιπο του bitcoin που μένει στον αποστολέα. Για παράδειγμα, το Σχήμα 1 δείχνει ένα δέντρο για το bitcoinid 123 που ξεκινάει στην κατοχή του Α με αξία 50. Όταν ο Α στέλνει στον Μ $20, δημιουργείται ένας νέος κόμβος με στοιχεία Μ και $20 και ένας νέος κόμβος με στοιχεία Α και $30, διότι έμειναν $30 του bitcoin 123 στον Α. Με αυτόν τον τρόπο, μπορεί κανείς να διασχίσει το δέντρο ενός bitcoin και να βρει το ιστορικό των συναλλαγών στο οποίο εμπλέκεται το συγκεκριμένο bitcoin. Το άθροισμα των ποσών των φύλλων του δέντρου θα πρέπει πάντα να είναι ίσο με την αρχική αξία του bitcoin.

Σχήμα 1: Παράδειγμα Καποιων Δομών για την εφαρμογή bitcoin Ο στόχος σας σε αυτή την άσκηση είναι να υπάρξει όσο το δυνατόν μικρότερη επικάλυψη στοιχείων (data duplication). Βεβαιωθείτε πως για κάθε υπο-πρόβλημα που χρειάζεται να επιλύσετε κατά την υλοποίηση της άσκησης, χρησιμοποιείτε τον πιο αποτελεσματικό αλγόριθμο ή δομή δεδομένων. Όποιες σχεδιαστικές αποφάσεις και επιλογές κάνετε κατά την υλοποίηση, θα πρέπει να τις περιγράψετε στο README, στα παραδοτέα. Παραδοτέα - Μια σύντομη και περιεκτική εξήγηση για τις επιλογές που έχετε κάνει στο σχεδιασμό του προγράμματός σας. 1-2 σελίδες ASCII κειμένου είναι αρκετές. Συμπεριλάβετε την εξήγηση και τις οδηγίες για το compilation και την εκτέλεση του προγράμματός σας σε ένα αρχείο README μαζί με τον κώδικα που θα υποβάλετε. - Οποιαδήποτε πηγή πληροφορίας, συμπεριλαμβανομένου και κώδικα που μπορεί να βρήκατε στο Διαδίκτυο ή αλλού θα πρέπει να αναφερθεί στον πηγαίο κώδικά σας αλλά και στο παραπάνω README. - Όλη η δουλειά σας (πηγαίος κώδικας, Makefile και README) σε ένα tar.gz file με ονομασία OnomaEponymoProject1.tar.gz. Προσοχή να υποβάλετε μόνο κώδικα, Makefile, README και όχι τα binaries.

Διαδικαστικά - Για επιπρόσθετες ανακοινώσεις, παρακολουθείτε το forum του μαθήματος στο piazza.com. Η πλήρης διεύθυνση είναι https://piazza.com/uoa.gr/spring2019/k24/home. Η παρακολούθηση του φόρουμ στο Piazza είναι υποχρεωτική. - Το πρόγραμμά σας θα πρέπει να γραφεί σε C (ή C++). Στην περίπτωσή που χρησιμοποιήσετε C++ δεν μπορείτε να χρησιμοποιήσετε τις έτοιμες δομές της Standard Template Library (STL). Σε κάθε περίπτωση το πρόγραμμά σας θα πρέπει να τρέχει στα Linux workstations του Τμήματος. - Ο κώδικάς σας θα πρέπει να αποτελείται από τουλάχιστον δύο (και κατά προτίμηση περισσότερα) διαφορετικά αρχεία. Η χρήση του separate compilation είναι επιτακτική και ο κώδικάς σας θα πρέπει να έχει ένα Makefile. - Βεβαιωθείτε πως ακολουθείτε καλές πρακτικές software engineering κατά την υλοποίηση της άσκησης. Η οργάνωση, η αναγνωσιμότητα και η ύπαρξη σχολίων στον κώδικα αποτελούν κομμάτι της βαθμολογίας σας. - Στα πρώτα δύο μαθήματα κυκλοφορεί hard-copy λίστα στην τάξη στην οποία θα πρέπει οπωσδήποτε να δώσετε το όνομά σας και το Unix user-id σας. Με αυτό τον τρόπο μπορούμε να γνωρίζουμε ότι προτίθεστε να υποβάλετε την παρούσα άσκηση και να προβούμε στις κατάλληλες ενέργειες για την τελική υποβολή της άσκησης. Άλλες σημαντικές παρατηρήσεις - Οι εργασίες είναι ατομικές. - Όποιος υποβάλει / παρουσιάσει κώδικα που δεν έχει γραφτεί από την ίδια/τον ίδιο μηδενίζεται στο μάθημα. - Αν και αναμένεται να συζητήσετε με φίλους και συνεργάτες το πώς θα επιχειρήσετε να δώσετε λύση στο πρόβλημα, αντιγραφή κώδικα (οποιασδήποτε μορφής) είναι κάτι που δεν επιτρέπεται. Οποιοσδήποτε βρεθεί αναμεμειγμένος σε αντιγραφή κώδικα απλά παίρνει μηδέν στο μάθημα. Αυτό ισχύει για όσους εμπλέκονται ανεξάρτητα από το ποιος έδωσε/πήρε κλπ. - Οι ασκήσεις προγραμματισμού μπορούν να δοθούν με καθυστέρηση το πολύ 3 ημερών και με ποινή 5% για κάθε μέρα αργοπορίας. Πέραν των 3 αυτών ημερών, δεν μπορούν να κατατεθούν ασκήσεις.