5.1. Algorytmy

Poniżej kody klasycznych algorytmów w Pythonie. [Komentarz do dopisania]

5.1.1. Trójkąt

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Badanie możliwości zbudowania trójkąta i obliczanie jego pola
# za pomocą wzoru Herona
# <eCG>

import math  # dołączamy bibliotekę matematyczną

op = "t"  # deklarujemy i inicjujemy zmienną pomocniczą
while op != "n":  # dopóki wartość zmiennej op jest inna niż znak "n"
    a, b, c = input("Podaj 3 boki trójkąta (oddzielone przecinkami): ")
    # alternatywna forma pobrania danych
    # a, b, c = [int(x) for x in raw_input(
    #     "Podaj 3 boki trójkąta (oddzielone spacjami): ").split()]

    if a + b > c and a + c > b and b + c > a:  # warunek złożony
        print "Z podanych boków można zbudować trójkąt."
        # czy boki spełniają warunki trójkąta prostokątnego?
        if (a**2 + b**2 == c**2 or
                a**2 + c**2 == b**2 or
                b**2 + c**2 == a**2):
            print "Do tego prostokątny!"

        # na wyjściu możemy wyprowadzać wyrażenia
        print "Obwód wynosi:", (a + b + c)
        p = 0.5 * (a + b + c)  # obliczmy współczynnik wzoru Herona
        # liczymy pole ze wzoru Herona
        P = math.sqrt(p * (p - a) * (p - b) * (p - c))
        print "Pole wynosi:", P
        op = "n"  # ustawiamy zmienną na "n", aby wyjść z pętli while
    else:
        print "Z podanych odcinków nie można utworzyć trójkąta prostokątnego."
        op = raw_input("Spróbujesz jeszcze raz (t/n): ")

print "Do zobaczenia..."

5.1.2. Silnia

Wersja iteracyjna i rekurencyjna.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Obliczanie silni metodą iteracyjną i rekurencyjną
# <eCG>


def sil_rek(n):
    if n == 0:
        return 1
    return sil_rek(n - 1) * n


def sil_iter(n):
    wynik = 1
    for i in range(1, n + 1):
        wynik = wynik * i
    return wynik


def main(args):
    n = int(raw_input("Podaj liczbę: "))
    print "sil_iter(%s) = %s" % (n, sil_iter(n))
    print "sil_rek(%s) = %s" % (n, sil_rek(n))
    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.3. Algorytm Euklidesa

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Algorytm Euklidesa – znajdowanie najwększego wspólnego dzielnika
# <eCG>


def nwd_klasyczny(a, b):
    while a != b:
        if a > b:
            a -= b
        else:
            b -= a

    return a


def nwd_optymalny(a, b):
    while a > 0:
        a = a % b
        b = b - a

    return b


def main(args):
    a = int(input("Podaj liczbę a: "))
    b = int(input("Podaj liczbę b: "))

    print("Nwd(%, %) klasyczny =", nwd_klasyczny(a, b))
    print("Nwd(%, %) optymalny =", nwd_optymalny(a, b))

    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.4. Ciąg Fibonacciego

Wersja iteracyjna i rekurencyjna.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Ciąg Fibonacciego
# <eCG>


def fib_iter0(n):
    """Funkcja zwraca n-ty wyraz ciągu Fibonacciego
       F(0) = 0
       F(1) = 1
       F(n) = F(n-2) + F(n-1) dla n > 1
    """
    if n == 0:
        return 0
    elif n == 1:
        return 1
    a, b = (0, 1)
    for i in range(1, n - 1):
        a, b = b, a + b
    return b


def fib_iter1(n):  # definicja funkcji
    """
        Funkcja drukuje kolejne wyrazy ciągu Fibonacciego
        aż do wyrazu n-tego, który zwraca.
        Wersja iteracyjna z pętlą while.
    """
    # dwa pierwsze wyrazy ciągu zapisane w tupli
    a, b = (0, 1)  # przypisanie wielokrotne, rozpakowanie tupli
    print(a, end=' ')
    while n > 1:
        print(b, end=' ')
        a, b = b, a + b  # przypisanie wielokrotne
        n -= 1


