background image

 

Wydział Elektrotechniki i Informatyki PRz 

Zakład Podstaw Elektrotechniki i Informatyki 

 

 

 
Kierunek: Informatyka   EF-DI 
Studia: stacjonarne I-go stopnia 
Rok: 1 
Semestr: 
 

 
Kierunek: Informatyka   EF-ZI 
Studia: niestacjonarne I-go stopnia 
Rok: 1 
Semestr: 
 

 

 

 

 
 
 
 

 

WSTĘP  DO   PROGRAMOWANIA   

 
 
 
 
 

Instrukcje ćwiczeń laboratoryjnych 

 
 
 
 
 
 
 
 

 

  dr inż. Grzegorz Drałus,    dr inż. Antoni Szczepański,    

 mgr inż. Edyta Gąsior 

 
 
 
 

 

 
 
 

 
 

 
 

background image

- 2 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

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. 

Wskaźniki i obiekty……………  10 

6.  Laboratorium 6. Aplikacje okienkowe 

…..……..  12 

7. 

Laboratorium 7. Zaliczenie……………………….  14 

 

 

 

background image

- 3 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 1  

 

Laboratorium 1 może odbywać się przed wykładem, stąd 
zadania są szczegółowo opisane.  

 

Przygotowanie do pracy i uruchomienie kompilatora 
Lazarus (Free Pacal). 
 

 

1.  Na dysku U: 

utworzyć folder Pas a w nim folder Lab1

2. 

Przekopiować do niego zawartość foldera P:\Pascal\ 
Lab1.Lazarus
 

3. 

Uruchomić środowisko (program) Lazarus 

4. 

Otwórz plik z opcją nowego projektu typu Program 

5. 

Podczas pracy z programem należy pamiętać o czę-
stym zapisywaniu na dysk 

pliku źródłowego [Ctrl+S] 

lub całego projektu (Projekt | Zapisz projekt jako]). 
Przy pierwszym zapisie nowego programu  należy po-
dać sensowną nazwę (Nie "Rysiek1" lecz nazwa, która 
coś mówi o funkcji programu). Nazwa projektu jest 
równocześnie nazwą programu *.EXE. Przy pisaniu 
programów powinno się każdy projekt zapisywać w 
osobnym folderze, ze względu na pewną ilość plików 
dodatkowych towarzyszących projektowi. 

6. 

Po zakończeniu kolejnego etapu pisania kodu warto 
dokonywać próby kompilacji programu (Uruchom | Bu-
duj [Ctrl+F9]). 

7.  Po kompilacji można uruchomić program (Uruchom | 

Uruchom 

=[F9]), lub wykonywać krok po kroku (Uru-

chom | 

Przejdź przez =[F8] ). Można też samodzielnie 

ustawić punkty zatrzymań w miejscach, w których chcemy 
obserwować wartości zmiennych. W tym celu należy ustawić 
kursor w linii programu, gdzie mamy się zatrzymać i wybrać 
menu: 
Uruchom | Odpluskwiacz | Zastaw Pułapkę. a jeszcze 
krócej przez kliknięcie myszy z lewej strony wybranej linii 
(przy lewej ramce okna edycji). Linia zaznaczana jest kolo-
rem czerwonym. Po tym śledzimy program naciskając [F9] 

8.  Uwaga! nie powinno się przerywać pracy programu za 

pomocą Alt+F4 (lub [x] w prawym górnym rogu). Za-
miast tego 

do przerwania pracy należy używać  

Uruchom | Zatrzymaj (Ctrl+F2)

 

Ćwiczenia dla początkujących 

Zad. 1.1.  

(podstawowe elementy programu) 

Wczytać program Witaj.pas – w środowisku Lazarus: Plik | 
Otwórz lub ikoną „otwórz”. Wybraniu pliku pija iwą się okna 
gdzie trzeba wybrać nowy projekt typu Program. Urucho-
mić program [F9] zielony trójkąt i obejrzeć wynik działania.  
W instrukcji "writeln" pomiędzy apostrofami znajduje się tekst 
do wyświetlenia na ekranie. 

Zad. 1.2.  
Zmodyfikować ten program tak aby w jednym wierszu wy-
prowadzał imię i nazwisko studenta. 

 

Ćwiczenia dla wszystkich 

Zad. 1.3.  

(zmienna, typ zmiennej, readln) 

Wczytać program Dodaj.pas. Uruchomić go, wprowadzić 
dwie liczby całkowite jako a i b i obejrzeć wyniki działania.  
Wprowadzić niepoprawne dane (niecałkowite czy nie-
liczby jako a czy b. Jaka jest reakcja programu? 

Zad. 1.4.  

(operacja podstawiania wartości do zmiennej) 

Wczytać program Suma.pas. Uruchomić go. Zamienić 
wyrażenie a+b podstawianie do c na (a+b)/3. Jaka jest 
rea

kcja kompilatora i jak ją uzasadnić. 

Wyjaśnienie: znak ":=" oznacza operację podstawiania pewnej 
wartości do zmiennej, której nazwa występuje z lewej strony. Z 
prawej strony znaku podstawiania może wystąpić jakieś wyraże-
nie (stałe, zmienne ich kombinacje połączone operatorami) . 

Zad. 1.5.  

(praca krokowa, śledzenie wartości zmiennych) 

Wczytać program Sum_2.pas. Wykonać pierwszy krok 
śledzenia (F8 lub Uruchom | Przejdź przez). W środowisku 
Lazarus 

trzeba otworzyć okienko śledzenia Widok | Okno 

odpluskwiacza | Czujki). Do okna Czujki  

dodać zmienne 

ab i c - ustawiamy kursor na oknie Lista czujek  i naci-
skamy klawisz [Insert

] Następnie należy uruchomić pro-

