Docsity
Docsity

Przygotuj się do egzaminów
Przygotuj się do egzaminów

Studiuj dzięki licznym zasobom udostępnionym na Docsity


Otrzymaj punkty, aby pobrać
Otrzymaj punkty, aby pobrać

Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium


Informacje i wskazówki
Informacje i wskazówki

Programowanie w języku Pascal - Notatki - Programowanie, Notatki z Informatyka

Informatyka: notatki z zakresu programowania dotyczące programowania w języku Pascal.

Typologia: Notatki

2012/2013

Załadowany 12.04.2013

Norbert_88
Norbert_88 🇵🇱

4.5

(31)

322 dokumenty

Podgląd częściowego tekstu

Pobierz Programowanie w języku Pascal - Notatki - Programowanie i więcej Notatki w PDF z Informatyka tylko na Docsity!

INFORMATYKA II

PROGRAMOWANIE W JĘZYKU PASCAL

DELPHI 6 BORLAND

Struktura programu w Pascalu

Element Rozpoczyna Kończy Uwagi Nagłówek PROGRAM ; Zawiera nazwę programu Używane moduły USES ; Opcjonalny Deklaracje etykiet LABEL ; Opcjonalny Definicje stałych CONST Opcjonalny Definicje typów TYPE Opcjonalny Deklaracje zmiennych VAR Opcjonalny

Lista instrukcji BEGIN END. Komentarz { lub (* } lub *) Opcjonalny

Rodzaje nagłówków

Nagłówek Zaczyna Kończy się

PROGRAM Program END.

UNIT Moduł END.

PROCEDURE Procedurę END ;

FUNCTION Funkcję END ;

Deklaracje stałych

Typ Znacznik Przykład

Całkowity dziesiętny brak x = 5;

Całkowity szesnastkowy $ x = $FF;

Rzeczywisty kropka dziesiętna x = 5.1;

Znakowy apostrof x = ‘c’;

Znakowy – kody ASCII # x = #32;

Łańcuchowy apostrof x = ‘abcd’;

Łańcuchowy – kody ASCII # x = #13#10;

Zbiór nawiasy kwadratowe x = [1, 2, 3];

Typy całkowite

Nazwa Min. wartość Max. wartość Zużycie pamięci SHORTINT -128 127 1 bajt BYTE 0 255 1 bajt INTEGER -32768 32767 2 bajty WORD 0 65535 2 bajty LONGINT -2147483648 2147483647 4 bajty min..max - okrojony min Max 1-4 bajty (a, b, c) - wyliczeniowy a C 1 bajt

Wybór pełny IF warunek THEN instrukcja ELSE instrukcja2;

Wybór wielokrotny CASE wyrażenie OF wartości: instrukcja; ELSE instruk2; END;

Pętla N-krotna FOR zmienna_całkowita := wart1 TO wart2 DO instrukcja;

Pętla 0..? –krotna WHILE warunek DO instrukcja;

Pętla 1..? –krotna REPEAT lista_instrukcji; UNTIL warunek_końca;

Instrukcje sterowania

Wyjście z bloku BREAK

Powrót z procedury EXIT

Przerwanie programu HALT

Skok do etykiety GOTO etykieta; odradzane

Podstawowe procedury Turbo Pascala

Nazwa Rola Parametry

Procedury wejścia-wyjścia

WRITE Pisze na ekranie Lista wartości do wypisania

WRITELN Pisze na ekranie i zmienia linię

Lista wartości do wypisania

READLN Wczytuje wartość^ z klawiatury^ Zmienna typu prostego

Procedury in- i dekrementacji

INC Zwiększa zmienną o 1 Zmienna całkowita

DEC Zmniejsza zmienną o 1 Zmienna całkowita

Inne procedury

RANDOMIZE Inicjalizuje generator liczb losowych

VAL Zamienia tekst na liczbę Tekst, zmienna docelowa, zmienna zwracająca kod błędu

STR Zamienia liczbę na tekst wg formatu

Wartość, zmienna docelowa

Standardowe funkcje Turbo Pascala

Nazwa funkcji Zwracana wartość Typ parametru Typ wyniku

