Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα. Έχω μία άσκηση που λέει να δίνω μια πρόταση την οποία μετά με μια μέθοδο(encrypt) που θα πέρνει ως όρισμα την προταση που εδωσα θα την κωδικοποιεί(αντικαθιστώντας πχ οπου υπαρχει το γράμμα "v" με το "ag',r") και θα επιστρέφει μια μεταβλητή τύπου string οπου θα είναι η πρόταση μας κωδικοποιημένη.

Η java είναι καινούργια για μένα μόνο κάποια πράγματα για C ξέρω :/ Υπάρχουν πολλά λάθοι σίγουρα έστω κί ένα από αυτά αν μου επισημάνετε θα με βοηθήσετε πολύ. Ευχαριστώ

 

import java.util.Scanner;

 

public class Crypto

{

public static void main(String[] args)

{

Scanner input = new Scanner(System.in);

System.out.println("Enter a sentence that is to be encrypted:");

String sen = input.nextLine();

System.out.println("Original sentence = " +sen);

String encrypted_sentence = encrypt(sen);

System.out.println("Encrypted sentence is = " +encrypted_sentence);

}

 

public static String encrypt(String sen)

{

 

for(int i=0; i<sen.length; i++)

{

if(sen=="v")

{

sen="ag',r";

}

if(sen=="m")

{

sen="ssad";

}

if(sen=="g")

{

sen="jeb.w";

}

if(sen=="b")

{

sen="dag>?/"

}

 

}

return sen;

 

}

 

}

 

Επίσης για να μην τα γράφω έτσι πείτε μου τι βάζω για να φένετε σαν κώδικας :) ευχαριστώ.

Δημοσ.

Καλησπέρα monkey90,

 

αρχικά θα πρέπει να έχεις υπόψη σου το σημείο αναφοράς για τη java, το οποίο είναι το api του:

http://download.oracle.com/javase/1,5.0/docs/api/

 

ξεκινώντας από εκεί θα δεις για παράδειγμα ότι δεν έχεις καλέσει σωστά τη μέθοδο length() (ενώ θα μπορείς να μάθεις και άλλες μεθόδους οι οποίες θα σου χρησιμεύσουν). Επίσης θέλεις να το κάνεις με πίνακες ενώ δεν έχεις δημιουργήσει πουθενά κάποιον - και τα δυο παραπάνω έχουν να κάνουν σχέση με τη μέθοδο encrypt.

 

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

 

Αυτά τα λίγα για αρχή. Δούλεψέ το λίγο και πες αν κολλήσεις πάλι κάπου.

Δημοσ.

Καλησπέρα. Έχω μία άσκηση που λέει να δίνω μια πρόταση την οποία μετά με μια μέθοδο(encrypt) που θα πέρνει ως όρισμα την προταση που εδωσα θα την κωδικοποιεί(αντικαθιστώντας πχ οπου υπαρχει το γράμμα "v" με το "ag',r") και θα επιστρέφει μια μεταβλητή τύπου string οπου θα είναι η πρόταση μας κωδικοποιημένη.

Η java είναι καινούργια για μένα μόνο κάποια πράγματα για C ξέρω :/ Υπάρχουν πολλά λάθοι σίγουρα έστω κί ένα από αυτά αν μου επισημάνετε θα με βοηθήσετε πολύ. Ευχαριστώ

 

 

import java.util.Scanner;

 

public class Crypto

{

public static void main(String[] args)

{

Scanner input = new Scanner(System.in);

System.out.println("Enter a sentence that is to be encrypted:");

String sen = input.nextLine();

System.out.println("Original sentence = " +sen);

String encrypted_sentence = encrypt(sen);

System.out.println("Encrypted sentence is = " +encrypted_sentence);

}

 

public static String encrypt(String sen)

{

 

for(int i=0; i<sen.length; i++)

{

if(sen=="v")

{

sen="ag',r";

}

if(sen=="m")

{

sen="ssad";

}

if(sen=="g")

{

sen="jeb.w";

}

if(sen=="b")

{

sen="dag>?/"

}

 

}

return sen;

 

}

 

}

 

 

Επίσης για να μην τα γράφω έτσι πείτε μου τι βάζω για να φένετε σαν κώδικας :) ευχαριστώ.

 

Επειδή φαίνεται οτι το παλεύεις (οχι απλά γράφεις την εκφώνηση και περιμένεις την απαντηση), αξίζεις βοήθεια. Μπορείς να χρησιμοποιήσεις είτε StringBuffer, είτε πίνακες αλλά οχι σκέτο String. Ο λόγος ειναι οτι το απλό String δεν επιτρέπει αλλαγές σε επιμέρους γράμματα, ούτε προσθήκες στο τέλος.

 

