ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302...

Post on 03-Sep-2020

5 views 0 download

Transcript of ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302...

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Ι. Κ. Δημητρίου

5η Διάλεξη

41CSC302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

Βιβλιογραφία1. PYTHON – ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ

ΥΠΟΛΟΓΙΣΤΕΣ – 4η αναθεωρημένη και επαυξημένη έκδοση 77117677 ΙΔΡΥΜΑ ΤΕΧΝΟΛΟΓΙΑΣ & ΕΡΕΥΝΑΣ-ΠΑΝΕΠΙΣΤΗΜΙΑΚΕΣ ΕΚΔΟΣΕΙΣ ΚΡΗΤΗΣ

2. ΕΞΕΡΕΥΝΗΣΗ ΤΗΣ PYTHON 68386005 ΕΚΔΟΣΕΙΣ ΚΛΕΙΔΑΡΙΘΜΟΣ ΕΠΕ

39

Επαναληπτικές ασκήσεις

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

Η υλοποίηση των αλγορίθμων σε κώδικα Python επαφίεται ως άσκηση.

40

41

Παράδειγμα 2 (Άσκηση 7.1, ∆ημ)

Προσδιορισμός του αρμονικού αθροίσματος1 + 1/2 + 1/3 + 1/4 + … + 1/71Χρειάζεται ένας αθροιστής, έστω S, για το άθροισμα:

S = 1 + 1/2 + 1/3 + 1/4 + … + 1/71Αρχική τιμή αθροιστή, S=0Επόμενη τιμή αθροιστή είναι: S = S + 1/1Επόμενη τιμή αθροιστή είναι: S = S + 1/2Επόμενη τιμή αθροιστή είναι: S = S + 1/3 +…+… κοκ S = S + 1/71Γενική επανάληψη S = S + 1/j, j=1,2,…,71

42

S = 0 ‘ αθροιστήςFor j = 1 to 71

S = S + 1 / j ‘ μεταβολή αθροιστήNext jPrint j, S

ΙΣΟ∆ΥΝΑΜΑ με το WhileS = 0 : j = 1 ‘ αρχικές τιμές εκτός whileWhile j <= 71 ‘ έλεγχος συνθήκης πρώτα

S = S + 1 / j ‘ μεταβολή αθροιστήj = j + 1 ‘ αύξηση μετρητή

Print j, S

Άσκηση: Να αναπτύξετε τον κώδικα Python

43

44

Παράδειγμα 4

Προσδιορισμός του αθροίσματος δυνάμεωνS = 1 + x + x2 + x3 + x4 + … + x21

To S γράφεται:S = x0 + x1 + x2 + x3 + x4 + … + x21

Παρατηρούμε ότι το S αυξάνεται ως εξής:S = 0S = S + 1 ή S = S + x0

S = S + x ή S = S + x1

S = S + x2

S = S + x3, κοκ.S = S + x21

Εδώ, αλλάζει ο εκθέτης του x, ως 0, 1, 2, 3, …, 21, οπότε το πρόγραμμα γράφεται ως εξής:

Προσδιορισμός του αθροίσματος τετραγώνωνS = 1 + x + x2 + x3 + x4 + … + x21

To S γράφεται:S = x0 + x + x2 + x3 + x4 + … + x21

Το πρόγραμμα είναι:S = 0For j = 0 to 21

S = S + x**jNext j

Ωστόσο, υπολογίζομε την πλήρη δύναμη x**j λαμβάνοντας υπόψη ότι η δύναμη x**(j-1) είναι διαθέσιμη από την προηγούμενη επανάληψη. Οπότε ένας πολλαπλασιασμός αρκεί και ο αλγόριθμος (το πρόγραμμα) γράφεται ως εξής:

46

S = 0For j = 0 to 21

S = S + x**jNext j

ΙΣΟ∆ΥΝΑΜΑ' αρχικές τιμέςS = 0term = 1x = 0.5 ‘ δίνεται

For j = 0 To 21S = S + term O(1)term = term * x ' επόμενος όρος O(1)

Next jPrint j, S ' αποτέλεσμα

Δηλ. υπολογίζομε την πλήρη δύναμη x**jλαμβάνοντας υπόψη ότι η δύναμη x**(j-1)είναι διαθέσιμη από την προηγούμενη επανάληψη:

X**j = x**(j-1) * x = term * x, όπου

term_αρχική_τιμή = 1

Οπότε το πρόγραμμα γράφεται ως εξής:

ΚΩΔΙΚΑΣ

Άσκηση: Να αναπτύξετε τον κώδικα Python

