Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

91
Ρε Μάκη, δίκιο έχεις αλλά την d την όρισα, βγένει από τον μετρητή. και αυτο που λες πως κάνω allocate εκτώς του subroutine, το είχα δοκιμάσει από μέσα πρώτα, και δεν έβγαινε. αν μπορείς ρίξε μια ματιά στη λύση του πρακτικού, και αντιπαρέβαλε τα.

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

92
Όπως προχωράει το πρόγραμμα, πρώτη φορά η d συναντιέται στο σημείο: call tomi(n,m,a,b,d)

Έπειτα, μέσα στην υπορουτίνα, γράφεις integer, intent (out) ::d
δηλαδή απλώς ορίζεις ότι είναι ακέραιος και με "σκοπό" ορίσματος εξόδου.

Ακριβώς από κάτω: real, intent (out), dimension (d):: c
δηλαδή του λες ότι η array C έχει διάσταση d. Πόσο όμως είναι το d; Είναι... είναι... εεε... δεν είναι! :)
Ότι και να κάνεις εσύ παρακάτω, σε αυτό το σημείο το d δεν έχει τιμή.

Allocate μέσα στην υπορουτίνα για ορίσματα δεν μπορείς να κάνεις. Υπάρχει (νομίζω) ένας τρόπος να κάνεις ακροβατικά χρησιμοποιώντας modules (πολύ εκτός ύλης :P) αλλά δεν έχω ασχοληθεί.

Αν θες να βελτιώσεις την προτεινόμενη λύση (που ούτε εμένα μου αρέσει το να θεωρείς ότι η τομή έχει σταθερή διάσταση) μπορείς να φτιάξεις μια υπορουτίνα που να βρίσκει πόσα κοινά στοιχεία υπάρχουν. Έπειτα να χρησιμοποιείς αυτό το νούμερο για να κάνεις allocate την C μέσα στο κυρίως πρόγραμμα και έπειτα να βάζεις σε αυτήν τα κοινά στοιχεία.

Έτσι βέβαια καταναλώνεις τον διπλάσιο υπολογιστικό χρόνο, για να γλιτώσεις λίγη μνήμη...

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

93
1)Στο πρακτικό 2 στην άσκηση γιατί στο δεύτερο do λέμε do j=i,N-1 κι όχι do j=1,N;
2)Στο πρακτικό 5 στην άσκηση 1 γιατί πρέπει να βάλω Α=0;Όταν δεν έβαλα μου έβγαλε έναν περίεργο αριθμό σε μία θέση του πίνακα.
3)Πότε βάζω intent(INOUT) και ποια είναι η διαφορά από το σκέτο intent(IN) και το σκέτο intent(OUT);
4)Στη fortran έχει σημασία η σειρά που γράφω την ισότητα ; π.χ όταν έγραφα min=A(1) δεν έτρεχε κι αλλά όταν έβαχα A(1)=min έτρεχε.
5)Τη function πώς την καλώ; Δηλαδή ποιο είναι το αντίστοιχο call; Eίναι η σειρά που γράφω τον τύπο της;
6)Xοντρικά ποιοα είναι η διαφορά μεταξύ subroutine και function;

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

94
παίζει να έχει και να ανεβάσει κάποιος τις λύσεις από τα Θέματα εξετάσεων 2008-09 (κανονική)?:)

Παρακαλούμε όχι greeklish! Διαβάστε τους όρους χρήσης που αποδεχτήκατε κατά την εγγραφή σας. - MakisH

Τελευταία επεξεργασία από το μέλος MakisH την Τρί 29 Ιαν 2013, 11:58 pm, έχει επεξεργασθεί 1 φορά συνολικά.
Λόγος: Μετατροπή από greeklish και προσθήκη alert. Παρακαλούμε όχι greeklsih, όχι ΚΕΦΑΛΑΙΑ! :-)

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

