PDA

Επιστροφή στο Forum : Βοήθεια με java



gsenso
19-03-10, 11:39
Προσπαθώ εδώ και μέρες να μετατρέψω τον παρακάτω αλγόριθμο σε αυτό που θέλω



package askisi2;

import java.lang.*;

public class Main {
public static void main(String[] args) {
double T[][] = new double[10][10];
int i=0,j=0;

for(i=0;i<10;i++) {
T[0][i]=20;
T[i][0]=20;
T[9][i]=20;
T[i][9]=20;
}

for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
T[i][j] = 50;
}
}

T[3][8] = 100;
int count = 0;
double temp=0.0;

temploops:
for (int n=0;n<10000;n++) {
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if ((i != 3) && (j != 8)) {
T[i][j]=(T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;

}

}
}


}

System.out.println(j);

for(i=0;i<10;i++) {
for(j=0;j<10;j++) {
System.out.println("T(" + i + "," + j + ") is " + T[i][j]);
}
}

}

}



Αυτό που θέλω να κάνω είναι στο boldαρισμενο κομμάτι. Δεν θέλω να επαναλαμβάνεται n φορες το εσωτερικό διπλό loop αλλά να επαναλμβάνεται μέχρι η μέγιστη θερμοκρασιακή (Τ[][]) αλλαγή μεταξύ δύο επαναλήψεων να είναι μικρότερη απο 0.01.
Όποια βοήθεια ευπρόσδεκτη.

virxen
19-03-10, 14:02
while (συνθήκη){
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if ((i != 3) && (j != 8)) {
T[i][j]=(T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;

}

}
}
}


όπου συνθήκη π.χ. T[i][j]<0.01


αν θες κάτι άλλο δώσε πιο πολλές διευκρινίσεις

gsenso
20-03-10, 08:43
Την ξέρω φίλε μου την while απλά το θέμα είναι ότι δεν βρίσκω ποια είναι η κατάλληλη συνθήκη. Αυτό που θέλω είναι όταν η μέγιστη διαφορά θερμοκρασίας (Τ[i][j]_new - T[i][j]_old ) μεταξύ δυο επαναλήψεων γίνει μικρότερη απο 0.01 να τελειώνει η διαδικασία.

johnson
20-03-10, 09:13
Την ξέρω φίλε μου την while απλά το θέμα είναι ότι δεν βρίσκω ποια είναι η κατάλληλη συνθήκη. Αυτό που θέλω είναι όταν η μέγιστη διαφορά θερμοκρασίας (Τ[i][j]_new - T[i][j]_old ) μεταξύ δυο επαναλήψεων γίνει μικρότερη απο 0.01 να τελειώνει η διαδικασία.



do
{

...

Τ[i][j]_old = Τ[i][j]_new;
Τ[i][j]_new = new;

if (prwth ektelesh)
continue;

}
while(java.lang.Math.abs(Τ[i][j]_new - T[i][j]_old)>=0.01);


Κάτι τέτοιο;

virxen
21-03-10, 18:08
Την ξέρω φίλε μου την while απλά το θέμα είναι ότι δεν βρίσκω ποια είναι η κατάλληλη συνθήκη. Αυτό που θέλω είναι όταν η μέγιστη διαφορά θερμοκρασίας (Τ[i][j]_new - T[i][j]_old ) μεταξύ δυο επαναλήψεων γίνει μικρότερη απο 0.01 να τελειώνει η διαδικασία.


όταν λες μεταξύ 2 επαναλήψεων τι ακριβώς εννοείς?
δώσε ένα υποθετικό αριθμητικό παράδειγμα που να υποδηλώνει αυτό που θες


γιατί

(Τ[i][j]_new - T[i][j]_old ) δεν είναι απλά μία διαφορά 2 αριθμών αλλά 2 πινάκων.