47

49

Παράδειγμα 5 (Άσκηση 10.1, ∆ημ)

Να αναπτυχθεί πρόγραμμα προσέγγισης του αριθμού π με ακρίβεια 4 δεκαδικών ψηφίων από τον τύπο

1 1 1 14(1 )3 5 7 9

Αρκεί να βρεθεί το άθροισμα,

το οποίο βρίσκεται από το Παράδειγμα 2 με εναλλαγή των προσήμων των προσθετέων

1 1 1 113 5 7 9

S

50

Θυμίζομε το Παράδειγμα 2 που βρίσκει το άθροισμα …

S = 0 ‘ αθροιστήςFor j = 1 to 71

S = S + 1 / j ‘ μεταβολή αθροιστήNext jPrint j, S

ΙΣΟ∆ΥΝΑΜΑ με το WhileS = 0 : j = 1while j <= 71 ‘ έλεγχος συνθήκης πρώτα

S = S + 1 / j ‘ μεταβολή αθροιστήj = j + 1 ‘ αύξηση μετρητή

Print j, S

Προφανώς στο Παράδειγμα 4, ο παρονομαστής αλλάζει κατά 2Πως μπορούμε να αλλάζομε το πρόσημο εναλλάξ;

51

Επαναλήψεις 11 – 1/31 – 1/3 + 1/51 – 1/3 + 1/5 – 1/7 ‘ μεταβαλλόμενοι όροι--------S = 1 : j = 3 : signum = -1While j <= 100000 ‘ έλεγχος συνθήκης πρώτα

S = S + (signum)* 1 / j ‘ μεταβολή αθροιστή επί αλλαγή προσήμουsignum = - signum ' ΠΡΟΣΟΧΗ: αλλαγή προσήμουj = j + 2 ‘ αύξηση μετρητή κατά 2

----------' αρχικές τιμέςs = 1 ' όταν j = 1, δηλ. πριν το for-nextsignum = -1For j = 3 To 100000 Step 2 ' 100000 επαναλήψεις για καλή ακρίβεια

s = s + signum / jsignum = - signum ' ΠΡΟΣΟΧΗ: αλλαγή προσήμου

Next j

1 1 1 113 5 7 9

S

Άσκηση: Να αναπτύξετε τον κώδικα Python με for

52

Άσκηση: Να αναπτύξετε κώδικα Python για το προηγούμενο πρόβλημα με τη δομή while

53

54

Ερχόμαστε τώρα στον υπολογισμό του π

Είναι ένας επιπλέον πολλαπλασιασμός----------' αρχικές τιμέςs = 1 ' όταν j = 1, δηλ. πριν το for-nextsignum = -1

For j = 3 To 100000 Step 2 ' 100000 επαναλήψεις για καλή ακρίβειαs = s + signum / jsignum = -signum ' ΠΡΟΣΟΧΗ: αλλαγή προσήμου'Print j, s ' εκτύπωση ίχνους, αλλά μόνο για μικρό j

Next j

mypi = 4 * s

1 1 1 14(1 )3 5 7 9

55

' αρχικές τιμέςs = 1 ' όταν j = 1, δηλ. πριν το for-nextsign = -1

For j = 3 To 100000 Step 2 ' 100000 επαναλήψεις για καλή ακρίβειαs = s + sign / jsign = -sign ' ΠΡΟΣΟΧΗ: αλλαγή προσήμου'Print j, s ' εκτύπωση ίχνους, αλλά μόνο για μικρό j

Next jpi = 4 * sPrint j, s, pi ' εκτύπωση αποτελέσματος

ΙΣΟ∆ΥΝΑΜΑ με το While-WendS = 1 : j = 3While j <= 100000 ‘ έλεγχος συνθήκης πρώτα

S = S + sign / j ‘ μεταβολή αθροιστήsign = - sign ' αλλαγή προσήμουj = j + 2 ‘ αύξηση μετρητή

WendPrint j, S

Άσκηση: Να αναπτύξετε τον κώδικα Python

56

Γενίκευση με το While

57

' αρχικές τιμέςs = 1sign = -1For j = 3 To 100000 Step 2

s = s + sign / jsign = -sign ' αλλαγή προσήμου'Print j, s ' εκτύπωση ίχνους, αλλά για μικρό j

Next jpi = 4 * sPrint j, s, pi ' εκτύπωση αποτελέσματοςΙΣΟ∆ΥΝΑΜΑ με το Whiles = 1sign = -1j = 3while j <= 100000 ' έλεγχος συνθήκης πρώτα

