Informatyka II MPZI2 ćw.2 Programowanie Delphi obliczenia, schematy blokowe Zastosowania obliczeń numerycznych Wyrażenia arytmetyczne służą do zapisu wykonywania operacji obliczeniowych w trakcie przebiegu programu. Budujemy je podobnie jak w Excelu czy Matlabie. Wyrażeniem arytmetycznym może być stała, zmienna lub zapis złożonej operacji na stałych, zmiennych i funkcjach (standardowych, bibliotecznych lub własnych użytkownika) z użyciem operatorów arytmetycznych. Bardziej skomplikowane wyrażenia zawierają operatory i funkcje. Ponadto używamy nawiasów (tylko okrągłych!) w celu zmiany kolejności działań. Wyrażenia używane są najczęściej w instrukcjach przypisania po prawej stronie symbolu := Operatory arytmetyczne Rozróżniamy następujące operatory: jednoargumentowe zmiana znaku, + powielenie znaku, dwuargumentowe multiplikatywne * mnożenie, / dzielenie (rzeczywiste), div dzielenie całkowite (obydwa argumenty operacji muszą być całkowite, wynik jest ), mod reszta z dzielenia całkowitego (jak wyżej), (znak przedstawia spację), dwuargumentowe addytywne + dodawanie, odejmowanie. UWAGA: Dla operatorów tej samej wagi - kolejność działań od lewej do prawej. Jeżeli w wyrażeniu są tylko argumenty całkowite i nie ma dzielenia rzeczywistego to wynik jest typu integer. Jeżeli występuje chociaż jeden element typu real lub dzielenie rzeczywiste to wynik jest typu real. Na elementach tekstowych (char, string) możemy dokonywać operacji łączenia tekstów (tzw. konkatenacja) używając znaku +. Przykład: nazwisko := 'Kowalski' ; tekst_1 := 'Pan ' + nazwisko ; W rezultacie zmienna tekst_1 przyjmie wartość tekstową 'Pan Kowalski'. Funkcje standardowe W czasie poprzedniego ćwiczenia poznaliśmy już kilka funkcji standardowych (wbudowanych), jak np. sin, random, sqrt. Istnieje możliwość użycia w wyrażeniu funkcji matematycznych (w kontekście identycznym jak zmienne proste) w postaci: identyfikator_funkcji (lista_argumentów) Argumentem może być wyrażenie odpowiedniego typu. Zestaw funkcji standardowych przedstawia tabela Funkcje standardowe Znaczenie Nazwa funkcji Typ wyniku Typ argumentu Przykład
wartość bezwzględna abs(x) abs(-2) pierwiastek kwadratowy sqrt(x) sqrt(5.45) kwadrat sqr(x) sqr(x-5) e x exp(x) exp(-x/2) logarytm naturalny ln(x) ln(2*x-4) sinus sin(x) rzecz. (radiany) sin(3*alfa) cosinus cos(x) rzecz. (radiany) cos(beta/2) arcus tangens arctan(x) arctan(fi) część całkowita int(x) część ułamkowa frac(x) int(2.5) frac(3.6) zaokrąglenie round(x) round(3.6) obcięcie trunc(x) trunc(3.6) znak następny succ(z) porządkowy porządkowy succ ( 'g' ) znak poprzedni pred(z) porządkowy porządkowy pred( 'j' ) znak o podanym kodzie ASCII chr(n) znakowy chr(49) kod znaku ord(z) znakowy ord( '1' ) długość tekstu length(tekst) łańcuchowy length( 'alfa' ) liczba losowa całkowita random(n) random(100) liczba losowa rzeczywista z przedziału (0, 1) random brak random W wyrażeniach istotne są wszelkie ograniczenia obszaru określoności funkcji, np. użycie: ln(-3) sqrt(-5.0) spowoduje błędy wykonania. Brak w języku operatora lub funkcji standardowej potęgowania (w Excelu i Matlabie ^), stąd można dla niewielkich ch potęg zastosować zapis w postaci: x 4 to x*x*x*x lub sqr (x)*sqr(x) lub sqr (sqr(x)), Można wykorzystać funkcję power(podstawa, wykładnik), jej użycie wymaga dopisania deklaracji modułu Math w sekcji uses. uses sysutils,math; begin writeln( power(5.1, 3.7)); readln; end. Oczywiście można wykorzystywać funkcję power() do obliczania pierwiastków dowolnego stopnia. Brak w języku również innych, często potrzebnych funkcji, jak na przykład tangens czy logarytm dziesiętny. Trzeba wówczas korzystać z elementarnych wzorów matematycznych: log = tg = Należy zwrócić uwagę na możliwość wystąpienia przekroczenia dopuszczalnych zakresów wartości zmiennych przy obliczeniach. Poniższe wyrażenie w postaci matematycznej: 1 sin( 3 x 3 ) 2 π można zapisać w przykładowej postaci: 1/2/pi*sin(3*x-3)
W przypadku zastosowania w instrukcji przypisania wyrażenia zawierającego zmienną, której aktualnie przypisujemy wartość, np.: x := x + 5 ; obliczana jest wartość wyrażenia (wartość x powinna być wcześniej określona), a następnie uaktualniana wartość zmiennej, np. w ciągu instrukcji:... x := 5 ; x := sqr(x) ; {x będzie równe 25} x := x +2 ; {powiększenie poprzedniej wartości x o 2, x będzie równe 27}... Funkcje standardowe nie wymagają deklaracji ich użycia. Pisząc wyrażenie należy szczególnie uważać na: operatory arytmetyczne szczególnie mnożenia: 2*x a nie 2x format wykładniczy np.1.34e-8 (10 7 to 1e7 a nie e7), argumenty funkcji trygonometrycznych podajemy je w radianach, w przypadku konieczności używania kąta w stopniach należy przeliczyć kąt na radiany wyrażeniem stopnie*pi/180, (pi jest predefiniowaną nazwą stałej). hierarchię operatorów odpowiednie stosowanie nawiasów, brak w języku operacji potęgowania, brak funkcji tangens, cotangens, logarytm dziesiętny, różnicę między funkcjami o podobnych nazwach sqr i sqrt. Wyrażenia logiczne Wyrażeniem logicznym może być: 1. stała logiczna true prawda false fałsz 2. zmienna typu boolean, 3. porównanie w sensie liczbowym lub tekstowym (kolejności alfabetycznej) według schematu: wyrażenie1 operator_porównania wyrażenie2 Wynikiem porównania jest wartość logiczna true (prawda) lub false (fałsz). Operatorami są (dla przypomnienia): < = > <= >= < > różny Przykłady porównań: x12 < 2 (4*x+1.5) < 30.7 nazwisko >= 'G' {nazwiska od litery G do końca alfabetu} 4. stałe logiczne, zmienne logiczne, porównania (w nawiasie!), połączone operatorami logicznymi: - jednoargumentowymi: not (negacja) np. not (i < 5) - dwuargumentowymi: and (iloczyn logiczny "i" jednoczesne spełnienie warunków) np. (x > 0) and (x < 3) or (suma logiczna "lub" alternatywne spełnienie warunków) np. (x < 0) or (x > 100) (gdzie znak przedstawia spację). Poniższa tabela przedstawia wartości wyrażeń logicznych w zależności od wartości argumentów: Argument 1 Argument 2 and or
false false false false true false false true false true false true true true true true Przykładowe użycie: Sprawdzenie przynależności do przedziału: if (x>0) and (x<100) then jakaś instrukcja wykonawcza Sprawdzenie parzystości (reszty z dzielenia całkowitego): if (k mod 2) = 0 then writeln('parzysta'); Sprawdzenie kolejności alfabetycznej: if n1 < n2 then writeln('n1 wcześniejsze w alfabecie'); //uwaga: n1 i n2 typu string W operacji przypisania wartości zmiennej logicznej musi zachodzić zgodność typów. Wartość wyrażenia logicznego można przypisać do zmiennej typu boolean bądź użyć je w instrukcjach warunkowych lub pętlach repeat i while. Ćwiczenie 1. Napisać program, w którym dla zadanej wartości x (np. x=3.45) obliczane są wartości następujących wyrażeń oraz wyprowadzane wyniki na ekran konsoli (wykorzystać tabelę funkcji standardowych ): a) 2 (2 ) b) "! c) 1 %&' ( 30 0 ) d) π (3 3) 2. Napisać program, w którym wymagane jest wprowadzenie przez użytkownika liczby rzeczywistej, a następnie sprawdzana jest przynależność podanej liczby do przedziału (0, 10). 3. Napisać program losujący: a. 10 liczb ch z przedziału (a, b), gdzie wartości a i b podaje użytkownik b. 10 liczb ch z przedziału (a, b), gdzie wartości a i b podaje użytkownik Uwaga: programy wymaga wykorzystania standardowej procedury: randomize; na początku części wykonawczej programu. 4. Napisać program, w którym w "pętli" for obliczane są wartości funkcji sinus dla kątów od 0 do 180 stopni z krokiem co 10 stopni. 5. Napisać program obliczający pole rombu dla podawanej wartości rzeczywistej boku i kata ostrego. Wzór wyprowadzić dzieląc romb na prostokąt i dwa trójkąty oraz stosując funkcje trygonometryczne dla nieznanych wielkości.
Schematy blokowe Schematy blokowe Reguły graficzne tworzenia schematów blokowych: Terminatory Operacje wejścia i wyjścia Instrukcja wykonawcza (proces) - blok operacyjny Blok decyzyjny Iterację while.. do (dopóki.. wykonuj) while warunek do begin ciąg instrukcji end można zilustrować schematem blokowym: Iterację warunkową repeat..until.. (powtarzaj.. aż..) repeat ciąg instrukcji until W B ; przedstawia schemat blokowy: ZADANIA 1. Przemyśleć schematy blokowe i działanie iteracji repeat i while.. Zastanowić się jakie wartości warunku (true/false) powodują zakończenie iteracji. 2. Utworzyć aplikację, w której obliczamy kolejne wartości funkcji: f(x)=x 3 3x 2 3x +5, poczynając od x=0 i w kolejnych krokach iteracji zwiększając wartość x o 0,1. Iteracja ma za zadanie sprawdzać warunek zmiany znaku funkcji (wyznaczenie miejsca ze-
rowego funkcji). Kolejne wartości funkcji wypisywane są w konsoli. Wykonać schemat blokowy. 3. Sprawdzić w aplikacji następującą pętlę : k:=0; while sin(pi*k/180)<0.87 do begin k:=k+5; writeln('k=',k:4,sin(pi*k/180):10:4); end; Wyjaśnić jej działanie. 4. Wykonać program, w którym podawana jest przez użytkownika liczba całkowita. Program ma za zadanie odpowiedzieć czy jest to liczba pierwsza, czyli zbadać w pętli podzielność bez reszty przez kolejne liczby naturalne, począwszy od 2 aż do połowy zadanej liczby (dlaczego? co w przypadku gdy liczba jest nieparzysta?). Jaką pętlę tu najlepiej zastosować? Wykonać schemat blokowy. 5. Opracować algorytm obliczania n! (n silnia) = 1*2*3*4...*n przy wykorzystaniu pętli while. Sporządzić schemat blokowy, napisać i przetestować program.