Στον παρακάτω κώδικα διαβαζει ενα-ενα τα γράμματα από το αρχικό string και κάνει τις ανάλογες προσθήκες στο τέλος ενός StringBuffer. Θα μπορούσες να το κάνεις πιο γρήγορο αν χρησιμοποιούσες switch αντί για if. Για απορίες, ρώτα.

 

Για το πως εισάγεις κωδικά. Πάνω στα εικονίδια (που ειναι το B U I κλπ) δες το δεύτερο απο δεξιά.

 

>import java.util.Scanner;

public class Crypto
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.println("Enter a sentence that is to be encrypted:");
String sen = input.nextLine();
System.out.println("Original sentence = " +sen);
System.out.println("=== Starting Encryption === ");

StringBuffer encrypted = new StringBuffer();
	int i = 0;
       char c = sen.charAt(i);

       for( i=0; i<sen.length(); i++)
	{
	c = sen.charAt(i);
		if (c=='v')
		{
				encrypted.append("ag',r");
		} else if (c=='m'){
				encrypted.append("ssad");			
		} else if (c=='g'){
				encrypted.append("jeb.w");			
		} else if (c=='b'){
				encrypted.append("dag>?/");			
		} else {
				encrypted.append(c);
				}
	}
System.out.println("=== Finished === ");
System.out.println("Encrypted sentence is = " +encrypted);
   }

}

Δημοσ.

Επειδή φαίνεται οτι το παλεύεις (οχι απλά γράφεις την εκφώνηση και περιμένεις την απαντηση), αξίζεις βοήθεια. Μπορείς να χρησιμοποιήσεις είτε StringBuffer, είτε πίνακες αλλά οχι σκέτο String. Ο λόγος ειναι οτι το απλό String δεν επιτρέπει αλλαγές σε επιμέρους γράμματα, ούτε προσθήκες στο τέλος.

 

Γίνεται και με String, χρησιμοποιώντας τον τελεστή + ή την ισοδύναμη μέθοδο concat(), ενδεικτικά:

 

>result = result + "abc";

ή και

>result += "abc";

 

Η χρήση StringBuffer όμως είναι πιο αποτελεσματική αν πρόκειται να γίνουν πολλές συνενώσεις.

Δημοσ.

Ευχαριστώ πάρα πολύ για τις συμβουλές σας κατάφερα να λύσω την άσκηση και με τους 2 τρόπους που μου είπατε. B)

Δημοσ.

Η άσκηση έχει ολοκληρωθεί αλλά είναι ενδιαφέρον αυτό που λες. Η εντολή replace που έγραψες βρήσκει κατευθείαν όλα τα n ξερω γω που υπάρχουν στο sen και τα αλλάζει? :whistle:

Δημοσ.

δεν τα αλλάζει επιστρέφει string που περιέχει το αποτέλεσμα της αλλαγής, για να αλλάξεις το αρχικό string θα πρέπει να πεις κάτι του στιλ :

sen = sen.replace("a","b");

 

και επειδή η συνάρτηση επιστρέφει string μπορείς να την καλέσεις απανωτά στα αποτελέσματά της όπως στο παράδειγμα που σου έδωσα

sen.replace("n","ag',r").replace("m","ssad").replace(....και πάει λέγοντας)

 

αντίστοιχα υπάρχει και η replaceFirst(); που φαντάζομαι καταλαβαίνεις τι κάνει.

Δημοσ.

Στη συγκεκριμένη άσκηση βέβαια, αυτό δεν θα δούλευε σωστά, γιατί αν δούμε τον κώδικα που δίνει στην αρχή, προσπαθεί να αντικαταστήσει το 'v' με "ag',r" και ταυτόχρονα (δηλ. στο αρχικό string) το 'g' με "jeb.w" ενώ αυτή η «αλυσιδωτή» replace() δεν θα είχε το ίδιο αποτέλεσμα, αλλά θα αντικαθιστούσε και το νέο 'g'.

Δημοσ.

