Wstęp do Informatyki dr hab. Bożena Woźna-Szcześniak, prof. AJD bwozna@gmail.com Jan Długosz University, Poland Wykład 8 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 1 / 32
Instrukcje iteracyjne (z powtórzeniami) Spotykamy się często z takim sytuacjami, w których musimy wykonywać pewna czynność aż do momentu, gdy odniesiemy sukces, np. zrób dziesięć pompek; będziesz tak długo czytać wiersz, aż nauczysz się go na pamięć; dopóki będziesz siedzieć cicho, nie zapytam cię. Z tego wynika, że możemy spotkać się z dwoma sytuacjami: gdy musimy wykonać czynność badź zadana ilość razy, badź do momentu spełnienia warunku. Zatem powtarzanie różnych działań ma dwojaka postać: liczba powtórzeń jest z góry określona (przed rozpoczęciem cyklu). liczba powtórzeń jest nieznana (zależy od spełnienia pewnego warunku). Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 2 / 32
Schemat blokowy - druk liczb z zakresu 1... 9. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 3 / 32
Pseudokod - druk liczb z zakresu 1... 9 write("liczby z zakresu 1..9"); i:= 1; while (i <= 9) do write(i); i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 4 / 32
Python - druk liczb z zakresu 1... 9 #!/usr/bin/env python3 print("liczby z zakresu 1..9") i = 1 while i<=9: print(i) i=i+1 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 5 / 32
Python - druk liczb z zakresu 1... 9 #!/usr/bin/env python3 def zakres (): print("liczby z zakresu 1..9") i = 1 while i<=9: print(i) i=i+1 def main(): zakres() main() Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 6 / 32
Schemat blokowy - druk liczb z zakresu 1... n. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 7 / 32
Pseudokod - druk liczb z zakresu 1... n. write("liczby z zakresu 1..n"); write("podaj liczbe n = "); read (n); i:= 1; while (i <= n) do write(i); i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 8 / 32
Python - druk liczb z zakresu 1... n #!/usr/bin/env python3 n = int(input("podaj liczbę całkowitą: ")) print("liczby z zakresu 1..",n) i = 1 while i<=n: print(i) i=i+1 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 9 / 32
Python - druk liczb z zakresu 1... n #!/usr/bin/env python3 def zakres (n): i = 1 while i<=n: print(i) i=i+1 def main(): n = int(input("podaj liczbę całkowitą: ")) print("liczby z zakresu 1..",n) zakres(n) main() Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 10 / 32
Lista kroków - algorytm Euklidesa Algorytm Euklidesa: Algorytm ten jest najstarszym algorytmem (ma ponad 2000 lat) i przeznaczony jest do znajdowania największego wspólnego dzielnika (NWD) dla dwóch liczb naturalnych, tj. NWD(5,25) = 5, NWD(15,25) = 5, NWD(22,24) = 2. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 11 / 32
Lista kroków - algorytm Euklidesa Algorytm Euklidesa: Algorytm ten jest najstarszym algorytmem (ma ponad 2000 lat) i przeznaczony jest do znajdowania największego wspólnego dzielnika (NWD) dla dwóch liczb naturalnych, tj. NWD(5,25) = 5, NWD(15,25) = 5, NWD(22,24) = 2. Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 11 / 32
Lista kroków - algorytm Euklidesa Algorytm Euklidesa: Algorytm ten jest najstarszym algorytmem (ma ponad 2000 lat) i przeznaczony jest do znajdowania największego wspólnego dzielnika (NWD) dla dwóch liczb naturalnych, tj. NWD(5,25) = 5, NWD(15,25) = 5, NWD(22,24) = 2. Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) Krok 0: Rozpocznij algorytm. Krok 1: Wprowadź wartości dla liczb a i b. Krok 2: Oblicz c jako resztę z dzielenia a przez b. Krok 3: Zastap a przez b, zaś b przez c. Krok 4: Jeżeli b = 0, to szukane NWD(a, b) wynosi a, w przeciwnym wypadku przejdź do 2. Krok 5: Wyprowadź wynik: NWD(a, b). Krok 4: Zakończ algorytm. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 11 / 32
Lista kroków - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) Krok 0: Rozpocznij algorytm. Krok 1: Wprowadź wartości dla liczb a i b. Krok 2: Oblicz c jako resztę z dzielenia a przez b. Krok 3: Zastap a przez b, zaś b przez c. Krok 4: Jeżeli b = 0, to szukane NWD(a, b) wynosi a, w przeciwnym wypadku przejdź do 2. Krok 5: Wyprowadź wynik: NWD(a, b). Krok 4: Zakończ algorytm. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 12 / 32
Lista kroków - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) Krok 0: Rozpocznij algorytm. Krok 1: Wprowadź wartości dla liczb a i b. Krok 2: Oblicz c jako resztę z dzielenia a przez b. Krok 3: Zastap a przez b, zaś b przez c. Krok 4: Jeżeli b = 0, to szukane NWD(a, b) wynosi a, w przeciwnym wypadku przejdź do 2. Krok 5: Wyprowadź wynik: NWD(a, b). Krok 4: Zakończ algorytm. Przykład obliczenia NWD(1000, 32): 1 a = 1000, b = 32, c = 1000 mod 32 = 8 2 a = 32, b = 8, c= 32 mod 8 = 0 3 a = 8, b = 0 = NWD(1000, 32) = 8 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 12 / 32
Schemat blokowy - algorytm Euklidesa Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 13 / 32
Pseudokod - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) write("podaj dwie liczby naturalne"); read(a,b); while (b!= 0) do {reszta z dzielenia a przez b } c := a mod b; a := b; b := c end NWD := a write(nwd); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 14 / 32
Python - algorytm Euklidesa #!/usr/bin/env python3 a = int(input("podaj liczbę całkowitą: ")) b = int(input("podaj liczbę całkowitą: ")) print("nwd(",a,",",b,") = ") while b!=0: c = a % b a = b b = c print(a) Przykładowe wykonanie: Podaj liczbę całkowitą: 1000 Podaj liczbę całkowitą: 32 NWD( 1000, 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 15 / 32
Pseudokod - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) write("podaj dwie liczby naturalne"); read(a,b); while (a!= b) do if (a < b) b:=b-a; else a:=a-b; end NWD := a write(nwd); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 16 / 32
Python - algorytm Euklidesa #!/usr/bin/env python3 a = int(input("podaj liczbę całkowitą: ")) b = int(input("podaj liczbę całkowitą: ")) print("nwd(",a,",",b,") = ") while a!=b: if (a < b): b = b - a else: a = a - b print(a) Przykładowe wykonanie: Podaj liczbę całkowitą: 1000 Podaj liczbę całkowitą: 32 NWD( 1000, 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 17 / 32
Python - algorytm Euklidesa #!/usr/bin/env python3 def main(): a = int(input("podaj liczbę całkowitą: ")) b = int(input("podaj liczbę całkowitą: ")) print("nwd(",a,",",b,") = ") while a!=b: if (a < b): b = b - a else: a = a - b print(a) main() Przykładowe wykonanie: Podaj liczbę całkowitą: 1000 Podaj liczbę całkowitą: 32 NWD( 1000, 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 18 / 32
Python - algorytm Euklidesa #!/usr/bin/env python3 def nwd (a,b): while a!=b: if (a < b): b = b - a else: a = a - b return a def main(): a = int(input("podaj liczbę całkowitą: ")) b = int(input("podaj liczbę całkowitą: ")) c = nwd(a,b) print("nwd(",a,",",b,") = ",c) main() Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 19 / 32
Liczby trójkatne Nazwa liczby trójkatne pochodzi stad, że każda taka liczba o numerze n jest liczba np. kół jednakowej wielkości, z których można ułożyć trójkat równoboczny o boku zbudowanym z n kół. Liczby trójkatne to liczby postaci: t n = n (n + 1) 2 gdzie n jest liczba naturalna. = 1 + 2 + 3 +... + n Przykłady liczb trójkatnych: t 1 = 1, t 2 = 3, t 3 = 6, t 4 = 10. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 20 / 32
Schemat blokowy - obliczanie sumy suma = n i=1 i. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 21 / 32
Pseudokod - obliczanie sumy suma = n i=1 i. write("podaj liczbe n = "); read (n); i:= 1; suma := 0; while (i <= n) do suma := suma + i; i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 22 / 32
Python - obliczanie sumy suma = n i=1 i. #!/usr/bin/env python3 def suma (n): i = 1 suma = 0 while i<=n: suma = suma + i i = i + 1 return suma def main(): n = int(input("podaj liczbę całkowitą: ")) c = suma(n) print("suma od 1 do ",n," = ",c) main() Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 23 / 32
Python - obliczanie sumy suma = n i=1 i. #!/usr/bin/env python3 def suma (n): i = 1 suma = 0 while i<=n: suma += i i = i+1 return suma def main(): n = int(input("podaj liczbę całkowitą: ")) print("suma od 1 do ",n," = ",suma(n)) main() Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 24 / 32
Schemat blokowy - funkcja silnia n! = 1 2... n Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 25 / 32
Pseudokod - funkcja silnia n! = 1 2... n. write("podaj liczbe n = "); read (n); i:= 1; silnia := 1; while (i <= n) do silnia := silnia * i; i := i+1; end; write(silnia); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 26 / 32
Suma n liczb wprowadzonych z klawiatury Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 27 / 32
Suma n liczb wprowadzonych z klawiatury write("podaj liczbe n = "); read (n); i:= 1; suma := 0; while (i <= n) do write("podaj liczbe: "); read (a); suma := suma + a; i := i+1; end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 28 / 32
Suma ciagu liczb wprowadzonego z klawiatury i zakończonego zerem Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 29 / 32
Suma ciagu liczb wprowadzonego z klawiatury i zakończonego zerem write("podaj liczbe: "); read (a); suma := 0; while (a!= 0) do suma := suma + a; write("podaj liczbe: "); read (a); end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 30 / 32
Suma ciagu liczb parzystych wprowadzonego z klawiatury i zakończonego zerem write("podaj liczbe: "); read (a); suma := 0; while (a!= 0) do if (a mod 2 = 0) then suma := suma + a; write("podaj liczbe: "); read (a); end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 31 / 32
Suma ciagu liczb podzielnych przez 5, wprowadzonego z klawiatury i zakończonego zerem write("podaj liczbe: "); read (a); suma := 0; while (a!= 0) do if (a mod 5 = 0) then suma := suma + a; write("podaj liczbe: "); read (a); end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 32 / 32
Iloczyn ciagu liczb nieujemnych, wprowadzonego z klawiatury i zakończonego zerem write("podaj liczbe: "); read (a); iloczyn := 1; while (a!= 0) do if (a > 0) then iloczyn := iloczyn * a; write("podaj liczbe: "); read (a); end; write(iloczyn); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 33 / 32
Iloczyn ciagu liczb nieujemnych, parzystych, wprowadzonego z klawiatury i zakończonego zerem write("podaj liczbe: "); read (a); iloczyn := 1; while (a!= 0) do if ((a > 0) and (a mod 2 = 0)) then iloczyn := iloczyn * a; write("podaj liczbe: "); read (a); end; write(iloczyn); end. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 34 / 32
Wybór algorytmu Reguła jest, że należy implementować najprostsze algorytmy, które wykonuja określone zadanie. Prosty algorytm to: łatwiejsza implementacja, czytelniejszy kod, łatwość testowania łatwość pisania dokumentacji,... Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 35 / 32
Zadania Skonstruuj schemat blokowy do następujacego zadania: 1 Wprowadź dwie liczby a i b. Skonstruuj algorytm porównania tych liczb i wyprowadzania na wyjściu większej z nich. W przypadku liczb równych wyprowadź napis liczby równe. 2 Sprawdzić czy dana liczba dzieli się przez 3. 3 Sprawdzić czy suma dwóch liczb podanych przez użytkownika jest parzysta. 4 Zamienić dana liczne w systemie o podstawie n, na liczbę w systemie o podstawie m; 5 Dane sa liczby dwa pojemniki A i B. W pojemniku A znajduje się ser, a w pojemniku B mak. Zaprojektuj algorytm, który przeniesie ser do pojemnika B, a mak do pojemnika A. Pamiętaj jednak o tym, ze nigdy nie może być tak, że ser i mak znajda się w tym samym pojemniku. Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 8 36 / 32