Wprowadzenie do języka Pascal zmienne i typy standardowe operatory arytmetyczne, funkcje standardowe odczyt danych i wyświetlanie wyników obsługa wyjątków Techniki programowania I s.2-1
Podstawowe zasady programowania w języku Pascal Wielkość liter nie jest rozróżniana. Zasada ta dotyczy zarówno nazw instrukcji, elementów predefiniowanych w języku jak i elementów definiowanych w programie (zmienne, typy, podprogramy, itp.), Każda instrukcja programu powinna być zakończona średnikiem, Średnik może być pominięty przez słowem end, Znaki "białe", czyli przejścia do nowej linii, tabulacje, wielokrotne spacje pomiędzy poszczególnymi słowami nie są istotne i będą pomijane, Kolejne instrukcje mogą być zapisane w jednym wierszu, jednak każda musi być zakończona średnikiem, Słowa kluczowe języka (nazwy instrukcji, elementy nagłówków, itp.) są zastrzeżone i nie mogą być wykorzystane jako nazwy elementów definiowanych w programie, Tekst umieszczony w klamrach ({ }) lub poprzedzony podwójnym ukośnikiem (//) jest komentarzem języka Pascal. Techniki programowania I s.2-2
Deklaracja zmiennych Zmienna element języka programowania używany do przechowywania przetwarzanych danych. Język Pascal wymaga deklaracji (określenia typu) zmiennej przed jej pierwszym użyciem. Schemat deklaracji zmiennej var nazwa_zmiennej1: typ1; nazwa_zmiennej2: typ2; nazwa_zmiennej3, nazwa_zmiennej4: typ3; nazwa_zmiennej unikalny ciąg znaków, który jest prawidłowym identyfikatorem. typ dowolny typ standardowy lub zdefiniowany przez użytkownika (w.01 s.25). Deklarację zmiennych w procedurze obsługi zdarzenia należy umieścić pomiędzy nagłówkiem i słowem begin. Identyfikator ciąg znaków składający się z liter alfabetu angielskiego, cyfr, znaku podkreślenia, nie zaczyna się od cyfry, nie jest słowem kluczowym języka. Przykłady identyfikatorów: a, abc, x75, kod_produktu, _xyz. Nieprawidłowe identyfikatory: 27x, kod produktu, imię, end, x$y Techniki programowania I s.2-3
Typy standardowe Typy całkowite Typy rzeczywiste integer (-2147483648..2147483647) real (2.9e-39..1.7e38, 11-12 cyfr) shortint (-128..127) single (1.5e-45..3.4e38, 7-8 cyfr) smallint (-32768..32767) double (5.0e-324..1.7e308, 15-16 cyfr) byte (0..255) extended (1.9e-4951..1.1e4932, 19-20 cyfr) word (0..65535) longword (0..4294967295) boolean typ logiczny (dwie wartości: true prawda i false fałsz) char typ znakowy (pojedynczy znak) string typ łańcuchowy (ciąg znaków o długości maksymalnej 255 znaków) Typ porządkowy typ danych w którym każdy element ma ustalony następnik i poprzednik. W języku Pascal: wszystkie typy całkowite, boolean, char. Przykłady 127 typ całkowitego true typ logiczny 127.5 typ rzeczywisty 'a' typ znakowy 1.723e+01 typ rzeczywisty (17.23) 'xyz' typ łańcuchowy Techniki programowania I s.2-4
Instrukcja przypisania Instrukcja przypisania, operatory arytmetyczne Tak jak w przypadku własności komponentów instrukcja przypisania może być używana do nadawania wartości zmiennym, zgodnie ze schematem: nazwa_zmiennej := wyrażenie; Operatory arytmetyczne + dodawanie div dzielenie całkowite - odejmowanie mod dzielenie modulo * mnożenie ( ) grupowanie działań / dzielenie Przykład var x,y,z: integer; a: char; b: string; x := 10; y := 7+x*4; a := 'x'; b := 'abcd'; Operacje arytmetyczne wykonywane są od lewej do prawej z zachowaniem priorytetów (po pierwsze mnożenie i dzielenie, później dodawane i odejmowanie). Nie można pomijać symboli działań, nawiasy okrągłe zmieniają kolejność operacji. Uwaga: 5 x 5/3* y x 3 y ( x 5) /(3* y) x 5 3y Techniki programowania I s.2-5
Funkcje standardowe Trygonometryczne: Sin, Cos, Tan, Cotan podstawowe funkcje trygonometryczne (kąt w rad), ArcSin, ArcCos, ArcTan odwrotne funkcje trygonometryczne (wynik w rad), DegToRad, RadToDeg zamiana stopni na radiany i radianów na stopnie. Arytmetyczne: Abs wartość bezwzględna, Ln, Log10, Log2, LogN logarytm: naturalny, podstawa 10, 2, dowolna, Round, RoundTo zaokrąglenie do całkowitej i określonej liczby cyfr, Ceil, Floor zaokrąglenie do najbliższej całkowitej w górę i w dół, Trunc obcięcie części ułamkowej, Sqr, Sqrt kwadrat i pierwiastek kwadratowy. Znakowe/łańcuchowe: Chr, Ord znak o podanym kodzie i kod znaku, AnsiUpperCase, AnsiLowerCase zamiana znaków na duże/małe litery, Length długość ciągu znakowego, Pos poszukiwanie pierwszego wystąpienia ciągu znakowego w innym ciągu. Techniki programowania I s.2-6
Funkcje standardowe - przykłady Przykład 1. Przykład 2. var x, y, z: Real; var v, x, y, z: Real; x := DegToRad(45); v := 3458.3764; y := Sin(x); x := Round(v); // x = 34458 z := RadToDeg(ArcSin(y)); y := RoundTo(v,1); // y = 3460 Przykład 3. var s, s1, s2: string; p: integer; s := 'Język Pascal'; z := RoundTo(v,-2); // z = 3458.38 s1 := AnsiUpperCase(s); // s1 = JĘZYK PASCAL s2 := AnsiLowerCase(s); // s2 = język pascal p := Pos('Pas', s); // p = 7 p := Pos('pas', s); // p = 0 Uwaga: pewne funkcje wymagają dołączenia dodatkowego modułu (klauzula uses przed definicją klasy formularza), np. część funkcji trygonometrycznych i arytmetycznych opisanych na str. 8 wymaga modułu Math. Techniki programowania I s.2-7
Odczyt danych wprowadzanych przez użytkownika Podstawowym elementem używanym do wprowadzania danych jest komponent Edit. Wartość wprowadzona przez użytkownika jest dostępna we własności Text. Uwaga: własność Text jest typu string, stąd każda wartość (również numeryczna) wprowadzona w polu edycyjnym będzie traktowana jako ciąg znaków. Przykład var s:string; x:integer; s:=edit1.text; prawidłowe przypisanie, typy własności i zmiennej zgodne x:=edit.text; błąd kompilacji, niezgodne typy własności i zmiennej W celu odczytania wartości numerycznej z pola edycyjnego należy dokonać konwersji (zamiany) z typu łańcuchowego na liczbowy, korzystając z funkcji: function StrToInt(s: string) : integer; function StrToFloat(s: string): real; Przykład var x:integer; x:=strtoint(edit1.text); Instrukcja będzie wykonana bez błędów, jeżeli w polu edycyjnym znajduje się wartość (łańcuch znaków), która jest prawidłową liczbą całkowitą. Techniki programowania I s.2-8
Wyświetlanie wyników Wynik działania programu można wyświetlić używając komponentu Label (własność Caption) lub Edit (własność Text + ReadOnly). W przypadku danych numerycznych pojawia się problem zgodności typów (Caption i Text są typu string). Wyświetlenie wartości numerycznej wymaga konwersji typu liczbowego do łańcuchowego za pomocą funkcji: function IntToStr(x:integer): string; function FloatToStr(x:real) : string; function FormatFloat(format:string; wartość:real): string; Przykład var x:integer; y:real; // y=23.78 Label1.Caption := IntToStr(x); Edit1.Text := FloatToStr(y); Edit1.Text := FormatFloat('0.000',y); zawartość Edit1: 23,780 Edit1.Text := FormatFloat('0.###',y); zawartość Edit1: 23,78 Edit1.Text := FormatFloat('0.0',y); zawartość Edit1: 23,8 Edit1.Text := FormatFloat('0.00e+00',y); zawartość Edit1: 2,38e+01 Techniki programowania I s.2-9
Przykład 3. rozwiązanie równania liniowego Program rozwiązuje równanie liniowe ax+b=0 na podstawie wartości współczynników a i b (liczby rzeczywiste) wprowadzanych w polach edycyjnych (Edit1, Edit2). Obliczenia będą uruchomione po naciśnięciu przycisku "Oblicz" (Button1), rozwiązanie wyświetlane jest przy pomocy etykiety (Label5). procedure TForm1.Button1Click(Sender: TObject); var a, b, x: real; begin a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); x := -b/a; Label5.Caption := 'Rozwiązanie x=' + FormatFloat('0.0000',x); Uwaga: operator "+" w instrukcji wyświetlającej rozwiązanie nie jest arytmetycznym dodawaniem. W tym kontekście jest to operator konkatenacji, który łączy łańcuchy znakowe (do napisu "Rozwiązanie x=" dołącza znakową reprezentację wyniku). Pełny kod programu dostępny na stronie przedmiotu jako "Przykład03" Techniki programowania I s.2-10
Obsługa wyjątków Wykonanie pewnych instrukcji może zakończyć się błędem. Taka sytuacja jest sygnalizowana przez wygenerowanie specjalnego komunikatu nazywanego wyjątkiem (ang. except). Wystąpienie wyjątku przerywa wykonanie bieżącego bloku programu i przenosi sterowanie do bloku obsługi wyjątków. Delphi reaguje na każdy wyjątek wyświetlając standardowe okno komunikatu z informacją o zaistniałym błędzie (język angielski). Przechwytywanie i samodzielną obsługę wyjątków umożliwia konstrukcja: try blok instrukcji except kod obsługi wyjątku Jeżeli dowolna instrukcja umieszczona pomiędzy try i exept zgłosi wyjątek, działanie całego bloku zostanie przerwane i będzie wykonany kod umieszczony pomiędzy except i end. Instrukcje umieszczone za słowem end będą wykonane zawsze niezależnie od tego czy wcześniej wystąpił wyjątek. Techniki programowania I s.2-11
Przykład 3a równanie liniowe, modyfikacja I Program rozwiązujący równanie liniowe (s.10, przykład 3.) zgłosi standardowy błąd jeżeli użytkownik wprowadzi wartość, która nie jest liczbą (funkcja StrToFloat w takim przypadku podnosi wyjątek). Poniższa modyfikacja wprowadza własną obsługę błędów i wyświetla komunikat dopasowany do funkcji programu: procedure TForm1.Button1Click(Sender: TObject); var a, b, x: real; begin try a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); x := -b/a; Label5.Caption := 'Rozwiązanie: x=' + FormatFloat('0.0000',x); except ShowMessage('Współczynniki równania muszą być liczbami'); Pełny kod programu dostępny na stronie przedmiotu jako "Przykład03a" Techniki programowania I s.2-12
Przykład 3b równanie liniowe, modyfikacja II Program "Przykład 3a" nie rozróżnia rodzaju i miejsca wystąpienia błędu, np. wyświetli komunikat gdy współczynnik a jest zerem (dzielenie przez zero). procedure TForm1.Button1Click(Sender: TObject); var a, b, x: real; begin try a := StrToFloat(Edit1.Text); except ShowMessage('Współczynnik "a" musi być liczbą'); Edit1.SetFocus; exit; // odczyt współczynnika b analogicznie try x := -b/a; Label5.Caption := 'Rozwiązanie: x=' + FormatFloat('0.0000',x); except Label5.Caption := 'Brak rozwiązania'; Konstrukcja Edit1.SetFocus ustawia kursor w polu Edit1. Instrukcja exit przerywa działanie bieżącej procedury. Pełny kod programu dostępny na stronie przedmiotu jako "Przykład03b" Techniki programowania I s.2-13
Klasy wyjątków Konstrukcja try except umożliwia rozpoznanie typu błędu (klasy wyjątku) i odpowiednią reakcję na każdy wyjątek, który wystąpił w danym bloku. try blok instrukcji except on KlasaWyjątku1 do begin kod obsługi on KlasaWyjątku2 do begin kod obsługi... on KlasaWyjątkuN do begin kod obsługi Uwaga: begin i end może być pominięte jeżeli po do jest tylko jedna instrukcja. Wybrane klasy wyjątków: EConvertError błąd konwersji ciągu znakowego (StrToInt, StrToFloat), EDivByZero, EZeroDivide dzielenie przez zero (liczby całkow. i rzeczyw.), EIntError, EMathError błąd w obliczeniach (liczby całkowite i rzeczywiste), EOverflow przekroczenie zakresu liczb rzeczywistych. Techniki programowania I s.2-14
Przykład 3c równanie liniowe, modyfikacja III procedure TForm1.Button1Click(Sender: TObject); var a, b, x: real; begin try a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); x := -b/a; Label5.Caption := 'Rozwiązanie: x=' + FormatFloat('0.0000',x); except on EConvertError do begin ShowMessage('Współczynniki równania muszą by liczbami'); Edit1.SetFocus; on EZeroDivide do Label5.Caption := 'Brak rozwiązania'; Pełny kod programu dostępny na stronie przedmiotu jako "Przykład03c" Techniki programowania I s.2-15