gram krok po kroku (F8

i śledzić zmiany wartości zmien-

nych. Warto 

wyłączyć opcję optymalizacji: Projekt | Opcje 

kompilatora | Kod | Sprawdzaj (zakres, 

przepełnienie). 

Zad. 1.6. 

(pętla) 

Wczytać program Silnia.pas. Uruchomić go. Następnie w 
oknie Czujki 

umieścić wszystkie 3 zmienne i obserwować 

ich zmiany przy pracy krokowej programu.  

Zad. 1.7.  

(kontrola zakresu wartości zmiennych) 

Przy wczytanym programie Silnia.pas 

i przy wyłączonych 

opcjach kompilatora sprawdzających zakres wartości 
zmiennych (tak jak to jest domyślnie): Projekt | Opcje kom-
pilatora  | Kod | Sprawdzaj 

– Przepełnienie lub/i Zakres - 

uruchamiać wielokrotnie program i ustalić dla jakiej warto-
ści dodatniej n program przestaje działać poprawnie. Usta-
lić graniczne wartości n, przy których następuje jakościowa 
zmiana wyników, np. wyniki ujemne. Włączyć opcje 
sprawdzania zakresów (zawsze po zmianie opcji należy 
wymuszać ponowną kompilację: Uruchom  | Buduj lub 
Budui wszystko

)  i odczytać komunikat po podaniu zbyt 

dużej wartości n. Należy stworzyć dużą tabelę z 3 kolum-
nami i w niej n

otować wyniki prób: 

n!  R- Q- 

n!  R+ Q+ 

22 

-522715136 

błąd zakresu 

... 

... 

... 

Zad. 1.8.  
Zapisać projekt Silnia pod inną nazwą. Zmodyfikować 
program, aby obliczał on wyrażenie n! / m! , gdzie n , 
czyli iloczyn liczb od (m+1) do n. Prześledzić krokowo pra-
cę programu. Wypróbować 1000! / 998! (=999000) 
Ćwiczenia dla zaawansowanych 
Zad. 1.9. 
 

(Złożony warunek przerwania pracy programu

Dla zad. 1.6 dodać wewnątrz pętli punkt zatrzymania pro-
gramu (Pu

łapkę) przy spełnieniu warunku > 500. Jaka 

jest wartość zmiennej s po zatrzymania programu? (edycja 
„właściwości” prawym klawiszem myszki w oknie Pułapki
Zad. 1.10.  
Dla zad. 1.6 dodać wewnątrz pętli punkt zatrzymania pro-
gramu po 2- 

krotnym spełnieniu warunku > 20. Jaka jest 

wartość zmiennej s po zatrzymania programu. 

 

 

background image

- 4 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 2  

Instrukcje, dane strukturalne 

 

Celem laboratorium jest użycie instrukcji warunko-
wych, wyboru oraz iteracyjnych do tworzenia pro-
styc

h programów.  

Na laboratorium 

należy napisać kilka programów do tema-

tów zadań podanych poniżej

.  

Ilość zależy od możliwości studentów..  
Należy włączać opcje sprawdzania zakresów. Trzeba 
zwracać uwagę na styl pisania algorytmów, np. na wcięcia. 

Zad. 2.1.  



4 1

1

3

1

5

1

7

...

.  

Wyznaczyć przybliżoną wartość 

 

wykorzystując N skład-

ników szeregu (N daną wejściową algorytmu) 
Wskazówka: składniki szeregu można często opisać wzorami, 

np. tutaj 

1

2

1

1

k

k

)

(

. Ale dla obliczeń komputerowych lepsze 

jest unikanie wzorów i używanie zmiennych pomocniczych. Np. 
jeśli zmienna  zn pamięta znak składnika +1 albo -1, a zmienna 
m mianownik, to w ciele pętli mamy instrukcje: su-
ma
:=suma+zn/mzn:=-znm:=m+2; 

Podczas testowa

nia wyniku posłuż się stałą pi do-

stępną w Pascalu – poniżej wyniku algorytmu wypisz: 

writeln( pi );

 

Ustal eksperymentalnie ile iteracji potrzeba dla uzy-
skania 7 cyfr dokładnych cyfr liczby π

Kilka wyników zapisz w tabelce 

ile cyfr dokładnych 

21 

... 

 

Co się stanie jeśli zapiszesz projekt pod nazwą "pi" ? 

Zad. 2.2. 
Do obliczenia pierwiastka kwadratowego z liczby dodatniej 
A można posłużyć się zależnością: 



1

1

2

1

i

i

i

x

A

x

x

 

gdzie xi jest kolejnym przybliżeniem pierwiastka poczyna-
jąc od dowolnej wartości dodatniej x

0

, np x

0

=1. Wyznaczyć 

przybliżenie pierwiastka spełniające zależność: 

12

2

10

5

A

A

x

i

 

Tutaj zamiast wypisywać wynik po zakończeniu pętli wypi-
suj go w każdym kroku pętli (to jest sposób na śledzenie 
programu). 
W ilu krokach obliczany jest pierwiastek z 10000? 
Wskazówka: w Pascalu 5e-12 jest literałem liczby 5•10

-12

|x| to w Pascalu  abs(x). 

Wskazówka: ciąg wartości x

i

 może być w przypadku algorytmu 

ciągiem wartości jednej zmiennej. Czyli w ciele pętli będzie 
jedna instrukcja x:=(1/2)*(x+A/x), a warunkiem stopu będzie 
abs((x*x – A)/A) < 5e-12. 

Zad. 2.3.  

N

apisać program (algorytm) obliczający 

sumę częściową szeregu uwzględniając 
M 

składników. Kolejny obliczany w pętli 

składnik przechowywać w zmiennej a , sumę częściową 
szeregu wyznaczać w zmiennej s.  
Wskazówka: W rozwiązaniu obliczanie silni n! oraz potęgi licz-
by dwa nie jest konieczne.  

Zad. 2.4.  
Wyznaczyć sumę 2 liczb dziesiętnych naturalnych N -
cy

frowych. Zakładamy, że N może być dużą liczbą np. 

N=100.  Cyfry argumentów i wyniku zapisane w trzech 
tablicach a, b, c 

tego samego typu (dzięki temu wynik na-

daje się jako argument do dalszych obliczeń). Cyfra jedno-
ści występuje pod indeksem 0. Komórki tablic mogą prze-
chowywać tylko wartości 0..9. Wewnątrz pętli ma wystąpić 
dodawanie dwóch cyfr 0..9 i przeniesienia 0..1. 

Proponowane rozwiązanie  
Zapisz w stałej ilość cyfr: np. const N=4 (dla testów). Zadeklaruj 
tablice do przechowywania cyfr 

– zauważ, że wynik c jest tego 

samego typu co argumenty a, b 

więc nadaje się jako argument 

do dalszych obliczeń: var a, b, c :array [0..N-1 ] of 0..9; 
Włącz sprawdzanie zakresów. Wpisz tablice a, b, c do okna 
Czujki

. Na początek w celach testowych można wpisać stałe 

wartości do komórek tablic, np: 
a[4] := 1; a[3] := 2; a[2] := 4; a[1] := 9; a[0] := 7; 
b[4] := 1; b[3] := 3; b[2] := 5; b[1] := 3; b[0] := 2; 

Zad. 2.5.  
Wyznaczyć różnicę 2 liczb dziesiętnych naturalnych N -
cyfrowych (zadanie podobne do 2.4). 

Zad. 2.6.  

Wyznaczyć wartość maksymalną i wartość maksymalną modułu 
elementów tablicy A. Tablica ma N elementów typu rzeczywiste-
go tj. A[i

 Ri=1..N. 

Zad. 2.7.  

Dla danej tablicy dwuwymiarowej A[i,j], i,j=1..N wyznaczyć tablicę 
transponowaną (kolumny zamienione na wiersze) 

Zad. 2.8. 
Napisać program (algorytmu), który dla danej tablicy kwa-
dratowej X o indeksach (1..N)x(1..N) ustala poziom jej 
symetryczności. Program zwraca iloraz ilości elementów 
symetrycznych poza główną przekątną (takich, że X

w,k

 

X

k,w

 ) d

o ilości wszystkich elementów poza główną prze-

kątną. Czyli dla macierzy symetrycznej wynikiem jest 1.0, 
jeżeli wszystkie elementy poza przekątną są symetryczne). 

Zad. 2.9. 

Tablica T[i], i=0..N zawiera tekst, zaś tablica 
W[j], j=0..M zawiera tekst-wzorzec do wyszukania w T[i]. Wy-
znacz pierwsze miejsce wy

stąpienia wzorca. 

Uwagi  

Dla każdego zadania należy prześledzić zmiany wartości zmien-
nych 

uwzględniając co najmniej kilka kroków pętli

 

 

 

0

2

1

n

n

n

e

!

background image

- 5 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Wybrane rozwiązania do Laboratorium 2 

 
program zad2_5; 
{odejmowanie_liczby 100 cyfrowej};   
{$mode objfpc}{$H+} 
const N=4; 
var A,B,C:array[0..N-1]of 0..9; 
    roznica,poz,i : shortint; 
 
  Begin 
    for i:=0 to N-1 do 
      readln(A[i]); 
    for i:=0 to N-1 do 
        readln(B[i]); 
   poz:=0; 
   for i:=0 to N-1 do 
     begin 
        roznica:=A[i]-B[i]-poz; 
        if roznica < 0 then begin 
                       roznica:=roznica+10; 
                       poz:=1; 
                     end 
                 else poz:=0; 
       C[i]:=roznica; 
    end; 
   for i:=N-1 downto 0 do  write(A[i],' '); 
   writeln; 
   for i:=N-1 downto 0 do   write(B[i],' '); 
   writeln; 
   for i:=N-1 downto 0 do       write(C[i],' '); 
  readln; 
 END. 
 
program zad2_7;   {transpozycja} 
{$mode objfpc}{$H+} 
const n=3; 
var  i,j :byte; 
     a,b,c :array[1..n,1..n]of integer; 
  Begin 
    randomize; 
     for i:=1 to n do 
     for j:=1 to n do 
      readln(a[i,j]);        //wypelnianie reczne 
      //a[i,j]:=reandom(10); //wyp. autmatyczne 
  {********************    sposob 1 } 
    randomize; 
    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; 

 
     writeln; 
     for i:=1 to n do 
      begin 
      for j:=1 to n do  write(b[i,j],' ');  writeln; 
      end;      writeln; 
     for i:=1 to n do 
      begin 
      for j:=1 to n do  write(c[i,j],' '); writeln; 
      end; 
  readln; 
END. 
 
 
Program zad2_9;  {tablica_wzorzec_zad29 } 
{$mode objfpc}{$H+} 
const n=80; 
var  wzorzec ,tekst      : array[1..n] of char; 
     m,k,i,j  :byte; 
     pocz     :integer; 
 Begin 
 write('podaj dlugosc tekstu=');readln(m); 
 for i:=1 to m do  readln(tekst[i]); 
 write('podaj dlugosc wzorca=');readln(k); 
 for j:=1 to k do  readln(wzorzec[j]); 
 i:=1; 
 j:=1; 
 pocz:=-1; 
 repeat 
 if tekst[i]=wzorzec[j] then begin 
                   if j=1 then pocz:=i; 
                   inc(j) 
                   end 
              else begin 
                      j:=1; 
                      pocz:=-1; 
                   end; 
 i:=i+1; 
 until (i>m)or(j>k); 
 if pocz=-1 then writeln('Nie znaleziono wzorca') 
            else writeln('Pozycja wzorca wynosi',pocz); 
 for i:=1 to m do  write(tekst[i]);writeln; 
 if pocz > 1 then for i:=1 to pocz-1 do write(' '); 
 for j:=1 to k do  write(wzorzec[j]); 
 readln; 
 End.  

 

background image

- 6 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 3 

Procedury i funkcje 

 

Celem laboratorium projektowanie i wykorzystywanie 
w programowaniu funkcji i procedur.  

Zad. 3.11.  
a)
 

Zmodyfikować program dodawania lub odejmowania N-

cyfrowych liczb dziesiętnych zapisanych w tablicy (zob. 
zad.2.4. lub zad.2.5

) dzieląc go na części zapisane w pod-

programach: d

la const MaxN=4 zadeklaruj typ tablicy do prze-

chowywania cyfr: type TLiczba=array [ 0..MaxN-1 ] of 0..9; 
Przenieś algorytm dodawania do function dod(a, b :TLiczba) 
:TLiczba;
 - 

wszystkie odwołania do tabl. wynikowej c[ ] zamie-

nień na Result[ ]. Wypisanie tablicy c[ ] umieść w procedure 
Pisz(c :TLiczba);
 

Zamiast wczytywania tablic a (oraz b) użyj 

function CzytajA:TLiczba; 

zamieniając a[ ] na Result[ ] (i ana-

logicznie w f. CzytajB). W programie nie powinno być żadnych 
zmiennych globalnych! W 

programie głównym będzie tylko 

wiersz: Pisz( dod(CzytajA, CzytajB) ); 

(Włącz spr. zakresów). 

 

b) 

Zmodyfikować funkcje czytania i pisania z zad. 3.1a, z 

użyciem pętli. Funkcja czytania ma wczytywać ciąg liczb 
(cyfr 0..9) oddzielony spacjami i zakończony enterem. Czy-
li np. 9 8 7 6(Enter) 

będzie czytane w pętli za pomocą 

read(Result[i]), po czym Result[]=(6, 7, 8, 9). (Readln po 
pętli przeczyta Ennter).  

 

c) (L) 

