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

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

Δημοσ.

Γεια σας, χρησιμοποιώ visual studio 2008 με Intel fortran composer update 5 2011.

 

Κατ' αρχάς θέλω να ρωτήσω αν υπάρχει διαφορά στον κώδικα/γλώσσα του προαναφερθέντος προγράμματος με την compaq visual fortran v6.6, την οποία μου δώσανε απ' το πανεπιστήμιο αλλά δεν έτρεχε στον Η/Υ μου, μάλλον λόγω windows 7.

 

Το δεύτερο και βασικό ερώτημα μου έχει να κάνει με μία άσκηση:

 

aporia.th.png

 

έχω γράψει αυτά εδώ:

 

program test2

 

implicit none

 

real :: I,S,X,N

 

read*,N

I=0

S=0

read*,X

 

do

S=S+X

I=I+1

if (I<0) then

exit

else

print*,S

end if

end do

 

end program test2

 

Δίνω Ν, δίνω Χ αλλά αρχίζει και κάνει πράξεις χωρίς τελειωμό.... :shifty:

 

Μπορεί κάποιος να με βοηθήσει; :unsure:

Δημοσ.

O compiler αυτός της Intel είναι από τoυς καλύτερους που κυκλοφορούν

(όπως και ο αντίστοιχος για C++) και συνεργάζεται άψογα με το visual studio.

Καλύτερος συνδυασμός είναι δύσκολο να βρεθεί.

 

Η intel fortran είναι συνέχεια της compaq visual fortran,

η οποία είναι συνέχεια της digital fortran,

η οποία είναι συνέχεια της fortran powerstation της MS.

 