s = s + sign / jsign = -sign ' αλλαγή προσήμουj = j + 2 ‘ αύξηση μετρητή

Print j, s, 4*s

ΒΕΛΤΙΩΣΗ ΣΥΝΘΗΚΗΣ

58

Αυτό, ωστόσο, που ζητά η Άσκηση 10.1 είναι να υπολογιστεί ο π με ακρίβεια 4 δεκαδικών ψηφίων

Αυτό σημαίνει ότι, όταν δύο διαδοχικές προσεγγίσεις διαφέρουν κατά 10-4 τότε να σταματούν οι επαναλήψεις.

Άρα, οι επαναλήψεις συνεχίζουν έως ότου|Sold – Snew| < 10-4 ή abs(Sold – S) < 10**(-4), όπουSold = προηγούμενη τιμή του S.

Αλλιώτικα

59

Εναλλακτική συνθήκη τερματισμού της ανακύκλωσης:

Οι επαναλήψεις λαμβάνουν χώρα εφόσονterm ≥ 10-4

δηλ. εφόσον ο προσθετέος φθάσει σε ακρίβεια 4 δψ

Η δομή αυτή υλοποιείται με το While :

while term ≥ 10-4

……

60

sold = 0s = 0i = 1sign = 1while αbs(sold - s) > 10 ** (-4)sold = s ' φύλαξε την τρέχουσα τιμήterm = sign * 1 / i ' επόμενος όροςs = s + termsign = -sign ' αλλαγή προσήμουi = i + 2

mypi = s * 4print "προσέγγιση="; mypi; " επαναλήψεις ="; iprint "εσωτερική ="; pi

61

Η προσέγγιση του π βελτιώνεται αν η διαφορά δύο διαδοχικών S γίνει μικρότερη από 10-5:

Εναλλακτική συνθήκη τερματισμού

Άσκηση: Να αναπτύξετε τον κώδικα Python

62

63

Παράδειγμα 6 (Ασκ. 10.7, ∆ημ)Ένα κεφάλαιο 100,000 ευρώ τοκίζεται με 3.5% το

χρόνο, ενώ ένα κεφάλαιο 40,000 ευρώ αυξάνεται με ρυθμό 5% το χρόνο. Σε πόσα έτη από τώρα, το δεύτερο κεφάλαιο θα υπερβεί το πρώτο;

k1 = 100 : k2 = 40 ‘ Αρχικά κεφάλαιαetos0 = 2007 ‘ Έτος βάσηςetos = etos0while k1 > k2 ‘ Συνθήκη επανάληψης, ενώ κ1>κ2

k1 = k1 * (1 + 0.035) ‘ αύξηση k1k2 = k2 * (1 + 0.05) ‘ αύξηση k2etos = etos + 1 ‘ επόμενο έτος

Print etos - etos0, k1, k2

64

Oxi Παράδειγμα 7 (Πρόγραμμα 10, ∆ημ.)

Να αναπτυχθεί πρόγραμμα προσέγγισης της τετραγωνικής ρίζας ενός μη αρνητικού αριθμού number με τη μέθοδο Newton-Raphson ως εξής:

Αν app είναι μια προσέγγιση τουτότε (number/app + app)/2 είναι καλύτερη προσέγγιση.

Χρησιμοποιείστε ως κριτήριο τερματισμού των επαναλήψεων τη συνθήκη

number

62 1 10number eps

app

65

TO ΚΡΙΤΗΡΙΟ ΤΕΡΜΑΤΙΣΜΟΥTο κριτήριο τερματισμού μπορεί να γραφεί ως εξής:

ή

Ή καθώς το eps τείνει στο μηδέν λαμβάνομε

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

21 1numbereps epsapp

2 2(1 ) (1 )eps app number eps app

2number app

abs(number / app ^ 2 - 1) < eps

66

Πόσες προσπάθειες πρέπει να γίνουν για να καταλήξει ο υπολογισμός;

Μια ανακύκλωση do-loop until είναι αυτό που ταιριάζει στο πρόβλημα (έως ότου να ικανοποιηθεί το κριτήριο τερματισμού).

67

Πόσες προσπάθειες πρέπει να γίνουν για να καταλήξει ο υπολογισμός;

Μια ανακύκλωση do-loop until είναι αυτό που ταιριάζει στο πρόβλημα (έως ότου να ικανοποιηθεί το κριτήριο τερματισμού).

68

ΚΩ∆ΙΚΑΣ