def fib_iter2(n):
    """
        Funkcja drukuje kolejne wyrazy ciągu Fibonacciego
        aż do wyrazu n-tego, który zwraca.
        Wersja iteracyjna z pętlą for.
    """
    a, b = 0, 1
    print("wyraz", 1, a)
    print("wyraz", 2, b)
    for i in range(1, n - 1):
        # wynik = a + b
        a, b = b, a + b
        print("wyraz", i + 2, b)

    print()  # wiersz odstępu
    return b


def fib_rek(n):
    """
        Funkcja zwraca n-ty wyraz ciągu Fibonacciego.
        Wersja rekurencyjna.
    """
    if n < 1:
        return 0
    if n < 2:
        return 1
    return fib_rek(n - 1) + fib_rek(n - 2)


def main(args):
    n = int(input("Podaj nr wyrazu: "))
    print("Wyraz {:d}: {:d}".format(n, fib_iter0(n)))
    print("=" * 40)
    fib_iter1(n)
    print()
    print("=" * 40)
    fib_iter2(n)
    print("=" * 40)
    print(fib_rek(n - 1))
    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.5. Sortowanie

5.1.5.1. Przez wybór

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Sortowanie przez wybór
# <eCG>


from random import randint


def sort_wybor(lista):
    n = len(lista)
    for i in range(n):
        k = i
        for j in range(i + 1, n):
            if lista[j] < lista[k]:
                k = j
        # pythonowy składnia dla zamiany wartości
        lista[i], lista[k] = lista[k], lista[i]

    return lista


def main(args):
    lista = []
    for i in range(10):
        lista.append(randint(0, 100))
    print lista
    print sort_wybor(lista)


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.6. Konwersja liczby

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Konwersja liczby dziesiętnej na system o podanej podstawie
# <eCG>

cyfry = {10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F'}
cyfry2 = {v: k for k, v in cyfry.items()}


def do10(liczba, podst):
    """
    Funkcja konwertuje liczbę o podanej podstawie na system dziesiętny
    Liczba konertowana jest na napis
    """
    p = len(str(liczba)) - 1
    liczba10 = 0
    for l in str(liczba):
        if l.isdigit():
            liczba10 += int(l) * podst**p
        else:
            liczba10 += cyfry2[l] * podst**p
        p -= 1
    print liczba10


def konwertuj(liczba, podst):
    """
    Funkcja konwertuje podaną liczbę dziesiętną na system o podanej podstawie
    wykorzystując dzielenie z resztą, zwraca listę reszt.
    """

    global cyfry

    # słownik ze znakami cyfr większych od 9
    reszty = []  # pusta lista
    while liczba > 0:
        reszty.append(liczba % podst)
        liczba = liczba / podst

    reszty.reverse()  # odwrócenie elemnetów listy
    if podst > 10:  # zamiana cyfr większych od 9
        reszty = [cyfry[x] if x > 9 else x for x in reszty]
    return reszty


def main(args):
    liczba = raw_input("Podaj liczbę: ")
    podst = int(raw_input("Podaj podstawę (2-16): "))
    # cel = raw_input("Podaj podstawę systemu docelowego: ")
    do10(liczba, podst)
    # liczbaP = "".join(str(x) for x in konwertuj(int(liczba), podst))
    # print "Liczba(10):", liczba10
    # print "Liczba(%s): %s" % (podst, liczbaP)

    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.7. Szyfr Cezara

Wersja ze stałym kluczem.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Implementacja klasycznego szyfru Cezara
# <eCG>

"""
    ZADANIE
    Pobierz od użytkownika ciąg znaków, zaszyfruj go przy wykorzystaniu
    szyfru Cezara o kluczu podanym przez użytkownika,
    wyświetl zaszyfrowany ciąg. Następnie zdeszyfruj go
    i ponownie wyświetl wynik operacji.
"""


def szyfruj(tekst, klucz):
    szyfrogram = ""
    for znak in tekst:
        znak = znak.lower()
        if znak == ' ':
            pass
        elif ord(znak) + klucz > 122:
            znak = chr(ord(znak) + klucz - 26)
        else:
            znak = chr(ord(znak) + klucz)
        szyfrogram += znak
    return szyfrogram


def deszyfruj(szyfrogram, klucz):
    tekst = ""
    for znak in szyfrogram:
        if znak == ' ':
            pass
        elif ord(znak) - klucz < 97:
            znak = chr(ord(znak) - klucz + 26)
        else:
            znak = chr(ord(znak) - klucz)
        tekst += znak
    return tekst


def main(args):
    tekst = raw_input("Podaj tekst do zaszyfrowania:\n")
    try:
        klucz = int(raw_input("Podaj klucz:\n"))
        klucz = klucz % 26
        szyfrogram = szyfruj(tekst, klucz)
        deszyfr = deszyfruj(szyfrogram, klucz)
        assert deszyfr == tekst.lower()
        print "Szyfrogram:\n", szyfrogram
        print "Deszyfracja:\n", deszyfr
    except ValueError:
        print "Błędny klucz!"
    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))


