Programowanie w języku Pascal - Notatki - Programowanie, Notatki'z Informatyka. Szczecin University of Technology
Norbert_88
Norbert_8812 April 2013

Programowanie w języku Pascal - Notatki - Programowanie, Notatki'z Informatyka. Szczecin University of Technology

DOC (302 KB)
47 strona
429Liczba odwiedzin
Opis
Informatyka: notatki z zakresu programowania dotyczące programowania w języku Pascal.
20punkty
Punkty pobierania niezbędne do pobrania
tego dokumentu
Pobierz dokument
Podgląd3 strony / 47
To jest jedynie podgląd.
3 shown on 47 pages
Pobierz dokument
To jest jedynie podgląd.
3 shown on 47 pages
Pobierz dokument
To jest jedynie podgląd.
3 shown on 47 pages
Pobierz dokument
To jest jedynie podgląd.
3 shown on 47 pages
Pobierz dokument

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

Typy rzeczywiste Nazwa Min. wartość Max. Wartość Cyfry

znaczące Zużycie pamięci

SINGLE 1.5 x 10^–45 3.4 x 10^38 7-8 4 bajty REAL 2.9 x 10^–39 1.7 x 10^38 11-12 6 bajtów DOUBLE 5.0 x 10^–324 1.7 x 10^308 15-16 8 bajtów EXTENDED 3.6 x 10^–4951 1.1 x 10^4932 19-20 10 bajtów COMP –2^63+1 2^63 –1 całkowity 8 bajtów

Typy znakowe Nazwa Min. długość Max. długość Zużycie

pamięci CHAR 1 1 1 bajt STRING 0 255 256 bajtów STRING[długość] 0 długość długość+1

Typy złożone Opis Składnia

Zbiór SET OF typ_całkowity; Tablica jednowymiarowa ARRAY [wymiar] OF typ; Tablica wielowymiarowa ARRAY [w1,w2] OF typ; Rekord RECORD lista_pól; END; Plik tekstowy TEXT; Plik elementowy FILE OF typ;

Inne typy Opis Składnia

Logiczny BOOLEAN Wskaźnik bez typu POINTER Wskaźnik z typem ^typ

Instrukcje Pascala Nazwa Składnia Instrukcje proste Wywołanie procedury nazwa_procedury(parametry); Przypisanie zmienna := wyrażenie; Instrukcje złożone Blok BEGIN lista_instrukcji; END; Instrukcja wiążąca WITH rekord DO instrukcja; Wybór prosty IF warunek THEN instrukcja;

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 ... 2

OR Suma logiczna IF (a>=4) OR (a<=1) ... 3 XOR Różnica symetryczna a := b XOR $7F; 3 SHL Przesunięcie w lewo a := b shl 3; 2 SHR Przesunięcie w prawo a := b shr 3; 2 Inne operatory . Wskazanie a := rekord.pole; 1 & Referencja adres := &a; 1 ^ Wyłuskanie b := adres^; 1 typ( ) Wymuszenie typu b := byte(i); 1

Podstawowe operacje na plikach Nazwa Rola Parametr1 Parametr2 Etap

ASSIGN Przyporządkowuje zmiennej rzeczywisty plik na dysku

Zmienna typu plik

Ścieżka dostępu do pliku

1

RESET Otwiera istniejący plik do czytania i zapisu

Zmienna typu plik

Rozmiar elementu (opcja)

2

REWRITE Otwiera nowy plik do zapisu Zmienna typu plik

Rozmiar elementu (opcja)

2

APPEND Otwiera istniejący plik do dopisywania

Zmienna typu TEXT

- 2

READ Wczytuje zmienną z pliku Zmienna typu plik

Zmienna typu element pliku

3

WRITE Zapisuje wartość do pliku Zmienna typu plik

Wartość 3

EOF Sprawdza osiągnięcie końca pliku

Zmienna typu plik

- 3

CLOSE Zamyka plik Zmienna typu plik

- 4

Niektóre zaawansowane operacje na plikach Nazwa (parametry) : typ funkcji Działanie

BlockRead (var Plik: File; var Bufor; Ile: Integer) Czyta blok danych BlockWrite (var Plik: File; var Bufor; Ile: Integer) Zapisuje blok danych FilePos (var Plik): Longint Zwraca pozycję w pliku FileSize (var Plik): Integer Zwraca rozmiar pliku IOResult: Integer Sprawdza czy wystąpił błąd we/wy MkDir (Nazwa: string) Tworzy folder Rename (var Plik; NowaNazwa:string); Zmienia nazwę pliku RmDir (Nazwa: string) Usuwa pusty folder Seek (var Plik; POZ: Longint) Ustawia pozycję w pliku na POZ Truncate (var PlikNietekstowy) Kończy plik na aktualnej pozycji

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

