ΟΓΑΜΜΑΙΜΟ ΚΑΙ ΔΟΜΕ ΔΕΔΟΜΕΝΩΝ · 2020. 5. 12. · 41csc302 Δομές...

Preview:

Citation preview

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

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

5η Διάλεξη

41CSC302 Δομές Δεδομένων και Αρχές

Προγραμματισμού Υπολογιστών

Βιβλιογραφία

1. PYTHON – ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ

ΥΠΟΛΟΓΙΣΤΕΣ – 4η αναθεωρημένη και

επαυξημένη έκδοση 77117677 ΙΔΡΥΜΑ

ΤΕΧΝΟΛΟΓΙΑΣ & ΕΡΕΥΝΑΣ-

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

2. ΕΞΕΡΕΥΝΗΣΗ ΤΗΣ PYTHON 68386005

ΕΚΔΟΣΕΙΣ ΚΛΕΙΔΑΡΙΘΜΟΣ ΕΠΕ

2

(

Επανάληψη

3

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

Συνδυαζόμενη η διακλάδωση με μια επανάληψη, είναι πιθανώς η πλέον σπουδαία και μοναδική πρόοδος εφ’ όλων των μαθημάτων και αξίζει σημαντική προσπάθεια.

5

ΔΟΜΗ ΜΑΘΗΜΑΤΟΣ

ΘΕΩΡΙΑ

Δομημένος προγραμματισμός

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Επαναλήψεις, loops (for, while)

ΕΦΑΡΜΟΓΕΣ

Στην Python

7

ΣΧΕΔΙΑΣΜΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ

(Software engineering)

Γενική προσέγγιση

8

Πώς σχεδιάζεται ένα πρόγραμμα

9

Σχεδιασμός Προγράμματος

1. Προσδιορισμός προβλήματος

2. Ανάλυση προβλήματος

3. Σχεδιασμός μεθόδου επίλυσης (ανάπτυξη αλγόριθμου) του προβλήματος

4. Κωδικοποίηση του αλγόριθμου σε μια γλώσσα προγραμματισμού (υλοποίηση προγράμματος)

5. Δοκιμή του προγράμματος

10

Πώς αναπτύσσεται ένα πρόγραμμα

11

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

Μια δομικά άρτια τεχνική είναι ο «δομημένος προγραμματισμός» →

12

Δομημένος (structured) προγραμματισμός

Είναι ένα προγραμματιστικό στυλ που χρησιμοποιεί τρεις κανόνες – δομές ή βασικά στοιχεία ελέγχου βάσει των οποίων θα πρέπει να φτιάχνονται τα προγράμματα (Dijkstra) →:

• Εντολή επεξεργασίας (processing) →

• Έλεγχος συνθήκης if-then-else →

• Ελεγχόμενη επανάληψη εντολών (While, Repeat-Until, for-next) →

13

Born 11 May 1930

Rotterdam, Netherlands

Died 6 August 2002 (aged 72)

Nuenen, Netherlands

Fields

Computing science

Theoretical computer science

Institutions

Mathematisch Centrum

Eindhoven University of Technology

Burroughs Corporation

The University of Texas at Austin

Alma mater

Leiden University

(B.S., M.S.)

University of Amsterdam

(Ph.D.)

Thesis Communication with an

Automatic Computer (1959)

Doctoral advisor Adriaan van

Wijngaarden

Edsger W. Dijkstra

14

Εντολή επεξεργασίας

Πρόκειται για Black box εντολή,

είτε απλή (πχ τετραγώνισε τον X)

είτε σύνθετη (πχ υπολόγισε τον τόκο από την αποταμίευση κεφαλαίου)

15

Δομή απόφασης (βλπ ΔΙΑΛΕΞΗ 5 - if)

Αποφάσεις λαμβάνονται επί των τρεχουσών τιμών των δεδομένων:

1. If (συνθήκη αληθής) then …

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

2. If (συνθήκη αληθής) then … else …

If «ο καιρός είναι καλός» then «πάμε παραλία» else «πάμε σινεμά»

16

Δομές επανάληψης (looping, loop)Οι λύσεις πολλών προβλημάτων απαιτούν την

επανάληψη μιας διαδικασίας για κάποιο αριθμό φορών:

• For k=1 to 100

…εντολές

endFor k

• While (συνθήκη αληθής)

…εντολές

endWhile

• Repeat

…εντολές

Until (συνθήκη αληθής)

18

Κλείνει η παρένθεση )

20

Θα αναφέρομε τις Δομές Επανάληψης

μία – μία (από αλγοριθμική άποψη)