Funkcje dla liczb całkowitych

LOW Najmniejszy element typu Całkowity Całkowity

HIGH Największy element typu Całkowity Całkowity

PRED Element poprzedzający Całkowity Całkowity

SUCC Element następujący Całkowity Całkowity

RANDOM Wartość^ losowa z podanego zakresu^ Całkowity Całkowity

Funkcje konwersji typów

ROUND Zaokrąglenie Rzeczywisty Całkowity

TRUNC Część całkowita Rzeczywisty Całkowity

CHR Znak ASCII Całkowity Znakowy

ORD Kod ASCII Znakowy Całkowity

Funkcje matematyczne

ABS Wartość bezwzględna Rzeczywisty Rzeczywisty

ARCTAN Arcus tangens Rzeczywisty Rzeczywisty

COS Cosinus Rzeczywisty Rzeczywisty

EXP Potęga liczby e Rzeczywisty Rzeczywisty

FRAC Część ułamkowa Rzeczywisty Rzeczywisty

INT Część całkowita Rzeczywisty Rzeczywisty

LN Logarytm naturalny Rzeczywisty Rzeczywisty

SIN Sinus Rzeczywisty Rzeczywisty

SQR Kwadrat Rzeczywisty Rzeczywisty

SQRT Pierwiastek kwadratowy Rzeczywisty Rzeczywisty

Funkcje znakowe

UPCASE Duża litera Znakowy Znakowy

LENGTH Długość ciągu znaków Łańcuchowy Całkowity

Operatory w Turbo Pascalu

Operator Znaczenie Przykład Priorytet wykonania

Operatory arytmetyczne

  • Zmiana znaku a := -a; 1
  • Mnożenie a := a*b; 2

/ Dzielenie bez reszty

r := a/b; 2

DIV Dzielenie z resztą i := a div b; 2

MOD Reszta z dzielenia i := a mod b; 2

  • Dodawanie a := a+b; 3
  • Odejmowanie a := a-b; 3

Operatory porównania

= Równe IF a = b THEN ... 4

<> Nierówne IF a <> b THEN ... 4

< Mniejsze IF a < b THEN ... 4

<= Mniejsze równe IF a <= b THEN ... 4

Większe IF a > b THEN ... 4

= Większe równe IF a >= b THEN ... 4

IN Należy do IF a IN zbior THEN ... 4

Operatory logiczne i bitowe

NOT Negacja IF NOT (a<4) THEN ... 1

AND Iloczyn logiczny IF (a<4) AND (a>1) THEN ...

Wybrane procedury i funkcje modułu CRT

Nazwa (parametry) : typ funkcji Działanie

CLRSCR Czyści ekran

DELAY (MS : WORD) Wstrzymuje program na MS milisekund

GOTOXY (X, Y : BYTE) Przenosi kursor na pozycję X, Y

KEYPRESSED : BOOLEAN Sprawdza, czy wciśnięto klawisz

NOSOUND Wyłącza dźwięk

READKEY : CHAR Zwraca wciśnięty klawisz

SOUND (HZ : WORD) Włącza dźwięk o częstotliwości HZ

TEXTBACKGROUND (COLOR : BYTE) Ustawia kolor tła na COLOR

TEXTCOLOR (COLOR : BYTE) Ustawia kolor znaków na COLOR

UPCASE (LETTER : CHAR) : CHAR Zamienia literę na dużą literę

WHEREX : BYTE Zwraca pozycję poziomą kursora

WHEREY : BYTE Zwraca pozycję pionową kursora

Wybrane procedury modułu DOS

Nazwa (parametry) Działanie GETDATE (VAR R, M, D, DTYG : WORD) Zwraca aktualną datę GETTIME (VAR G, M, S , SETNA :WORD) Zwraca aktualny czas

Konsultacje I

deklaracja zmiennych

Var b,x : real;

i,j : integer;

albo

var b,x : real;

var i,j : integer;

blok programu

zaczyna się słowem ‘begin’ a kończy się słowem ‘end’

begin

end

deklaracja typu

type nazwa : typ ( np. integer, ^integer, real, inny typ wcześniej

zadeklarowany)

