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 (FreePascal)

…………….........

 

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 - Stoper 

…..…….. 

12 

7.  Laboratorium 7. Aplikacje okienkowe

…………..  14 

8. 

Laboratorium 8. Zaliczenie……………………….  15 

 

 

 

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 Pascal). 
 

 

1.  Na dysku U: 

utworzyć folder Pas a w nim folder Lab1

2. 

Przekopiować do niego zawartość foldera  
P:\1EF-DI\Wstep_do_Programowania\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 
reakcja 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 

a,  b  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 
Buduj  wszystko

)    i  odczytać  komunikat  po  podaniu  zbyt 

dużej wartości n. Należy stworzyć dużą tabelę  z  3 kolum-
nami i w niej notować 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-
stych 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 test

owania 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  -
cyfrowych.  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. 

Propono

wane 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

 

)  do  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:  dla  const  MaxN=4  zadeklaruj  typ  tablicy  do 
przechowywania  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.  wy-

nikowej c[ ] zamie

nień na Result[ ]. Wypisanie tablicy c[ ] 

umieść  w  procedure  Pisz(c  :TLiczba);  Zamiast  wczyty-
wania  tablic  a  (oraz  b)  użyj  function  CzytajA:TLiczba; 
zamieniając a[ ] na Result[ ] (i analogicznie w f. CzytajB). 
W programie nie powinno być żadnych zmiennych global-
nych!  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 Enter).  

 

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 baneró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.  
Program  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 odpowiednią 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  zamy

kają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  "we5.txt"  jest  kilka  wieszy  tekstu. 
Napisać 

program 

funkcję 

nazwie 

Parzystosc_A(s:string), 

która  sprawdza  czy  w  danym 

wierszu  jest  parzysta  liczba  zanków  ‘a’  i  ‘A’.  Funkcja 
zw

raca  wartość  „TRUE”  jeżeli  liczba  znaków  ‘a’  i  ‘A’  jest 

parzysta  (z

ero  też  jest  parzyste)  oraz  zwraca  wartość 

„FALSE” 

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 
n

a  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 
zapisuje  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  ’+’,’-‘.  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ą. 

Przed  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źników. 

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

indeks 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 

odwrotnej 

notacji 

polskiej  

c:=a  b  c  *  + 

,  tj.  wkładamy  na  stos  a,  b,  c  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 trz

eba 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: I

mię, 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 

następował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 sekund i minut, start o

d 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 u

mieś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ściwoś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 od 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 zmiennych 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.  Aplikacje 
 

Zad.7.1. 

Zbudować  Aplikację  „kalkulator”  arytmetyczny. 

Założenia: (a)dane wprowadzane w dwóch oknach teksto-
wych;  (b)  wyniki  w  oknie  tekstowym  (lub  etykiecie);  (c)  4 
przyciski na działania (+,-,*,/) (d) dwa przyciski: C (czyść), i 
Koniec

;  (e)  działania  arytmetyczne  wykonywane  będą  na 

dwóch liczbach całkowitych a wynik będzie liczbą całkowi-
tą/rzeczywistą  (f)  lub  działania  arytmetyczne  wykonywane 
będą na dwóch liczbach rzeczywistych . 
Każdemu przyciskowi będzie odpowiadał metoda (funkcja) 
która będzie wykonywała określone działanie arytmetycz-

ne. Np. przyciskowi    

+

 

  

będzie odpowiadała metoda: 

procedure TForm1.Button1Click(Sender: TObject); 
begin  
  a:=strtoint(Edit1.text); 
   b:=strtoint(Edit2.text); 
  c:=a+b; 
  Edit3.text:=inttostr(c); 
 Label1.caption:='suma'; 
End; 
Gdzie: a,b,c; zmienne globalne typu integer zdefiniowane 
 w klasie Form1 lub  w zmiennych globalnych  
(po linii: var Form1 :TForm1)  
 
Zad.7.2. 

Zbudować Aplikację „Silnia”, która będzie obliczać 

wartość silni dla podanej liczby (Komponenty: Button x1; 1 
Edit x1; 1 Label x1) 

Zad.7.3 Zbud

ować Aplikację „Licznik”, która będzie zliczać 

kliknięcia  na  przycisku1  oraz  zliczać  do  tyłu  po  kliknięciu 
na  przycisku  2,  w  oknie  edycyjnym  będzie  można  ustalić 
krotność zliczania (od 1 do 10). 

Zad.7.4. 

Zbudować Aplikację „Potęgowanie”, która będzie 

oblic

zać wartość potęgi danej liczby : a) wersja podstawo-

wa czyli tylko potęga całkowita dodania; b) potęga całkowi-
ta; c) potęga rzeczywista. 

Zad.7.5. 

Zbudować aplikację, „Równanie” w której można 

rozwiązać równanie kwadratowe. Założenia  
a) wsp. równania „a, b, c” będą podawane w 3 okienkach 
edycyjnych;  
b) wyniki rozwiązania (dowolnie, zalecane w 2 okienka 
Edit);  
c) wersja podstawowa gdzie wsp. a<>0  oraz rozwiązania 
rzeczywiste; b) wersja „plus” tzn. równanie stałej, liniowe i 
kwadratowe; e) pole wyboru z typem wyniku: rzeczywisty 
lub zespolony. 

 

 

 
 
 
 

 

 

background image

- 15 - 

 

1EF sem. 1, Laboratorium - 

Wstęp do programowania 

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

Laboratorium 8 

 
 

Zaliczenie 

 
 
 

Zaliczenie odbywa się indywidualnie przy kompu-
terze w środowisku Lazarus. Czas zaliczenia  50 
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.