Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz  

Autor artykułu: mgr Jerzy Wałaszek
Aktualizacja: 12.10.2024

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Klasa III

Tekst

SPIS TREŚCI

Znaki

Aby komputer mógł przetwarzać znaki (litery, cyfry, znaki pisarskie, itp.), muszą one zostać przekształcone w liczby, gdyż komputery potrafią jedynie przetwarzać liczby (a idąc głębiej: tylko bity, z których powstają te liczby; uczyliśmy się o tym na pierwszych lekcjach informatyki w naszym liceum). Aby sprostać temu zadaniu każdemu znakowi, który chcemy przetwarzać w komputerze, przydzielono liczbę zwaną kodem znaku (ang. character code).

Dla człowieka, taki sposób komunikacji z komputerem byłby bardzo niewygodny, dlatego komputery przekształcają kody znaków w zrozumiałe dla nas symbole, gdy je nam prezentują, np. na monitorze lub wydruku.


 

Zapamiętajmy jednak, że wewnętrznie znaki dla komputera są przechowywane w postaci ich kodów. Język Python posługuje się kodem znakowym o nazwie UTF-8 (ang. 8-bit Unicode Transformation Format). Kod ten jest obecnie bardzo rozpowszechniony. Oparto go o kod ASCII (ang. American Standard Code for Information Interchange), który był dawniej powszechnie stosowany na komputerach. Pierwotny kod ASCII udostępniał 128 kodów, które można było przydzielić 128 znakom. UTF-8 znosi te ograniczenia.

W języku Python znak jest tekstem. Tekst umieszczamy w cudzysłowach lub w apostrofach:

Python
print("A")
print('B')

Nie musimy uczyć się wartości kodów znaków (chociaż niektóre warto zapamiętać), ponieważ język Python udostępnia funkcję ord(znak), która zwraca kod znaku. Przejdź do konsoli Pythona (Run→Python Shell) i wpisz:

Python
>>>ord("A")

W wyniku otrzymasz liczbę 65. Jest to kod UTF-8 litery A.

Mamy również funkcję odwrotną: chr(kod), która przekształca kod UTF-8 znaku w znak. W konsoli wpisz:

Python
>>>chr(97)

Otrzymasz znak 'a', którego kodem jest 97.

Kody UTF-8 o wartościach 0...127 odpowiadają kodom ASCII. Kody te podzielone są na 4 sekcje po 32 znaki:

Kody 0...32: znaki sterujące i pomocnicze

Python
for kod in range(32):
    print(kod, chr(kod))
input()

Program zapisz na dysku, następnie uruchom Eksplorator plików (ikona żółtej teczki na pasku zadań), odszukaj program i uruchom go. W tej ćwiartce znajdują się znaki sterujące (które kiedyś wykonywały różne zadania, obecnie działa tylko kilka z nich) oraz znaki pomocnicze, np. strzałki, kolory karciane oraz inne symbole.

Kod 7 generuje dźwięk ostrzeżenia.

Kod 9 to tabulacja pozioma. J

Kod 10 powoduje przejście do nowego wiersza.

Kod 13 powoduje powrót na początek wiersza.

Kody 32...63: znaki pisarskie oraz cyfry

Python
for kod in range(32, 64):
    print(kod, chr(kod))
print()
for kod in range(ord("0"), ord("9") + 1):
    print(kod, chr(kod))

Zwróć uwagę, iż kody cyfr nie są równe im wartościom. Cyfra zero ma kod 48. Zatem:

kod cyfry = cyfra + 48
cyfra = kod cyfry - 48

Kody 64...95: Duże litery i znaki dodatkowe

Python
for kod in range(64, 96):
    print(kod, chr(kod))

Kody 96...127: małe litery i znaki dodatkowe

Python
for kod in range(96, 128):
    print(kod, chr(kod))

Zwróć uwagę, iż kody dużych i małych liter różnią się o 32:

kod małej litery = kod dużej litery + 32
kod dużej litery = kod małej litery - 32

Kody 128... : Pozostałe znaki, np. polskie litery

