Bascomania


Strony znajdujące się w kategorii: Kurs

Obsługa wielu plików tekstowych
Większość edytorów tekstu pozwala na jednoczesną pracę nad kilkoma dokumentami jednocześnie. Możemy wyróżnić trzy typowe podejścia do konstruowania interfejsu aplikacji: SDI (Single Document Interface) – każdy dokument w osobnym oknie, MDI (Multiple Document Interface) – wewnątrz obszaru głównego okna aplikacji znajdują się osobne okna dla każdego dokumentu (możliwy widok kilku okien na raz), · ...

Zarządzanie otwartymi dokumentami
Nie odpowiedzieliśmy jeszcze na najważniejsze pytanie, czyli jak zarządzać kilkoma otwartymi dokumentami na raz. Poznaliście dotąd takie struktury dynamiczne jak listy jedno- dwukierunkowe, stosy i kolejki. W środowisku Borland'a nie musimy sami tworzyć takich struktur. Do dyspozycji mamy np. obiekt klasy TObjectList, który jak sama nazwa wskazuje jest listą obiektów. Udostępnia wszystkie podstawowe metody potrzebne do dodawania, usuwa...

Lista łańcuchów (StringList)
Klasa TStringList jest wyspecjalizowaną klasą służącą do przechowywania łańcuchów tekstowych, może być użyta do podstawienia bezpośrednio do własności Lines komponentów RichEdit i Memo. Najważniejszym polem tej klasy, służącym do przechowywania łańcuchów, jest pole Strings. Ustawienie pierwszego elementu listy może wyglądać na przykład tak: StringList1->Strings[0] = „To jest pierwszy ciąg znaków&rdq...

Algorytm podziału zmiennej
Przeprowadzenie większości analiz wymaganych w projekcie wymagało będzie podziału dłuższych łańcuchów na podłańcuchy. Poszczególne podłańcuchy oddzielone są określonym separatorem np. \\, \.\, \;\ lub \,\. Dostarczyliśmy Wam funkcję Tokenize która wykonuje właśnie to zadanie. Jest ona zapisana w pliku modułu. Jedyne co musicie zrobić to włączyć ów moduł do programu (a jak to zrobić powinniście wiedzieć z kursu). W praktyce programiści bardzo często korzyst...

Prezentacja statystyki
W celu zaprezentowania wyników analizy statystycznej tekstu programista może wykorzystać kolejny komponent typu TMemo, w którym umieści wyniki w postaci tekstowej, np. tak: Podany tekst zawiera 352 słów, 45 wyrazów, 4 zdań, 1 akapit. Łańcuchy znakowe można do siebie dodawać, a liczbę całkowitą na jej reprezentację tekstową konwertujemy wykorzystując funkcję IntToStr. Tak więc powyższy napis można stworzyć przy pomocy następ...

Analiza liczby znaków w wyrazie
Celem tej analizy jest ustalenie najczęściej spotykanej liczby znaków w wyrazie. Efektem analizy powinna być tabela, zawierająca w pierwszym wierszu liczbę znaków, w drugim zaś liczbę słów, które mają dokładnie tyle znaków. Sposób prezentacji wyników powinien naprowadzić nas na rozwiązanie problemu – czyli stworzenie algorytmu. Załóżmy więc że mamy tablicę liczb całkowitych o n polach. Chcemy ją wypełnić danymi w ten sposób, aby pole o indeksie i zawi...

Komponent PaintBox
W celu narysowania dowolnego rysunku na PaintBox\ie, najprościej odwołać się do właściwości Canvas, a następnie do właściwości Pen oraz metody LineTo(int x, int y) i MoveTo(int x, int y). Metoda LineTo służy do rysowania prostej linii pomiędzy punktem, w którym aktualnie znajduje się "długopis" (po ang. pen) a punktem wskazanym przez współrzędne x, y. Punktem początkowym zawsze jest x = 0, y = 0. Przy czym należy pamięt...

Zdarzenia do obsługi ruchu myszy
Przy rysowaniu na płótnie Canvas komponentu PaintBox, pomocne będą zdarzenia OnMouseDown, OnMouseMove i OnMouseUp. Sprawdzenie, który przycisk myszy został wciśnięty można wykonać następująco: if(Shift.Contains(ssLeft)) …; Przykładowa obsługa zdarzenia OnMouseDown: void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Shift.Contains(ssLeft)) PaintBox...

