ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣΗ/Υ...

Post on 03-Mar-2018

234 views 6 download

Transcript of ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣΗ/Υ...

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/ΥΔομή Επανάληψης

Ιωάννης ΛυχναρόπουλοςΜαθηματικός, MSc, PhD

Τμήμα Μηχανολόγων ΜηχανικώνΠανεπιστήμιο Θεσσαλίας

Δομή Επανάληψης

• Επανάληψη με απαρίθμηση• DO <μεταβλητή> = <αρχική τιμή>, <τελική τιμή>[, <βήμα>]

• Επανάληψη υπό συνθήκη• DO WHILE

• Αέναη επανάληψη• DO – END DO

Δομές Επανάληψης• Χρησιμοποιούνται για να επαναλάβουμε την εκτέλεση

ενός τμήματος κώδικα περισσότερες από μια φορές

• Απαρτίζονται από • Κάποιου είδους μετρητή ή έκφραση ελέγχου για τον καθορισμό

του αριθμού των επαναλήψεων• Τμήματα κώδικα που εκτελούνται κατ’ επανάληψη

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

• Μετά την ολοκλήρωση της εκτέλεσης της δομής ο κώδικας συνεχίζει να εκτελείται διαδοχικά

Έλεγχος Βρόγχων ΕπανάληψηςΥπάρχουν τρεις δομές επανάληψης που διαφέρουν ως προς τον τρόπο ελέγχου των επαναλήψεων• Με απαρίθμηση:

• Ένας μετρητής επαναλήψεων καθορίζει τον αριθμό εκτελέσεων της δομής

• Υπό συνθήκη:• Η δομή εκτελείται όσο η τιμή μιας προκαθορισμένης

συνθήκης είναι αληθής.• Αέναη:

• Η δομή εκτελείται επ’ αόριστον, μέχρι να τερματιστεί από κάποια ρητώς ορισμένη εντολή

Επανάληψη με αρίθμηση

[label:] DO μεταβλητή = αρχική_τιμή, τελική_τιμή, [βήμα]εντολές...

END DO [label]

Οι τιμές αρχική_τιμή, τελική_τιμή και βήμα πρέπει να είναι υποχρεωτικά ακέραιου τύπου (ακόμη και αν ο compiler επιτρέπει την χρήση πραγματικών)

5

Εκτέλεση συγκεκριμένου αριθμού επαναλήψεων

Εκτέλεση της δομής «Επανάληψη με Απαρίθμηση»

• Ο υπολογιστής αναγνωρίζει το τμήμα του κώδικα που πρόκειται να επαναλάβει μέσα στα όρια DO … ENDDO

• H μεταβλητή λαμβάνει την αρχική τιμή

• Ελέγχεται η συνθήκη τερματισμού όπως παρουσιάζεται παρακάτω

• Εκτελούνται διαδοχικά οι εκφράσεις μέσα στα όρια της δομής επανάληψης

• Όταν η εκτέλεση του κώδικα φτάσει στο ENDDO

• η τιμή του βήματος προστίθεται στην μεταβλητή

• Για βήμα θετικό

• αν η νέα τιμή της μεταβλητής είναι μικρότερη ή ίση με την τελική τιμή τότε η επανάληψη συνεχίζει διαφορετικά σταματάει

• Για βήμα αρνητικό

• αν η νέα τιμή της μεταβλητής είναι μεγαλύτερη ή ίση με την τελική τιμή τότε η επανάληψη συνεχίζει διαφορετικά σταματάει

Σημεία που πρέπει να προσέχουμε στην «Επανάληψη με Απαρίθμηση»

• Αν η τιμή του βήματος είναι θετική• Η αρχική τιμή πρέπει να είναι μικρότερη ή ίση από την τελική

• Αν η τιμή του βήματος είναι αρνητική • Η αρχική τιμή πρέπει να είναι μεγαλύτερη ή ίση από την τελική

• Το βήμα δεν μπορεί να είναι μηδέν

• Αν δεν υπάρχει βήμα, τότε εννοείται το +1

• Οι τιμές των μεταβλητών ελέγχου του βρόγχου δεν πρέπει να αλλάζουν τιμή εντός του βρόγχου επανάληψης

Τρεις σημαντικές εφαρμογές• Υπολογισμός αθροίσματος Ν όρων

• Υπολογισμός γινομένου Ν όρων

• Κόμβοι πλέγματος με σταθερό βήμα

Εμφωλευμένες δομές επανάληψης με μετρητή• Αρκετές φορές χρειάζεται να συνδυάσουμε πολλαπλές δομές