Python
for kod in range(128, 512):
    print(kod, chr(kod))

Wyszukaj litery 'Ą''ą' i porównaj ich kody. Wyciągnij wnioski.

Poniższy program wyświetla znaki o kodach od 32 do 1023. Uruchom go z poziomu Windows przy pomocy menagera plików.

Python
for kod in range(32, 1024):
    print(chr(kod), end="")
print()
input()

Do zapamiętania:


Na początek:  podrozdziału   strony 

Tekst

Tekst jest ciągiem znaków. W języku Python tekst jest umieszczany wewnątrz cudzysłowów lub apostrofów. Tekst wyświetlamy przy pomocy instrukcji print(...):

Python
print("Krokodyl 'Arek'")
print('Żaba "Rechotka"')

Jeśli tekst umieścimy w cudzysłowach, to można w nim stosować apostrofy jako zwykłe znaki. Jeśli tekst umieścimy w apostrofach, to z kolei można w nim używać cudzysłowów jako zwykłych znaków. Jeśli musimy w tekście umieścić ten sam znak (apostrof lub cudzysłów), przy pomocy którego objęliśmy tekst, to należy użyć znaku posiłkowego "\" przed wstawianym apostrofem lub cudzysłowem.

Python
print("Oto John \"Wielka 'Klucha'\" w ogrodzie")

Tekst można umieszczać w zmiennej:

Python
n = "To ja, twój TEKST!!!"
print(n)

Dostęp do poszczególnych znaków tekstu otrzymujemy przy pomocy indeksów, czyli liczb umieszczonych w klamrach kwadratowych:

Python
n = "Miś"[2]
print(n)

Indeksy znaków tekstu rozpoczynają się od zera:

Indeks
0 1 2 3 4
Tekst J a n e k
tekst[0] - pierwszy znak tekstu

Liczbę znaków tekstu zwraca funkcja len(tekst). Uruchom poniższy program:

Python
t = input("Wpisz krótki tekst: ")
for i in range(len(t)):
    print(i, t[i])
print()

Indeksy umożliwiają odczytywanie znaków tekstu.

Python
t = input()
for i in range(len(t)):
    a = t[i]
    if a == "a":
        a = "b"
    elif a == "b":
        a = "a"
    print(a, end='')
print()

Do zapamiętania:


Na początek:  podrozdziału   strony 

Operacje na tekstach

Teksty można łączyć ze sobą przy pomocy operatora +. Operacja taka nazywa się konkatencją.

Python
t1 = input("Wpisz tekst: ")
t2 = " Matylda"
t3 = t1 + t2 # konkatencja
print(t3)

Teksty można powielać przy pomocy operatora *:

Python
a = input("Wpisz tekst: ")
a += " " # Dołączamy spację
b = "Start: " + a * 5 + "Stop."
print(b)
Do tekstu można dołączać znaki przy pomocy operatora +=:
Python
a = input()
b = '' # tekst pusty
for i in range(len(a)):
    b += a[len(a) - i - 1]
print(b)

Powyższy program można napisać prościej przy pomocy funkcji reversed(range(...)), która odwraca kolejność liczb generowanych przez funkcję range(...). W efekcie otrzymamy pozycje znaków tekstu w kierunku od końca do jego początku:

Python
a = input()
b = '' # tekst pusty
for i in reversed(range(len(a))):
    b += a[i]
print(b)

Tekst w języku Python jest obiektem. Obiekt jest strukturą danych, z którą powiązane są funkcje operujące na tych danych. Funkcje te wywołujemy w sposób następujący:

obiekt.funkcja(...)

Oto kilka dwie funkcje tekstu:

tekst.upper( ) : Zwraca kopię tekstu z literami zmienionymi w duże litery.
tekst.lower( ) : Zwraca kopię tekstu z literami zmienionymi w małe litery.

Uruchom program:

Python
a = input("Wpisz tekst: ")
print(a.upper())
print(a.lower())
print(a)

