Wstep do Informatyki
Transkrypt
Wstep do Informatyki
Wstep ˛ do Informatyki dr hab. Bożena Woźna-Szcześniak, prof. AJD [email protected] Jan Długosz University, Poland Wykład 8 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 1 / 32 Instrukcje iteracyjne (z powtórzeniami) Spotykamy sie˛ cz˛esto z takim sytuacjami, w których musimy wykonywać pewna˛ czynność aż do momentu, gdy odniesiemy sukces, np. zrób dziesieć ˛ pompek; bedziesz ˛ tak długo czytać wiersz, aż nauczysz sie˛ go na pamieć; ˛ dopóki bedziesz ˛ siedzieć cicho, nie zapytam cie. ˛ Z tego wynika, że możemy spotkać sie˛ 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˛eciem cyklu). liczba powtórzeń jest nieznana (zależy od spełnienia pewnego warunku). Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 2 / 32 Schemat blokowy - druk liczb z zakresu 1 . . . 9. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 3 / 32 Pseudokod - druk liczb z zakresu 1 . . . 9 begin write("Liczby z zakresu 1..9"); i:= 1; while (i <= 9) do begin write(i); i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ 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) Wstep ˛ 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) Wstep ˛ do Informatyki Wykład 8 6 / 32 Schemat blokowy - druk liczb z zakresu 1 . . . n. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 7 / 32 Pseudokod - druk liczb z zakresu 1 . . . n. begin write("Liczby z zakresu 1..n"); write("Podaj liczbe n = "); read (n); i:= 1; while (i <= n) do begin write(i); i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 8 / 32 Python - druk liczb z zakresu 1 . . . n #!/usr/bin/env python3 n = int(input("Podaj liczb˛ e całkowita: ˛ ")) print("Liczby z zakresu 1..",n) i = 1 while i<=n: print(i) i=i+1 Bożena Woźna-Szcześniak (AJD) Wstep ˛ 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˛ e całkowita: ˛ ")) print("Liczby z zakresu 1..",n) zakres(n) main() Bożena Woźna-Szcześniak (AJD) Wstep ˛ 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 najwiekszego ˛ 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) Wstep ˛ 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 najwiekszego ˛ 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) Wstep ˛ 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 najwiekszego ˛ 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 reszte˛ 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) Wstep ˛ 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 reszte˛ 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) Wstep ˛ 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 reszte˛ 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) Wstep ˛ do Informatyki Wykład 8 12 / 32 Schemat blokowy - algorytm Euklidesa Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 13 / 32 Pseudokod - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) begin write("Podaj dwie liczby naturalne"); read(a,b); while (b != 0) do begin {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) Wstep ˛ do Informatyki Wykład 8 14 / 32 Python - algorytm Euklidesa #!/usr/bin/env python3 a = int(input("Podaj liczb˛ e całkowita: ˛ ")) b = int(input("Podaj liczb˛ e całkowita: ˛ ")) print("NWD(",a,",",b,") = ") while b!=0: c = a % b a = b b = c print(a) Przykładowe wykonanie: Podaj liczb˛ e całkowita: ˛ 1000 Podaj liczb˛ e całkowita: ˛ 32 NWD( 1000 , 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 15 / 32 Pseudokod - algorytm Euklidesa Dane: dowolne dwie liczby naturalne a i b. Wynik: NWD(a, b) begin write("Podaj dwie liczby naturalne"); read(a,b); while (a != b) do begin if (a < b) b:=b-a; else a:=a-b; end NWD := a write(NWD); end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 16 / 32 Python - algorytm Euklidesa #!/usr/bin/env python3 a = int(input("Podaj liczb˛ e całkowita: ˛ ")) b = int(input("Podaj liczb˛ e całkowita: ˛ ")) print("NWD(",a,",",b,") = ") while a!=b: if (a < b): b = b - a else: a = a - b print(a) Przykładowe wykonanie: Podaj liczb˛ e całkowita: ˛ 1000 Podaj liczb˛ e całkowita: ˛ 32 NWD( 1000 , 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 17 / 32 Python - algorytm Euklidesa #!/usr/bin/env python3 def main(): a = int(input("Podaj liczb˛ e całkowita: ˛ ")) b = int(input("Podaj liczb˛ e całkowita: ˛ ")) 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˛ e całkowita: ˛ 1000 Podaj liczb˛ e całkowita: ˛ 32 NWD( 1000 , 32 ) = 8 Bożena Woźna-Szcześniak (AJD) Wstep ˛ 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˛ e całkowita: ˛ ")) b = int(input("Podaj liczb˛ e całkowita: ˛ ")) c = nwd(a,b) print("NWD(",a,",",b,") = ",c) main() Bożena Woźna-Szcześniak (AJD) Wstep ˛ 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: tn = n ∗ (n + 1) = 1 + 2 + 3 + ... + n 2 gdzie n jest liczba˛ naturalna. ˛ Przykłady liczb trójkatnych: ˛ t1 = 1, t2 = 3, t3 = 6, t4 = 10. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 20 / 32 Schemat blokowy - obliczanie sumy suma = Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Pn i=1 i. Wykład 8 21 / 32 Pseudokod - obliczanie sumy suma = Pn i=1 i. begin write("Podaj liczbe n = "); read (n); i:= 1; suma := 0; while (i <= n) do begin suma := suma + i; i := i+1; end; end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 22 / 32 Python - obliczanie sumy suma = Pn 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˛ e całkowita: ˛ ")) c = suma(n) print("Suma od 1 do ",n," = ",c) main() Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 23 / 32 Python - obliczanie sumy suma = Pn 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˛ e całkowita: ˛ ")) print("Suma od 1 do ",n," = ",suma(n)) main() Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 24 / 32 Schemat blokowy - funkcja silnia n! = 1 · 2 · . . . · n Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 25 / 32 Pseudokod - funkcja silnia n! = 1 · 2 · . . . · n. begin write("Podaj liczbe n = "); read (n); i:= 1; silnia := 1; while (i <= n) do begin silnia := silnia * i; i := i+1; end; write(silnia); end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 26 / 32 Suma n liczb wprowadzonych z klawiatury Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 27 / 32 Suma n liczb wprowadzonych z klawiatury begin write("Podaj liczbe n = "); read (n); i:= 1; suma := 0; while (i <= n) do begin write("Podaj liczbe: "); read (a); suma := suma + a; i := i+1; end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 28 / 32 Suma ciagu ˛ liczb wprowadzonego z klawiatury i zakończonego zerem Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 29 / 32 Suma ciagu ˛ liczb wprowadzonego z klawiatury i zakończonego zerem begin write("Podaj liczbe: "); read (a); suma := 0; while (a != 0) do begin suma := suma + a; write("Podaj liczbe: "); read (a); end; write(suma); end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 30 / 32 Suma ciagu ˛ liczb parzystych wprowadzonego z klawiatury i zakończonego zerem begin write("Podaj liczbe: "); read (a); suma := 0; while (a != 0) do begin 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) Wstep ˛ do Informatyki Wykład 8 31 / 32 Suma ciagu ˛ liczb podzielnych przez 5, wprowadzonego z klawiatury i zakończonego zerem begin write("Podaj liczbe: "); read (a); suma := 0; while (a != 0) do begin 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) Wstep ˛ do Informatyki Wykład 8 32 / 32 Iloczyn ciagu ˛ liczb nieujemnych, wprowadzonego z klawiatury i zakończonego zerem begin write("Podaj liczbe: "); read (a); iloczyn := 1; while (a != 0) do begin if (a > 0) then iloczyn := iloczyn * a; write("Podaj liczbe: "); read (a); end; write(iloczyn); end. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 33 / 32 Iloczyn ciagu ˛ liczb nieujemnych, parzystych, wprowadzonego z klawiatury i zakończonego zerem begin write("Podaj liczbe: "); read (a); iloczyn := 1; while (a != 0) do begin 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) Wstep ˛ 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) Wstep ˛ do Informatyki Wykład 8 35 / 32 Zadania Skonstruuj schemat blokowy do nastepuj ˛ acego ˛ zadania: 1 Wprowadź dwie liczby a i b. Skonstruuj algorytm porównania tych liczb i wyprowadzania na wyjściu wiekszej ˛ z nich. W przypadku liczb równych wyprowadź napis “liczby równe”. 2 Sprawdzić czy dana liczba dzieli sie˛ 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 liczbe˛ w systemie o podstawie m; 5 Dane sa˛ liczby dwa pojemniki A i B. W pojemniku A znajduje sie˛ ser, a w pojemniku B mak. Zaprojektuj algorytm, który przeniesie ser do pojemnika B, a mak do pojemnika A. Pamietaj ˛ jednak o tym, ze nigdy nie może być tak, że ser i mak znajda˛ sie˛ w tym samym pojemniku. Bożena Woźna-Szcześniak (AJD) Wstep ˛ do Informatyki Wykład 8 36 / 32