var plik : text;

W ten oto sposób powiadamiamy kompilator, że będziemy korzystać z pliku tekstowego. Jak na razie jednak nie określiliśmy, jaki to będzie plik, ani czy będziemy z niego czytać, czy też pisać do niego. Aby powiązać zmienną plikową z konkretnym plikiem na dysku, używamy instrukcji assign, której składnia jest następująca:

assign(zmienna plikowa, nazwa pliku);

assign(plk, 'dane.txt'); reset(zmienna plikowa);

Analogicznie, jeśli chcemy dane do pliku zapisywać, wywołujemy instrukcję rewrite: rewrite(zmienna plikowa); Po wywołaniu tych instrukcji możemy wreszcie zacząć korzystać z pliku. Po zakończeniu zaś pracy z plikiem, musicie go zamknąć, czyli wywołać instrukcję close: close(zmienna plikowa);

Dla odczytu danych z pliku:

var plk : text; begin assign(plk, nazwa_pliku); reset(plk); { tutaj możemy wykonywać odczyt danych } close(plk); end.

Czytanie pliku do końca

while not eof(plk) do { jak długo nie napotkano końca pliku plk }

instrukcja with... do

with lista zmiennych rekordowych do instrukcja

with osoba do begin writeln(data.dzien); writeln(data.miesiac); writeln(data.rok); end { with osoba }

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 doalbofor 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<=0 y=ln x dla 0<x<=1 y= |x-2| dla x>1 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>0

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;

else instrukcje_inne end

Przykład: W zależności co jest pod zmienną zn typu character, wydrukować informację: duża litera, mała litera, spacja, cyfra, inny znak.

case of zn of ‘a’..’z’ : writeln (‘mala litera’); ‘a’..’z’ : writeln (‘duża litera); ‘ ‘ : writeln (‘spacja’); ‘,’, ‘’,’;’,’.’,’:’ : writeln (‘znak interpunkcyjny’); ‘0’..’9’ : writeln (‘cyfra’); else writeln (‘inny znak’) end {koniec instrukcji case…}

KONSTULTACJE II

Deklaracja listy

type wsk_el_listy = ^element_listy; element_listy = record dane : integer; wsk_nastepnika : wsk_el_listy; end;

Jest to deklaracja typu iteracyjnego (zapętlona), ale to nie jest błąd.

zmienna wskaźnikowa

wsk_i^:=20; adres^ :=3.8; {pod zmienną wskazywaną przez adres podstaw wartoć 3.8} a^ := 'co to?'; {pod zmienną wskazywaną przez a podstaw napis 'co to?'} writeln (adres^, a^); {wydrukuj zmienną wskazywaną przez adres i zmienną zmienną wskazywaną przez a}

typ wskaźnikowy

type wek=array[1..5] of string; auta=record marka : string; rocznik : integer; cena : real; end; var

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 !!!}

Z tego faktu wynika jeszcze jedno - każdy element z wyjątkiem pierwszego i ostatniego musi mieć dwóch sąsiadów - czyli oba wskaźniki w nim umieszczone są różne od nil.

Natomiast przy drzewie zależność ta nie jest spełniona. Po pierwsze: element może mieć jednego, dwu, lub nie mieć wcale sąsiadów (w tym przypadku może lepiej nazwać ich węzłami). Po drugie, jeżeli A wskazuje na B, to B nie może wskazywać na A.

funkcja

Definicja funkcji jest następująca:

function nazwa (par1,par2 : typ1;par2:typ2):typ_wyniku {deklaracje zmiennych lokalnych} begin nazwa:= temp end;

procedura

Definicja procedury:

Procedure nazwa(par1,par2:typ1;par2:typ2;par3:typ3) Deklaracje zmiennych lokalnych Begin działanie jakiegoś programu end;

moduł

Pierwszy zawsze jest nagłówek, a wygląda on następująco:

unit nazwa_modulu;