Zamienić funkcje czytania i pisania z zad. 3.1b, na 

funkcję zamiany łańcucha cyfr, np. '15479' (string) na 

tablicę wartości cyfr (można odejmować kod zera, tj, 
ord('0') lub byte('0') od kodu cyfry aby uzyskać jej wartość). 
Uzupełniaj zerami puste komórki tablicy. 

funkcję tworzącą dla tablicy cyfr łańcuch znaków (string) 

gotowy do wypisania na ekranie 

Zad.3.2. 
Liczby rzeczywiste zakodowane w formacie zmiennoprze-
cinkowym należą do skończonego zbioru wartości. Czyli 
jest tak mała liczba dodatnia, że mniejsza od niej jest ze-
rem. Program wyznacza metodą numeryczną - trzeba ją 
wymyślić - najmniejszą dodatnią liczbę rzeczywistą typu 

Single, Real (=Double) i 
Exteneded. 

Zad.3.3.  
Plik "DuzeZnaki.dpr" zawiera 
zalążek programu do druko-
wania ban

erów tekstowych. 

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. 

(w programie użyj funkcji lub procedur) 

 

Zad. 3.4. 
Zaprogramować rekurencyjny algorytm obliczania silni. 

 

Zad. 3.5.  
Pro

gram odczytuje liczbę rzymską do łańcucha (string) i 

