Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Klasa II

Logika

SPIS TREŚCI

Wartości logiczne

Zawsze zadziwia nas "inteligencja" komputerów. Potrafią obsługiwać maszyny, kierować samolotami, grać w gry... Jak to robią? Dzieje się tak za sprawą logiki. Słowo logika pochodzi od greckiego słowa λόγος (logos – słowo, rozum, myśl). Jest ona ważną częścią matematyki. Została wprowadzona do nauki już przez starożytnych Greków.

Jest to nauka o poprawnym rozumowaniu, którą matematyka wykorzystuje do udowadniania swoich twierdzeń. Bez logiki nie byłoby współczesnej nauki.

W logice mamy dwie wartości: prawdę (ang. true) fałsz (ang. false). Wartości logiczne idealnie nadają się dla komputerów, ponieważ przetwarzany przez nie bit posiada dwa różne stany i łatwo zatem przypisać mu wartość fałszu (0) lub prawdy (1).

Uruchom poniższy program:

# Wartości logiczne
#------------------

print("FAŁSZ: ",False)
print("PRAWDA:",True)

W oknie konsoli zostanie wyświetlony tekst:

FAŁSZ:  False
PRAWDA: True

W języku Python mamy dwie stałe logiczne: False o wartości 0 i True o wartości 1. Zmodyfikuj program:

# Wartości logiczne
#------------------

print("FAŁSZ  =",int(False))
print("PRAWDA =",int(True))
FAŁSZ  = 0
PRAWDA = 1

Tutaj funkcja int( ) przekształca wartość logiczną w liczbę całkowitą. Otrzymujemy zatem wartości liczbowe stałych FalseTrue, które możemy wyświetlić.


Na początek:  podrozdziału   strony 

Wyrażenia logiczne

Wyrażenie logiczne daje w wyniku prawdę (jeśli jest prawdziwe) lub fałsz (jeśli jest fałszywe).

Uruchom program:

# Wyrażenia logiczne
#-------------------

a = int(input("Podaj wartość a = "))
print("a > 10? :",a > 10)

W programie tworzymy zmienną a, po czym odczytujemy z konsoli tekst, zamieniamy go na liczbę całkowitą i umieszczamy ją w zmiennej. Następnie wyświetlamy wartość wyrażenia a > 10. W wyrażeniu tym mamy operator porównania >. Jest to operator logiczny, czyli taki, który zwraca w wyniku prawdę (1), jeśli nierówność jest spełniona, lub fałsz (0), jeśli nierówność nie jest spełniona. Zatem, jeśli wprowadzisz np. liczbę 5 nierówność nie będzie spełniona i komputer wypisze:

Podaj wartość a = 5
a > 10? : False

Jeśli wpiszesz np. liczbę 12, komputer wypisze:

Podaj wartość a = 12
a > 10? : True

Operatory porównań w języku Python są następujące:

Operator Przykład Opis
> a > b Zwraca True, jeśli a jest większe od b,
zwraca False w przypadku przeciwnym.
< a < b Zwraca True, jeśli a jest mniejsze od b,
zwraca False w przypadku przeciwnym.
== a==b Zwraca True, jeśli a jest równe b,
zwraca False w przypadku przeciwnym.
!= a != b Zwraca True, jeśli a jest różne od b,
zwraca False w przypadku przeciwnym.
>= a >= b Zwraca True, jeśli a jest większe lub równe b,
zwraca False w przypadku przeciwnym.
<= a <= b Zwraca True, jeśli a jest mniejsze lub równe b,
zwraca False w przypadku przeciwnym.

W powyższej tabelce ab mogą być zmiennymi lub dowolnymi wyrażeniami, np. a + 5 < b - 11.

Wartość logiczną można umieszczać w zmiennej przy pomocy operatora przypisania =:

# Typ logiczny
#-------------

a = True
b = False
print("Zawartość a:",a)
print("Zawartość b:",b)
print()
a = (5 != 5)
b = (5 >= 5)
print("Zawartość a:",a)
print("Zawartość b:",b)
Zawartość a: True
Zawartość b: False

Zawartość a: False
Zawartość b: True

Na początek:  podrozdziału   strony 

Instrukcja if; wersja 1

Wartości i wyrażenia logiczne są używane w instrukcji if (jeśli), która pozwala wykonywać inne instrukcje w zależności od wartości logicznych. Dzięki niej program komputerowy może pracować w sposób inteligentny.

Jeśli chcemy wykonać warunkowo tylko jedną instrukcję, to stosujemy następującą składnię:

if warunek: instrukcja

Działa to w następujący sposób:

