pascal ROZDZ 1-6.doc

(1145 KB) Pobierz
I

1.      PODSTAWOWE POJĘCIA DOTYCZĄCE PROGRAMOWANIA

 

Komputer to maszyna do wykonywania programów. Aby rozwiązać dowolne zadanie posługując się komputerem należy skonstruować odpowiedni algorytm.

 

Algorytm to dokładny przepis, zbiór instrukcji służących do rozwiązania jakiegoś zadania. Np. algorytm otwierania drzwi mógłby wyglądać tak:

 

naciśnij klamkę

jeśli drzwi się otworzą

              udało się – koniec

w przeciwnym razie

              włóż do zamka klucz, przekręć w lewo i naciśnij klamkę

              jeśli drzwi się otworzą

                            udało się – koniec

              w przeciwnym razie

                            nie udało się – koniec.

 

Każdy algorytm składa się z dwóch zasadniczych części: opisu danych, na których działa, oraz opisu czynności, które są wykonywane na tych danych. Czynności te opisane są za pomocą odpowiednich instrukcji języka.

 

Sposoby zapisu algorytmów:

1.      Najprostszy sposób zapisu to zapis słowny - pozwala określić kierunek działań
i odpowiedzieć na pytanie, czy zagadnienie jest możliwe do rozwiązania (np. powyżej podany algorytm otwierania drzwi)

 

  1. Bardziej konkretny zapis to lista kroków. Staramy się zapisać kolejne operacje
    w postaci kolejnych kroków które należy wykonać.

 

Budowa listy kroków obejmuje następujące elementy

    1. sformułowanie zagadnienia (zadanie algorytmu)
    2. określenie zbioru danych potrzebnych do rozwiązania zagadnienia (określenie czy zbiór danych jest właściwy)
    3. określenie przewidywanego wyniku (wyników): co chcemy otrzymać i jakie mogą być warianty rozwiązania
    4. zapis kolejnych ponumerowanych kroków, które należy wykonać, aby przejść od punktu początkowego do końcowego

 

  1. Bardzo wygodny zapis to zapis graficzny w postaci schematów blokowych

Np. Algorytm dzielenia dwóch liczb naturalnych

 

 

Rodzaje algorytmów:

 

·         Algorytm liniowy

 

         Ma postać ciągu kroków które muszą zostać bezwarunkowo wykonane, jeden po drugim.

         Algorytm taki nie zawiera żadnych warunków ani rozgałęzień: zaczyna się od podania zestawu danych, następnie wykonywane są kolejne kroki wykonawcze, aż dochodzimy do wyniku

Np. dodanie lub mnożenie dwóch liczb

 

  1. Sformułowanie zadania: oblicz sumę dwóch liczb naturalnych a,b.
    Wynik oznacz przez S.
  2. Dane wejściowe: dwie liczby a i b
  3. Cel obliczeń: obliczenie sumy  S = a + b
  4. Dodatkowe ograniczenia: sprawdzenie warunku dla danych wejściowych np. czy a, b są naturalne.

Ø      Ale sprawdzenie takiego warunku sprawia że algorytm przestaje być liniowy

 

 

·         Algorytm z rozgałęzieniem

 

Większość algorytmów zawiera rozgałęzienia będące efektem sprawdzania warunków. Wyrażenia warunkowe umożliwiają wykonanie zadania dla wielu wariantów danych i rozważanie różnych przypadków.

  1. Sformułowanie zadania
    Znajdź rozwiązanie równania liniowego postaci a • x + b = 0.
    Wynikiem jest wartość liczbowa lub stwierdzenie dlaczego nie ma jednoznacznego rozwiązania.
  2. Dane wejściowe
    Dwie liczby rzeczywiste a i b
  3. Cel obliczeń (co ma być wynikiem)
    Obliczenie wartości x lub stwierdzenie, że równanie nie ma jednoznacznego rozwiązania.

         gdy a = 0   to sprawdź czy b = 0, jeśli tak to równanie sprzeczne lub tożsamościowe

         gdy a ≠ 0  to oblicz x = -b/a

 

 

·         Algorytm z powtórzeniami

 

Powtarzanie różnych działań ma dwojaką postać:

         liczba powtórzeń jest z góry określona (przed rozpoczęciem cyklu)

Ø      najczęściej związany z działaniami na macierzach

         liczba powtórzeń jest nieznana (zależy od spełnienia pewnego warunku)

Ø      najczęściej związany z obliczeniami typu iteracyjnego

 

 

