Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Διδάσκοντες: Γ. Γραββάνης, Επ. Καθηγητής

Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό ilias » 20 Ιαν 2010, 12:21

Στην εργασία της java υπάρχει κανείς που να έχει κάνει την 5 και 6 άσκηση΄?
Στην 5 πρέπει να υπολογ΄σουμε το γινόμενο ενός διανύσματος χ με ένα τρι-διαγώνιο πίνακα(ο πίνακας που όλα τα στοιχέια του είναι κενά εκτός από τα κελιά στην διαγώνιο,την υπερδιαγώνιο και την υποδιαγώνιο)Δεν έχουμε κάνει κατι τετοιο στη Γραμμική αλγεβρα...........Κανείς καμία ιδέα?

Στην 6 εισάγει ο χρήστης ένα κείμενο από το πληκτρολόγιο και πρέπει το πρόγραμμα να υπολογίζει τον αριθμό των λέξεων και τών προτάσεων.
Χρησιμοποιώ ενα string και μετά σπαω το string με ένα split.Το θέμα είναι ότι για μετρήσω τις λέξεις πρέπει να σπάσω το string εκεί που υπαρχουν οχι μόνο κενά αλλά και κόμματα και τελείες.Όταν το κάνω όμως μου βγάζει λά8ος αποτελέσμα :'( Μπορεί κάποιος να εξηγησει πώς λειτουργεί το split και η σύνταξη του?
Τελευταία επεξεργασία από megatron και 20 Ιαν 2010, 20:50, έχει επεξεργασθεί 1 φορά/ες συνολικά
Αιτία: Προσθήκη μαθήματος και ακαδημαικού έτους στον τίτλο
ilias
Newbie
 
Δημοσιεύσεις: 3
Εγγραφή: 20 Ιαν 2010, 11:49

Re: Εργασία java

Δημοσίευσηαπό Stokos » 20 Ιαν 2010, 15:09

1ο ερώτημα

Έστω ο τριδιαγώνιος πίνακας Α (πάντα τετραγωνικός):

$\[A_{n,n} = \begin{pmatrix}
a_{1,1} & a_{1,2} & 0 & 0 & \cdots & 0 \\
a_{2,1} & a_{2,2} & a_{2,3} & 0 & \cdots & 0 \\
0 & a_{3,2} & a_{3,3} & a_{3,4} & \cdots & 0 \\
\vdots & & & \ddots & \vdots \\
0 & \cdots & 0 & a_{n,n-1} & a_{n,n}
\end{pmatrix}
\]$

και

έστω το διάνυσμα χ:

$\[\vec{x_{n}} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{pmatrix}\]$

Το γινόμενό τους έστω u είναι ένα n-διάστατο διάνυσμα της μορφής:

$\[\vec{u_{n}} = \begin{pmatrix}
a_{1,1} \cdot x_1 + a_{1,2} \cdot x_2 + 0 \\
a_{2,1} \cdot x_1 + a_{2,2} \cdot x_2 + a_{2,3} \cdot x_3 \\
a_{3,2} \cdot x_2 + a_{3,3} \cdot x_3 + a_{3,4} \cdot x_4 \\
\vdots \\
0 + a_{n,n-1} \cdot x_{n-1} + a_{n,n} \cdot x_n\\
\end{pmatrix}\]$

Όπως βλέπεις στο διάνυσμα του γινομένου, έχεις άθροισμα τριάδων. Για να το προγραμματίσεις θα χρειαστείς έναν μετρητή (έστω j) που θα μεταβάλλεται από 1 έως n.

Κάθε συντεταγμένη του γινομένου σχηματίζεται από τον εξής τύπο: u[j] = a[j,j-1]*x[j-1] + a[j,j]*x[j] + a[j,j+1]*x[j+1]
Προσοχή! για j=1 και j=n (πρώτη και τελευταία γραμμή) βγαίνουμε εκτός των ορίων του πίνακα (0 και n+1) άρα πρέπει να τα "μηδενίσεις".