Komputer wyznacza wartość logiczną warunku. Jeśli wartością jest True (lub dowolna wartość różna od 0), to zostanie wykonana instrukcja po dwukropku. Jeśli wartością jest False (lub wartość 0), to komputer nie wykona tej instrukcji.

Uruchom program:

# instrukcja if
#--------------

if True:  print("Witaj 1")
if False: print("ABCDEFGHIJK...")

if 5: print("Witaj 2")
if 0: print("123456789...")

a = int(input("Wpisz liczbę: "))

if a > 0: print("Witaj 3")
if a < 0: print("Witaj 4")
Witaj 1
Witaj 2
Wpisz liczbę: 4
Witaj 3
Witaj 1
Witaj 2
Wpisz liczbę: -12
Witaj 4

Kolejny program jest bardziej praktyczny. Odczytuje on liczbę i sprawdza, czy jest parzysta:

# instrukcja if
#--------------

a = int(input("Wpisz liczbę: "))

if a % 2: print("NIE",end="")
print("PARZYSTA")

Przeanalizujmy go:

Wynika z tego, iż jeśli a jest nieparzyste, to komputer wypisze NIE, po czym wypisze słowo PARZYSTA bezpośrednio za NIE, co da wydruk NIEPARZYSTA. Jeśli a jest parzyste, to komputer nie wyświetli słowa NIE, tylko samo słowo PARZYSTA.

Kolejny prosty program ogranicza wartość wprowadzonej liczby do przedziału od 1 do 10. Jeśli wprowadzona liczba jest większa od 10, to zmienia ją na 10. Podobnie, jeśli wprowadzona liczba jest mniejsza od 1, to zmienia ją na 1. Jeśli liczba znajduje się w przedziale od 1 do 10, to nie jest zmieniana:

# instrukcja if
#--------------

a = int(input("Wpisz liczbę: "))

if a > 10: a = 10
if a < 1:  a = 1
print("Liczba =",a)

Następny program odczytuje 3 liczby do zmiennych a, bc, po czym szuka liczby największej. Do  tego celu wykorzystuje zmienną pomocniczą x, w której umieszcza kolejne liczby większe:

# instrukcja if
#--------------

a = int(input("Wpisz liczbę a: "))
b = int(input("Wpisz liczbę b: "))
c = int(input("Wpisz liczbę c: "))
x = a # zapamiętujemy a
if b > x: x = b # uaktualniamy
if c > x: x = c # uaktualniamy
print()
print("Największa jest liczba",x)
print()

Jeśli warunkowo chcemy wykonać więcej niż pojedynczą instrukcję, to musimy zastosować blok. W języku Python blok określamy przy pomocy odstępu. Instrukcje należące do tego samego bloku posiadają taki sam odstęp od lewej krawędzi. Na początku może się to wydawać dziwne, lecz jest bardzo proste. Odstępy zwykle ustala się co 4 lub co 2 pozycje znakowe. Instrukcja warunkowa z blokiem wygląda następująco:

if warunek:
    instrukcja 1
    instrukcja 2
    ...
    instrukcja n
...

Poniższy program odczytuje 2 liczby do zmiennych ab. Następnie sprawdza, czy a < b. Jeśli tak, to zamienia te liczby miejscami i wyświetla wynik w kolejności liczba mniejsza, liczba większa lub równa.

W wielu różnych algorytmach występuje operacja zamiany zawartości dwóch zmiennych. Wymaga ona trzech kroków oraz dodatkowej zmiennej pomocniczej.

Powyższa animacja pokazuje kolejne kroki (w języku Python można to zrobić prościej, co zobaczymy na dalszych lekcjach).

Załóżmy iż mamy dwie zmienne ab, których zawartość chcemy zamienić miejscami, tzn. w zmiennej a ma się znaleźć to, co jest w zmiennej b, a w zmiennej b ma się znaleźć to, co jest w zmiennej a. Tworzymy dodatkową zmienną pomocniczą x i wykonujemy trzy poniższe kroki:

K01: xa
K02: ab
K03: bx

W kroku 1 wpisujemy do zmiennej x zawartość zmiennej a. W ten sposób ta zawartość zostaje zabezpieczona.
W kroku 2 do zmiennej a wpisujemy zawartość zmiennej b, mamy zatem wykonane połowę zadania.
W kroku 3 wpisujemy do zmiennej b zapamiętaną w x poprzednią zawartość zmiennej a.

# instrukcja if z blokiem
#------------------------

a = int(input("Wpisz liczbę a: "))
b = int(input("Wpisz liczbę b: "))
if a > b:
    x = a # zamieniamy miejscami a z b
    a = b
    b = x
print()
print(a,b)
print()

Na początek:  podrozdziału   strony 

