Instrukcje Wstep do progr lazarus 2011


Wydział Elektrotechniki i Informatyki PRz
Zakład Podstaw Elektrotechniki i Informatyki
Kierunek: Informatyka EF-DI Kierunek: Informatyka EF-ZI
Studia: stacjonarne I-go stopnia Studia: niestacjonarne I-go stopnia
Rok: 1 Rok: 1
Semestr: 1 Semestr: 1
WSTP DO PROGRAMOWANIA
Instrukcje ćwiczeń laboratoryjnych
dr inż. Grzegorz Drałus, dr inż. Antoni Szczepański,
mgr inż. Edyta Gąsior
- 2 -
Spis treści
1. Laboratorium 1.
Przygotowanie do pracy i uruchomienie
kompilatora Lazarus (FreePcal)& & & & & ......... 3
2. Laboratorium 2. Instrukcje, dane strukturalne... 4
3. Laboratorium 3. Procedury i funkcje& & & & & . 6
4. Laboratorium 4. Operacje na plikach& & & & & 8
5. Laboratorium 5. Wskazniki i obiekty& & & & & 10
6. Laboratorium 6. Aplikacje okienkowe & ..& & .. 12
7. Laboratorium 7. Zaliczenie& & & & & & & & & . 14
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 3 -
Zad. 1.4. (operacja podstawiania wartości do zmiennej)
Laboratorium 1
Wczytać program Suma.pas. Uruchomić go. Zamienić
Laboratorium 1 może odbywać się przed wykładem, stąd
wyrażenie a+b podstawianie do c na (a+b)/3. Jaka jest
zadania są szczegółowo opisane.
reakcja kompilatora i jak ją uzasadnić.
Wyjaśnienie: znak ":=" oznacza operację podstawiania pewnej
Przygotowanie do pracy i uruchomienie kompilatora
wartości do zmiennej, której nazwa występuje z lewej strony. Z
Lazarus (Free Pacal).
prawej strony znaku podstawiania może wystąpić jakieś wyraże-
1. Na dysku U: utworzyć folder Pas a w nim folder Lab1.
nie (stałe, zmienne ich kombinacje połączone operatorami) .
2. Przekopiować do niego zawartość foldera P:\Pascal\
Zad. 1.5. (praca krokowa, śledzenie wartości zmiennych)
Lab1.Lazarus.
Wczytać program Sum_2.pas. Wykonać pierwszy krok
3. Uruchomić środowisko (program) Lazarus
śledzenia (F8 lub Uruchom | Przejdz przez). W środowisku
4. Otwórz plik z opcją nowego projektu typu Program
Lazarus trzeba otworzyć okienko śledzenia Widok | Okno
5. Podczas pracy z programem należy pamiętać o czę-
odpluskwiacza | Czujki). Do okna Czujki dodać zmienne
stym zapisywaniu na dysk pliku zródłowego [Ctrl+S]
a, b i c - ustawiamy kursor na oknie Lista czujek i naci-
lub całego projektu (Projekt | Zapisz projekt jako]).
skamy klawisz [Insert] Następnie należy uruchomić pro-
Przy pierwszym zapisie nowego programu należy po-
gram krok po kroku (F8) i śledzić zmiany wartości zmien-
dać sensowną nazwę (Nie "Rysiek1" lecz nazwa, która
nych. Warto wyłączyć opcję optymalizacji: Projekt | Opcje
coś mówi o funkcji programu). Nazwa projektu jest
kompilatora | Kod | Sprawdzaj (zakres, przepełnienie).
równocześnie nazwą programu *.EXE. Przy pisaniu
programów powinno się każdy projekt zapisywać w
Zad. 1.6. (pętla)
osobnym folderze, ze względu na pewną ilość plików
Wczytać program Silnia.pas. Uruchomić go. Następnie w
dodatkowych towarzyszących projektowi.
oknie Czujki umieścić wszystkie 3 zmienne i obserwować
6. Po zakończeniu kolejnego etapu pisania kodu warto
ich zmiany przy pracy krokowej programu.
dokonywać próby kompilacji programu (Uruchom | Bu-
Zad. 1.7. (kontrola zakresu wartości zmiennych)
duj [Ctrl+F9]).
Przy wczytanym programie Silnia.pas i przy wyłączonych
7. Po kompilacji można uruchomić program (Uruchom |
opcjach kompilatora sprawdzających zakres wartości
Uruchom =[F9]), lub wykonywać krok po kroku (Uru-
zmiennych (tak jak to jest domyślnie): Projekt | Opcje kom-
chom | Przejdz przez =[F8] ). Można też samodzielnie
pilatora | Kod | Sprawdzaj  Przepełnienie lub/i Zakres -
ustawić punkty zatrzymań w miejscach, w których chcemy
uruchamiać wielokrotnie program i ustalić dla jakiej warto-
obserwować wartości zmiennych. W tym celu należy ustawić
ści dodatniej n program przestaje działać poprawnie. Usta-
kursor w linii programu, gdzie mamy się zatrzymać i wybrać
lić graniczne wartości n, przy których następuje jakościowa
menu: Uruchom | Odpluskwiacz | Zastaw Pułapkę. a jeszcze
zmiana wyników, np. wyniki ujemne. Włączyć opcje
krócej przez kliknięcie myszy z lewej strony wybranej linii
(przy lewej ramce okna edycji). Linia zaznaczana jest kolo- sprawdzania zakresów (zawsze po zmianie opcji należy
wymuszać ponowną kompilację: Uruchom | Buduj lub
rem czerwonym. Po tym śledzimy program naciskając [F9]
Budui wszystko) i odczytać komunikat po podaniu zbyt
8. Uwaga! nie powinno się przerywać pracy programu za
dużej wartości n. Należy stworzyć dużą tabelę z 3 kolum-
pomocą Alt+F4 (lub [x] w prawym górnym rogu). Za-
nami i w niej notować wyniki prób:
miast tego do przerwania pracy należy używać
N n! R- Q- n! R+ Q+
Uruchom | Zatrzymaj (Ctrl+F2).
3 6 6
Ćwiczenia dla początkujących
22 -522715136 błąd zakresu
Zad. 1.1. (podstawowe elementy programu)
... ... ...
Wczytać program Witaj.pas  w środowisku Lazarus: Plik |
Zad. 1.8.
Otwórz lub ikoną  otwórz . Wybraniu pliku pija iwą się okna
Zapisać projekt Silnia pod inną nazwą. Zmodyfikować
gdzie trzeba wybrać nowy projekt typu Program. Urucho-
program, aby obliczał on wyrażenie n! / m! , gdzie m < n ,
mić program [F9] zielony trójkąt i obejrzeć wynik działania.
czyli iloczyn liczb od (m+1) do n. Prześledzić krokowo pra-
W instrukcji "writeln" pomiędzy apostrofami znajduje się tekst
cę programu. Wypróbować 1000! / 998! (=999000)
do wyświetlenia na ekranie.
Ćwiczenia dla zaawansowanych
Zad. 1.2.
Zad. 1.9. (Złożony warunek przerwania pracy programu)
Zmodyfikować ten program tak aby w jednym wierszu wy-
Dla zad. 1.6 dodać wewnątrz pętli punkt zatrzymania pro-
prowadzał imię i nazwisko studenta.
gramu (Pułapkę) przy spełnieniu warunku s > 500. Jaka
Ćwiczenia dla wszystkich jest wartość zmiennej s po zatrzymania programu? (edycja
 właściwości prawym klawiszem myszki w oknie Pułapki)