Θα κάνουμε επαλήθευση στο παραπάνω τύπο, για να δούμε αν θα μας δώσει τα στοιχεία που βγάλαμε παραπάνω:
j=1: u[1] = a[1,0]*x[0] + a[1,1]*x[1] + a[1,2]*x[2] = a[1,1]*x[1] + a[1,2]*x[2]
j=2: u[2] = a[2,1]*x[1] + a[2,2]*x[2] + a[2,3]*x[3]
...
j=n: u[n] = a[n,n-1]*x[n-1] + a[n,n]*x[n] + a[n,n+1]*x[n+1] = a[n,n-1]*x[n-1] + a[n,n]*x[n]

Άρα τώρα μπορούμε να αρχίσουμε να προγραμματίζουμε...

*Σημείωση: Ίσως έκανα υπερβολική ανάλυση του προβλήματος. Στόχος μου, όμως, είναι να δείξω σε εσένα (και κάθε άλλο τυχόν μελλοντικό αναγνώστη του forum) βήμα-βήμα τη διαδικασία με την οποία πρέπει να σκεφτόμαστε για να αναγάγουμε ένα (πολύ απλό στη συγκεκριμένη περίπτωση) μαθηματικό πρόβλημα σε αλγόριθμο, ώστε στη συνέχεια να μπορέσουμε να το προγραμματίσουμε.

**Κώδικας σε LaTeX που χρησιμοποιήθηκε για την αναπαράσταση των πινάκων και διανυσμάτων:
Κώδικας: Επιλογή όλων
[tex]\[A_{n,n} = \begin{pmatrix}
 a_{1,1} & a_{1,2} & 0 & 0 & \cdots & 0 \\
 a_{2,1} & a_{2,2} & a_{2,3} & 0 & \cdots & 0 \\
 0 & a_{3,2} & a_{3,3} & a_{3,4} & \cdots & 0 \\
 \vdots  &&& \ddots & \vdots \\
 0 & \cdots & 0 & a_{n,n-1} & a_{n,n}
 \end{pmatrix}\][/tex]

[tex]\[\vec{x_{n}} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n  \\ \end{pmatrix}\][/tex]

[tex]\[\vec{u_{n}} = \begin{pmatrix}
a_{1,1} \cdot x_1 + a_{1,2} \cdot x_2 + 0 \\
a_{2,1} \cdot x_1 + a_{2,2} \cdot x_2 + a_{2,3} \cdot x_3 \\
a_{3,2} \cdot x_2 + a_{3,3} \cdot x_3 + a_{3,4} \cdot x_4 \\
\vdots \\
0 + a_{n,n-1} \cdot x_{n-1} + a_{n,n} \cdot x_n\\
\end{pmatrix}\][/tex]


Τσορμπατζόγλου.Γιώργος
Stokos
 

Re: Εργασία java

Δημοσίευσηαπό ilias » 20 Ιαν 2010, 20:04

Καταρχάς να σε ευχαριστήσω για την απάντηση σου...
Τώρα όσο αφορά την άσκηση το πρόβλημα μου από την αρχή ήταν όχι ότι δεν ξέρω να κάνω πολλαπλασιασμό πινάκων ,αλλά ότι στον πίνακα που δίνεται στην άσκηση τα στοιχεία των τριών διαγώνίων είναι συμπληρώμένα με γράμματα και τα υπόλοιπα είναι κενά(εννοώ ότι τα υπόλοιπά δεν είναι μηδέν αλλά άδεια κελιά)
Δεν ξέρω αν ειναι τυπογραφικό λάθος ή υπονοείται ότι τα υπόλοιπα είναι 0 ή πρόκειται για κάτι αλλο που δν ξέρω.....γι' αυτο ρώτησα. Μπορείς να μου απαντήσεις σχετικά ?αν ξέρεις.