Thomas8
21-03-10, 19:13
Αν κατάλαβα καλά τι εννοείς:
Αρχικά βάζεις μία προσωρινή μεταβλητή temp, πχ
temp=(T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;
και στη συνέχεια τη συγκρίνεις με το T[i][j].
Εάν το αποτέλεσμα είναι μεγαλύτερο από 0.01, θέτεις μία boolean μεταβλητή ίση με true (ή έστω θέτεις έναν ακέραιο που είχες αρχικοποιήσει στο 0 ίσο με 1). Μετά θέτεις T[i][j]=temp.
Το loop γίνεται while και συνεχίζει να εκτελείται όσο η παραπάνω μεταβλητή είναι ίση με 1. Κάθε φορά που αρχίζει το loop αρχικοποιείς τη μεταβλητή στο 0 (θες να παραμείνει 0 μόνο αν όλες οι διαφορές είναι μικρότερες από 0.01).

gsenso
22-03-10, 10:55
while(test=true) {
test=false;
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if ((i != 3) && (j != 8)) {

temp=(T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;
if (Math.abs(temp-T[i][j])>0.01) { test=true; }
T[i][j] = temp;
}

}
}
count++;

}



Ωραία φαίνεται η ιδέα σου φίλε αλλά και πάλι πέφτω σε ατέρμονο βρόγχο. Πραγματικά δεν μπορώ να καταλάβω τι γίνεται.

johnson
22-03-10, 13:50
while(test=true) {
test=false;
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if ((i != 3) && (j != 8)) {

temp=(T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;
if (Math.abs(temp-T[i][j])>0.01) { test=true; }
T[i][j] = temp;
}

}
}
count++;

}



Ωραία φαίνεται η ιδέα σου φίλε αλλά και πάλι πέφτω σε ατέρμονο βρόγχο. Πραγματικά δεν μπορώ να καταλάβω τι γίνεται.

Μα αντί να κάνεις σύγκριση, εσύ κάνεις εκχώρηση η οποία και επιστρέφει πάντα true.

gsenso
22-03-10, 14:20
Τι σύγκριση εννοείς να κάνω;

Thomas8
22-03-10, 17:43
Δοκίμασε με do...while αντί για while ώστε να κάνει το evaluation στο τέλος και όχι στην αρχή του loop.

Α, τώρα το είδα, το λάθος είναι ότι βάζεις test=true (εκχώρηση) αντί για test==true (σύγκριση). :)

gsenso
23-03-10, 05:01
Τελικά δούλεψε το παρα κάτω σχήμα



boolean test=true;
double temp;
double maxdiafora;
while(test==true) {
test=false;
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if ((i != 3) && (j != 8)) {
temp = (T[i+1][j]+T[i-1][j]+T[i][j-1]+T[i][j+1])/4;
maxdiafora = Math.abs(temp-T[i][j]);
if (Math.max(maxdiafora,Math.abs(temp-T[i][j]))!=maxdiafora) { maxdiafora=Math.abs(temp-T[i][j]); }
if (maxdiafora>0.000000000000001 ) { test=true; }
T[i][j]=temp;


}

}
}
count++;

}




Ευχαριστώ όλα τα παιδιά για την βοήθεια.

maccabi990
23-03-10, 11:29
Μια καλή ιδέα για να περιορίζονται λάθη του τύπου while(test=true), όπου γίνεται ανάθεση και όχι σύγκριση, είναι οι συγκρίσεις να γίνονται με την ανάποδη σειρά. Δηλαδή true==test. Όπότε αν καταλάθος ξεχαστεί κανείς και βάλει ένα = (true=test) θα δημιουργηθεί σφάλμα.

odd
08-09-10, 21:50
Για να μην ανοίγω νέο θέμα, μπορεί κάποιος να μου εξηγήσει γιατί η παρακάτω λούπα δεν κάνει καμία επανάληψη;



for (int i=1;i<=0;i--)
{
System.out.println(i);
}

Jsone
08-09-10, 22:00
Γιατί η τερματική συνθήκη (το i<=0) που έχεις βάλει δεν ισχύει για i =1. Η συνθήκη ελέγχεται πριν την είσοδο στο σώμα ( το { } ) του loop ενώ η αλλαγή τιμής (ι--) γίνεται μετά την εκτέλεση των εντολών στο σώμα.