επανάληψης• Για τον χειρισμό δεδομένων πινάκων με περισσότερες από μια διαστάσεις• Για τον υπολογισμό μαθηματικών εκφράσεων (π.χ. σειρές) με

περισσότερους από ένα δείκτες

• Οι βασικοί κανόνες που πρέπει να ισχύουν είναι• κάθε εσωτερική δομή πρέπει να περιέχεται πλήρως στην έκταση της

αμέσως επόμενης εξωτερικής δομής• Δύο συνδυασμένοι βρόγχοι επανάληψης δεν μπορούν να μοιράζονται την

ίδια μεταβλητή ελέγχου της επανάληψης

++

++

+=

+=∑∑∑

== = 23

13

22

12

21

11

21

3

1

3

1

2

1 ii j

iiji

Επανάληψη υπό συνθήκη

[label:] DO WHILE (συνθήκη ελέγχου)εντολές...

END DO [label]

Η συνθήκη ελέγχου είναι το αποτέλεσμα μιας λογικής έκφρασης

10

Εκτέλεση της δομής «Επανάληψη υπό Συνθήκη»

• Ο υπολογιστής αναγνωρίζει το τμήμα του κώδικα που πρόκειται να επαναλάβει μέσα στα όρια DO WHILE … ENDDO

• Υπολογίζεται η συνθήκη ελέγχου.

• Αν είναι αληθής, εκτελούνται διαδοχικά οι εκφράσεις που περιέχονται στη δομή

• Αν είναι ψευδής, η εκτέλεση της δομής ολοκληρώνεται και η εκτέλεση του κώδικα συνεχίζεται διαδοχικά μετά το ENDDO

• Όταν η εκτέλεση του κώδικα φτάσει στο ENDDO η εκτέλεση επιστρέφει στην αρχή της δομής

Τρεις σημαντικές εφαρμογές• Έλεγχος εγκυρότητας δεδομένων

• Υπολογισμός Σειρών

• Υπολογισμοί με επαναληπτικές μεθόδους

11

12n n

n

bx xx−

= +

2 1

0

( 1)sin(2 1)!

i i

i

xxi

+∞

=

−=

+∑

Αέναη δομή επανάληψης[label:] DO

εντολές1IF (…) exitεντολές2

END DO [label]

Η αέναη επανάληψη εκτελείται επ’ αόριστον μέχρι να ικανοποιηθεί κάποια συνθήκη τερματισμού, η οποία πρέπει να οριστεί ρητά από τον προγραμματιστή

Εντολές Παράκαμψης

• Cycle : ενδιάμεση συνθήκη επανάληψης• Exit : ενδιάμεση συνθήκη εξόδου• Stop : τερματισμός του προγράμματος

Οι εντολές αυτές χρησιμοποιούνται για την παράκαμψη της συνήθους ροής εκτέλεσης των δομών επανάληψης (και όχι μόνο)

Τοποθετούνται μέσα στα όρια της δομής DO. (H stop μπορεί να εμφανισθεί σε οποιοδήποτε σημείο του προγράμματος)

Συνδυάζονται συνήθως με το λογικό IF, αλλά και με οποιαδήποτε δομή επιλογής

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

Εκτέλεση της εντολής exit ΛΕΙΤΟΥΡΓΙΑ: Τερματίζει την εκτέλεση ενός επαναληπτικού βρόγχου DO

• Η τρέχουσα εκτέλεση του DO τερματίζεται• Αν έχουμε εμφωλευμένα DO τότε η exit τερματίζει μόνον το DO

μέσα στο οποίο βρίσκεται. Αν όμως χρησιμοποιηθεί με την μορφή exit <label> μπορεί να τερματίσει οποιοδήποτε DO στην ιεραρχία της εμφώλευσης.

• Ο μετρητής του DO (αν υπάρχει) διατηρεί την τελευταία του τιμή• Όλες οι μεταβλητές μέσα στο βρόγχο επανάληψης διατηρούν την

τελευταία τιμή που είχαν κατά την ικανοποίηση της συνθήκης

π.χ. Οθόνη:5

Εκτέλεση της εντολής cycle ΛΕΙΤΟΥΡΓΙΑ: Διακόπτει την τρέχουσα εκτέλεση επανάληψης ενός επαναληπτικού βρόγχου DO

• Η τρέχουσα εκτέλεση του DO τερματίζεται• H μεταβλητή ελέγχου του DO (αν υπάρχει) αυξάνεται κατά

τη τιμή του βήματος• Αρχίζει νέα επανάληψη της δομής DO• Μπορεί να χρησιμοποιηθεί και ως cycle <label>

π.χ. Οθόνη:11223345

done!