Επιπλέον ωραίος ο τύπος που δίνεις αλλά δυστυχ'ως δν μπορώ να το χρησιμοποήσω δίοτι η άσκηση λέει ότι κά8ε διαγώνιος απο τις τρεις να αποθηκευτεί στη μνήμη ως μονοδιάστατος πίνακας.Επόμένως 8εωρούμε τουσ πίνακες Α[N-1] υποδιαγώνιος, Β[Ν] διαγώνιος, Γ[Ν-1] ύπερδιαγώνιος, Χ[Ν] ,Δ[Ν] το ζητούμενο διάνυσμα.
Με την προυπόθεση ότι τα άλλα στοιχεία είναι 0, η λύση στη java για Ν>=2 είναι:
D[0]=B[0]*X[0]+C[0]*X[1];
for(i=1;i<N-1;i++){
D[i]=A[i-1]*X[i-1] +B[i]*X[i] +C[i]*X[i+1]; }
D[N-1]=A[N-2]*X[N-2] +B[N-1]*X[N-1];
τον δοκίμασα και λειτουργεί κανονικά ...
Τέλος αν μπορεί κάποιος να δώσει κάποιες πληροφορίες για το πως χρησιμοποιείται το split στην java,ας στειλει.
ilias
Newbie
 
Δημοσιεύσεις: 3
Εγγραφή: 20 Ιαν 2010, 11:49

Re: Εργασία java

Δημοσίευσηαπό Stokos » 20 Ιαν 2010, 20:26

ilias έγραψε:Καταρχάς να σε ευχαριστήσω για την απάντηση σου...
Τώρα όσο αφορά την άσκηση το πρόβλημα μου από την αρχή ήταν όχι ότι δεν ξέρω να κάνω πολλαπλασιασμό πινάκων ,αλλά ότι στον πίνακα που δίνεται στην άσκηση τα στοιχεία των τριών διαγώνίων είναι συμπληρώμένα με γράμματα και τα υπόλοιπα είναι κενά(εννοώ ότι τα υπόλοιπά δεν είναι μηδέν αλλά άδεια κελιά) Δεν ξέρω αν ειναι τυπογραφικό λάθος ή υπονοείται ότι τα υπόλοιπα είναι 0 ή πρόκειται για κάτι αλλο που δν ξέρω.....γι' αυτο ρώτησα. Μπορείς να μου απαντήσεις σχετικά ?αν ξέρεις.
.

Γενικά στους αραιούς (sparse) πίνακες όπου τα περισσότερα στοιχεία είναι 0, τα μηδενικά συνηθίζουμε να μη τα αναγράφουμε (αφήνουμε τις θέσεις κενές). Οι (τρι)διαγώνιοι πίνακες θεωρούνται και αυτοί "αραιοί". Τι εννοείς έχει γράμματα στη διαγώνιο; Έχει π.χ. β1,β2 κ.τ.λ. στη κύρια, α1,α2,... και γ1,γ2,... στις δευτερεύουσες διαγωνίους; Αν ναι, μάλλον εννοεί ότι πρέπει να γράψεις συνάρτηση που να εκτελεί το πολλαπλασιασμό και να δοκιμάσεις να τη καλέσεις με διάφορες τιμές.

ilias έγραψε:Επιπλέον ωραίος ο τύπος που δίνεις αλλά δυστυχ'ως δν μπορώ να το χρησιμοποήσω δίοτι η άσκηση λέει ότι κά8ε διαγώνιος απο τις τρεις να αποθηκευτεί στη μνήμη ως μονοδιάστατος πίνακας.Επόμένως 8εωρούμε τουσ πίνακες Α[N-1] υποδιαγώνιος, Β[Ν] διαγώνιος, Γ[Ν-1] ύπερδιαγώνιος, Χ[Ν] ,Δ[Ν] το ζητούμενο διάνυσμα.
Με την προυπόθεση ότι τα άλλα στοιχεία είναι 0, η λύση στη java για Ν>=2 είναι:
D[0]=B[0]*X[0]+C[0]*X[1];
for(i=1;i<N-1;i++){
D[i]=A[i-1]*X[i-1] +B[i]*X[i] +C[i]*X[i+1]; }
D[N-1]=A[N-2]*X[N-2] +B[N-1]*X[N-1];
τον δοκίμασα και λειτουργεί κανονικά ...


