Συναρτήσεις

Ασκήσεις εξετάσεων

Άσκηση. Γράψτε ένα πρόγραμμα το οποίο θα υπολογίζει το παραγοντικό ενός φυσικού $n > 0$ Ο υπολογισμός θα πρέπει να γίνεται μέσα σε μία συνάρτηση με το όνομα fact. Το πρόγραμμα θα πρέπει να μπορεί να διαχειρισθεί όλες τις περιπτώσεις ακεραίων: θα τυπώνει το $n! = 1\cdot 2\cdot\ldots\cdot n$ για $n>0$ και τον αριθμό $1$ για $n \leq 0$.


def fact(n):
    if n <= 0: return 1
    result = 1
    for i in range(2,n+1):
        result *= i
    return result

n = int(input("Enter a positive integer: "))
result = fact(n)
print(n,'! =',result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα vowelCount και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει τον αριθμό των φωνηέντων σε αυτή την ακολουθία χαρακτήρων. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def vowelCount(s):
    s = s.lower()
    vowel = 'aeiou'
    iv = 0
    for c in s:
        if c in vowel: iv += 1
    return iv

s = input("Enter a string: ")
result = vowelCount(s)
print("Number of vowels: ",result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα mary και ορίσματα τους ακέραιους αριθμούς m, a, r και y η οποία επιστρέφει μια ακολουθία χαρακτήρων αποτελούμενη από m φορές τον χαρακτήρα 'm', a φορές τον χαρακτήρα 'a', r φορές τον χαρακτήρα 'r' και y φορές τον χαρακτήρα 'y'. Υποθέτουμε, και δεν χρειάζεται να το ελέγξετε, ότι όλα τα ορίσματα είναι θετικοί ακέραιοι. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def mary(m,a,r,y):
    s = m*'m' + a*'a' + r*'r' + y*'y'
    return s

n1 = 1; n2 = 2; n3 = 5; n4 = 6
result = mary(n1,n2,n3,n4)
print(result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα whatVowels και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει, ως ακολουθία χαρακτήρων εκείνα τα φωνήεντα που περιέχονται στην s. Για παράδειγμα, αν το όρισμα είναι 'program' θα πρέπει να επιστρέψει 'oa' ενώ αν είναι 'try' να επιστρέφει '' και αν το όρισμα είναι 'potato' να επιστρέφει 'οαο'. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def whatVowels(s):
    s = s.lower()
    vowel = 'aeiou'
    snew = ''
    for c in s:
        if c in vowel: snew += c
    return snew


s = input("Enter a string: ")
result = whatVowels(s)
print("String of vowels: ",result) 

Άσκηση. Γράψτε μια συνάρτηση με το όνομα wordScore και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει έναν ακέραιο αριθμό ως εξής: κάθε φωνήεν βαθμολογείται με 2 βαθμούς, κάθε ένα από τα γράμματα, m, r, y με 3 βαθμούς, ενώ όλοι οι υπόλοιποι χαρακτήρες συνεισφέρουν 1 βαθμό. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def wordScore(s):
    s = s.lower()
    vowel = 'aeiou'
    special = 'mry'
    
    score = 0
    for c in s:
        if c in vowel:
            score += 2
        elif c in special:
            score += 3
        else:
            score += 1
    
    return score


s = input("Enter a string: ")
result = wordScore(s)
print("The score for",s,"is: ",result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα numWars και όρισμα δύο φυσικούς αριθμούς n1 και n2. Η συνάρτηση θα πρέπει να επιστρέφει την ακολουθία χαρακτήρων 'Friends' αν οι δύο αριθμοί έχουν τουλάχιστον δύο κοινούς διαιρέτες διαφορετικούς από τη μονάδα, αλλιώς την ακολουθία χαρακτήρων 'Enemies'. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def numWars(n1,n2):
    ic = 0
    for i in range(2,min(n1,n2)+1):
        if n1%i == 0 and n2%i == 0: ic += 1
        if ic >= 2: break
    
    if ic >= 2:
        return 'Friends'
    else:
        return 'Enemies'


a = int(input("Enter a positive integer: "))
b = int(input("Enter one more positive integer: "))
result = numWars(a,b)
print("The integers",a,"and",n2,"are",result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα circles και ορίσματα τέσσερις πραγματικούς αριθμούς $a, b, c, d$. Υποθέτουμε ότι στα σημεία $(a, b)$ και $(c, d)$ βρίσκονται δύο κύκλοι ακτίνας 1. Η συνάρτηση circles θα πρέπει να επιστρέφει 'YES' αν οι δύο κύκλοι τέμνονται ή εφάπτονται, 'NO' διαφορετικά. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def circles(a,b,c,d):
    dist = (a-c)**2 + (b-d)**2
    if dist >= 1:
        return 'NO'
    else:
        return 'YES'

a = float(input("Enter x coordinate of center of first circle: "))
b = float(input("Enter y coordinate of center of first circle: "))
c = float(input("Enter x coordinate of center of second circle: "))
d = float(input("Enter y coordinate of center of second circle: "))
result = circles(a,b,c,d)
print("The circles intersect:",result)

Άσκηση. Γράψτε ένα πρόγραμμα το οποίο θα υπολογίζει το άθροισμα \( \sum_{k=0}^n x^k \) όπου \( x \) είναι πραγματικός και \( n \) ακέραιος. Ο υπολογισμός θα πρέπει να γίνεται μέσα σε μία συνάρτηση με το όνομα gsum. Το πρόγραμμα θα πρέπει να μπορεί να διαχειρισθεί όλες τις περιπτώσεις ακεραίων \( n \): θα τυπώνει το παραπάνω αποτέλεσμα για \( n>0 \) και τον αριθμό \( 0 \) για \( n \leq 0 \). Οι μεταβλητές x,n πρέπει να γίνονται γνωστές στη συνάρτηση μέσω ορισμάτων.


def gsum(x,n):
    if n <= 0: return 0
    gs = 0
    for k in range(n+1):
        gs += x**k
    return gs


x = float(input("Ener a real number: "))
n = int(input("Enter an integer: "))
result = gsum(x,n)
print(result)

Άσκηση. Γράψτε μία συνάρτηση με το όνομα maxSin η οποία θα δέχεται δύο πραγματικούς αριθμούς και θα επιστρέφει εκείνον για τον οποίο το ημίτονό του είναι μεγαλύτερο. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


import math

def maxSin(a,b):
    if math.sin(a) > math.sin(b):
        return a
    else:
        return b


a = float(input("Enter a real number: "))
b = float(input("Enter one more real number: "))
result = maxSin(a,b)
print("The sin of",a,"is greater of equal to the sin of",b)

Άσκηση. Όλοι οι αριθμοί τηλεφώνου στην Ελλάδα έχουν δέκα ψηφία. Κωδικοποιούμε τον κάθε αριθμό τηλεφώνου ως εξής: αντιστοιχούμε σε κάθε αριθμό την ακολουθία χαρακτήρων που προκύπτει αν αντικαταστήσουμε κάθε ψηφίο με το αντίστοιχο γράμμα του αλφάβητου, με το μηδέν να αντιστοιχεί στο γράμμα 'x'. Γράψτε τη συνάρτηση telephone η οποία με όρισμα μία κωδικοποίηση (ακολουθία χαρακτήρων) ενός τηλεφωνικού αριθμού επιστρέφει τον αριθμό τηλεφώνου, ως ακέραιο. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def telephone(tel):
    encoding = 'xabcdefghi'
    telNum = ''
    for c in tel:
        for i in range(len(encoding)):
            if c == encoding[i]: telNum += str(i)
    return int(telNum)


s = 'bhaxcdefgi'
result = telephone(s)
print("The telephone with encoding",s,"is",result)

Άσκηση. Έστω $f$ η συνάρτηση $f(x)=x\sin(x)$. Γράψτε τη συνάρτηση fsign η οποία να επιστρέφει μια ακολουθία χαρακτήρων αποτελούμενη από τους χαρακτήρες '+' και '-' ανάλογα αν η τιμή της συνάρτησης f είναι θετική ή όχι στα μέσα των διαστημάτων $[0,1], [1,2],\ldots,[99,100]$. Για παράδειγμα, αν η συνάρτηση είναι παντού θετική θα πρέπει να επιστρέψει μια ακολουθία χαρακτήρων αποτελούμενη από 100 χαρακτήρες, όλους ίσους με τον '+'. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


import math

def f(x):
    return x*math.sin(x)
    
def fsign():
    s = ''
    for i in range(100):
        x = i + 0.5
        fx = f(x)
        if fx > 0:
            s += '+'
        else:
            s += '-'
    return s


s = fsign()
print(s)

Άσκηση. Έστω $f$ η συνάρτηση $f(x)=x\cos(x)$. Γράψτε τη συνάρτηση fmax με όρισμα δύο πραγματικούς αριθμούς $a < b$ και ένα φυσικό αριθμό $n > 1$ η οποία να επιστρέφει το μέγιστο της συνάρτησης $f$ σε $n$ σημεία ομοιόμορφα κατανεμημένα στο διάστημα $[a, b]$. Για παράδειγμα, αν $a = 1$, $b = 3$ και $n = 5$ η συνάρτηση πρέπει να επιστρέφει τη μέγιστη από τις τιμές της $f$ στα σημεία $1, 1.5, 2, 2.5, 3$. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


import math

def f(x):
    return x*math.cos(x)
    
def fmax(a,b,n):
    x = a
    dx = (b-a)/(n-1)
    m = f(a)
    for i in range(1,n):
        x = a + i*dx
        fx = f(x)
        if f(x) > m: m = fx
        print(x,fx)

    return fx


a = float(input("Enter left point of interval: "))
b = float(input("Enter right point of interval: "))
n = int(input("Enter number of point of interval: "))
result = fmax(a,b,n)
print("Maximum of function at the",n,"points of the interval",result)

Άσκηση. Γράψτε μια συνάρτηση με το όνομα squares και ορίσματα δύο πραγματικούς αριθμούς $0 < a < b$. Οι αριθμοί αυτοί είναι τα μήκη των πλευρών δύο τετραγώνων με την πάνω αριστερή κορυφή τους στα σημεία $(a, a)$ και $(b, b)$. Η συνάρτηση θα πρέπει να επιστρέφει το εμβαδό της τομής των τετραγώνων εάν αυτά τέμνονται, διαφορετικά, τον αριθμό 0. Γράψτε ένα πρόγραμμα το οποίο χρησιμοποιεί τη συνάρτηση που γράψατε και παράγει αποτέλεσμα.


def squares(a,b):
    if b >= 2*a:
        return 0
    else:
        return (2*a-b)*a


a = float(input("Enter position of upper left corner of first square: "))
b = float(input("Enter position of upper left corner of second square: "))
result = squares(a,b)
if result == 0:
    print("the squares have no overlap")
else:
    print("overlap area of squares:",result)