wypisuje jej wartość dziesiętną. Uwzględnić liczby z zakre-
su: I...MMM. Użyć podprogramu do zamiany znaku rzym-
skiego na wartość liczbową. Do konwersji cyfry rzymskiej z 
tabeli na arabską użyj funkcji. Do konwersji całej liczby 
rzymskie na arabską zaprojektuj drugą funkcje.  
 

 

 

Zad. 3.6.  
Rok jest przestępny (czyli luty ma 29 a nie 28 dni), gdy 
jego numer dzieli się przez 4, ale nie dzieli się przez 100, 
bądź też, gdy dzieli się przez 400. 1 stycznia 1800 przypa-
dał w środę. Napisz program, który wczytuje dowolną datę 
(kolejno rok, miesiąc i dzień) i wypisujący jaki to dzień ty-
godnia. 
(w programie użyj funkcji lub procedur) 

Zad. 3.7.  
Napisz 

program, w którym funkcja zwraca jako łańcuch 

(String) zapis podanej liczby naturalnej w systemie o pod-
stawie B. 

Zad. 3.8.  
Napisz program który dokonuje konwersji liczby binarnej 
(max długość liczby to 16 bitów) na liczbę dziesiętną. Za-
projektuj odpowied

nią funkcję konwertującą. 

 

Zad. 3.9.  
Napisać program i rekurencyjną funkcję odwracania ciąg 
liter tj. napis. J

eden z parametrów formalnych funkcji jest 

napis typu string oraz indeks typu byte. 
 

Zad. 3.10.  
Napisać program i rekurencyjną funkcję obliczania naj-
większego wspólnego dzielnika NWD 
 
 

 

IV 

IX 

 9 

 100 

II 

10 

 500 

III 

... 

 

50 

M  1000 

type TZnak = 
array[1..5] of 
string

const 

//lub var 

 

WzorZn : array 

[

'A'

..

'Z'

of 

TZnak =( 

(

 

'

 ##  

',

 

'

#  # 

',

 

'

#  # 

',

 

'

#### 

',

 

'

#  # 

'

 

),( 
'

###  

',

 

'

#  # 

',

 

'

###  

',

 

'

#  # 

',

 

'

###  

'

 

),( 
... 

 

background image

- 7 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Wybra

ne rozwiązania do Laboratorium 3 

 
program zad3_5; 
{liczby rzymskie} 
 
{$mode objfpc}{$H+} 
var rzymska :string; 
 function cyfra(cyfra_rzymska:char):longint; 
   begin 
     case cyfra_rzymska of 
       'I','i'   : Result:=1; 
       'V','v' : Result:=5; 
       'X','x' : Result:=10; 
       'L','l'  : Result:=50; 
       'C','c' : Result:=100; 
       'D','d' : Result:=500; 
       'M','m' : Result:=1000; 
       else  Result:=0; 
     end; 
   end; 
   function rzymska2arabska(liczba_rzymska:string):longint; 
   var i,akt,pop,wynik :LongInt; 
   begin 
   wynik:=0; 
   pop:=0; 
    for i:=length(liczba_rzymska) downto  1 do begin 
    akt:=cyfra(liczba_rzymska[i]); 
    if (akt=0) then writeln('Niepoprawna liczba!!!!'); 
    if pop > akt then  wynik:=wynik-akt 
                 else wynik:=wynik+akt; 
    pop:=akt; 
    end; 
   Result:=wynik; 
   end; 
 
BEGIN 
  write('Podaj liczbe rzymska:'); 
    Readln(rzymska); 
    writeln(rzymska2arabska(rzymska)); 
  readln; 
END. 

 

program zad_3_6  {dni_tyg.pas} 
{$mode objfpc}{$H+} 
type 
 TMiesiac=1..12; 
 TDzien =1..31; 
 TDzTyg =0..6; 
 const dt:array[0..6]of 
string[12]=('Niedziela','Poniedzialek','Wtorek', 
                 'Sroda','Czwartek','Piatek','Sobota'); 
 
 function przestepny(rok:longint):boolean; 
 begin 
  przestepny:=false; 
      if ((rok mod 400)=0) or 
       (((rok mod 4)=0) and  ((rok mod 100)<>0)) 
           then przestepny:=true; 
  end; 
  function dni_mies(m:TMiesiac):TDzien; 
  begin 
    case m of 
     1,3,5,7,8,10,12 :Result:=31; 
     2               :Result:=28 ; 
     else Result:=30; 
    end; 

   end; 
   function dni_tyg(DzTyg:TdzTyg):string; 
   begin 
     case DzTyg of 
       0 : dni_tyg:='Niedz'; 
       1 : dni_tyg:='Pondz'; 
       2 : dni_tyg:='Wtorek'; 
       3 : dni_tyg:='Sroda'; 
       4 : dni_tyg:='Czwartek'; 
       5 : dni_tyg:='Piatek'; 
       6 : dni_tyg:='Sobota'; 
       end; 
  End; 
 
  var r,dni,i :longint; 
      d: TDzien; 
      m:TMiesiac; 
      DzTyg: TDzTyg; 
      BEGIN 
      write('podaj rok=');readln(r); 
       write('podaj miesiac=');readln(m); 
       write('podaj dzien=');readln(d); 
       dni:=d; 
       for i:=1 to m-1 do 
             dni:=dni+dni_mies(i); 
       if przestepny(r)and(m>2) then dni:=dni+1; 
       for i:=1800 to r-1 do 
         if (przestepny(i)) then dni:=dni+366 
                            else dni:=dni+365; 
       DzTyg:=(dni+2) mod 7; 
       writeln('To by

ˆ:',dni_tyg(DzTyg)); 

       writeln('To by

ˆ:',dt[DzTyg]); 

 
       readln 
       END. 
 

program zad3_9; {Rekurencyjne_odwracanie} 
 
{$mode objfpc}{$H+} {$O-,Q+,R+} 
Uses   SysUtils; 
 
function rewers(indeks :integer; tekst :string):string; 
begin  
    if indeks <= length(tekst) then  
       rewers := rewers(indeks+1,tekst) + tekst[indeks] 
    else rewers := ''; 
 end; 
 
var    tekst :string; 
        i:integer; 
Begin 
i:=1; 
//atak, rak, Hetman, ?? 
 write('Podaj tekst='); readln(tekst); 
 writeln(rewers(i,tekst)); 
  readln; 
end. 
 

 

background image

- 8 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 4 
Operacje na plikach 

 

Celem lab. 4 jest praca danymi umieszczonymi w pli-
kach dyskowych. 
 

 

Zad. 4.1.  
a)
 Program czyta kolejne znaki z jednego pliku tekstowe-
go, zamienia małe litery 'a'..'z' na wielkie a wielkie 'A'..'Z' na 
małe i zapisuje do innego pliku.  

 

b) 

Program czyta wiersze pliku tekstowego do łańcucha, 

wywołuje funkcję (parametr: string, zwraca string), która 
przekształca znaki jak opisano w cz. a) i wypisuje na ekra-
nie numer wiersza oraz przekształcony łańcuch.  

Zad. 4.2.  
W pliku tekstowym "liczby.txt" zapisane są liczby rzeczywi-
ste 

– po dwie liczby w każdym wierszy oddzielone białymi 

znakami. Program czyta te pary liczb i jeśli ich iloczyn jest 
większy od zera to zapisuje ten iloczyn do pliku tekstowe-
go  "dod.txt". Jeśli iloczyn jest mniejszy od zera to zapisuje 
go do pliku "ujem.txt". 

Zad. 4.3.  
W pliku tekstowym zapisana jest tablica kwadratowa 

– w 

każdym wierszu pliku jest wiersz tablicy, a kolejne liczby są 
oddzielone białymi znakami. Rozmiar tablicy jest mniejszy 
od 100 (rozmiar tablicy wynika z ilości liczb we wierszu, co 
jest równocześnie równe ilości wierszy). Należy odczytać 
tą tablicę do tablicy statycznej 100x100 i zapisać taką 
transponowaną tablicę do innego pliku tekstowego. Wska-
zówka: koniec wiersza można badać funkcją EoLn(). 

Np. dla pliku wej.: 

0.1e4 –7.2 

0.038  25 

w pliku wyjściowym będzie: 
 
 1.00000000E+03  3.80000000E-02 
-7.20000000E+00  2.50000000E+01

 

Zad. 4.4.  
W  pliku  tekstowym  "we4.txt

"  zapisane są  wyrażenia skła-

dające  się  z  liczb,  operatorów  działań  i  wielokrotnie  za-
gnieżdżonych  nawiasów  "(....)".  Program  przegląda  plik 
sprawdzając,  czy  dla  każdego  nawiasu  otwierającego  "(" 
istnieje  nawias  za

mykający  ")"  i  wypisuje  na  ekranie 

"TRUE" jeśli tak jest, lub "FALSE" w przeciwnym wypadku. 
Wskazówka 1:  Wystarczy  czytać  plik  znak  po  znaku  i  pa-
miętać poziom zagnieżdżeń nawiasów dla poszczególnych 
wierszy

.  Musi  on  być  nieujemny  i  na  koniec  wiersza  wy-

nieść  0.  Przykłady  (z  zaznaczonym  poziomem  zagnież-
dżeń obok znaków nawiasów): 
TRUE:  (

1

 ... (

2

 .... )

 1

 .... (

2

.....)

1

 ...)

 0

  

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 

zanków  ‘a’  i  ‘A’.  Funkcja  zwraca  wartość  „TRUE”  jeżeli 
liczab znaków ‘a’ i ‘A’ jest parzysta (zero też jest parzyste) 
oraz  zwraca 

wartość  „FALSE”  w  przeciwnym  przypadku. 

Argumentem wejściowym funkcji (s) jest 

kolejny wiersz 

pliku. Wynik działania funkcji przedstawić na ekranie.  

Zad. 4.6.  
Program  czyta  wiersze  pliku  tekstowego  we6.txt.  Za  ka

ż-

dym  razem  po  napotkaniu  wiersza,  którego  pierwszym 
znakiem  jest 

'A'..'Z'  rozpoczyna  łącze-

nie  (sklejanie)  kolejnych  wierszy,  roz-
dzielając je spacją. Sklejony wiersz jest 
zapisywany do pliku wy6.txt, przy czym 
na  początku  w  nawiasach  jest  wpisy-
wana  jego  ilość  znaków.  Np.  dla 
we6.txt 

jak  w  ramce  zawartość  pliku 

wy6.txt b

ędzie następująca:  

(56)Wskazówka:  Można  sklejać  wier-
sze w tymczasowym łańcuchu. 
(34)Zapisywać przed kolejną kumulacją. 

 

Zad.4.7.  
Program czyta plik tekstowy "zad47.lpr" wiersz po wierszu 
i jeśli we wierszu znajduje się ciąg dwóch ukośników '//' to 
zapisu

je  dalszy  ciąg  tego  wiersza  do  pliku  tekstowego 

"koment.txt". oraz na ekran. Np. 
zad47.lpr 

koment.txt 

program zad4; //zest. 11 

zest. 11 

function max(a,b :byte):byte; 

wyzn. większą wartość 

begin //wyzn. większą wartość 

Zad.4.8.  
W kolejnych wierszach pliku tekstowego "we8.txt" zawarta 
jest albo liczba naturalna albo jakiś napis. Wiersz z liczbą 
naturalną  tym  różni  się  od  napisu,  że  występują  w  nim 
wyłącznie  cyfry  '0'..'9'  oraz  zanki  ’+’,’-‘,  i  separator  ‘.’. 
Napisać  program,  który  odczytuje  kolejne  wiersze 
wspomnianego  pliku  i  zapisuje  do  pliku  tekstowego 
"wy8.txt

"  wyłącznie  wiersze  zawierające  napisy.  Trzeba 

napisać  funkcję  JestLiczba  zwracającą    dla  danego 
wiersza true/false jeśli zawiera on liczbę/napis.  

Zad. 4.9.  
Zdefiniować  typ  liczby  zespolonej  TCmplx  jako  rekord  z 
polami re, im :real

. Napisać funkcje 4 działań na tych licz-

bach  wykonujące  +,  -,  *,  /.  Każda  funkcja  ma  dwa  argu-
menty przekazywane przez wartość oraz wynik typu TCm-
plx

.  Napisać  funkcję  CmplxToStr,  która  dla  argumentu 

TCmplx  wytwarza  string

,  np.  w  postaci  '3.14+j4.6'  (użyj 

funkcji FloatToStr). Przetestuj wykonywanie ciągu operacji, 
np, dla x, y, z :TCmplx 

Zadanie: z := MUL(ADD(x,y), x); 

 
 
 
 
 
 
 

 

to będzie 
pominięte... 
Wskazówka: 
Można 
sklejać wiersze 
w tymczasowym 
łańcuchu. 
Zapisywać 
przed kolejną 
kumulacją. 

background image

- 9 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Wybra

ne rozwiązania do Laboratorium 4 

 

program zad.4_3; 
{$mode objfpc}{$H+} 
Uses   SysUtils; 
const N=100; 
type tablica=array[1..N,1..N]of real; 
var plik1,plik2:textFile; 
    liczba:real; 
    tab:Tablica; 
    i,j,k:integer; 
 
begin 
  assign(plik1,'tablica.txt'); 
  assign(plik2,'tablica1.txt'); 
  reset(plik1); 
  j:=1; 
   while not Eof(plik1) do 
      begin 
      i:=1; 
      while not Eoln(plik1) do 
            begin 
                read(plik1,liczba); 
                tab[j,i]:=liczba; 
                i:=i+1; 
            end; 
      readln(plik1); 
      j:=j+1; 
    end; 
    j:=j-1; 
    i:=i-1; 
 
    rewrite(plik2); 
     for i := 1 to j do 
       begin 
         for k := 1 to j do 
           begin 
             write(plik2,tab[k,i]:5:3,'  '); 
           end; 
          writeln(plik2); 
       end; 
     close(plik1); 
     close(plik2); 
end. 

 
program zad4_6; 
{$mode objfpc}{$H+} 

Uses   SysUtils; 
var 
 wiersz, zdanie: string; 
 k: integer; 
 we, wy: Textfile; 
 zapis: boolean; 
 
begin 
  assignfile(we,'we6.txt'); 
  reset(we); 
  assignfile(wy,'wy6.txt'); 
  rewrite(wy); 
  zapis:=false; 
  zdanie:=''; 
  k:=0; 
  while not EoF(we) do 
    begin 
     readln(we,wiersz); 

     if wiersz[1] in ['A'..'Z'] then 
      begin 
        if zapis then 
        

writeln(wy,'(',k,')',zdanie); 

        writeln('(',k,')',zdanie); 
        k:=0; 

        zdanie:=wiersz; 
        k:=k+length(wiersz); 
        zapis:=true; 
      end 
     else 
      begin 
        zdanie:=zdanie+' '+wiersz; 
        k:=k+length(wiersz); 
        end; 
        end; 
    if zdanie[1]in ['A'..'Z'] then 
    writeln(wy,'(',k,')',zdanie); 
    writeln('(',k,')',zdanie); 
    closefile(wy); 
    closefile(we); 
    readln; 
end.

 

 
program zad4_7; 

{$APPTYPE CONSOLE} 
Uses   SysUtils;   / 
var 
 znak,pop :char; 
 k: byte; 
 we, wy: Textfile; 
 
begin 
  assignfile(we,'zad47.lpr'); 
  reset(we);             //odczyt 
  assignfile(wy,'komentarz.txt'); 
  rewrite(wy);   //zapis 
  k:=0; 
  pop:=#0; //znak pusty 
  while not EoF(we) do 
    begin 
     while not eoln(we) do 
     begin 
     read(we,znak); //czytaj znak 
     //kiedy zapis 
     if (znak='/') and (pop=#0) then k:=0; 
       if k=1 then write(wy,znak); //zapis 
       if (znak='/') and (pop='/') then 
       k:=1; //flaga zapisu ustawiona 
        pop:=znak; 
 
        end; 
        readln(we); 
        if k=1 then writeln(wy); 
        pop:=#0; 
      k:=0; 
    end; 
    closefile(wy); 
    closefile(we); 
    readln;    //koniec 
end. 
 

 

background image

- 10 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 5  

Wskaźniki i obiekty 

 

Na laboratorium należy korzystać z zadań omawianych na 
wykładzie. Zalecane jest wykonanie zadania 5.1 i 5.2. W 
zadaniach należy zastosować (a) zmienne dynamiczne 
oraz (b) 

technikę obiektową. 

Pr

zed kodowaniem algorytmów należy rysować grafy po-

kazujące zmianę wskaźników przy dodawa-
niu/usuwaniu/przeglądaniu elementów. 
 

Zad.5.1.

a. Tablica wskaźnków. 

Dane: Tablica 100 wskaźników do rekordów, w rekordzie: 
imie, nazwisko :string[80]. 
Program czyta: 
- i

ndeks komórki do wypełnienia 

- dane  
aż podamy indeks spoza zakresu (uwaga: można podać 
indeks wielokrotnie) 
Na koniec wypisuje wszystkie dane i niszczy zmienne dy-
namiczne. 

Zad.5.1

.b. Tablica wskaźników do obiektów. 

Dane: Tablica 100 komórek typu class, w klasie: imie, 
nazwisko :string[80], konstruktor. Dalej jak w zad. 5.1.a. 

Zad.5.2.a.  

Stos 

(wierzchołek St typu PStos, PStos=^TStos;) 

Dane: liczba zespolona: TZesp=rekord re, im 
:real; end; 
Operacje:  
a) wkładanie na stos: procedure push(var 
St:PStos;D:TZesp); i zdejmowanie ze stosu func-
tion pop(var St:PStos):TZesp;. 
b) dodawanie, odejmowanie i mnożenie pary z wierzchołka 
stosu: function dod(a,b:TZesp):TZesp;,  
function odej(a, b:TZesp):TZesp;., ... 
W programie głównym wykonać ciąg operacji zgodnie z 
zasada 

odwrotnej notacji polskiej. Np. obliczanie wyraże-

nia c:=a+(b*c) to w odwrotnej notacji polskiej  
c:=a b c * + 

, tj. wkładamy na stos abc i zastępujemy 

parę z wierzchołka najpierw iloczynem, a potem sumą): 
a.re:=1; a.im:=2; b.re:=3; b.im:=4; 
c.re:=5; c.im:=6; St:=nil; push(St,a); 
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;.  

Program główny: St:=TStos.Create; 
St.push(TZesp.Create(1,2)); St.push(TZesp. 
Create(3,4)); St.push(TZesp.Create(5,6)); 
St.push(TZesp.mnoz(St.pop,St. pop)); 
St.push(TZesp.dod(St.pop,St.pop)); 
c:=St.pop; c.Free; St.Free; 
Wskazówka: zmienna var c :TZesp; jest wskaźnikiem 
do obiektu. Nie trzeba dla niej wywoływac konstruktora, bo 
w instrukcji c:=St.pop; 

przekażemy do c adres istnieją-

cego obiektu (stworzonego konstruktorem dod). 

Zad.5.2.c.  
Do zad. 5.2.b dopisz konstruktor z parametrem typy string 
(przykład parametru: '1+j2') 
 

Zad.5.3.a,b Lista jednokierunkowa. 
Dane: Imię, nazwisko, rok urodzenia 
Operacje:  
a) 

dodawanie, tak że nazwiska są ułożone rosnąco alfabe-
tycznie. 

b) 

usuwanie elementu o określonym nazwisku 

c) 

wyświetlanie całej listy 

d) 

usuwanie całej listy 

 

Zad.5.4.b Kolejka. 
Dane: Imię, nazwisko 
Operacje:  
a)  dodawanie 

na końcu kolejki 

b)  usuwanie pierwszego elementu z kolejki  
c) 

wyświetlanie całej kolejki 

d) 

usuwanie całej kolejki 

 

Zad. 5.5. Drzewo binarne. 
Dane: Imię, nazwisko, rok urodzenia 
Operacje:  
a) dodawanie nowego liścia, tak że dla każdego węzła jego 

lewe poddrzewo ma mniejsze alfabetycznie nazwiska 
(rekurencja). 

b) wyszukiwanie elementu o określonym nazwisku (reku-

rencja, metoda preorder) 

c) wyświetlenie wszystkich węzłów (rekurencja, metoda 

inorder) 

d) Usunięcie całego drzewa (rekurencja, metoda postor-

der) 

 

background image

- 11 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

 

Wybrane rozwiązania do Laboratorium 5 
 
program zad5_1b;

 

{$mode objfpc}{$H+}  
type 
TKlasa= class   //def. klasy 
public 
  imie:string[80]; 
  nazwisko:string[80]; 
  constructor Create; 
  procedure wypisz; 
end; 
Wsk_klasy=^TKlasa;   //wskaźnik do klasy 
  Tablica = array [1..100]  of Wsk_klasy; 
var 
  Tab: tablica; //tablica wskaźników 
  i :byte; 
constructor TKlasa.Create;    //konstruktor 
Begin 
  imie:=''; 
  nazwisko:=''; 
end; 
 
procedure TKlasa.wypisz; 
begin 
  writeln(imie+ ' ' +nazwisko); 
end; 
 
begin 
i:=1; 
 while true do 
 begin 
  write('Podaj indeks '); 
  Readln(i); 
  if (i<1) or (i>100) then break; 
  if tab[i]<>nil then writeln('indesk zajety') 
  else 
    begin 
   new(Tab[i]); 
  Tab[i]^:=TKlasa.Create; 
   write('Podaj imie: '); 
   Readln(Tab[i]^.imie); 
   write('Podaj nazwisko: '); 
   Readln(Tab[i]^.nazwisko); 
    end; 
   end; 
 
  for i := 1 to 100 do 
    if Tab[i] <> nil then     begin 
     Tab[i]^.wypisz; 
     Tab[i]^.Free; 
     dispose(Tab[i]); 
    end; 
 
  readln; 
end. 

 

Rozwiązanie zad_5_2a; 
{$mode objfpc}{$H+} 
uses    SysUtils; 
type    TZesp = record 
        re,im: real; 
    end; 
   PStos = ^Tstos; 
    TStos=record 
        Poprz :PStos; 
        Dane :TZesp; 
    end; 