Program komputerowy – to zapis algorytmu w języku zrozumiałym dla komputera (w języku programowania). Ten język składa się z samych zer i jedynek (kod binarny – kod dwójkowy, za pomocą ośmiu 0 lub 1 tzw. bitów pozwala zapisać liczbę całkowitą od 0 do 255). Język taki nie jest wygodny
w użyciu, dlatego do pisania programów komputerowych stworzono języki programowania (C, Pascal, Fortan, Logo, Basic, itd.)

Tekst programu (czyli kod źródłowy) podlega ścisłej gramatyce i ortografii danego języka – zamiana jednej litery zwykle spowoduje, że program nie będzie działał, tzn. zwykle nie da się go nawet skompilować.

 

Kompilacja to zamiana kodu źródłowego na binarny (tj. zera i jedynki), wykonywalny przez komputer. Dokonuje tego program komputerowy zwany kompilatorem. Jeśli „nie rozumie” jakiegoś słowa
w kodzie źródłowym, bo np. end zamieniliśmy na edn, to poprostu odmówi kompilacji zgłaszając błąd.
Niestety zdarzają się również błędy, które przechodzą przez proces kompilacji, ale powodują, że skompilowany program nie działa dokładnie według intencji autora. Takie błędy bywają trudne do wyśledzenia, szczególnie, gdy ujawniają się tylko np. w rzadko używanych funkcjach i specyficznych sytuacjach. Mówi się o nich bugs (insekty, pluskwy). Nazwa pochodzi z czasów pierwszych komputerów budowanych na lampach i zajmujących ogromne pomieszczenia. Ich programowanie polegało na przełączaniu kabelków, a zwarcia (czyli błędy) powodowały czasem ginące wśród nich ćmy.

 

Nawet dziś fachowcy uważają, że nie ma większych programów całkowicie wolnych od błędów.

Testowanie programów (czyli wykrywanie błędów) jest co najmniej tak samo kosztowne i pracochłonne jak ich pisanie. Stąd pojawiające się często darmowe „wersje beta”, czyli programy nie przetestowane do końca – ich udostępnianie związane jest z nadzieją że resztę błędów znajdą użytkownicy.

 

Ważne jest rozgraniczenie dwóch postaci programu komputerowego:

 

Kod źródłowy, wygląda jak przykład:

var i: Integer;

begin

              i:=1;

              repeat

                 begin

                    writeln(i);

                    i:=i+1;

                 end;

              until i>10;

end.

 

Żeby uruchomić program, kod źródłowy trzeba najpierw skompilować, czyli stworzyć program wykonywalny.

 

Program wykonywalny – (kod wynikowy), to postać binarna, czyli nadająca się do uruchamiania
i używania programu, ale nie do analizy jego działania.

 

Od pewnego czasu coraz większego znaczenia nabiera (głównie dzięki Internetowi) idea „otwartych źródeł”, wg. której każdy użytkownik powinien mieć prawo wglądu w kod źródłowy programu, którego używa, a nawet jego modyfikacji, czyli dostosowania do własnych potrzeb. Jednak w przypadku komercyjnych programów i systemów operacyjnych kod źródłowy bywa wciąż pilnie strzeżoną tajemnica producenta, a użytkownik dostaje wyłącznie programy wykonywalne (czyli 0 i 1).

 

Proces obliczeniowy (ang. Computational process) – abstrakcja zamieszkująca komputer. W trakcie swojego życia procesy korzystają z innych abstrakcyjnych obiektów zwanych danymi. Życie procesu przebiega zgodnie z zestawem reguł zwanym programem. Ludzie tworzą programy, aby sterować procesami. Proces obliczeniowy jest czymś czego nie możemy ani zobaczyć, ani dotknąć. Może on wykonywać prace intelektualne, potrafi np. odpowiadać na pytania czy sterować ramieniem robota. Programy, których używamy, aby okiełznać procesy składają się ze starannie dobranych symbolicznych wyrażeń języka programowania. Każdemu procesowi przydzielone zostają zasoby, tj. procesor, pamięć, dostęp do urządzeń wejścia-wyjścia, pliki. Za zarządzanie procesami odpowiada jądro systemu operacyjnego.

 

Język programowania to usystematyzowany sposób przekazywania komputerowi poleceń do wykonania.

Język programowania pozwala programiście na precyzyjne przekazanie maszynie, jakie dane mają ulec obróbce i jakie czynności należy podjąć w określonych warunkach.

Języki programowania dzieli się na: imperatywne, obiektowe, funkcyjne, logiczne i inne.

Najpopularniejszymi językami programowania są: Turbo Pascal, C, C++, Delphi, Java.

 

Debugger (odpluskiwacz) – program komputerowy służący do analizy kodu źródłowego lub kodu maszynowego w celu znalezienia w nim błędów programistycznych (bugów). Proces naprawy kodu za pomocą debuggera określa się mianem debugowania, lub bardziej po polsku – uruchamiania.

Podstawowym zadaniem debugera jest symulowanie i sprawowanie kontroli nad wykonaniem kodu, co umożliwia zlokalizowanie instrukcji odpowiedzialnych za wadliwe działanie programu. Współczesne debugery mają rozbudowane opcje, które pozwalają na efektywne śledzenie wartości poszczególnych zmiennych, wykonywanie instrukcji krok po kroku czy wstrzymywanie działania programu
w określonych miejscach.

Debuger jest standardowym wyposażeniem każdego środowiska programistycznego. Niektóre z tych środowisk pozwalają ustawić w kodzie źródłowym punkty wstrzymania, dzięki czemu programista może śledzić m.in. wartości wskazanych zmiennych.

Debuger może również funkcjonować jako niezależny program.

Debugery, oprócz ich podstawowego przeznaczenia są często wykorzystywane także do łamania zabezpieczeń oprogramowania (crackingu).

Debugery posiadają niestety wady – symulacja działania kodu nie jest idealnym odtworzeniem wykonania tego kodu w warunkach normalnych. Wobec tego debugery mogą nie wykrywać bugów niezależnych bezpośrednio od treści badanego programu.

 

Interpreter - to rodzaj programu komputerowego (translatora), który analizuje kod źródłowy
a przeanalizowane fragmenty (zazwyczaj jedna instrukcja) są wykonywane. Wykonanie powtórnie tego samego fragmentu wymaga powtórnej analizy. Jest to działanie przeciwne do kompilatora, który nie wykonuje wejściowego programu (kodu źródłowego) lecz tłumaczy go do wykonywalnego kodu maszynowego, który jest zapisywany do pliku w celu późniejszego wykonania. W większości przypadków jest możliwe wykonanie tego samego kodu źródłowego zarówno bezpośrednio przez interpreter jak i przez kompilację i wykonanie wygenerowanego kodu źródłowego.

Wykonanie programu za pomocą interpretera zajmuje więcej czasu niż wykonanie skompilowanego kodu, lecz może zająć mniej czasu niż kompilacja i uruchomienie. Jest to zwłaszcza ważne przy tworzeniu i testowaniu kodu kiedy cykl edycja – interpretacja – debugowanie może często być znacznie krótszy niż cykl                                                  edycja – kompilacja – uruchomienie – debugowanie.

 

Interpretacja kodu jest wolniejsza niż uruchamianie skomplikowanego kodu ponieważ interpreter musi analizować każde wyrażenie i następnie wykonać akcję, a kod skompilowany jedynie wykonuje akcję. Ta analiza w momencie uruchomienia jest znana jako „koszt interpretacji”. Dostęp do zmiennych jest także wolniejszy w interpreterze gdyż odwzorowanie identyfikatorów na miejsca pamięci musi zostać dokonane podczas uruchomienia a nie podczas kompilacji. Dlatego niektóre interpretery tworzą dodatkowe dane (np. adresy zmiennych) przyspieszające wykonanie programu.

 

Konsolidator, inaczej linker lub program konsolidujący – jeden z programów składowych kompilatora. Konsolidator łączy zadane pliki obiektowe i biblioteki statyczne w program wykonywalny (działająca aplikację). W systemach Unixowych konsolidatorem jest najczęściej plik wykonywalny
o nazwie ld. Sam proces nazywa się konsolidacją.

 

 

2.      PROGRAM I JEGO ELEMENTY

 

Program napisany w Pascalu składa się z nagłówka, bloku i znaku ‘.’ (kropka).

Nagłówek składa się ze słowa program, po którym podaje się nazwę programu.

Blok składa się z opisu danych i części wykonawczej, a kropka kończy tekst programu.



Program NazwaProgramu;              nagłówek programu

uses lista-nazw-modułów;

 





definicje-i-deklaracje;              opis danych

definicje-funkcji-i-procedur;

 



begin                                            blok programu

   instrukcje;

  część wykonawcza

end.

 

 

Przykładowy program:

 

program SumaLiczb;

uses Printer;    {deklarujemy użycie w programie modułu Printer służącego do drukowania}





type Ulamek = record

                                 licznik: Integer;

                                 mianownik: Integer;              definicja typu o nazwie Ulamek

                            end;

 



procedure Suma (ul: Ulamek);

var sum: Ulamek;

begin              deklaracja procedury która             

     {tu następuje sumowanie dwóch ułamków,}              sumuje dwa ułamki             

     {a wynik przypisany jest do zmiennej sum }

end;              część



              opisowa

function SumaLiczbCalkowitych(a,b:...

Zgłoś jeśli naruszono regulamin