Εκτέλεση της εντολής stop ΛΕΙΤΟΥΡΓΙΑ: Τερματίζει άμεσα την εκτέλεση του προγράμματος (χωρίς να φτάσουμε ως το end program)

• Η τρέχουσα εκτέλεση του DO τερματίζεται και μαζί και η εκτέλεση του προγράμματος

• Μπορεί να συνοδευτεί από κάποια μήνυμα που να δίνει πληροφορίες

Σημεία που πρέπει να προσέχουμε στις δομές επανάληψης χωρίς μετρητή

• Η συνθήκη ελέγχου για την είσοδο/έξοδο από τον βρόγχο δεν ικανοποιείται ποτέ.• Ο βρόγχος εκτελείται επ’ άπειρον

• Η μεταβλητή ελέγχου δεν έχει πάρει αρχική τιμή

• Η μεταβλητή ελέγχου υπολογίζεται σε λάθος σημείο εντός του βρόγχου

Βασικές μεθοδολογίες σχετικές με τη δομή επανάληψης

• Έλεγχος εγκυρότητας δεδομένων

• Παραγωγή όρων αριθμητικής και γεωμετρικής προόδου

• Άθροιση – Γινόμενο

• υπό συνθήκη

• Καταμέτρηση

• Εκλογή (min, max)

Με γνωστό και με άγνωστο πλήθος δεδομένων

Έλεγχος Εγκυρότητας Δεδομένων• Έστω ότι θέλουμε να διαβάσουμε έναν ακέραιο αριθμό x, ο οποίος

πρέπει να ανήκει στο διάστημα [5,10]• Απλή μορφή κώδικα

• Σωστή μορφή κώδικα (με έλεγχο τύπου δεδομένων και μήνυμα σφάλματος προς τον χρήστη)

Παραγωγή όρων αριθμητικής προόδου• Έστω ότι θέλουμε να

εμφανίσουμε τους αριθμούς:5, 8, 11, 14, 17, 20

Πρόκειται τους 6 όρους της αριθμητικής πρόοδου με πρώτο όρο α0=5, και διαφορά ω=3• 1ος τρόπος: DO με βήμα• 2ος τρόπος: τύπος ν-οστου

όρου• 3ος τρόπος: Προσθήκη

διαφοράς επαναληπτικά

αν=α0 + (ν-1)ω

Παραγωγή όρων γεωμετρικής προόδου• Έστω ότι θέλουμε να

εμφανίσουμε τους αριθμούς:3, 6, 12, 24, 48, 96

Πρόκειται τους 6 όρους της γεωμετρικής πρόοδου με πρώτο όρο α0=3, και λόγο λ=2• 1ος τρόπος: τύπος ν-οστου

όρου• 2ος τρόπος: Πολ/μός λόγου

επαναληπτικά

αν=α0 λ (ν-1)

Άθροιση• Με γνωστό πλήθοςπ.χ. Δίνονται 100 αριθμοί. Να βρεθεί το άθροισμά τους

π.χ. Να υπολογισθεί το άθροισμα:S= 1+1/2+1/3+…+1/100

• Με άγνωστο πλήθοςπ.χ. Δίνονται συνεχώς αριθμοί μέχρι να δοθεί το -9999. Να βρεθεί το άθροισμα τους.

Επίσης:

Τιμή φρουρός

Επίσης:

Αθροιστής

Άθροιση υπό συνθήκη

• Με γνωστό πλήθοςπ.χ. Δίνονται 100 αριθμοί. Να βρεθεί το άθροισμα των άρτιων.

• Με άγνωστο πλήθοςπ.χ. Δίνονται συνεχώς αριθμοί μέχρι να δοθεί το -9999. Να βρεθεί το άθροισμα των θετικών.

Γινόμενο• Με γνωστό πλήθοςπ.χ. Δίνονται 100 αριθμοί. Να βρεθεί το γινόμενό τους

π.χ. Να υπολογισθεί το παραγοντικό:n!= 1 2 3 … n, (με 0!=1)

• Με άγνωστο πλήθοςπ.χ. Δίνονται συνεχώς αριθμοί μέχρι να δοθεί το -9999. Να βρεθεί το γινόμενό τους.

Σε περίπτωση που έχουμε Γινόμενο υπό Συνθήκη, απλώς η εντολή p=p*x μπαίνει μέσα ένα IF, αντίστοιχα με την Άθροιση υπό Συνθήκη.

Καταμέτρηση• Με γνωστό πλήθοςπ.χ. Δίνονται 100 αριθμοί. Να βρεθεί το πλήθος των άρτιων.