Σε όλες αυτές τις εκδόσεις (δηλ. από το '92) ως σήμερα η συμβατότητα των βιβλιοθηκών διατηρείται ευλαβικά σε πολύ μεγάλο βαθμό.

Λίγα προβλήματα μπορεί να υπάρχουν (π.χ. κατάργηση κάποιου plugin κλπ) αλλά είτε λύνονται εύκολα είτε είναι ασήμαντα.

Μιλάμε πάντα για τις βιβλιοθήκες και τα project files που αφορούν τον συγκεκριμένο compiler και τα windows (qwin, array visualizer κλπ).

O αμιγής κώδικας δεν πρέπει να έχει προβλήματα σε κανέναν compiler.

 

 

Σε ότι αφορά την άσκηση, έχεις θέσει ως συνθήκη εξόδου από τον βρόχο ότι I<0.

Ωστόσο αυτό αυτό δεν συμβαίνει ποτέ διότι γράφεις Ι=Ι+1 και η τιμή του πάντα αυξάνεται.

Βάλε π.χ. Ι>10 και μετά από 10 φορές θα σταματάει....

 

-

Δημοσ.

Σε ότι αφορά την άσκηση, έχεις θέσει ως συνθήκη εξόδου από τον βρόχο ότι I<0.

Ωστόσο αυτό αυτό δεν συμβαίνει ποτέ διότι γράφεις Ι=Ι+1 και η τιμή του πάντα αυξάνεται.

Βάλε π.χ. Ι>10 και μετά από 10 φορές θα σταματάει....

 

-

Σύμφωνα όμως με την άσκηση, μόνο όταν το Ι θα είναι αρνητικό θα σταματάει...

 

Υ.Γ.: Ευχαριστώ για τις απαντήσεις σου!

Δημοσ.

Σύμφωνα όμως με την άσκηση, μόνο όταν το Ι θα είναι αρνητικό θα σταματάει...

 

Υ.Γ.: Ευχαριστώ για τις απαντήσεις σου!

όπως το διαβάζω εγώ ο βρόγχος σταματάει όταν το Χ είναι αρνητικό και όχι το Ι

Δημοσ.

Μήπως η εκφώνηση της άσκησης δεν είναι καλή; Δεν μπορώ να καταλάβω τί εννοεί με το "έως ότου εμφανιστεί ενας αρνητικός αριθμός".

Αφού εγω δίνω το Χ, άμα δώσω θετικούς θα κάνει πράξεις στο άπειρο...

 

@taazz, αυτό με το Χ αντί του Ι, το σκέφτηκα κι εγώ, αλλά είχε το ίδιο αποτέλεσμα......

Δημοσ.

Γράφω αυτά εδώ:

 

program testdoenddo

implicit none

integer :: X

20 read*,X

 

if ((X<1).AND.(X>10)) goto 20

 

end program testdoenddo

 

 

Στην compaq visual fortran v6.6 το 20 δεν θα το κοκκίνιζε, εδώ όμως (βλ. πρώτο ποστ) το κοκκινίζει και φυσικά δεν ισχύει το goto. Είτε δώσω ότι Χ=5, είτε Χ=13 π.χ., λέει press any key to continue... Αν έχω καταλάβει καλά το κοκκινίζει επειδή το αναγνωρίζει σαν integer constant (ακέραια σταθερά). Πως θα το κάνω να εφαρμόζει το goto;

Δημοσ.

Το κόκκινο χρώμα είναι απλώς σήμανση του compiler για τους αριθμούς γραμμής.

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

 

( Παρεμπιπτόντως, όλα τα χρώματα και το περιβάλλον μπορούν να αλλάξουν κατά βούληση από

to μενού Tools->Option->Environment αλλά καλύτερα μην πειράξεις τίποτε διότι μπορεί να γίνει μεγάλο μπάχαλο.)

 

 

Το goto δουλεύει μια χαρά.

Το λάθος είναι στη συνθήκη. To σωστό είναι (X<1.or.X>10)

(παρενθέσεις δεν χρειάζονται).

Ακόμα καλύτερα, γράψε

 

do while (X<1.or.X>10)

read *,X

end do

 

 

Μετά το end δεν χρειάζεται το όνομα του προγράμματος,

ούτε και πριν το program στην αρχή.

 

-

Δημοσ.

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

 

aporia2.th.png

Δημοσ. (επεξεργασμένο)

Να σε βοηθήσω εγώ.

 

>
program series
implicit none
real(8):, sin2, e, a, diff, fact2n, sum
integer::n, i, maxNumTerms

write(*,'("Give x : " \)')
read *,x

maxNumTerms=100

e=1.E-6
a=sin(x)**2

diff=abs(a)
sum=0.; n=0
do while(diff>e.and.n<maxNumTerms)

   fact2n=1.
   do i=1,2*n
      fact2n = fact2n*i
   end do

   sum = sum + ( (-1)**(n+1) * 2**(2*n-1) * x**(2*n) ) / fact2n

   n=n+1
   diff=abs(a-sum)
  
end do


write(*,10) a, sum, a-sum
write(*,20) n-1


10 format( / "analytic value      A :  " ,f16.9 /,  &
            "value from series   B :  " ,f16.9 /,  &
            "difference        A-B :  " ,f16.9 )

20 format(// "number of computed terms : ", i4 / )

end program

 

Ως γνωστόν, η συνάρτηση αναπαρίσταται μόνον εντός της ακτίνας σύγκλισης της δοθείσης σειράς.

Δηλ. για τιμές του x έξω από κάποιο διάστημα η ισότητα της σειράς και της συνάρτησης δεν ισχύει.

Δεν κάθισα να υπολογίσω αναλυτικά την ακτίνα σύγκλισης αλλά παίζοντας με το προγραμματάκι βρήκα

ότι είναι περίπου στο 10 με 11 (από εκεί και πάνω η ακρίβεια δεν επιτυγχάνεται σε ανεκτό πλήθος

όρων όπερ σημαίνει ότι η σειρά δεν συγκλίνει σε όλο το R)....

 

-

Επεξ/σία από V.I.Smirnov
Δημοσ.

Μήπως η εκφώνηση της άσκησης δεν είναι καλή; Δεν μπορώ να καταλάβω τί εννοεί με το "έως ότου εμφανιστεί ενας αρνητικός αριθμός".

Αφού εγω δίνω το Χ, άμα δώσω θετικούς θα κάνει πράξεις στο άπειρο...

 

@taazz, αυτό με το Χ αντί του Ι, το σκέφτηκα κι εγώ, αλλά είχε το ίδιο αποτέλεσμα......

 

Χωρίς να έχω ασχοληθεί με τον κωδικά σου γιατί δεν έμαθα ποτε fortran και έχοντας ρίξει μια γρήγορη ματιά στην εκφώνηση έχεις ένα σύνολο αριθμών μεγέθους N όπου ο κάθε αριθμός αντιπροσωπεύετε από την μεταβλητή Χ στον βρόγχο. ο τερματισμός του βρόγχου γίνεται όταν βρεθεί ο πρώτος αριθμός του συνόλου που είναι αρνητικός ή όταν έχουν προστεθεί όλοι οι αριθμοί στην μεταβλητή αθροίσματος. Κοινός Ι > Ν.

 

EDIT.

ΠΡέπει να αρχήσω να διαβάζω τις απαντήσεις πριν απαντήσω.

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

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

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

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

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

Σύνδεση

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

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