95
1) Αν εννοείς την άσκηση 6 (με τον ανάστροφο), δες εδώ αναλυτική απάντηση.

2) Εννοείς την άκηση με τον μοναδιαίο. Δεν μπορείς να βασίζεσαι στο ότι αν δεν έχεις δώσει τιμή σε κάποια μεταβλητή ή στοιχεία κάποιας array θα μπουν μηδενικά. Γι' αυτό δεν θεωρείς τίποτα δεδομένο και δίνεις σε όλα εσύ τιμή. Βάζοντας A=0 μηδενίζεις πρώτα όλα τα στοιχείια της array. Ο περίεργος αριθμός οφείλεται μάλλον σε κάτι άλλο που υπήρχε στη θέση της μνήμης που δέσμευσε τώρα το πρόγραμμά σου. (αυτό που λέω είναι πιθανότατα αρκετά ανακριβές)

3) Αν θέλεις να θεωρήσει κάτι ως δεδομένο και να μην σε αφήσει να το πειράξεις, βάζεις intent(in).
Αν θέλεις να θεωρήσει κάτι ως αποτέλεσμα και να μην σε αφήσει να τελειώσεις το υποπρόγραμμα χωρίς να του έχεις δώσει τιμή, βάζεις intent(out).
To intent(inout) το χρησιμοποιείς όταν θέλεις το όρισμα που περνάς να φιλοξενεί και δεδομένα και αποτελέσματα. Π.χ. στο Π5-1β θέλεις οι αλλαγές να γίνουν στον ίδιο τον πίνακα Α. Τα intents μάλλον έχουν νόημα απλώς ως οδηγίες για τον compiler. Μπορείς να διαβάσεις περισσότερα εδώ και εδώ.

4) Δεν είναι ισότητα και έχει εξαιρετικά μεγάλη σημασία! :) Λέγεται "εντολή εκχώρησης". Όταν γράφω π.χ. a=3, τότε η μεταβλητή a παίρνει την τιμή 3. Δεν μπορώ να γράψω όμως 3=a! Γενικώς, στο δεξί μέλος μπορεί να υπάρχει ολόκληρη μαθηματική παράσταση με αριθμούς, άλλες μεταβλητές και συναρτήσεις. Στο αριστερό μέλος όμως υπάρχει πάντα μια μεταβλητή στην οποία εκχωρείται το αποτέλεσμα της πράξης που γίνεται δεξιά. Και αυτό ισχύει νομίζω για κάθε γλώσσα προγραμματισμού.

5) Την "καλείς" χρησιμοποιώντας την σε μια μαθηματική παράσταση. Είναι ακριβώς ό,τι λέει το όνομά της, μια συνάρτηση όπως λες π.χ. στα μαθηματικά f(x)! Πώς "καλείς" την τετραγωνική ρίζα ενός αριθμού; Με το όνομα της συνάρτησης (sqrt) και σε παρενθέσεις τα ορίσματά της - π.χ. sqrt(2). Μπορείς φυσικά να γράψεις κατευθείαν κάτι σε στυλ print *, sqrt(2)

6) Στον τρόπο που τις καλείς και στο ότι η function μπορεί να επιστρέψει τιμή στο όνομά της, δηλαδή να τη χρησιμοποιήσεις κατευθείαν μέσα σε μια μαθηματική παράσταση. Και ναι, μια συνάρτηση μπορεί να επιστρέψει τιμές και σε ορίσματά της, ακριβώς όπως η υπορουτίνα!

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

96
@MakisH πώς μπορώ να περάσω έναν μεγάλο πίνακα 2*2 έστω (50,100) σε πίνακα a(i,j) χωρίς να αναγκάζομαι να περνάω 1-1 τα στοιχεία με εντολή read? Συγκεκριμένα έχω έναν πίνακα (50,100) σε αρχείο word και θέλω να το περάσω σε ένα πίνακα a(i,j)...

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