Przykład:

Type Tabl = array [1..10] of integer;

Var A : Tabl;

Przykład

type

liczba_zespolona = record

re, im : real;

end;

var

l1 : liczba_zespolona;

l2 : liczba_zespolona;

otwieranie plików

definicja typu rekordowego

var

l1, l2 : record

re, im : real;

end;

deklaracja stałej typu const

const n=7;

Musi się znajdować zawsze przed deklaracjami, które wykorzystują

zmienna ‘n’.

Przykład:

const=7;

var A : array [1..n] of real;

begin

end.

Instrukcja ‘if … then…(else)’

Przykład

If (x>=a) and (x<=b) then…

Muszą być nawiasy, gdyż logiczne ‘and’ ma priorytet nad operatorami

porównania.

Pętle

for i:=1 to 10 do albo for i:=10 downto 1 do plus blok instrukcji lub

jedna instrukcja. Uwaga : petla if lub wielokrotna pętla if są jedną

instrukcją

Przykład: Zadanie- Dla wartości x=-0,5, -0,4, ... 1,5 drukować

odpowiadające im wartości y, gdzie:

y=x+sin x dla x<=

y=ln x dla 0<x<=

y= |x-2| dla x>

Program wykonać bez użycia tablic.

var x,y : real; i : integer; begin for i:=-5 to 15 do begin x:= i/10; if x<=0 then y:=x+sin(x) else if x<1 then y:=ln(x) else y:=abs(x-2); writeln y; end; end.

repeat.. until

repeat instrukcja; instrukcja; ... instrukcja until warunek

Przykład: czytanie liczby z klawiatury, która jest dodatnia.

repeat readln (k); until k>

while..do..

while warunek do instrukcja

Przykład: czytanie rozmiaru tablicy A[1..k], gdzie k < n, n podane jako const.

readln (k); while k>n do begin writeln (‘Podales zla liczbe’ ‘danych. Podaj wrtosc <=n); end;

case zn of

case selektor of lista_1 : instrukcja_1; lista_2 : instrukcja_2; ... lista_n : instrukcja_n;

wsk_i : ^integer;

wsk_wek : ^wek;

ad_auta : ^auta;

begin

wsk_i^ := 20;

wsk_wek^[3] := 'Joanna';

ad_auta^.cena := 35000;

end.

  • instrukcja, która powołuje do życia zmienną dynamiczną - przydziela

jej pamięć i zapamiętuje jej adres;

  • instrukcja, która odbiera pamięć zarezerwowaną na zmienną

dynamiczną i kasuje jej adres.

Takie dwie instrukcje dostępne są w każdym zaawansowanym języku

programowania, który pozwala na używanie zmiennych dynamicznych.

W Pascalu są to procedury standardowe odpowiednio new(adr) i

dispose(adr). Tak więc :

Procedura new(adr) przydziela pamięć na zmienną dynamiczną takiego

typu, na jaki pokazuje wskaźnik adr i adres tej zmiennej podstawia pod

ten wskaźnik. Jeżeli alokacja (przydział pamięci) się nie powiedzie, np.

Pamięci już nie wystarczy, pod wskaźnik wstawi adres pusty, w Pascalu

oznaczany jako nil (ang. Nic)

Procedura dispose(adr) odbiera pamięć zarezerwowaną na zmienną

dynamiczną pod adresem adr i kasuje ten adres.

Przykład 1:

var

wsk_i : ^integer;

begin

new(wsk_i);

wsk_i^:=20;

writeln('Wartosc wskazywana powiekszona o 5 ', wsk_i^+5);

dispose(wsk_i);

end.

Przykład 2:

Ale już teraz możemy Wam zaprezentować strukturę, która pozwoli nam dynamicznie rezerwować dużą tablicę dwuwymiarową bez niepotrzebnego

deklarowania z dużym zapasem tablicy statycznej. Będzie to tablica wskaźników:

Możemy ją zadeklarować, utworzyć i wykorzystywać w sposób następujący:

const w = 500; k=400;

type tab = array[1..k] of real;

wsk_tab = ^tab;

