WSTĘP DO PROGRAMOWANIA
POLECANA LITERATURA:
Niklaus With „Algorytmy + struktury danych = programy”
M.Iglewski, J.Madey, S.Matwin „Pascal”
Andrzej Marciniak „Turbo Pascal” {wersja obojętna}
A.Struzińska-Walczak, K.Walczak „Nauka programowania dla początkujących
Turbo Pascal”
A.Struzińska-Walczak, K.Walczak „Nauka programowania dla ...już nie całkiem
początkujących Turbo Pascal”
PODSTAWOWE POJĘCIA
OD ALGORYTMU DO PROGRAMU
Algorytm-treść rozkazująca niezależna od zewnętrza
Co powinno być zawarte w algorytmie:
Wskazanie jakie działania i w odniesieniu do jakich przedmiotów mają być wykonane
W jakiej kolejności mają być te czynności wykonane
W jakich okolicznościach mają być wykonane
Kolejność pracy nad programem
Specyfikacja algorytmu
Projektowanie algorytmu
Kodowanie algorytmu (zapis w odpowiednim języku programowania)
Specyfikacja jest to zespół informacji pozwalających na jednoznaczne sformułowanie programu. Specyfikacja powinna składać się z :
Wyniki merytoryczne (powinien określać jakie mają być skutki wykonania się instrukcji w programie, tymi skutkami będą nowe informacje-liczby, napisy)
Odbiornik wyników (gdzie mają się te wyniki znaleźć-ekran, plik)
Dane merytoryczne (powinien określać z jakich przedmiotów-napisów, liczb itd. należy skorzystać, aby przetworzyć je w określone uprzednio wyniki)
Źródło danych (określa źródło z którego mają być pobrane wartości wejściowe)
Metoda przekształcania (określa zasadę wedle której z danych wejściowych mają być utworzone dane wynikowe)
Reguły odpornościowe (co ma zrobić komputer w przypadku gdy dane wejściowe nie pozwalają na uzyskanie poprawnego wyniku)
DANE I ZMIENNE
Dane- są to obiekty, które mają sobie przepisane wartości: liczby, wartości logiczne, ciągi znaków. Mogą być też dane złożone. Odróżniają się od siebie nazwą. Dane mogą być stałe- w trakcie wykonywania programu wartość ich nie ulega zmianie oraz zmienne- mają niezmienne nazwy, ale wartości ich mogą zmieniać się w trakcie wykonywania programu.
Zmienna-miejsce na nośniku pamięci komputera, identyfikowane poprzez nazwę (unikalną), w dowolnym miejscu programu można z niej pobrać wartość jak również zmienić jej wartość. Poszczególne zmienne sa przeznaczone do przechowywania określonych wartości (zmienna może przechowywać obiekty tylko takiego samego typu). Jeżeli mamy dwie zmienne a i b i jeśli chcemy skopiować wartość ze zmiennej b do a, to a i b muszą być tego samego typu!
a b, czyli lewa i prawa strona musi być zgodnego typu.
Nie można do zmiennej typu liczbowego wstawić znaków czy wartości logicznych.
Jeżeli do zmiennej a skopiujemy wartość zmiennej b, to wartość, która była w zmiennej a zostaje wykasowana. Jeśli chcemy zamienić wartości a na b i odwrotnie musimy skorzystać ze zmiennej pomocniczej Rob, w sposób następujący:
Rob a
a b
b Rob
Identyfikator-nazwa zmiennej (złożona może być z liter alfabetu łacińskiego, cyfr oraz znaku "_", nie może zaczynać się od cyfry ). Identyfikator może mieć maxymalnie 256 znaków, jednakże praktycznie powinno to być 7-15 znaków. Identyfikator powinien nam mówić o przeznaczeniu zmiennej. Np. mając równanie px+q=0, zmienne można nazwać p, q, x, jednak o wiele praktyczniejsze byłoby nazwanie ich WspPrzyX, WyrazWolny, x.
INSTRUKCJE
Program jest opisem sposobu wykonania pewnych czynności na ustalonym, określonym w tym programie zbiorze obiektów zwanych danymi. Czynności te opisujemy instrukcjami.
Instrukcja sekwencyjna
powstaje ze złączenia ze sobą dwóch instrukcji.
instr1; (a następnie)
instr2
Najpierw wykonywana jest instrukcja instr1, a po niej dopiero instr2.
Podejdź do drzwi, a następnie (;)
włóż klucz do zamka, a następnie (;)
przekręć klucz w prawo
Instrukcja złożona
grupuje sekwencyjnie instrukcje składowe, ujmując je w „nawiasy zdaniowe”-
BEGIN
instr1;
instr2;
.........
instrN;
END
Instrukcja warunkowa (selekcja)
jak sama nazwa mówi wykonanie instrukcji uzależnione jest od spełnienia warunku.
-dwuwariantowa
W RAZIE GDY spełniony warunek
WÓWCZAS
instr1
A W PRZECIWNYM RAZIE
instr2;
W RAZIE GDY masz w kieszeni 50 zł
WÓWCZAS
idź na piwo
A W PRZECIWNYM RAZIE
siedź w domu;
Na początku sprawdzana jest wartość warunku logicznego. Jeżeli jest on spełniony (wartość Prawda->TRUE), wówczas wykonywana jest instrukcja pierwsza (druga jest pomijana). Jeśli warunek nie jest spełniony (wartość Fałsz->FALSE) to wykonywana jest instrukcja druga (pierwsza jest pomijana).
IF 2<5
THEN
WRITELN(`Prawda-warunek spełniony')
ELSE
WRITELN(`Fałsz-warunek nie spełniony');
Rozwiązanie: 2<5 zawsze, więc wykona się instrukcja pierwsza, a więc zostanie wyświetlony tekst
„Prawda-warunek spełniony”. Przy tak sformułowanym warunku instrukcja druga nigdy się nie wykona.
-jednowariantowa
W RAZIE GDY spełniony warunek
WÓWCZAS
instr;
W RAZIE GDY boli cię głowa
WÓWCZAS
idź do lekarza;
Tu również na początku sprawdzana jest wartość warunku logicznego. Jeżeli jest on spełniony (wartość Prawda->TRUE), wówczas wykonywana jest instrukcja . Jeśli warunek nie jest spełniony (wartość Fałsz->FALSE) to nie będzie żadnej reakcji, instrukcja się nie wykona i program przejdzie dalej, wykonując dalsze instrukcje.
IF Wart_Funkcji=2
THEN
Arg_X:=Arg_X1-8;
Rozwiązanie: Prawdziwość warunku uzależniona jest od wartości zmiennej Wart_Funkcji, jeśli była by ta m liczba 2 to instrukcja się wykona, bo uzyskamy prawdę (2=2). Jeśli w zmiennej Wart_Funkcji jest inna wartość program nic nie wykona.
Instrukcja iteracyjna(pętla)
instrukcja może wykonać się kilka (właściwie skończenie dużo) razy, a jej wykonanie uzależnione jest od prawdziwości warunku. Pętle (bo tak instrukcje iteracyjne nazywamy) stosujemy gdy np. jakąś czynność musimy wykonać kilkakrotnie. Często też stosujemy pętle jako „zapory” (pętle zaporowe), gdy chcemy pobrać od użytkownika dane z odpowiedniego przedziału. Możemy mu nakazać aby podawał daną aż będzie ona nam (programowi) podpowiadała.
-pętla typu „Dopóki”
DOPÓKI spełniony warunek
DOPÓTY
instr;
DOPÓKI jesteś głodny
DOPÓTY
jedz;
na początku sprawdzana jest wartość warunku logicznego. Jeśli jest spełniony (wartość PRAWDA->TRUE) to wykonuje się instrukcja (instr) tzw. refren pętli i ponownie sprawdzany jest warunek. Jeśli spełniony to ponownie wykonuje się refren pętli i tak aż do momentu gdy warunek jest niespełniony, a więc jego wartością jest FAŁSZ (FALSE). Jeśli przed rozpoczęciem pętli warunek jest niespełniony (FALSE) to refren pętli (instr) nie wykona się ani razu.
WHILE i<10
DO
BEGIN
i:=i+1;
WRITELN(`i=',i)
END;
Jeżeli wartość w zmiennej i przed pętlą jest mniejsza od 10 (z tego zapisu nic nie można powiedzieć na ten temat) zostaną wykonane dwie czynności (instrukcja złożona): zwiększenie i o jeden oraz wyświetlenie wartości zmiennej i. Dziać się będzie taka sytuacja dopóty (po którymś zwiększeniu i) wartość i osiągnie 10 co oznacza, że warunek i <10 niespełniony (10<10->FALSE). Jeżeli natomiast wartość w zmiennej i przed rozpoczęciem pętli jest równa bądź większa od 10 pętla zostanie zakończona, bez wykonania instrukcji.
-pętla typu „Aż do”
POWTARZAJ
instr
AŻ DO MOMENTU GDY STWIERDZISZ, ŻE spełniony warunek;
POWTARZAJ
jedz kanapki
AŻ DO MOMENTU GDY STWIERDZISZ, ŻE wszystkie zjadłeś;
Ta pętla (w przeciwieństwie do WHILE-DO) przynajmniej raz zawsze się wykona. Najpierw wykonywana jest instrukcja (instr) a refrenu pętli, a dopiero później sprawdzana jest wartość logiczna warunku. Jeśli warunek spełniony (PRAWDA->TRUE) pętla zostaje zakończona, natomiast jeśli FAŁSZ to ponownie wykonywany jest refren pętli i znowu sprawdzany warunek. I tak aż do momentu gdy wartością warunku będzie prawda (TRUE).
REPEAT
i:=i+1;
WRITELN(`i=',i)
UNTIL i=10
Niezależnie od wartości i przed pętlą, zwiększona zostanie jego wartość o 1 i wyświetlona. Dopiero teraz sprawdzana jest poprawność warunku. Jeśli i=10 to pętla się zakończy, jeśli nie to czynności zostaną powtórzone, aż do momentu gdy w którymś momencie wartość i będzie wynosiła 10. W tym przykładzie może zdarzyć się taka sytuacja, że pętla się „nigdy” nie zakończy-Pomyśl kiedy?
Pętlę REPEAT-UNTIL możemy „przerobić” na WHILE-DO wg wzoru:
instr;
WHILE NOT spełniony warunek {zaprzeczenie warunku}
DO
instr;
Musimy pamiętać by w refrenie pętli było odwołanie do zmiennych występujących w warunku pętli, tak by móc w odpowiednim momencie zmienić wartość logiczną warunku! Inaczej (wartość niezmienna) pętla będzie wykonywać się (obracać) „w nieskończoność”.
Instrukcja przypisania, podstawienia „:=”.
a := b oznacza dokładnie tyle: weź wartość ze zmiennej b i wstaw ją do zmiennej a. Należy pamiętać, że typy zmiennej po lewej i prawej stronie muszą być zgodne!
4. URZĄDZENIA WEJŚCIA/WYJŚCIA
Procedura wyjścia: WRITE, WRITELN „Wypisz”. Zapisuje na ekranie (bądź w pliku) wartość podaną jako parametr. WRITELN(zmienna_a)/ WRITE(zmienna_a)- wyświetli na ekranie wartość jako obecnie znajduje się w zmiennej_a. WRITE()- wypisuje i kursor zostaje dalej w tej samej linii, następny wypisany tekst zostanie na ekranie dołączony z prawej strony. Natomiast WRITELN() wypisuje tekst na ekranie i automatycznie zmienia linię o 1 w dół. Samo użycie WRITELN, bez argumentu powoduje przejście do następnej linii.
Procedura wejścia: READ,READLN „Pobierz”. Pobiera z klawiatury (bądź z pliku) wartość podaną jako parametr. READLN(zmienna_a)/ READ(zmienna_a)-- pobierze z kalwiatury- od użytkownika wartość i wstawi ją do zmiennej_a. READ()- pobiera i kursor zostaje dalej w tej samej linii. Natomiast READLN() pobiera wartość i automatycznie zmienia linię o 1 w dół. Samo użycie READLN, bez argumentu powoduje zatrzymanie programu do momentu wciśnięcia klawisz ENTER.
Program p1;
Begin
Writeln(`To jest');
Writeln(`text napisany');
Writeln(`w trzech linijkach');
Writeln;
Write(`A to jest ten sam');
Write(`text napisany ');
Write(`w jednej linii. ');
Readln;
End.
PROGRAM
Podstawowymi składnikami programu w języku TP są:
Słowo kluczowe PROGRAM
Następnie nazwa programu ze średnikiem
Słowo kluczowe BEGIN- początek programu
Słowo kluczowe END.(z kropką)- koniec programu.
PROGRAM ROZW_ROWNAN;
BEGIN
END.
Oczywiście tak napisany program skompiluje się, ale nic nie wykona. Cały algorytm programu, wszystkie opisane instrukcje wpisujemy między BEGIN a END. Natomiast przed początkiem bloku programu (BEGIN) jest miejsce na definicje i deklaracje: etykiet (LABEL), bibliotek (USES), stałych (CONST), typów (TYPE), zmiennych (VAR), procedur i funkcji (PROCEDURE, FUNCTION).
PROGRAM P1;
BEGIN
WRITELN(`To mój pierwszy i chyba nie ostatni, program napisany w Turbo Pascalu');
END.
PROGRAM P2;
{program oblicza}
(* wartość funkcji 5x+c dla pobranego od użytkownika x i stałej c *)
CONST
c= 12.8;
VAR
arg_funkcji: REAL;
BEGIN
WRITELN(`Oto stała funkcji c :',c);
WRITE(`Podaj argument funkcji f=5x+c')
READLN(arg_funkcji);
WRITELN(`Rozwiązanie: f(',x,')=',5*arg_funkcji+c);
READLN;
END.
Uwaga:
{.....}, (*...*)- komentarze w programie, kompilator pomija ten tekst.
PODSTAWOWE TYPY ZMIENNYCH.
Typy:
Proste:
rzeczywiste(Real)
porządkowe:
znakowe(Char)
logiczne(Boolean)
wyliczeniowe
okrojone
całkowite:
Integer
LongInt
ShortInt
Byte
Word
Wskazaniowe
Strukturalne:
plikowe
tablicowe
rekordowe
napisowe
zbiorowe
ZADANIA PODSTAWOWE-ZASTOSOWANIE INSTRUKCI WARUNKOWEJ
Zad.1.
Napisać program obliczający równanie
px+q=0
gdzie p,q- współczynniki równania należy pobrać od użytkownika w trybie dialogowym.
Wynik wyświetlić na ekranie.
Rozwiązanie:
Na początku musimy zastanowić się nad postacie rozwiązania, kiedy równanie ma rozwiązanie, a kiedy nie. Rozwiązanie ma postać x=-q/p. Mogą wystąpić trzy przypadki decydujące o rozwiązaniu:
Rozwiązanie jedyne gdy p<>0
Nieskończenie wiele rozwiązań gdy p=0 i q=0
Brak rozwiązań gdy p=0 i q<>0
Musimy rozpatrzyć każdy z tych trzech przypadków i w zależności, który to przypadek wyświetlić albo rozwiązanie w postaci x=....., gdzie w miejsce kropek należy wstawić wartość obliczoną, albo komunikat o niemożności rozwiązania lub o nieskończonej liczbie rozwiązań.
W TP operatory "i" i "lub" mają postać odpowiednio: "and" i "or", po lewej i prawej stronie operatorów muszą być wyrażenia logiczne(boolowskie).
FORMATOWANIE LICZB I TEKSTÓW
Niech zmienna x będzie typu REAL (liczby rzeczywiste)
Wyświetlając wartość zmiennej x na ekranie otrzymamy coś takiego:
-6.31148e+00 (format wykładniczy), co oznacza w tym przypadku -6.31148*100
chcąc wyświetlić liczbę w formacie
-6.31, musimy ją sformatować.
Formatowanie zmiennej rzeczywistej x polega na wyświetlaniu jej w postaci
x:i1:i2, gdzie i1-oznacza liczbę miejsc dla całej liczby (ze zmiennej x), natomiast i2- oznacza liczbę miejsc dla części ułamkowej (po przecinku).
Przykład: niech x= -3456.253674, popatrzmy jakie można uzyskać wyniki na ekranie
-3456.25 dla x:1:2
_ _ _ -3456.253 dla x:12:3
_ _-3456.25367400 dla x:16:8
-3456.2536740000 dla x:0:10
Niech zmienna x będzie typu INTEGER (liczby całkowite)
Formatowanie zmiennej całkowitej x (Integer-i pokrewne) polega na wyświetlaniu jej w postaci
x:i, gdzie i oznacza liczbę miejsc przeznaczonych na całą liczbę z x.
Przykład: niech x=1234, popatrzmy jakie można uzyskać wyniki na ekranie
_ _ _ 1234 dla x:7
1234 dla x:4, x:3,...,x:0
Niech zmienna x będzie typu STRING (napisowy)
Formatowanie zmiennej napisowej x polega na wyświetlaniu jej w postaci
x:i, gdzie i oznacza liczbę miejsc przeznaczonych na cały napis z x.
Przykład: niech x="Ala ma kota", popatrzmy jakie można uzyskać wyniki na ekranie
Ala ma kota dla x:11,x:10,x:0
_ _ _ _ Ala ma kota dla x:15
Zad.2.
Napisać program obliczający wartość funkcji f zadanej wzorem
x+1, dla x<-2
f(x)= 1, dla -2<=x<=1
x2+1, dla x>1
Wartość argumentu-x pobieramy w trybie dialogowym od użytkownika, obliczona wartość funkcji f ma zostać wyświetlona w postaci
f(....)=...., gdzie w miejscu kropek powinny wyświetlić się w kolejności: wartość x i obliczona wartość f(x).
Rozwiązanie:
Funkcja jest określona w całym zbiorze R, wiec zawsze ma rozwiązanie. Należy natomiast uwzględnić trzy przypadki (przedziały x) w których wartość funkcji f obliczamy z innych wzorów.
Zad.3.
Napisać program rozwiązujący układ 2 równań postaci:
ax+by=c
dx+ey=f
Współczynniki a,b,c,d,e,f pobrane w trybie dialogowym, wynik wyświetlić na ekranie.
Uwaga:
Rozwiązanie układu 2 równań metodą wyznacznikową. Tworzymy wyznaczniki
W= |a b | = ae-bd; Wx= |c b | = ce-bf; Wy= |a c | = af-cd
|d e | |f e | |d f |
W-bierzemy współczynniki przy x i y
Wx- współczynniki przy x zastąpione wyrazami wolnymi+ współczynniki przy y
Wy- współczynniki przy x+ współczynniki przy y zastąpione wyrazami wolnymi
Wynik: x=Wx/W, y=Wy/W
Rozwiązanie: (metodą wyznacznikową)
Na początku musimy zastanowić się nad postacią rozwiązania, kiedy układ ma rozwiązanie, a kiedy nie. Rozwiązanie ma postać x=Wx/W, y=Wy/W. Mogą wystąpić trzy przypadki decydujące o rozwiązaniu:
Rozwiązanie jedyne gdy W<>0
Nieskończenie wiele rozwiązań gdy W=0 i Wx=0 i Wy=0
Brak rozwiązań gdy W=0 i (Wx<>0 lub Wy<>0)
Musimy rozpatrzyć każdy z tych trzech przypadków i w zależności, który to przypadek wyświetlić albo rozwiązanie w postaci x=....., y=...., gdzie w miejsce kropek należy wstawić wartości obliczone, albo komunikat o niemożności rozwiązania lub o nieskończonej liczbie rozwiązań.
Zad.4.(dodatkowe)
Napisać program rozwiązujący układ 3 równań postaci:
ax+by+cz=d
ex+fy+gz=h
ix+jx+kz=l
Współczynniki a,b,c,d,e,f,g,h,i,j,k,l pobrane w trybie dialogowym, wynik wyświetlić na ekranie.
Zad.5.
Napisać program obliczający liczbę W, podaną wzorem:
W=max(|x|-|y|,2min(x,y))
Liczby x i y należy pobrać w trybie dialogowym od użytkownika, wynik-liczbę W wyświetlić na ekranie.
Uwaga:
Min(a,b)mniejsza z liczb a,b np. Min(1,-87)=-87
Max(a,b)większa z liczb a,b np. Max(0,98)=98
Przeprowadzić egzekucję programu, na kartce dla przykładowych wartości
1,2
0,-8
-1,1
-9,-20
i porównać wyniki z wynikami otrzymanymi na komputerze.
Przykład egzekucji:
1.pobranie x,y
2.obliczenie |x|-|y|
3.obliczenie 2min(x,y)
4.obliczenie W-wyznaczenie większej liczby z p.2. i p.3.
x |
y |
|x|-|y| |
2min(x,y) |
W |
2 |
2 |
- |
- |
- |
2 |
2 |
0 |
- |
- |
2 |
2 |
0 |
4 |
- |
2 |
2 |
0 |
4 |
4 |
Zad.6.
Napisać program obliczający liczbę W, podaną wzorem:
W=min(max(|x|,min(x,y)),123-x,2x+10z)
Liczby x, y i z należy pobrać w trybie dialogowym od użytkownika, wynik-liczbę W wyświetlić na ekranie.
Uwaga:
Min(a,b)mniejsza z liczb a,b np. Min(1,-87)=-87
Max(a,b)większa z liczb a,b np. Max(0,98)=98
Przeprowadzić egzekucję programu (patrz zad.5.), na kartce dla przykładowych wartości
1,2,0
0,-8,3
-1,1,-1
-9,-20,-13
i porównać wyniki z wynikami otrzymanymi na komputerze.
Zad.7.
Napisać program ustawiający w kolejności niemalejącej 3 liczby a,b,c.
Liczby a, b i c należy pobrać w trybie dialogowym od użytkownika, wynik ustawione w kolejności liczby wyświetlić na ekranie.
Uwaga:
Kolejność niemalejąca a<=b<=c
Zad.8.(dodatkowe)
Napisać program z Zad.7. dla czterech liczb a,b,c,d.
Zad.9.
Napisać program sprawdzający czy liczba czterocyfrowa jest swoim lustrzanym odbiciem.
Należy pobrać od użytkownika liczbę czterocyfrową i wyświetlić (jako wynik) jeden z trzech komunikatów
podana liczba nie jest czterocyfrowa
podana liczb jest swoim lustrzanym odbiciem
podana liczba nie jest swoim lustrzanym odbiciem
w zależności od otrzymanej sytuacji:
Uwaga:
Liczba-lustrzane odbicie: 2112, 2332, 1111, 9009, nie jest 3434, 1234 itd.
Rozwiązanie:
W pierwszym kroku musimy sprawdzić czy pobrana (od użytkownika) liczba L>999-wymóg czterocyfrowości. Następnie (jeśli czterocyfrowa) musimy rozdzielić L na cyfry: jednościJ, dziesiątekD, setekS, tysięcyT. Cyfra jest swoim lustrzanym odbiciem jeśli D=S i J=T. Do rozdzielenia liczby L potrzebne będą funkcje standardowe TP: mod i div.
Operator "mod": reszta z dzielenia dwóch liczb, argumenty całkowite, zwraca wartość całkowitą, np. 7 mod 2=1; 12 mod 12=0
Liczba z jest parzysta jeśli z mod 2=0!
Operator "div": wynik z dzielenia dwóch liczb, argumenty całkowite, zwraca wartość całkowitą, np. 7 mod 2=3;
12 mod 12=1; 3 div 4=0
Zad.10.
Napisać program sprawdzający poprawność daty.
Należy pobrać od użytkownika Rok, Dzień, Miesiąc i sprawdzić wg napisanego algorytmu poprawność daty.
Uwaga:
Data 30.02.1999 jest niepoprawna!
Rozwiązanie:
Należy napisać algorytm poprawności daty, a więc najpierw musimy sprawdzić czy
0<Miesiąc<=12
0<Dzień<=31
dalej wyznaczamy miesiące w których jest dni 31, potem 30, 29, 28. Miesiące z 31 dniami to (liczbowo) 1,3,5,7,8,10,12, z 30 dniami 4,6,9,11. Miesiąc 2-gi może mieć 28 lub 29 dni, w zależności od tego czy rok jest przestępny. Rok jest przestępny jeżeli jest podzielny przez 4 i nie jest podzielny przez 100 lub jest podzielny przez 400.
ZADANIA DODATKOWE
Zad.1.
Napisać program, który pobiera (w trybie dialogowym) czwórki liczb oznaczających elementy macierzy A2x2, pobranie macierzy osobliwej kończy pobieranie danych. Program drukuje pobraną macierz i macierz do niej odwrotną.
Zad.2.
Napisać program, który dla pobranego od użytkownika (w trybie dialogowym) k>=0 całkowitego oraz x-rzeczywistego, wyświetli wartość
Sin(k)(x), tj.k-tej pochodnej z funkcji sinx w punkcie x.
Zad.3.
Napisać program, który pobiera dane o studentach:
NR- licz. całkowita (1,1000) oznaczająca numer indexu
R- licz. Całkowita (1,5) oznaczająca numer roku
S- liczba rzeczywista (2,5) oznaczająca średnią arytmetyczną ocen
REP- wartość logiczna, dająca odpowiedź czy student jest repetantem (TRUE)
Program kończy działanie gdy dane pobrane o studencie są niepoprawne. Program ma wydrukować na ekranie komunikat czy studentowi należy się stypendium naukowe i w jakiej wysokości wg zasady:
Studenci o średniej mniejszej od 4.0 nie pobierają stypendium, o średniej z <4, 4.5) dostają 0.5 PODS (podstawa naliczania-stała typu real, załóżmy, że wynosi ona obecnie 400zł.), o średniej z <4.5, 4.75) dostają 0.75 PODS, o średniej wyższej stypendium w wysokości PODS. Jeżeli student jest studentem pierwszego roku dostaje dodatkowo 0.1 PODS. Jeżeli student jest repetantem podstawa naliczania zmniejszona zostaje o 20%.
Zad.4.
Napisać program, który pobiera od użytkownika (w trybie dialogowym) liczbę rzeczywistą x, a następnie gdy -π/2<x<π/2 bada czy x spełnia warunek
k√α<=tg(x)<=αk
gdzie α stała rzeczywista programu, α>1, k stała całkowita programu k=5
ZADANIA Z CIĄGAMI-ZASTOSOWANIE PĘTLI
Zad.1.
Napisać program wymuszający podania od użytkownika liczby większej od zera. Czyli stosujemy tutaj tzw. pętlę zaporową.
Rozwiązanie:
W trybie dialogowym prosimy użytkownika o podanie liczby, następnie sprawdzamy czy spełniony jest warunek (>0) i jeśli tak program kończy działanie, a w przeciwnym razie musi wyświetlić się na ekranie informacja o niepoprawności podanej liczby i zachętą do ponownego podania. Całość musi odbywać się w pętli.
W tym przypadku lepszą będzie pętla WHILE-DO. Proszę zastanowić się dlaczego należy użyć tutaj pętli WHILE-DO, a nie REPEAT-UNTIL.
Zad.2.
Napisać program zliczający ile w pobranym od użytkownika ciągu jest liczb ujemnych, zer, dodatnich. Należy pobrać w trybie dialogowym liczbę elementów ciągu N, a następnie musimy pobrać N liczb sprawdzając czy jest ona <0, =0, >0.
Rozwiązanie:
Należy wyzerować, przed pobraniem elementów ciągu, 4 liczniki
i mówiący który element już pobieramy 0<i<=N
dodatnie tu zliczamy elementy dodatnie
ujemne tu zliczamy elementy ujemne
zera tu zliczamy elementy zerowe
Licznik i musimy za każdym obrotem pętli zwiększyć o 1 (doszedł kolejny element), natomiast pozostałe liczniki zwiększamy tylko wówczas jak dany element jest z danej kategorii. Np. jeśli w danym obrocie pętli pobierzemy -56 to w tym obrocie musimy zwiększyć licznik ujemne (o 1).
Zad.3.
Napisać program sumujący elementy ciągu (a).
Należy pobrać od użytkownika (w trybie dialogowym) ciąg liczb niezerowych-zero kończy pobieranie i zsumować jego elementy.
Wynik wyświetlić na ekranie w postaci:
"Suma N elementów ciągu (a) wynosi: S"
gdzie w miejscu N, S mają wyświetlić się konkretne liczby odpowiednio liczba elementów ciągu i suma tych elementów.
Zad.4.
Napisać program obliczający iloczyn elementów ciągu (a).
Należy pobrać od użytkownika (w trybie dialogowym) ciąg liczb niezerowych-zero kończy pobieranie i obliczyć iloczyn jego elementów.
Wynik wyświetlić na ekranie w postaci:
"Iloczyn N elementów ciągu (a) wynosi: I"
gdzie w miejscu N, I mają wyświetlić się konkretne liczby odpowiednio liczba elementów ciągu i iloczyn tych elementów.
Zad.5.
Napisać program obliczający sumę arytmetyczną elementów ciągu (a).
Należy pobrać od użytkownika (w trybie dialogowym) liczbę całkowitą N (>0), a następnie ciąg N liczb.
Wynik wyświetlić na ekranie w postaci:
"Suma arytmetyczna ciągu (a) wynosi: SA"
gdzie w miejscu SA ma wyświetlić się konkretna liczba będącą sumą arytmetyczną ciągu (a).
Uwaga:
Suma arytmetyczna (SA): SA=S/N, gdzie S- suma elementów, N- liczba elementów
Zad.6.
Napisać program obliczający elementy ciągu (an), podanego wzorem
3n2+n+2, dla n parzystego
an =
-n+5n3+7, dla n nieparzystego
Należy pobrać liczbę elementów ciągu N (>0), następnie wyliczyć i wyświetlić elementy ciągu w postaci:
a1=.....
a2=.....
a3=....
.........
an=.....
gdzie w miejscach wykropkowanych należy wyświetlić konkretne wartości.
Zad.7.
Napisać program obliczający N- ty element ciągu (an), podanego wzorem rekurencyjnym
ak= 2ak-1+5, gdzie 1<=k<=N
i wyświetlający wynik na ekranie.
Należy pobrać od użytkownika liczbę N( N>0), oraz element a0-pierwszy element ciągu.
Rozwiązanie:
Musimy mieć pomocniczą zmienną, żeby przechować w niej poprzedni element.
Pobieramy od użytkownika a0-POPRZEDNI, w k- tym kroku obliczamy NASTĘPNY (ze wzoru) i do POPRZEDNI przepisujemy NASTEPNY.
Zad.8.
Napisać program obliczający N- ty element ciągu (an), podanego wzorem rekurencyjnym
ak= 5ak-2+ak-1-5, gdzie 2<=k<=N
i wyświetlający wynik na ekranie.
Należy pobrać od użytkownika liczbę N( N>1), oraz elementy a0-pierwszy a1-drugi element ciągu.
Rozwiązanie:
Musimy mieć dwie pomocnicze zmienne, żeby przechować w nich 2 poprzednie elementy. Pobieramy od użytkownika a0-POPRZEDNI0, a1-POPRZEDNI1 w k- tym kroku obliczamy NASTĘPNY (ze wzoru) i do POPRZEDNI1 przepisujemy NASTEPNY, a do POPRZEDNI0 przepisujemy POPRZEDNI1.
ZADANIA DODATKOWE
Zad.1.
Napisać program, który pobiera liczby całkowite (w trybie dialogowym) n i k (0<n<200, 1<k<10) a następnie drukuje n gwiazdek „*” po k w wierszu. Liczby n i k mają być pobrane z wymuszeniem poprawności (do skutku)
Zad.2.
Napisać program, który pobiera liczbę n, a następnie pobiera n liczb xi i drukuje na ekranie największą i najmniejszą z tych liczb.
Zad.3.
Napisać program, który pobiera liczbę n z wymuszeniem by 2<=n<=30, a następnie drukuje n wyrazów ciągu wg wzoru
an=3an-1+2a3n-2 - 20 , gdzie a0=0, a1=1
Zad.4.
Napisać program, który pobiera liczbę n z wymuszeniem by 2<=n<=30, a następnie pobiera n liczb xi i drukuje wartość
Min ( max(xi, xi+1))
0<i<n
TYPY ZMIENNYCH- cd
REAL=(<-1.7e38,1.7e38>,{+, -, *, /, Read[ln], sin, cos, arctan, abs, sqr, sqrt, pi, exp, ln, trunc, round, int, frac}, {<,<=,=,<>,>=,>})
Uwagi:
abs- moduł z liczby: abs(7)=7, abs(-8)=8
sqr- podnosi liczbę do kwadratu: sqr(2)=4
sqrt- pierwiastek kwadratowy z liczby: sqrt(4)=2
pi- stała predefiniowana, pi=3.1415
exp- {exponens} podnosi liczbę "e" do potęgi podanej jako argument: exp(5)=e5
ln- logarytm naturalny z liczby {o podstawie "e"}: ln5=p ≡ 5= ep
trunc- obcina część ułamkową: trunc(3.12)=3
round- zaokrągla do pełnej jedności: round(4.72)=5
int- część całkowita z liczby: int(3.12)=3
frac- część ułamkowa z liczby: frac(3.12)=0.12, frac(x)=x-int(x)
INTEGER=(<-32768,32767>,{+, -, *, /, Read[ln], abs, sqr, div, mod, shl, shr, ord, succ, pred, chr}, {<,<=,=,<>,>=,>, odd})
Uwagi:
ord- funkcja tożsamościowa: ord(4)=4
succ- {successor} następnik, liczba o jeden większa
pred- {predeccessor} poprzednik, liczba o jeden mniejsza
chr- zwraca znak Ascii o podanym kodzie, chr(78)=#78, argumenty <0,255>
odd- bada parzystość, odd(124)=false
BYTE- funkcje i relacje jak w INTEGER, zakres <0,255>
SHORTINT- funkcje i relacje jak w INTEGER, zakres <-128,127>
WORD- funkcje i relacje jak w INTEGER, zakres <0,65535>
LONGINT- funkcje i relacje jak w INTEGER, zakres <-231, 231-1>
CHAR=({#0, #1, #2, ..., #255},{Read[ln],ord, pred, succ},{<, <=, =, <>, >=, >})
Uwagi:
ord- zwraca numer znaku {w kodach ascii}, ord(#45)=45
BOOLEAN=({False,True},{not, or, xor, and, <, <=, =, <>, >=, >, succ, pred, ord})
DEFINIOWANIE TYPÓW (TYPY WYLICZENIOWE I OKROJONE)
W TP możemy definiować swoje typy. Odbywa się to przed (użyciem typów), a więc przed sekcją deklaracji zmiennych. Typy definiujemy po słowie kluczowym TYPE.
TYPE
Mój_typ=definicja_typu;
Przykład:
TYPE
Typ_calkowity=Integer;
VAR
Licz_cal:Typ_calkowity;
A:Integer;
-TYP WYLICZENIOWY stosuje się zwykle dla zbiorów o niewielkiej liczbie elementów, na których nie wykonuje się operacji arytmetycznych.
Definicja:
TYPE
Ident_typu=(lista_identyfikatorów)
Gdzie w liście identyfikatorów specyfikuje się nazwy, tworzące zbiór wartości danego typu wyliczeniowego. Należy pamiętać, że ten sam identyfikator nie może wystąpić więcej niż raz oraz ten sam identyfikator nie może wystąpić w dwu różnych definicjach typu wyliczeniowego.
Przykład:
TYPE
Tydzien=(Pon, WT, Sr, Czw, Piat, Sob, Niedz)
Samochod=(osobowy, dostawczy, ciezarowy)
-TYP OKROJONY służy do ograniczenia zakresów wartości dowolnego typu porządkowego.
Definicja:
TYPE
Ident_typu=stała1 . . stała2;
Gdzie stała1, stała2 są wartościami z zakresu wartości typu, na którego elementach definiowany typ się opiera.
Przykład:
TYPE
Licz1Do100=1..100;
LiteryDuze= 'A' .. 'Z';
TydzRob= Pon .. Sob; {jeśli oczywiście mamy zdefiniowany typ wyliczeniowy o takich elementach}
PROCEDURY I FUNKCJE
są to fragmenty programów, które stosujemy jeśli:
chcemy podzielić program na fragmenty, w celu uzyskania przejrzystości np.: część odpowiedzialna za obranie danych, część obliczeniowa, część wyświetlająca wyniki itd. Szczególnie pomocne jest to przy dużych programach o wielu ekranach kodu
jeśli daną czynność chcemy wykonać kilkakrotnie dla różnych danych
Funkcje różnią się od procedur tym, że mają swoją wartość (podobnie jak zmienne) i można tę wartość wyświetlać, przypisywać innym zmiennym, przekazywać jako parametry do innych procedur, funkcji. Procedury czegoś takiego nie mają.
-PROCEDURY
PROCEDURE nazwa_procedury (parametry);
BEGIN
blok_procedury
END;
Parametry są to jakieś wyrażenia (mogą to być stałe, zmienne), które chcemy wprowadzić do procedury (bądź funkcji) po to aby można było z nich korzystać w bloku procedury (funkcji). Parametrami mogą też być zmienne, którym nadajemy wartość wewnątrz procedury (funkcji) i chcemy by ta wartość widoczna byłą w programie. Parametry możemy deklarować przez "wartość" lub przez zmienną (po słowie var). W pierwszym przypadku mamy niejako odbitkę zmiennej, której wewnątrz procedury (funkcji), możemy zmienić wartość jednak po wyjściu do programu zmienna ta będzie miała wartość sprzed wywołania procedury (funkcji). W drugim przypadku, jeżeli deklarujemy parametr przez zmienną każda zmiana wartości jest zachowana po wyjściu z procedury (funkcji). Przez zmienną powinniśmy deklarować parametry zawsze wtedy gdy
pobieramy od użytkownika jakieś wartości i przekazujemy je dalej do programu
obliczamy wyrażenia, które chcemy przekazać dalej do programu
parametrami są zmienne typów strukturalnych
Po nazwie parametru musi występować typ parametru (po dwukropku). Parametry oddzielamy od siebie średnikiem (chyba że są tego samego typu to przecinkiem).
Przykład:
Napisać procedurę, która oblicza sumę liczb a i b i wynik przekazuje do programu w parametrze Suma.
Rozwiązanie:
PROCEDURE OliczSume(a, b:Real; var suma:real);
BEGIN
suma:= a+ b;
END;
Procedura korzysta ze zmiennych a i b więc muszą one być podane jako parametry. Wyliczona wartość w zmiennej suma aby była widziana w programie musi być podana też jako parametr.
Procedura może być bezparametrowa np. :
PROCEDURE Wyswietl;
BEGIN
WRITELN('Ala ma kota');
END;
Parametry, które używamy podczas deklaracji procedury (funkcji) noszą nazwę parametrów formalnych i są one zastępowane podczas wykonywania programu przez parametry aktualne.
Wewnątrz procedury (funkcji) można deklarować zmienne (lokalne) i jeśli mają taką sama nazwę jak zmienne globalne (zadeklarowane dla całego programu), to wewnątrz procedury (funkcji) zmienne globalne są przesłonięte przez zmienne globalna.
Przykład:
Napisać program, który pobiera od użytkownika 2 liczby a i b, oblicza i wyświetla ich iloczyn.
Rozwiązanie:
PROGRAM Iloczyn;
VAR
a, b, iloczyn:Real;
PROCEDURE ObliczIlocz(a1, a2: Real; var il: Real);
BEGIN
Ilocz:= a1*a2;
END;
BEGIN {programu}
WRITE('podaj pierwszy czynnik:');READLN(a);
WRITE('podaj drugi czynnik:');READLN(b);
ObliczIlocz (a, b, iloczyn);
WRITELN('Iloczyn liczb',a,'i',b,'=',iloczyn);
END.
-FUNKCJE
FUNCTION nazwa_funkcji (parametry):typ_funkcji;
BEGIN
blok_funkcji
END;
Funkcje są określonego typu (prostego) mają swoją wartość. Wewnątrz bloku funkcji musi być co najmniej raz odwołanie do nazewnika funkcji. Funkcja przekazuje wartości do programu przez swój nazewnik i poprzez parametry;
Przykład:
Napisać program, który pobiera od użytkownika 2 liczby a i b, oblicza i wyświetla ich iloczyn.
Rozwiązanie:
PROGRAM Iloczyn1;
VAR
a, b :Real;
FUNCTION Iloczyn(a1, a2: Real):Real;
BEGIN
Iloczyn:= a1*a2;
END;
BEGIN {programu}
WRITE('podaj pierwszy czynnik:');READLN(a);
WRITE('podaj drugi czynnik:');READLN(b);
WRITELN('Iloczyn liczb',a,'i',b,'=',Iloczyn(a,b));
END.
ZADANIA Z WYKORZYSTANIEM PROCEDUR I FUNKCJI
Zad.1.
Zadeklaruj procedurę PobiaerzDane, która pobiera od użytkownika parametry potrzebne do określenia trójmianu kwadratowego i przekazuje je do programu.
Zad.2.
Zadeklaruj procedurę, która otrzymuje w parametrach 2 liczby rzeczywiste a i b i przekazuje do programu liczbę będącą sumą liczb a i b.
Zad.2.
Zadeklaruj funkcję Min2, która dla zadanych 2 wartości rzeczywistych (parametry funkcji) wyda wartość mniejszej z nich.
Zad.3.
Napisać program obliczający min(a, b, c, d, e), gdzie a, b, c, d, e pobrane od użytkownika w trybie dialogowym, wynik wyświetlić na ekranie. W programie należy użyć funkcję Min2 (z zad.1.).
Zad.4.
Zadeklarować funkcję Det2, która dla zadanych 4 wartości rzeczywistych (parametry funkcji) oblicza i wydaje wyznacznik macierzy o tych elementach.
Zad.5.
Napisać funkcję logiczną, która dla zadanych 2 liczb rzeczywistych a, b (parametry funkcji) wyda wartość logiczną zdania "Liczba a jest mniejsza od liczby b".
Zad.6.
Napisać program, który sprawdza czy z podanych trzech liczb można zbudować trójkąt prostokątny. Program pobiera od użytkownika 3 liczby a, b, c (rzeczywiste) i wyświetla komunikat czy
z podanej trójki można zbudować trójkąt
w razie gdy jest to trójkąt czy jest to trójkąt prostokątny
W programie należy użyć:
procedurę pobierającą 3 liczby rzeczywiste a, b ,c
funkcję logiczną sprawdzającą czy z liczb a, b ,c można zbudować trójkąt. Jeśli można funkcja zwraca wartość TRUE
funkcję logiczną, która w przypadku gdy a, b, c - trójkąt zwróci wartość logiczną zdania "Z podanych liczb można utworzyć trójkąt prostokątny"
Uwaga:
Z każdej trójki liczb można zbudować trójkąt, jeżeli każda z nich jest większa od zera oraz spełniony jest warunek trójkąta (każda z liczb jest mniejsza od sumy dwóch pozostałych)
ZADANIA DODATKOWE
Zad.1.
Napisać deklarację funkcji, która dla zadanego -1<x<1(rzeczywistego) i eps (eps>0, b. małe) obliczy i wyda przybliżoną wartość arcsinx z dokładnością do eps.
Uwaga:
1 X3 1*3 X5 1*3*5 X7
arcsinx = x+ -- ---- + ----- ---- + --------- ----- + ............
2 3 2*4 5 2*4*6 7
(obliczenia należy przerwać gdy wartość bezwzględna kolejnego dodawanego składnika jest mniejsza od eps)
Zad.2.
Napisać program, który ma obliczyć wartości wyrażeń:
y3
α = -----------------------------
y2 + √(y4+y2+1)
π3
β = -----------------------------
π2 + √(π4+π2+1)
sin3(x)
γ = -----------------------------
sin2(x) + √(sin4(x)+sin2(x)+1)
v3
δ = -----------------------------
v2 + √(v4+v2+1)
gdzie v, y, x należy pobrać od użytkownika, wynik wyświetlić na ekranie.
Uwagi:
W programie należy zadeklarować procedury i funkcje:
dla pobrania danych
dla obliczenia wyrażeń (jedną dla wszystkich!)
dla wyświetlenia wyników
Zad.3.
Napisać deklarację procedury CzebIter, która dla zadanych x (rzeczywiste), k (byte) oblicza i wyświetla wartość rzeczywistą równą Tk(x)
Uwagi:
Wielomiany Czebyszewa 1-szego stopnia są zdefiniowane zależnościami:
T0(x)=1
T1(x)=x
Ti(x)=2xTi-1(x)-Ti-2(x), dla i>=2
Zad.4.
Napisać program Wielomiany_Czebyszewa, który oblicza i wyświetla k- ty wielomian Czebyszewa w punkcie x. Wartości k (byte), x (real) należy pobrać od użytkownika, wynik wyświetlić na ekranie.
Uwagi:
W programie należy zadeklarować procedury :
dla pobrania danych
dla obliczenia wielomianu (skorzystać z zad.3.)
dla wyświetlenia wyników
Zad.5.
Napisać program rozwiązujący trójmian kwadratowy ax2+bx+c=0. Liczby a, b, c należy pobrać od użytkownika i wyświetlić wynik (bądź komunikat o niewykonalności) na ekranie.
Uwagi:
W programie należy zadeklarować procedury i funkcje:
dla pobrania danych
funkcja zwracająca wartość 0-(brak rozwiązania), 1-(jest rozwiązanie jedno), 2-(są dwa rozwiązania)
dla wyświetlenia wyników
Zad.6.
Napisać program badający podobieństwo trójkątów. Należy pobrać od użytkownika 3 liczby a, b, c będące bokami trójkąta i wyświetlić jeden z dwóch komunikatów: "Trójkąty są podobne", "Trójkąty nie są podobne".
W programie należy wykorzystać:
procedurę pobierającą 3-kę liczb z wymuszeniem by były one bokami trójkąta
funkcję logiczną, która na podstawie a1, b1, c1 i a2, b2, c2, długości boków obu trójkątów (już poprawnych) zwróci wartość logiczną zdania "Trójkąty są poprawne"
Uwagi:
Z każdej trójki liczb można zbudować trójkąt, jeżeli każda z nich jest większa od zera oraz spełniony jest warunek trójkąta (każda z liczb jest mniejsza od sumy dwóch pozostałych)
W funkcji badającej podobieństwo uporządkuj dane tak by było:
a1<=b1<=c1 oraz a2<=b2<=c2 i dopiero potem badaj podobieństwo
Zad.7.
Napisać program, który służy do wyznaczania daty ukończenia urlopu na podstawie danych od użytkownika- informacji o dacie początku urlopu i ilości dni trwania urlopu. Dane wejściowe (pobrane od użytkownika):
d, m, r - całkowite określające początek urlopu; IlDni- całkowite określająca koniec urlopu. Program ma wyświetlić d1, m1, r1 -całkowite będące obliczoną datą zakończenia urlopu.
W programie należy wyodrębnić
Procedurę pobierającą d, m, r oraz IlDni z wymuszeniem poprawności
Procedurę, która dla zadanych m i r wyda do programu liczbę całkowitą IlDniMies oznaczającą ilość dni w miesiącu m roku r.
Procedurę, która na podstawie d, m, r oraz IlDniMies wyda do programu trzy liczby całkowite d1, m1, r1 oznaczające datę zakończenia urlopu.
Uwagi:
Program ma pobierać datę rozpoczęcia urlopu tak długo aż będzie ona poprawna
Program ma pobierać liczbę dni urlopu tak długo aż będzie ona 1<=IlDni<=26 (lub w wersji trudniejszej 1<=IlDni<=42)
TYP TABLICOWY
TYP REKORDOWY
ZADANIA Z WYKORZYSTANIEM TYPÓW TABLICOWEGO I REKORDOWEGO
1
16