"""
    JAK TO DZIAŁA
    try ... except to konstrukcja która przechwytuje błędy: w bloku try
    użytkownik może wprowadzić niewłaściwy klucz, np. literę, wtedy wykona się
    kod w bloku except.
    def nazwa_funkcji(argumenty): – tak definiujemy funkcje
    return zmienna – instrukcja zwraca wartość przypisaną zmiennej
    nazwa_funkcji(argumenty) – tak wywołujemy funkcje.
    Napisy mogą być indeksowane (od 0), co daje dostęp do pojedynczych znaków.
    Funkcja len(str) zwraca długość napisu, wykorzystana jako argument funkcji
    range() pozwala iterować po znakach napisu.
    Operator += oznacza dodanie argumentu z prawej strony do wartości z lewej.
"""

5.1.8. Pierwiastek kwadratowy

Użycie metody Herona.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Obliczanie wartości pierwiastka kwadratowego z podanej liczby
# przy użyciu metody Herona: a(n) = (a(n-1) + x / a(n-1)) / 2
# <eCG>


def pierwiastek(x, d):
    a = x  # inicjalizacja szkuanej wartości
    while abs(a - (x / a)) > d:
        a = (a + (x / a)) / 2
    return a


def main(args):
    # liczba dla której szukamy pierwiastka
    x = float(raw_input("Podaj liczbę: "))
    # dokładność obliczeń
    d = float(raw_input("Podaj dokładność: "))
    # drukujemy wynik z dokładnością do 6 miejsc
    print "Pierwiastek kwadratowy: {:.6f}".format(pierwiastek(x, d))
    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

5.1.9. Pole obszaru

Całka nieoznaczona Riemanna. [Sprawdzić poprawność obliczeń.]

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Obliczanie pola obszaru ograniczoneg wykresem funkcji:
# y = x^2, prostymi x = a, x = b i osią OX
# (oznaczona całka Riemanna)
# <eCG>


def funkcja(x):
    return x * x


def pole(a, b, n):
    p = 0  # wyliczane pole
    d = (b - a) / n  # długość przedziałów w zakresie <a;b>
    for i in range(n):
        x = a + (d * i) + (d / 2)  # punkty pośrednie przedziałów
        p += abs(funkcja(x))  # suma pól prostokątów
    return p


def main(args):
    a = int(raw_input("Podaj lewy kraniec: "))
    b = int(raw_input("Podaj prawy kraniec: "))
    n = int(raw_input("Podaj liczbę przedziałów: "))
    print "Pole: {:.3f}".format(pole(a, b, n))
    return 0


if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

Utworzony:2022-05-27 o 15:34 w Sphinx 1.4.5