var A: array[1..w] of wsk_tab ; {A jest tablicą wskaźników}

i, j :integer;

begin

for i:=1 to w do

begin

new(A[i ]); {rezerwujemy pamięć i kolejne adresy wpisujemy do tablicy A}

for j := 1 to k do read (A[i]^[j]); {wczytujemy dane do tablicy A}

end;

...... {teraz działamy na naszej tablicy}

{a teraz zwalniamy całą pamięć - będzie się mogła przydać innym programom}

for i:= 1 to w do dispose (A[i]);

end.

drzewo

Definicja elementu będącego częścią drzewa jest identyczna jak elementu listy dwukierunkowej.

type

wsk_wezel = ^wezel;

wezel = record

wartosc : integer;

w_wezel_lewy : wsk_wezel;

w_wezel_prawy: wsk_wezel;

end;

Różnica pomiędzy listą dwukierunkową a drzewem kryje się w sposobie połączenia elementów. Elementy listy dwukierunkowej pokazują na siebie wzajemnie, tzn. jeśli drugi element wskazuje na trzeci, to trzeci wskazuje na drugi, co w Pascalu wygląda następująco:

A^.nastepny^.poprzedni^.dane = A^.dane;

{zawsze prawdziwe, o ile A nie pokazuje na ostatni, a lista ma co najmniej 2 elementy !!!}

interface

Tutaj musicie umieścić wszystkie definicje stałych i typów, deklaracje zmiennych, deklaracje funkcji i procedur (czyli tylko ich nagłówki), które będą widoczne dla dowolnego programu (lub innego modułu) korzystającego z danego modułu. Aby objaśnić to trochę dokładniej, wprowadzimy nowe pojęcie:

Zasięg zmiennej, funkcji czy też procedury może być globalny, co oznacza, że będzie ona widoczna we wszystkich plikach, do których dany moduł został włączony. Taką zmienną czy procedurę będziemy nazywali eksportowaną. Zasięg może także być lokalny, co oznacza, że dana zmienna, funkcja czy procedura będzie widoczna tylko i wyłącznie w pliku modułu. Jest to rozszerzony odpowiednik zasięgu zmiennych, który już poznaliście w poprzednim segmencie.

Teraz resztę zrozumieć będzie już łatwo: w części opisowej modułu umieszczamy deklaracje zmiennych, funkcji i procedur eksportowanych – i tylko tych.

Część implementacyjna (zwana również częścią prywatną):

implementation

Uwaga: za słowami interface i implementation nie stawia się średnika.

To tutaj zamieszczacie właściwe algorytmy, czyli „ciało” (inaczej definicję, implementację) procedur i funkcji eksportowanych. Tutaj możecie także zadeklarować lokalne zmienne i procedury i korzystać z nich do woli, pamiętając o tym, że nie będą one dostępne gdziekolwiek poza tą częścią modułu.

Ostatnią częścią modułu jest część inicjująca:

begin

{ Tutaj umieszczacie kod wykonywany podczas inicjacji. }

end.

Ten fragment kodu zostanie wykonany zawsze przed pierwszym odwołaniem się do danego modułu (w praktyce w Delphi w momencie startu programu przed wykonaniem się pierwszej jego instrukcji. Moduły są inicjowane w kolejności tej samej, w jakiej występują po słowie uses). Po co? A choćby po to, aby przypisać zmiennym wartości początkowe, zarezerwować pamięć, czy przywitać się z użytkownikiem wyświetlając stosowny komunikat na ekranie.

Przykład:

unit tablica;

{ prosty moduł w Pascalu; zobaczcie w następnym oknie, jak został on dołączony do programu. }

interface

const

w=5;

k=7;

type Tab=array[1..w, 1..k] of real;

{ tutaj tylko nagłówek procedury: }

procedure drukuj(X: Tab; napis: string);

implementation

{ a tutaj implementacja procedury: }

procedure drukuj(X: Tab; napis: string);

{ procedura najpierw drukuje słowo ‘Tablica ‘ i napis typu string, a następnie drukuje wierszami tablicę X typu Tab }

var I,j: integer;

begin