Όχι, μπορείς να "χρησιμοποιήσεις" το παραπάνω τύπο... Τα στοιχεία a[j,j-1] και a[j,j+1] αναφέρονται στις δευτερεύουσες διαγώνιους ενώ το a[j,j] στη κύρια διαγώνιο - επομένως, αρκεί να αντικαταστήσεις το a[j,j-1] με Α[j], το a[j,j] με το B[j] και το a[j,j+1] με το Γ[j]. Όπως θα δεις, προκύπτει αυτό που χρησιμοποίησες μέσα στο for σου και σου "λειτούργησε κανονικά" ;)

ilias έγραψε:Τέλος αν μπορεί κάποιος να δώσει κάποιες πληροφορίες για το πως χρησιμοποιείται το split στην java,ας στειλει.

Γι'αυτό το θέμα υπάρχει "άπειρο" υλικό στο internet... Ψάξε "Java Split String"
Stokos
 

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό ilias » 22 Ιαν 2010, 16:37

Ναι όντως είναι η ίδια σχέση με διαφορετική μορφή.Σε κάθε περίπτωσή ευχαρίστω για το χρόνο σου.
ilias
Newbie
 
Δημοσιεύσεις: 3
Εγγραφή: 20 Ιαν 2010, 11:49

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό stelmitr » 24 Ιαν 2010, 17:05

Μπορείς κανείς με επαρκείς γνώσεις στη JAVA να μου πει πως μπορώ να μετρήσω το πλήθος των λέξεων σε ένα String?
stelmitr
Newbie
 
Δημοσιεύσεις: 11
Εγγραφή: 30 Οκτ 2009, 16:12

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό Stokos » 24 Ιαν 2010, 17:21

Μια απλή συνάρτηση:
Κώδικας: Επιλογή όλων
long wordcount(String text){
    long numWords = 0;
    int index = 0;
    boolean prevWhiteSpace = true;
    while(index < text.length()){
      char c = text.charAt(index++);
      boolean currWhiteSpace = Character.isWhitespace(c);
      if(prevWhiteSpace && !currWhiteSpace){
        numWords++;
      }
      prevWhiteSpace = currWhiteSpace;
    }
    return numWords;
  }


Δέχεται ως είσοδο το text ως String και επιστρέφει το νούμερο των λέξεων του String. Αυτό που κάνει είναι να ανατρέχει το κείμενο χαρακτήρα προς χαρακτήρα ψάχνοντας για το ζεύγος [κενό][χαρακτήρας] (ουσιαστικά δηλ. αρχή λέξεως). Κάνει τη παραδοχή ότι μετά τη τελεία αφήνουμε πάντα κενό.

Αν δε καταλαβαίνετε το κώδικα, πείτε μου για να σας τον εξηγήσω αναλυτικότερα...
Stokos
 

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό stelmitr » 24 Ιαν 2010, 18:46

Το δοκίμασα και κείμενο όσων λέξεων και να εισάγω μου δίνει ως πλήθος λέξεων 1...Τι να κάνω ??? ???
stelmitr
Newbie
 
Δημοσιεύσεις: 11
Εγγραφή: 30 Οκτ 2009, 16:12

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό Stokos » 24 Ιαν 2010, 19:05

Χμμμ, κατάλαβα γιατί γίνεται αυτό... Μετράει όλο το κείμενο σαν μια λέξη γιατί δε "βλέπει" τον κενό χαρακτήρα " ".

Επειδή δεν έχω εγκατεστημένο κάποιο IDE για java, δοκίμασε λίγο τα εξής:
* Το Character.isWhitespace(" ") επιστρέφει true ή false;
* Επίσης δοκίμασε το Character.isSpaceChar(" "). Επιστρέφει true ή false;
Stokos
 

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό stelmitr » 24 Ιαν 2010, 19:39

