MSS1 Δημοσ. 7 Δεκεμβρίου 2016 Δημοσ. 7 Δεκεμβρίου 2016 Έχω την εξής εκφώνηση σε άσκηση της java: Να γραφεί μια κλάση με όνομα Criophore και δημόσιο προσδιοριστή. Η κλάση Criophore πρέπει να περιέχει δύο δημόσιες, στατικές μεθόδους mMetaplasm και mOverskim. Η πρώτη μέθοδος mMetaplasm θα πρέπει να δέχεται ως όρισμα μια συμβολοσειρά (String). Η συμβολοσειρά αυτή θα περιέχει το όνομα του αρχείου που πρέπει να δημιουργηθεί. Προσοχή: Για το νέο αρχείο θα πρέπει να ορίσετε και το μονοπάτι στο οποίο θα βρίσκεται (δηλ. στο φάκελο με τις απαντήσεις σας). Το αρχείο αυτό θα πρέπει να έχει τα εξής χαρακτηριστικά: - Μέγεθος: 1229 bytes - Λίστα επιτρεπόμενων bytes: byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}. Η λίστα των επιτρεπόμενων bytes θα πρέπει να οριστεί ως στατικό δημόσιο χαρακτηριστικό της κλάσης Criophore με όνομα aWaxworker. Τα δεδομένα του αρχείου πρέπει να είναι τυχαία και να ακολουθούν ομοιόμορφη κατανομή. (Όλα τα bytes να έχουν περίπου τον ίδιο αριθμό εμφάνισης). Η μέθοδος mMetaplasm θα πρέπει να επιστρέφει μια μεταβλητή τύπου long που θα περιέχει το άθροισμα των τιμών των 500 πρώτων bytes. Η δεύτερη μέθοδος mOverskim θα πρέπει να δέχεται ως όρισμα μία συμβολοσειρά (String) η οποία θα περιέχει το όνομα ενός αρχείου. Το αρχείο θα διαβάζεται στην μνήμη (ορίστε και το μονοπάτι όπως παραπάνω) και θα καταγράφονται για αυτό οι παρακάτω μετρικές: - Μέγεθος - Αριθμός εμφανίσεων για κάθε byte που περιλαμβάνεται στον πίνακα που ορίστηκε στον πίνακα aWaxworker. Τα δεδομένα θα πρέπει να επιστρέφονται ως πίνακας από ακεραίους (int) από την mOverskim. Ο πίνακας αυτός στην θέση 1 (π.χ. a[0]) θα έχει το μεγεθος του αρχείου και στις υπόλοιπες των αριθμό εμφανίσεων για κάθε byte (π.χ. στην θέση 2 τον αριθμό εμφανίσεων του πρώτου byte κ.ο.κ.). Συμβουλή: εξετάστε τις προδιαγραφές των κλάσεων java.io.DataInputStream, java.io.FileInputStream java.io.FileOutputStream και java.io.DataOutputStream και ο κώδικας που έχω γράψει είναι ο εξής: import java.util.Random; import java.io.File; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.BufferedInputStream; import java.io.FileInputStream; public class Criophore { public static byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}; public static long mMetaplasm(String fileName) { String path = "C:\\Users\\............................" + fileName; File f = new File(path); long size = f.length(); size = 1229; BufferedOutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(f)); } catch (FileNotFoundException e) { System.err.println("Unable to open file " + fileName); } long sum = 0; try { for (int i = 0; i < size; i++) { int rand = new Random().nextInt(aWaxworker.length); out.write(aWaxworker[rand]); if (i < 500) { sum += aWaxworker[rand]; } } out.close(); } catch (Exception e) { System.err.println("Unable to open file " + fileName); } return sum; } public static int[] mOverskim(String fileName) { String path = "C:\\Users\\................" + fileName; BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(path)); } catch (FileNotFoundException e) { System.err.println("Unable to open file "); } int[] freq = new int[15]; /* for (int i = 0; i < freq.length; i++) { freq = 0; }*/ try { int b; while ((b = in.read()) != -1) { for (int i = 1; i < 15; i++) { if (b == aWaxworker[i - 1]) { freq++; } } } freq[0] = 1475; in.close(); } catch (Exception e) { System.err.println("Error reading byte "); } return freq; } } Έχω κάνει πάρα πολλές αλλαγές αλλά συνέχεια μου βγάζει το μήνυμα ότι "Δεν δημιουργήθηκε σωστά το αρχείο στην μέθοδο mMetaplasm (λάθος μέγεθος, έπρεπε να είναι 1229 bytes)" Μήπως έχει κανείς κάποια ιδέα τι μπορεί να έχω κανει λάθος: Ευχαριστώ εκ των προτέρων.
tsofras Δημοσ. 7 Δεκεμβρίου 2016 Δημοσ. 7 Δεκεμβρίου 2016 (επεξεργασμένο) Τι java version χρησιμοποιείς? Δεν είναι σωστός ο τρόπος που φτιάχνεις το αρχείο με τα bytes που θέλεις μάλλον Φτιάξε ένα RandomAccessFile και κάλεσε την setLength(), το έγραψα αν και δεν το έχω ξανακάνει ποτέ μπορείς να το δοκιμάσεις /** * Διαβάζει ένα αρχείο σύμφωνα με συγκεκριμένο μέγεθος. * * @param filename * Το όνομα του αρχείου * @param sizeInBytes * Το μέγεθος του αρχείου * * @throws FileNotFoundException * @throws IOException * @author tsofras */ private void readFile(String filename, int sizeInBytes) throws FileNotFoundException, IOException { File file = new File(filename); byte[] sizeByte = new byte[sizeInBytes]; ByteBuffer byteBuffer = ByteBuffer.wrap(sizeByte); long size = byteBuffer.getLong(); RandomAccessFile f = new RandomAccessFile(file, "w"); f.setLength(size); } Άλλος τρόπος είναι να περάσεις τα bytes στον InputStream , περίεργη άσκηση πάντως :S Επεξ/σία 7 Δεκεμβρίου 2016 από tsofras
Mike342 Δημοσ. 6 Δεκεμβρίου 2019 Δημοσ. 6 Δεκεμβρίου 2019 Στις 7/12/2016 στις 10:02 ΠΜ, MSS1 είπε Έχω την εξής εκφώνηση σε άσκηση της java: Να γραφεί μια κλάση με όνομα Criophore και δημόσιο προσδιοριστή. Η κλάση Criophore πρέπει να περιέχει δύο δημόσιες, στατικές μεθόδους mMetaplasm και mOverskim. Η πρώτη μέθοδος mMetaplasm θα πρέπει να δέχεται ως όρισμα μια συμβολοσειρά (String). Η συμβολοσειρά αυτή θα περιέχει το όνομα του αρχείου που πρέπει να δημιουργηθεί. Προσοχή: Για το νέο αρχείο θα πρέπει να ορίσετε και το μονοπάτι στο οποίο θα βρίσκεται (δηλ. στο φάκελο με τις απαντήσεις σας). Το αρχείο αυτό θα πρέπει να έχει τα εξής χαρακτηριστικά: - Μέγεθος: 1229 bytes - Λίστα επιτρεπόμενων bytes: byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}. Η λίστα των επιτρεπόμενων bytes θα πρέπει να οριστεί ως στατικό δημόσιο χαρακτηριστικό της κλάσης Criophore με όνομα aWaxworker. Τα δεδομένα του αρχείου πρέπει να είναι τυχαία και να ακολουθούν ομοιόμορφη κατανομή. (Όλα τα bytes να έχουν περίπου τον ίδιο αριθμό εμφάνισης). Η μέθοδος mMetaplasm θα πρέπει να επιστρέφει μια μεταβλητή τύπου long που θα περιέχει το άθροισμα των τιμών των 500 πρώτων bytes. Η δεύτερη μέθοδος mOverskim θα πρέπει να δέχεται ως όρισμα μία συμβολοσειρά (String) η οποία θα περιέχει το όνομα ενός αρχείου. Το αρχείο θα διαβάζεται στην μνήμη (ορίστε και το μονοπάτι όπως παραπάνω) και θα καταγράφονται για αυτό οι παρακάτω μετρικές: - Μέγεθος - Αριθμός εμφανίσεων για κάθε byte που περιλαμβάνεται στον πίνακα που ορίστηκε στον πίνακα aWaxworker. Τα δεδομένα θα πρέπει να επιστρέφονται ως πίνακας από ακεραίους (int) από την mOverskim. Ο πίνακας αυτός στην θέση 1 (π.χ. a[0]) θα έχει το μεγεθος του αρχείου και στις υπόλοιπες των αριθμό εμφανίσεων για κάθε byte (π.χ. στην θέση 2 τον αριθμό εμφανίσεων του πρώτου byte κ.ο.κ.). Συμβουλή: εξετάστε τις προδιαγραφές των κλάσεων java.io.DataInputStream, java.io.FileInputStream java.io.FileOutputStream και java.io.DataOutputStream και ο κώδικας που έχω γράψει είναι ο εξής: import java.util.Random; import java.io.File; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.BufferedInputStream; import java.io.FileInputStream; public class Criophore { public static byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}; public static long mMetaplasm(String fileName) { String path = "C:\\Users\\............................" + fileName; File f = new File(path); long size = f.length(); size = 1229; BufferedOutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(f)); } catch (FileNotFoundException e) { System.err.println("Unable to open file " + fileName); } long sum = 0; try { for (int i = 0; i < size; i++) { int rand = new Random().nextInt(aWaxworker.length); out.write(aWaxworker[rand]); if (i < 500) { sum += aWaxworker[rand]; } } out.close(); } catch (Exception e) { System.err.println("Unable to open file " + fileName); } return sum; } public static int[] mOverskim(String fileName) { String path = "C:\\Users\\................" + fileName; BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(path)); } catch (FileNotFoundException e) { System.err.println("Unable to open file "); } int[] freq = new int[15]; /* for (int i = 0; i < freq.length; i++) { freq = 0; }*/ try { int b; while ((b = in.read()) != -1) { for (int i = 1; i < 15; i++) { if (b == aWaxworker[i - 1]) { freq++; } } } freq[0] = 1475; in.close(); } catch (Exception e) { System.err.println("Error reading byte "); } return freq; } } Έχω κάνει πάρα πολλές αλλαγές αλλά συνέχεια μου βγάζει το μήνυμα ότι "Δεν δημιουργήθηκε σωστά το αρχείο στην μέθοδο mMetaplasm (λάθος μέγεθος, έπρεπε να είναι 1229 bytes)" Μήπως έχει κανείς κάποια ιδέα τι μπορεί να έχω κανει λάθος: Ευχαριστώ εκ των προτέρων. Τελικά βρήκες το σωστό προγράμμα γιατί αντιμετωπίζω το ίδιο πρόβλημα; Ευχαριστώ
MitsarasAth Δημοσ. 7 Δεκεμβρίου 2019 Δημοσ. 7 Δεκεμβρίου 2019 Αναφορά σε κείμενο δημόσιο προσδιοριστή,να περιέχει δύο δημόσιες,συμβολοσειρά καπου πονεσαν τα ματια μας... Τα αγγλικα δεν ειναι απο hype και απο ψωνιο στον κλαδο αυτο,αλλα με αυτα τα keywords μπορεις να ψαχνεις στο internet. και αυτο πρεπει να το περνανε απο την σχολη... 1
nask00s Δημοσ. 15 Δεκεμβρίου 2019 Δημοσ. 15 Δεκεμβρίου 2019 public static int[] mOverskim(String fileName) { String path = fileName; int[] freq = new int[aWaxworker.length + 1]; try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(path))) { int character = in.read(); while(character != -1) { freq[0]++; freq[character-96]++; b = in.read(); } } catch (Exception e) { System.err.println("error"); } return freq; } Αυτός είναι ένας τρόπος να το πετύχεις. Ο πινακας freq έχει την συχνότητα εμφανισης για καθε χαρακτήρα (εκτός απο την πρωτη θεση freq[0] που περιεχει το συνολο) freq[1] αντιστοιχή στο aWaxworker[0] δηλαδή στο 97 freq[2] αντιστοιχή στο aWaxworker[1] δηλαδή στο 98 και παει λεγοντας Εκμεταλευόμενος οτι ο aWaxworker είναι παντα ο ιδιος και περιεχει αυξανομενους αριθμούς σε σειρα μπορείς να πεις freq[character-96]++; αντι για να ψαχνεις την αντιστοιχία freq -> aWaxworker Γιατί o μικρότερος χαρακτηρας σου ειναι το 97 και ο μεγαλύτερος το 103 άρα 97 - 96 = 1 δηλαδή στη θέση 1 (freq[1]) έχεις τη συχνότητα του 97 και 103 - 96 = 7 δηλαδή στη θέση 7 (freq[7]) έχεις τη συχνότητα του 103
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα