/ PROGRAMOWANIE / PROGRAMOWANIE Jak powstaje program komputerowy?. Etapy tworzenia programu. Algorytm Program (kod) źródłowy Kompilacja Plik binarny Łączenie (konsolidacja) Program (kod) wynikowy Rys. A. Od algorytmu do gotowego programu. (.pas,.pp,.c,.cpp, ) * (.ppw,.h, ) (.ow,.obj,.o, ) Binarne pliki nagłówkowe, moduły (.ow,.aw,.o,.a,.obj,.lib, ) (.exe, ) Języki niskiego poziomu (ang. low-level language) zapisane w postaci zdefiniowanych symboli (ang. assembly language) i ustalonej składni odpowiedniki rozkazów procesora; przejście do postaci maszynowej umoŝliwia program tłumaczący tzw. asembler. Języki wysokiego poziomu (ang. high-level language) rozbudowane pod względem składniowym instrukcje (słowa kluczowe, operatory, ) z których kaŝda odpowiada zwykle większej liczbie rozkazów procesora; spośród dość duŝej ilości moŝemy wyróŝnić: C, C++, Pascal, FORTRAN (FORmula TRANslator), COBOL (COmmon Business Oriented Language), ALGOL (ALGOrythmic Language, ALGebraic Oriented Language), Basic (Beginner s All-purpose Symbolic Instruction Code), ; Java, Java Script, Perl, PHP, - języki internetowe i skryptowe; Delphi, Kylix (Pascal), C++ Builder, Visual C++ (C++), Visual Basic (Basic), - języki wizualne oparte na składni standardowego języka.. Podstawowe pojęcia. a) Kompilacja, interpretacja, translacja. KaŜdy program zapisany w języku niskiego bądź wysokiego poziomu naleŝy przetłumaczyć na język maszynowy. W procesie tym ogólnie nazywanym kompilacją tłumaczone są najpierw wszystkie instrukcje, aby następnie uruchomić cały program. Jeśli jednak mamy do czynienia z sytuacją, w której kaŝda instrukcja jest tłumaczona i zaraz potem wykonywana to taki sposób nazywamy interpretacją. Odpowiednio teŝ określamy programy tłumaczące jako kompilator i interpreter. Obydwa powyŝsze procesy jak równieŝ programy określane są jako translacja (kompilacja lub interpretacja) oraz translator (kompilator lub interpreter). b) Syntaktyka i semantyka. Syntaktyka (składnia) języka programowania to zbiór elementów (słowa kluczowe, pojedyncze lub podwójne znaki, ) oraz reguł stosowanych do tworzenia instrukcji ( zdań ). Jeden prosty błąd w składni uniemoŝliwia przeprowadzenie kompilacji programu. W momencie, gdy składnia jest prawidłowa (kompilacja przebiegła prawidłowo) a jednak program nie daje oczekiwanych wyników mamy do czynienia z niepoprawną semantyką programu. Mówimy wówczas o błędach logicznych programu. * Program (kod) źródłowy zapisany (na podstawie algorytmu) tekst programu przy uŝyciu składni wybranego języka programowania. Program (kod) wynikowy nazywany równieŝ kodem maszynowym lub wykonywalnym, plik zawierający rozkazy (instrukcje, polecenia) gotowe do wykonania przez procesor. Kompilacja (ang. compilation) tłumaczenie kodu źródłowego na kod binarny, którego postać zaleŝy od systemu operacyjnego. Łączenie (ang. link editing, linking) łączenie pliku programu głównego z plikami nagłówkowymi, modułami w wyniku czego, powstaje gotowy do uruchomienia program wynikowy; wszystkie łączone pliki występują w postaci binarnej.. Języki programowania. Wśród wielu istniejących języków programowania moŝemy wyróŝnić kilkanaście z umownym podziałem na poziomy: Język maszynowy przedstawione liczbowo (w kodzie dwójkowym lub szesnastkowym) lub zakodowane znakowo rozkazy gotowe do odczytania i wykonania przez procesor; kaŝdy procesor posiada listę rozkazów (od kilkunastu do kilkuset), które potrafi wykonać. * Przed właściwą kompilacją dokonywana jest tzw. kompilacja wstępna prekompilacja (ang. preprocessing). Jednym z jej zadań jest dołączenie do kodu źródłowego plików nagłówkowych, modułów (.ppw,.h, ) przechowujących deklaracje standardowych funkcji i procedur, z których nasz program będzie korzystał. Innym zadaniem kompilacji wstępnej jest zastąpienie wszelkich napisów (deklarowanych na początku programu jako stałe) ich wartościami.
/ PROGRAMOWANIE / PROGRAMOWANIE Środowisko tworzenia programów. Struktura i podstawowe instrukcje programu.. Tworzenie i kompilacja z wiersza poleceń.. Przykładowy program. Po utworzeniu pliku z kodem źródłowym (w dowolnym prostym edytorze tekstu) wydajemy polecenie uruchomienia kompilatora zewnętrznego według poniŝszego schematu: kompilator program.pas <Enter> Szczegóły (w systemie Windows) mogą przedstawiać się następująco: uruchomienie wiersza poleceń: Start Programy Akcesoria Wiersz polecenia przejście do katalogu z programem: >cd c:\document and Settings\user\Moje Dokumenty\programy <Enter> otwarcie pustego pliku program.pas w edytorze edit: >edit program.pas <Enter> wpisanie kodu źródłowego programu tłumaczenie kodu źródłowego na kod wynikowy (program.exe): >fpc program.pas <Enter> Po wykonaniu powyŝszych poleceń w domyślnym katalogu znajdziemy plik program.exe, który moŝemy uruchomić przez wpisanie nazwy i zatwierdzenie klawiszem <Enter>. Na ekranie powinniśmy zobaczyć efekt działania naszego programu.. IDE zintegrowane środowisko programowania. 0 var x,y: integer; writeln( AUTOKALKULATOR ); write( Podaj pierwszą liczbę: ); readln(x); write( Podaj drugą liczbę: ); readln(y); writeln( Suma:,x+y); writeln( RóŜnica:,x-y); writeln( Iloczyn:,x*y); writeln( Iloraz:,x/y:0:); writeln( Dzielenie całkowite:,x div y); writeln( Reszta z dzielenia:,x mod y); a) Przygotowanie IDE (ang. Integrated Development Environment): (na przykładzie środowiska FreePascal FPC.0.0) - instalacja programu (fpc-.0.0.i-win.exe); - utworzenie w wybranym miejscu (np. na Pulpicie) katalogu do przechowywania własnych plików konfiguracyjnych i tworzonych programów oraz skopiowanie ścieŝki dostępu do tego katalogu; - utworzenie w wybranym miejscu (np. na Pulpicie) oraz konfiguracja właściwości skrótu do programu fp.exe (karta: Skrót - Rozpocznij w: skopiowana wcześniej ścieŝka dostępu oraz Zmień ikonę, karta: Opcje - Opcje wyświetlania: Pełny ekran, karta: Układ - Rozmiar buforu ekranu: Wysokość: ). b) Podstawowe operacje w zintegrowanym środowisku: - otwarcie nowego dokumentu (File New); - otwarcie istniejącego dokumentu (File Open F); - zapisanie dokumentu (File Save F); - zapisanie dokumentu pod inną nazwą (File Save as ); - tłumaczenie, kompilacja programu (Compile Compile Alt+F); - uruchomienie programu (Run Run Ctrl+F); - przechodzenie między okienkami (Window Next/Previous F/Shift+F); - zamknięcie okienka (Window Close Alt+F); - koniec pracy z programem (File Exit Alt+X).. Podstawowe elementy programu. a) Początek () i koniec () programu. b) Deklaracja zmiennych (): Po słówku var rozpoczynającym deklarację umieszczamy nazwy zmiennych (x, y) a następnie określamy typ danych (integer), czyli zakres wartości, jakie będą mogły przyjmować zmienne. Dostępne typy danych liczbowych zawierają poniŝsze tabele. Liczby całkowite Typ Zakres Długość [B] Byte 0.. Shortint -.. Word 0.. Integer -.. Longint -.. Cardinal 0.. Int -, 0.., 0 Qword 0.., 0 Liczby rzeczywiste Typ Zakres* Długość* [B] Single,E-..,E (-) Real (Double),0E-..,E0 (-)
/ PROGRAMOWANIE / PROGRAMOWANIE Extended,E-..,E 0 (-0) Comp -E-+.. E- (-0) c) Wypisywanie tekstu oraz wartości zmiennych lub wyraŝeń na standardowe wyjście, czyli ekran (-,, -). Podejmowanie decyzji instrukcja wyboru IF.. Struktura i działanie instrukcji. d) Odczytywanie danych ze standardowego wejścia, czyli klawiatury (,, ). e) Operatory arytmetyczne: Operator Operatory arytmetyczne Działanie IF warunek THEN instrukcja ELSE instrukcja; T instrukcja warunek N instrukcja + Dodawanie Odejmowanie * MnoŜenie / Dzielenie rzeczywiste div Dzielenie całkowite, np. div = mod Reszta z dzielenia całkowitego, np. mod = IF warunek THEN instrukcja; T instrukcja warunek N f) Średnik (;) na końcu instrukcji oraz kropka (.) na końcu programu. g) Zmiana sposobu wyświetlania liczb rzeczywistych: writeln( Iloraz:,x/y:0:); Jeśli warunek jest prawdziwy to wykonywana jest instrukcja umieszczona za słówkiem THEN (instrukcja), w przeciwnym wypadku warunek nieprawdziwy będzie wykonana instrukcja po słówku ELSE (instrukcja). Część instrukcji od słówka ELSE jest opcjonalna.. Przykładowy program. 0 var l,d,r: integer; writeln( PODZIELNOŚĆ LICZB ); write( Podaj liczbę: ); readln(l); write( Podaj dzielnik: ); readln(d); r:=l mod d; if r=0 then writeln( Liczba PODZIELNA ) else writeln( Liczba NIEPODZIELNA );. Elementy programu. a) Operacja i operator przypisania (:=). W instrukcjach przypisania wartość stojąca po prawej stronie operatora jest przypisywana do zmiennej stojącej po jego lewej stronie. Jeśli po prawej stronie znajduje się wyraŝenie to przed przypisaniem będzie obliczone (np. r:=l mod d).
/ PROGRAMOWANIE / PROGRAMOWANIE b) Operacja i operatory porównania: Operatory relacji Operator Działanie = Równy <> RóŜny < Mniejszy > Większy <= Mniejszy lub równy >= Większy lub równy c) Deklaracja modułów: Moduł to zewnętrzny plik z opisem dodatkowych funkcji. Dołączenie go do tworzonego przez nas programu pozwala na korzystanie z tych funkcji. Moduły dołączamy za pomocą słówka uses, po którym podajemy nazwę modułu. MoŜemy dodać większą ilość modułów rozdzielając ich nazwy znakiem przecinka. Przykład deklaracji modułu oraz uŝycia niektórych jego funkcji poniŝej. uses crt; clrscr; { funkcja do czyszczenia ekranu } textcolor(blue); { funkcja do ustalenia koloru tekstu } Instrukcja wielokrotnego wyboru CASE.. Przykładowy program. 0 0 var x,y: integer; zn: char; writeln( PROSTY KALKULATOR ); write( Podaj pierwszą liczbę: ); readln(x); write( Podaj drugą liczbę: ); readln(y); write( Podaj znak działania (+,-,*,/,d-dziel.całk.,m-reszta : ); readln(zn); case zn of + : writeln( Suma:,x+y); - : writeln( RóŜnica:,x-y); * : writeln( Iloczyn:,x*y); / : writeln( Iloraz:,x/y:0:); d, D : writeln( Dzielenie całkowite:,x div y); m, M : writeln( Reszta z dzielenia:,x mod y); else writeln( Podałeś nieprawidłowy znak ); d) Instrukcja złoŝona: IF r=0 THEN textcolor(red); writeln( Liczba ); end else textcolor(blue); writeln( Liczba ); ĆWICZENIA. Korzystając z instrukcji IF napisz program, który spośród liczb podanych przez uŝytkownika wypisze największą (najmniejszą).. Uporządkuj rosnąco i wypisz na ekran liczby podane przez uŝytkownika.. Opis instrukcji. Instrukcja case umoŝliwia wybór (tutaj spośród sześciu operacji) polecenia w zaleŝności od wartości zmiennej (zn) umieszczonej między słowami case i of. Jeśli zmienna zn przyjmie wartość róŝną od zdefiniowanych (tutaj róŝną od: +,-,*,/,d,d,m,m) wówczas program wykona instrukcję umieszczoną po słówku else. Zakończenie instrukcji case stanowi słówko end. Słowo else i występujące za nim polecenie () są opcjonalne, tzn. mogą nie wystąpić. Zmienna, na podstawie której dokonujemy wyboru moŝe być takŝe liczbą całkowitą (ćwicz. ). Oprócz pojedynczych znaków ( + ) lub grupy znaków oddzielanych przecinkiem ( d, D ) dozwolone jest takŝe stosowanie zakresu (np.: a.. z ).. Typ znakowy. Zmienna zn jest typu char () co oznacza, Ŝe moŝemy w niej przechowywać pojedyncze znaki. W pamięci komputera zmienne tego typu zajmują bajt. ĆWICZENIA. Zastosuj instrukcję CASE w programie wypisującym informacje o ilości dni podanego przez uŝytkownika miesiąca (miesiąc podawany jest w postaci liczb arabskich).. Na podstawie odpowiednich danych oblicz pola, obwody lub objętości wybranych figur geometrycznych (co najmniej trzech).
/ PROGRAMOWANIE 0 / PROGRAMOWANIE Powtarzanie operacji opis instrukcji.. Instrukcja REPEAT. Działanie pętli FOR sprowadza się do wykonania instrukcji umieszczonej po słówku DO tyle razy ile jest kolejnych wartości od wp do wk. Wartości te zmieniają się automatycznie o, rosnąco - jeśli uŝyjemy słówka TO (), malejąco jeśli uŝyjemy słówka DOWNTO (). Jeśli zmienna sterująca i jest typu znakowego (char) to przyjmuje ona kolejne wartości z zestawu znaków ASCII. REPEAT instrukcja(-e); UNTIL warunek; (true /false) T instrukcja(-e) warunek N Działanie pętli rozpoczyna się od wykonania wszystkich instrukcji zawartych między słówkami repeat i until. Następnie sprawdzany jest warunek. Jeśli okaŝe się nieprawdziwy (false) to program wraca na początek pętli i wykonuje instrukcje ponownie. Dzieje się tak do momentu, kiedy warunek okaŝe się prawdziwy (true). Następuje wówczas przejście do kolejnej instrukcji programu (umieszczonej za pętlą REPEAT. Ze względu na sprawdzanie warunku na końcu pętli, instrukcja(-e) zawarte pomiędzy słówkami repeat i until wykonane zostaną co najmniej jeden raz.. Instrukcja WHILE. WHILE warunek DO instrukcja(-e); (true /false) T warunek N instrukcja(-e) Tym razem działanie pętli rozpoczyna się od sprawdzenia warunku. Jeśli jest prawdziwy (true) wykonywane są instrukcje umieszczone po słówku DO i program wraca do ponownego sprawdzenia warunku. W przeciwnym wypadku warunek nieprawdziwy (false) - pętla kończy działanie i program przechodzi do dalszej części programu. Ze względu na sprawdzanie warunku na początku petli instrukcja(-e) umieszczone po słówku DO mogą być zupełnie pominięte.. Instrukcja FOR. FOR i:=wp TO wk DO instrukcja; () FOR i:=wk DOWNTO wp DO instrukcja; ()
/ PROGRAMOWANIE / PROGRAMOWANIE Powtarzanie operacji w programach.. Powtórzenie wykonania programu w zaleŝności od decyzji uŝytkownika. 0 var odp: char; REPEAT instrukcja(-e); write( Koniec programu?(t/n): ); readln(odp); UNTIL (odp= t ) or (odp= T ). Największa i najmniejsza spośród wprowadzanych liczb. 0 var liczba, max, min: integer; writeln( MAX I MIN ); writeln( Wprowadzaj liczby ( 0 kończy wprowadzanie): ); readln(liczba); max:=liczba; min:=liczba; WHILE liczba<>0 DO if liczba>max then max:=liczba else if liczba<min then min:=liczba; readln(liczba); writeln( Max =,max); writeln( Min =,min);. Suma i średnia arytmetyczna. 0 var s,liczba: integer; i: byte; writeln('suma I SREDNIA ARYTMETYCZNA'); writeln(' Wprowadzaj kolejne liczby ("0" - konczy wprowadzanie'); s:=0; i:=; write('x',i,' = '); readln(liczba); WHILE liczba<>0 DO s:=s+liczba; i:=i+; write('x',i,' = '); readln(liczba); writeln(' Suma = ',s); writeln('srednia = ',s/i:0:);. Wypisywanie liczb. a) liczby parzyste i nieparzyste: FOR i:= TO 00 DO write(i*, ); FOR i:=0 DOWNTO DO write(i*-, ); b) liczby Fibonacciego: 0 var n,i: integer; a,b,s: longint; writeln('liczby FIBONACCIEGO'); write('podaj ilosc liczb do wypisania: '); readln(n); a:=0; b:=; write(b,' '); FOR i:= TO n- DO s:=a+b; write(s,' '); a:=b; b:=s;. Rysowanie choinki z gwiazdek. 0 var i,wrs,gw: integer; writeln('choinka Z GWIAZDEK'); write('podaj wysokosc (ilosc wierszy) choinki: '); readln(wrs); FOR i:= TO wrs DO FOR gw:= TO i DO write('*');. Znaki i ciągi znaków. a) litery alfabetu oraz znaki kodu ASCII: var z: char; i: byte; FOR z:= a TO z DO write(z, );
/ PROGRAMOWANIE / PROGRAMOWANIE FOR i:=0 TO DO write(char(i), ); b) tekst rozstrzelony : Przechowywanie danych w tablicach.. Definicja i rodzaje tablic. var s: string; i: byte; writeln('tekst ROZSTRZELONY'); writeln('wpisz dowolny tekst (do 0 znakow):'); readln(s); FOR i:= TO length(s) DO write(s[i],' '); Tablica to zbiór danych tego samego typu (mat. wektor, macierz). Deklaracje oraz wpisywanie wartości do komórek tablicy przedstawiają poniŝsze przykłady. a) Tablice jednowymiarowe. var tl: array[..] of byte; tl[]:=; tl var tz: array[..] of char; tz[]:= a ; tz a ĆWICZENIA. Podaj ile liczb zostanie wypisanych w zadaniu a.. Korzystając z przykładu umieszczonego w punkcie, napisz program rysujący pełną choinkę.. var tz: string[]; tz:= ala ; tz a l a var ts: array[..] of string[]; ts[]:= ola ; tz o l a write( Imie: ); readln(ts[]); Dla ułatwienia pracy z tablicami często umieszcza się wielkość tablicy pod określoną nazwą w części definicji stałych, np.: const max=0; var tl: array[..max] of integer; b) Tablice dwuwymiarowe. var dtl: array[..,..] of integer; dtl[,]:=; dtl[,]:=-; -. Wartości początkowe tablic. Wartości początkowe elementom tablic moŝemy nadać w części deklaracji stałych, np.: const tl: array[..] of byte = (,,,,); const samogloska: array[..] of char = ( a, e, i, o, u, y ); const dtl: array[..,..] of byte = ((,,),(,,)); Wartości te mogą być zmieniane w trakcie działania programu w odróŝnieniu od stałych samodzielnych, np.: const max=; gdzie stała max nie moŝe przyjmować w trakcie działania programu innych wartości.
/ PROGRAMOWANIE / PROGRAMOWANIE Podprogramy procedury i funkcje. Moduł zbiór procedur, funkcji oraz zmiennych.. Ogólna definicja procedury i funkcji. PROCEDURA procedure nazwa_p(parametry); deklaracje; instrukcje; FUNKCJA function nazwa_f(parametry):typ_wyniku; deklaracje; instrukcje; nazwa_f:=wyraŝenie; Zarówno w przypadku procedury jak i funkcji wystąpienie parametrów (argumentów) oraz ewentualnych deklaracji jest opcjonalne.. Definicja i wywołanie podprogramów. 0 0 uses crt; procedure start(t:string[0]); clrscr; writeln(t); function silnia(n:byte):longint; var s:longint; i:byte; s:=; for i:= to n do s:=s*i; silnia:=s; var liczba: byte; start('obliczenia'); write('podaj liczbę naturalną: '); readln(liczba); writeln( Silnia z,liczba, =,silnia(liczba)); Parametry podawane przy definicji procedury lub funkcji nazywamy parametrami formalnymi (,), natomiast parametry podane w momencie wywołania nazywamy parametrami aktualnymi (,). Jeśli deklarujemy zmienne w procedurze lub funkcji to nazywamy je zmiennymi lokalnymi; zachowują one swoje znaczenie tylko w obrębie danej procedury lub funkcji. Zmienne deklarowane poza podprogramami nazywane są zmiennymi globalnymi i obowiązują zarówno w programie głównym jak i we wszystkich procedurach i funkcjach.. Definiowanie modułu. 0 0 unit modul; interface uses crt; procedure start(t:string[0]); function silnia(n:byte):longint; function potega(x,y:byte):longint; implementation procedure start(t:string[0]); clrscr; writeln(t); function silnia(n:byte):longint; var s:longint; i:byte; s:=; for i:= to n do s:=s*i; silnia:=s; function potega(x,y:byte):longint; var p:longint; i:byte; p:=x; for i:= to y- do p:=p*x; potega:=p; end. Po wpisaniu treści modułu zapisujemy go pod taką nazwą, jaką umieściliśmy po słówku unit (program sam dopisze rozszerzenie.pas). Następnie dokonujemy kompilacji. Jeśli nie będzie błędów po tej operacji zostanie utworzony na dysku plik o rozszerzeniu.ppu. Jest to standardowe rozszerzenie nazw plików modułów środowiska FreePascal (w środowisku TurboPascal skompilowane moduły otrzymują rozszerzenie.tpu). Od tego momentu moduł jest gotowy do uŝycia. Modułu nie uruchamiamy poniewaŝ nie jest on programem tylko dołączamy do wybranego programu przy uŝyciu polecenia uses. PoniŜej sposób dołączenia modułu do programu i korzystanie z zawartych w nim podprogramów.. Program z wykorzystaniem modułu. uses modul; var liczba,pot: byte; start('obliczenia'); writeln( SILNIA ); write('podaj liczbę naturalną: '); readln(liczba); writeln( Silnia z,liczba, =,silnia(liczba)); writeln( POTĘGOWANIE ); write('podaj liczbę naturalną: '); readln(liczba);
/ PROGRAMOWANIE / PROGRAMOWANIE 0 write( Podaj potęgę: ); readln(pot); writeln(liczba, do potęgi,pot, =,potega(liczba,pot)); Pliki odczytywanie i zapisywanie danych.. Podstawowe operacje na plikach tekstowych. 0 var d,w: text; l: integer; dodatnie, ujemne: byte; writeln('zliczanie DODATNICH I UJEMNYCH LICZB'); assign(d, dane.txt ); assign(w, wyniki.txt ); reset(d); rewrite(w); while not eof(d) do readln(d,l); if l>=0 then dodatnie:=dodatnie+ else ujemne:=ujemne+; writeln(w, Liczb dodatnich:,dodatnie); writeln(w, Liczb ujemnych:,ujemne); close(d); close(w); W programie deklarujemy zmienne typu text (), aby później skojarzyć je z właściwymi plikami za pomocą instrukcji assign (,). Następnie otwieramy plik do odczytywania danych reset () oraz tworzymy nowy plik do zapisywania danych rewrite (). W trakcie odczytywania danych z pliku stosujemy standardową instrukcję readln (), której pierwszym parametrem jest odpowiednia zmienna plikowa. To samo dotyczy instrukcji zapisywania danych do pliku writeln (,). W trakcie wykonywania operacji na plikach przydatną moŝe okazać się instrukcja sprawdzająca osiągnięcie końca pliku eof (0). Funkcja ta zwraca wówczas wartość true. Po ukończeniu wszelkich operacji na plikach zamykamy je poleceniem close (,).