Το δοκίμασα και αυτή τη φορά βγάζει λάθος ο compiler, με αποτέλεσμα να μην τρέχει το πρόγραμμα :( :(
stelmitr
Newbie
 
Δημοσιεύσεις: 11
Εγγραφή: 30 Οκτ 2009, 16:12

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό Stokos » 24 Ιαν 2010, 19:53

Θες να γίνεις πιο σαφής; Τι error βγάζει;

Πάντως αν δεις εδώ οι συναρτήσεις isWhitespace(char ch) και isSpaceChar(char ch) υφίστανται για τη κλάση Character.
Stokos
 

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό antonisi » 24 Ιαν 2010, 20:06

Δοκίμασα και εγώ την συνάρτηση και με τις τρεις εντολές αλλά και στις τρεις περιπτώσεις όταν έτρεξα το πρόγραμμα στον compiler είχε ως αποτέλεσμα 1 ,όποιο κείμενο κ αν του έδινα. :-\
antonisi
Newbie
 
Δημοσιεύσεις: 3
Εγγραφή: 22 Ιαν 2010, 13:23

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό Stokos » 24 Ιαν 2010, 20:30

Για να δίνει 1 συνέχεια σημαίνει ότι η εντολή "numWords++;" δεν εκτελείται πέραν της αρχικής επανάληψης (Δηλ. μετράει μόνο τη πρώτη λέξη). Άρα το πρόβλημα υπάρχει στη συνθήκη του if: prevWhiteSpace && !currWhiteSpace. Επομένως το λάθος είναι σίγουρα στη συνάρτηση της isWhitespace(), isSpaceChar() κ.τ.λ. όπου δεν "διαβάζει" σωστά το κενό χαρακτήρα, δηλ. επιστρέφει πάντα false. Υποψιάζομαι ότι γι'αυτό φταίει το enconding του κειμένου. Σας είπα να δοκιμάσετε να καλέσετε σε ένα δοκιμαστικό προγραμματάκι μια από τις συναρτήσεις αναγνώρισης του κενού με παράμετρο " " να δούμε αν θα δώσει true αλλά δεν έλαβα απάντηση.

Eν πάσει περιπτώσει ξανα-γράφω το κώδικα αντικαθιστώντας τη συνάρτηση με ένα απλό if:

Κώδικας: Επιλογή όλων
long wordcount(String text){
    long numWords = 0;
    int index = 0;
    boolean prevWhiteSpace = true;
    while(index < text.length()){
      char c = text.charAt(index++);
     
      boolean currWhiteSpace = false;
      if(c == ' ') {
        currWhiteSpace = true;
      }

      if(prevWhiteSpace && !currWhiteSpace){
        numWords++;
      }
      prevWhiteSpace = currWhiteSpace;
    }
    return numWords;
}
Stokos
 

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό antonisi » 24 Ιαν 2010, 20:50

Δοκίμασαμε να καλέσουμε τη συνάρτηση με παράμετρο ' ' αντί για " " για να μην βγάζει και error ο compiler, αλλά τώρα δίνει αποτέλεσμα 0.
antonisi
Newbie
 
Δημοσιεύσεις: 3
Εγγραφή: 22 Ιαν 2010, 13:23

Re: Εργασία Java Επιστήμη Υπολογιστών [2009-2010]

Δημοσίευσηαπό Stokos » 24 Ιαν 2010, 21:07

Επειδή ακόμα δεν έχω πάρει απάντηση στο πολύ σημαντικό - για το debugging που προσπαθούμε να κάνουμε- ερώτημα μου, δοκίμασε τον εξής κώδικα και πες μου τι αποτελέσματα σου δίνει:

Κώδικας: Επιλογή όλων
void main(){
 Character.isWhitespace(' ');
 Character.isSpaceChar(' ');
}
Τελευταία επεξεργασία από Stokos και 24 Ιαν 2010, 21:56, έχει επεξεργασθεί 5 φορά/ες συνολικά
Stokos
 

Επόμενο

Μέλη σε σύνδεση

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης

cron