eps = 10 ** (-6) 'Σταθεράnumber = 5 'Να βρεθεί η τετραγωνική του ρίζαapp = 1 'Αρχική προσέγγιση της τετρ ρίζας του numberiter = 0 'Μετρητής επαναλήψεων

While abs(number / app ^ 2 - 1) > epsiter = iter + 1 'Αύξησε το μετρητήapp = (app + number / app) / 2 'Νέα προσέγγιση

print "Τετραγωνική ρίζα του "; number; "="; sqrt(number)print "Τετραγωνική ρίζα του "; number; "="; appprint "Επαναλήψεις ="; iterTEST RUN

69

Oxi Παράδειγμα 8 (Ασκ. 10.5, ∆ημ)

Να βρεθεί η κυβική ρίζα του αριθμού x.

Όπως το Παράδειγμα 7.

70

Παράδειγμα 9 (Υπολογισμός του Ν!)

Να γραφεί πρόγραμμα που υπολογίζει το Ν!, όπου Ν είναι θετικός ακέραιος.

Εξ ορισμού 0!=1Ν! = 1*2*3*…*Ν

1!=12!=1 * 23!=1*2*3, κοκΧρησιμοποιούμε έναν ΠΟΛΛΑΠΛΑΣΙΑΣΤΗ P με αρχική τιμή P=1.

71

P = 1For j = 1 to N

P = P * jNext j

Προσοχή: το Ν ας είναι <= 20, διότι το P αυξάνει πολύ γρήγορα

72

Παράδειγμα 10 (Ασκ 10.2, ∆ημ)

Να αναπτυχθεί πρόγραμμα υπολογισμού της παράστασης

έως ότου ο n-στός προσθετέος γίνει μικρότερος του 10-6.

Χρήση αθροιστή S για το άθροισμα και πολλαπλασιαστή P για το παραγοντικό. Το κριτήριο τερματισμού παραπέμπει σε while (repeat until)

1 1 112! 3! 4!

73

S = 1 Χρήση μτβλ P = 11 + 1 / 2! = S + 1 / P, όπου P = P*21 + 1 / 2! + 1 / 3! = S + 1 / P, όπου P = P*31 + 1 / 2! + 1 / 3! + 1 / 4! = S + 1 / P, όπου P = P*4

ΟπότεS = 0 : P = 1 : I = 1 ‘ Αρχικές τιμέςS = S + 1 / PI = I + 1P = P * I

Επανάλαβε έως ότου (1/ P ≤ 10-6)

Δηλ. δεν χρειάζεται να επαναλάβομε τον πλήρη υπολογισμό του παραγοντικού Ρ. Επομένως, δαπανούμε μόνο Ο(1) πράξεις ανά επανάληψη.

ή επανάλαβε ενώ (1/ P > 10-6)

1 1 112! 3! 4!

74

Παράδειγμα 10 (Ασκ 10.3, ∆ημ)Να αναπτυχθεί πρόγραμμα υπολογισμού της

παράστασης

έως ότου ο n-στός προσθετέος γίνει μικρότερος του 10-6.

Χρήση αθροιστή S για το άθροισμα και πολλαπλασιαστή P για το παραγοντικό. Το κριτήριο τερματισμού παραπέμπει σε Loop-Until.

2 3 4

12! 3! 4!

x x x xe x

1 1 112! 3! 4!

75

S = 1 1 + x1 + x + x2 / 2!1 + x + x2 / 2! + x3 / 3! 1 + x + x2 / 2! + x3 / 3! + x4 / 4!

Ωστόσο, δεν χρειάζεται να επαναλάβομε τον πλήρη υπολογισμό της αναδρομικής σχέσης. S = 1S = S + termόπου term = term * x / i, με αρχική τιμή term = 1 και i = 1Άρα, την πρώτη φορά (i=1) είναι S=1+term*x/1 = 1+ x term=xΤη δεύτερη φορά (i=2) είναι S = S + term*x/i κοκΕπομένως, δαπανούμε μόνο Ο(1) πράξεις ανά επανάληψη.

Μεταβαλλόμενος όρος = αναδρομική σχέση:

τωρινή xi/i!

προ xi-1 /(i-1)!

Γενικώς xi/P, όπου P=i!

76

επανάλαβε ενώ (term ≥ eps)

Γενικώς,

S = 1 : i = 1 : term = 1 ‘αρχ. σ.

term = term * x / i

S = S + term

i =i + 1

Άσκηση: Συγκρίνατε με την exp (x) για x= 0.5

Άσκηση: Να αναπτύξετε τον κώδικα Python

77

78

Τέλος διάλεξης