Zad. 1.3. (zmienna, typ zmiennej, readln)
Zad. 1.10.
Wczytać program Dodaj.pas. Uruchomić go, wprowadzić
Dla zad. 1.6 dodać wewnątrz pętli punkt zatrzymania pro-
dwie liczby całkowite jako a i b i obejrzeć wyniki działania.
gramu po 2- krotnym spełnieniu warunku s > 20. Jaka jest
Wprowadzić niepoprawne dane (niecałkowite czy nie-
wartość zmiennej s po zatrzymania programu.
liczby jako a czy b. Jaka jest reakcja programu?
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 4 -
Wskazówka: ciąg wartości xi może być w przypadku algorytmu
Laboratorium 2
ciągiem wartości jednej zmiennej. Czyli w ciele pętli będzie
Instrukcje, dane strukturalne
jedna instrukcja x:=(1/2)*(x+A/x), a warunkiem stopu będzie
abs((x*x  A)/A) < 5e-12.
Celem laboratorium jest użycie instrukcji warunko-
wych, wyboru oraz iteracyjnych do tworzenia pro-
Zad. 2.3.
stych programów.
Ą
Napisać program (algorytm) obliczający
1
Na laboratorium należy napisać kilka programów do tema- e =
sumę częściową szeregu uwzględniając

n
2 n!
tów zadań podanych poniżej.
n = 0
M składników. Kolejny obliczany w pętli
Ilość zależy od możliwości studentów..
składnik przechowywać w zmiennej a , sumę częściową
Należy włączać opcje sprawdzania zakresów. Trzeba
szeregu wyznaczać w zmiennej s.
zwracać uwagę na styl pisania algorytmów, np. na wcięcia.
Wskazówka: W rozwiązaniu obliczanie silni n! oraz potęgi licz-
by dwa nie jest konieczne.
Zad. 2.1.
1 1 1
ć Zad. 2.4.
p = 4 - + - + ... .
1
Wyznaczyć sumę 2 liczb dziesiętnych naturalnych N -
Ł ł
3 5 7
cyfrowych. Zakładamy, że N może być dużą liczbą np.
Wyznaczyć przybliżoną wartość p wykorzystując N skład-
N=100. Cyfry argumentów i wyniku zapisane w trzech
ników szeregu (N daną wejściową algorytmu)
tablicach a, b, c tego samego typu (dzięki temu wynik na-
Wskazówka: składniki szeregu można często opisać wzorami,
daje się jako argument do dalszych obliczeń). Cyfra jedno-
1
k
np. tutaj (-1) . Ale dla obliczeń komputerowych lepsze ści występuje pod indeksem 0. Komórki tablic mogą prze-
2k + 1
chowywać tylko wartości 0..9. Wewnątrz pętli ma wystąpić
jest unikanie wzorów i używanie zmiennych pomocniczych. Np.
dodawanie dwóch cyfr 0..9 i przeniesienia 0..1.
jeśli zmienna zn pamięta znak składnika +1 albo -1, a zmienna
Proponowane rozwiązanie
m mianownik, to w ciele pętli mamy instrukcje: su- Zapisz w stałej ilość cyfr: np. const N=4 (dla testów). Zadeklaruj
tablice do przechowywania cyfr  zauważ, że wynik c jest tego
ma:=suma+zn/m; zn:=-zn; m:=m+2;
samego typu co argumenty a, b więc nadaje się jako argument
Podczas testowania wyniku posłuż się stałą pi do-
do dalszych obliczeń: var a, b, c :array [0..N-1 ] of 0..9;
stępną w Pascalu  poniżej wyniku algorytmu wypisz:
Włącz sprawdzanie zakresów. Wpisz tablice a, b, c do okna
writeln( pi );
Czujki. Na początek w celach testowych można wpisać stałe
Ustal eksperymentalnie ile iteracji potrzeba dla uzy- wartości do komórek tablic, np:
a[4] := 1; a[3] := 2; a[2] := 4; a[1] := 9; a[0] := 7;
skania 7 cyfr dokładnych cyfr liczby Ą.
b[4] := 1; b[3] := 3; b[2] := 5; b[1] := 3; b[0] := 2;
Kilka wyników zapisz w tabelce
Zad. 2.5.
N ile cyfr dokładnych Wyznaczyć różnicę 2 liczb dziesiętnych naturalnych N -
cyfrowych (zadanie podobne do 2.4).
21 1
Zad. 2.6.
...
Wyznaczyć wartość maksymalną i wartość maksymalną modułu
elementów tablicy A. Tablica ma N elementów typu rzeczywiste-
Co się stanie jeśli zapiszesz projekt pod nazwą "pi" ?
go tj. A[i] R, i=1..N.
Zad. 2.2.
Zad. 2.7.
Do obliczenia pierwiastka kwadratowego z liczby dodatniej
Dla danej tablicy dwuwymiarowej A[i,j], i,j=1..N wyznaczyć tablicę
A można posłużyć się zależnością:
transponowaną (kolumny zamienione na wiersze)
ć
1 A

xi = xi -1 +
Zad. 2.8.

2 xi -1
Ł ł
Napisać program (algorytmu), który dla danej tablicy kwa-
gdzie xi jest kolejnym przybliżeniem pierwiastka poczyna- dratowej X o indeksach (1..N)x(1..N) ustala poziom jej
symetryczności. Program zwraca iloraz ilości elementów
jąc od dowolnej wartości dodatniej x0, np x0=1. Wyznaczyć
symetrycznych poza główną przekątną (takich, że Xw,k =
przybliżenie pierwiastka spełniające zależność:
Xk,w ) do ilości wszystkich elementów poza główną prze-
2
x - A
i -12
kątną. Czyli dla macierzy symetrycznej wynikiem jest 1.0,
< 5 10
A
jeżeli wszystkie elementy poza przekątną są symetryczne).
Tutaj zamiast wypisywać wynik po zakończeniu pętli wypi-
Zad. 2.9.
suj go w każdym kroku pętli (to jest sposób na śledzenie Tablica T[i], i=0..N zawiera tekst, zaś tablica
W[j], j=0..M zawiera tekst-wzorzec do wyszukania w T[i]. Wy-
programu).
znacz pierwsze miejsce wystąpienia wzorca.
W ilu krokach obliczany jest pierwiastek z 10000?
Uwagi
Wskazówka: w Pascalu 5e-12 jest literałem liczby 5" 10-12.
Dla każdego zadania należy prześledzić zmiany wartości zmien-
|x| to w Pascalu abs(x).
nych uwzględniając co najmniej kilka kroków pętli
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 5 -
Wybrane rozwiązania do Laboratorium 2
writeln;
for i:=1 to n do
program zad2_5; {odejmowanie_liczby 100 cyfrowej};
begin
{$mode objfpc}{$H+}
for j:=1 to n do write(b[i,j],' '); writeln;
const N=4;
end; writeln;
var A,B,C:array[0..N-1]of 0..9;
for i:=1 to n do
roznica,poz,i : shortint;
begin
for j:=1 to n do write(c[i,j],' '); writeln;
Begin
end;
for i:=0 to N-1 do
readln;
readln(A[i]);
END.
for i:=0 to N-1 do
readln(B[i]);
poz:=0;
Program zad2_9; {tablica_wzorzec_zad29 }
for i:=0 to N-1 do
{$mode objfpc}{$H+}
begin
const n=80;
roznica:=A[i]-B[i]-poz;
var wzorzec ,tekst : array[1..n] of char;
if roznica < 0 then begin
m,k,i,j :byte;
roznica:=roznica+10;
pocz :integer;
poz:=1;
Begin
end
write('podaj dlugosc tekstu=');readln(m);
else poz:=0;
for i:=1 to m do readln(tekst[i]);
C[i]:=roznica;
write('podaj dlugosc wzorca=');readln(k);
end;
for j:=1 to k do readln(wzorzec[j]);
for i:=N-1 downto 0 do write(A[i],' ');
i:=1;
writeln;
j:=1;
for i:=N-1 downto 0 do write(B[i],' ');
pocz:=-1;
writeln;
repeat
for i:=N-1 downto 0 do write(C[i],' ');
if tekst[i]=wzorzec[j] then begin
readln;
if j=1 then pocz:=i;
END.
inc(j)
end
program zad2_7; {transpozycja}
else begin
{$mode objfpc}{$H+}
j:=1;
const n=3;
pocz:=-1;
var i,j :byte;
end;
a,b,c :array[1..n,1..n]of integer;
i:=i+1;
Begin
until (i>m)or(j>k);
randomize;
if pocz=-1 then writeln('Nie znaleziono wzorca')
for i:=1 to n do
else writeln('Pozycja wzorca wynosi',pocz);
for j:=1 to n do
for i:=1 to m do write(tekst[i]);writeln;
readln(a[i,j]); //wypelnianie reczne
if pocz > 1 then for i:=1 to pocz-1 do write(' ');
//a[i,j]:=reandom(10); //wyp. autmatyczne
for j:=1 to k do write(wzorzec[j]);
{******************** sposob 1 }
readln;
randomize;
End.
for i:=1 to n do
for j:=1 to n do
b[j,i]:=a[i,j];
{------------------- sposob 2 }
j:=1;
Repeat
i:=1;
repeat
c[j,i]:=a[i,j];
i:=i+1;
until i > n;
j:=j+1;
until j > n;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 6 -
(w programie użyj funkcji lub procedur)
Laboratorium 3
Procedury i funkcje
Zad. 3.4.
Celem laboratorium projektowanie i wykorzystywanie
w programowaniu funkcji i procedur. Zaprogramować rekurencyjny algorytm obliczania silni.
Zad. 3.11.
a) Zmodyfikować program dodawania lub odejmowania N-
Zad. 3.5.
cyfrowych liczb dziesiętnych zapisanych w tablicy (zob.
Program odczytuje liczbę rzymską do łańcucha (string) i
zad.2.4. lub zad.2.5) dzieląc go na części zapisane w pod-
wypisuje jej wartość dziesiętną. Uwzględnić liczby z zakre-
programach: dla const MaxN=4 zadeklaruj typ tablicy do prze-
su: I...MMM. Użyć podprogramu do zamiany znaku rzym-
chowywania cyfr: type TLiczba=array [ 0..MaxN-1 ] of 0..9;
skiego na wartość liczbową. Do konwersji cyfry rzymskiej z
Przenieś algorytm dodawania do function dod(a, b :TLiczba)
tabeli na arabską użyj funkcji. Do konwersji całej liczby
:TLiczba; - wszystkie odwołania do tabl. wynikowej c[ ] zamie-
rzymskie na arabską zaprojektuj drugą funkcje.
nień na Result[ ]. Wypisanie tablicy c[ ] umieść w procedure
Pisz(c :TLiczba); Zamiast wczytywania tablic a (oraz b) użyj
I 1 IV 4 IX 9 C 100
function CzytajA:TLiczba; zamieniając a[ ] na Result[ ] (i ana-
II 2 V 5 X 10 D 500
logicznie w f. CzytajB). W programie nie powinno być żadnych
zmiennych globalnych! W programie głównym będzie tylko
III 3 ... L 50 M 1000
wiersz: Pisz( dod(CzytajA, CzytajB) ); (Włącz spr. zakresów).
Zad. 3.6.
b) Zmodyfikować funkcje czytania i pisania z zad. 3.1a, z
Rok jest przestępny (czyli luty ma 29 a nie 28 dni), gdy
użyciem pętli. Funkcja czytania ma wczytywać ciąg liczb
jego numer dzieli się przez 4, ale nie dzieli się przez 100,
(cyfr 0..9) oddzielony spacjami i zakończony enterem. Czy-
bądz też, gdy dzieli się przez 400. 1 stycznia 1800 przypa-
li np. 9 8 7 6(Enter) będzie czytane w pętli za pomocą
dał w środę. Napisz program, który wczytuje dowolną datę
read(Result[i]), po czym Result[]=(6, 7, 8, 9). (Readln po
(kolejno rok, miesiąc i dzień) i wypisujący jaki to dzień ty-
pętli przeczyta Ennter).
godnia.
c) (L) Zamienić funkcje czytania i pisania z zad. 3.1b, na
(w programie użyj funkcji lub procedur)
- funkcję zamiany łańcucha cyfr, np. '15479' (string) na
Zad. 3.7.
tablicę wartości cyfr (można odejmować kod zera, tj,
Napisz program, w którym funkcja zwraca jako łańcuch
ord('0') lub byte('0') od kodu cyfry aby uzyskać jej wartość).
(String) zapis podanej liczby naturalnej w systemie o pod-
Uzupełniaj zerami puste komórki tablicy.
stawie B.
- funkcję tworzącą dla tablicy cyfr łańcuch znaków (string)
Zad. 3.8.
gotowy do wypisania na ekranie
Napisz program który dokonuje konwersji liczby binarnej
Zad.3.2.
(max długość liczby to 16 bitów) na liczbę dziesiętną. Za-
Liczby rzeczywiste zakodowane w formacie zmiennoprze-
projektuj odpowiednią funkcję konwertującą.
cinkowym należą do skończonego zbioru wartości. Czyli
jest tak mała liczba dodatnia, że mniejsza od niej jest ze-
Zad. 3.9.
rem. Program wyznacza metodą numeryczną - trzeba ją
Napisać program i rekurencyjną funkcję odwracania ciąg
wymyślić - najmniejszą dodatnią liczbę rzeczywistą typu
liter tj. napis. Jeden z parametrów formalnych funkcji jest
Single, Real (=Double) i
type TZnak =
napis typu string oraz indeks typu byte.
Exteneded.
array[1..5] of
string;
Zad.3.3.
Zad. 3.10.
const //lub var
Plik "DuzeZnaki.dpr" zawiera
Napisać program i rekurencyjną funkcję obliczania naj-
WzorZn : array
zalążek programu do druko-
większego wspólnego dzielnika NWD
['A'..'Z'] of
wania banerów tekstowych.
TZnak =(
W tablicy WzorZn zapisane
(
są wzorce znaków 'A'..'Z' .
' ## ',
Wysokość każdego wzorca to
'# # ',
5 wierszy, a szerokość jest
'# # ',
różna, ale dla danego znaku
'#### ',
każdy łańcuch wiersza ma tą
'# # '
samą długość. Uzupełnij al-
),(
gorytm programu
'### ',
P:\Pascal\doc\ DuzeZna-
'# # ',
ki.dpr.
'### ',
'# # ',
'### '
),(
1EF sem. 1, Laboratorium - Wstęp do programowania
...
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 7 -
end;
Wybrane rozwiązania do Laboratorium 3
function dni_tyg(DzTyg:TdzTyg):string;
begin
program zad3_5; {liczby rzymskie}
case DzTyg of
0 : dni_tyg:='Niedz';
{$mode objfpc}{$H+}
1 : dni_tyg:='Pondz';
var rzymska :string;
2 : dni_tyg:='Wtorek';
function cyfra(cyfra_rzymska:char):longint;
3 : dni_tyg:='Sroda';
begin
4 : dni_tyg:='Czwartek';
case cyfra_rzymska of
5 : dni_tyg:='Piatek';
'I','i' : Result:=1;
6 : dni_tyg:='Sobota';
'V','v' : Result:=5;
end;
'X','x' : Result:=10;
End;
'L','l' : Result:=50;
'C','c' : Result:=100;
var r,dni,i :longint;
'D','d' : Result:=500;
d: TDzien;
'M','m' : Result:=1000;
m:TMiesiac;
else Result:=0;
DzTyg: TDzTyg;
end;
BEGIN
end;
write('podaj rok=');readln(r);
function rzymska2arabska(liczba_rzymska:string):longint;
write('podaj miesiac=');readln(m);
var i,akt,pop,wynik :LongInt;
write('podaj dzien=');readln(d);
begin
dni:=d;
wynik:=0;
for i:=1 to m-1 do
pop:=0;
dni:=dni+dni_mies(i);
for i:=length(liczba_rzymska) downto 1 do begin
if przestepny(r)and(m>2) then dni:=dni+1;
akt:=cyfra(liczba_rzymska[i]);
for i:=1800 to r-1 do
if (akt=0) then writeln('Niepoprawna liczba!!!!');
if (przestepny(i)) then dni:=dni+366
if pop > akt then wynik:=wynik-akt
else dni:=dni+365;
else wynik:=wynik+akt;
DzTyg:=(dni+2) mod 7;
pop:=akt;
writeln('To byĆ:',dni_tyg(DzTyg));
end;
writeln('To byĆ:',dt[DzTyg]);
Result:=wynik;
end;
readln
END.
BEGIN
write('Podaj liczbe rzymska:');
program zad3_9; {Rekurencyjne_odwracanie}
Readln(rzymska);
writeln(rzymska2arabska(rzymska));
readln;
{$mode objfpc}{$H+} {$O-,Q+,R+}
END.
Uses SysUtils;
program zad_3_6 {dni_tyg.pas}
function rewers(indeks :integer; tekst :string):string;
{$mode objfpc}{$H+}
begin
type
if indeks <= length(tekst) then
TMiesiac=1..12;
rewers := rewers(indeks+1,tekst) + tekst[indeks]
TDzien =1..31;
else rewers := '';
TDzTyg =0..6;
end;
const dt:array[0..6]of
string[12]=('Niedziela','Poniedzialek','Wtorek',
'Sroda','Czwartek','Piatek','Sobota');
var tekst :string;
i:integer;
function przestepny(rok:longint):boolean;
Begin
begin
i:=1;
przestepny:=false;
//atak, rak, Hetman, ??
if ((rok mod 400)=0) or
write('Podaj tekst='); readln(tekst);
(((rok mod 4)=0) and ((rok mod 100)<>0))
writeln(rewers(i,tekst));
then przestepny:=true;
readln;
end;
function dni_mies(m:TMiesiac):TDzien; end.
begin
case m of
1,3,5,7,8,10,12 :Result:=31;
2 :Result:=28 ;
else Result:=30;
end;
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 8 -
zanków  a i  A . Funkcja zwraca wartość  TRUE jeżeli
Laboratorium 4
liczab znaków  a i  A jest parzysta (zero też jest parzyste)
Operacje na plikach
oraz zwraca wartość  FALSE w przeciwnym przypadku.
Argumentem wejściowym funkcji (s) jest kolejny wiersz
Celem lab. 4 jest praca danymi umieszczonymi w pli-
pliku. Wynik działania funkcji przedstawić na ekranie.
kach dyskowych.
Zad. 4.6.
Program czyta wiersze pliku tekstowego we6.txt. Za każ-
dym razem po napotkaniu wiersza, którego pierwszym
Zad. 4.1.
znakiem jest 'A'..'Z' rozpoczyna łącze-
a) Program czyta kolejne znaki z jednego pliku tekstowe-
to będzie
nie (sklejanie) kolejnych wierszy, roz-
go, zamienia małe litery 'a'..'z' na wielkie a wielkie 'A'..'Z' na
pominięte...
dzielając je spacją. Sklejony wiersz jest
małe i zapisuje do innego pliku.
Wskazówka:
zapisywany do pliku wy6.txt, przy czym
b) Program czyta wiersze pliku tekstowego do łańcucha, Można
na początku w nawiasach jest wpisy-
sklejać wiersze
wywołuje funkcję (parametr: string, zwraca string), która
wana jego ilość znaków. Np. dla
w tymczasowym
przekształca znaki jak opisano w cz. a) i wypisuje na ekra-
we6.txt jak w ramce zawartość pliku
łańcuchu.
nie numer wiersza oraz przekształcony łańcuch.
wy6.txt będzie następująca:
Zapisywać
Zad. 4.2. (56)Wskazówka: Można sklejać wier- przed kolejną
kumulacją.
W pliku tekstowym "liczby.txt" zapisane są liczby rzeczywi- sze w tymczasowym łańcuchu.
ste  po dwie liczby w każdym wierszy oddzielone białymi (34)Zapisywać przed kolejną kumulacją.
znakami. Program czyta te pary liczb i jeśli ich iloczyn jest
większy od zera to zapisuje ten iloczyn do pliku tekstowe-
Zad.4.7.
go "dod.txt". Jeśli iloczyn jest mniejszy od zera to zapisuje
Program czyta plik tekstowy "zad47.lpr" wiersz po wierszu
go do pliku "ujem.txt".
i jeśli we wierszu znajduje się ciąg dwóch ukośników '//' to
zapisuje dalszy ciąg tego wiersza do pliku tekstowego
Zad. 4.3.
"koment.txt". oraz na ekran. Np.
W pliku tekstowym zapisana jest tablica kwadratowa  w
zad47.lpr koment.txt
każdym wierszu pliku jest wiersz tablicy, a kolejne liczby są
program zad4; //zest. 11 zest. 11
oddzielone białymi znakami. Rozmiar tablicy jest mniejszy
function max(a,b :byte):byte; wyzn. większą wartość
od 100 (rozmiar tablicy wynika z ilości liczb we wierszu, co
begin //wyzn. większą wartość
jest równocześnie równe ilości wierszy). Należy odczytać
tą tablicę do tablicy statycznej 100x100 i zapisać taką
Zad.4.8.
transponowaną tablicę do innego pliku tekstowego. Wska-
W kolejnych wierszach pliku tekstowego "we8.txt" zawarta
zówka: koniec wiersza można badać funkcją EoLn().
jest albo liczba naturalna albo jakiś napis. Wiersz z liczbą
Np. dla pliku wej.: w pliku wyjściowym będzie:
naturalną tym różni się od napisu, że występują w nim
0.1e4  7.2 wyłącznie cyfry '0'..'9' oraz zanki  + , - , i separator  . .
1.00000000E+03 3.80000000E-02
Napisać program, który odczytuje kolejne wiersze
-7.20000000E+00 2.50000000E+01
0.038 25
wspomnianego pliku i zapisuje do pliku tekstowego
"wy8.txt" wyłącznie wiersze zawierające napisy. Trzeba
Zad. 4.4.
napisać funkcję JestLiczba zwracającą dla danego
W pliku tekstowym "we4.txt" zapisane są wyrażenia skła-
wiersza true/false jeśli zawiera on liczbę/napis.
dające się z liczb, operatorów działań i wielokrotnie za-
Zad. 4.9.
gnieżdżonych nawiasów "(....)". Program przegląda plik
Zdefiniować typ liczby zespolonej TCmplx jako rekord z
sprawdzając, czy dla każdego nawiasu otwierającego "("
polami re, im :real. Napisać funkcje 4 działań na tych licz-
istnieje nawias zamykający ")" i wypisuje na ekranie
bach wykonujące +, -, *, /. Każda funkcja ma dwa argu-
"TRUE" jeśli tak jest, lub "FALSE" w przeciwnym wypadku.
Wskazówka 1: Wystarczy czytać plik znak po znaku i pa- menty przekazywane przez wartość oraz wynik typu TCm-
plx. Napisać funkcję CmplxToStr, która dla argumentu
miętać poziom zagnieżdżeń nawiasów dla poszczególnych
wierszy. Musi on być nieujemny i na koniec wiersza wy- TCmplx wytwarza string, np. w postaci '3.14+j4.6' (użyj
nieść 0. Przykłady (z zaznaczonym poziomem zagnież- funkcji FloatToStr). Przetestuj wykonywanie ciągu operacji,
np, dla x, y, z :TCmplx
dżeń obok znaków nawiasów):
TRUE: (1 ... (2 .... ) 1 .... (2.....)1 ...) 0
Zadanie: z := MUL(ADD(x,y), x);
FALSE, mimo, że na koniec jest 0: )-1 ...( 0
Wskazówka 2: Fragment programu sprawdzającego na-
wiasy zapisać jako funkcję która zwraca wartość logiczną.
Zad. 4.5.
W pliku tekstowym "Tex5.txt" jest kilka wieszy tekstu.
Napisać program i funkcję o nazwie Parzystasc(s:string),
która sprawdza czy w danym wierszu jest parzysta liczba
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 9 -
if wiersz[1] in ['A'..'Z'] then
Wybrane rozwiązania do Laboratorium 4
begin
if zapis then
program zad.4_3;
{$mode objfpc}{$H+} writeln(wy,'(',k,')',zdanie);
Uses SysUtils; writeln('(',k,')',zdanie);
const N=100; k:=0;
type tablica=array[1..N,1..N]of real;
zdanie:=wiersz;
var plik1,plik2:textFile;
k:=k+length(wiersz);
liczba:real;
zapis:=true;
tab:Tablica;
end
i,j,k:integer;
else
begin
begin
zdanie:=zdanie+' '+wiersz;
assign(plik1,'tablica.txt');
k:=k+length(wiersz);
assign(plik2,'tablica1.txt');
reset(plik1); end;
j:=1;
end;
while not Eof(plik1) do
if zdanie[1]in ['A'..'Z'] then
begin
writeln(wy,'(',k,')',zdanie);
i:=1;
writeln('(',k,')',zdanie);
while not Eoln(plik1) do
closefile(wy);
begin
closefile(we);
read(plik1,liczba);
readln;
tab[j,i]:=liczba;
end.
i:=i+1;
end;
readln(plik1);
program zad4_7;
j:=j+1;
{$APPTYPE CONSOLE}
end;
Uses SysUtils; /
j:=j-1;
var
i:=i-1;
znak,pop :char;
k: byte;
rewrite(plik2);
we, wy: Textfile;
for i := 1 to j do
begin
begin
for k := 1 to j do
assignfile(we,'zad47.lpr');
begin
reset(we); //odczyt
write(plik2,tab[k,i]:5:3,' ');
assignfile(wy,'komentarz.txt');
end;
rewrite(wy); //zapis
writeln(plik2);
k:=0;
end;
pop:=#0; //znak pusty
close(plik1);
while not EoF(we) do
close(plik2);
begin
end.
while not eoln(we) do
begin
program zad4_6;
read(we,znak); //czytaj znak
{$mode objfpc}{$H+}
//kiedy zapis
Uses SysUtils;
if (znak='/') and (pop=#0) then k:=0;
var
if k=1 then write(wy,znak); //zapis
wiersz, zdanie: string;
if (znak='/') and (pop='/') then
k: integer;
k:=1; //flaga zapisu ustawiona
we, wy: Textfile;
pop:=znak;
zapis: boolean;
end;
begin
readln(we);
assignfile(we,'we6.txt');
if k=1 then writeln(wy);
reset(we);
pop:=#0;
assignfile(wy,'wy6.txt');
k:=0;
rewrite(wy);
end;
zapis:=false;
closefile(wy);
zdanie:='';
closefile(we);
k:=0;
readln; //koniec
while not EoF(we) do
end.
begin
readln(we,wiersz);
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 10 -
Program główny: St:=TStos.Create;
Laboratorium 5
St.push(TZesp.Create(1,2)); St.push(TZesp.
Wskazniki i obiekty
Create(3,4)); St.push(TZesp.Create(5,6));
St.push(TZesp.mnoz(St.pop,St. pop));
Na laboratorium należy korzystać z zadań omawianych na
St.push(TZesp.dod(St.pop,St.pop));
wykładzie. Zalecane jest wykonanie zadania 5.1 i 5.2. W
c:=St.pop; c.Free; St.Free;
zadaniach należy zastosować (a) zmienne dynamiczne
oraz (b) technikę obiektową. Wskazówka: zmienna var c :TZesp; jest wskaznikiem
Przed kodowaniem algorytmów należy rysować grafy po- do obiektu. Nie trzeba dla niej wywoływac konstruktora, bo
kazujące zmianę wskazników przy dodawa- w instrukcji c:=St.pop; przekażemy do c adres istnieją-
niu/usuwaniu/przeglądaniu elementów. cego obiektu (stworzonego konstruktorem dod).
Zad.5.2.c.
Zad.5.1.a. Tablica wskaznków. Do zad. 5.2.b dopisz konstruktor z parametrem typy string
Dane: Tablica 100 wskazników do rekordów, w rekordzie: (przykład parametru: '1+j2')
imie, nazwisko :string[80].
Program czyta:
Zad.5.3.a,b Lista jednokierunkowa.
- indeks komórki do wypełnienia
Dane: Imię, nazwisko, rok urodzenia
- dane
Operacje:
aż podamy indeks spoza zakresu (uwaga: można podać
a) dodawanie, tak że nazwiska są ułożone rosnąco alfabe-
indeks wielokrotnie)
tycznie.
Na koniec wypisuje wszystkie dane i niszczy zmienne dy-
b) usuwanie elementu o określonym nazwisku
namiczne.
c) wyświetlanie całej listy
Zad.5.1.b. Tablica wskazników do obiektów. d) usuwanie całej listy
Dane: Tablica 100 komórek typu class, w klasie: imie,
nazwisko :string[80], konstruktor. Dalej jak w zad. 5.1.a.
Zad.5.4.b Kolejka.
Zad.5.2.a. Dane: Imię, nazwisko
Operacje:
Stos (wierzchołek St typu PStos, PStos=^TStos;)
a) dodawanie na końcu kolejki
Dane: liczba zespolona: TZesp=rekord re, im
b) usuwanie pierwszego elementu z kolejki
:real; end;
c) wyświetlanie całej kolejki
Operacje:
d) usuwanie całej kolejki
a) wkładanie na stos: procedure push(var
St:PStos;D:TZesp); i zdejmowanie ze stosu func-
Zad. 5.5. Drzewo binarne.
tion pop(var St:PStos):TZesp;.
Dane: Imię, nazwisko, rok urodzenia
b) dodawanie, odejmowanie i mnożenie pary z wierzchołka
Operacje:
stosu: function dod(a,b:TZesp):TZesp;,
a) dodawanie nowego liścia, tak że dla każdego węzła jego
function odej(a, b:TZesp):TZesp;., ...
lewe poddrzewo ma mniejsze alfabetycznie nazwiska
W programie głównym wykonać ciąg operacji zgodnie z
(rekurencja).
zasada odwrotnej notacji polskiej. Np. obliczanie wyraże-
b) wyszukiwanie elementu o określonym nazwisku (reku-
nia c:=a+(b*c) to w odwrotnej notacji polskiej
rencja, metoda preorder)
c:=a b c * + , tj. wkładamy na stos a, b, c i zastępujemy
c) wyświetlenie wszystkich węzłów (rekurencja, metoda
parę z wierzchołka najpierw iloczynem, a potem sumą):
inorder)
a.re:=1; a.im:=2; b.re:=3; b.im:=4;
d) Usunięcie całego drzewa (rekurencja, metoda postor-
c.re:=5; c.im:=6; St:=nil; push(St,a);
der)
push(St,b); push(St, c);
push(St,mnoz(pop(St),pop(St));
push(St,dod(pop(St),pop(St)); c:=pop(St);. W
sprawozdaniu wyznacz poprawny wynik dla tych danych.
Zad.5.2.b. Stos
Jak w zadaniu 5.2.a, ale obiekt class zamiast record.
Klasy: TZesp, TElemSt, TStos. W klasie TZesp
oprócz konstruktora Create ustawiającego pola re, im
dodatkowe konstruktory (może być ich wiele): con-
structor dod(a, b:TZesp); podobnie odej i
mnoz. W tych konstruktorach także należy wywołać inhe-
rited Create; oraz (na końcu) a.Free; b.Free;.
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 11 -
Rozwiązanie zad_5_2a;
{$mode objfpc}{$H+}
Wybrane rozwiązania do Laboratorium 5
uses SysUtils;
type TZesp = record
program zad5_1b;
re,im: real;
{$mode objfpc}{$H+}
end;
type
PStos = ^Tstos;
TKlasa= class //def. klasy
TStos=record
public
Poprz :PStos;
imie:string[80];
Dane :TZesp;
nazwisko:string[80];
end;
constructor Create;
procedure push(var St:PStos; const D :TZesp);
procedure wypisz;
var w :PStos;
end;
begin
Wsk_klasy=^TKlasa; //wskaznik do klasy
w := St;
Tablica = array [1..100] of Wsk_klasy;
new(St);
var
St^.Dane := D;
Tab: tablica; //tablica wskazników
St^.Poprz := w;
i :byte;
end;
constructor TKlasa.Create; //konstruktor
function pop(var St:PStos): TZesp;
Begin
var w: PStos;
imie:='';
begin
nazwisko:='';
w:=St;
end;
St := w^.Poprz;
Result:=w^.Dane;
procedure TKlasa.wypisz;
dispose(w);
begin
end;
writeln(imie+ ' ' +nazwisko);
function mnoz(a,b:TZesp): TZesp;
end;
begin
Result.re:=a.re*b.re-a.im*b.im;
begin
Result.im:=a.re*b.im+b.re*a.im;
i:=1;
end;
while true do
function dod(a,b:TZesp): TZesp;
begin
begin
write('Podaj indeks ');
Result.re:=a.re+b.re;
Readln(i);
Result.im:=a.im+b.im;
if (i<1) or (i>100) then break;
end;
if tab[i]<>nil then writeln('indesk zajety')
function odej(a,b:TZesp): TZesp;
else
begin
begin
Result.re:=b.re-a.re;
new(Tab[i]);
Result.im:=b.im-a.im;
Tab[i]^:=TKlasa.Create;
end;
write('Podaj imie: ');
var St :PStos;
Readln(Tab[i]^.imie);
a,b,c: TZesp;
write('Podaj nazwisko: ');
begin
Readln(Tab[i]^.nazwisko);
a.re:=1; a.im:=2;
end;
b.re:=3; b.im:=4;
end;
c.re:=5; c.im:=6;
St:=nil;
for i := 1 to 100 do
push(St,a);
if Tab[i] <> nil then begin
push(St,b);
Tab[i]^.wypisz;
push(St,c);
Tab[i]^.Free;
push(St,mnoz(pop(St),pop(St)));
dispose(Tab[i]);
push(St,dod(pop(St),pop(St)));
end;
c:=pop(St);
writeln('a+(b*c) = ',c.re:5:2,' + ',c.im:5:2,'*i');
readln;
readln;
end.
end.
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 12 -
Zad. 6.6.* Dynamiczna zmiana wielkości cyfr
Laboratorium 6
W aplikacji z zad 6.1 wielkość cyfr zmienia się stosownie
Aplikacje okienkowe
do zmiennych rozmiarów okna aplikacji.
Wskazówki: Aby okno mogło zmieniać rozmiary trzeba
Cel:Tworzenie aplikacji w środowisku Lazarus
właściwość BorderStyle ustawić na bsSizeable. Użyć w
Uwaga. Dla każdego z zadań należy stworzyć na dysku U:
programie właściwości ClientHeight, ClientWidth
specjalny folder, gdzie będzie przechowywany plik projektu z
plikami pomocniczymi.
Wybrane rozwiązania do Laboratorium 6
Zad. 6.1. (na podst. wykładu)
Własnoręcznie stworzyć jedną z aplikacji  StoperX przed-
Zad.6.1. Stoper1
stawioną na wykładzie.
Stoper1: Zbudować na postawie komponentów: TLabel i
Ttimer stoper elektroniczny (zliczanie sekund i minut, start
od wartości 00:00)
Stoper2: Zmodyfikować Stoper1 tak aby zliczanie sekund
nastepowało co 100ms, oraz zbudować funkcję wyświetla-
nia czasu, która minuty i sekundy zawsze wyświetla dwu-
cyfrowo.
Stoper3: Zbudować na postawie komponentów: TPanel
(x2), Ttimer, TButton (x3) stoper elektroniczny: (zliczanie
sekund i minut, start od wartości 00:00, przycisk Star uru-
chamia stoper od nowa, przycisk Stop zatrzymuje stoper,
Var min, sek :Integer;
przycisk Koniec zamyka aplikację, cyfry stopera umieścić
procedure TForm1.Timer1Timer(Sender: TObject);
na panelu 2, na panelu 1 umieścić napis  Stoper )
begin
Stoper4: Zbudować na postawie komponentów: TPanel
inc(sek); //tu będziemy co 1000ms
(x2), Ttimer, TButton (x4), Label, stoper elektroniczny:
if sek >= 60 then
(zliczanie sekund i minut, start od wartości 00:00, przycisk
begin
Reset uruchamia stoper od nowa, przycisk Stop zatrzymu-
sek := 0;
je stoper, Start kontynuuje liczenie sekund, przycisk Ko- inc(min);
niec zamyka aplikację, cyfry stopera umieścić komponen- end;
Label1.Caption := IntToStr(min)+':'+IntToStr(sek) ;
cie Label, na panelu2 umieścić wszystkie przyciski, na
end;
panelu 1 umieścić stoper, zliczanie co 200ms.
Zad.6.1. Stoper3
Zad. 6.2. (na podst. wykładu lub zad.6.1)
Zmodyfikować aplikację StoperX tak, aby 5 sekundy po
starcie stopera na płótnie formy pojawiało się koło z czar-
nym brzegiem i wnętrzem migającym na czerwono / czar-
no co sekundę. Użyć właścowości Canvas  najlepiej dla
komponentu Image, ewentualnie dla głównej formy pro-
gramu.
Zad. 6.3. Dynamiczna zmiana właściwości
W aplikacji z zad 6.1 po 4 sekundach od startu stopera
cyfry zmieniają stan co 200ms zamiast co 1sek., a nagłó-
wek programu zmienia się na  Czas szybko mija .
procedure TForm1.ButtonKoniecClick(Sender: TObject);
Zad. 6.4. Zegar
begin
Napisać aplikację, która w oknie głównym pokazuje aktu-
Self.Close;
alny czas.
end;
Wskazówka: funkcja Now (lub funkcja Time) oraz Time-
ToStr.
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
Zad. 6.5. Poprawiony stoper z przyciskami Start/Stop
min := 0; sek := 0;
Napisać aplikację stopera, która wyświetla różnicę czasu
Panel2.Caption := '00:00';
aktualnego i czasu startu wykorzystując funkcję Time lub
Timer1.Enabled := TRUE;
Now. Program ma posiadać przyciski START (liczenie end;
czasu od 0) i STOP. Uwaga: Aplikacja Stoper z wykładu
procedure TForm1.ButtonStopClick(Sender: TObject);
gubi czas np. podczas uśpienia systemu. To rozwiązanie
begin
ma usunąć tę wadę.
Timer1.Enabled := FALSE;
end;
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 13 -
procedure TForm1.Timer1Timer(Sender: TObject); LabelMain.Caption := IntToStr00(min)+':'+IntToStr00(sek);
begin
inc(sek); //tu będziemy co 1000ms if (sek >= 3) or (min > 0) then
if sek >= 60 then begin
begin if (sek mod 2) = 1 then
sek := 0; Image1.Canvas.Brush.Color := clRed
inc(min); else
end; Image1.Canvas.Brush.Color := clBlack;
panel2.caption:= IntToStr(min)+':'+IntToStr(sek);
// panel2.caption:= MinSekToStr; Image1.Canvas.Ellipse(0,0,60,60);
end; end;
end;
Zad.6.2
Rozwiązanie do Zad.6.6.
procedure TForm1.PanelMainResize(Sender: TObject);
begin
LabelMain.Font.Height:=round(-
50*PanelMain.ClientHeight/100);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//tu będę co 1000ms
inc(sek);
if sek >= 60 then
procedure TForm1.ButtonResetClick(Sender: TObject);
begin
begin
sek := 0;
Timer1.Enabled := False;
inc(min);
sek:=0; min:=0;
end;
LabelMain.Caption := '00:00';
LabelMain.Caption := IntToStr(min)+':'+IntToStr(sek);
end;
end;
procedure TForm1.ButtonEndClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TForm1.ButtonStopClick(Sender: TObject);
begin
Timer1.Enabled := False;
end;
function TForm1.IntToStr00(x :Integer) :String;
begin
Result := IntToStr(x);
if Length(Result) < 2 then Result := '0'+Result;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//zliczanie będzie co 200ms
inc(sek);
if sek >= 60 then
begin
sek := 0;
inc(min);
end;
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.
- 14 -
Laboratorium 7
Zaliczenie
Zaliczenie odbywa się indywidualnie przy kompu-
terze w środowisku Lazarus. Czas zaliczenia 45
minut.
Aby zdobyć zaliczenie konieczne jest aby minimum
60% zadania poprawnie się wykonywało (konieczna
kompilacja i wykonanie części zadania).
Zakres zaliczenia obejmuje materiał od laboratorium
1 do laboratorium 4.
Zakres materiału w szczegółach: instrukcje iteracyj-
ne, warunkowe, wyboru, operacje na danych pro-
stych i strukturalnych: tablicach 1 i 2 wymiarowych i
rekordach. Procedury i funkcje, operacje na plikach.
1EF sem. 1, Laboratorium - Wstęp do programowania
Ten i inne dokumenty są dostępne w folderze P:\Pascal.


Wyszukiwarka

Podobne podstrony:
10 Wstep do prawoznawstwa
Wstęp do pakietu algebry komputerowej Maple
2006 06 Wstęp do Scrum [Inzynieria Oprogramowania]
Wstęp do magii
Instrukcja obsługi do GOCLEVER 5066 FMBT PL
Renesans Wstęp do epoki Podłoże społeczno polityczne ~5C5
Wstęp do psychopatologii
BT Wstęp do Pierwszego Listu św Piotra apostoła

więcej podobnych podstron