Wszystkie funkcje tekstu znajdziesz w dokumentacji języka Python, my poznamy tylko te podstawowe z nich. Zwróć uwagę, iż funkcje te nie zmieniają tekstu przechowywanego przez zmienną a. Zwracają jedynie kopię tego tekstu ze zmienionymi znakami. W języku Python tekst jest obiektem niezmiennym (ang. immutable). Zmiana tekstu polega na utworzeniu kopii, w której ta zmiana występuje. Na przykład, jeśli chcemy zmienić znaki tekstu w zmiennej na duże litery, to postępujemy następująco:

Python
a = input("Wpisz tekst: ")
# Zmieniamy znaki tekstu w a
# na duże litery
a = a.upper()
print(a)

Do zapamiętania:


Na początek:  podrozdziału   strony 

Szyfr przestawieniowy

Szyfrowanie polega na ukrywaniu treści wiadomości w taki sposób, aby stała się nieczytelna dla osoby niewtajemniczonej. Współcześnie szyfrowanie ma olbrzymie zastosowanie w sieci Internet. Dzięki niemu możemy przeprowadzać różne operacje w sposób bezpieczny, np. zakupy w sieci lub transakcje bankowe.

Szyfr przestawieniowy polega na zmianie kolejności liter w szyfrowanej wiadomości. Najprostszym takim szyfrem jest tworzenie tekstu wspak. Na przykład:

tekst jawny: "MATYLDA WRACA JUTRO"
szyfr:       "ORTUJ ACARW ADLYTAM"

Tekst wspak możemy uzyskać na kilka sposobów, np:

Indeksowanie znaków od końca tekstu:

Python
# Szyfry przestawieniowe
#-----------------------

a = input("Tekst: ").upper()
print("Szyfr: ", end="")
for i in range(len(a)):
    print(a[len(a)-1-i], end="")
print()

Indeksowanie znaków od końca tekstu:

Python
# Szyfry przestawieniowe
#-----------------------

a = input("Tekst: ").upper()
print("Szyfr: ", end="")
for i in range(len(a)-1,-1,-1):
    print(a[i], end="")
print()

Indeksowanie znaków od początku tekstu:

Python
# Szyfry przestawieniowe
#-----------------------

a = input("Tekst: ").upper()
print("Szyfr: ", end="")
b = "" # tutaj zbierzemy znaki
for i in range(len(a)):
    b = a[i] + b
print(b)

Zwróć uwagę, iż taki szyfr jest symetryczny. Jeśli na wejściu wpiszemy szyfr, to na wyjściu otrzymamy tekst jawny (tzw. clair).

Innym szyfrem może być zmienianie kolejności znaków w parach:

Python
# Szyfry przestawieniowe
#-----------------------

a = input("Tekst: ").upper()
# Jeśli liczba znaków nieparzysta,
# to dołączamy spację
if len(a) % 2:
    a += " "
print("Szyfr: ", end="")
b = "" # tutaj zbierzemy znaki
# Dołączamy do końca b parę
# znaków z a o zmienionej
# kolejności
for i in range(0,len(a),2):
    b += a[i+1] + a[i]
print(b)
tekst jawny: "MATYLDA WRACA JUTRO"
szyfr:       "AMYTDL ARWCA AUJRT O"

Zadanie domowe

Zmodyfikuj program z lekcji tak, aby dodatkowo zamieniał szyfr wynikowy na tekst wspak. Program proszę podpisać w komentarzu imieniem, nazwiskiem, klasą, skopiować do schowka, wkleić do listu e-mail i wysłać na adres podany przez nauczyciela.

Przykład:

tekst jawny: "MATYLDA WRACA JUTRO"
szyfr:       "AMYTDL ARWCA AUJRT O"
szyfr wspak: "O TRJUA ACWRA LDTYMA"

Do zapamiętania:


Na początek:  podrozdziału   strony 

Szyfr Cezara - ćwiczenia w programowaniu

