Mateusz Kotowicz
127132
15.10.12
Języki, Automaty i Obliczenia
Laboratorium
Ćwiczenie 2
2FDI grupa L07
1. Kryteria oceny
kryterium
ocena
1
Brakuje celu ćwiczenia
2.0
2
Algorytm realizuje cel ćwiczenia i kod jest zgodny z algorytmem
3.0
3
W sprawozdaniu zamieszczono dokumentację klas
3.5
4
W kodzie są wcięcia (tabulatory) zwiększające czytelność
4.0
5
W kodzie są komentarze odwołujące się w sposób jednoznaczny do algorytmu
4.5
6
Prawidłowo rozwiązane zadanie dodatkowe
5.0
Ocena jest wyznacza w sposób przyrostowy, np. sprawozdanie spełniające kryteria 1, 2, 4, 5 i 6 ale nie
spełniające kryterium 3 ocenione zostanie na 3.0.
2. Cel ćwiczenia
Napisanie programu w języku PHP, który będzie wykonywał operację iloczynu (znajdowania części
wspólnej) na skończonych zbiorach wczytanych z pliku. Nieznana jest ilość zbiorów ani ich liczebność.
3. Struktura programu
Dokumentacja klas znajduje się w załączniku na końcu sprawozdania.
4. Algorytm programu
Algorytm metody iloczyn() klasy OperacjeNaZbiorach
1. Sprawdź ilość wszystkich zbiorów.
2. Przypisz pierwszy zbiór do zmiennej "iloczyn".
3. Pętla - dla każdego zbioru Zi, zaczynając od zbioru 2:
3.1. Pętla - dla każdego elementu zbioru "iloczyn":
3.1.1. Sprawdź, czy element należy do zbioru Zi.
3.1.2. Jeśli nie to usuń element ze zbioru "iloczyn".
3.1.3. Przejdź do następnego elementu zbioru "iloczyn".
3.2. Przejdź do następnego zbioru Zi.
4. Przypisz zbiór "iloczyn"do pola wynik.
5. Kod programu
5.1. Plik OdczytDanych.php
1
1
<?php
/∗ ∗
3
∗ Klasa o d c z y t u j a c a dane z p l i k u .
∗ @author 127132
5
∗/
c l a s s OdczytDanych
7
{
/∗ ∗
9
∗ P o l e p r z e c h o w u j e nazwĘ p l i k u , z k tÓr e g o wczytywane bĘdĘ dane .
∗ @var s t r i n g Nazwa p l i k u z danymi
11
∗/
p r i v a t e $ n a z w a P l i k u ;
13
/∗ ∗
15
∗ P o l e p r z e c h o w u j e z b i o r y p o b r a n e z p l i k u z danymi .
∗ @var a r r a y ( ) T a b l i c a z pobranymi z b i o r a m i
17
∗/
p r i v a t e
$ z b i o r y ;
19
21
/∗ ∗
∗ Metoda zwraca nazwĘ p l i k u z danymi .
23
∗ @return s t r i n g Nazwa p l i k u z danymi
∗/
25
p u b l i c
f u n c t i o n g e t N a z w a P l i k u ( )
{
27
r e t u r n $ t h i s −>n a z w a P l i k u ;
}
29
/∗ ∗
31
∗ Metoda u s t a w i a nazwĘ p l i k u z danymi .
∗ @param t y p e $ n a z w a P l i k u Nazwa p l i k u z danymi
33
∗/
p u b l i c
f u n c t i o n s e t N a z w a P l i k u ( $ n a z w a P l i k u )
35
{
$ t h i s −>n a z w a P l i k u = $ n a z w a P l i k u ;
37
}
39
/∗ ∗
∗ Metoda zwraca t a b l i c Ę z a w i e r a j ĘcĘ z b i o r y p o b r a n e z p l i k u .
41
∗ @return a r r a y T a b l i c a z e z b i o r a m i
∗/
43
p u b l i c
f u n c t i o n g e t Z b i o r y ( )
{
45
r e t u r n $ t h i s −>z b i o r y ;
}
47
/∗ ∗
49
∗ Metoda u s t a w i a t a b l i c Ę , k tÓra ma z a w i e r aĘ z b i o r y p o b r a n e z p l i k u .
∗ @param a r r a y $ z b i o r y T a b l i c a z e z b i o r a m i
51
∗/
p u b l i c
f u n c t i o n
s e t Z b i o r y ( $ z b i o r y )
53
{
$ t h i s −>z b i o r y = $ z b i o r y ;
55
}
57
/∗ ∗
∗ Metoda p o b i e r a z b i o r y z p l i k u z danymi .
59
∗/
p u b l i c
f u n c t i o n
o d c z y t a j ( )
61
{
2
$ z b i o r y = array ( ) ;
// 3 . 4 − 1
63
$ z b i o r = array ( ) ;
// 3 . 4 − 2
65
$ z n a k i = array ( " ␣ " , " \ t " , " \ r " , " \n" ) ;
// 3 . 4 − 4 . 3
$noweZnaki = " " ;
67
$ p l i k = fopen ( $ t h i s −>nazwaPliku , " r " ) ;
// 3 . 4 − 3
69
while ( ! f e o f ( $ p l i k ) )
{
71
$ l i n i a = f g e t s ( $ p l i k ,
4 0 9 6 ) ;
// 3 . 4 − 4 . 1
i f ( $ l i n i a === FALSE)
// 3 . 4 − 4 . 2
73
{
break ;
75
}
77
$ l i n i a = s t r _ r e p l a c e ( $ z n a k i , $noweZnaki ,
$ l i n i a ) ;
// 3 . 4 − 4 . 3
79
$znak1 = substr ( $ l i n i a ,
0 , 1 ) ;
// 3 . 4 − 4 . 4
$znakN = substr ( $ l i n i a , −1) ;
81
i f ( ( $znak1 !== " { " ) o r ( $znakN !== " } " ) )
{
83
break ;
}
85
$ l i n i a = rtrim ( $ l i n i a , " } " ) ;
// 3 . 4 − 4 . 5
87
$ l i n i a = ltrim ( $ l i n i a , " { " ) ;
89
$ z b i o r = explode ( " , " ,
$ l i n i a ) ;
// 3 . 4 − 4 . 6
91
$ z b i o r y [ ] = $ z b i o r ;
// 3 . 4 − 4 . 7
}
93
f c l o s e ( $ p l i k ) ;
// 3 . 4 − 5
95
$ t h i s −>z b i o r y = $ z b i o r y ;
// 3 . 4 − 6
}
97
}
?>
5.2. Plik OperacjeNaZbiorach.php
<?php
2
/∗ ∗
∗ Klasa wykonujĘca o p e r a c j e na z b i o r a c h .
4
∗ @author 127132
∗/
6
c l a s s
O p e r a c j e N a Z b i o r a c h
{
8
/∗ ∗
∗ P o l e p r z e c h o w u j e t a b l i c Ę z e z b i o r a m i .
10
∗ @var a r r a y T a b l i c a z e z b i o r a m i
∗/
12
p r i v a t e
$ z b i o r y ;
14
/∗ ∗
∗ P o l e p r z e c h o w u j e w y n i k i o b l i c z e Ź wykonanych na z b i o r a c h .
16
∗ @var a r r a y T a b l i c a z wynikiem
∗/
18
p r i v a t e $wynik ;
20
3
/∗ ∗
22
∗ Metoda zwraca z b i o r y , na k tÓr y c h metody k l a s y wykonujĘ o p e r a c j e .
∗ @return a r r a y T a b l i c a z e z b i o r a m i
24
∗/
p u b l i c
f u n c t i o n g e t Z b i o r y ( )
26
{
r e t u r n $ t h i s −>z b i o r y ;
28
}
30
/∗ ∗
∗ Metoda z a p i s u j e z b i o r y , na k tÓr y c h metody k l a s y wykonujĘ o p e r a c j e .
32
∗ @param a r r a y $ z b i o r y T a b l i c a z e z b i o r a m i
∗/
34
p u b l i c
f u n c t i o n
s e t Z b i o r y ( $ z b i o r y )
{
36
$ t h i s −>z b i o r y = $ z b i o r y ;
}
38
/∗ ∗
40
∗ Metoda zwraca wynik o b l i c z e Ź .
∗ @return a r r a y T a b l i c a z wynikiem
42
∗/
p u b l i c
f u n c t i o n getWynik ( )
44
{
r e t u r n $ t h i s −>wynik ;
46
}
48
/∗ ∗
∗ Metoda o b l i c z a i l o c z y n ( c zĘŹĘ wspÓl nĘ) z b i o rÓw .
50
∗/
p u b l i c
f u n c t i o n
i l o c z y n ( )
52
{
$ i l o s c _ z b i o r o w = count ( $ t h i s −>z b i o r y ) ;
54
$ i l o c z y n = $ t h i s −>z b i o r y [ 0 ] ;
56
f o r ( $ i =1; $ i <$ i l o s c _ z b i o r o w ;
$ i ++)
{
58
$ j = 0 ;
foreach ( $ i l o c z y n a s $ e l e m e n t )
60
{
i f
( in_array ( $ e l e m e n t ,
$ t h i s −>z b i o r y [ $ i ] ) == f a l s e )
62
{
unset ( $ i l o c z y n [ $ j ] ) ;
64
}
$ j ++;
66
}
}
68
$ t h i s −>wynik = $ i l o c z y n ;
70
}
}
72
?>
5.3. Plik ProgramJAO.php
<?php
2
r e q u i r e _ o n c e " OdczytDanych . php" ;
4
r e q u i r e _ o n c e " O p e r a c j e N a Z b i o r a c h . php" ;
4
6
/∗ ∗
∗ Program gŹÓwny . Zawiera metodĘ main .
8
∗ @author 127132
∗/
10
c l a s s ProgramJAO
{
12
/∗ ∗
∗ P o l e p r z e c h o w u j e w y n i k i ( t a b l i c e z e z b i o r a m i ) otrzymane z i n n y c h k l a s .
14
∗ @var a r r a y T a b l i c a z wynikiem
∗/
16
p u b l i c $wynik ;
18
/∗ ∗
∗ Metoda gŹÓwna main .
20
∗/
p u b l i c
f u n c t i o n main ( )
22
{
$ n a z w a P l i k u = " dane . t x t " ;
24
$OdczytDanych = new OdczytDanych ( ) ;
// 4 . 6 . 1
26
$ O p e r a c j e N a Z b i o r a c h = new O p e r a c j e N a Z b i o r a c h ( ) ;
// 4 . 6 . 5
28
$OdczytDanych−>s e t N a z w a P l i k u ( $ n a z w a P l i k u ) ;
// 4 . 6 . 2
$OdczytDanych−>o d c z y t a j ( ) ;
// 4 . 6 . 3
30
$ z b i o r y = $OdczytDanych−>g e t Z b i o r y ( ) ;
// 4 . 6 . 4
32
$ O p e r a c j e N a Z b i o r a c h −>s e t Z b i o r y ( $ z b i o r y ) ;
// 4 . 6 . 6
$ O p e r a c j e N a Z b i o r a c h −>i l o c z y n ( ) ;
// 4 . 6 . 7
34
$ t h i s −>wynik = $ O p e r a c j e N a Z b i o r a c h −>getWynik ( ) ;
// 4 . 6 . 8
}
36
}
?>
6. Zadania dodatkowe
6.1. Zadanie 2
Napisz algorytm funkcji zbiorPotegowy, która oblicza zbiór potęgowy 2
A
skończonego zbioru A.
Sformułuj algorytm w sposób jednoznaczy i nie budzący wątpliwości, tak, żeby można było na jego
podstawie napisać program.
Założenia:
— elementy zbioru A są poindeksowane kolejnymi liczbami naturalnymi, zaczynając od 1,
— zbiór A jest przekazywany jako parametr funkcji zbiorPotegowy.
1. Krok algorytmu nr 1
2. Krok algorytmu nr 2
3. Krok algorytmu nr 3
3.1. podpunkt
3.2. podpunkt
3.2.1. pod-podpunkt z odwołaniem do kroku 2
3.2.2. pod-podpunkt
3.3. . . .
5