writeln(‘Tablica ‘, napis);

for i:= 1 to w do

begin

for j:= 1 to k do write (X[I,j]:7:2);

writeln;

end;

end;

end.

A teraz program główny; nazwaliśmy go schemat:

program schemat;

{$APPTYPE CONSOLE}

uses

SysUtils,

{ poniższa linia została dodana automatycznie przez Delphi po dołączeniu nowego modułu: }

tablica in ‘tablica.pas’;

var

A, B: Tab;

begin

drukuj(A, ‘A:’);

drukuj(B, ‘B:’);

readln;

end.

procedure kasuj_liste(var element:Tadres);

var temp:Tadres;

begin

while temp<> nil do

temp:=element^.I.;

writeln (‘Usun element listy: ‘,element^.I.);

dispose (element);

element:=temp;

end;

Co z element listy pisze?

Aktualny:=glowa;

repeat

writeln (aktualny^.slowo);

if (aktualny^.proszę.<>nil) and (aktualny^.proszę.^.proszę.<>nil) then

aktualny:=aktualny^.proszę.proszę.^.proszę.^;

else

aktualny:=nil;

unil aktualny=nil

Wstawianie elementu pomiędzy, który jest sumą poprzednika i

następnika:

procedure wstaw (element: tadres);

var temp:tadres;

begin

while element^.I.<> nil do

begin

new(temp);

temp^.slowo:=element^.slowo+element^.I.slowo);

temp^.I.:=element^.I.;

element^.I.:=temp;

element:=temp^.I.;

end;

end.

Algorytm sortowania:

for j:=1 to n-1 do

begin

imin:=j;

for I:=j+1 to n do

if A[I]<imin then

imin:=j

temp:=A[j];

A[j]:=A[imin];

A[imin]:=temp

End

1. Która z poniższych konstrukcji jest niepoprawna , przy założeniu, że zmienna jest_zero

jest typu boolean?

a) if jest_zero then...

b) if jest_zero=true then...

c) if jest_zero=1 then...

  • - bo zmiennej logicznej nie można porównać z liczbą; natomiast obie wersje a) i b) są poprawne i znaczą to samo.

2. Gdzie należy wpisać dane do programu:

a) W oknie, które się otworzy, gdy program zacznie się wykonywać.

b) Na końcu programu, za słowem end z kropką.

c) Po słowie const znajdującym się na początku programu.

  • – dane wpisujemy przecież dopiero, gdy program się uruchomi, nigdy zaś w tekście programu!!! Stałe wpisywane w programie nie są danymi. Dane to coś, co wczytujemy instrukcją read lub readln.

3. Jak sprawdzić, czy x jest zawarte w przedziale <a,b>:

a) if a<=x<=b then...

b) if (x>=a) and (x<=b) then...

c) if x>=a and x<=b then...

b) – nawiasy są konieczne, gdyż inaczej najpierw zadziałałby operator „and” na argumentach sąsiednich, i wynikłby z tego błąd kompilacji.

4. Która z podanych pętli jest równoważna (jeśli chodzi o drukowane wyniki) podanej

konstrukcji: x:=0; repeat x:=x+1; writeln(x); until x > 10; a) for x:=1 to 10 do writeln(x); b) for x:=0 to 10 do writeln(x); c) for x:=1 to 11 do writeln(x);

  • – bo z pętli repeat wyjdziemy dopiero, gdy x będzie większe od 10,

więc ostatnią drukowaną wartością jest 11.

5. Która konstrukcja nie jest równoważna następującej: writeln(a,b,c,d)

a) write(a,b); write©; writeln(d); b) write(a,b,c,d); writeln; c) writeln(a,b); writeln(c,d);

  • – bo po wydrukowaniu wartości a i b nastąpi przejście do nowej linii;

natomiast w przypadkach a) i b) przejście do nowej linii następuje

dopiero po wydrukowaniu wszystkich czterech wartości a,b,c,d.

6. Co wydrukuje następująca pętla: for i:=1 to n do writeln(a[i,i+1]) w

przypadku tablicy a[1..n,1..n]

a) główną przekątną tablicy a.