με παραδείγματα

21

For i = κάτω_όριο To άνω_όριο Step βήμα

… εντολές

EndFor (ή Next i, …)

Νόημα

μετρητής

δίνονται

1. Η δομή επανάληψης For

22

>>> for i in range(4):

print(i,'OIKONOMIA')Όρια range(4) είναι: 0 και 3=4-1

Βήμα range(4) είναι: 1

Run

0 OIKONOMIA

1 OIKONOMIA

2 OIKONOMIA

3 OIKONOMIA

Παραδείγματα χρήσης του for / PYTHON

24

for i in range(4):

print(i,' oikonomia ')

print()

0 oikonomia

1 oikonomia

2 oikonomia

3 oikonomia

Τυπώνει κενή (empty) γραμμή

Τυπώνει στην ίδια γραμμή

for i in range(4):

print(i,' oikonomia ',end=””)

0 oikonomia 1 oikonomia 2 oikonomia 3

oikonomia

>>>

26

Τυπώνει περιττούς έως 9

>>> for i in range(1,10,2):

print(i,' oikonomia ')

Run

1 oikonomia

3 oikonomia

5 oikonomia

7 oikonomia

9 oikonomia 28

Τυπώνει άρτιους έως 8

>>> for i in range(2,10,2):

print(i,' oikonomia ')

2 oikonomia

4 oikonomia

6 oikonomia

8 oikonomia

29

Τυπώνει με αρνητικό βήμα

for i in range(10,0,-1):

print(i,' oikonomia ')

10 oikonomia

9 oikonomia

8 oikonomia

7 oikonomia

6 oikonomia

5 oikonomia

4 oikonomia

3 oikonomia

2 oikonomia

1 oikonomia 30

33

Εντολή αυτοαντικατάστασης

Α = Α + 1

Νόημα

34

Εντολή αυτοαντικατάστασης

Α = Α + 1

Μετρητής: η τιμή του αλλάζει μέσα σε μια δομή επανάληψης. Πχ For I=1 to 100: next I

Αθροιστής: η τιμή του κρατά ένα άθροισμα που αλλάζει μέσα σε μια δομή επανάληψης, πχ

Αρχικά S=0

Στη συνέχεια For I=1 to 100: S=S+2*I: next I

Ίχνος (Tracing): λίστα των τιμών των μεταβλητών κατά την πορεία του προγράμματος για να κατανοήσομε πώς δουλεύει το πρόγραμμα

35

Συχνά είναι χρήσιμο να αθροίζομε.

Για να κάνομε αυτό, χρησιμοποιούμε μια

μεταβλητή (αθροιστής) που κρατά το

άθροισμα και λαμβάνει μια αρχική τιμή

(initialization) πριν την ανακύκλωση (loop).

‘Εστω

S = 1+2+3+…+10

Τότε θέτομε

S = 0 Αρχική τιμή στον αθροιστή

36

Παράδειγμα

Προσδιορισμός του αθροίσματος

1 + 2 + 3 + 4 + … + 10

Χρειάζεται ένας αθροιστής, έστω S, για το άθροισμα: S = 1 + 2 + 3 + 4 + … + 10

Αρχική τιμή αθροιστή τίθεται: S = 0

Επόμενη τιμή αθροιστή είναι: S = 0 + 1 = S + 1 = 1

Επόμενη τιμή αθροιστή είναι: S = 1 + 2 = S + 2 = 3

Επόμενη τιμή αθροιστή είναι: S = 3 + 3 = S + 3 = 6

… κοκ S = … = S + 10

Παρατηρούμε ότι για την εύρεση του S μεταβάλλεται ένας μετρητής από το 1 έως το 10.

37

Προσδιορισμός του αθροίσματος

1 + 2 + 3 + 4 + … + 10

Χρειάζεται ένας αθροιστής, έστω S, για το άθροισμα: S = 1 + 2 + 3 + 4 + … + 10

Αρχική τιμή αθροιστή τίθεται: S = 0

Επόμενη τιμή αθροιστή είναι: S = 0 + 1 = S + 1 = 1

Επόμενη τιμή αθροιστή είναι: S = 1 + 2 = S + 2 = 3

Επόμενη τιμή αθροιστή είναι: S = 3 + 3 = S + 3 = 6

… κοκ S = = S + 10

Παρατηρούμε ότι μεταβάλλεται ένας μετρητής από το 1 έως το 10. Οπότε, η διαδικασία γράφεται

Γενικός τύπος

S = S + i

όπου i = 1,2,3,…,10

for i = 1,2,3,…,10

S = S + i