Αυτή είναι η μικρή παγίδα που είχα πει στην αρχή. Αν γίνει με απανωτά replace στο τέλος θα έχει ένα μήνυμα που δεν θα μπορεί να αποκρυπτογραφηθεί σωστά. Για παράδειγμα, αν θες να κρυπτογραφήσεις το String "mbgv" (που είναι οι χαρακτήρες που θες να κρυπτογραφήσεις), αντί για το "ssaddag>?/jeb.wag',r" που περιμένεις θα σου δώσει "ssaddag>?/jedag>?/.wajedag>?/.w',r". Τα πράγματα γίνονται ακόμα χειρότερα αν προκύψει κάποιο String που περιέχει το "v" πριν από το "g" πριν από το "b". Αν κρυπτογραφήσουμε δηλαδή το "vgbm" τότε αντί για "ag',rjeb.wdag>?/ssad" θα βγει το "ajedag>?/.w',rjedag>?/.wdag>?/ssad" - τελείως διαφορετικό. Άρα τα συνεχή replace σε αυτό το πρόβλημα δεν είναι η σωστή λύση.

Δημοσ.

Αυτή είναι η μικρή παγίδα που είχα πει στην αρχή. Αν γίνει με απανωτά replace στο τέλος θα έχει ένα μήνυμα που δεν θα μπορεί να αποκρυπτογραφηθεί σωστά. Για παράδειγμα, αν θες να κρυπτογραφήσεις το String "mbgv" (που είναι οι χαρακτήρες που θες να κρυπτογραφήσεις), αντί για το "ssaddag>?/jeb.wag',r" που περιμένεις θα σου δώσει "ssaddag>?/jedag>?/.wajedag>?/.w',r". Τα πράγματα γίνονται ακόμα χειρότερα αν προκύψει κάποιο String που περιέχει το "v" πριν από το "g" πριν από το "b". Αν κρυπτογραφήσουμε δηλαδή το "vgbm" τότε αντί για "ag',rjeb.wdag>?/ssad" θα βγει το "ajedag>?/.w',rjedag>?/.wdag>?/ssad" - τελείως διαφορετικό. Άρα τα συνεχή replace σε αυτό το πρόβλημα δεν είναι η σωστή λύση.

 

σε αυτή την περίπτωση κάνεις sen = sen.replace ("a","◄B►").replace("g","◄d►")

 

και στο τέλος sen = sen.replace("►","").replace("◄","");

τα "◄" και "►" φροντίζουν το κείμενο που αντικαθιστάς να μην συμμετέχει σε νέες αντικαταστάσεις και στο τέλος απλά τα αφαιρείς. Ακόμα και έτσι είναι πιό απλή και γρήγορη σαν λύση.

Δημοσ.

σε αυτή την περίπτωση κάνεις sen = sen.replace ("a","◄B►").replace("g","◄d►")

 

και στο τέλος sen = sen.replace("►","").replace("◄","");

τα "◄" και "►" φροντίζουν το κείμενο που αντικαθιστάς να μην συμμετέχει σε νέες αντικαταστάσεις και στο τέλος απλά τα αφαιρείς. Ακόμα και έτσι είναι πιό απλή και γρήγορη σαν λύση.

 

Δεν νομίζω ότι είναι πιο απλή λύση, γιατί πρέπει να προσέξεις όλες τις αντίστοιχες περίεργες αντικαταστάσεις που μπορεί να συμβούν (και που σε μια γενικότερη περίπτωση μπορεί να είναι πιο πολλές). Επιπλέον πρέπει να είσαι 100% σίγουρος ότι το κείμενο δεν θα περιέχει τους ειδικούς χαρακτήρες που χρησιμοποιείς. Εντάξει, μπορείς να είσαι 99,999999999999999999% σίγουρος ότι τέτοιοι χαρακτήρες δεν θα υπάρχουν σε φυσιολογικά κείμενα, όμως τα bugs συμβαίνουν στο υπόλοιπο 0,0000000000000000001% (δεν είμαι σίγουρος για τα μηδενικά :rolleyes:) των περιπτώσεων -- και σύμφωνα με τον νόμο του Murphy, κάποια στιγμή θα συμβούν. Συνολικά η λύση που προτείνεις απλώς ΔΕΝ είναι σωστή!

 

Όσο για το πιο γρήγορη, επίσης εξαρτάται και για να αποδειχθεί πρέπει να γίνουν δοκιμές. Αν και δύσκολο το βλέπω να είναι πιο γρήγορη, γιατί κάθε replace() πρέπει να περάσει από όλο το string (φαντάσου να υπήρχαν περισσότεροι από λίγοι κανόνες αντικατάστασης!), ενώ με την άλλη λύση περνάμε μόνο μία φορά.

 

Το μόνο στο οποίο υπερτερεί είναι ότι έχει πολύ πιο σύντομο κώδικα.

Δημοσ.

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

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...