ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό Επαναληπτικές Ασκήσεις Χειµερινό Εξάµηνο 2014
Λίστες όρισµα 2 λίστες και θα επιστρέφει το γινόµενo των 2 «µεσαίων» στοιχείων τους. Π.χ. L1 = [5,1,3,2,4], L2 = [9,2,1,8,0] median(l1) = 3, median(l2) = 2 result = 6 def multimedians(l1,l2): L1.sort() L2.sort() return L1[len(L1)//2]*L2[len(L2)//2] 2
Αλφαριθµητικά όρισµα ένα αλφαριθµητικό, το οποίο θα είναι ένα κείµενο, και θα επιστρέφει τη λέξη µε τους περισσότερους χαρακτήρες. Η συνάρτηση θα πρέπει να µην υπολογίζει τυχόν τελείες ως µέρη των λέξεων. Π.χ. s = I went to the shops today. I bought a cake. result = bought def longest(s): s2 = s.replace('.',' ') l = s2.split() res = '' for w in l: if len(w)>len(res): res = w return res 3
Αλφαριθµητικά όρισµα ένα αλφαριθµητικό και θα επιστρέφει ένα αντίγραφό του, όπου οι τελευταίοι 5 χαρακτήρες θα είναι µε ανεστραµµένη σειρά. Π.χ. s = I went to the market result = I went to the mtekra def rev(s): x = s[-5:] l = list(x) l.reverse() y = ''.join(l) return s[:-5]+y 4
Λεξικά όρισµα ένα αλφαριθµητικό, το οποίο θα είναι ένα κείµενο, και θα επιστρέφει ένα λεξικό, όπου για κάθε µήκος θα καταγράφεται πόσες λέξεις έχουν αυτό το µήκος. Η συνάρτηση θα πρέπει να µην υπολογίζει τυχόν τελείες ως µέρη των λέξεων. Π.χ. s = I went to the shops today. I bought a cake. result = {1: 3, 2: 1, 3: 1, 4: 2, 5: 2, 6: 1} def lengths(s): s2 = s.replace('.',' ') l = s2.split() d = {} for w in l: if len(w) in d: d[len(w)] += 1 else: d[len(w)] = 1 return d 5
Έλεγχος ροής όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα, η οποία θα έχει µόνο τα στοιχεία που δεν είναι 0. Π.χ. L = [3,2,1,0,3,2,0,2] result = [3,2,1,3,2,2] def nozeros(l): L2 = [] for x in L: if x!= 0: L2.append(x) return L2 6
Έλεγχος ροής όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα, η οποία θα έχει µόνο τα στοιχεία µέχρι το πρώτο 0. Π.χ. L = [3,2,1,0,3,2,0,2] result = [3,2,1] def untilzero(l): L2 = [] for x in L: if x == 0: break L2.append(x) return L2 7
Έλεγχος ροής όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα, η οποία θα έχει µόνο τα στοιχεία µέχρι το πρώτο 0, αλλά χωρίς τα 2. Π.χ. L = [3,2,1,0,3,2,0,2] result = [3,1] def untilzeronotwos(l): L2 = [] for x in L: if x == 0: break if x!= 2: L2.append(x) return L2 8
Έλεγχος ροής Γράψτε την προηγούµενη συνάρτηση ξανά, αλλά µε χρήση while αντί για if. def untilzeronotwos2(l): L2 = [] while L: x = L.pop(0) if x == 0: break if x!= 2: L2.append(x) return L2 9
Έλεγχος ροής όρισµα ένα θετικό ακέραιο n και θα τυπώνει τις δυνάµεις του 2 απο το 2 1 εώς το 2 n χωρισµένες µε διαστήµατα Π.χ. n = 6 result = 2 4 8 16 32 64 def powers(n): for i in range(1,n+1): print(pow(2,i), end=' ') 10
Έλεγχος ροής όρισµα µια λίστα αριθµών και θα επιστρέφει True αν η λίστα είναι αριθµητική ακολουθία, αλλιώς False. Αριθµητική ακολουθία: η διαφορά µεταξύ συνεχόµενων στοιχείων είναι σταθερή Π.χ. L = [3,6,9,12,15] True L = [3,6,9,10,13] False L = [3] True def arithmetic(l): if len(l)<2: return True diff = L[1]-L[0] for i in range(1,len(l)-1): if L[i+1]-L[i]!= diff: return False return True 11
Έλεγχος ροής όρισµα ένα αλφαριθµητικό και θα επιστρέφει το ακρώνυµό του. Η συνάρτηση θα πρέπει να µετατρέπει τα πεζά σε κεφαλαία όπου χρειάζεται Π.χ. s = central processing unit result = CPU def acronym(s): L = s.split() res = '' for w in L: res = res + w[0].upper() return res 12
Έλεγχος ροής όρισµα µια λίστα L θα µετατρέπει κάθε στοιχείο L[i] της L στο άθροισµα των στοιχείων απο τη θέση i και µετά Π.χ. L = [2, 5, 6, 4, 3, 0] L = [20, 18, 13, 7, 3, 0] def rangesum(a): for i in range(len(a)-1): A[i] = sum(a[i:]) def rangesum(a): if len(a)>1: for i in range(len(a)-2,-1,-1): A[i] += A[i+1] 13
Έλεγχος ροής όρισµα µια λίστα L, θα βρίσκει την υπολίστα της L µε το µέγιστο άθροισµα και θα επιστρέφει το άθροισµα. Π.χ. L = [2, -5, 6, 4, -3, 10, -2, 1] result = 17 def maxsublist(l): m = L[0] # first elem of L for i in range(len(l)): #start index for j in range(i,len(l)): #end index if sum(l[i:j]) > m: m = sum(l[i:j]) return m 14
Έλεγχος ροής όρισµα ένα δισδιάστατο πίνακα Α και θα τον µετατρέπει ώστε κάθε στοιχείο στην πρώτη στήλη να είναι το άθροισµα όλων των στοιχείων της γραµµής του Π.χ. A = [[2, 5], [6, 4]] A = [[7, 5], [10, 4]] def rowsum(a): for i in range(len(a)): A[i][0] = sum(a[i]) 15
Έλεγχος ροής όρισµα ένα θετικό ακέραιο n και θα επιστρέφει πόσες φορές µπορούµε να διαιρέσουµε το n µε το 2 (ακέραια διαίρεση) µέχρι το n να γίνει 1 Π.χ. n = 25 result = 4 def intlog(n): i=0 while n>1: n//=2 i+=1 return i 16
Συναρτήσεις υποχρεωτικά ορίσµατα δύο αριθµούς x και y και ένα προεραιτικό όρισµα z (z=1 αν δεν ορίζεται) και θα επιστρέφει τον αριθµό των βηµάτων από τον x µέχρι τον y αν το κάθε βήµα είναι z. Π.χ. x = 4, y = 11, z =2 result = 4 (4-6, 6-8, 8-10, 10-11) def numsteps(x,y,z=1): if y<=x: return 0 numsteps = (y-x)//z if (y-x)%z: numsteps +=1 return numsteps 17
Αναδροµικές Συναρτήσεις Γράψτε µια αναδροµική συνάρτηση, η οποία θα υπολογίζει τον µέγιστο κοινό διαιρέτη δύο αριθµών χρησιµοποιώντας τον αλγόριθµο του Ευκλείδη: gcd(a,0) = a gcd(a,b) = gcd(b, a mod b) Π.χ. gcd(48,18) = gcd(18, 12) = gcd(12, 6) = gcd(6, 0) = 6 def gcd(a,b): if b==0: return a return gcd(b, a%b) # non-recursive def gcd(a,b): while b: a, b = b, a%b return a 18
Αναδροµικές Συναρτήσεις Γράψτε µια αναδροµική συνάρτηση, η οποία θα παίρνει σαν όρισµα ένα θετικό ακέραιο n και θα επιστρέφει πόσες φορές µπορούµε να διαιρέσουµε το n µε το 2 (ακέραια διαίρεση) µέχρι το n να γίνει 1 Π.χ. n = 25 result = 4 def intlog_rec(n): if n<=1: return 0 return 1 + intlog_rec(n//2) 19
Ταξινόµηση Τροποποιήστε τη bubblesort ώστε να ταξινοµεί µια λίστα αριθµών βάζοντας πρώτα τους ζυγούς σε αύξουσα σειρά και µετά τους µονούς σε φθίνουσα σειρά Π.χ. [2, 5, 6, 4, 3, 0] -> [0, 2, 4, 6, 5, 3] def BubbleSort(lst): for i in range(len(lst)): # rounds for j in range(0,len(lst)-i-1): # i-th round if lst[j]%2 : # odd number if lst[j+1] % 2 == 0 or lst[j]<lst[j+1]: lst[j],lst[j+1] = lst[j+1],lst[j] else: # even number if lst[j+1] % 2 == 0 and lst[j]>lst[j+1]: lst[j],lst[j+1] = lst[j+1],lst[j] 20
Αρχεία όρισµα ένα όνοµα αρχείου, θα διαβάζει το αρχείο και θα γράφει σέ ένα άλλο αρχείο µε όνοµα stats.txt, τον αριθµό των χαρακτήρων, λέξεων, και γραµµών. Π.χ. testfile.txt Hello, World! How are you? stats.txt 26,5,2 def fstats(filename): try: f = open(filename) s = f.read() except IOError: print('error reading',filename) return g = open('stats.txt','w') g.write('%d,%d,%d' % (len(s),len(s.split()),s.count('\n')+1)) 21
Εξαιρέσεις Γράψτε µια συνάρτηση, η οποία θα ζητάει από το χρήστη να δίνει αριθµούς µέχρι να δώσει κενό. Η συνάρτηση να επιστρέφει τότε το µέσο όρο και τον µεσαίο (median) των αριθµών που έχουν εισαχθεί σαν µια πλειάδα. Αν ο χρήστης εισάγει µη έγκυρο αριθµό, η συνάρτηση θα επιστρέφει τα στατιστικά των µεχρι τότε αριθµών Π.χ. 13 1 2 4 4x result = (5, 4) 22
Εξαιρέσεις (συνέχεια) def stats(): L = [] while True: s = input() if not s: break try: L.append(eval(s)) except: break L.sort() if len(l)>0: return (float(sum(l))/len(l), L[len(L)//2]) 23
Τελική Εξέταση Ανοιχτά βιβλία: Μπορείτε να φέρετε µαζί σας τα βιβλία σας (σε έντυπη µορφή) και τις διαφάνειες του µαθήµατος (σε έντυπη µορφή) Απαγορεύεται αυστηρά η ανταλλαγή έντυπου υλικού µεταξή των εξεταζοµένων κατά τη διάρκεια της εξέτασης! Διάρκεια: 2:30 ώρες, έγκαιρη προσέλευση! 4 5 θέµατα µε στόχο: Την ανάπτυξη µιας συνάρτησης ή ένός προγράµµατος που εκτελεί µια λειτουργία Την κατανόηση ενός δοθέντος προγράµµατος ή συνάρτησης 24
Τελική Εξέταση Συµβουλές: Διαβάστε την ύλη προσεκτικά και σιγουρευτείτε ότι την κατανοείτε πλήρως. Εξασκηθείτε στο να βρίσκετε γρήγορα τις διαφάνειες που περιέχουν λεπτοµέρειες που πιθανό να µην θυµάστε (π.χ. µεθόδους λιστών). Προετοιµαστείτε µε πολλή εξάσκηση. Προσπαθήσετε να λύστε όσο πιο πολλές ασκήσεις µπορείτε. Διαβάστε όλα τα θέµατα προσεκτικά πριν αρχίσετε να γράφετε. Κάποια από αυτά µπορεί να είναι πιο εύκολα από άλλα. Μην επιχειρήσετε να αντιγράψετε κάτι που δεν το καταλαβαίνετε. 25