Προγραμματιστής C++

Δημιουργήστε μια εφαρμογή που μπορεί να χρησιμοποιηθεί για την αναζήτηση μιας συμβολοσειράς σε αρχεία.

Είσοδος:

Η εφαρμογή θα λάβει δύο παραμέτρους γραμμής εντολών. Η πρώτη παράμετρος είναι μια διαδρομή προς ένα αρχείο ή φάκελο, ενώ η δεύτερη παράμετρος είναι η συμβολοσειρά που θα αναζητηθεί (μέγιστο μήκος 128 χαρακτήρες).


Έξοδος:

Εκτύπωση της εξόδου σε γραμμές stdout σε μορφή <αρχείο>(<θέση>): <πρόθεμα>…<κατάληξη>”.
<αρχείο>: Όνομα αρχείου που περιέχει τη συμβολοσειρά
<θέση>: Μετατόπιση εντός του αρχείου από όπου ξεκίνησε η συμβολοσειρά (με βάση το μηδέν).
<πρόθεμα>: Περιέχει τρεις χαρακτήρες μπροστά από την αντιστοίχιση
<κατάληξη>: Περιέχει τρεις χαρακτήρες μετά την αντιστοίχιση.

Όταν δεν υπάρχουν αρκετοί χαρακτήρες για ολόκληρο το πρόθεμα ή την κατάληξη (στην αρχή ή το τέλος του αρχείου), χρησιμοποιήστε όσους είναι διαθέσιμοι. Στα προθέματα και τις καταλήξεις, οι καρτέλες θα πρέπει να εκτυπώνονται ως "\t" και οι νέες γραμμές ως "\n".

Ας υποθέσουμε ότι η διαδρομή μπορεί να οδηγεί είτε σε ένα μεμονωμένο αρχείο κειμένου είτε σε έναν κατάλογο με αρχεία ή/και περισσότερους φακέλους (η εφαρμογή σας θα πρέπει να μπορεί να διατρέχει και να επεξεργάζεται αναδρομικά όλα τα αρχεία στους υποκαταλόγους). Η εφαρμογή πρέπει να λαμβάνει υπόψη ότι τα αρχεία ενδέχεται να είναι πολύ μεγάλα (πιθανοί περιορισμοί/περιορισμοί μνήμης). Η εφαρμογή δεν πρέπει να διακοπεί για κανένα λόγο (βεβαιωθείτε ότι οι εξαιρέσεις αντιμετωπίζονται σωστά, χειρισμός σφαλμάτων από συναρτήσεις API κ.λπ.) και θα πρέπει να εμφανίζει τα σημαντικά μηνύματα σφαλμάτων όταν παρουσιαστεί κάποιο πρόβλημα (ενημερώνοντας ότι δεν υπήρχαν αρκετά ορίσματα, η διαδρομή εισόδου δεν είναι έγκυρη, κλπ.).

Σημείωμα! Η λύση θα πρέπει να κάνει χρήση multi-threading στην επεξεργασία δεδομένων (τουλάχιστον θεωρητικά). Λάβετε υπόψη ότι μια λύση ενός thread μπορεί να είναι πιο γρήγορη σε αυτήν τη διαδοχική σάρωση, ειδικά σε πιο αργούς δίσκους. Προσπαθήστε να μεγιστοποιήσετε την ταχύτητα και να συγκρίνετε τα αποτελέσματά σας με μια λύση μονού thread.

Τι θα αξιολογήσουμε

Το πώς θα δημιουργήσετε την εφαρμογή σας σας εξαρτάται από εσάς. Παρακαλούμε αφιερώστε χρόνο. Είναι πάντα καλύτερο να απαιτηθεί περισσότερος χρόνος αλλά η λύση σας να είναι εξαιρετική, παρά να αφιερώνετε λιγότερο χρόνο και να μας στείλετε ένα "απλά καλό" αποτέλεσμα. Θα χρησιμοποιήσουμε τη λύση σας για να εκτιμήσουμε το επίπεδο εμπειρίας σας στη μηχανική λογισμικού. Μια καλοσχεδιασμένη εφαρμογή θα εγγυηθεί ότι θα σας καλέσουμε για συνέντευξη, ένα υψηλότερο επίπεδο εργασίας και ένα πιο ελκυστικό πακέτο αποδοχών. Η λύση σας θα συζητηθεί λεπτομερώς κατά τη διάρκεια της συνέντευξης.

Ο πηγαίος κώδικας σας πρέπει να δείχνει:

  • το στυλ προγραμματισμού σας,
  • χρήση αντικειμενοστραφούς προγραμματισμού,
  • βέλτιστες πρακτικές προγραμματισμού C++,
  • συστηματική χρήση συμβάσεων ονομασίας,
  • χρήση των σωστών σχολίων στο σωστό μέρος,
  • καλή δομή κώδικα,
  • χειρισμός καταστάσεων σφαλμάτων και εξαιρέσεων,
  • αποφυγή επικίνδυνων ή επιρρεπών σε σφάλματα δομών,
  • την κατανόησή σας για τις "εσωτερικές λειτουργίες" της C++ και τυπικών λειτουργιών (π.χ.: σπατάλη μνήμης ή περιττές (σιωπηρές/εσωτερικές) λειτουργίες αντιγραφής συμβολοσειράς/μνήμης).

Προφανώς θα πρέπει να αποφύγετε τις διαρροές μνήμης (π.χ. λόγω μη χειριζόμενης εξαίρεσης). Προτιμούμε να δούμε να χρησιμοποιούνται τυπικές βιβλιοθήκες C++ 14, αλλά η χρήση του Boost είναι επίσης αποδεκτή.

Ένα απόσπασμα που το εξηγεί αρκετά καλά είναι το εξής: "Πάντα να γράφετε κώδικα σαν αυτός που θα τον συντηρεί είναι ένας βίαιος ψυχοπαθής που ξέρει πού ζείτε". :-)

Στείλτε μας τη λύση σας στην ακόλουθη διεύθυνση email: challenge@joineset.com


Αποδεχόμενοι αυτή την πρόκληση, αποδέχεστε τους Όρους και τις Προϋποθέσεις της ESET και αναγνωρίζετε την Πολιτική Απορρήτου της ESET