odd
08-09-10, 22:24
Γιατί η τερματική συνθήκη (το i<=0) που έχεις βάλει δεν ισχύει για i =1. Η συνθήκη ελέγχεται πριν την είσοδο στο σώμα ( το { } ) του loop ενώ η αλλαγή τιμής (ι--) γίνεται μετά την εκτέλεση των εντολών στο σώμα.

Ευχαριστώ. Έτσι βγαίνει νόημα.

dvm
09-09-10, 12:36
Από την σχολή μου πριν δέκα χρόνια, και μου έχει μείνει: Να θυμάσαι ότι η σειρά στο loop είναι:
ελέγχει-εκτελεί-αυξάνει.

Όπως είπε και ο jsone δηλαδή, απλά νομίζω ότι το παραπάνω είναι ευκολομνημόνευτο: ελέγχει-εκτελεί-αυξάνει.

odd
09-09-10, 15:06
Ασχολούμαι λίγο με php αλλά την for μπορεί να μην την έχω χρησιμοποιήσει και ποτέ. Μόνο foreach και while. Είχα στο μυαλό μου ότι γενικά την for την χρησιμοποιείς για προκαθορισμένα βήματα. Εδώ (όπως και στην php από ότι είδα) μπαίνει συνθήκη, όπως και στη while ή do/while για αυτό δεν την έχω χρησιμοποιήσει σχεδόν ποτέ. Πλέον τους πίνακες ή τα αντικείμενα τα "τρέχεις" με foreach.

papdoux
09-09-10, 15:46
Γιατί η τερματική συνθήκη (το i<=0) που έχεις βάλει δεν ισχύει για i =1. Η συνθήκη ελέγχεται πριν την είσοδο στο σώμα ( το { } ) του loop ενώ η αλλαγή τιμής (ι--) γίνεται μετά την εκτέλεση των εντολών στο σώμα.

άκυρο, βλακεία έγραψα, νυστάζω πολύ :lol:

odd
09-09-10, 15:49
αφού το i = 1 και μετά ο έλεγχος είναι i <= 0 άρα το i > 0 οπότε θα πριντάρει την τιμή του i μία φορά και μετά τελείωσε το for.
Τι χάνω;

Πρώτα αρχικοποιείται το i.
Μετά γίνεται έλεγχος.
Αφού βγαίνει false ο έλεγχος της συνθήκης δεν μπαίνει καμία φορά στη λούπα.

papdoux
09-09-10, 15:51
Πρώτα αρχικοποιείται το i.
Μετά γίνεται έλεγχος.
Αφού βγαίνει false ο έλεγχος της συνθήκης δεν μπαίνει καμία φορά στη λούπα.
λάθος σκέψη έκανα. Άλλα διάβαζα και άλλα σκεφτόμουν. Είναι ένα δύσκολο μεσημέρι :lol:

odd
09-09-10, 15:56
λάθος σκέψη έκανα. Άλλα διάβαζα και άλλα σκεφτόμουν. Είναι ένα δύσκολο μεσημέρι :lol:

Μεσημέρι Παρασκευής μετά τις διακοπές. Δεν χρειάζεται να πεις τίποτα άλλο. :lol:

dvm
09-09-10, 17:43
Ασχολούμαι λίγο με php αλλά την for μπορεί να μην την έχω χρησιμοποιήσει και ποτέ. Μόνο foreach και while. Είχα στο μυαλό μου ότι γενικά την for την χρησιμοποιείς για προκαθορισμένα βήματα. Εδώ (όπως και στην php από ότι είδα) μπαίνει συνθήκη, όπως και στη while ή do/while για αυτό δεν την έχω χρησιμοποιήσει σχεδόν ποτέ. Πλέον τους πίνακες ή τα αντικείμενα τα "τρέχεις" με foreach.

Κάποιες φορές χρειάζεται και η ταπεινή for :p
πχ



for (Iterator i = mylist.iterator(); i.hasNext(); i.next()) {
if (...) {
i.remove();
}
}


Πάντως ναι, πλέον η for-each μεγάλη ευκολία.

@ ADSLgr.com All rights reserved.