Szyfrowanie polega na takiej zmianie tekstu, aby stał się on nieczytelny dla osoby niewtajemniczonej. Szyfr Cezara jest takim prostym szyfrem. Obecnie posiada on jedynie wartość dydaktyczną. Zasada szyfrowania jest bardzo prosta. Załóżmy, iż tekst składa się tylko z  dużych liter od A do Z. Każdą literę tekstu zastępujemy literą, która leży o trzy pozycje dalej w alfabecie. Np. literę A zastępujemy literą D (A B C D E...), literę B zastępujemy literą E (...B C D E F...), itd. Zróbmy tabelę szyfrowania:

Tekst:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
Szyfr
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
?
?
?

Jak widzisz, szyfrowanie liter A...W nie sprawia problemu. Co  jednak z literami X, YZ. Otóż umówmy się, iż alfabet szyfru zawija się i po literze Z znów mamy: A, B, C:

Tekst:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
Szyfr
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C

Zatem X szyfrujemy jako A, Y jako BZ jako C.

Zaszyfrujmy szyfrem Cezara tekst KROKODYL AREK:

Tekst:
K
R
O
K
O
D
Y
L
 
A
R
E
K
Szyfr
N
U
R
N
R
G
B
O
 
D
U
H
N
KROKODYL AREKNURNRGBO DUHN

Tekst stał się nieczytelny. Przy rozszyfrowywaniu postępujemy odwrotnie: literę szyfru zastępujemy literą leżącą w alfabecie o trzy pozycje wcześniej. Tutaj podobnie musimy zawinąć alfabet, aby przed literą A znalazły się litery X, YZ:

Szyfr
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
Tekst:
X
Y
Z
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W

Otrzymaliśmy szyfr: DWDNXMHPB:

Szyfr
D
W
D
N
X
M
H
P
B
Tekst:
A
T
A
K
U
J
E
M
Y
DWDNXMHPBATAKUJEMY

Przejdźmy do szczegółów technicznych. Szyfrowanie będzie polegało na zamianie kodu ASCII znaku tekstu na kod ASCII znaku szyfru. Zadanie to można realizować na wiele sposobów. My zrobimy tak:

Załóżmy, iż zmienna t przechowuje znak tekstu A...Z. Obliczamy jego kod i zapamiętujemy go w zmiennej c:

c = ord(t) # kod znaku

Teraz do tego kodu dodajemy liczbę 3, co w efekcie da nam znak przesunięty o 3 pozycje w górę alfabetu:

c = ord(t) # kod znaku
c += 3     # przesunięcie o 3 pozycje

Sprawdzamy, czy kod nie wyszedł poza literę Z. Jeśli tak, to musimy się cofnąć o 26 pozycji (tyle jest liter w alfabecie), aby otrzymać poprawny kod Cezara:

c = ord(t) # kod znaku
c += 3     # przesunięcie o 3 pozycje
if c > ord('Z'):
    c -= 26

Na koniec zmieniamy kod znaku w znak:

c = ord(t) # kod znaku
c += 3     # przesunięcie o 3 pozycje
if c > ord('Z'):
    c -= 26
c = chr(c)

Rozszyfrowywanie będzie procesem odwrotnym do szyfrowania:

Załóżmy, iż zmienna c przechowuje znak szyfru A...Z. Obliczamy jego kod i zapamiętujemy go w zmiennej t:

t = ord(c) # kod znaku

Teraz od tego kodu odejmujemy liczbę 3, co w efekcie da nam znak przesunięty o 3 pozycje w dół alfabetu:

t = ord(c) # kod znaku
t -= 3     # cofnięcie o 3 pozycje

Sprawdzamy, czy kod nie wyszedł przed literę A. Jeśli tak, to musimy się posunąć się do przodu o 26 pozycji (tyle jest liter w alfabecie), aby otrzymać poprawny kod znaku tekstu:

t = ord(c) # kod znaku
t -= 3     # cofnięcie o 3 pozycje
if t < ord('A'):
    t += 26

Na koniec zmieniamy kod znaku w znak:

t = ord(c) # kod znaku
t -= 3     # cofnięcie o 3 pozycje
if t < ord('A'):
    t += 26
t = chr(t)

Pełny program utworzymy na lekcji.


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.