Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
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:
Pythonprint("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:
Pythonfor 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.
Pythonfor 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
Pythonfor kod in range(64, 96): print(kod, chr(kod)) |
Pythonfor 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
Pythonfor kod in range(128, 512): print(kod, chr(kod)) |
Wyszukaj litery 'Ą' i 'ą' 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.
Pythonfor kod in range(32, 1024): print(chr(kod), end="") print() input() |
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
Pythonprint("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.
Pythonprint("Oto John \"Wielka 'Klucha'\" w ogrodzie") |
Tekst można umieszczać w zmiennej:
Pythonn = "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:
Pythonn = "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:
Pythont = input("Wpisz krótki tekst: ") for i in range(len(t)): print(i, t[i]) print() |
Indeksy umożliwiają odczytywanie znaków tekstu.
Pythont = input() for i in range(len(t)): a = t[i] if a == "a": a = "b" elif a == "b": a = "a" print(a, end='') print() |
"ABC" 'ABC'
a = "ABC" b = input("Wpisz tekst i naciśnij Enter")
Teksty można łączyć ze sobą przy pomocy operatora
Pythont1 = input("Wpisz tekst: ") t2 = " Matylda" t3 = t1 + t2 # konkatencja print(t3) |
Teksty można powielać przy pomocy operatora
Pythona = input("Wpisz tekst: ") a += " " # Dołączamy spację b = "Start: " + a * 5 + "Stop." print(b) |
Pythona = 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:
Pythona = 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:
Pythona = 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:
Pythona = input("Wpisz tekst: ") # Zmieniamy znaki tekstu w a # na duże litery a = a.upper() print(a) |
print("Ala" + ' i ' + "kot.") a = "Lisek" a += " Chytrusek"
print("Oddawaj! " * 5)
obiekt.funkcja(parametry)
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"
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"
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, Y i Z. 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 B i Z 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 AREK → NURNRGBO 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, Y i Z:
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 |
DWDNXMHPB → ATAKUJEMY
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.
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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.