LOL.... Δε πέρασε ούτε μια ώρα απ την τελευταία μου απορία κ τώρα έχω κ άλλη... Βασικά δεν είναι ακριβώς απορία. Λοιπόν στο προγραμματάκι που έπρεπε να φτιάξω για να μου δίνει τον μεσαίο αριθμό, θα έπρεπε να κάνω κ μια διάταξη στους αριθμούς. Γι αυτή την διάταξη έχει κάποιον κώδικα το βιβλίο μου και είχαμε πει και στο μάθημα μερικές παραλλαγές. Αλλά επειδή δεν μου άρεσε κανένας τρόπος θέλησα να φτιάξω ένα δικό μου. Κ έφτιαξα.
Code:
// Θα πρέπει καταρχάς να τα διατάξω. Στην συνέχεια θα του πω απλά να μου τυπώσει το μεσαίο στοιχείο
public class Median
{
public static void med(double m[])
{
int len = m.length;
double min=m[0];
double temp;
// Καταρχάς να φτιάξουμε τη συνθήκη για το πιο στοιχείο να επιστρέφει
int p;
if (len%2==0)
{
p=len/2-1;
}
else
{
p=(len+1)/2-1; // Τα -1 τα βάζουμε επειδή το πρώτο στοιχέιο του πίνακα έχει δείκτη 0
}
// Και τώρα στην διάταξη
int j=0;
while(j<len)
{
for (int i=1 ; i<len ; i++)
{
if(m[i] < m[i-1])
{
temp = m[i]; // Εδώ γίνεται η μετάθεση
m[i] = m[i-1];
m[i-1] = temp;
}
}
j++;
}
for(int k=0 ; k<len ; k++)
{
System.out.print(m[k]+" ");
}
System.out.println(" ");
System.out.println("O μεσαίος αριθμός είναι το " + m[p]);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(" ");
}
}
Το προγραμματάκι δουλεύει άψογα. Επειδή όμως είμαι άπειρος στον προγραμματισμό θα ήθελα να μου πείτε αν έχει κάποια ατέλεια το κομμάτι του κώδικα που μου κάνει την διάταξη (κόκκινο). Ο λόγος που έχω αμφιβολίες είναι επειδή μου φαίνεται πραγματικά ο πιο απλός κώδικας για να κάνει κάποιος διάταξη και δεν τον έχω δει πουθενά αλλού.
ΥΓ: Σε άλλες κώδικες που έχω δει, κανείς δεν χρησιμοποιεί while... Υπάρχει πρόβλημα με αυτό?
Τελευταία επεξεργασία από lunatic. 03-08-2010 στις 17:31.
Αυτοι που νομιζουν οτι τα ξερουν ολα ενοχλουν εμας που τα ξερουμε.....
Λοιπόν έφτιαξα ένα προγραμματάκι για να ελεγχει αν ο αριθμός που του δίνω είναι πρώτος ή όχι κ να μου το λέει.
Code:
public class Prime // Την εφτιαξα να επιστρέφει και true αν είναι πρωτος και false αν δεν ειναι.
{
public static boolean isPrime(int num)
{
int i;
boolean a=false;
for (i=2; i < num ;i++ )
{
int n = num%i;
if (n==0)
{
a=false;
System.out.println("not a Prime");
break;
}
}
if (i==num)
{
a=true;
System.out.println("~*~*~*~*~*~*~*~*~*~*~*~*~*~* Prime number ~*~*~*~*~*~*~*~*~*~*~*~*~*~*");
}
return a;
}
}
Τώρα θέλω να φτιάξω ένα προγραμματάκι στο οποίο να του δίνω εναν αριθμό κ να μου δείχνει όλους τους πρώτους αριθμούς μέχρι αυτόν. Η ερώτηση λοιπον είναι η εξής. Μπορώ να χρησιμοποιήσω κάπως στην καινούρια κλάση μου το παραπάνω προγραμματάκι?
Δεν εννοώ να κάνω copy paste τον κωδικα. Εννοώ να βάζω σαν όρισμα στο καινουριο προγραμματάκι τον αριθμό n κ μετα να γραφω μια συνθηκη για το Prime.isPrime(n) κ να τρεχει.
Για να το κάνω αυτό όμως δεν πρέπει να επιστρέφει κάτι η κλάση Prime?
Τελευταία επεξεργασία από lunatic. 05-08-2010 στις 14:18.
Αυτοι που νομιζουν οτι τα ξερουν ολα ενοχλουν εμας που τα ξερουμε.....
Ακριβώς όπως τα λες αν και προτείνω να κάνεις τον κώδικα ως εξής...
Code:
public class Prime // Την εφτιαξα να επιστρέφει και true αν είναι πρωτος και false αν δεν ειναι.
{
public static boolean isPrime(int num)
{
int i;
boolean a=true;
for (i=2; i < num ;i++ )
{
int n = num%i;
if (n==0)
{
a=false;
System.out.println("not a Prime");
break;
}
}
if (a==true)
{
a=true;
System.out.println("~*~*~*~*~*~*~*~*~*~*~*~*~*~* Prime number ~*~*~*~*~*~*~*~*~*~*~*~*~*~*");
}
return a;
}
}
Όπως βλέπεις ξεκινάς με την πεποίθηση ότι ο αριθμός είναι prime number και για αυτό έχεις το a=true. Αν τελικά βρεθεί ότι δεν είναι prime τότε θα γίνει false και παρακάτω θα ελέγξεις με βάση το a τι είναι τελικά ο αριθμός ώστε να εμφανίσεις το κατάλληλο μήνυμα.
Για να ελέγξεις πάλι prime numbers μέχρι ένα αριθμό θα βάλεις ένα βρόγχο που θα τρέχει από το 2 μέχρι τον αριθμό και θα καλεί την isPrime με όρισμα τον κάθε αριθμό. Θα ελέγχει την επιστροφή της isPrime αν είναι true η false και θα εκτυπώνει ανάλογα για τον κάθε αριθμό. Δηλαδή θα έχεις κάτι σαν αυτό
Code:
int x;
int limit_arithmos = 50;
for (x= 2; x < limit_arithmos + 1; x++)
{
boolean isprime = Prime.isPrime(x);
if (isprime == true)
System.out.println (x + " = Prime Number!");
else
System.out.println (x + " = Not a Prime Number");
}
limit_arithmos θα είναι αυτός μέχρι τον οποίο θες να ψάξεις. Πάρε τον κώδικα, κάνε τις απαραίτητες διορθώσεις γιατί δεν ξέρω java και πες μας.
public class PrintPrimeUpTo
{
public static void primeTo(int n)
{
for (int i=2 ; i<= n ; i++)
{
boolean a = Prime.isPrime(i);
if(a==true)
{
System.out.println(i);
}
}
}
}
Ωραία δουλεύει κομπλέ.
Στον κωδικα της κλάσης Prime αντί για false που το είχα βάλει εγώ, το έβαλες true. Το να ορίζουμε μια boolean τιμή true είναι κάποιο είδος άτυπης συνθήκης μεταξύ προγραμματιστών ή υπάρχει πρακτικό πρόβλημα με το false?
Αυτοι που νομιζουν οτι τα ξερουν ολα ενοχλουν εμας που τα ξερουμε.....
Κοίτα δεν υπάρχει πρόβλημα γενικά ούτε κάποιο standard. Ότι θέλεις κάνεις. Και ο δικός σου τρόπος δούλευε. Απλά νομίζω ότι με τον τρόπο που έγινε τώρα (με το true) είναι πιο καθαρό και εύκολο προς κατανόηση από τον προγραμματιστή.
LOL.... Δε πέρασε ούτε μια ώρα απ την τελευταία μου απορία κ τώρα έχω κ άλλη... Βασικά δεν είναι ακριβώς απορία. Λοιπόν στο προγραμματάκι που έπρεπε να φτιάξω για να μου δίνει τον μεσαίο αριθμό, θα έπρεπε να κάνω κ μια διάταξη στους αριθμούς. Γι αυτή την διάταξη έχει κάποιον κώδικα το βιβλίο μου και είχαμε πει και στο μάθημα μερικές παραλλαγές. Αλλά επειδή δεν μου άρεσε κανένας τρόπος θέλησα να φτιάξω ένα δικό μου. Κ έφτιαξα.
Code:
// Θα πρέπει καταρχάς να τα διατάξω. Στην συνέχεια θα του πω απλά να μου τυπώσει το μεσαίο στοιχείο
public class Median
{
public static void med(double m[])
{
int len = m.length;
double min=m[0];
double temp;
// Καταρχάς να φτιάξουμε τη συνθήκη για το πιο στοιχείο να επιστρέφει
int p;
if (len%2==0)
{
p=len/2-1;
}
else
{
p=(len+1)/2-1; // Τα -1 τα βάζουμε επειδή το πρώτο στοιχέιο του πίνακα έχει δείκτη 0
}
// Και τώρα στην διάταξη
int j=0;
while(j<len)
{
for (int i=1 ; i<len ; i++)
{
if(m[i] < m[i-1])
{
temp = m[i]; // Εδώ γίνεται η μετάθεση
m[i] = m[i-1];
m[i-1] = temp;
}
}
j++;
}
for(int k=0 ; k<len ; k++)
{
System.out.print(m[k]+" ");
}
System.out.println(" ");
System.out.println("O μεσαίος αριθμός είναι το " + m[p]);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(" ");
}
}
Το προγραμματάκι δουλεύει άψογα. Επειδή όμως είμαι άπειρος στον προγραμματισμό θα ήθελα να μου πείτε αν έχει κάποια ατέλεια το κομμάτι του κώδικα που μου κάνει την διάταξη (κόκκινο). Ο λόγος που έχω αμφιβολίες είναι επειδή μου φαίνεται πραγματικά ο πιο απλός κώδικας για να κάνει κάποιος διάταξη και δεν τον έχω δει πουθενά αλλού.
ΥΓ: Σε άλλες κώδικες που έχω δει, κανείς δεν χρησιμοποιεί while... Υπάρχει πρόβλημα με αυτό?
Δεν ξέρω java, αλλά είδα το κομμάτι της ταξινόμησης και ήθελα να κάνω ένα σχόλιο. Αφενός, όσον αφορά τη while, δεν υπάρχει πρόβλημα, αλλά δεν έχεις και λόγο να αποφύγεις την for. Αυτό που θες να κάνεις δηλαδή είναι χαρακτηριστικό παράδειγμα για χρήση for και γίνεται προφανώς έτσι: for(j=0; j<len; j++). Στο ζουμί τώρα, αυτό που έχεις κάνει είναι πρακτικά μια bubblesort η οποία κάνει κάποια βήματα περισσότερα από αυτά που χρειάζεται. Η εσωτερική for αυτό που κάνει είναι να ωθεί το μεγαλύτερο στοιχείο του πίνακα στην τελευταία θέση(j=0). Οπότε χρησιμοποιείται η εξωτερική for(while στην περίπτωσή σου) για να γίνει το ίδιο και να γεμίσει η προτελευταία θέση του πίνακα με το αμέσως μικρότερο στοιχείο(για j=1) και η αμέσως προηγούμενη με το αμέσως μικρότερο στοιχείο(για j=2) κ.ο.κ. Η ουσιαστική διαφορά τώρα με την bubblesort είναι ότι μετά το πρώτο πέρασμα έχει ήδη εξασφαλιστεί η τελευταία θέση του πίνακα οπότε δεν χρειάζεται να γίνει κάποια σύγκριση στο δεύτερο πέρασμα για την τελευταία θέση. Και αντίστοιχα με το δεύτερο πέρασμα έχει εξασφαλιστεί και η προτελευταία θέση και πάει λέγοντας. Η bubblesort λοιπόν αποφεύγει αυτές τις άσκοπες συγκρίσεις ώς εξής:
Οπότε χρησιμοποιεί το j για να ορίσει τη θέση του πίνακα που θέλουμε να γεμίσουμε με κάθε πέρασμα μετρώντας αντίστροφα και κόβει την δεύτερη for όταν το i συναντήσει το j και όχι το len. Επίσης αν προσέξεις η εξωτερική for μετράει μια επανάληψη λιγότερη(από len-1 ως 1 και όχι ως 0), αυτό γίνεται γιατί όταν θα έχει τακτοποιηθεί το προτελευταίο στοιχειο m[1] τότε σίγουρα θα είναι τακτοποιημένο και το τελευταίο στοιχείο m[0].
Στον κωδικα της κλάσης Prime αντί για false που το είχα βάλει εγώ, το έβαλες true. Το να ορίζουμε μια boolean τιμή true είναι κάποιο είδος άτυπης συνθήκης μεταξύ προγραμματιστών ή υπάρχει πρακτικό πρόβλημα με το false?
Η διαφορά μεταξύ σας πρακτικά είναι ότι στον δικό σου κώδικα δεν χρειαζόταν το a=false; μέσα στην if(n==0) και στου NGF ότι δεν χρειαζόταν το a=true; στην if(a==true). Εσυ ξεκινάς με false και θεωρείς ότι αν τελειώσεις όλες τις επαναλήψεις έχεις πρώτο αριθμό, ενώ ο NGF ξεκινάει με true και θεωρεί πως αν δεν μπει ποτέ στην if(n==0) έχει πρώτο αριθμό. Όπως είπε και ο NGF δεν υπάρχει διαφορά ουσιαστικά, απλά είναι λίγο πιο ευανάγνωστος ο κώδικας του NGF.
Bookmarks