• Με άγνωστο πλήθοςπ.χ. Δίνονται συνεχώς αριθμοί μέχρι να δοθεί το -9999. Να βρεθεί το πλήθος όλων καθώς και το πλήθος μόνο των θετικών.

Η καταμέτρηση με γνωστό πλήθος είναι πάντοτε υπό συνθήκη.

Χωρίς συνθήκη

Υπό συνθήκη

Παρατήρηση: Οι μεταβλητές που παίζουν το ρόλο του μετρητή δηλώνονται πάντοτε ως INTEGER

Μετρητής

Εκλογή• Με γνωστό πλήθοςπ.χ. Δίνονται 100 αριθμοί. Να βρεθεί ο μέγιστος και ο ελάχιστος.

Επίσης:

• Με άγνωστο πλήθοςπ.χ. Δίνονται συνεχώς αριθμοί μέχρι να δοθεί το -9999. Να βρεθεί ο μέγιστος και ο ελάχιστος.

Πολύ μεγάλη τιμή

Πολύ μικρή τιμή

Αναπτύγματα Taylor και Maclaurin

( )

0

( )( ) ( )!

nn

n

f af x x an

=

= −∑

Αν μία συνάρτηση είναι απείρως παραγωγίσιμη στο σημείο α και είναι γνωστές όλες οι τιμές των παραγώγων της σε αυτό το σημείο τότε ισχύει το ακόλουθο ανάπτυγμα Taylor για x κοντά στο α

Αν α=0 τότε το ανάπτυγμα ονομάζεται Maclaurin( )

0

(0)( ) ( )!

nn

n

ff x xn

=

=∑Παραδείγματα αναπτυγμάτων Maclaurin:

0

1!

x n

ne x

n

=

=∑

0

11

n

nx

x

=

=− ∑

2

0

( 1)cos(2 )!

nn

nx x

n

=

−=∑

1

0

( 1)ln(1 )!

nn

nx x

n

+∞

=

−+ =∑

Μεθοδολογία αντιμετώπισης αθροισμάτων απείρων Σειρών • 1ος Τρόπος: Επιλέγουμε αυθαίρετα να κρατήσουμε Ν όρους της

Σειράς και χρησιμοποιούμε Do με απαρίθμηση για να παράγουμε κάθε έναν από αυτούς

• 2ος Τρόπος: Αν οι όροι της Σειράς είναι φθίνοντες, μπορούμε να χρησιμοποιήσουμε Do με συνθήκη (ή χωρίς) για την παραγωγή τους και σταματούμε την επανάληψη όταν η απόλυτη τιμή του τρέχοντος όρου γίνει μικρότερη από μία προκαθορισμένη μικρή τιμή π.χ. 1e-6

• 3ος Τρόπος: Χρησιμοποιούμε Do με συνθήκη (ή χωρίς) για την παραγωγή των όρων και για τον τερματισμό της επανάληψης ελέγχουμε το απόλυτο (ή το απόλυτο σχετικό) σφάλμα μεταξύ του αποτελέσματος δύο διαδοχικών επαναλήψεων. Το σφάλμα αυτό θα πρέπει να γίνει μικρότερο από μία προκαθορισμένη μικρή τιμή

Χρονομέτρηση Προγράμματος• Πολλές φορές επιθυμούμαι να γνωρίζουμε πόσο χρόνο

διαρκεί η εκτέλεση κάποιας δομής επανάληψης.• Μπορούν να χρησιμοποιηθούν 2 σχετικές εγγενείς

υπορουτίνες η CPU_TIME και η SYSTEM_CLOCK• CPU_TIME

• H CPU_TIME μετρά το χρόνο που απασχολείται ο επεξεργαστής (ενδέχεται να είναι μικρότερος από τον πραγματικό χρόνο εκτέλεσης του προγράμματος) και είναι αυτή που χρησιμοποιούμε συνήθως. Η χρήση της είναι ως εξής: Καλούμε την CPU_TIME 2 φορές, μία πριν την εκτέλεση του κώδικα που χρονομετρούμε και μία μετά. Στη συνέχεια αφαιρούμε τις δύο τιμές. Το αποτέλεσμα είναι η διάρκεια σε δευτερόλεπτα. (H CPU_TIME δέχεται μία μόνο παράμετρο, τύπου real)

• SYSTEM_CLOCK• H SYSTEM_CLOCK μετράει τον συνολικό χρόνο εκτέλεσης. Η χρήση

της είναι ίδια με αυτή της CPU_TIME, αλλά απαιτεί κάποια αρχικοποίηση. (Η SYSTEM_CLOCK δέχεται ακέραιες παραμέτρους)

Χρονομέτρηση Προγράμματος

• CPU_TIME

• SYSTEM_CLOCK