for i in range(1,11):

s=s+i

38

39

Βρες το άθροισμα 1+2+3+…+10

s = 0 # αθροιστής

for j in range(11):

s = s + j # μεταβολή αθροιστή

print()

print('αποτέλεσμα j s = ',j,s)

Run

Αποτέλεσμα j s = 10 55

42

Βρες το άθροισμα 1+3+5+…+9

s = 0 # αθροιστής

for j in range(1,11,2):

#print(j,s)

s = s + j # μεταβολή αθροιστή

print()

print('j s = ',j,s)

Run

j s = 9 25

47

• Τι κάνομε για μη ακέραια ορίσματα;

48

Βρες το άθροισμα 34.7+34.8+34.9+…+43.8

s = 0 # αθροιστής

for j in range(347,438):

s = s + j/10. # μεταβολή αθροιστή

print()

print('j s = ',j,s)

Run

j s = 437 3567.2

51

Print "ASCII table"

for i in range(256):

print(i,chr(i))

249 ù

250 ú

251 û

252 ü

253 ý

254 þ

255 ÿ

53

Υπενθυμίζομε τις δομές επανάληψης

55

Υπάρχουν 3 διαφορετικές εκφράσεις WHILE:

While (συνθήκη αληθής)

… εντολές

End

Do While (συνθήκη αληθής)

… εντολές

End

Do

… εντολές

Loop While (συνθήκη αληθής)

2. Η δομή επανάληψης While

Ισοδύναμες

56

Υπάρχουν 3 διαφορετικές εκφράσεις WHILE:

While (συνθήκη αληθής)

… εντολές

End

Do While (συνθήκη αληθής)

… εντολές

Loop

Do

… εντολές

Loop While (συνθήκη αληθής)

2. Η δομή επανάληψης While

Ισοδύναμες

57

while συνθήκη αληθής:

…εντολές

Νόημαn=5

while n>0:

print (n)

n=n-1

print('εκτός ανακύκλωσης',n)

2.1 Η δομή επανάληψης While

Run

54321εκτός ανακύκλωσης 0

58

Να βρεις την πρώτη δύναμη του 2 μεγαλύτερη

του 100.

Δηλ. να βρεις έναν αριθμό x: 2x>100

Πρόγραμμα 5 - Do While-Loop

59

2x >100, οπότε ln(2x) > ln(100) loge = ln

ή x ln(2) > 4.6

ή x 0.69 > 4.6

ή x > 6.667

ή x >= 7

Άρα 27 =128

Εναλλακτικώς βρίσκομε τις δυνάμεις του 2 με απαρίθμηση:

2 4 8 16 32 64 100 128

21 22 23 24 25 26 27

60

Ίχνος (Tracing): για να κατανοήσομε πώς δουλεύει το πρόγραμμα που έχομε επινοήσει

Πολυπλοκότητα (complexity) = 1 πράξη ανά επανάληψη = Ο(1) = Order (1) = Order (1)

n = n = Αποτέλεσμα = n

2 ‘ αρχική τιμή 2 2

2*2 = 4 2*2 4

2*2*2 = 8 4*2 8

… 8*2 16

… …

n*2

n=2

while n <= 100:

n=n*2

print(n)

61

n=1

while 2**n <100:

n=n+1

Πράξεις

1+2+3+4+5+6+7+…+n) =

n*(n-1)/2 = n^2/2 – n/2 = order n^2 /2

(1/2)*order(n^2) ~ c * order(n2) = O(n2)

62

1

while 2**n

(1+2+3+4+5+6+7<1

00:

1

Βρες το άθροισμα s=1+2+3+…+10

s = 0 #initial value

s = s + 1

s = s + 2

s = s + 3

s = s + 10

s = s + i i=1 2 3 … 10 65

Ο γενικός τυπος επαναλαμβανεται

εφοσον ι <=10

s = 0

i = 1

while i<=10:

s = s + i

i = i + 1

66

Βρες το άθροισμα 1+2+3+…+10

s=0

i=1

while i<=10:

print(i,s)

s=s+i

i=i+1

print('εκτός ανακύκλωσης i, s ',i,s)

print()

Πρόγραμμα 6 - While

Run

1 0

2 1

3 3

4 6

5 10

6 15

7 21

8 28

9 36

10 45

εκτός ανακ i, s 11 55

68

Βρες το άθροισμα

12+22+32+…+102

s=0

i=1

while i <= 10:

print(i,s)

s=s+ i**2

i=i+1

print('εκτός ανακύκλωσης i, s ',i,s)

print()

Πρόγραμμα - While

Run

Recommended