Komponenty do przeglądania katalogów
Poznaliście już okna dialogowe służące do otwierania plików. Jednak przy przeglądaniu dużej ilości plików każdorazowe używanie okna dialogowego nie jest wygodne. Istnieją komponenty, które znacznie ułatwiają przeglądania katalogów bez wykorzystania okien dialogowych. Znajdują się one w zakładce Win3.1 i są to: DriveComboBox – wybór dysku DirectoryListBox – wybór katalogu FileListBox – wybór pliku FilterComboBox – wybó...

Obsługa kółka myszy – zdarzenie OnMouseWheel
Komponent Image obsługuje standardowe zdarzenia myszy, z których przydadzą się OnMouseMove (ruch myszy), OnMouseUp (puszczenie dowolnego przycisku myszy), OnMouseDown (wciścnięcie dowolnego przycisku myszy). Niestety ruch kółka myszy obsługiwany jest jedynie przez zdarzenie OnMouseWheel głównej formy (w naszym przypadku Form1). Wewnątrz zdarzenia OnMouseWheel interesujące mogą być informacje o stanie przycisków myszy (Shift),...

Kadrowanie
Chcąc wykadrować obraz musimy mieć możliwość narysowania prostokąta określającego nowe krawędzie obrazu. Własność Canvas dysponuje metodami, które znacznie ułatwiają rysowanie. Kod umieszczony poniżej spowoduje narysowanie prostokąta, którego lewy górny róg znajduje się w punkcie (10,20), a prawy dolny róg w punkcie (30,30). Image1->Canvas->Rectangle(10,20,30,30); Zwykły prostokąt (Rectangle) raz naryso...

Instrukcje proste, typy zmiennych
Instrukcje podstawienia zapisywane są ze znakiem równości = pełniącym rolę operatora przypisania Znak równości wykorzystywany jest też do zapisu relacji równosci - jego znaczenie wynika z kontekstu Instrukcje nie kończą się średnikami Instrukcje napisane w jednej linii rozdziela się przecinkami Instrukcje czytania i pisania zapisane są w postaci wczytaj(lista zmiennych), drukuj(ciąg wyrażeń) Instrukcja blokowa (złożona) tworzona jest poprzez ujęcie ...

Funkcje i procedury
Rozróżniamy dwa typy podprogramów: funkcje, które zwracaja jakas wartosc poprzez swoja nazwe i wywoływane są w wyrażeniach procedury, które nie muszą niczego zwracać (a jesli zwracają, to poprzez parametry) i wywoływane sa jak zwykłe instrukcje. Odpowiednikiem procedur sa w jezyku C/C++ funkcje bez typu (typu void). Nagłówki funkcji i procedur umieszczamy w osobnej linii. Parametry podprogramów podajemy w nawiasach, poprzedzajac je informacja o typie i ...

Przeglad metod konstruowania algorytmów
Jak doskonale wiemy, tworzenie projektów informatycznych opiera się w dużej mierze na formułowaniu i implementacji algorytmów, które maja za zadanie własciwe przetworzenie danych i rozwiązanie postawionych przed nami problemów. Algorytmy można sklasyfikowac na kilka różnych sposobów,ale wsród nich najważniejszy jest podział ze względu na techniki ich konstruowania. Są pewne techniki tworzenia algorytmów, których zastosowanie prowadzi do efektywniejszego ro...

Programowanie dynamiczne
Programowanie dynamiczne (optymalizacja dynamiczna, PD) jest strategią tworzenia algorytmów przeznaczoną przede wszystkim do rozwiązywania zagadnień natury optymalizacyjnej (w skrócie – gdy mamy zadanie minimalizacji bądź maksymalizacji jakiejś wartości). Zasada stosowana w optymalizacji dynamicznej jest pewnego rodzaju modyfikacją metody „dziel i rządź” – opiera się na jednokrotnym rozwiązywaniu tych samych podproblemów. Nierzadko zdarza się, że pewien po...

Programowanie dynamiczne cz. 2
Najczęściej rozwiązania podproblemów w programowaniu dynamicznym są zapisywane w pamięci komputera (na przykład w tablicy jedno- lub dwuwymiarowej), a następnie w momencie potrzeby rozwiązania danego podproblemu – jeśli już było wcześniej rozwiązane - zamiast konieczności rekurencyjnych wywołań funkcji odwołujemy się do uprzednio zapamiętanej w pamięci wartości rozwiązania. Powyższa koncepcja rozwiązywania zadań gwarantuje obniżenie „czasu pracy” algorytmu...

Algorytmy z powrotami
Czasem może nam się zdarzyć, że natrafimy na problem, którego rozwiązywanie bedzie najefektywniejsze, jeśli zamiast stosowania specjalizowanych technik użyjemy reguły znanej nam wszystkim z życia codziennego pod nazwa „metody prób i błedów”. Algorytmy odnoszące się do tej reguły określamy mianem algorytmów z powrotami (ang. backtracking algorithms). Otóż wyobraźmy sobie nasz problem jako ciąg kroków, które należy wykonać, by dojść do celu. Każdy krok, któr...

Kolejka, czyli struktura FIFO
Kolejka (ang. queue) jest jednym z podstawowych abstrakcyjnych typów danych. Oprócz kolejki równie ważna liniowa struktura danych jest stos, o którym także dowiecie się w tym rozdziale. W tej chwili spróbujemy przybliżyć najważniejsze właściwości kolejki, która jest często określana mianem FIFO (First In - First Out), co wolnym tłumaczeniu znaczy \"pierwszy wchodzi - pierwszy wychodzi\". Otóż kolejka jest rodzajem struktury przechowującej zbiór danych. Do ...

Stos, czyli struktura LIFO
Stos (ang. stack) jest jedną z najważniejszych struktur danych używanych w algorytmach komputerowych. Podstawowe cechy można zawrzeć w stwierdzeniu \"ostatni wchodzi - pierwszy wychodzi\", czyli w skrócie LIFO (Last In – First Out). Hasło podobne brzmiące jak w przypadku struktury kolejki, jednak zasada przetwarzania danych jest zgoła przeciwna. Tam dane były przetwarzane w kolejności pojawienia sie na wejściu, a w przypadku stosu sa one „obsługiwane” dokł...

Stos znakowy - tworzenie odwrotnej notacji polskiej (ONP)
Jak już wcześniej wspominaliśmy, stos jest taką strukturą danych, która skutecznie pomaga zwiększyć efektywność niektórych algorytmów. Pokażemy to na przykładzie obliczeń związanych z Odwrotną Notacją Polską (ONP), znana w światowej literaturze pod skrótem RPN – Reverse Polish Notation. Warto na wstępie wyjaśnić podstawy tej notacji. Obecnie najczęściej używana notacja znana nam wszystkim jest notacja infiksowa (inaczej: wrostkowa), która jest konwencjonal...

Stos liczbowy - obliczanie wartosci wyrażeń zapisanych w ONP
Wiemy już, jak przetworzyć zapis w notacji konwencjonalnej do postaci ONP. Za chwilę dowiemy się, jak za pomocą stosu - tym razem liczbowego - w szybki sposób obliczać wartość wyrażenia przedstawionego właśnie w zapisie postfiksowym. Okazuje się, że taki algorytm może być naprawdę prosty w zapisie, a przy tym efektywny. Tym razem jest nam potrzebny ciąg wejściowy będący zapisem wyrażenia w notacji ONP oraz stos pozwalający na przechowywanie liczb. Wynik wy...

