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

40
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Ι. Κ. Δημητρίου 5η Διάλεξη 

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

Page 1: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

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

5η Διάλεξη

Page 2: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

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

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

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

39

Page 3: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

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

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

40

Page 4: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 5: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 6: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

43

Page 7: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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, οπότε το πρόγραμμα γράφεται ως εξής:

Page 8: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

Προσδιορισμός του αθροίσματος τετραγώνων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) είναι διαθέσιμη από την προηγούμενη επανάληψη. Οπότε ένας πολλαπλασιασμός αρκεί και ο αλγόριθμος (το πρόγραμμα) γράφεται ως εξής:

Page 9: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

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

ΚΩΔΙΚΑΣ

Page 10: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

47

Page 11: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

49

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

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

1 1 1 14(1 )3 5 7 9

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

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

1 1 1 113 5 7 9

S

Page 12: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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Πως μπορούμε να αλλάζομε το πρόσημο εναλλάξ;

Page 13: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 14: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

52

Page 15: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

53

Page 16: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 17: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 18: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

56

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

Page 19: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

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

Page 20: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

58

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

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

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

Αλλιώτικα

Page 21: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

59

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

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

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

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

while term ≥ 10-4

……

Page 22: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 23: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

61

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

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

Page 24: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

62

Page 25: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 26: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

64

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

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

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

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

number

62 1 10number eps

app

Page 27: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

65

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

ή

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

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

21 1numbereps epsapp

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

2number app

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

Page 28: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

66

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

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

Page 29: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

67

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

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

Page 30: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

Page 31: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

69

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

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

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

Page 32: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

70

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

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

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

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

Page 33: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

71

P = 1For j = 1 to N

P = P * jNext j

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

Page 34: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

72

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

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

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

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

1 1 112! 3! 4!

Page 35: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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!

Page 36: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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!

Page 37: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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!

Page 38: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

76

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

Γενικώς,

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

term = term * x / i

S = S + term

i =i + 1

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

Page 39: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

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

77

Page 40: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ · 2020. 6. 4. · 41csc302 Δομές Δεδομένων και Αρχές Προγραμματισμού Υπολογιστών

78

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