procedure push(var St:PStos; const D :TZesp); 
var     w :PStos; 
begin 
    w := St; 
    new(St); 
    St^.Dane := D; 
    St^.Poprz := w; 
end; 
function pop(var St:PStos): TZesp; 
var     w: PStos; 
begin 
    w:=St; 
    St := w^.Poprz; 
    Result:=w^.Dane; 
    dispose(w); 
end; 
function mnoz(a,b:TZesp): TZesp; 
begin 
    Result.re:=a.re*b.re-a.im*b.im; 
    Result.im:=a.re*b.im+b.re*a.im; 
end; 
function dod(a,b:TZesp): TZesp; 
begin 
    Result.re:=a.re+b.re; 
    Result.im:=a.im+b.im; 
end; 
function odej(a,b:TZesp): TZesp; 
begin 
    Result.re:=b.re-a.re; 
    Result.im:=b.im-a.im; 
end; 
var     St :PStos; 
    a,b,c: TZesp; 
begin 
    a.re:=1;    a.im:=2; 
    b.re:=3;    b.im:=4; 
    c.re:=5;    c.im:=6; 
    St:=nil; 
    push(St,a); 
    push(St,b); 
    push(St,c); 
    push(St,mnoz(pop(St),pop(St))); 
    push(St,dod(pop(St),pop(St))); 
    c:=pop(St); 
    writeln('a+(b*c) = ',c.re:5:2,' + ',c.im:5:2,'*i'); 
    readln; 
end. 
 

 

background image

- 12 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

Laboratorium 6

 

Aplikacje okienkowe 

 

Cel:

Tworzenie aplikacji w środowisku Lazarus 

Uwaga. 

Dla każdego z zadań należy stworzyć na dysku U: 

specjalny folder, gdzie będzie przechowywany plik projektu z 
plikami pomocniczymi. 

Zad. 6.1

. (na podst. wykładu) 

Własnoręcznie stworzyć jedną z aplikacji „StoperX” przed-
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, 
przycisk Koniec zamyka aplikację, cyfry stopera umieścić 
na panelu 2, na panelu 1 umieścić napis „Stoper”)  
Stoper4:

 

Zbudować na postawie komponentów: TPanel 

(x2), Ttimer, TButton (x4), Label, stoper elektroniczny: 
(zliczanie sek

und i minut, start od wartości 00:00, przycisk 

Reset uruchamia stoper od nowa, przycisk Stop zatrzymu-
je stoper, Start kontynuuje liczenie sekund, przycisk Ko-
niec zamyka aplikację, cyfry stopera umieścić komponen-
cie Label, na panelu

2 umieścić wszystkie przyciski, na 

panelu 

1 umieścić stoper, zliczanie co 200ms. 

Zad. 6.2. (na podst. 

wykładu lub zad.6.1) 

Zmodyfiko

wać 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”. 

Zad. 6.4. Zegar 
Napisać aplikację, która w oknie głównym pokazuje aktu-
alny czas. 
Wskazówka: funkcja Now (lub funkcja Time) oraz Time-
ToStr

Zad. 6.5. Poprawiony stoper z przyciskami Start/Stop 
Napisać aplikację stopera, która wyświetla różnicę czasu 
aktualnego i czasu startu wykorzystując funkcję Time lub 
Now

. Program ma posiadać przyciski START (liczenie 

czasu o

d 0) i STOP. Uwaga: Aplikacja Stoper z wykładu 

gubi czas np. podczas uśpienia systemu. To rozwiązanie 
ma usunąć tę wadę. 

Zad. 6.6.

*

 

Dynamiczna zmiana wielkości cyfr 

W aplikacji z zad 6.1 wielkość cyfr zmienia się stosownie 
do zmiennyc

h rozmiarów okna aplikacji. 

Wskazówki: Aby okno mogło zmieniać rozmiary trzeba 
właściwość BorderStyle ustawić na bsSizeable. Użyć w 
programie właściwości ClientHeight, ClientWidth 

 

Wybrane r

ozwiązania do Laboratorium 6 

 

Zad.6.1. Stoper1 

 

 

Var   min, sek :Integer; 
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
  

inc(sek); //tu będziemy co 1000ms 

  if sek >= 60 then 
  begin 
    sek := 0; 
    inc(min); 
  end; 
  Label1.Caption := IntToStr(min)+':'+IntToStr(sek) ; 
end; 

 

Zad.6.1. Stoper3 

 

procedure TForm1.ButtonKoniecClick(Sender: TObject); 
begin 
  Self.Close; 
end; 
 
procedure TForm1.ButtonStartClick(Sender: TObject); 
begin 
  min := 0; sek := 0; 
  Panel2.Caption := '00:00'; 
  Timer1.Enabled := TRUE; 
end; 
 
procedure TForm1.ButtonStopClick(Sender: TObject); 
begin 
  Timer1.Enabled := FALSE; 
end; 
 

background image

- 13 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
  

inc(sek);    //tu będziemy co 1000ms 

  if sek >= 60 then 
  begin 
    sek := 0; 
    inc(min); 
  end; 
panel2.caption:= IntToStr(min)+':'+IntToStr(sek); 
// panel2.caption:= MinSekToStr; 
end; 
 
 Zad.6.2 
 

 

 
procedure TForm1.ButtonResetClick(Sender: TObject); 
begin 
  Timer1.Enabled := False; 
  sek:=0; min:=0; 
  LabelMain.Caption := '00:00'; 
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; 
 

  LabelMain.Caption := IntToStr00(min)+':'+IntToStr00(sek); 
 
  if (sek >= 3) or (min > 0) then 
  begin 
    if (sek mod 2) = 1 then 
      Image1.Canvas.Brush.Color := clRed 
    else 
      Image1.Canvas.Brush.Color := clBlack; 
 
    Image1.Canvas.Ellipse(0,0,60,60); 
  end; 
end; 
 
 
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 
  begin 
    sek := 0; 
    inc(min); 
  end; 
  LabelMain.Caption := IntToStr(min)+':'+IntToStr(sek); 
end; 
 

 

 

background image

- 14 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

Ten i inne dokumenty są dostępne w folderze P:\Pascal. 

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.