97
Μάκη πως σου φαίνεται η παρακάτω λύση για το θέμα 3ο του 2009??http://www.e-polytexneio.gr/viewtopic.php?f=128&t=2795.Εμένα μου αρέσει αλλά δεν τρέχει.Τι να φταίει άραγε??
program matrix
implicit none
integer i,j
real,allocatable,dimension(:,:)::A
allocate(A(25,4))
do i=1,25
if(j==1) then
A(i,j)=i
print*, A(i,j)
endif
if(j==2) then
A(i,j)=i**2
print*,A(i,j)
endif
if(j==3) then
A(i,j)=i**3
print*, A(i,j)
endif
if(j==4) then
A(i,j)=i**(1/2)
print*, A(i,j)
endif
enddo
end

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

98
@stelios: Έχεις πολλούς τρόπους να το κάνεις. Για να μην σε μπλέξω πολύ:
1. Κάνε copy-paste από το Word στο Excel
2. Αποθήκευσε ως CSV (comma delimited)
3. Άνοιξε το αρχείο με notepad. Αν έχεις διαχωριστικό στήλης πέρα από κενό ή κόμμα, κάνε ένα edit>replace>replace all και άλλαξε το σύμβολο με κενό ή κόμμα
4. Στον κώδικα βάλε μια open(unit=νούμερο, file="όνομα")
5. Στην read, αντί για read(*,*), βάλε read(νούμερο,*). Μπορείς να διαβάσεις πολλές στήλες φυσικά. Π.χ.:

Κώδικας: Επιλογή όλων

open(unit=666, file="pinakas.csv")
do i=1,50
read(666,*) (A(i,j), j=1,100)
enddo
@Myrto94: δεν μπαίνω εκεί οπότε δεν ξέρω την εκφώνηση. Φαντάζομαι όμως τι θα μπορούσε να λέει, οπότε:
1. Σου λέει ότι το j δεν έχει τιμή. Υποθέτω θέλει ένα Do j=1,4 έξω από το ήδη υπάρχον Do
2. Ακόμα και όταν τρέξει, τα i**(1/2) θα βγαίνουν μονάδα. Προφανώς πρέπει να το γράψεις i**(1.0/2.0)

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

99
Οι λύσεις για το 2009 είναι αυτές:
Θεμα 1ο
program my
implicit none
real k,x
print*,'this program computes the fraction of sun radiation'
print*,'give me a k'
read*,k
if((0.<=k) .AND.(k<=0.35)) x=1.-0.25*k
if((0.35<k).AND.(k<=0.75)) x=1.6-1.8*k
if((0.75<k) .AND. (k<1)) x=0.18
print*, x
end


θεμα 2ο
program main
IMPLICIT NONE
real a,b,c
print*,'give a'
read*,a
print*,'give y'
read*,b
call add(a,b,c)
print *, 'The sum of',a,b
print *, 'is',c
end
subroutine add(x,y,z)
IMPLICIT NONE
real x,y,z
z = x + y
end subroutine


θεμα 3ο
program matrix
implicit none
integer i,j
real,allocatable,dimension(:,:)::A
allocate(A(25,4))
do j=1,4
do i=1,25
if(j==1) then
A(i,j)=i
endif
if(j==2) then
A(i,j)=i**2
endif
if(j==3) then
A(i,j)=i**3
endif
if(j==4) then
A(i,j)=i**(1./2.)
endif
enddo
enddo
do i=1,25
print*, (A(i,j),j=1,4)
enddo
end

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

100
Υπάρχει περίπτωση στην εξέταση να μας ρωτήσουν για πράγματα που δεν έχουν διδαχθεί μέσα στο pc lab;όπως για παράδειγμα να ελέγξουμε αν μία λέξη είναι αναγραμματισμός μίας άλλης;υπάρχουν και ερωτήσεις θεωρίας;η τελική εξέταση είναι με ανοιχτές σημειώσεις;