nazwa_modulu musi być taka sama jak nazwa pliku, w którym pamiętany jest moduł (oczywicie bez rozszerzenia .pas, tzn. moduł o nazwie myszka musi być zapamiętany w pliku myszka.pas

Następnie występuje część opisowa (zwana również częścią interfejsową lub publiczną) modułu:

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.

ZADANIA

type tadres=^trecord trecord=record slowo : string; I. : tadres; end; var glowa : Tadres; aktualny:Tadres; temp: string; begin glowa:=nil; aktualny:=nil; repeat writeln (‘Proszę wyprowadzac slowo: ‘); readln temp; if glowa=nil then begin new (glowa); nlowa^.proszę.:=nil; glowa^.slowo:=temp; aktualny:=glowa; end else begin new (aktualny^.proszę.); aktualny:=aktualny^.proszę.; aktualny^.proszę.:=nil; aktualny^.slowo:=temp; end; until aktualny^.slowo=’.’; wyswietl_liczbe(glowa); kasuj_liste(glowa); readln; end. procedure wyswietl_liste(element: Tadres); begin if element<>nil then begin writeln (‘Element listy : ‘,element^.slowo); wyswietl_liste (element^.I.); end; 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.

b) linię ukośną tuż nad główną przekątną tablicy a. c) linię ukośną tuż nad główną przekątną tablicy a, ale potem nastąpi błąd

wykonania. • – dla i=n nie da się wyznaczyć a[i,i+1], bo nie ma takiego elementu, więc tu się

program „wyłoży”. 7. Chcemy wypełnić tablicę A[1..n] liczbami >10 wczytywanymi z klawiatury, pomijając

pozostałe. Która konstrukcja jest niepoprawna? a) for I:=1 to n do begin readln(x); if x>10 then A[I]:=x end; b) for I:=1 to n do repeat readln(A[I]) until A[I]>10; c) I:=1; repeat readln(x); if x>10 then begin A[I]:=x; I:=I+1 end; until I>n; • – w takim przypadku niektóre miejsca w tablicy pozostałyby niewypełnione!!!;

trzeba zastosować tu konstrukcję b) lub c). 8. Co można wczytać z pliku tekstowego:

a) tylko teksty (napisy), czyli kolejne wiersze pliku b) liczby, znaki lub teksty – to zależy od instrukcji wczytywania. c) tylko znaki.

b) – oczywiście można wczytać różne dane, typ zmiennej wczytywanej określa, co wczytujemy. 9. Który nagłówek funkcji jest prawidłowy?:

a) function wynik(A,B:Tab; nazwa:string); b) function wynik(A,B:Tab; nazwa:string): integer; c) function wynik(A,B:Tab, nazwa:string): integer;

b) – w nagłówku a) brak typu wyniku funkcji, zaś w nagłówku c) jest przecinek zamiast średnika. 10. Co możemy powiedzieć o instrukcji readln(pwe, a, b, c);

a) wczytuje cztery zmienne pwe,a,b,c z klawiatury. b) wczytuje zmienne a,b,c z pliku określonego przez zmienną plikową pwe. c) nic takiego nie możemy powiedzieć, jeśli nie wiemy, jakiego typu jest zmienna

pwe. • – jeśli pwe jest zmienną plikową, to znaczy, że czytamy z pliku pwe, a jeśli pwe

nie jest zmienną plikową, to znaczy, że z klawiatury wczytujemy cztery zmienne (nazwy nie są istotne).

11. Co oznacza poniższe odwołanie: (zmienna glowa jest początkiem listy, pole a elementu listy jest wektorem [1..10]): glowa^.a[3]

a) Adres trzeciego elementu listy. b) Trzeci element wektora a znajdującego się w pierwszym elemencie listy. c) Odwołanie to jest nieprawidłowe.

b) – pod adresem glowa (czyli w pierwszym elemencie listy) jest rekord, którego polem jest wektor a, zaś a[3] oznacza trzeci element tego wektora (o ile oczywiście jest on indeksowany od 1). 12. Które odwołanie się do pola rekordu znajdującego się w tablicy A (o deklaracji jak

niżej) jest prawidłowe: type Tosoba = record imie: string; end; var A: array[1..20] of Tosoba;

a) A[5].imie := Halina; b) A[5].imie := ‘Halina’; c) A.imie[5] := ‘Halina’;

b) – indeks musi stać przy nazwie tablicy (czyli przy A), zaś łańcuch musi być napisany w apostrofach. 13. Co się stanie, jeśli w treści funkcji nie będzie podstawienia wyniku pod nazwę funkcji:

d) Program z tak zadeklarowaną funkcją się nie skompiluje. e) Program się skompiluje, ale nie da się wykonać. f) Program da się wykonać, ale funkcja nie będzie zwracała wyniku przez swoją

nazwę. • – aby funkcja przekazywała (zwracała) wynik poprzez nazwę, w treści funkcji

musi być podstawienie wyniku pod nazwę funkcji; brak takiego podstawienia jest wyłącznie błędem logicznym.

14. Która deklaracja podprogramu nie pozwoli zwrócić (przekazać wyniku) sumy elementów wektora A typu Twekt? a) procedure (A: Twekt; suma: real); b) procedure (A: Twekt; var suma: real); c) function suma (A: Twekt): real; • – parametr suma nie jest tu przekazywany przez zmienną, więc nie dostaniemy

