Programowanie w VBA


Informatyka
Programowanie w VBA
Wykład 1(2)
Jerzy Duda, 2010
Zakres wykładów (1)
Programowanie, języki programowania
definicje
historia
Definiowane języka formalnego
składnia a semantyka
notacja BNF, EBNF
Paradygmaty programowania
imperatywny/proceduralny
funkcyjny
obiektowy
programowanie w logice
Translatory i interpretery
kompilator, preprocesor, asembler
interpreter, maszyna wirtualna
Jerzy Duda, WZ AGH, 2008 2010
1
Zakres wykładów (2)
Sposoby reprezentacji liczb
arytmetyka binarna
liczby całkowite
liczby zmiennopozycyjne
Podstawowe struktury danych
dane elementarne
dane zło\one
tablice
struktury
rekordy
Nieregularne struktury danych
listy
stosy
kolejki
Jerzy Duda, WZ AGH, 2008 2010
Zakres wykładów (3)
Algorytmy
pojęcie algorytmu
zło\oność obliczeniowa
algorytmy iteracyjne i rekurencja
podstawowe algorytmy sortowania
wyszukiwanie binarne
drzewa
haszowanie
Jerzy Duda, WZ AGH, 2008 2010
2
Zakres wykładów (4)
Programowanie obiektowe
klasy
właściwości i metody
konstruktory i destruktory
hermetyzacja
dziedziczenie
polimorfizm
modyfikatory widoczności
klasy abstrakcyjne
programowanie obiektowe z wykorzystaniem VBA
Jerzy Duda, WZ AGH, 2008 2010
Literatura
Algorytmy
S. Harris, J. Ross: Algorytmy. Od podstaw, Helion 2006
(Wrox)
G.T. Heineman, G. Pollice, S. Selkow: Algorytmy.
Almanach, Helion 2010
VBA
M. Lewandowski: Tworzenie makr w VBA dla Excela
2003/2007. Ćwiczenia, Helion 2007
J. Walkenbach: Excel 2003 PL. Programowanie w VBA.
Vademecum profesjonalisty, Helion 2004
A. Osyczka, R. Jankowski, I. Skalna, P. Krajewski:
Visual Basic dla Aplikacji, AGH Uczelniane Wydawnictwa
Naukowo-Techniczne 2006
Jerzy Duda, WZ AGH, 2008 2010
3
Dlaczego warto programować?
Programowanie
dobra zabawa
zajęcie twórcze
mo\liwość wyra\ania abstrakcyjnych idei w namacalnej formie
yródło pozytywnych nawyków
uwa\ne czytanie
myślenie analityczne
twórcza synteza
zdolność dostrzegania szczegółów
Ka\dy powinien nauczyć się, jak projektować oprogramowanie
yródło: Felleisen, Findler, Faltt,Krishnamurthi:  Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej , Helion 2003
Jerzy Duda, WZ AGH, 2008 2010
Program komputerowy (1)
Niklaus Wirth
ALGORYTMY + STRUKTURY DANYCH = PROGRAMY
Programy stanowią skonkretyzowane sformułowania abstrakcyjnych
algorytmów na podstawie określonej reprezentacji i struktury danych
Fundacja na rzecz Wolnej Infrastruktury Informacyjnej (FFII)
Program komputerowy oznacza sposób przetwarzania danych, które jeśli są
poprawnie opisane, mo\e być wykonywany przez komputer
SÅ‚ownik PWN
Program to ciąg instrukcji napisanych w języku zrozumiałym dla komputera
J. Barta i R. Markiewicz
Program to zestaw instrukcji (rozkazów) przeznaczonych do u\ycia
bezpośrednio lub pośrednio w komputerze w celu osiągnięcia określonego
rezultatu
Jerzy Duda, WZ AGH, 2008 2010
4
Program komputerowy (2)
Knuth Donald E.  Sztuka programowania
Program to wyra\enie metody obliczeniowej w języku
komputerowym
metoda obliczeniowa  procedura przekształcająca dane wejściowe
w wynik za pomocÄ… jednoznacznie zdefiniowanych, elementarnych
kroków
Program komputerowy  podstawowe rodzaje kodu
kod zródłowy  stanowiący zapis w określonym języku
programowania; zrozumiały dla człowieka (dalej kompilowany lub
interpretowany)
kod wykonywalny  zrozumiały dla maszyny; gotowy do wykonania
przez maszynę (postać binarna)
Jerzy Duda, WZ AGH, 2008 2010
Programowanie komputerowe
Słownik W. Kopalińskiego:
Proces sporządzania dokładnego zestawu instrukcji potrzebnych na to, aby
komputer mógł spełnić określone zadanie; zestaw ten obejmuje wybór (a.
wynalezienie) stosownego algorytmu, kodowanie i testowanie
Programowanie to proces projektowania, tworzenia i poprawiania kodu
zródłowego programów komputerowych [Wikipedia]
Etapy tworzenia oprogramowania (in\ynieria oprogramowania):
analiza wymagań systemowych
specyfikacja aplikacji
architektura systemu informatycznego
programowanie (implementacja)
kompilacja oprogramowania
testowanie oprogramowania
dokumentacja programu
integracja
pielęgnacja oprogramowania
Jerzy Duda, WZ AGH, 2008 2010
5
Język programowania
Język słu\ący do dialogu pomiędzy programistą a komputerem,
przeznaczony do opisu danych oraz algorytmów ich
przetwarzania
Język programowania to usystematyzowany sposób
przekazywania komputerowi poleceń do wykonania [wikipedia]
HOPL: system kodowania, który umo\liwia stworzenie programu
Niektórzy zawę\ają to pojęcie tylko do języków spełniających
warunek tzw. kompletności Turinga
Języki programowania klasyfikuje się ze względu na
paradygmaty
generacjÄ™
implementacjÄ™
Jerzy Duda, WZ AGH, 2008 2010
TrochÄ™ historii
Encyklopedia History
of Programming
Languages wylicza
8512 języków
programowania
Ludzkość na świecie
u\ywa obecnie
ok. 6-7 tysięcy języków
www.99-bottles-of-beer.net
program w 1318 językach
yródło rysunku: http://users.skynet.be/averkeyn/computer/histlang.html
Jerzy Duda, WZ AGH, 2008 2010
6
Historia języków (1)
org 100h
Assembler (Intel)
start:
mov ah, 9
mov dx, hello
int 21h
1943  pierwszy jÄ™zyk Plankalkül
1943
mov ax, 4C00h
opracowany przez Konrada Zuse
int 21h
hello db 'Hello World!','$'
(Bawaria); publikacja w 1948;
brak implementacji
R1.1(V0[:sig]) => R0
R1.2(V0[:m x sig]) => R0
0 => i | m + 1 => j
[W [ i < j -> [ R1.1(V0[i: m x sig]) => R0 | i + 1 => i ] ] ]
END
R1.3() => R0
'H';'e';'l';'l';'o';',';' ';'w';'o';'r';'l';'d';'!' => Z0[: m x sig]
R1.2(Z0) => R0
END
1952  pierwszy kompilator  język Autocode na komputer Mark 1
1952
opracowany przez Alicka Glennie a (Univ. of Manchester)
yródło kodów: "Hello, World!" in 66 Programming languages , http://www.scribd.com/doc/2276844
Jerzy Duda, WZ AGH, 2008 2010
Historia języków (2)
1954  Fortran (FORmula TRANslator system) - John Backus i inni
1954
naukowcy z IBM; Fortran II (1958) wprowadza pętle, funkcje i
procedury
C Fortran: Hello, world!
PROGRAM HALLO
WRITE (*,100)
STOP
100 FORMAT ('Hello, world!')
END
1958  LISP (LISt Processing)
1958
;;; Common Lisp: "Hello, world!"
 składnia nawiasowa (defun helloworld ()
(print "Hello, world!")
)(helloworld)
Jerzy Duda, WZ AGH, 2008 2010
7
Historia języków (3)
1960  Cobol (COmmon Business Oriented Langage) - COnference
1960
on DAta SYsystems Language; wprowadzenie rekordów
1964  Basic (Beginner s All-purpose Symbolic Instruction Code)
1964
- John Kemeny i Thomas Kurtz
10 REM BASIC: "Hello, world!"
20 PRINT "Hello, world!"
1970  Pascal opracowany przez
1970
Niklausa Wirtha  programowanie
strukturalne
program HelloWorld;
(* Pascal: Hello, world! *)
begin
WriteLn('Hello, world!');
end.
Jerzy Duda, WZ AGH, 2008 2010
Historia języków (4)
1972  Język C opracowany w 1972 r. przez Dennisa Ritchiego z
1972
Bell Telephone Laboratories dla systemu Unix
/* Hello world */
#include
int main(void)
{
printf("Hello, world!\n");
return 0;
}
1972  Smalltalk - pierwszy język zorientowany obiektowo
1972
(podstawy OOP Simula  1962)
1972  PROLOG - programowanie w logice (Francja)
1972
% Prolog: "Hello, world!"
?- write('Hello, world!') , nl .
poczÄ…tek lat 1970  SQL opracowany w IBM SEQUEL (Structured
poczÄ…tek lat 1970
English Query Language)
-- SQL: "Hello, world!"
SELECT 'Hello, world!' AS message;
Jerzy Duda, WZ AGH, 2008 2010
8
Historia języków (5)
1983  C++; C with Classes opracowany przez Bjarne a Stroustrupa
1983
(1979); bazowany na C i Simuli
#include
using namespace std;
int main() // Hello World
{
cout << "Hello, World!" << endl;
return 0;
}
1991  Java stworzona przez Jamesa Goslinga, programistÄ™ Sun
1991
(pierwotnie jako Oak); Java 1.0 (1995) - Write Once, Run Anywhere
class HelloWorld
{
public static void main(String args[])
{
System.out.println("Hello, World!");
}
}
Jerzy Duda, WZ AGH, 2008 2010
Historia języków (6)
1993  Ruby stworzony przez Yukihiro "Matz" Matsumoto; oparty na
1993
wielu paradygmatach
1995  PHP (PHP: Hypertext Preprocessor) opracowany pierwotnie
1995
przez Rasmusa Lerdorfa (Dania)
echo ""."Hello, world!".""; ?>
2000  C# opracowany przez Microsoft (zespół Anders Hejlsberga)
2000
jako część środowiska .NET; zaaprobowany jako standard przez
ECMA oraz ISO
using System;
class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Jerzy Duda, WZ AGH, 2008 2010
9
Popularność języków  TIOBE
yródło: http://www.tiobe.com
Jerzy Duda, WZ AGH, 2008 2010
Paradygmaty programowania
Paradygmaty programowania
Programowanie imperatywne (1)
Najbardziej pierwotny sposób programowania, w którym program
postrzegany jest jako ciąg poleceń dla komputera
Obliczenia to sekwencja poleceń zmieniających krok po kroku stan
maszyny, a\ do uzyskania oczekiwanego wyniku
Stan maszyny to zawartość całej pamięci oraz rejestrów
i znaczników procesora
Ten sposób patrzenia na programy związany jest ściśle
z budową sprzętu komputerowego o architekturze von Neumanna,
w którym poszczególne instrukcje to właśnie polecenia zmieniające
stan
Demo:
http://osilek.mimuw.edu.pl/images/9/91/kontener.html?
nazwa_animacji=/images/7/71/Pp-1.1.1
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
10
Programowanie imperatywne (2)
Języki wysokiego poziomu  takie jak Basic czy C  posługują się
pewnymi abstrakcjami, ale wciÄ…\ odpowiadajÄ… paradygmatowi
programowania imperatywnego
Instrukcje podstawienia działają na danych pobranych z pamięci i
umieszczają wynik w tej\e pamięci, zaś abstrakcją komórek pamięci
sÄ… zmienne
int main()
Sub Pierwszy
{
Dim s as Integer
int i, n, s;
Dim n as Integer
n = InputBox()
n=scanf("%d",&n);
s = 1
s = 1;
For i = 2 To n
for(i=2;i<=n;i++)
s = s * i
{s*=i;
MsgBox(s)
printf("%d",s);}
Next i
return 0;
End Sub
}
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
Programowanie proceduralne
i strukturalne
Programowanie proceduralne to paradygmat programowania
Programowanie proceduralne
zalecajÄ…cy dzielenie kodu na procedury, czyli fragmenty
wykonujące ściśle określone operacje
Procedury nie powinny korzystać ze zmiennych globalnych
(w miarę mo\liwości), lecz pobierać i przekazywać wszystkie dane
(czy te\ wskazniki do nich) jako parametry wywołania
Programowanie strukturalne to podzbiór programowania
Programowanie strukturalne
proceduralnego zalecajÄ…ce:
stosowanie konstrukcji języka takich jak pętle (WHILE) i
instrukcje warunkowe (IF ELSE)
unikanie instrukcji GOTO i wielokrotnych punktów wejścia i
wyjścia z kodu danego podbloku programu
(Inna definicja:) paradygmat zalecajÄ…cy hierarchiczne dzielenie kodu
na moduły, które komunikują się jedynie poprzez dobrze określone
interfejsy
yródło: http://pl.wikipedia.org/wiki/Programowanie_strukturalne
Jerzy Duda, WZ AGH, 2008 2010
11
Dekompozycja funkcjonalna
Hierarchiczny podział systemu (programu) na bloki
funkcyjne (operacje, procedury, moduły)
Ka\dy z bloków:
wykonuje określone zadanie dla systemu
ma jasno zdefiniowane wejścia i wyjścia
mo\e być traktowany oddzielnie w stosunku do pozostałych
bloków
Jerzy Duda, WZ AGH, 2008 2010
Programowanie obiektowe (1)
W programowaniu obiektowym program to zbiór porozumiewających
się ze sobą obiektów
Obiekty to jednostki zawierające pewne dane i umiejące wykonywać
na nich pewne operacje
Wa\nÄ… cechÄ… jest tu powiÄ…zanie danych (czyli stanu) z operacjami
na nich (czyli poleceniami) w całość, stanowiącą odrębną jednostkę
 obiekt
CechÄ… nie mniej wa\nÄ… jest mechanizm dziedziczenia, czyli
mo\liwość definiowania nowych, bardziej zło\onych obiektów, na
bazie obiektów ju\ istniejących
Demo:
http://osilek.mimuw.edu.pl/images/9/91/kontener.html?
nazwa_animacji=/images/e/ef/Pp-1.1.2
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
12
Programowanie obiektowe (2)
Zwolennicy programowania obiektowego uwa\ajÄ…, \e ten
paradygmat dobrze odzwierciedla sposób, w jaki ludzie myślą
o świecie
public class Student {
String nazwisko;
String imie;
int ocena;
long nrIndeksu;
void ocen(int o);
{
this.ocena = o;
}
}
Przykłady języków: Smalltalk, C++, Java, C#
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
Programowanie funkcyjne (1)
Program to po prostu zło\ona funkcja (w sensie matematycznym),
która gdy otrzyma dane wejściowe wylicza pewien wynik
Brak stanu maszyny: nie ma zmiennych, a co za tym idzie nie ma
\adnych efektów ubocznych
Nie ma te\ imperatywnych z natury, tradycyjnie rozumianych pętli
(wymagajÄ… np. zmiennych do sterowania ich przebiegiem)
Demo:
http://osilek.mimuw.edu.pl/images/9/91/kontener.html?
nazwa_animacji=/images/9/93/Pp-1.1.3
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
13
Programowanie funkcyjne (2)
Konstruowanie programów to składanie funkcji, zazwyczaj
z istotnym wykorzystaniem rekurencji
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
let rec factorial n =
if n = 0
Lisp
then 1
else n * factorial (n - 1)
System.Console.WriteLine(factorial anInt)
F#
Przykłady języków: Lisp, Scheme, ML (bakusa), Haskell, F#
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/; Wikipedia
Jerzy Duda, WZ AGH, 2008 2010
Programowanie logiczne (1)
Na program składa się zbiór zale\ności (przesłanki, predykaty) i
pewne stwierdzenie (cel, konkluzja)
Wykonanie programu to próba udowodnienia celu w oparciu o
podane przesłanki
Obliczenia wykonywane sÄ… niejako  przy okazji dowodzenia celu
Podobnie jak w programowaniu funkcyjnym, nie  wydajemy
rozkazów , a jedynie opisujemy, co wiemy i co chcemy uzyskać
Demo:
http://osilek.mimuw.edu.pl/images/9/91/kontener.html?
nazwa_animacji=/images/d/dc/Pp-1.1.4
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
14
Programowanie logiczne (2)
ojciec(jan, jerzy).
ojciec(jerzy, janusz).
ojciec(jerzy, józef).
dziadek(X, Z) :- ojciec(X, Y), ojciec(Y, Z).
?- dziadek(X, janusz).
Przykłady: PROLOG, Mercury, Oz
yródło: Małgorzata Moczurad, Włodzimierz Moczurad: Paradygmaty programowania, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
Programowanie sterowane
zdarzeniami
Przepływ w programie zale\y od akcji u\ytkownika (kliknięcie
myszki, naciśnięcie klawisza) lub wiadomości z innych
programów
W programowaniu wsadowym przepływ jest określony przez
programistÄ™
Wersja wsadowa
read a number (from the keyboard) and store it in variable A[0]
read a number (from the keyboard) and store it in variable A[1]
print A[0]+A[1]
Wersja sterowana zdarzeniami
set counter K to 0
repeat {
if a number has been entered (from the keyboard) {
store in A[K] and increment K
if K equals 2 print A[0]+A[1] and reset K to 0
}
}
Jerzy Duda, WZ AGH, 2008 2010 yródło: http://en.wikipedia.org/wiki/Event-driven_programming
15
Generacje języków (1)
1GL
nie było translatora, który był dokonywał kompilacji lub
asemblacji kodu
programowanie odbywało się bezpośrednio w języku maszyny
program był efektywny, ale wymagał ka\dorazowego przepisania
dla innej maszyny
01001001010010
101100101010
2GL
kod programu zapisywany symbolicznie w języku asemblera
poprawiona czytelność kodu dla człowieka
podstawowa wada: równie\ związany z językiem danej maszyny
wykorzystywany, tam gdzie potrzebny jest b. szybki kod
wynikowy: jądra systemów, sterowników, fragmentów kodu gier,
szyfrowania
xor ax, ax
mov bx, ax
yródło: http://pl.wikipedia.org
jmp skok1
Jerzy Duda, WZ AGH, 2008 2010
Generacje języków (2)
3GL
program zapisywany w języku wysokiego poziomu
łatwo zrozumiały dla człowieka, m.in. przez zastosowanie
zmiennych
let a=0
let b=a
pierwsze przykłady: Fortran, ALGOL, COBOL
goto skok1
nowsze języki: Basic, C, C++, Java
4GL
język programowania albo środowisko programistyczne nastawione
na rozwój aplikacji dla biznesu
cel: redukcja czasu potrzebnego na stworzenie programu oraz
zmniejszenie liczby błędów
zalicza siÄ™ do nich:
generatory raportów (np. PS)
SELECT 0 FROM dummytable
hurtownie danych (np. SAS)
języki baz danych (np. SQL)
yródło: http://en.wikipedia.org
Jerzy Duda, WZ AGH, 2008 2010
16
Generacje języków (3)
4GL (c.d.)
niektórzy autorzy nie uwa\ają języków 4GL za prawdziwe języki
inni proponują określać tym mianem tylko języki umo\liwiające
programowanie obiektowe
5GL
ideą jest aby komputer sam rozwiązywał problem
bazuje na rozwiązywaniu problemów poprzez dostarczenie
ograniczeń, a nie na algorytmie dostarczonym przez programistę
Freuder: "to jak Święty Graal dla programowania  u\ytkownik
dostarcza problem, a komputer sam go rozwiÄ…zuje"
do języków 5GL zalicza się większość języków programowania w
logice (PROLOG) oraz w logice z ograniczeniami
wykorzystują osiągnięcia sztucznej inteligencji
yródło: http://en.wikipedia.org
Jerzy Duda, WZ AGH, 2008 2010
Generacje języków (4)
5GL  definicja IEEE
5GL to język, który realizuje koncepcje systemów opartych na
wiedzy, systemów ekspertowych, systemów wnioskowania oraz
przetwarzaniu języka naturalnego
5GL  alternatywna definicja
5GL to środowisko programistyczne, które wykorzystuje graficzny
interfejs u\ytkownika w celu stworzenia kodu zródłowego, który jest
następnie kompilowany przy u\yciu języka 3GL lub 4GL
Programowanie graficzne umo\liwia Å‚atwiejsze stosowanie klas,
poruszanie siÄ™ po ich hierarchii, itd
Jerzy Duda, WZ AGH, 2008 2010
17
Kompilator
Kompilator  program, który przetwarza kod napisany w
jednym języku (tzw. języku zródłowym) na równowa\ny kod
w drugim języku (tzw. języku wynikowym)
Języki wynikowe generowane przez kompilatory
język (kod) maszynowy dowolnego komputera od
mikrokontrolera do superkomputera
przenośny kod pośredni dla ró\norodnych maszyn
wirtualnych (Java i platforma .NET)
inny język programowania (istnieją np. kompilatory
tłumaczące z języka Fortran na język Pascal); zwane są
translatorami
Asembler tłumaczy kod zapisany w języku symbolicznym
na język maszynowy
yródło: Wojciech Complak: Podstawy kompilatorów, http://wazniak.mimuw.edu.pl/
Jerzy Duda, WZ AGH, 2008 2010
Interpreter
Interpreter  program komputerowy, który analizuje kod zródłowy
programu a przeanalizowane fragmenty wykonuje
Wykonanie programu za pomocÄ… interpretera jest wolniejsze a
do tego zajmuje więcej zasobów systemowych ni\ wykonanie
kodu skompilowanego
Interpreter musi analizować ka\de wyra\enie i następnie
wykonać akcję, a kod skompilowany jedynie wykonuje akcję
Analiza wyra\enia nazywana jest "kosztem interpretacji"
W implementacjach będących w pełni interpreterami wykonanie
wielokrotne tego samego fragmentu kodu wymaga wielokrotnej
interpretacji tekstu
Cykl edycja-interpretacja-debugowanie mo\e czasami być
jednak znacznie krótszy ni\ cykl edycja-kompilacja-
uruchomienie-debugowanie
yródło: http://pl.wikipedia.org/
Jerzy Duda, WZ AGH, 2008 2010
18


Wyszukiwarka

Podobne podstrony:
access programowanie w vba
Excel 2013 PL Programowanie w VBA dla bystrzakow
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6
Międzynarodowy Program Badań nad Zachowaniami Samobójczymi
CSharp Introduction to C# Programming for the Microsoft NET Platform (Prerelease)
Instrukcja Programowania Zelio Logic 2 wersja polska
Program wykładu Fizyka II 14 15
roprm ćwiczenie 6 PROGRAMOWANIE ROBOTA Z UWZGLĘDNIENIEM ANALIZY OBRAZU ARLANG
io port programming 3ogqzy3bscrrpgv753q3uywjfexgwwoiiffd46a 3ogqzy3bscrrpgv753q3uywjfexgwwoiiffd46a
2009 12 Metaprogramowanie algorytmy wykonywane w czasie kompilacji [Programowanie C C ]
Podstawy Programowania Wersja Rozszerzona
koło Programy Goofy

więcej podobnych podstron