Instrukcja if, wersja 2

W programowaniu często zdarza się tak, iż sprawdzając warunek, chcemy aby została wykonana jedna instrukcja (lub grupa instrukcji), jeśli warunek jest prawdziwy, a inna instrukcja (lub grupa instrukcji), gdy warunek jest fałszywy. W takim przypadku ma zastosowanie druga wersja instrukcji if. Jej składnia jest następująca:

if warunek: instrukcja 1
else: instrukcja 2

lub

if warunek:
    blok 1
    ...
else:
    blok 2
    ...

Słowo angielskie else oznacza: inaczej, w przeciwnym razie.

Komputer oblicza warunek. Jeśli jest prawdziwy (daje wynik różny od zera), to wykonana zostaje instrukcja 1 (lub blok 1). Instrukcja 2 (lub blok 2) jest pomijana. Jeśli warunek jest fałszywy (daje wynik równy zero), to instrukcja 1 (lub blok 1) zostaje pominięta, a komputer wykona instrukcję 2 (lub blok 2).

Jeśli stosujemy blok, to należy stosować ten sam odstęp w obu blokach 1 i 2.

Poniższy przykładowy program odczytuje hasło i udziela dostępu, jeśli hasło jest dobre, lub odmawia dostępu przy złym haśle.

if input("wpisz hasło: ") == "abc":
    print("Masz dostęp")
    dostęp = True
else:
    print("Brak dostępu")
    dostęp = False

print(dostęp)

Program działa następująco:

Jako wyrażenie stosujemy porównanie tekstu zwróconego przez input( ) z tekstem hasła. Jeśli oba teksty są równe, wyrażenie będzie prawdziwe. Wtedy zostanie wykonany blok pierwszy. Komputer wypisze "Masz dostęp" i zmiennej dostęp nada wartość True. Blok drugi zostanie pominięty,

Jeśli teksty będą różne, komputer wykona blok drugi, pomijając blok pierwszy. Wypisze "Brak dostępu" i zmiennej dostęp nada wartość False.

Na koniec komputer wypisze wartość zmiennej dostęp.

W jednym wierszu można umieścić kilka instrukcji, oddzielając je średnikami:

if input("wpisz hasło: ") == "abc": print("Masz dostęp"); dostęp = True
else: print("Brak dostępu"); dostęp = False
print(dostęp)

Jednakże nie polecam tego sposobu, gdyż program traci na czytelności.

Następny program rozwiązuje równanie liniowe o postaci:

a·x + b = c

Z matematyki wiemy, że takie równanie posiada rozwiązanie, jeśli współczynnik a jest różny od 0. Wtedy:

a·x + b = c   / - b
a·x + b - b = c - b
a·x = c - b   / : a
a·x : a = (c - b) : a
x = (c - b) : a

 

# Równanie liniowe
# Imię Nazwisko, Klasa
# Data
#---------------------

print("Równanie liniowe:")
print("   ax + b = c")
print("-----------------")
print()
print("Podaj współczynniki:")
a = float(input("a = "))
b = float(input("b = "))
c = float(input("c = "))
print()
if a: # prawdziwe dla a różnego od 0
    x = (c - b) / a
    print("x =",x)
else:
    print("Brak rozwiązania!!!")
print()

Zastanów się, jak zmienić powyższy program na wersje if bez bloków z pojedynczymi instrukcjami i bez zmiennej x.


Na początek:  podrozdziału   strony 

Instrukcja if, wersja 3

Trzecia wersja instrukcji if ma następującą postać:

if warunek_1: instrukcja_1
elif warunek_2: instrukcja_2
elif warunek_3: instrukcja_3
...
elif warunek_n: instrukcja_n
else: instrukcja

Działanie jest następujące:

Komputer oblicza warunek_1. Jeśli jest on prawdziwy, zostanie wykonana instrukcja_1 i następuje przejście do następnej instrukcji w programie. Jeśli warunek_1 jest fałszywy, to komputer wylicza kolejno warunki od 2 do n i jeśli napotka warunek prawdziwy, to komputer wykonuje instrukcję skojarzoną z tym warunkiem, po czym przechodzi do następnej instrukcji w programie (zawsze wykonywana jest tylko jedna z instrukcji od 2 do n, nawet jeśli kilka z warunków jest prawdziwych). Jeśli żaden warunek nie jest prawdziwy, to komputer wykona instrukcję skojarzoną z else (else można pominąć, wtedy komputer po prostu wykona następną instrukcję w programie).

Jeśli warunkowo chcesz wykonać kilka instrukcji, to stosujesz blok instrukcji z odstępem.

Poniższy program odczytuje ocenę w postaci liczby od 1 do 6, a następnie wyznacza jej formę słowną:

# Logika
#-------

# odczytujemy ocenę w postaci
# liczby 1 2 3 4 5 6

ocena = int(input("Podaj ocenę liczbową od 1 do 6: "))

print()
print(ocena,"=",end=" ")

# zamieniamy ją na postać słowną

if   ocena == 1: ocena = "stopień niedostateczny"
elif ocena == 2: ocena = "stopień dopuszczający"
elif ocena == 3: ocena = "stopień dostateczny"
elif ocena == 4: ocena = "stopień dobry"
elif ocena == 5: ocena = "stopień bardzo dobry"
elif ocena == 6: ocena = "stopień celujący"
else: ocena = "BŁĘDNA WARTOŚĆ OCENY"

print(ocena)

Na początek:  podrozdziału   strony 

Funkcje logiczne

Przypomnijmy, wyrażenie logiczne (ang. logical expression) jest wyrażeniem, które daje w wyniku wartość logiczną prawdy (ang. true, 1, True) lub fałszu (ang. false, 0, False). W języku Python rozszerzono tę definicję, uznając za prawdziwe dowolne wyrażenie o wartości niezerowej, oraz za fałszywe dowolne wyrażenie o wartości zerowej (powtarzam to wielokrotnie, ponieważ taka definicja znacznie ułatwia programowanie i musisz ją zapamiętać).

W wyrażeniach logicznych występują operacje logiczne, podobnie jak w wyrażeniach arytmetycznych występują operacje arytmetyczne (np. dodawanie, mnożenie...).  Istnieje specjalny dział matematyki, zwany Algebrą Boole'a. Nazwa ta pochodzi od sławnego matematyka angielskiego George Boole'a, który ją opracował i opisał.


George Boole (1815 - 1864)

W logice istnieją trzy podstawowe funkcje logiczne. Opiszemy je tabelkami.

Negacja, zaprzeczenie, NIE (ang. NOT):

  a    not a 
False True
True False

Negacja jest operacją jednoargumentową. Zwraca wartość logiczną przeciwną do wartości logicznej swojego argumentu. W języku Python negację wykonuje operator not(czytaj: nieprawda, że). Wyrażenie a jest dowolnym wyrażeniem, które zostanie potraktowane jako logiczne (patrz: definicja na początku podrozdziału). Jeśli wyrażenie a będzie prawdziwe (True lub różne od zera), to wynikiem not a będzie False (fałsz). Jeśli wyrażenie a będzie fałszywe (False lub równe zero), to wynikiem not a będzie True (prawda).

Przejdź do konsoli Pythona i wpisz:

not True
not False
not 5
not 2 + 2 == 4

Alternatywa, suma logiczna, LUB (ang. OR)

  a     b    a or b 
False False False
False True True
True False True
True True True

Alternatywa jest operacją dwuargumentową. Symbolem operatora alternatywy w języku Python jest or (czytaj: lub). Zasada pracy jest następująca:

a or b = a, jeśli a jest prawdziwe (True lub niezerowe)
a or b = b, jeśli a jest fałszywe (False lub równe 0)

Przejdź do konsoli Pythona i wpisz:

False or False
10 - 2 == 8 or 2 + 2 < 3
5 or False
0 or "Ala"
False or 15

Koniunkcja, iloczyn logiczny, I (ang. AND)

  a     b    a and b 
False False False
False True False
True False False
True True True

Koniunkcja jest również operacją dwuargumentową. Symbolem operatora koniunkcji w języku Python jest and (czytaj: i). Zasada pracy jest następująca:

a and b = a, jeśli a jest fałszywe (False lub zerowe)
a and b = b, jeśli a jest prawdziwe (True lub niezerowe)

Przejdź do konsoli Pythona i wpisz:

False and True
5 and 12
0 and 9999
False and "Ala"
True and "Magda"

Jeśli chcesz, aby wynik operatorów logicznych był wartością logiczną True lub False, to zastosuj funkcję bool( ), która dokonuje takiej konwersji. Przejdź do konsoli Pythona i wpisz:

bool("Jasiek" or 0)
bool(0 and "Jasiek")

Operatory logiczne stosujemy, gdy potrzebne są nam złożone warunki, np. chcemy sprawdzić, czy liczba x należy do przedziału domkniętego [a,b] (przedział domknięty [a,b] to taki, do którego należą liczby a i b oraz wszystkie liczby leżące pomiędzy a i b). Aby liczba x wpadała w przedział [a,b] musi jednocześnie spełniać dwa warunki:

Przejdź do konsoli Pythona i wpisz:

5 > 3 and 5 < 7
5 > 3 and 5 < 4


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.