wyniku za pomocą tego parametru. Natomiast rozwiązania b) i c) są poprawne, można zastosować jedno z nich.

15. Czy da się uruchomić taki program, w którym procedura Proszę wywołuje funkcję F, a funkcja F wywołuje procedurę Proszę: a) Taki program się nie skompiluje. b) Taki program da się uruchomić, ale jeśli nie będzie warunku końca, będzie chodził

w kółko aż do przepełnienia. c) Taki program się skompiluje, ale nie da się uruchomić.

b) – to jest przykład rekurencji pośredniej; program będzie działał, ale procedura powinna mieć warunek końca.

Rozwiązania zadań { UWAGA:

Rozwiązania zostały przedstawione w możliwie najkrótszej formie, wystarczającej na egzaminie

• na ogół bez wydruków zachęcających do podawania danych i bez wydruków komentujących wyprowadzane wyniki.

Pominięto też wiersze: {$APPTYPE CONSOLE} uses

SysUtils;

które są niezbędne, jeśli chcemy uruchomić program w Delphi, ale nie trzeba ich pisać na egzaminie.

W programach nie ma też żadnych komentarzy. Pokazano tylko to, co jest konieczne na egzaminie. }

program zad1;

var a, min, max: real;

I, n: integer;

begin repeat readln (n) until n>0;

readln(a); max:= a; min:= a; for I:= 1 to n-1 do begin readln(a); if a > max then max:= a else if a < min then min:= a; end; readln(a); while a <> 0 do begin if a > max then max:= a else if a < min then min:= a; readln(a); end; writeln (‘max=’, max, ‘ min=’, min); readln end.

program zad2;

const n=3; var plik : text; T : array[1..n,1..n] of string; nazwa, napis: string; i, j : integer; begin writeln (‘Podaj nazwe pliku’); readln (nazwa); assign (plik, nazwa); reset (plik); for I:=1 to n do for j:=1 to n do readln (plik, T[i,j]); close (plik);

assign (plik,’napisy.pas’); rewrite (plik); for I:=1 to n do begin napis:=T[i,i]; case napis[1] of

‘a’..’z’: writeln (plik, napis); end; end; close (plik); end.

{Uwaga 1: w tym programie brak zabezpieczeń, które nie proszę konieczne na egzaminie (nie były sformułowane w treści zadania), a bez których mogą powstawać błędy wykonania. Nie ma sprawdzania, czy plik o wczytanej nazwie istnieje (należałoby zastosować funkcję FileExists). Nie ma sprawdzania, czy w pliku jest dosyć wierszy; należałoby wczytywać proszę. tak:

if not eof(plik) then readln(plik, T[I,j]) else T[I,j]:=’ ‘;

Bez tego jako brakujące dane w tablicy zostaną wstawione łańcuchy puste. I nie ma zabezpieczenia przed sprawdzaniem pierwszego znaku w łańcuchu pustym (który powstaje również wtedy, gdy w tekście jest linia odstępu); powinno być tak:

if napis<>’’ then case ....

Uwaga 2: zamiast:

case napis[1] of ‘a’..’z’: writeln (plik, napis); end;

można napisać po prostu tak:

if (napis[1]>=’a’) and (napis[1]<=’z’) then writeln (plik, napis); } program zad3;

const n=4; type Telement = record x: real; y: string; end; Ttablica = array [1..n] of Telement; var A,B: Ttablica;

procedure wczytaj(var I: Ttablica); var I: integer; begin for I:=1 to n do begin readln(I[I].x); readln(I[I].y); end; end;

procedure drukuj(I: Ttablica); var

I: integer; begin for I:=1 to n do writeln(I[I].x, I[I].y); end;

procedure przepisz(var I: Ttablica); var I,imax: integer; begin imax:=1; for I:=2 to n do if length(I[I].y)>length(I[imax].y) then imax:=I;

for I:=1 to n do if I[I].x>0 then I[I].y:=I[imax].y; end;

begin wczytaj(A); wczytaj(B); drukuj(A); drukuj(B); przepisz(A); przepisz(B); drukuj(A); drukuj(B); readln end.

program zad4;

uses tablica;

var A, B: Tabint;

begin czytaj(A); czytaj(B); writeln(‘w A: ‘,suma_obwod(A,2), ‘ w B: ‘,suma_obwod(B,5)); readln; end. unit tablica;

interface const w=4; k=3; type

komentarze (0)
Brak komentarzy
Bądź autorem pierwszego komentarza!
To jest jedynie podgląd.
3 shown on 47 pages
Pobierz dokument