1/44 Programowanie, algorytmy i struktury danych materiały do wykładu: http://cez.wipb.pl/moodle/ email: m.tabedzki@pb.edu.pl strona: http://aragorn.pb.bialystok.pl/~tabedzki/ Marek Tabędzki
Wymagania wstępne: Wskazana byłaby znajomość podstaw programowania w dowolnym języku strukturalnym (np. C, Pascal). Tematy zajęć: 1. Program, zmienna, instrukcje sterujące. 2. Funkcje i tablice. 3. Obiekty i klasy. 4. Kompozycja. 5. Polimorfizm. Wyjątki. 6. Szacowanie kosztów wybranych algorytmów, programowanie dynamiczne, dziel i zwyciężaj, algorytmy zachłanne. 7. Wybrane algorytmy grafowe. 8. Algorytmy drzewiaste. Literatura i oprogramowanie: 1. Bruce Eckel, Thinking in Java Książkę tę można znaleźć również w wersji elektronicznej na stronie Bruce'a Eckela: www.bruceeckel.com. 2. Dokumentacja oraz specyfikacja języka Java dostępna na stronie java.sun.com 3....czy wiele innych książek dotyczących programowania obiektowego oraz języka Java 4. Narzędzia do kompilowania i uruchamiania programów: Java SE + wybrane środowisko programisty (np. NetBeans, Eclipse, etc.) Zaliczenie: Ma formę egzaminu pisemnego składającego się zarówno z zadań praktycznych jak i teoretycznych. Na egzaminie nie można korzystać z notatek. 2/44
3/44 Programowanie: Proces projektowania i tworzenia kodu źródłowego programów komputerowych. PROBLEM ALGORYTM PROGRAM algorytmizacja kodowanie P R O G R A M O WA N I E Algorytm: Skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Przepis podający w skończonej liczbie kroków rozwiązanie określonego problemu. Algorytm można zapisać w dowolnym języku (np. język polski). Inne sposoby zapisu algorytmu: schematy blokowe, pseudokod.
4/44 przykładowy program w Javie: // Program01.java public class Program01 System.out.println("Hello!"); efekt: Hello! program: ciąg znaków (rozmiar znaków ma znaczenie) składniki: słowa kluczowe identyfikatory stałe i napisy operatory separatory
5/44 // Program02.java public class Program02 /* to jest komentarz */ System.out.println("Hello!"); System.out.print(3-4 / 2 + 1 * 5); System.out.print("Znaki \"specjalne\"\n\n"); System.out.println("Ala " + "ma " + 2 + " koty"); efekt: Hello! 6Znaki "specjalne" Ala ma 2 koty
co to jest zmienna? // Program03.java public class Program03 int a; int b, c; a = 2; b = 3; c = a + b; a b c System.out.println("wynik wynosi " + c); System.out.println(a + " + " + b + " = " + c); System.out.println(a); // wartość zmiennej a System.out.println("a"); // napis "a" int e; System.out.println(e); // błąd e = 100; System.out.println(e); // ok 6/44
co to jest zmienna? // Program03.java public class Program03 int a; int b, c; a = 2; b = 3; c = a + b; a 2 b System.out.println("wynik wynosi " + c); System.out.println(a + " + " + b + " = " + c); System.out.println(a); // wartość zmiennej a System.out.println("a"); // napis "a" c int e; System.out.println(e); // błąd e = 100; System.out.println(e); // ok 7/44
co to jest zmienna? // Program03.java public class Program03 int a; int b, c; a = 2; b = 3; c = a + b; a 2 b 3 System.out.println("wynik wynosi " + c); System.out.println(a + " + " + b + " = " + c); System.out.println(a); // wartość zmiennej a System.out.println("a"); // napis "a" c int e; System.out.println(e); // błąd e = 100; System.out.println(e); // ok 8/44
co to jest zmienna? // Program03.java public class Program03 int a; int b, c; a = 2; b = 3; c = a + b; a 2 b 3 System.out.println("wynik wynosi " + c); System.out.println(a + " + " + b + " = " + c); System.out.println(a); // wartość zmiennej a System.out.println("a"); // napis "a" c 5 int e; System.out.println(e); // błąd e = 100; System.out.println(e); // ok 9/44
10/44 // Program04.java public class Program04 // typ zmiennej int a; // byte, short, int, long a = 2; double x; // float, double x = 2.5; boolean b; b = true; // lub false char z; z = '!'; // nie mylić z "!"
11/44 // Program04.java public class Program04 // podstawienie int a = 2, b, c; a 2 b a = b; b = a; // błąd // ok 10 = a; // błąd a = 10; // ok a + b = c // błąd c = a + b; // ok a 2 a 10 a 10 b 2 b 2 b 2 c c c c 12
12/44 // Program04.java public class Program04 // zamiana dwóch zmiennych int a, b; a = 2; b = 3; System.out.println(a + ", " + b); // złe rozwiązanie a = b; b = a; System.out.println(a + ", " + b); a 2 a 3 b 3 b 3 a 3 b 3
13/44 // Program04.java public class Program04 // zamiana dwóch zmiennych int a, b; a a = 2; 2 b = 3; System.out.println(a + ", " + b); b 3 c // dobre rozwiązanie: a int c = a; a = b; 2 b = c; System.out.println(a + ", " + b); a 3 b 3 b 3 c 2 c 2 a b c 3 2 2
14/44 // Program05.java public class Program05 // operatory int a = 5, b = 2, c; c = 5/2; // wynik: 2 c = 5%2; // reszta z dzielenia c += b; // c = c + b; c++; // c = c + 1; a = c++; // a = c; c = c + 1; a = ++c; // c = c + 1; a = c;
15/44 // Program05.java public class Program05 // konwersja typów int x; double y; x = 5/2; // wynik: 2 y = 5/2; // wynik: 2 y = 5.0/2; // wynik: 2.5 y = x; // ok x = y; // błąd! x = (int)y; // ok
16/44 funkcje wejścia/ wyjścia: import java.util.*; public class Program06 static final Scanner input = new Scanner(System.in); System.out.println("Hello"); int x = input.nextint(); System.out.println("Wprowadzono = " + x);
17/44 przeliczanie walut: import java.util.*; public class Program07 static final Scanner input = new Scanner(System.in); System.out.print("Podaj kwotę w euro: "); double euro = input.nextdouble(); double przelicznik = 3.95; double zł = euro/przelicznik; System.out.println("Kwota w zł: " + zł);
18/44 średnia dwóch liczb: import java.util.*; public class Program08 static final Scanner input = new Scanner(System.in); System.out.print("Podaj pierwszą liczbę: "); int a = input.nextint(); System.out.print("Podaj drugą liczbę: "); int b = input.nextint(); double średnia = (a + b)/2.0; System.out.println("Średnia: " + średnia);
liczby losowe: import java.util.*; public class Program09 static final Random random = new Random(); // losowanie liczb int a = random.nextint(); System.out.println("Wylosowano: " + a); a = random.nextint(6); System.out.println("Liczba od 0 do 5: " + a); a = 1 + random.nextint(6); System.out.println("Liczba od 1 do 6: " + a); a = 7 + random.nextint(5); System.out.println("Liczba od 7 do 11: " + a); a = 1 + random.nextint(6); int b = 1 + random.nextint(6); int suma = a + b; System.out.print("Rzut dwiema kostkami: " + suma); 19/44
20/44 pierwiastki równania kwadratowego: import java.util.*; public class Program10 static final Scanner input = new Scanner(System.in); System.out.print("Podaj a: "); double a = input.nextdouble(); System.out.print("Podaj b: "); double b = input.nextdouble(); System.out.print("Podaj c: "); double c = input.nextdouble(); double delta = b*b-4*a*c; double x1 = (-b-math.sqrt(delta))/(2*a); double x2 = (-b+math.sqrt(delta))/(2*a); System.out.println("x1 = " + x1 + "\nx2 = " + x2);
21/44 instrukcja warunkowa: import java.util.*; public class Program11 static final Scanner input = new Scanner(System.in); System.out.print("Ile masz lat? "); int wiek = input.nextint(); if (wiek > 60) System.out.println("Jesteś stary!");
import java.util.*; public class Program11 static final Scanner input = new Scanner(System.in); System.out.print("Ile masz lat? "); int wiek = input.nextint(); if (wiek > 60) System.out.print("Jesteś "); System.out.println("stary!"); uwaga:... int a = 5; if (a>3) int c = a 2; System.out.println(c); // dobrze System.out.println(c); // źle... 22/44
import java.util.*; public class Program11 static final Scanner input = new Scanner(System.in); System.out.print("Ile masz lat? "); int wiek = input.nextint(); if (wiek > 60) System.out.print("Jesteś "); System.out.println("stary!"); else System.out.println("Nie jesteś taki stary"); 23/44
import java.util.*; public class Program11 static final Scanner input = new Scanner(System.in); System.out.print("Ile masz lat? "); int wiek = input.nextint(); if (wiek > 60) System.out.print("Jesteś "); System.out.println("stary!"); else if (wiek < 18) System.out.println("Jesteś młody"); else System.out.println("Nie jesteś taki stary"); 24/44
25/44 operatory relacji: if (a<b) if (a<=b) if (a==b) if (a!=b) if (!(a==b)) if (a<b<c) // źle if (a<b && b<c) // dobrze if (a>b a>c)
26/44 szukanie największej liczby spośród trzech wczytanych: import java.util.*; public class Program12 static final Scanner input = new Scanner(System.in); System.out.print("Podaj trzy liczby: "); int a = input.nextint(), b = input.nextint(), c = input.nextint(); if (a >= b && a >= c) System.out.print(a + " jest największe"); else if (b >= a && b >= c) System.out.print(b + " jest największe"); else System.out.print(c + " jest największe");
import java.util.*; public class Program12 static final Scanner input = new Scanner(System.in); System.out.print("Podaj trzy liczby: "); int a = input.nextint(), b = input.nextint(), c = input.nextint(); if (a >= b) if (a >= c) System.out.print(a + " jest największe"); else System.out.print(c + " jest największe"); else if (b >= c) System.out.print(b + " jest największe"); else System.out.print(c + " jest największe"); 27/44
instrukcja wyboru: import java.util.*; public class Program13 static final Random random = new Random(); int pnk = random.nextint(3); switch(pnk) case 0: System.out.println("papier!"); break; case 1: System.out.println("nożyce!"); break; case 2: System.out.println("kamień!"); break; default: System.out.println("błąd!"); 28/44
29/44 przykład: logowanie import java.util.*; public class Program14 static final Scanner input = new Scanner(System.in); System.out.print("Podaj hasło: "); String hasło = input.next(); if (hasło.equals("ala")) System.out.print("Logowanie udane"); else System.out.print("Hasło nieprawidłowe");
import java.util.*; public class Program14 static final Scanner input = new Scanner(System.in); System.out.print("Podaj hasło: "); String hasło = input.next(); if (hasło.equals("ala")) System.out.print("Logowanie udane"); else System.out.print("Spróbuj ponownie: ");......... 30/44
31/44 pętle: import java.util.*; public class Program14 static final Scanner input = new Scanner(System.in); System.out.print("Podaj hasło: "); String hasło = input.next(); while (!hasło.equals("ala")) System.out.print("Spróbuj ponownie: "); hasło = input.next(); System.out.print("Logowanie udane");
import java.util.*; public class Program14 static final Scanner input = new Scanner(System.in); String hasło; do System.out.print("Podaj hasło: "); hasło = input.next(); while (!hasło.equals("ala")); System.out.print("Logowanie udane"); 32/44
33/44 gra w zgadywanie: import java.util.*; public class Program15 static final Random random = new Random(); static final Scanner input = new Scanner(System.in); int losowa = 1 + random.nextint(10); System.out.println("Jaką liczbę pomyślałem?"); while(true) int zgaduj = input.nextint(); if (zgaduj == losowa) break; System.out.println("Próbuj dalej"); ; System.out.print("Zgadłeś!");
34/44 zadanie: wczytuj liczby, dopóki ich suma nie przekroczy 100 import java.util.*; public class Program16 static final Scanner input = new Scanner(System.in); int suma = 0; do int liczba = input.nextint(); suma += liczba; while(suma <= 100); System.out.println("Suma wynosi " + suma);
35/44 zadanie: wczytuj liczby parzyste, dopóki ich suma nie przekroczy 100 import java.util.*; public class Program16 static final Scanner input = new Scanner(System.in); int suma = 0; do int liczba = input.nextint(); if (liczba%2 == 0) suma += liczba; while(suma <= 100); System.out.println("Suma wynosi " + suma);
36/44 zadanie: wczytuj liczby parzyste, dopóki ich suma nie przekroczy 100 i oblicz ich średnią import java.util.*; public class Program16 static final Scanner input = new Scanner(System.in); int suma = 0, ilość = 0; do int liczba = input.nextint(); if (liczba%2 == 0) suma += liczba; ilość ++; while(suma <= 100); System.out.println("Średnia wynosi " + suma/ilość);
int suma = 0, ilość = 0; do int liczba = input.nextint(); if (liczba%2 == 0) suma += liczba; ilość ++; while(suma <= 100); suma: 0, ilość: 0 liczba = input.nextint(); suma: 0, ilość: 0, liczba: 20 suma: 20, ilość: 1, liczba: 20 liczba = input.nextint(); suma: 20, ilość: 1, liczba: 35 liczba = input.nextint(); suma: 20, ilość: 1, liczba: 40 suma: 60, ilość: 2, liczba: 40 liczba = input.nextint(); suma: 60, ilość: 2, liczba: 60 suma: 120, ilość: 3, liczba: 60 suma: 120, ilość: 3 37/44
38/44 pętla for: import java.util.*; public class Program17 for (int i = 0; i < 10; ++i) System.out.print('*'); /* int i = 0; while (i < 10) System.out.print('*'); ++i; */
39/44 pętla for: import java.util.*; public class Program17 for (int i = 0; i < 10; ++i) System.out.println(i); /* int i = 0; while (i < 10) System.out.println(i); ++i; */
40/44 silnia n! = 1 * 2 * 3 * * (n-1) * n import java.util.*; public class Program18 static final Scanner input = new Scanner(System.in); System.out.println("Podaj n: "); int n = input.nextint(); int silnia = 1; for (int i = 2; i <= n; ++i) silnia *= i; System.out.println(n + "! = " + silnia);
41/44 int silnia = 1; for (int i = 2; i <= n; ++i) silnia *= i; silnia: 1, i: 2, n: 5 silnia *= i; silnia: 2, i: 2, n: 5 ++i silnia: 2, i: 3, n: 5 silnia *= i; silnia: 6, i: 3, n: 5 ++i silnia: 6, i: 4, n: 5 silnia *= i; silnia: 24, i: 4, n: 5 ++i silnia: 24, i: 5, n: 5 silnia *= i; silnia: 120, i: 5, n: 5 ++i silnia: 120, i: 6, n: 5
42/44 zadanie: wczytaj 10 liczb import java.util.*; public class Program19 static final Scanner input = new Scanner(System.in); System.out.println("Podaj 10 liczb"); for (int i = 1; i <= 10; ++i) System.out.print(i + " liczba: "); int liczba = input.nextint();
43/44 zadanie: wczytaj 10 liczb i oblicz ich sumę import java.util.*; public class Program19 static final Scanner input = new Scanner(System.in); System.out.println("Podaj 10 liczb"); int suma = 0; for (int i = 1; i <= 10; ++i) System.out.print(i + " liczba: "); int liczba = input.nextint(); suma += liczba; System.out.println("Suma wynosi " + suma);
44/44 zadanie: wczytaj 10 liczb i znajdź największą z nich import java.util.*; public class Program20 static final Scanner input = new Scanner(System.in); System.out.println("Podaj 10 liczb"); int największa = Integer.MIN_VALUE; for (int i = 1; i <= 10; ++i) System.out.print(i + " liczba: "); int liczba = input.nextint(); if (liczba > największa) największa = liczba; System.out.println("Największa: " + największa);