SelectionSort
Jest to prosty i zarazem klasyczny rodzaj sortowania. Zakładamy, że mamy pewien zbiór danych o liczności n. Sposród n danych wybieramy wartość najmniejsza i wstawiamy na początek zbioru posortowanego. W tym momencie dysponujemy już zbiorem (n-1) danych nieposortowanych, z którego znów selekcjonujemy te daną o najmniejszej wartości i przenosimy na drugie miejsce do zbioru posortowanego. Czynność te wykonujemy aż do momentu, gdy zbiór nieposortowany (zawiera...

BubbleSort
Sortowanie babelkowe (czasem spotykane jest inne określenie – sortowanie przez zamianę) jest trzecim algorytmem porządkowania danych należącym do metod sortowania elementarnego. Nazwa algorytmu pomaga w ogólnym zrozumieniu jego działania - w podobny sposób, jak bąbelki powietrza unoszą się w kierunku powierzchni wody, tak samo również elementy większe od pozostałych są „przesuwane” w prawą stronę tablicy T. Owo przemieszczanie się elementów polega na zamia...

Porównanie efektywnosci elementarnych metod sortowania
Wstkie trzy omówione algorytmy charakteryzują się złożonością obliczeniowa O(n2) – z tego powodu programiści korzystają z nich tylko przy porządkowaniu małych zbiorów danych. Sortowanie babelkowe przebiega najwolniej z całej grupy (srednio 3 razy wolnej niż sortowanie przez wstawianie) - podyktowane jest to zdecydowanie największą liczbą zamian elementów („unoszacych sie pecherzyków”). BubbleSort jest bardziej przydatny niż sortowanie przez wybór czy sorto...

Sortowanie przez scalanie - MergeSort
Zbliżonym algorytmem do metody QuickSort jest sortowanie przez scalanie (ang. MergeSort). Jego idea została przedstawiona po raz pierwszy przez Johna von Neumanna, jednego z pionierów informatyki. Koncepcja sortowania przez scalanie jest przejrzysta. Metoda MergeSort opiera się, podobnie jak algorytm sortowania szybkiego, na zasadzie „dziel i zwycieżaj”. W tym przypadku kroki tej reguły można wyrazic nastepujaco: „dziel” - załóżmy, że dane przechowujemy ...

Przeszukiwanie liniowe
Najbardziej oczywistym i zarazem naturalnym sposobem wyszukiwania danych jest przeszukiwanie liniowe (sekwencyjne). Należy jednak na wstępie zaznaczyć, że używanie takiego rodzaju algorytmu jest godne polecenia jedynie w sytuacji, gdy nie posiadamy jakichkolwiek informacji o danych, które należy przeszukać. Algorytm jest bardzo prosty. Odwołując się ponownie do aspektów życia codziennego, taki sposób przeszukiwania można porównać ze znajdywaniem ksiażki na...

Przeszukiwanie binarne
W sytuacji, gdy dane są w pewien sposób uporządkowane (na przykład posortowane), znacznie bardziej użyteczna od wyszukiwania liniowego jest metoda przeszukiwania binarnego. Idea algorytmu jest taka, że dzielimy tablice T na połowy i sprawdzamy wartość środkowej komórki tablicy (w ten sposób od razu pomijamy konieczność przeszukania połowy tablicy). Jeśli jej wartość jest ta, której szukamy, to wyszukiwanie jest zakończone. W przeciwnym razie dzielimy nową ...

Słowniki
Jedna z kluczowych grup problemów postawionych przed programistami jest wydajne poszukiwanie konkretnych informacji w zbiorach danych, które często są gromadzone w postaci ogromnych baz danych. W tym podrozdziale poznamy strukturę, dla której możliwa jest implementacja efektywnych algorytmów wyszukiwania informacji – tą strukturą jest słownik. Mianowicie słownik (ang. dictionary) jest abstrakcyjnym typem danych, na którym przeprowadzane są w zasadzie trzy ...

Algorytm „naiwny” (brute-force)
Jest to najprostszy algorytm wyszukiwania wzorca. Algorytm tego typu jest bardzo prosty zarówno w zrozumieniu, jak i implementacji, jednak ma przy tym swoje wady. Otóż, jak łatwo sie domyślić, jest on zdecydowanie wolniejszy niż bardziej złożone metody służące do osiągniecia tego samego celu. Należy jednak pamiętać, że zdecydowana wiekszość nowocześniejszych metod wyszukiwania wzorca opiera sie właśnie na tym podstawowym sposobie wyszukiwania. Algorytm „na...

Algorytm KMP (Knutha, Morrisa, Pratta)
Pamietamy, że algorytm „naiwny” ma swoje wady. Podczas porównywania kolejnych symboli wzorca z symbolami tekstu nie jest wykorzystywana informacja o tej części wzorca, która już została sprawdzona. Mianowicie, gdy w danej iteracji okaże się, że symbole wzorca i tekstu nie są zgodne, algorytm przechodzi do następnej zewnętrznej iteracji zwiększając przesunięcie s o 1, a porównania symboli zaczynamy od pierwszego z nich. I w tym momencie autorzy nowego algor...

bascomania.pl