o autorach

201
O AUTORACH > ZAKOŃCZ Multimedialny podręcznik dla Policealnego Studium Technicznego – Zarządzanie bazami danych Elbox Laboratoriu m Informaty ki

Upload: ayasha

Post on 12-Jan-2016

62 views

Category:

Documents


2 download

DESCRIPTION

E. L. I. Elbox. Laboratorium. Informatyki. Multimedialny podręcznik dla Policealnego Studium Technicznego – Zarządzanie bazami danych. O AUTORACH. >. ZAKOŃCZ. SPIS TREŚCI. 1. I WSTĘP II CEL PRACY III ELI Wiadomości wstępne Algorytm Edycja klocka Paleta klocków - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: O AUTORACH

O AUTORACH > ZAKOŃCZ

Multimedialny podręcznik dla Policealnego Studium Technicznego – Zarządzanie bazami danych

ElboxLaboratoriumInformatyki

Page 2: O AUTORACH

I WSTĘPII CEL PRACYIII ELI Wiadomości wstępne Algorytm Edycja klocka Paleta klocków Tablica Taśma Projekt Dostępne okna Interfejs i czujniki Skróty klawiaturowe Pasek narzędzi Wprowadzenie do budowania algorytmów Algorytm liniowy - obliczanie sumy dwóch liczb Algorytm rozgałęziony - sprawdzanie warunku Algorytm rozwiązania równania kwadratowego Obliczenie wartości średniej Znajdowanie największej z podanych liczb Największy wspólny dzielnik - algorytm Euklidesa Dzielenie liczb całkowitych (pętla DOPÓKI) Pierwiastek kwadratowy (pętla POWTARZAJ) Sumowanie liczb nieparzystych (pętla DLA) Zgadnij liczbę Projekty Sumowanie ułamków Wykresy funkcji Rozkład liczby naturalnej na czynniki Tabliczka mnożenia Z systemu dziesiętnego na dowolny Porządkowanie ciągów Wyszukiwanie liczby Znajdowanie największej liczby Sortowanie ciągu Rozwiązywanie równania metodą połowienia Rekurencja Wprowadzenie do rekurencji Rekurencja pełna Odwracanie ciągu Zmiana rekurencji na iterację Kombinacje Ciąg Fibonacciego Sortowanie przez scalanie Przykładowy projekt   

1

SPIS TREŚCI

> >> ZAKOŃCZ<

Page 3: O AUTORACH

IV GRAFIKA Wiadomości wstępne Tryby graficzne Podprogramy graficzne Struktura programu w C++ Tworzenie animacji przy użyciu strony kart graficznych Style tekstu w trybie graficznym Funkcja getimage i putimage Tworzenie linii użytkownika Przerwania – wykorzystanie Przykładowy projektV ZARZĄDZANIE BAZAMI DANYCH Stałe - liczby, znaki i ciągi znaków, nazwy, słowa kluczowe Typy danych – typy zmiennych Wyprowadzenie danych na ekran Wczytywanie danych z klawiatury Operatory 2 – argumentowe Operator warunkowy Kolejność wykonywania działań Instrukcje Pętle Funkcje Rekurencja Zmienne globalne i lokalne Tablice Wskaźniki Struktura Unia Wskaźniki do struktur Dołączenie pliku # include Praca z plikami (zapis, odczyt) Przykładowy projekt Najczęstsze błędy podczas pisania programów w języku C++ Uwagi i wnioski Bibliografia 

2

SPIS TREŚCI

> ZAKOŃCZ<

Page 4: O AUTORACH

Zadaniem pracy dyplomowej było zrobienie prezentacji do nauczania programowania , w której zawarte są wszystkie programy z „ ELI ” i „ C++ ”. Pierwszym krokiem było zgromadzenie potrzebnych materiałów, czyli wszystkich programów. Cała praca składa się z 200 stron i podzielona jest na trzy działy:          ELI        GRAFIKA        ZARZĄDZANIE BAZAMI DANYCH Cała praca została umieszczona na płycie CD-ROM i dołączona do pracy dyplomowej.

I WSTĘP

SPIS TREŚCI > ZAKOŃCZ<

3

Page 5: O AUTORACH

Prezentację tę stworzono z myślą o uczniach Policealnego Studium Technicznego, umieszczając w niej ogólne wiadomości oraz przykładowe programy mogące pomóc im opanować materiał nauczania obowiązujący w tej klasie. Zawarty w niej opis działania programu ELI ( Elbox Laboratorium Informatyki ) służy do tworzenia algorytmów przy wykorzystaniu środowiska Windows, natomiast język C++ umożliwia pisanie rzeczywistych programów użytkowych i rozbudowywaniu systemów. Praca ta może być doskonałym narzędziem do nauki programowania.

II CEL PRACY

SPIS TREŚCI > ZAKOŃCZ<

4

Page 6: O AUTORACH

Program ELI jest oprogramowaniem edukacyjnym, przeznaczonym do wspomagania nauczania o algorytmach, czyli pomocą w wyrabianiu algorytmicznego myślenia. Został wykonany nowoczesnymi środkami informatycznymi o najpopularniejszym środowisku oprogramowania, jakim jest obecnie system Windows. Program ten służy do budowania algorytmów postaci schematów składający się z klocków, w których z kolei są zawarte podstawowe kroki algorytmów, elementarne i bardziej złożone. Klocki są tutaj jedynie formą reprezentowania działań i nie ograniczają rozważań.

Program Eli może być pomocny w nauczaniu algorytmicznego myślenia, którego wybranie jest jednym z głównych celów nauczania informatyki.

Osobie sięgającej po program ELI, forma zapisu algorytmu tworzonego przez ten program może się skojarzyć ze schematem blokowym. Jest to dobre skojarzenie, jednak nie należy ograniczać programu ELI do schematów blokowych w ich tradycyjnej postaci. Możliwości programu wykraczają daleko poza klasyczne schematy blokowe – ich realizację osiągnięto dzięki skorzystaniu z możliwości środowiska programowego Windows. Dotychczas schematy blokowe (lub schematy działań) były wykorzystywane najczęściej do zapisywania jedynie kolejnych kroków algorytmów wraz ze wskazaniem ich kolejności wykonywania. Gdy stosowano do tego komputer, było możliwe symulowanie działania algorytmu dla różnych wartości danych. Wymieńmy najważniejsze cechy programu ELI, w kontekście nauczania algorytmicznego myślenia:  ● Budowanie algorytmu bez programowania – najważniejszą zaletą programu jest jego możliwość wykorzystania go do nauki budowania algorytmów, a następnie śledzenia ich działania bez konieczności zapisania algorytmu w postaci programu komputerowego jakimś języku programowania. Zarówno dla nauczyciela jak i ucznia nabycie umiejętności posługiwania się tym programem może być sprawdzianem umiejętności algorytmicznego myślenia. ● Pomoc w nauce zapisywania algorytmów języku programowania – program ELI może być również przydatny w nauce metod programowania, rozumiany jako wykorzystywanie języka programowania wyższego rzędu do zapisywania algorytmów w postaci zrozumiałej dla komputera.

III ELI

SPIS TREŚCI > >> ZAKOŃCZ<

5

Page 7: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

6

III ELI

W tym przypadku można najpierw objaśnić i zobrazować znaczenie i działanie podstawowych konstrukcji programistycznych, takich jak instrukcje iteracyjne ( FOR, WHILE, REPEAT) i warunkowe (IF) układając dla nich odpowiednie algorytmy. Gdy podstawowe instrukcje są już uczniom znane – można posługiwać się programem ELI, gdy chcemy poznać dokładniej działanie algorytmu, być może już zaprogramowanego, śledząc kolejne jego kroki i zmiany zachodzące w wartościach zmiennych i w innych strukturach danych dla różnych wartości danych wejściowych dla algorytmu.Program ELI został wykonany nowoczesnymi narzędziami programistycznymi i jest wykorzystywany w środowisku systemu Windows. Znajomość tego środowiska nie jest jednak konieczna by korzystać z programu, chociaż przydaje się i przyspiesza nabycie sprawności w posługiwaniu się nim i znajomość sposobu poruszania się w tym środowisku.

Page 8: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

7

III ELI

AlgorytmJest to opis, krok po kroku jak rozwiązać damy problem. Opis ten powinien być dokładny i nie pozostawiać wątpliwości co do wykonania algorytmu. Jednym ze sposobów przedstawiania algorytmów są schematy blokowe. Takie schematy blokowe budujemy z klocków. Każdy klocek ma precyzyjnie określone zadanie. W ELI istnieje podstawowa i rozszerzona paleta klocków. Na planszy układa się algorytm, a następnie symulować jego działanie. Każdy algorytm musi mieć punkt startu (tylko jeden). Powinien mieć również co najmniej jeden klocek końca. W ciągu klocków pomiędzy punktem startu i końca nie może być dziur - przerw w połączeniach między klockami. Układanie klockówZa pomocą myszy można podnieść klocek z palety (wskazując go kursorem myszy i naciskając lewy przycisk) i położyć na planszy (wciskając przycisk myszy kiedy klocek znajdzie się nad wybranym miejscem). W podobny sposób można przenieść klocek na nowe miejsce na planszy. Klocek można skopiować wskazując go kursorem myszy, naciskamy klawisz Shift oraz lewy przycisk myszy i przenieść duplikat klocka na inne miejsce. Przeniesienie klocka poza górną krawędź planszy lub naciśnięcie klawisza Delete (przy zaznaczonym klocku) powoduje jego skasowanie.

Prawidłowe Nieprawidłowe

Wiadomości wstępne Algorytm

Page 9: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

8

Edycja klockaWiększość klocków ma wewnętrzne pola, które trzeba wypełnić, by określić co będzie się działo podczas wykonywania klocka. Wskazujemy klocek kursorem myszy, naciskamy prawy przycisk myszy i otwieramy okno dialogowe charakterystyczne dla klocka. Po jego wypełnieniu i wybieramy przycisk OK (jeśli chcemy zatwierdzić to co wpisaliśmy) lub Anuluj (jeśli chcemy zrezygnować). Można również wybrać Pomoc w celu uzyskania informacji o wypełnianiu realizacji klocka. Paleta klockówPodstawową paletą klocków można rozszerzyć o dwa zestawy klocków przez wywołanie z menu Opcje/Paleta klocków. Po zaznaczaniu odpowiedniego zestawu w palecie będą dostępne klocki:

. Dodatkowe - pozwalają korzystać z procedur i obiektów;

. Interfejsowe - obsługują czujniki. Klocki podstawowe Początek algorytmu Miejsce startu algorytmu. Od tego miejsca rozpoczyna się wykonywanie algorytmu. Może być tylko jeden taki klocek na planszy. W przypadku używania projektu może być tylko jeden taki klocek w całym projekcie.

Koniec algorytmu Zakończenie działania algorytmu. Klocek, na którym kończy się wykonanie algorytmu. Może być kilka takich klocków.

III ELI Wiadomości wstępne Edycja klocka / Paleta klocków

Page 10: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

9

III ELI Wiadomości wstępne Paleta klocków

Wprowadzenie danej Przypisanie zmiennej pobranej wartości. Komunikat - dowolny tekst (trzy linie) wyświetlany w specjalnym okienku dialogowym. Nazwa zmiennej - nazwa zmiennej, której będzie przypisana wartość wyrażenia wprowadzona przy wykonywaniu klocka. Brak nazwy zmiennej powoduje błąd wykonania.

Wyprowadzenie wyniku Wyprowadzenie wyników obliczeń. Wartość wyświetlana - dowolne wyrażenie, którego wynik będzie i wyświetlony w chwili wykonania. Brak wartości nie powoduje błędu wykonania.

Page 11: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

10

Wykonanie obliczeń Wykonanie operacji arytmetycznych i logicznych. Lista operacji - lista, której linie mają postać nazwa _zmiennej := wyrażenie. Możliwe jest wprowadzenie 32 linii tekstu (przejście do nowej linii odbywa się przez wciśnięcie Ctrl+Enter). Każda linia stanowi oddzielną operację. Nazwa_ zmiennej nie może przekroczyć 16 znaków, zaczynający się od litery, zawierający litery, cyfry i znaki '-', '@'. Wyrażenie jest to zapis wykonywanej operacji dopuszczający operatory arytmetyczne '+', '-', '*', 'I', nawiasy ( ), oraz funkcje.

Funkcje Definicja funkcji składa się z nazwy :funkcji i bezpośrednio po niej argument w nawiasach okrągłych, np. sin(a1fa). Argumentem funkcji może być dowolne wyrażenie.

Zdefiniowane są następujące funkcje standardowe: sin sinus cos cosinus tg tangens log logarytm dziesiętny ln logarytm naturalny sqrt pierwiastek kwadratowy arcsin arcus sinusarccos arcus cosinus arctg arcus tangenspow funkcja wykładnicza 10 do potęgi exp funkcja wykładnicza e do potęgi

III ELI Wiadomości wstępne Paleta klocków

Page 12: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

11

Sprawdzenie warunku Sprawdzenie warunku powoduje rozgałęzienie algorytmu, w zależności od warunku algorytm przejdzie w lewo albo w prawo. Jest sześć relacji zgodnych z notacją Pascala: <, >, <=, >=, =, <> lub języka C: <, >, <=, >=, =, !::=

III ELI Wiadomości wstępne Paleta klocków

Page 13: O AUTORACH

12

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Tablica

Tablica  Tablica służy do przechowywania danych i ma budowę podobną do tabeli - zawiera wiersze i kolumny. Element tablicy można znaleźć znając numer jego wiersza i kolumny czyli adres w tablicy. Program ELI oferuje dwa rodzaje tablic: jednowymiarowe - składające się z jednej kolumny i dwuwymiarowe - o dowolnej liczbie kolumn i wierszy. Otwórzmy okno tablicy (Okno/Tablica) i zobaczmy jak jest ona zbudowana. Wiersze i kolumny są ponumerowane od zera. Do dowolnego pola można wstawić wartość - należy w tym celu wskazać kursorem myszki to pole, nacisnąć lewy przycisk myszy, by je wybrać (wybrane pole ma niebieską obwódkę), wreszcie wcisnąć prawy przycisk myszy - pojawi się okno edycji pola tablicy, w którym można wpisać liczbę. Po jego zatwierdzeniu (OK) w wybranym polu pojawi się wpisana wartość. Klocek Zapis do tablicy użyty w algorytmie powoduje ten sam efekt, natomiast klocek Odczyt z tablicy powoduje pobranie wartości z podanego pola tablicy. Tablicę można zapisać na dysku (Edycja/Zapisz Tablicę) w postaci pliku z rozszerzeniem ATA oraz odczytać z dysku (Edycja/Odczytaj Tablicę).Wypełnioną tablicę łatwo zamienić na wykres. Wystarczy przejść do okna tablicy, nacisnąć klawisz Shift i prawy przycisk myszy (lub nacisnąć klawisz" 5" na klawiaturze numerycznej, przy wyłączonym Num Lock). Otworzy się okno konfiguracyjne tablicy, w którym należy wybrać Wykres wg tablicy jednowymiarowej lub Wykres wg tablicy dwuwymiarowej w zależności od rodzaju używanej tablicy.

Klocki obsługujące tablicę z zestawu Zaawansowane:

Zapis do tablicy Wpisanie wartości do pola tablicy. Pozycja - adres (indeks) określający pole tablicy. W przypadku tablicy dwuwymiarowej współrzędne należy oddzielić przecinkiem. Brak lub niewłaściwa ilość parametrów określających adres powoduje błąd wykonania. Wartość zapisywana - dowolne wyrażenie, którego wynik będzie obliczony i umieszczony w polu określonym przez adres. Brak wartości powoduje błąd wykonania.

Page 14: O AUTORACH

13

SPIS TREŚCI > >><< ZAKOŃCZ<

Odczyt z tablicy Przypisanie zmiennej wartości odczytanej z pola tablicy. Pozycja - adres (indeks) określający pole tablicy. W przypadku tablicy dwuwymiarowej współrzędne należy oddzielić przecinkiem. Brak lub niewłaściwa ilość parametrów określających adres powoduje błąd wykonania. Nazwa zmiennej - nazwa zmiennej, której będzie przypisana wartość odczytana z pola tablicy. Brak nazwy zmiennej powoduje błąd wykonania.

III ELI Wiadomości wstępne Tablica

Page 15: O AUTORACH

14

SPIS TREŚCI > >><< ZAKOŃCZ<

Taśma  Taśma dobrze się nadaje do przechowywania ciągu liczb, jest ona rodzajem pojemnika na dane o budowie liniowej. Jest wyposażona we wskaźnik - operacje zapisu na taśmie i odczytu z niej dotyczą wskazywanego pola. Otwórzmy okno taśmy (Okno/Taśma) i zobaczmy jak jest ona zbudowana. Kolejne pola są ponumerowane od zera. Do dowolnego z nich możemy wstawić wartość - należy w tym celu wskazać kursorem myszki pozycję, nacisnąć lewy przycisk myszy, by wybrać pozycję (wybrana pozycja ma niebieską obwódkę), wreszcie nacisnąć prawy przycisk myszy - pojawi się okno, w którym można wpisać wartość. Po zatwierdzeniu (OK) w wybranym polu pojawia się wpisana liczba. Klocek Zapis na taśmę użyty w algorytmie powoduje ten sam efekt, natomiast klocek Odczyt z taśmy powoduje pobranie wartości z bieżącej pozycji taśmy. Taśmę można zapisać na dysku (Edycja/Zapisz Taśmę) w postaci pliku z rozszerzeniem .ATT oraz odczytać z dysku (Edycja/Odczytaj Taśmę). W zestawie klocków Zaawansowane znajdują się 4 klocki odnoszące się do taśmy:

III ELI Wiadomości wstępne Taśma

Zapis nas taśmę Zapisanie wartości wyrażenia do taśmy na bieżącej - wskazywanej pozycji. Wartość zapisywana - dowolne wyrażenie, którego wynik będzie obliczony i umieszczony w polu aktualnie wskazywanym przez wskaźnik taśmy, po tej operacji wskaźnik taśmy przesuwany jest automatycznie na następne pole. Brak wartości powoduje błąd wykonania.

Page 16: O AUTORACH

15

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Taśma

Odczyt z taśmy Przypisanie zmiennej wartości odczytanej z taśmy. Odczytywana jest wartość ze wskazywanej - bieżącej pozycji taśmy. Nazwa zmiennej - nazwa zmiennej, do której będzie podstawiona wartość odczytana z pozycji taśmy aktualnie wskazywanej przez wskaźnik, po tej operacji wskaźnik taśmy przesuwany jest automatycznie na następne pole. Brak nazwy zmiennej powoduje błąd wykonania.

Przesuń wskaźnik na początek taśmy Ustawia wskaźnik taśmy na początek (pozycja O). Brak pól do edycji.

Przesuń wskaźnik na określoną pozycję taśmy Wskazywane pole staje się polem bieżącym, do którego będą się odnosić operacje odczytu i zapisu. Pozycja - wyrażenie określające pozycję, na którą zostanie przesunięty wskaźnik taśmy. Brak wyrażenia w tym polu powoduje błąd wykonania.

Page 17: O AUTORACH

16

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Projekt

Projekt  Można zbudować algorytm składający się z kilku plansz, zawierających procedury. Należy w tym celu najpierw otworzyć projekt (Projekt/Otwórz projekt). Procedura musi zaczynać się od klocka Początek procedury, a kończyć na klocku - Koniec procedury. Może być ona budowana na tej samej planszy co główny algorytm, ale wskazane jest, by każda procedura była umieszczona na osobnej planszy. Aby procedura była funkcją, czyli przekazywała wartość, w klocku ją wywołującym trzeba wpisać podstawienie: nazwaZmiennej := nazwaProcedury. Projekt można zapisać na dysku (Projekt/Zachowaj) w postaci pliku opisującego jego konfigura<1:ję o rozszerzeniu .A TP oraz odczytać z dysku (Projekt/Otwórz). Oprócz tego powinny być zapisane wszystkie plansze składające się na projekt (Plik/Zachowaj lub Plik/Zachowaj jako...) W zestawie klocków Zaawansowane znajdują się 3 klocki obsługujące procedury:

Wywołanie procedury do wykonania Przekazanie sterowania do procedury. Klocek ten może być użyty wtedy gdy jest otwarty projekt.Nazwa procedury - nazwa wywoływanej procedury lub w przypadku funkcji przekazującej wartość wyrażenie postaci NazwaZmiennej := NazwaFunkcji Parametry aktualne - lista parametrów wywołania procedury oddzielonych spacjami. Mogą tu występować nazwy zmiennych i liczby.

Page 18: O AUTORACH

17

SPIS TREŚCI > >><< ZAKOŃCZ<

Początek procedury - rozpoczyna wykonanie procedury Nazwa procedury - identyfikator funkcji (nazwa). Parametry formalne - lista zmiennych lokalnych, którym zostaną przypisane wartości parametrów wywołania. Różna ilość parametrów w klockach Wywołania procedury i Początku procedury powoduje błąd wykonania, podobnie jak wystąpienie innego wyrażenia niż nazwa zmiennej w liście parametrów.

III ELI Wiadomości wstępne Projekt

Koniec procedury Kończy wykonanie procedury i powoduje powrót do planszy, z której został wywołany. Może być kilka takich klocków. Wartość zwracana - wartość zwracana przez funkcję, jeżeli procedura nie przekazuje wartości pozostaje nie wypełnione. Wartością zwracaną może być dowolne wyrażenie. W przypadku braku wartości pomimo przypisania przy wywołaniu procedury sygnalizowany jest błąd wykonania.

Page 19: O AUTORACH

18

SPIS TREŚCI > >><< ZAKOŃCZ<

Dostępne okna Okno komentarza  Każdy klocek można wyposażyć w komentarz - by to zrobić należy wskazać klocek i nacisnąć prawy przycisk myszy oraz klawisz SHIFT. Pojawi się okno, w którym można wpisać krótki tekst. Jeśli chcemy, żeby pojawiał się on w trakcie wykonywania algorytmu, należy przed uruchomieniem algorytmu otworzyć okno komentarza (Okno/Komentarz). Okno - plansza algorytmu  Na planszy można układać algorytm z klocków dostępnych w palecie a następnie symulować jego działanie. Plansza ma wielkość 64 klocki (w poziomie) na 48 klocków (w pionie). Jednocześnie może być otwartych kilka plansz. Okno zmiennych  Otwierając okno zmiennych możemy uzyskać przegląd zmiennych i ich wartości (polecenie z menu Okno/Zmienne). Okno można przesunąć w dowolne miejsce ekranu (najprościej wywołać Okno/Uporządkuj okna). W trakcie wykonania algorytmu pojawiają się w nim informacje o kolejnych zmiennych:. nazwa zmiennej,. aktualna jej wartość (znak? oznacza, że wartość nie jest określona),. nazwa planszy, na której zmienna występuje,. poziom wywołania. 

III ELI Wiadomości wstępne Dostępne okna

Page 20: O AUTORACH

19

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Interfejs i czujniki

Interfejs i czujniki  Podłączenie interfejsu polega na połączeniu go kablem (bez dodatkowych kart) z portem szeregowym (RS232) komputera. W menu Opcje/Interfejs trzeba wybrać numer portu, do którego podłączony jest interfejs (COM l lub COM2) i zaznaczyć, że interfejs jest włączony. Należy również włączyć zasilacz interfejsu. Włączenie interfejsu sygnalizuje zielona dioda w jego obudowie. Żółta dioda znajdująca się obok zapala się gdy uruchomimy algorytm.Trzy czujniki pozwalają mierzyć temperaturę, natężenie światła i poziom dźwięku. Łączymy je z interfejsem: najbliżej zielonej diody - mikrofon, do kolejnego wejścia termistor, a do ostatniego - fototranzystor. Dwa ostatnie czujniki są zabezpieczone kapturkami, które przed pomiarem należy zdjąć.Interfejs jest obsługiwany przez program - do algorytmu wstawiamy klocek odczytu z interfejsu i wybieramy, który z czujników będzie używany. Odczyt z interfejsu   Przypisanie zmiennej wartości odczytanej z interfejsu. Odczyt dokonywany jest z jednego z trzech czujników: temperatury, światła lub dźwięku. Zmienna – nazwa zmiennej, której będzie przypisana wartość odczytana z interfejsu. Brak nazwy zmiennej powoduje błąd wykonania.

Okno śladu Otwierając okno śladu (Okno/Ślad) można uzyskać dokładną relację z przebiegu wykonania algorytmu - listę wykonywanych przez algorytm działań. Okno można przesunąć w dowolne miejsce ekranu (najprościej wywołać Okno/Uporządkuj okna). Jeśli teraz uruchomimy algorytm, to jego kolejne kroki zostaną zapisane w oknie śladu.Pojawia się w nim:- poziom wywołania,- nazwa planszy, która jest wykonywana,- wynik wykonania klocka,- opis klocka.Ślad algorytmu możemy zachować na dysku (Edycja/Zapisz ślad) w postaci pliku tekstowego.

Page 21: O AUTORACH

20

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Skróty klawiaturowe

Skróty klawiaturowe CTRL+F9 - uruchomienie wykonania algorytmu F9 - wykonanie ciągłe algorytmu F8 - wykonanie tylko jednego klocka algorytmu F7 - zakończenie wykonania algorytmu W oknie algorytmu  F2 - ustawienie pułapki W oknie tablicy INS - edycja pola tablicy5 z pola numerycznego - zmiana sposobu wyświetlania tablicy W oknie taśmy  INS - edycja pola taśmy

Page 22: O AUTORACH

21

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wiadomości wstępne Pasek narzędzi

Pasek narzędzi  Pasek narzędzi umieszczony na górze ekranu pod głównym menu umożliwia szybkie wywołanie najczęściej używanych poleceń.

Ikony menu

Page 23: O AUTORACH

22

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Algorytm liniowy- obliczanie sumy dwóch liczb

Algorytm liniowy - obliczanie sumy dwóch liczb Pracę w ELI zaczynany otwierając projekt, a w nim planszę, na której będziemy budowali algorytm. Wybieramy z menu polecenie Plik/Nowy Projekt w oknie które się otwiera wpisujemy jego nazwę (np. suma) i zaznaczamy, co chcemy utworzyć:◊ nową planszę,◊ tablicę,◊ taśmę. Pojawia się zielona plansza i zestaw klocków z lewej strony. Aby zbudować algorytm należy przenieść klocek z palety na planszę. Spróbujmy zbudować algorytm obliczający sumę dwóch liczb, a oto plan algorytmu.1. Start.2. Wczytanie dwóch liczb3. Obliczenie sumy tych liczb4. Wyprowadzenie wyniku5. Zakończenie algorytmu

Każdy algorytm musi mieć punkt startu (tylko jeden) , jest on pierwszym klockiem w algorytmie. Następnym klockiem będzie wprowadzenie danych , aby wczytać dwie liczby musimy ustawić dwa takie klocki, w pierwszym wpisujemy liczbę 1 a w drugim liczba2 w polu nazwa zmiennej. Obliczeń dokonujemy w klocku obliczenia gdzie wpisujemy suma=liczbal +liczba2. Pozostaje jeszcze wyprowadzenie wyniku na ekran i zakończenie pracy .

Page 24: O AUTORACH

23

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Algorytm liniowy- obliczanie sumy dwóch liczb

Przykładowy algorytm sumujący dwie liczby.  Poniżej są przedstawione pola edycyjne poszczególnych klocków (edycje dokonujemy wciskając prawy przycisk myszki na wybranym klocku )

Page 25: O AUTORACH

24

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Algorytm rozgałęziony- sprawdzanie warunku

Algorytm rozgałęziony - sprawdzanie warunku Algorytmy liniowe nie zawsze da się zastosować, często zachodzi konieczność sprawdzenia pewnego warunku i dopiero potem wykonujemy określone zadanie (np. znalezienie większej liczby). Zbudujmy algorytm który znajdzie większą z dwóch wczytanych liczb. Plan działania:1. Start2. Wczytać pierwszą liczbę3 . Wczytać drugą liczbę4. Sprawdzenie czy większa jest pierwsza liczbaa. Jeśli tak, to wypisujemy ją z objaśnieniem że jest większa od drugiejb. Jeśli nie, to wypisujemy drugą liczbę z objaśnieniem że jest większa od pierwszej5. Zakończenie algorytmu

Przykład algorytmu

W klockach startu i wczytania danych postępujemy jak w poprzednim przykładzie. Klocek warunku musi zostać wypełniony i w tym celu edytujemy go i wpisujemy warunek liczba1>liczba2. Uzupełnienia wymagają jeszcze dwa klocki wyprowadzenia wyniku . Jeżeli warunek będzie prawdziwy algorytm przejdzie do lewego klocka wyprowadzenia wyniku, jeśli fałszywy do prawego (literka N w warunku oznacza niespełniony warunek).

ZadanieZbuduj algorytm który rozpozna przypadek gdy liczby są równe i wyświetli odpowiedni komunikat.

Page 26: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Algorytm rozwiązania równania kwadratowego

25

Algorytm rozwiązania równania kwadratowego Równanie kwadratowe ma postać ax2 + bx + c = O gdzie a,b,c są współczynnikami liniowymi a ≠ O. Aby istniało rozwiązanie wyróżnik ∆ > 0, wtedy możemy skorzystać ze wzorów

- b - √∆ - b + √∆ X1 = ———— X2 = ————

2 * a 2 * a Plan działania 1. Start2. Wczytanie 3 współczynników3. Obliczenie wyróżnika4. Sprawdzenie czy wyróżnik jest dodatnijeśli tak to◊ Obliczyć pierwiastki◊ Wyświetlić oba pierwiastki◊ Koniec algorytmujeśli nie to◊ Wypisujemy deltę i komunikat brak rozwiązań ◊ Koniec algorytmu  Przykład algorytmu

Page 27: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Obliczanie wartości średniej

26

Obliczenie wartości średniej Wartość średnią często wykorzystuje się do pomiarów tego samego czynnika, który odbiegają od siebie np. średnia opadów w lipcu, średnia temperatura, średnia płaca itp. Obliczenie wartości średniej należy zacząć od określenia ilości elementów z których będziemy liczyć średnią. Kolejnym krokiem jest dodanie poszczególnych elementów. Wartość sumy będziemy przechowywać w zmiennej suma, a numer kolejnego elementu w liczniku L Zmienne te powinny być wyzerowane na początku algorytmu. Sumowanie zaczniemy od dodania do sumy pierwszego elementu i tak kolejno aż do ostatniego, umieszczenie warunku pozwoli na sprawdzenie czy wszystkie elementy zostały dodane. Zostaje jedynie podzielenie sumy przez ilość elementów aby uzyskać średnią.

Plan algorytmu 1. Wczytanie ilości elementów n2. Wyzerowanie zmiennej suma i licznika i3. Sprawdzenie czy wszystkie elementy zostały wczytane i<njeśli nie to◊ wczytanie następnego elementu◊ dodanie do sumy◊ zwiększenie licznika i ◊ przejście do punktu 3jeśli tak to◊ obliczenie średniej◊ wyświetlenie wyniku ◊ koniec algorytmuPrzykład algorytmu

Zadania1. Zmodyfikuj algorytm tak aby nie było konieczne z góry określenie ilości danych elementów np. wprowadzenie O kończy wczytywanie elementów.2. Oblicz średnie odchylenie standardowe.

Page 28: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Znajdowanie największej z podanych liczb

27

Znajdowanie największej z podanych liczb 

W tym przypadku nie wiemy ile będzie podanych liczb do porównywania dlatego musimy określić sposób zakończenia algorytmu. Najprościej umówić się że wczytanie liczby ujemnej kończy algorytm. Przykładem może być np. określenie najwyższego ucznia w klasie.

Algorytm powinniśmy zacząć od wyzerowania zmiennej przechowującej wartość max, następnie sprawdzamy czy to już wszystkie elementy do wczytania jeśli tak to kończymy algorytm, jeśli nie to sprawdzamy czy aktualna liczba jest większa od max jeśli tak to zapamiętujemy aktualną wartość jako max.

Plan działania 1. Start2. Określenie wartości max = 03. Wczytanie kolejnej liczby4. Sprawdzenie czy jest to liczba dodatniajeśli tak to◊ Sprawdzenie czy liczba ta jest większa od max jeśli tak to podstawienie pod max aktualnej liczby powrót do pkt.3 jeśli nie to przejście do p.3jeśli nie to◊ Wyświetlenie wartości max◊ Koniec algorytmu Przykład algorytmu

Zadania1. Zbuduj algorytm znajdujący wartość min2. Zbuduj algorytm znajdujący jednocześnie wartość max i min

Page 29: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Największy wspólny dzielnik – algorytm Euklidesa

28

Największy wspólny dzielnik - algorytm Euklidesa 

Sposób ten daje szybko wynik co jest bardzo pomocne przy dużych liczbach podczas skracania ułamków. Pomysł opiera się na fakcie że jeśli od większej liczby odejmiemy mniejszą to ta mniejsza liczba i otrzymana różnica będą miały taki sam największy wspólny dzielnik jak pierwotne liczby. Jeśli po kolejnych odejmowaniach otrzymamy takie same liczby to znaczy że mamy NWD. Plan działania1. Start2. Wczytać dwie liczby a i b3. Sprawdzić czy te liczby są różnejeśli tak to◊ Sprawdzić czy a>bjeśli tak to a=a-bjeśli nie to b=b-a

◊ Powrót do punktu 3jeśli nie to

4. Wyświetl wartość a 5. Koniec algorytmuPrzykład algorytmu

Zadanie1. Zabezpiecz algorytm przed błędnymi danymi np. a=0 2. Zbuduj algorytm skracający ułamki właściwe

Page 30: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Dzielenie liczb całkowitych (pętla DOPÓKI)

29

Dzielenie liczb całkowitych (pętla DOPÓKI) 

Poprzednie algorytmy zawierały fragment, w którym cześć algorytmu chodziła w kółko wykonując wielokrotnie ten sam fragment, taki fragment nazywa się pętlą.

Pokazana pętla Dopóki (WHILE) wykona się jeśli warunek jest prawdziwy. Zadaniem algorytmu będzie podzielenie dwóch liczb a i b uzyskując iloraz i resztę. Dzielenie musimy wykonać poprzez kolejne odejmowania i sprawdzanie czy dzielna jest mniejsza od dzielnika, ilość odejmowań określi iloraz a wynik ostatniego odejmowania resztą.Plan działania1. Start2. Wczytanie dzielnej i dzielnika3. Określenie warunków początkowych r =a największa możliwa reszta jest równa dzielnej i =0 na początku iloraz jest równy 04. Dopóki r >=b wykonuj r =r- b i =i+ 15. Wyświetl iloraz i resztę 

Przykład algorytmu

W języku C taką pętlę zapisujemyWHILE (warunek){instrukcje}

Zadania1. Zbuduj algorytm odporny na błędne dane np. a=0, a=-32. Zapisać do tablicy ciąg liczb dodatnich na końcu wstawić liczbę ujemną, zbudować algorytm który obliczy średnią z liczb dodatnich.3. Zbuduj algorytm skracający ułamki i wyświetlający stan początkowy i końcowy

Page 31: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Pierwiastek kwadratowy (pętla POWTARZAJ)

30

Pierwiastek kwadratowy (pętla POWTARZAJ) 

Zadaniem algorytmu jest obliczenie pierwiastka kwadratowego z liczby dodatniej z zadaną dokładnością. Aby było zabawniej załóżmy że nie mamy do dyspozycji funkcji pierwiastka.

Przepis na obliczenie pierwiastka podał Newton, polega on na kolejnych przybliżeniach, jako pierwsze bierzemy wartość 1, następne wynosi' średnią arytmetyczną z poprzedniego przybliżenia i liczby podzielnej przez poprzednie przybliżenie. Koniec obliczeń następuje gdy względna dokładność jest mniejsza niż 1. Plan działania1. Wczytać liczbę i dokładność2. xn= 1 pierwsze przybliżenie3. wykonanie obliczeńxs=xnxn=( xs+liczba/xs )/2dx=abs( xn-xs )/ ε4. dx<l jeśli fałsz to skocz do punktu 3

jeśli prawda to wyświetl xn5. koniec algorytmu Przykład algorytmu

 Zadania1. Zbuduj algorytm odporny na błędne dane np. liczba = - 4

Page 32: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Sumowanie liczb nieparzystych (pętla DLA)

31

Sumowanie liczb nieparzystych (pętla DLA) 

Zadaniem algorytmu jest sumowanie liczb nieparzystych. Liczbę nieparzystą możemy określić ustawiając wartość początkową na 1 i dodawaniu do niej 2 co da kolejne liczby. Innym sposobem jest obliczanie według wzoru L=2*L – l co da też liczbę nieparzystą. Spróbujmy pierwszego sposobu w tym celu musimy określić zakres sumowanych liczb min=l i max. Plan działania1. Wczytać wartość końcową2. Nadanie zmiennym sterującym obliczone wartości3. Sprawdzenie czy uzyskaliśmy wartość końcową zmiennej sterującejjeśli nie to ◊ dodanie do sumy 2 ◊ zwiększenie zmiennej sterującej jeśli tak to4. Wyświetl sumę5. Zakończ algorytm Przykład algorytmu

Zastosowana tu pętla DLA (FOR) wykonuje się ściśle określoną ilość razy co różni ją od poprzednich gdzie ilość okrążeń była zależna od spełnienia warunku. W pętli DOPÓKI (WHILE) najpierw zostaje sprawdzony warunek a dopiero później wykonuje się obliczenia w skrajnym przypadku może się nie wykonać ani razu. Pętla POWTARZAJ (DO...WHILE) również nie ma z góry określonej ilości iteracji lecz warunek sprawdzany jest po obliczeniach co ją różni od poprzedniej pętli w skrajnym przypadku wykona się przynajmniej raz.

 Zadanie1. Przerobić algorytm tak aby sumować liczby od dowolnej wartości początkowej 2. Zbuduj algorytm który wyświetli dowolną linijkę z tabliczki mnożenia

Page 33: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Wprowadzenie do budowania.. Zgadnij liczbę

32

Zgadnij liczbę 

Algorytm ten będzie generował liczbę z zakresu od O do 50 a my mamy ją odgadnąć przy jak najmniejszej ilości prób. Funkcja generująca liczby random(n) zwróci liczbę pseudo losową z przedziału od O do n - l. Abyśmy mieli szansę odgadnąć komputer będzie podawał informacje czy nasza liczba jest za duża czy za mała. Plan działania1. Wygenerowanie liczby przez komputer2. Ustawienie licznika prób na 13. Wczytanie liczby4. sprawdzenie czy podana liczba jest trafnajeśli tak to◊ gratulacje◊ koniec algorytmujeśli nie to◊ sprawdzenie czy podana liczba jest za duża jeśli tak to wyświetlenie "za duża" jeśli nie to wyświetlenie "za mała"◊ zwiększenie licznika prób o 1◊ powrót do punktu 4 Przykład algorytmu

Zadania1. Zbuduj algorytm z samodzielnym wyborem zakresu zgadywanych liczb 2. Zbuduj algorytm w którym komputer zgaduje liczbę

Page 34: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Sumowanie ułamków

33

Sumowanie ułamków Sumowanie ułamków wymaga kolejno:1. Obliczenia wspólnego mianownika2. Zsumowania pomnożonych przez odpowiednie współczynniki liczników3. Skrócenie otrzymanego ułamka Przykład 5 3 ― + ― = ?              6 8 Musimy obliczyć wspólny mianownik czyli najmniejszą wspólną wielokrotność (nww), do tego będzie potrzebny najmniejszy wspólny dzielnik (nwd), nwd=2, a nww obliczamy ze wzoru nww=6 *8/nwd=24 Kolejnym krokiem jest obliczenie poszczególnych liczników, dla pierwszego obliczamyLicznik1 =5 *nww/6=5 *24/6=20Licznik2=3 *nww/8=3 *24/8=9Nasz ułamek przyjmie postać.

Obliczamy nwd dla nowego mianownika i nowego licznika, nwd dla 29 i 24 wynosi nwd=l, licznik i mianownik dzielimy przez nwd i wypisujemy nowe wartości. W naszym przypadku nie zmieni to wyniku.

20 + 9 == 29

24 24

Plan algorytmu1. Wczytanie czterech liczb2. Obliczenie nwd3. Obliczenie: a. Wspólnego mianownika nww

b. Licznikówc. Sumy liczników

4. Wypisanie wspólnego mianownika5. Obliczenie nwd nowego licznika i nww6. Skrócenie licznika i mianownika (podzielenie przez nwd)7. Wypisanie licznika i mianownika

Page 35: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Sumowanie ułamków

34

W czasie wykonywania algorytmu dwukrotnie zostaje obliczany nwd, można zastosować procedurę którą dwa razy wywołamy. Przykład algorytmu

Zadanie1. Zbuduj algorytm obliczający nwd i nww dla dwóch dowolnych liczb naturalnych, zastosuj procedurę2. Zbuduj algorytm dodający trzy ułamki

Page 36: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Wykresy funkcji

35

Wykresy funkcji Aby uzyskać dowolny wykres należy dane umieścić w tablicy. W kolumnie zerowej umieszczamy wartości argumentu x, a w kolejnych wartości funkcji. Wstawianie danych do tablicy najlepiej zrealizować za pomocą pętli for w której umieszczamy klocek zapis do tablicy. Przykład algorytmu wpisującego dane do tablicy

Plan działania1. Start2. Wczytanie wartości początkowej xpocz3. Wczytanie wartości końcowej xkon4. Wczytanie liczby kroków n5. Obliczenie przyrostu argumentu dx=(xkon-xpocz)/n 6. Sprawdzenie czy x jest większe od xkonjeśli tak to

koniec jeśli nie to obliczenie f(x)

wpisanie x i y do tablicyzwiększenie x o dx i numeru wiersza o 1powrót do początku pętli

Page 37: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Wykresy funkcji

36

Algorytm zapisze dane do tabelki w dwóch kolumnach, można te liczby przedstawić w postaci wykresu. Na polu tablicy wciskamy prawy przycisk myszki i wybieramy sposób prezentacji. Zaznaczamy układ prostokątny i wciskamy OK.

Jeżeli wybierzemy sposób prezentacji mamy możliwość wyboru rodzaju osi i rodzaju wykresu. Zadanial. Zbuduj algorytm wyświetlający funkcję y=ax+b2. Zbuduj algorytm wyświetlający funkcję y =ax2+bx+c3. Zbuduj algorytm wyświetlający funkcje trygonometryczne4. Sprawdź poprawność równania sin2(x)+cos2(x)=1

Page 38: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Rozkład liczby naturalnej na czynniki

37

Rozkład liczby naturalnej na czynniki Algorytm ma rozkładać dowolną liczbę naturalną na czynniki pierwsze. Sposób postępowania jest następujący, bierzemy najmniejszy czynnik 2, dopóki liczba jest większa od czynnika sprawdzamy, czy liczba jest podzielna przez czynnik, jeśli tak to wypisujemy czynnik i sprawdzamy dalej dla liczby podzielnej przez czynnik, jeśli nie to zwiększamy czynnik o 1. Plan działania1. Wczytanie liczby2. Przypisanie czynnikowi wartości 23. Sprawdzenie, czy czynnik jest większy od liczby

jeśli tak tozapisanie liczby i zakończenie działaniajeśli nie tosprawdzenie czy reszta z dzielenia całkowitego jest równa Ojeśli tak tozapisanie czynnika i przypisanie liczbie wartości liczba/czynnikjeśli nie tozwiększenie czynnika o 1

4. Powrót do punktu 3 Przykład algorytmu

Zadanie1. Zbuduj algorytm sprawdzający czy podana liczba jest liczbą pierwszą.2. Zbuduj algorytm wypisujący wszystkie podzielniki podanej liczby

Page 39: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Tabliczka mnożenia

38

Tabliczka mnożenia  Tabliczka mnożenia jest typową tablicą. Chcemy, by nasz algorytm wpisywał w odpowiednie pola wyniki mnożeń kolejnych liczb. Wypełnienie jednego wiersza tablicy wymaga jednej pętli DLA. Wypełnienie kolejnych wierszy wymaga zastosowania pętlizewnętrznej w stosunku do pierwszej. Taka konstrukcja nazywa się pętlą w pętli.

Plan działania1. Start2. Wczytanie liczby od której zaczniemy wpisywać tabliczkę mnożenia3. Wczytanie liczby, na której skończymy wpisywanie4. Przypisanie zmiennej sterującej wypisywaniem wierszy i zmiennej sterującej wypisywaniem kolumn wczytanej wartości początkowej Zewnętrzna pętla 5. Sprawdzenie warunku, czy bieżąca wartość zmiennej sterującej wier jest mniejsza lub równa wartości końcowej jeśli tak toprzejście do wypisywania wiersza wewnętrzna pętla a.  Sprawdzenie warunku, czy bieżąca wartość zmiennej sterującej kol jest mniejsza lub równa wartości końcowej jeśli tak to wpisanie iloczynu wier*kol do pola tablicy w wierszu wier-pocz+ 1 i kolumnie kol-pocz+ 1 zwiększenie o 1 zmiennej kol powrót do początku wewnętrznej pętli jeśli nie to, koniec wypełniania wiersza a więc zwiększenie o 1 zmiennej wierpowrót do początku zewnętrznej pętli jeśli nie to b. Wypełnienie nagłówków wiersza 0 i kolumny 0 c. Koniec W przypadku trudności z budową algorytmu, należy zacząć od wypełnienia tylko jednego wiersza przy użyciu pojedynczej pętli DLA.

Page 40: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Tabliczka mnożenia

39

Przykład algorytmu

Zadania1. Zbuduj algorytm wypełniający jedynie główną przekątną2. Zbuduj algorytm wypełniający tablicę iloczynami liczb nieparzystych

Page 41: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Z systemu dziesiętnego na dowolny

40

Z systemu dziesiętnego na dowolny Przeliczenie z dowolnego systemu na dziesiętny jest następujące:liczba dziesiętna=w0 * pods0 + w1 * pods1 + ...+ wn * podsn

gdzie wi jest współczynnikiem przy i-tej potędze podstawy systemu. Odwrotną czynnością jest przeliczenie z systemu dziesiętnego na

dowolny, w tym celu liczbę dziesiętną dzielimy przez podstawę danego systemu. Przykład  Zamieńmy liczbę 6 z systemu dziesiętnego na system dwójkowy. Dzielimy całkowicie (bez ułamków) liczbę 6 przez 2 i zapisujemy resztę.6/2=3 i 0 - reszty, następnie otrzymany wynik przez 2 i zapisujemy resztę3/2=1 i 1 resztymożemy to zapisać w postaci

: 26 │ 03 │ 11 │ 1

 Odczytujemy liczby od dołu, co nam daje liczbę w systemie dwójkowym 110 równą 6 w systemie dziesiętnym.Sprawdzenie polega na wykorzystaniu wzoru z początku rozdziału.0 * 2 0 + 1 * 21 + 1 * 2 2 = 0+2+4=6 Plan działania1. Wczytanie liczby i podstawy2. Przewinięcie na początek taśmy, na której będziemy zapisywać współczynniki3. Sprawdzenie czy liczba jest równa 0 jeśli tak to

a. Zakończenie działania jeśli nie toa. Obliczenie reszty z dzielenia liczby przez podstawę i ilorazu całkowitegob. Zapisanie na taśmie reszty z dzieleniac. Przypisanie liczbie wartości ilorazud. Powrót do punktu 3

Page 42: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Projekty Z systemu dziesiętnego na dowolny

41

Przykład algorytmu

Zadania1. Zbuduj algorytm przeliczający z dowolnego systemu na dziesiętny2. Zbuduj algorytm zamieniający ułamek dziesiętny na postać dwójkowa

Page 43: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Wyszukiwanie liczby

42

Wyszukiwanie liczby  Zadanie polega na stwierdzeniu, czy wśród zapisanych liczb na taśmie znajduje się podana liczba. Jeśli nic nie wiemy o liczbach zapisanych na taśmie, to musimy przejrzeć je po kolei porównując z zadaną liczbą. Można na dwa sposoby rozwiązać ten problem:

◊ Ze sprawdzeniem czy wszystkie liczby zostały sprawdzone◊ Z wartownikiem, specjalną liczb ustawioną na końcu ciągu liczb może to być np. 0

Plan działania 1.      Start 2.      Wczytanie poszukiwanej liczby 3.      Wczytanie elementów ciągu i zapis na taśmę 4.      Wczytanie którą metodę wybieramy 5.      Sprawdzenie czy wybrano metodę 1

▪ Jeśli tak to wywołanie procedury szukajdlan ▪ Jeśli nie to wywołanie procedury szukajwart

6. Zakończenie działania  W punkcie 3 należy zastosować procedurę która podane dane zapisze na taśmę, jej schemat może być następujący.

1. Przewinąć taśmę na początek2. dla i od 1 do n wykonuj wczytaj liczbę, zapisz liczbę na taśmę

 Procedura szukajdlan ma dwa parametry X - poszukiwana liczba N - liczba elementów do przeszukiwaniaJej schemat działania jest następujący:1. przewinięcie taśmy na początek2. dla i od 0 do n-l◊ wczytanie elementu z taśmy◊ sprawdzenie czy element jest poszukiwaną liczbą jeśli tak to przerwanie działania w pętli- przestawienie wskaźnika taśmy na pozycję i- wyprowadzenie komunikatu o znalezieniu liczby i jej pozycji- zakończenie procedury jeśli nie to pętla działa dalej3. wyprowadzenie komunikatu o braku poszukiwanej liczby4. zakończenie procedury

Page 44: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Wyszukiwanie liczby

43

Procedura szukajwart również posiada dwa parametry X - poszukiwana liczba N - liczba elementów do przeszukiwaniaJej schemat działania jest następujący:1. Przesunięcie wskaźnika na pozycję n (za ostatnim elementem ciągu)2. Wpisanie na taśmę poszukiwanej liczby3. Przewinięcie taśmy na początek4. Przypisanie numerowi i na taśmie wartości 05. Powtarzanie◊ Odczytu z taśmy i - tego elementu◊ Zwiększenie numeru i o 1 aż do momentu gdy wczytany element będzie równy poszukiwanej liczbie6. Sprawdzenie czy ostatni wczytany element (i-l) ma numer równy n (jest wartownikiem) jeśli tak to ◊ Wyprowadzenie komunikatu o braku poszukiwanej liczby ◊ Zakończenie procedury jeśli nie to◊ Przestawienie wskaźnika taśmy na pozycję i-l◊ Wyprowadzenie komunikatu o znalezieniu liczby i jej pozycji (i-l)◊ Zakończenie procedury  Przykład algorytmu

Zadania1. Przebuduj procedurę szukajdlan tak aby nie zawierała przerwania pętli po znalezieniu liczby 2. Zbuduj algorytm szukający określonej danej w uporządkowanym ciągu liczb zapisanych na taśmie. Algorytm powinien wyświetlać komunikat czy znaleziono liczbę i jeśli tak to na której pozycji.

Page 45: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Znajdowanie największej liczby

44

Znajdowanie największej liczby  Załóżmy, że wpisane liczby na taśmie są nieujemne, a pierwsza liczba ujemna nie jest już elementem ciągu, lecz oznacza ona koniec tzw. strażnik.

Plan działania1. Start2. Przesunięcie wskaźnika taśmy na początek3 . Wczytanie pierwszego elementu z taśmy4. Przyjęcie tej wartości za max i ustawienie numeru liczby na taśmie na 05. Sprawdzenie czy wczytana liczba jest większa lub równa 0 jeśli tak, to:` a. Sprawdzenie czy wczytana liczba jest większa od bieżącego maksimum jeśli tak, to przypisanie maksimum wartości wczytanej liczby i zapamiętanie

jej numeru w ciągu b. Wczytanie kolejnej liczby z taśmy c. Zwiększenie licznika elementów o 1 d. Powrót do punktu 5

jeśli nie, to: a. Wyprowadzenie największej liczby i przestawienie jej na początek (procedura)

b. ZakończenieProcedurę należy zbudować według podanego przepisu

1. Początek procedury2. Sprawdzamy czy max jest nieujemne jeśli tak to

a. Wyprowadzenie maxb. Przewijanie taśmy na pozycję nrpoczc. Wpisanie maxd. Przewijanie taśmy na pozycję nrmaxe. Wpisujemy pierwszy elementf. Kończymy procedurę

jeśli nie toa. Ciąg musiał być pusty, sygnał dźwiękowy

b. Koniec procedury

Page 46: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Znajdowanie największej liczby

45

Przykład algorytmu

Zadania1. Zbuduj algorytm znajdujący najmniejszą liczbę2. Zbuduj algorytm szukający jednocześnie min i max 3. Zbuduj algorytm wyszukujący medianę

Page 47: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Sortowanie ciągu

46

Sortowanie ciągu  Algorytm sortowania bąbelkowego ciągu liczb zapisanych na taśmie polega na porównaniu parami kolejnych elementów ciągu i przestawieniu ich jeśli są w niewłaściwej kolejności. Należy dokonać kilku przebiegów aby posortować cały ciąg. Zakładamy że liczby są nieujemne a ujemna kończy ciąg. Plan działania1. Start2. Przypisanie liczbie przestawień wartości 1 początek pętli sortowania3. Sprawdzenie czy liczba przestawień wynosi 0 jeśli tak to4. Zakończenie algorytmu jeśli nie to

a. Ustawienie liczby przestawień na 0 i numeru elementu na 0b. Przesunięcie wskaźnika taśmy na początek początek pętli przestawieńc. Przesunięcie wskaźnika taśmy na pozycję o aktualnym numerzed. Wczytanie bieżącego elementu taśmye. Sprawdzenie czy to element ciągu jeśli tak to wykonanie procedury przestaw i nadanie liczbie przestawień wartości zwracanej przez procedurę zwiększenie o 1 numeru pozycji na taśmie powrót do początku pętli przestawień jeśli nie to Powrót do początku głównej pętli

Procedura przestaw1. Start procedury2. Wczytanie z taśmy nowego elementu ciągu3. Sprawdzenie czy nowy element ciągu jest większy od tego który jest argumentem procedury jeśli tak to dokonanie przestawienia

a. Zwiększenie licznika przestawień o 1 b. Przestawienie wskaźnika taśmy na pozycję poprzednio wczytanego elementu c. Zapis na taśmę ostatnio wczytanego nowego elementu

d. Zapis na taśmę poprzednio wczytanego elementue. Koniec procedury

jeśli nie to elementy są w dobrej kolejności następuje koniec procedury

Page 48: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Sortowanie ciągu

47

Przykład algorytmu

Zadania1. Zbuduj algorytm sortujący od najmniejszej do największej liczby2. Zbuduj algorytm sortujący poprzez znalezienie największej liczby i przestawienie jej na początek itd.

Page 49: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Rozwiązywanie równania metodą połowienia

48

Rozwiązywanie równania metodą połowienia Często nie istnieje dokładne rozwiązanie równania f(x)=0 dlatego też stosuje się rozwiązana przybliżone. Jedną z takich metod jest metoda bisekcji. Wymaga ona znajomości przedziału ( a, b) w którym znajduje się rozwiązanie oraz funkcja na końcach przedziału musi mieć różne znaki. Zasada polega na dzieleniu przedziału na pół i sprawdzeniu w której części znajduje się rozwiązanie tzn. funkcja ma różne znaki itd. Aż przedział będzie mniejszy od zadanej dokładności.

Plan działania1. Start2. Wczytanie danych i sprawdzenie czy spełnione są założenia (procedura)3. Obliczenie wartości funkcji dla dolnej granicy i połowy przedziału4. Sprawdzenie czy y=O czyli znamy rozwiązanie jeśli tak to wypisanie rozwiązania i zakończenie * jeśli nie to sprawdzenie czy różnica między końcami przedziału jest mniejsza niż dokładność

jeśli tak to wypisanie rozwiązania i koniec jeśli nie to sprawdzenie znaków funkcji w dolnej połowie przedziału, jeśli znaki są takie same to wybranie górnej połowy przedziału jeśli znaki są różne to wybór dolnej połowy przedziału

obliczenie nowej granicy w połowie przedziału i wartości funkcji dla niej określenie znaku funkcji dla nowej granicy powrót do * W metodzie połowienia trzeba wielokrotnie obliczać wartość funkcji dla różnych argumentów dlatego też istnieje potrzeba skonstruowania procedury obliczającej wartość zadanej funkcji. Plan działania procedury funkcja1. obliczenie wartości funkcji dla x2. zwrócenie tej wartości do głównego algorytmu

Page 50: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Porządkowanie ciągów Rozwiązywanie równania metodą połowienia

49

Przykład algorytmu

Zadania1. Zbuduj algorytm obliczający miejsce zerowe funkcji f(x) =x3 -3x2+ l2x-34

Page 51: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Wprowadzenie do rekurencji

50

Wprowadzenie do rekurencji Rekurencja polega na odwoływaniu się funkcji do samej siebie. Przykładami rekurencji może być odbicie obrazu w lustrach ustawionych naprzeciw siebie, innym przykładem jest obrazek misia na napoju Kubuś który trzyma w ręku napój Kubuś itd. Przykładem rekurencji niech będzie procedura licz(), która będzie odliczać cyfry od podanej do zera np. licz(4) powinno spowodować wypisanie cyfr 4, 3, 2, 1, O. Algorytm wykorzystujący tą procedurę będzie zbudowany jak na rysunku. Zaczynamy od klocka startowego, następnie wczytujemy liczbę n, wywołujemy procedurę licz(n) i kończymy algorytm.Pole edycyjne procedury musimy wypełnić według wzoru

Procedura licz ma wykonywać odliczenia od n do wartości 0. Należy ją zbudować na oddzielnej planszy. Procedurę zaczynamy od klocka początek procedury pole edycyjne tego klocka powinno wyglądać następująco.

Page 52: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Wprowadzenie do rekurencji

51

Konstrukcję procedury zaczynamy od warunku zakończenia jej działania: jeśli parametr ile przyjmie wartość 0 to wypisujemy tą wartość i kończymy procedurę, jeśli warunek jest nie spełniony to wypisujemy wartość parametru ile i wywołujemy procedurę z parametrem o jeden mniejszym ile-l i historia się powtarza od początku.

Przykład procedury jest poniżej.

Zadania1. Zbuduj procedurę rekurencyjną z dwoma parametrami odliczający od pierwszego argumentu do drugiego.2. Zbuduj algorytm wypehriający jedną kolumnę tablicy liczbami losowymi od wiersza Q do wiersza o numerze równym parametrowi procedury

Page 53: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Rekurencja pełna

52

Rekurencja pełna Spróbujmy zbudować algorytm który będzie odliczał od liczby n do zera a później z powrotem do n. Algorytm będzie bardzo podobny do poprzedniego. Plan algorytmu1. Start2. Wczytanie n3. Wywołanie procedury rekurencyjnej odlicz dla n 4. Zakończenie Plan procedury odlicz1. Sprawdź warunek n=0 jeśli n!=0 toa. Wypisz nb. Wywołaj procedurę odlicz dla n - l c. Wypisz n jeśli n==0 toa. Wypisz n b. Zakończ proceduręPrzykład algorytmu

Zadanie1. Przerobić procedurę z rekurencyjnej na iteracyjną

Page 54: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Odwracanie ciągu

53

Odwracanie ciągu Zadaniem algorytmu będzie odwrócenie ciągu cyfr zapisanych na taśmie, elementy muszą być zapisane od początku taśmy i musimy znać ich ilość. Algorytm będzie miał postać podobną do poprzednich. Plan algorytmu1. Start2. Wczytanie liczby n3. Przewinięcie taśmy na początek4 Wywołanie procedury rekurencyjnej 5. Zakończenie  Budowa procedury odwracanie opiera się na fakcie, że wychodzenie z rekurencji daje odwrotną kolejność parametrów niż przy wchodzeniu do niej. Plan procedury odlicz1. Start procedury2. Sprawdzenie warunku jeśli ile>0 toa. Wczytanie z taśmy elementu x b. Wywołanie procedury odwracanie dla ile-l c. Wpisać na taśmę element x jeśli ile<=0 to a. Przewinąć taśmę na początek Pracę algorytmu należy dokładnie prześledzić w oknie śladu pozwoli to na dokładniejsze zrozumienie metod rekurencyjnych. Przykład algorytmu

Zadanie1. Zbuduj procedurę rekurencyjną która będzie odwracała elementy w tablicy2. Przerobić procedurę rekurencyjną na iterację

Page 55: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Funkcja rekurencyjna silnia

54

Funkcja rekurencyjna silnia Silnia jest funkcją matematyczną zdefiniowaną dla liczb naturalnych, oblicza się ją mnożąc kolejne składniki przez siebie, np. 4!=1 *2*3*4. Silnia jest funkcją bardzo silnie rosnącą co widać na przykładzie 4!=24, 5!=120, 6!=720.Dla dowolnego argumentu możemy zapisać silnia(0)=l, silnia(n) = n * silnia (n- l) na podstawie tego wzoru spróbujmy zbudować funkcję rekurencyjną obliczającą wartość silni.Algorytm główny podobnie jak w poprzednich przykładach będzie wywoływał procedurę silnia. Plan działania algorytmu1. Start 2. Wczytanie liczby n 3. Wywołanie rekurencyjnej SILNIA dla n 4. Wyprowadzenie wyniku5. Zakończenie  Z definicji funkcji silnia(0)=l, silnia(n)=n* silnia(n -l) wynika schemat rekurencyjny, parametr formalny oznaczmy jako kPlan procedury1. jeśli =0 to wynik funkcji 1 i koniec procedury2. w wypadku przeciwnym wynik funkcji to k*silnia(k-1) czyli ponowne wywołanie procedury z parametrem o jeden mniejszym k-13. wyjście z procedury z parametrem k*silnia  Algorytm należy wykonać w trybie krokowym z otwartym oknem śladu i zmiennych. Przykład algorytmu

Zadania1. Zbuduj algorytm rekurencyjny z parametrami n, k, która będzie liczyła wartość iloczynu k*(k+ 1)*... *n2. Zbuduj algorytm realizujący symbol Newtona n!‗‗‗‗

k!*(n - k)!3. Zamień procedurę silnia z rekurencji na iterację

Page 56: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Zmiana rekurencji na iterację

55

Zmiana rekurencji na iterację  Jeżeli procedura jest podobna do procedury silnia to można ją zamienić na iterację za pomocą jednej z pętli. Spróbujmy zamienić procedurę silnia na postać iteracyjną. Plan działania algorytmu1. Start2. Wczytanie liczby n3. Wywołanie funkcji iteracyjnej SILNIA dla n 4. Wyprowadzenie wyniku n!5. Zakończenie Plan działania proceduryl. przypisanie zmiennej s wartości początkowej 1 2. przewinięcie taśmy na początek3. zapisanie na taśmie 1 (0!)4. dla i od 1 do ka. przypisanie s =s * ib. zapis s na taśmie 5. wyjście z procedury z wartością zwracaną s Przykład algorytmu

Zadania1. Zbuduj procedurę iteracyjną obliczającą iloraz od k do n2. Zbuduj algorytm obliczający symbol Newtona metodą iteracyjną

Page 57: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Kombinacje

56

Kombinacje Zbudujmy algorytm obliczający na ile sposobów można wybrać k różnych elementów z n elementowego zbioru taki proces nazywa się kombinacją bez powtórzeń. Ilość tych kombinacji można obliczyć z symbolu Newtona.Plan algorytmu1. Start2. Wczytanie liczby elementów zbioru (ile)3. Przypisanie zmiennej suma wartości 04. Dla i od 0 do ilea. Wywołanie procedury nnadkb. Zapisanie do tablicy obliczonej wartościc. Dodanie tej wartości do zmiennej suma5. Zapisanie do tablicy wartości zmiennej suma6. Zakończenie Przykład algorytmu

Procedurę można wykorzystać z poprzednie go przykładu w postaci rekurencyjnej bądź iteracyjnej. Aby nie liczyć kilka razy tej samej silni można wyniki składować w tablicy.

Page 58: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Ciąg Fibonacciego

57

Ciąg Fibonacciego

Leonardo z Pizy, Leonardo Pisano, Filius Bonacci, Fibonacci (ok. 1180-po 1240), włoski kupiec i matematyk. W czasie podróży do Azji zapoznał się z osiągnięciami hinduskiej arytmetyki (liczby ujemne, zero, pozycyjny system zapisu liczby, równania liniowe i kwadratowe), wiedzę tę udostępnił kulturze europejskiej w traktacie Liber abaci (1202). W innej pracy Practica geometriae (1220) zastosował algebrę w geometrii, interesował się praktycznymi zastosowaniami matematyki.

Fibonacciego liczby, liczby naturalne tworzące ciąg o takiej własności, że kolejny wyraz (z wyjątkiem dwóch pierwszych) jest sumą dwóch poprzednich (tj. 1,1,2,3,5,8,13... ). Taki ciąg liczbowy opisuje np. liczbę pędów rośliny jednostajnie przyrastającej w latach (np. drzewa). Nazwa pochodzi od imienia Leonarda z Pizy zwanego Fibonaccim, który w 1202 podał ten ciąg. F(1)=l, F(2)=1, F(n) = F(n-1) + F(n-2) 

Plan działania1. Start2. Wczytanie liczby n3. Wywołanie procedury rekurencyjnej fib dla n i zwracąjącej wartość wyrn 4. Wyprowadzenie wyniku wyrn5. ZakończeniePlan procedury1. Start procedury fib z parametrem k2. Sprawdzenie czy k=la. Jeśli tak to zakończenie procedury z wynikiem 1b. Jeśli nie to sprawdzenie czy k=2 i. Jeśli tak to zakończenie procedury z wynikiem 1 ii. Jeśli nie to 1. wywołanie rekurencyjne fib dla k -1 i przypisanie wyniku do y 2. wywołanie rekurencyjne fib dla k-2 i przypisanie wyniku do x 3. zakończenie procedury z wynikiem x+y

Zbudujmy algorytm rekurencyjny oparty na podanej definicji.

Page 59: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Ciąg Fibonacciego

58

Przykład algorytmu

Zadania1. Zbuduj algorytm obliczający elementy ciągu Fibonaciego2. Dwa ptaki wylatują, w tym samym momencie, ze szczytów dwóch wież, odległych o 50. Wysokość jednej wieży to 30 m, a drugiej -- 40 m. Lecąc z tą sama prędkością dolatują w tym samym momencie do fontanny, usytuowanej na prostej pomiędzy dwoma wieżami ("poziom zero"). W jakiej odległości od podstawy każdej wieży znajduje się fontanna?

Page 60: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Sortowanie przez scalanie

59

Sortowanie przez scalanie  Sortowanie przez scalanie polega na podziale ciągu elementów na połowy aż do pojedynczych elementów jako podciągu te już nie wymagają sortowania, wystarczy je teraz łączyć jako posortowane podciągi i na końcu dostaniemy ciąg posortowany. PrzykładPosortujmy następujący ciąg elementów

7 1 8 6 4 9 5 lewy + prawyElement środkowy wyznaczamy z wzoru x = 2 numerowanie tabelki zaczynamy od wartości zero dlatego nr skrajnych elementów mają wartość lewy =0 prawy =6 nr elementu środkowego wynosi 3 co odpowiada elementowi o wartości 6. Wokół tego elementu zaczynamy porównywać liczby zacznijmy od skrajnych 7 i 5 z lewej strony ustawiamy mniejsze wartości z prawej większe a więc musimy przestawić te liczby ciąg wygląda następująco

Następnie porównujemy 1 i 9 te liczby nie wymagają przestawienia, 8 i 4 należy przestawić miejscami zgodnie z początkowymi ustaleniami.

Tak wygląda wektor po pierwszym podziale, teraz z każdą z części (5146 oraz 497) postępujemy w analogiczny sposób. Jest to jeden z najszybszych sposobów sortowania zwanym sortowaniem przez scalanie.Plan algorytmu1. Start2. Wczytywanie numeru wiersza tablicy, w którym zaczyna się ciąg wpocz3. Wczytanie numeru wiersza tablicy, w którym kończy się ciąg wkonc4. Wywołanie procedury rekurencyjnej sort z wartościami parametrów wpocz i w konc 5. Koniec

5 1 8 6 4 9 7

5 1 4 6 8 9 7

Page 61: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Sortowanie przez scalanie

60

Plan procedury1.Początek procedury z parametrami formalnymi górny, dolny, kolumna 2. Sprawdzenie czy górny element ma numer mniejszy niż dolny element a. Jeśli tak to obliczenie numeru środkowego elementu

i. Posortowanie górnego podciąguii. Posortowanie dolnego podciąguiii. Scalanie posortowanych podciągów

b. Jeśli nie to zakończenie procedury3. Zakończenie procedury

Pierwsza procedura oblicza środek, druga i trzecia sortuje podciągi ostatnia scala podciągi.Plan procedury scalanie1. Początek procedury scalanie z parametrami pocz, srod, konc, kolumna2. Nadanie wartości początkowej indeksom elementów pierwszego podciągu i=pocz drugiego podciągu j=srod ciągu pomocniczego k=pocz3. Porównanie elementów i zapisanie mniejszego w ciągu pomocniczym dopóki nie jest wyczerpany któryś z odciągów (i<srod i j<=konc) odczytanie z tablicy i - tego elementu pierwszego podciągu xi odczytanie z tablicy j - tego elementu drugiego podciągu xj sprawdzenie czy xi<=xj jeśli tak to zapisanie xi w sąsiedniej kolumnie w wierszu k, zwiększenie i o 1 jeśli nie to zapisanie xj w sąsiedniej kolumnie w wierszu k, zwiększenie j o l zwiększenie k o l4. Dołączenie pozostałych elementów pierwszego podciągu dopóki nie jest wyczerpany pierwszy podciąg i<srod odczytanie i - tego elementu w wierszu k sąsiedniej kolumny zwiększenie k oraz i o 15. Dołączenie pozostałych elementów drugiego podciągu dopóki nie jest wyczerpany drugi podciąg j<=konc odczytanie j - tego elementu drugiego podciągu xj zapisanie tego elementu w wierszu k sąsiedniej kolumny zwiększenie k oraz i o 1

Page 62: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Rekurencja Sortowanie przez scalanie

61

6. Przepisanie ciągu pomocniczego z sąsiedniej kolumny na miejsce ciągu sortowanego wywołanie pomocniczej procedury przepisz z wartościami parametrów pocz, konc, kolumna,kolumna+17. Zakończenie procedury scal

Plan procedury przepisz1. Start procedury z parametrami pocz, konc, koldo,koz2. Dla k od pocz do koncodczytaj xk z kolumny kolz, wiersza kzapisz xk do kolumny koldo, wiersza k3. Zakończenie procedury

Page 63: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

62

Projekt przedstawia zdania logiczne metodą 0,1 – kową według ustalonych zasad i praw logiki. Wartości logiczne zdań złożonych ٨ - koniunkcja zdań٧ - alternatywa zdań=> - implikacja zdań<=> - równoważność zdań W logice stosujemy metodę 0, 1- kową. Polega ona na zbadaniu danego zadania i stwierdzeniu czy zdanie to jest prawdziwe czy fałszywe. Używamy do tego celu 0 i 1.Jeśli zdanie jest prawdziwe otrzymujemy 1, w przeciwnym wypadku 0, Do obliczenia danego zdania stosujemy tabele sprawdzenia. Przyjmujemy dwie zmienne np. a i b.

a b a Λ b a v b a => b a <=> b

1 1 1 1 1 1

1 0 0 1 0 0

0 1 0 1 1 0

0 0 0 0 1 1

Page 64: O AUTORACH

 

1. Początek algorytmu 2. Wprowadzenie danych: wyrażenie-podaj pierwszą liczbę

Nazwa zmiennej-x 3. W Wprowadzenie danych: wyrażenie-podaj drugą liczbę

Nazwa zmiennej- y  4. Wywołanie procedury: nazwa-koniunkcja

parametry- x,y nazwa zmiennej-koniunkcja

5. Wywołanie procedury: nazwa-alternatywa parametry- x,y

nazwa zmiennej-alternatywa 6. Wywołanie procedury: nazwa-implikacja parametry- x,y

nazwa zmiennej-implikacja  7. Wywołanie procedury: nazwa-równoważność

parametry- x,y nazwa zmiennej-równoważność

  8. Wyprowadzenie wyniku: komunikat-koniunkcja wynosi wyrażenie-koniunkcja 9. Wyprowadzenie wyniku: komunikat-alternatywa wynosi wyrażenie-alternatywa 10. Wyprowadzenie wyniku: komunikat-implikacja wynosi wyrażenie-implikacja

  11. Wyprowadzenie wyniku: komunikat-równoważność wynosi wyrażenie -równoważność

12. Koniec algorytmu

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

63

Algorytm główny

1

2

3

4

5

6

7

8

9

10

11

12

Page 65: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

64

Plan algorytmu głównego 1. Początek algorytmu2. Wczytanie dwóch liczb (0,1)3. Wywołanie procedury dla koniunkcji4. Wywołanie procedury dla alternatywy5. Wywołanie procedury dla implikacji6. Wywołanie procedury dla równoważności7. Wypisanie wyniku dla koniunkcji 8. Wypisanie wyniku dla alternatywy9. Wypisanie wyniku dla implikacji10. Wypisanie wyniku dla równoważności11. Zakończenie algorytmu głównego

Page 66: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

65

Procedura koniunkcji

1. Początek procedury: nazwa- koniunkcja: parametry x,y2. Sprawdzenie warunku: warunek: x == 03. Sprawdzenie warunku: warunek: y == 04. Sprawdzenie warunku: warunek: y == 05. Koniec procedury: wyrażenie - 06. Koniec procedury: wyrażenie - 07. Koniec procedury: wyrażenie - 08. Koniec procedury: wyrażenie - 1

Plan działania dla procedury koniunkcji 1. W pierwszym warunku sprawdzamy czy x=0, gdy x=0 sprawdzamy czy y=0. Jeżeli y=0, wówczas koniunkcja według zasad logiki wynosi 0.2. Jeżeli y=0 wówczas koniunkcja wynosi 0.3. Natomiast kiedy x=1, sprawdzamy jeszcze raz czy y=0.4. Jeżeli y=0 to koniunkcja wynosi 0. 5. Natomiast jeśli y=1, to koniunkcja wynosi 1.

1

2

4

3

7 8

5 6

Page 67: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

66

Procedura alternatywy 1. Początek procedury: nazwa- alternatywa: parametry x,y2. Sprawdzenie warunku: warunek: x == 03. Sprawdzenie warunku: warunek: y == 04. Sprawdzenie warunku: warunek: y == 05. Koniec procedury: wyrażenie - 06. Koniec procedury: wyrażenie - 17. Koniec procedury: wyrażenie - 18. Koniec procedury: wyrażenie - 1

Plan działania dla procedury alternatywy 1. W pierwszym warunku sprawdzamy czy x=0, gdy x=0 sprawdzamy czy y=0. Jeżeli y=0, wówczas alternatywa według zasad logiki wynosi 0.2. Jeżeli y=1 wówczas alternatywa wynosi 1.3. Natomiast kiedy x=1, sprawdzamy jeszcze raz czy y=0.4. Jeżeli y=0 to alternatywa wynosi 1. 5. Natomiast jeśli y=1, to alternatywa wynosi 1.

1

2

4

3

7 8

5 6

Page 68: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

III ELI Przykładowy projekt

67

Procedura implikacji 1. Początek procedury: nazwa- implikacja: parametry x,y2. Sprawdzenie warunku: warunek: x == 03. Sprawdzenie warunku: warunek: y == 04. Sprawdzenie warunku: warunek: y == 05. Koniec procedury: wyrażenie - 16. Koniec procedury: wyrażenie - 17. Koniec procedury: wyrażenie - 08. Koniec procedury: wyrażenie - 1

Plan działania dla procedury implikacji 1. W pierwszym warunku sprawdzamy czy x=0, gdy x=0 sprawdzamy czy y=0. Jeżeli y=0, wówczas implikacja według zasad logiki wynosi 1.2. Jeżeli y=1 wówczas implikacja wynosi 1.3. Natomiast kiedy x=1, sprawdzamy jeszcze raz czy y=0.4. Jeżeli y=0 to implikacja wynosi 0. 5. Natomiast jeśli y=1, to wynosi 1.

1

2

4

3

7 8

5 6

Page 69: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

III ELI Przykładowy projekt

68

Procedura równoważności 1. Początek procedury: nazwa: równoważności: parametry x,y2. Sprawdzenie warunku: warunek: x == 03. Sprawdzenie warunku: warunek: y == 04. Sprawdzenie warunku: warunek: y == 05. Koniec procedury: wyrażenie - 16. Koniec procedury: wyrażenie - 07. Koniec procedury: wyrażenie - 08. Koniec procedury: wyrażenie - 1

Plan działania dla procedury równoważności1. W pierwszym warunku sprawdzamy czy x=0, gdy x=0 sprawdzamy czy y=0. Jeżeli y=0, wówczas równoważnośc według zasad logiki wynosi 1.2. Jeżeli y=1 wówczas równoważność wynosi 0.3. Natomiast kiedy x=1, sprawdzamy jeszcze raz czy y=0.4. Jeżeli y=0 to równoważność wynosi 0. 5. Natomiast jeśli y=1, to równoważność wynosi 1.

1

2

4

3

7 8

5 6

Page 70: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Grafika komputerowa jest to elektroniczne tworzenie i transmutacja ruchomych obrazów przy użyciu komputera. Pierwszym filmem tego rodzaju był disneyowski „Tron” z 1982 roku w reżyserii S. Lisbergera. Na początku 1988 r. pojawiła się nowa wersja języka Turbo C, wyposażona w obszerną bibliotekę graficzną, umożliwiającą realizowanie tych wszystkich funkcji graficznych, które kilka miesięcy wcześniej udostępniono w wersji 4.0 języka Turbo Pascal.

Istnieje również grafika laserowa, która słuzy do tworzenia trójwymiarowych obrazów przy uzyciu lasera sprzęgniętego z komputerem graficznym. Grafika muzyczna polegająca na swobodnym, nie zdeterminowanym w szczegółach, zapisie graficznym utworu muzycznego oraz grafika użytkowa służąca konkretnym celom, obejmuje ilustracja, ekslibris, liternictwo, plakat, druki akcydensowe i ulotne, znaczki pocztowe i banknoty.

Zastosowanie grafiki okazało się mniej kosztowne i czasochłonne. Dlatego też grafika wykorzystywana jest w wielu dziedzinach, przede wszystkim przy projekcji filmów, symulatorów lotów, projektów graficznych czy efektów specjalnych.

IV GRAFIKA

69

Wiadomości wstępne

Page 71: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Wiadomości wstępneUruchomienie programu Aby wejść do programu należy uruchomić:Dysk C:\ Borland C: \Bin:\ bc.exeKompilator Wykrywa niektóre błędy popełnione przez programistę. Błędy te można porównać do błędów ortograficznych i składniowych języka naturalnego. Nazywa się je błędami kompilacji. Inny rodzaj błędów to błędy wykonania. Uruchomienie kompilatora nazywamy procesem zmierzającym do zlokalizowania przyczyn i usunięcia znanych błędów.Kompilator uruchamiamy poprzez wciśnięcie klawiszy Ctrl + F9.Menu i okna edycyjne

Edytor ekranowy możemy uruchomić najeżdżając na c:\borlandc\bin\bc.exe pojawia się okno edycyjne gdzie u góry znajduje się menu.

Skróty klawiaturoweFileNew - otwarcie nowego okna edycyjnego, którym możemy pisać programOpen - otwarcie już istniejącego pliku F3Save - nagranie programu F2Save as - nagranie pod zmienioną nazwąSave all - nagranie wszystkiegoQuit - wyjście z programu Alt+x

EditUndo - cofniecie ostatniego polecenia Alt+BkSpRedo - cofnięcie ostatniego cofnięcia Shift+Alt+BkSpCut - uciąć zaznaczony fragment Shift+DelCopy - kopiowanie zaznaczonego fragmentu Ctrl+InsPaste - położenie skopiowanego fragmentu w miejscu kursora Shift+InsClear - wyczyszczenie zaznaczonego fragmentu Ctrl+Del

IV GRAFIKA

70

Wiadomości wstępne

Page 72: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Search Find - szukajReplace - zamieńSearch again - szukaj ponownie Ctrl+L

RunRun - uruchom Ctrl+F9Trace into - śledź program z wejściem w procedury F7Step over - śledź program bez wchodzenia w procedury F8

DegugEvaluate/modyfy - pozwala na obliczanie wyrażeń i modyfikacje zmiennych Ctrl+F4Watches/Add watch – dodanie zmienną do okienka, pozwala na śledzenie wartości zmiennych

WindowZoom -powiększenie okienka na cały ekran F5Cascade -ustawienie wielu okienek kaskadowoTile -umieszczenie okienek obok siebieNext -przejście do następnego okienka F6Close -zamknięcie okienka Alt+F3

HelpPomoc – F1Topic search - podpowiedź na temat polecenia, na którym znajduje się kursor Ctrl+F1Index -pojawia się lista poleceń Shift+F1

IV GRAFIKA

71

Wiadomości wstępne

Page 73: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Tryby graficzneFunkcje zawarte w bibliotece Graphics umożliwiają rozpoznawanie środowiska graficznego, inicjowanie grafiki pikselowej

i znakowej, przełączenie między trybem graficznym i tekstowym, ustanawianie okienek graficznych i tekstowych, a ponadto: wyprowadzanie tekstów, wykreślanie tekstów i wykreślanie podstawowych obiektów graficznych

Tryb tekstowyWykonanie każdego programu rozpoczyna się w trybie tekstowym. Znaki wyprowadzane na ekran mogą być białe na

czarnym tle, czarne na białym tle, migoczące i kolorowe. Wyprowadzenie znaków odbywa się za pośrednictwem plików skojarzonych z konsolą.

Okienko tekstowePo rozpoczęciu wykonywania programu domniemanym okienkiem tekstowym jest cały ekran. Lewy górny narożnik

ekranu tekstowego ma współrzędne (1,1), a prawy dolny ma współrzędne (col, lin) gdzie col jest liczbą kolumn, a lin jest liczbą wierszy ekranu.

Kolory Wykreślanie obiektów graficznych może być czarno – białe albo kolorowe. Wykreślanie czarno – białe dotyczy zazwyczaj

kart graficznych nie uwzględniających koloru, jak np. karta Hercules. Oczywiście w takim przypadku kolor „ biały ” zależy od użytego luminoforu i może być w istocie np.. zielony albo bursztynowy. Jeśli jest możliwe wyświetlanie kolorowe np. karta EGA albo CGA, to podczas instalowania sterownika graficznego można określić tryb jego pracy, a tym samym dostępną paletę kolorów.

IV GRAFIKA

72

BLACK - czarny (0)BLUE - niebieski (1)GREEN - zielony (2)CYAN - turkusowy (3)RED - czerwony (4)MAGENTA - karmazynowy (5)BROWN - brązowy (6)LIGHTGRAY - jasnoszary (7)

DARKGRAY - ciemnoszary (8)LIGHTBLUE - jasnoniebieski (9)LIGHTGREEN - jasnozielony (10)LIGHTCYAN - jasnoturkusowy (11)LIGHTRED - jasnoczerwony (12)LIGHTMAGENTA - jasnokarmazynowy (13)YELLOW - żółty (14)WHITE - biały (15)

Wiadomości wstępne Tryby graficzne

Page 74: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Podprogramy graficzne Na początku programu musimy zainicjować grafikę. initgraph (& driver, &mode, ” ” );Drive oraz mode są wartościami całkowitymi określające typ karty oraz tryb pracy karty graficznej. Każdy program graficzny musi kończyć się zamknięciem grafiki.

Rodzaje podprogramów graficznych line ( x1, y1, x2, y2 ) – funkcja ta rysuje linę prostą od punktów x1, y1 do punktów x2, y2.

Aby uzyskać wartości max x i y stosujemy funkcje: •getmaxx, która zwraca rozdzielczość w poziomie dla karty VGA i wynosi 640 •getmaxy, która zwraca współrzędną pionową wynoszącą 480.

linerel – wykreślenie odcinka w linii prostej łączącego punkt wyszczególniony przez kursor z punktem odległym od niego o delta x w poziomie i delta y w pionie.

lineto – funkcja wykreśla linię prostą od współrzędnych kursora graficznego do współrzędnych x, y podanych w nawiasach.

circle – okrąg, funkcja wymaga trzech argumentów, dwa pierwsze oznaczają współrzędne środka, trzecia zaś promień np. circle (x, y, r )

arc – wykreślenie łuku okręgu o środku w punkcje x, y I promieniu r. Począwszy od α 1 a skończywszy na α 2, np. arc (x, y, r, α 1 ,α 2 )

bar – wykreślenie słupka prostokątnego, którego przeciwległe wierzchołki mają współrzędne x1, y1 i x2, y2

drawpoly – wykreślenie linii łamanej składającej się z ‘n’ punktów, których współrzędne (x, y) następują kolejno po sobie.

ellipse – funkcja wykreśla elipse o środku w punkcie x, y i półosiach xr oraz yr począwszy od kąta α 1 a skończywszy na kącie α 2 .

rectangle – wykreślenie prostokąta, którego przeciwległe wierzchołki mają współrzędne (x1, y1) lewy górny róg i (x2, y2) prawy dolny róg.

IV GRAFIKA

73

Wiadomości wstępne Podprogramy graficzne

Page 75: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setcolor – wybranie numeru koloru do wykreślania linii. W nawiasach umieszczamy argument, który oznacza kolor. Są to liczby z zakresu od 0 – 15. Kolory w nawiasach wpisujemy dużymi literami.

setbcolor - zmiana koloru tła Zmiana koloru tła na taki kolor związany z pozycją o numerze Color bieżącej palety. Wyjątek: jeśli Color ==0, kolor tła zostanie zmieniony na czarny.

floodfill – (x, y, granica) funkcja wypełnia zadanym wzorem wnętrza obszaru obejmującego punkt o współrzędnych (x,y), ograniczonego linią, której numer jest określony przez granice.

setfillstyle – (styl, kolor ), ustalenie standardowego wzoru wypełnienia obszarów. Pierwszy parametr określa styl (od 0 –12 ), drugi zaś kolor wypełnienia.

setfillpattern – tworzenie własnego stylu

IV GRAFIKA

74

Wiadomości wstępne Podprogramy graficzne

Page 76: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Struktura programu w C++Aby uruchomić grafikę Borland C należy dołączyć bibliotekę graficzną # include <graphics.h>. Każdy program musi zaczynać się od funkcji main(), następnie musi wystąpić nawias klamrowy otwierający oraz ciąg instrukcji zakończony nawiasem klamrowym zamykającym.

Inicjacja grafiki Aby skorzystać z grafiki musimy ją zainicjować. # include <graphics. h>main (){

int drive = DETECT, mode; initgraph (& drive, &mode, "");

instrukcje }int – jest to typ całkowitydrive – numer kart graficznychDETECT – odszukajmode – w jakim trybie pracuje karta

Deklaracje zmiennych Na początku funkcji main powinny wystąpić deklaracje zmiennych takich jak: np. int – jest to podstawowy typ zmiennych (typ całkowity )float – jest to deklaracja typu rzeczywistego Program powinien kończyć się funkcją closegraph (); - czyli zamknięcie grafiki . Funkcją getch()- czeka na wciśnięcie klawisza, w tym czasie można obejrzeć rysunek oraz return 0.

IV GRAFIKA

75

Wiadomości wstępne Struktura programu w C++

Page 77: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Przykład # include <graphics.h>main(){

ciąg poleceńclosegraph ();getch();return 0;}

PrzykładProgram narysuje kwadrat wpisany w koło i wypełni elementy różnymi kolorami

# include <conio.h># include <graphics.h>main(){int drive = DETECT, mode;initgraph (&drive, &mode, “ ” ); rectangle (160,120,480,360);line (160,360,480,120);circle (320,240,200);

setfillstyle (8, YELLOW);floodfill (380,270, WHITE);

IV GRAFIKA

76

Wiadomości wstępne Struktura programu w C++

Page 78: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setfillstyle (1, GREEN);floodfill (330,100, WHITE);

setfillstyle (1, RED);floodfill (140,230, WHITE);

setfillstyle (5, CYAN);floodfill (500,2400, WHITE);

setfillstyle (10, MAGENTA);floodfill (320,400, WHITE);

setfillstyle (1, LIGHTGRAY);floodfill (0,0, WHITE);

getch();return 0;}

PrzykładProgram tworzy własny wzór wypełnienia w postaci inicjału np. KK# include <conio.h># include <graphics.h>main(){int drive = DETECT, mode;char tablica [8]= { 0x0, 0x50, 0x60, 0x50, 0xA, 0xC, 0xA, 0x0 }initgraph (&drive, &mode, “ ” );

setbcolor (WHITE);setfillpattern (tablica, BLUE);rectangle (0,0,640,480);floodfill (320,240,15);getch(0;return 0;}

IV GRAFIKA

77

Wiadomości wstępne Struktura programu w C++

Page 79: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Tworzenie animacji przy użyciu strony kart graficznychAby stworzyć animacje przy użyciu karty graficznej należy fazy ruchu podzielić na 4 obrazki. Każdy z obrazków należy umieścić na odpowiedniej stronie karty graficznej.Numery kart i trybów mogą być wyrażone za pomocą następujących symboli.

Symbol kartyCGA - karta CGA {1}MCGA - karta MCGA {2}EGA - karta EGA{3}EGA64 - karta EGA64 {4}EGAMONO - karta EGAMONO {5}IBM8514 - karta IBM8514 {6}HERCMONO - karta HERCULES{7}ATT400 - karta ATT400 {8}VGA - karta VGA {9}PC3270 - karta PC3270 {10}

Symbol trybuCGACO - 320 x 200, paleta 0 {0} CGAC1 - 320 x 200, paleta 1 {1}CGAC2 - 320 x 200, paleta 2 {2}CGAC3 - 320 x 200, paleta 3 {3}CGAHI - 640 x 200, 1 strona {4}MCGAC0 - 320 x 200, paleta 0 {0}MCGAC1 - 320 x 200, paleta 1 {1}MCGAC2 - 320 x 200, paleta 2 {2}MCGAC3 - 320 x 200, paleta 3 {3}MCGAMED - 640 x 200, 1 strona {4}MCGAHI - 640 x 480, 1 strona {5}EGALO - 640 x 200, 16 kolorów, 4 strony {0}EGAHI - 640 x 350, 16 kolorów, 2 strony {1}

IV GRAFIKA

78

Wiadomości wstępne Tworzenie animacji przy użyciu strony kart graficznych

Page 80: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

IV GRAFIKA

79

EGA64LO - 640 x 200, 16 kolorów, 1 strona {0}EGA64HI - 640 x 350, 4 kolory, 1 strona {1}EGAMONOHI - 640 x 350, 64 K na karcie, 1 strona {3} 256 K na karcie, 2 strony {3}HERCMONOHI - 720 x 348, 2 strony {0}ATT400C0 - 320 x 200, paleta 0 {0}ATT400C1 - 320 x 200, paleta 1 {1}ATT400C2 - 320 x 200, paleta 2 {2}ATT400C3 - 320 x 200, paleta 3 {3}ATT400MED - 640 x 200, 1 strona {4}ATT400HI - 640 x 400, 1 strona {5}VGALO - 640 x 200, 16 kolorów, 4 strony {0}VGAMED - 640 x 350, 16 kolorów, 2 strony {1}VGAHI - 640 x 480, 16 kolorów, 1 strona {2}PC3270HI - 720 x 350, 1 strona {0}IBM8514LO - 640 x 480, 256 kolorów IBM8514HI - 1024 x 768, 256 kolorów

Wiadomości wstępne Tworzenie animacji przy użyciu strony kart graficznych

Page 81: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

IV GRAFIKA

80

Symulacja karty EGA odbywa się na początku programu w momencie, gdy deklarujemy sterownik i tryb pracy tego stanowiska.#include<graphics.h>

main(){

int gdrive = EGA, mode = EGALO;initgraph(& gdrive,& mode,””);

setactivepage() – ustawienie aktywnej strony dla określonej karty graficznej ( podajemy numer strony, która ma być aktywna, strony numerujemy od 0 do 3) Strona aktywna nie jest jednoznaczna ze strona widzialną. Wszystkie operacje graficzne od tego momentu będą tylko dotyczyć tej strony.setvisualpage() – wyświetlenie strony widocznej o numerze podanym w nawiasach. Program musi być w trybie graficznym.

setactivepage(0);setvisualpage(0);

Aby uzyskać złudzenie animacji należy w pętli wyświetlać w odpowiedniej kolejności 4 obrazki, do tego celu zastosujemy pętlę dopóki.while( kbhit() ){

setvisualpage(0);setvisualpage(1);setvisualpage(2);setvisualpage(3);

}

Wiadomości wstępne Tworzenie animacji przy użyciu strony kart graficznych

Page 82: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

PrzykładWykorzystanie funkcji setactivepage

#include<graphics.h>#include<conio.h>

main(){int Driver, Mode;Driver=HERCMONO;Mode=HERCMONOHI;initgraph(&Driver,&Mode,”…”);if (graphresult()!=grok)exit(1);setvisualpage(0);setactivepage(0);outtext(„Press any key”);setactivepage(1);line(0,0 getmaxx(),getmaxy());while (!kbhit());(void) getch();setvisualpage(1);while (!kbhit());closegraph();}

IV GRAFIKA

81

Wiadomości wstępne Tworzenie animacji przy użyciu strony kart graficznych

Page 83: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Style tekstu w trybie graficznymouttextxy - (midx , mid y, fname[style]); - funkcja wyświetla tekst w trybie graficznym zaczynając od punktu o współrzędnych x i współrzędnych y , trzecim parametrem jest styl czcionki: outtext (styl)0 – poziomo HORIZ_DIR1 – pionowo VERT_DIRStyleDEFAULT_FONT 0TRIPLEX_FONT 1SMALL_FONT 2SANS_SERIF_FONT 3GOTHIC_FONT 4Przykład Program wypisze zadany tekst. #include<conio.h>#include<graphics.h>#include<dos.h>

main(){

int drive = EGA, mode = EGALO;int x, y;initgraph (&drive, &mode,””);

x=220;y=50;

settextstyle (4,0,2);outtextxy (x, y, „Mój program”);

getch();return 0;}

IV GRAFIKA

82

Wiadomości wstępne Style tekstu w trybie graficznym

Page 84: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Funkcja getimage i putimagegetimage Zapamiętanie obrazu. Wyodrębnienie, w obrębie bieżącego okienka graficznego, prostokątnego obszaru, którego przeciwległe wierzchołki maja współrzędne (x1, y1) i (x2, y2), a następnie zapamiętanie obrazu zawartego w tym prostokącie w obszarze pamięci wskazanym przez BitMap.

PrzykładZapamiętanie i odtwarzanie obrazu.

/*Getimage*/#include<graphics.h>#include<conio.h>

void*Ref;main()

{int Driver, Mode;Driver=DETECT;initgraph(&Drive, &Mode,””);

if (graphresult()!=gr ok)exit(1);line(0,0 getmaxx(),getmaxy());Ref=malloc(imagesize(0, 0, getmaxx(),getmaxy());getimagesize(0, 0, getmaxx(),getmaxy(),Ref);

while (!kbhit());(void) getch();clearviewport();

putimage(0, 0, Ref, COPY, PUT);while (!kbhit());closegraph();}

Wyodrębnienie w obrębie bieżącego okienka graficznego, prostokątnego obszaru, którego przeciwległe wierzchołki mają współrzędne x1, y1, x2, y2 a następnie zapamiętanie obrazu zawartego w tym prostokącie w obszarze pamięci wskazanej przez Bitmap.

IV GRAFIKA

83

UwagiSystem musi być w trybie graficznym.

Zaleca się aby rozmiar obszaru był określony za pomocą funkcji imagesize.

Wiadomości wstępne Funkcja getimage i putimage

Page 85: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

putimage Umieszczenie obrazu na ekranie. Umieszczenie na ekranie prostokątnego obrazu graficznego zapamiętanego w uprzednim obszarze pamięci wskazanej przez BitmapWykonanie tego w taki sposób, aby lewy górny narożnik prostokąta znalazł się w punkcie o współrzędnych( x, y ) a nałożenie obrazu na ekran odbyło się zgodnie z wartością 0p. System musi być w trybie graficznym. Wykonanie funkcji putimage nie powoduje obcięcia obrazu na obrzeżach okienka graficznego. Jeśli obcięcie byłoby wymagane to wykonanie funkcji nie wywoła żadnych skutków.

WyjątekJeżeli dolnym obrzeżem okienka jest dolne obrzeże ekranu to obraz wykraczający poza to obrzeże (i tylko poza nie) jest umieszczany na ekranie i obcinany.Sposób nałożenia obrazu na ekran (parametr 0p) może być określony za pomocą symboli:COPY_PUT – operacja morXOR_PUT – operacja xor {1}OR_PUT – operacja or{2}AND_PUT – operacja and {3}NOT_PUT – operacja not {4}Cleardevice – wyczyszczenie ekranu graficznego

IV GRAFIKA

84

Wiadomości wstępne Funkcja getimage i putimage

Page 86: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Przykład Wykorzystanie funkcji getimage i putimage przy tworzeniu animacji#include<graphics.h>#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<dos.h>#define AROWW_SIZE 10void draw_arrow( int x, int y);int main (void){

int gdriver=DETECT,gmode;void*arrow;int x, y, maxx;unsigned int size;

initgraph (&gdriver, &gmode,””);maxx=getmaxx();x=0y=getmaxy() /2;

circle (80,80,40);setfillstyle (2,RED);floodfill (80,80,15);

size=imagesize (40,4,120,120);arrow=malloc (size);getimage (40,40,120,120, arrow);

while (!kbhit()){

IV GRAFIKA

85

Wiadomości wstępne Funkcja getimage i putimage

Page 87: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

POZIOMO{

putimage (X+40,40, arrow, XOR_PUT);x+=ARROW_SIZE;

if (x>=getmax()/2)max=0putimage (x+40,40 arrow, XOR_PUT);

delay (500);}

PIONOWO{

putimage (40,y+40, arrow, XOR_PUT);y+=10;

if (y>=480)y=0putimage (40,y+40, arrow, XOR_PUT);

delay (500);}

IV GRAFIKA

86

Wiadomości wstępne Funkcja getimage i putimage

Page 88: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

PO SKOSIE{

putimage (x+40,X+40 arrow, XOR_PUT);x+=ARROW_SIZE;

if (x>=max)X=0putimage (x+40,X+40 arrow, XOR_PUT);

delay (500);}}

free (arrow);closegraph();return 0;

}

PrzykładProgram pokazuje dwa łuki, które schodzą się na środku ekranu# include<graphics.h># include<stdlib.h># include<stdio.h># include<conio.h># include<dos.h>int main ( void )void *arrow;void *arrow1;int x, x1, y;unsigned int size;initgraph ( &gdriver, &gmode, “ ” );x=0;x1=0;

IV GRAFIKA

87

Wiadomości wstępne Funkcja getimage i putimage

Page 89: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

arc (100,240,90,270,50);arc(540,240,270,90,50);putpixel (100,240,YELLOW);size=imagesize(50,190,100,290);arrow=malloc(size);getimage(50,190,100,290,arrow);size=imagesize(540,190,590,290);arrow1=malloc(size);getimage(540,190,590,290,arrow1);while (! kbhit()){putimage(x+50, 190, arrow, XOR_PUT);putimage(540-x1, 190, arrow1, XOR_PUT);x+=10;x1+=10;if (x >= getmaxx ()/ 2)x=0;if (640 – x1 <= getmaxx ()/ 2)x1=0;putimage (x+50, 190, arrow, XOR_PUT);putimage (540-x1, 190, arrow1, XOR_PUT);delay(500);}free (arrow);free (arrow1);closegraph();return 0;}

IV GRAFIKA

88

Wiadomości wstępne Funkcja getimage i putimage

Page 90: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Tworzenie linii użytkownika

Funkcja ustawiająca rodzaj linii – getlinesettings (graphics.h)getlinesettings – ujawnienie parametrów linii void getlinesettinds ( struct linesettingstype * Linelnfo)Przypisanie strukturze Linelnfo danej typu (struct linesettindstype), określającej rodzaj, wzór i grubość linii.System musi być w trybie graficznym.Typ (struct linesettingstype) jest zdefiniowany następująco :

struct linesettingstype{int linestyle;unsigned upattern;int thickness;}

Pole linestyle określa numar rodzaju linii . Jeśli numerem tym jest :USERBIT_LINE to pole upattern określa wzór linii. Pole thickness określa grubość linii.Wartość danych przypisanych polom linestyle i thickness mogą być wyrażone za pomocą symboli:Pole linestyleSOLID_LINE –linia ciągła {0}DOTTED_LINE – linia kropkowana {1} CENTER_LINE – linia centrowana {2}DASHED_LINE – linia przerywana {3}USERBIT_LINE –linia zdefiniowana {4}Pole thickness:NORM_WIDTH -linia cienka {1}THICK_WIDTH-linia pogrubiona {3}

IV GRAFIKA

89

Wiadomości wstępne Tworzenie linii użytkownika

Page 91: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Przerwania – wykorzystaniePrzerwanie jest to program wykonywany w momencie inicjacji przerwania.Przerwania mogą być wywołane poprzez tajmery bądź też przy obsłudze wejścia – wyjścia.Każde przerwanie jest umieszczone w hierarchii przerwań.Przerwanie 33H Przerwanie to dotyczy obsługi myszki, posiada wiele funkcji.

Funkcja 0HPowoduje inicjację myszki, ustawienie przycisków na dwa, określawspółrzędne początkowe myszki. Najczęściej jest to środek ekranu. W trybie graficznym kursor myszki przyjmuje kształt strzałki, w trybie tekstowym jest to wypełniony prostokąt.

Funkcja 01HFunkcja wyświetla kursor, wywołanie polega na wpisaniu do AX wartości 1.

Funkcja 2HOdpowiedzialna jest za ukrywanie kursora. Wywołanie AX=2.Program obsługi myszki dalej śledzi ruch myszy. Funkcję należy wywołać przed zmianą zawartości obszaru, w którym znajduje się kursor.

Funkcja 3HOdpowiada za odczytanie stanu przycisku i położenia myszy.Wywołanie AX=3, funkcja zwraca;

BX – stan przycisków myszy CX – współrzędna pozioma DX – współrzędna pionowa

Stan przycisków myszy wskazują bity rejestru BX .0 – oznacza stan przycisku lewego, a bit 1 – stan przycisku prawego.Bity mają stan 1, jeżeli przycisk jest naciśnięty, 0- jeżeli przycisk jest zwolniony. W trybie tekstowym wartości współrzędne należy podzielić przez 8.

IV GRAFIKA

90

Wiadomości wstępne Przerwania - wykorzystanie

Page 92: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Funkcja 4HPowoduje ustawienie myszy w pozycji kursora.Wywołanie AX=4

CX – nowa współrzędna kursora myszy DX – nowa współrzędna pionowa

Funkcja powoduje ustawienie kursora we wskazanej pozycji jako wartości należy podać liczby całkowite.Funkcja 05HOdczytuje informacje o naciśnięciu przycisków.Wywołanie AX=5 BX ( 0-lewy, 1- prawy). Zwraca wartość ile razy przycisk był naciśnięty od ostatniego wywołania. Liczba w zakresie od 0 do 65.535.Funkcja zwraca stan przycisków tak jak w funkcji 3H .

Funkcja 6HOdczytanie informacji o zwolnieniu przycisków.Wywołanie AX=6. Funkcja zwraca do rejestru stan przycisków.

BX (0 – lewy, 1 - prawy). Zwraca ile razy przycisk był zwolniony. CX – zwraca współrzędną poziomą w chwili ostatniego zwolnienia DX – zwraca współrzędną pionową w chwili ostatniego zwolnienia

Funkcja 7HUstawia minimalną i maksymalną współrzędną poziomą kursora. Wywołanie AX=7

CX – wpisujemy minimalną współrzędną poziomą DX – wpisujemy maksymalną współrzędną poziomą

Funkcja 8HUstawia minimalną i maksymalną pozycję kursora.Wywołanie AX=8

CX – wpisujemy minimalną współrzędną pionową DX – wpisujemy maksymalną współrzędną pionową

IV GRAFIKA

91

Wiadomości wstępne Przerwania - wykorzystanie

Page 93: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Funkcja 9HUstawienie rodzaju kursora graficznego.Wywołanie AX=9 BX – wpisujemy odległość osi X punktu aktywnego kursora od lewego rogu maski kursora CX – wpisujemy odległość osi Y punktu aktywnego kursora . DX – wskaźnik do tablicy zawierającej maski ekranu i kursora.Funkcja 0AH Ustawienie rodzaju kursora przy pracy w trybie tekstowym.Wywołanie AX=10

BX – wybór rodzaju kursora CX – maska ekranu lub numer linii początku kursora w wierszu DX – maska kursora lub numer linii końca kursora w wierszu

Funkcja 0BHZwraca liczbę impulsów określającą przesunięcie poziome i pionowe od poprzedniego wywołania funkcji 0BX.Czułość myszy, zależne od typu wynosi 200 lub 400 impulsów na cal. Zakres liczb w rejestrach wynosi zawsze od - 32768 do 32767, przy czym wartości dodatnie odpowiadają przesunięciu w prawo i do dołu, a ujemne w lewo i do góry ekranu.Po wykonaniu funkcji rejestry przesunięcia są automatycznie zerowane.Wywołanie AX=11

CX – liczba impulsów w osi poziomej DX – liczba impulsów w osi pionowej

Funkcja 0CHPozwala ustawić adres procedury obsługi przerwania , która zostanie wykonana w czasie obsługi przerwania sprzętowego myszy.Procedura obsługi powinna kończyć się instrukcją RETF. Warunkiem wykonania procedury obsługi przerwania jest spełnienie warunków określonych przez maskę w rejestrze CX.Wywołanie AX=12

CX – maska przerwania DX- adres procedury obsługi przerwania

IV GRAFIKA

92

Wiadomości wstępne Przerwania - wykorzystanie

Page 94: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Funkcja 0DHWłączenie trybu emulacji pióra świetlnego. Emulacja odbywa się z użyciem przycisków myszy, naciśnięciu obu przycisków odpowiada włączeniu pióra, zwolnienie dowolnego przycisku odpowiada oderwaniu pióra świetlnego od ekranu.Wywołanie AX=13Funkcja 0EHPowoduje włączenie trybu emulacji pióra świetlnego.Wywołanie AX=14Funkcja 0FHUstalenie czułości myszy. Czułość określa się ustalając stosunek liczby impulsów myszy do przesunięcia kursora o 8 punktów ekranu wirtualnego, w zakresie od 1 do 32767. wartościami domyślnymi są : 8 – dla czułości w osi poziomej16 – dla czułości w osi pionowejWywołanie AX=15 CX – stosunek liczby impulsów myszy do przesunięcia kursora o 8 punktów ekranu wirtualnego w osi X DX – stosunek liczb impulsów myszy do przesunięcia kursora o 8 punktów w osi YFunkcja 10HPowoduje zaniechanie wyświetlenia kursora, Wywołanie AX=16

CX – współrzędna x górnego lewego obszaruDX – współrzędna y górnego lewego obszaru

IV GRAFIKA

93

Wiadomości wstępne Przerwania - wykorzystanie

Page 95: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Przykład

Program prezentuje trzy grające kółka# include<conio.h># include<stdio.h># include<dos.h># include<graphics.h>void grafika();void obrazki();void mysz();void myszka();int x1, x2, x3, y1, y2, y3, r1, r2, r3;main(){

x1=y1=y2=100;x2=y3=200;x3=150;

r1=r2=r3=50;myszka();grafika();obrazki();mysz();closegraph();return 0;}

IV GRAFIKA

94

Wiadomości wstępne Przerwania - wykorzystanie

Page 96: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

void grafika(void){

int gdriver = DETECT, gmode, errorcode;initgraph (&gdriver, &gmode, “ d:\poi\borlandc\bgi”);setcolor(YELLOW);setbcolor(BLUE);

}

void obrazki(void){

circle(x1, y1, r1);circle(x2, y2, r2);circle(x3, y3, r3);/* “ EMPTY_FILL ”,

“ SOLID_FILL ”, “ LINE_FILL ”,

“ LTSLASH_FILL ”, “ SLASH_FILL ”, “ BKSLASH_FILL ”, “ LTBKSLASH_FILL ”, “ HATCH_FILL ”, “ XHATCH_FILL ”, “ INTERLEAUE_FILL ”, “ WIDE_DOT_FILL ”, “ CLOSE_DOT_FILL ”, “ USER_FILL ”, */

IV GRAFIKA

95

Wiadomości wstępne Przerwania - wykorzystanie

Page 97: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setcolor (YELLOW);setfillstyle (SOLID_FILL, GREEN);floodfill(x1, y1, YELLOW);

setfillstyle (SOLID_FILL, RED);floodfill(x2, y2, YELLOW);

setfillstyle (SOLID_FILL, MAGENTA);floodfill(x3, y3, YELLOW);

}

void mysz(void){unsigned int x, y, p;

asm {mov AX, 0 // zainicjowanie myszyint 33 hmov AX, 1 // wyświetlenie kursoraint 33 h }

}while ( ! (x <= 50 && y <= 200 && p == 1))

{asm {

mov AX, 3h // odczytanie stanu przycisków i położenia myszy

INT 33hMOV p, BX // przyciskiMOV x, CX // współrzędne xMOV y, DX // współrzędne y

}

IV GRAFIKA

96

Wiadomości wstępne Przerwania - wykorzystanie

Page 98: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

gotoxy (20,20);printf (” przyciski % 1u x - % - 3 u y - % - 3 u ”, p, x, y);

if (( x – x1 ) * ( x – x1 ) + ( y – y1 ) * ( y – y1 ) < = r1 * r1){sound ( 100 );delay ( 200 );nosound ();

}if (( x – x2 ) * ( x – x2 ) + ( y – y2 ) * ( y – y2 ) < = r2 * r2)

{sound ( 200 );delay ( 200 );nosound ();

}if (( x – x3 ) * ( x – x3 ) + ( y – y3 ) * ( y – y3 ) < = r3 * r3)

{sound ( 400 );delay ( 200 );nosound ();}

}}

IV GRAFIKA

97

Wiadomości wstępne Przerwania - wykorzystanie

Page 99: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

void myszka(void){unsigned int x, y, p;

asm {mov AX, 0 // zainicjowanie myszkiint 33 hmov AX, 1 // wyświetlenie kursoraint 33 h }

}p=0while (( p == 0 ))

{asm {

MOV AX, 3h // odczytanie stanu przycisków I położenia myszyINT 33hMOV p, BX // przyciski

}gotoxy (20,20);printf (” wciśnij myszkę ”);

}}

IV GRAFIKA

98

Wiadomości wstępne Przerwania - wykorzystanie

Page 100: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

Przykładowy projektProjekt przedstawia animację komputerową w języku C++#include<conio.h>#include<graphics.h>#include<dos.h>#include<stdio.h>#include<stdlib.h>int main(void){

int gdrive=EGA,gmode=EGALO;initgraph(&gdrive,&gmode,"");

setactivepage(0);setbkcolor(2);

line(245,180,305,180); line(245,170,275,170);arc(245,175,90,270,10);ellipse(305,175,270,360,15,5);ellipse(275,175,0,90,45,5);

ellipse(290,170,90,180,15,5); line(290,165,320,165);line(320,175,350,175);ellipse(320,170,0,90,45,5);ellipse(350,170,270,360,15,5);

ellipse(275,170,90,180,30,25); ellipse(305,170,90,180,30,20);line(275,145,245,135);arc(305,145,270,90,10);line(305,140,260,125);

IV GRAFIKA

99

Przykładowy projekt

Page 101: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

ellipse(305,170,90,180,30,20);ellipse(335,165,90,180,15,15);arc(335,145,270,90,10);line(335,140,275,120);

arc(245,120,90,270,35);

ellipse(172,115,120,335,50,30);

line(245,105,260,90); ellipse(260,75,270,90,15,15);ellipse(260,50,90,270,15,10);ellipse(275,110,270,360,45,10);ellipse(335,90,270,90,15,10);line(335,80,320,70);ellipse(320,65,90,270,9,5);

ellipse(290,110,0,90,15,10); line(290,100,305,90);line(305,90,320,100);line(320,100,335,100);line(335,100,380,105);line(380,105,395,105);line(395,105,410,110);line(410,110,395,110);line(395,110,395,115);line(395,115,380,110);line(380,110,305,110);

IV GRAFIKA

100

Przykładowy projekt

Page 102: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

ellipse(335,90,0,90,30,10); line(365,90,380,90);line(380,90,425,95);line(425,95,440,95);line(440,95,455,100);line(455,100,440,100);line(440,100,440,105);line(440,105,425,100);line(425,100,350,100);ellipse(344,100,0,90,6,5);

ellipse(320,55,180,360,30,5); ellipse(320,30,340,90,15,5);circle(325,30,6); ellipse(275,25,270,360,45,5);

ellipse(335,37,260,90,30,5);

arc(350,45,158,270,20);

arc(328,40,200,300,30); line(290,45,305,44);

line(245,35,200,50); ellipse(200,40,270,360,60,10);line(245,35,260,10); line(260,10,260,30);line(260,30,275,10);line(275,10,275,30);

IV GRAFIKA

101

Przykładowy projekt

Page 103: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(275,120,245,105); line(260,60,320,70);

line(365,90,350,100);

line(320,100,320,110);ellipse(500,20,0,360,105,15); outtextxy(450,10,"DIABELKI PROSZA");outtextxy(470,20," O 5-TKI !!!");setfillstyle(6,14); floodfill(245,120,15);setfillstyle(1,5); floodfill(335,90,15);floodfill(305,100,15);floodfill(360,90,15);setfillstyle(1,4);floodfill(290,40,15); floodfill(350,105,15);floodfill(380,95,15);setfillstyle(2,6); floodfill(245,175,15);floodfill(320,170,15);setfillstyle(1,5);floodfill(590,20,15);setfillstyle(1,8); floodfill(325,30,15);

IV GRAFIKA

102

Przykładowy projekt

Page 104: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setcolor(15); line(320,130,485,80); line(465,70,505,90);line(465,70,490,60);line(485,80,505,73);line(505,90,530,80);

line(20,180,20,195); line(25,180,25,195);line(30,190,30,195);line(35,175,35,195);line(40,180,40,195);line(50,187,50,195);line(70,169,70,195);line(75,190,75,195);line(78,175,78,195);line(80,180,80,195);line(130,175,130,195);line(135,170,132,195);line(160,180,160,195);line(170,180,170,195);line(175,175,171,195);line(250,185,252,195);line(260,187,262,195);

IV GRAFIKA

103

Przykładowy projekt

Page 105: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(270,189,268,195);line(370,176,370,195);line(389,179,379,195);line(380,178,380,195);line(385,179,385,195);line(45,175,45,195);line(90,175,92,195);line(103,178,103,195);line(115,180,117,195);line(143,182,145,195);line(255,182,256,195);line(267,182,269,195);line(290,180,290,195);line(310,182,310,195);line(255,182,255,195);line(264,189,265,195);line(278,178,280,195);line(290,181,290,195);line(320,184,321,195);line(610,184,611,195);line(613,185,613,195);line(598,184,598,195);line(603,189,603,195);line(550,184,550,195);line(555,186,555,195);

IV GRAFIKA

104

Przykładowy projekt

Page 106: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(460,165,500,195); line(570,165,503,195);line(503,135,503,195);circle(503,130,17);setfillstyle(9,4);floodfill(503,130,15);circle(503,119,8);circle(478,130,8);circle(528,130,8);circle(487,123,8);circle(518,123,8);circle(487,137,8);circle(518,137,8);setfillstyle(1,4);floodfill(503,119,15);floodfill(478,130,15);floodfill(528,130,15);floodfill(518,123,15);floodfill(487,123,15);floodfill(487,137,15);floodfill(518,137,15);

ellipse(560,80,0,360,13,8); circle(560,70,6); setfillstyle(6,14);floodfill(560,80,15);setfillstyle(1,6);floodfill(560,70,15);

IV GRAFIKA

105

Przykładowy projekt

Page 107: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(558,67,556,63); line(560,67,562,63);

line(537,75,537,85); line(583,75,583,85);line(537,75,547,79);line(537,85,547,81);line(583,75,573,79);line(583,85,573,81);ellipse(100,150,0,360,25,5);

circle(130,150,6);setfillstyle(6,14);floodfill(100,150,15);setfillstyle(1,6);floodfill(130,150,15);

line(85,138,100,145); line(100,145,115,138);line(85,138,115,138);line(97,162,110,162);line(97,162,100,155);line(110,162,100,155);

line(136,150,146,148); line(136,150,146,152);

circle(60,25,40); setfillstyle(1,14);floodfill(60,25,15);

IV GRAFIKA

106

Przykładowy projekt

Page 108: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setvisualpage(0); setactivepage(1);

setfillstyle(1,9);floodfill(1,1,15);

line(245,180,305,180); line(245,170,275,170);arc(245,175,90,270,10);ellipse(305,175,270,360,15,5);ellipse(275,175,0,90,45,5);

ellipse(290,170,90,180,15,5); line(290,165,320,165);line(320,175,350,175);ellipse(320,170,0,90,45,5);ellipse(350,170,270,360,15,5);

ellipse(275,170,90,180,30,25); ellipse(305,170,90,180,30,20);

line(275,145,245,135);arc(305,145,270,90,10);line(305,140,260,125);

ellipse(305,170,90,180,30,20); ellipse(335,165,90,180,15,15);arc(335,145,270,90,10);line(335,140,275,120);

IV GRAFIKA

107

Przykładowy projekt

Page 109: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

arc(245,120,90,270,35);

ellipse(172,115,80,320,50,10);

line(245,105,260,90); ellipse(260,75,270,90,15,15);ellipse(260,50,90,270,15,10);

ellipse(275,110,270,360,45,10); ellipse(335,90,270,90,15,10);line(335,80,320,70);ellipse(320,65,90,270,9,5);ellipse(290,110,0, 90,15,10); line(290,100,305,90);line(305,90,320,100);line(320,100,335,100);line(335,100,380,105);line(380,105,395,105);line(395,105,410,110);line(410,110,395,110);line(395,110,395,115);line(395,115,380,110);line(380,110,305,110);ellipse(335,90,0,90,30,10); line(365,90,380,90);line(380,90,425,95);line(425,95,440,95);line(440,95,455,100);line(455,100,440,100);line(440,100,440,105);line(440,105,425,100);

IV GRAFIKA

108

Przykładowy projekt

Page 110: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(425,100,350,100);ellipse(344,100,0,90,6,5);

ellipse(320,55,180,360,30,5); ellipse(320,30,340,90,15,5);circle(325,30,6); ellipse(275,25,270,360,45,5);

ellipse(335,37,260,90,30,5);

arc(350,45,158,270,20);

arc(328,40,200,300,30); line(290,45,305,44);

line(245,35,230,55); ellipse(230,40,270,360,30,15);line(245,35,260,10); line(260,10,260,30);line(260,30,275,10);line(275,10,275,30);line(275,120,245,105); line(260,60,320,70);line(365,90,350,100);line(320,100,320,110);

ellipse(500,20,0,360,105,15);

outtextxy(450,10,"DIABELKI PROSZA");outtextxy(470,20," O 5-TKI !!!");

IV GRAFIKA

109

Przykładowy projekt

Page 111: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

setfillstyle(9,9); floodfill(245,120,15);setfillstyle(11,11); floodfill(335,90,15);floodfill(305,100,15);floodfill(360,90,15);setfillstyle(1,4);floodfill(290,40,15); floodfill(350,105,15);floodfill(380,95,15);setfillstyle(3,8); floodfill(245,175,15);floodfill(320,170,15);setfillstyle(1,5);floodfill(590,20,15);setfillstyle(1,8); floodfill(325,30,15);

setcolor(15); line(320,130,485,60); line(465,50,505,70);line(465,50,490,40);line(485,60,505,53);line(505,70,530,60);

IV GRAFIKA

110

Przykładowy projekt

Page 112: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(26,180,26,195); line(28,180,28,195);line(30,190,30,195);line(35,175,35,195);line(52,180,52,195);line(50,187,50,195);line(80,169,81,195);line(75,190,75,195);line(79,175,79,195);line(85,180,85,195);line(156,175,156,195);line(175,170,175,195);line(185,180,185,195);line(170,180,170,195);line(175,175,171,195);line(280,185,280,195);line(286,187,286,195);line(290,189,291,195);line(385,176,385,195);line(450,185,451,195);line(542,184,542,195);line(542,184,542,195);line(545,184,545,195);line(550,186,551,195);line(560,185,561,195);line(390,179,390,195);line(56,175,56,195);line(98,175,98,195);

IV GRAFIKA

111

Przykładowy projekt

Page 113: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(103,178,103,195);line(115,180,117,195);line(148,182,149,195);line(259,182,260,195);line(267,182,269,195);line(294,180,295,195);line(310,182,310,195);line(255,182,255,195);line(268,189,268,195);line(280,178,283,195);line(300,181,301,195);line(325,184,325,195);line(460,165,500,195); line(570,165,503,195);line(483,135,503,195);circle(483,130,17);setfillstyle(11,6);floodfill(483,130,15);circle(483,119,8);circle(458,130,8);circle(508,130,8);circle(467,123,8);circle(498,123,8);circle(467,137,8);circle(498,137,8);setfillstyle(1,4);

IV GRAFIKA

112

Przykładowy projekt

Page 114: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

floodfill(483,119,15);floodfill(458,130,15);floodfill(508,130,15);floodfill(467,123,15);floodfill(498,123,15);floodfill(467,137,15);floodfill(498,137,15);ellipse(560,60,0,360,13,8);

circle(560,50,6);setfillstyle(6,14);floodfill(560,60,15);setfillstyle(1,6);floodfill(560,50,15);

line(558,47,556,43); line(560,47,562,43);

line(537,55,537,65); line(583,55,583,65);line(537,55,547,59);line(537,65,547,61);line(583,55,573,59);line(583,65,573,61);ellipse(120,150,0,360,25,5); circle(150,150,6);setfillstyle(6,14);floodfill(120,150,15);setfillstyle(1,6);floodfill(150,150,15);

IV GRAFIKA

113

Przykładowy projekt

Page 115: O AUTORACH

SPIS TREŚCI > >><< ZAKOŃCZ<

line(105,138,120,145); line(120,145,135,138);line(105,138,135,138);line(107,162,130,162);line(107,162,120,155);line(130,162,120,155);line(156,150,166,148); line(156,150,166,152);circle(80,25,40); setfillstyle(1,14);floodfill(80,25,15);

IV GRAFIKA

114

Przykładowy projekt

Page 116: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

while(! kbhit());setvisualpage(0);delay(1200);setvisualpage(1);delay(1200);setvisualpage(2);delay(1200);setvisualpage(3);delay(1200);setvisualpage(0);delay(1200);setvisualpage(1);delay(1200);setvisualpage(2);delay(1200);setvisualpage(3);delay(1200);setvisualpage(0);delay(1200);setvisualpage(1);delay(1200);setvisualpage(2);delay(1200);setvisualpage(3);delay(1200);

getch();closegraph;return 0;}

IV GRAFIKA

115

Przykładowy projekt

Page 117: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Język programowania C++ opracował na początku lat 80 – tych Bjarne Stroustrup. Język ten powstał jako rozwinięcie języka programowania C, który rozszerzono w trzech ważnych kierunkach:● stworzono narzędzia pozwalające definiować i stosować abstrakcyjne typy danych; ● stworzono narzędzia projektowania i programowania obiektywnego;● wprowadzono wiele subtelnych ulepszeń do istniejących konstrukcji języka C.A przy tym zachowano prostotę zapisu i szybkość wykonywania programów właściwe językowi C.

Język C++ jest już szeroko dostępny i często służy do pisania rzeczywistych programów użytkowych i rozbudowywania systemów. Język C++ zajmuje wyróżnioną pozycję pomiędzy typowymi językami wysokiego poziomu, takimi jak Pascal, Basic lub Fortan, a językami zwanymi asemblerami.

Jest to język, który łączy cechy wysokiego poziomu z możliwościami asemblera. Język C++ łączy możliwości Pascala z narzędziami przydatnymi programiście do działań na wewnętrznych strukturach, np. w określonych obszarach pamięci. Poszczególne realizacje języka C++ trzymają się jednolitego standardu, co pozwala bez kłopotów przenosić programy pomiędzy różnymi komputerami. Większość oprogramowania systemowego tworzone jest w C++. Język C został zaprojektowany dla doświadczonych programistów. Poznanie pełnych możliwości tego języka wymaga jego bardzo dobrego poznania.

V ZARZĄDZANIE BAZAMI DANYCH

116

Page 118: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Stałe liczbowe można napisać w trzech systemach liczbowych: dziesiętnym, oktalnym i heksadecymalnym. Wszystkie takie liczby mogą być tylko liczbami całkowitymi.Rodzaje liczbLiczby dziesiętne pisze się normalnie, np. 0, 15, 50000.Liczby oktalne poprzedzone są zerem np. 041, 077.Liczby heksadecymalne są poprzedzone znakami Ox lub OX, np. OxCOOO, OXFF.

Pojedynczy znak przedstawia się w apostrofach np. ‘a’, istnieje inny sposób zapisu znaku po kresce pochyłej umieszcza się liczbę oktalną (w systemie ósemkowym będącą kodem znaku np. ‘\40’ reprezentuje znak spacji, ‘\0’ reprezentuje znak o kodzie 0).Kilka kodów kontrolnych systemu ASCII otrzymało dodatkowo specjalne zapisy:‘\n’ – czyli ‘\12’ oznacza kod nowej linii (dziesiętne 10);‘\r’ – czyli ‘\15’ oznacza powrót kursora do początku wiersza (dziesiętne 13);‘\b’ – czyli ‘\10’ oznacza cofnięcie o 1 znak (dziesiętne 13);‘\t’ – czyli ‘\11’ oznacza kod tabulacji (dziesiętne 9);‘\f’ – czyli ‘\14’ oznacza nową stronęCiągi znakówW tym, zapisie otrzymanie kreski ukośnej po ‘\\’, apostrofu po ‘\”, a cudzysłowu po ‘\””. Należy pamiętać, że zarówno ‘k’ jak ‘\016’ czy ‘\n’ są zawsze jednym znakiem. Ciągi znaków zamyka się cudzysłowami np. „alfa”. W ciągach znakowych można używać znaków specjalnych np. ‘’tekst \ n’’. Do każdego ciągu znakowego program dodaje na końcu znak ‘\0’, który ma sygnalizować jego koniec.

Nazwa zmiennej Czyli jej identyfikator, może składać się z liter, cyfr i znaku podkreślenia, przy czym nie może zaczynać się od cyfry. Małe i wielkie litery są różnymi znakami. Twórcy języka C++ nie określili jak może być najdłuższa nazwa zmiennej - pozostawili swobodę decyzji twórcą poszczególnych realizacji C++.Nazwa zmiennej nie powinna zaczynać się od: !, @, $, %, ^, &, *, (, ), _ , +, \.

W języku C++ pewna liczba słów została zastrzeżona – nie jest dozwolone użycie któregokolwiek z tych słów jako identyfikatora w programie. Do słów zastrzeżonych, nazywanych też słowami kluczowymi, należą np. wszystkie specyfikatory typu zdefiniowane pierwotnie.

117

Stałe - liczby, znaki i ciągi ...V ZARZĄDZANIE BAZAMI DANYCH

Stałe - liczby, znaki i ciągi znaków, nazwy, słowa kluczowe

Page 119: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Pełne zestawienie słów kluczowych języka C++Słowa kluczowe języka C++

Wymyślając nazwy, które mają zostać identyfikatorami, warto pamiętać o kilku ogólnie przyjętych zwyczajach, przede wszystkim po to, aby program był czytelny dla człowieka.

● identyfikator zapisuje się zazwyczaj małymi literami. Na przykład zwykło się pisać wartość zamiast Wartość albo WARTOŚĆ.● identyfikatorami powinny być słowa, które odpowiednio kojarzą się z przeznaczeniem utożsamianego obiektu, takie jak bufor lub zarobki.● identyfikatory składające się z kilku słów tworzy się albo oddzielając poszczególne słowa znakiem podkreślenia, albo zaczynając od wielkiej litery każde słowo, oprócz pierwszego. Na przykład nie powinno się pisać jestpuste, tylko jest_puste lub jestPuste.

118

asm

auto

break

case

catch

char

class

const

continue

default

delete

do

double

elsee

nume

xtern

float

for

friend

goto

if

inline

int

long

new

operator

private

protectet

public

register

return

short

signed

sizeof

static

struct

switch

template

this

throw

try

typedef

union

unsigned

virtual

void

volatile

while

Stałe - liczby, znaki i ciągi ...V ZARZĄDZANIE BAZAMI DANYCH

Page 120: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Zmienna jest obiektem, któremu można przypisywać wartości. Dana przypisana do zmiennej będzie przez nią reprezentowana w programie.

Typy danych

Typ Długość Zakres

unsigned char 8 bits 0 to 255char 8 bits -128 to 127enum 16 bits -32,768 to 32,767unsigned int 16 bits 0 to 65,535short int 16 bits -32,768 to 32,767int 16 bits -32,768 to 32,767unsigned long 32 bits 0 to 4,294,967,295long 32 bits -2,147,483,648 to 2,147,483,647float 32 bits 3.4 * (10**-38) to 3.4 * (10**+38)double 64 bits 1.7 * (10**-308) to 1.7 * (10**+308)long double 80 bits 3.4 * (10**-4932) to 1.1 * (10**+4932)

Deklarowanie zmiennychW zależności od typu danej, jaki zmienna będzie reprezentować, należy odpowiednio zadeklarować zmienną, np.:short x – deklaracja zmiennej x typu shortint y - deklaracja zmiennej y typu int Zadeklarowanie zmiennej wystarczy, aby można było jej przypisać wartość w czasie trwania programu, jeśli nie

zadeklarujemy danej a będziemy jej używać to zostanie zasygnalizowany błąd.

Przypisanie wartości zmiennymint a = 7;char b = ’a’;float c = 7.23;long d = 7;

W ten sposób przypisujemy wartości zmiennych.

119

Typy danych – typy zmiennychV ZARZĄDZANIE BAZAMI DANYCH

Page 121: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

Operator przypisania Poniższy przykład obrazuje różne typy przypisania. Przypisanie polega na nadaniu zmiennej wartości. Przykład/* przypisanie wartości zmiennym */ #include<stdio.h>#include <conio.h>main(){ clrscr(); char v;int x,y;unsigned z;y=7; z=0xc00; x=041;z+=2; /* z=z+2 */z– =–2; /* z=z-(-2) */x*=y; /* x=x*y */x/=2; /* x=x/2 */y<<=1; /* przesunięcie bitowe w lewo o1 */y>>=2; /* przesunięcie bitowe w prawo o 2 */v&=32; /* v=v and 32 */v^=32; /* v=v xor 32 */v|=32; /* v=v or 32 */x=y=z=041; /* x=041, y=041, z=041 (oktalnie) */x=y=z='!'; /* x=33, y=33, z=33 */getch();return 0;}

120

V ZARZĄDZANIE BAZAMI DANYCH

Page 122: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

Zmiennej można przypisać wartości o różnych systemach liczbowych np.y=7 zmienna y ma przypisaną wartość w systemie dziesiętnymz=0xc00 zmienna z ma przypisaną wartość w systemie heksadecymalnym x=041 zmienna x ma przypisaną wartość w systemie ósemkowymIstnieje możliwość przypisania wielu zmiennym takiej samej wartości np. x=x=x=041, dowodzi to zwartości języka.

Konwersja danych o różnych typachW języku C można zmiennej jednego typu przypisać wartość innego typu, ten proces nazywa się konwersją typu.

Przykład// współpraca danych o różnych typach #include<stdio.h>#include<conio.h>main(){

clrscr();char z;

int x;short bajt;z= 'A'; x=32; bajt=-1;printf(” %d”, z+x+bajt);getch();return 0;

}

121

V ZARZĄDZANIE BAZAMI DANYCH

Page 123: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

W powyższym programie zadeklarowano trzy różne zmienne a następnie je dodano. Każda zmienna musiała być przetłumaczona na format %d , który odpowiada za liczby całkowite. Zmienna z jest typu char zostanie, więc zamieniona na typ int czyli otrzyma kod ASCII litery A (65). Należy zdawać sobie sprawę z tego zjawiska i ostrożnie stosować zmienne różnych typów, konwersja zmiennej float na int powoduje obcięcie części ułamkowej. Przykład//Przypisanie zmiennej wartościmain(){

int x;int y;int z;unsigned adres;char literka;x=-15; //przypisanie zmiennej x wartości -15y=0234; //przypisanie zmiennej y wartości oktalnej 0234z=0xad; //przypisanie zmiennej wartości hexadecymalnej 0xADadres=0xFF; //przypisanie zmiennej adres wartości 0xFFliterka=’a’; //przypisanie zmiennej literka znaku a

}

122

V ZARZĄDZANIE BAZAMI DANYCH

Page 124: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład //Wyprowadzenie wartości ziemnych na ekran#include<stdio.h>#include<conio.h>main(){

clrscr();int m;short cr;unsigned int _beta;char spacja;m=-30000;cr=13;_beta=3300;spacja=' ';printf(„%d\n%d\n%u\n%c\n”,m,cr,_beta,spacja);getch();

}Program wyświetli na ekranie zmienne w takiej kolejności w jakiej zostały umieszczone jako argumenty w funkcji printf().

Funkcja printf() wymaga, aby ilość formantów i zmiennych była jednakowa, gdy pominiemy jakiś element może dojść do nieoczekiwanych efektów ubocznych.

123

V ZARZĄDZANIE BAZAMI DANYCH

Page 125: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

PrzykładPrzypisanie może być bardzo elastyczne, oto przykład.//konwersja typówmain(){

int b;int c;b=’u’;c=12000000;printf(„%d\n%d”,b,c);getch();

return 0;}

Zmiennej b przypisano znak ‘u’, mimo, że b jest typu int, kompilator przeliczy i b będzie miało wartość kodu znaku, ‘u’ czyli 117, c natomiast nie zmieści się w typie int (max=32767) i wyniesie 6912 (12000000 mod 65536 = 6912).W obu przypadkach kompilator dokonał ukrytych operacji dopasowania zmiennej do typu. Nieprzemyślane określenie typu danych może doprowadzić do powstania błędu, który trudno odnaleźć w programie.

124

V ZARZĄDZANIE BAZAMI DANYCH

Page 126: O AUTORACH

Typy danych – typy zmiennych

SPIS TREŚCI ><< ZAKOŃCZ<

Struktura programuProgram w języku C++ składa się z funkcji. Jedna z tych funkcji main() ma znaczenie szczególne. Kompilator wymaga,

aby funkcja ta była zdefiniowana w programie. Od niej, bowiem zaczyna się wykonanie programu.main() {

instrukcje;}

Poniższy przykład obrazuje strukturę programu. Na początku programu należy dołączyć biblioteki. Zawierają one funkcje, z których będzie korzystał program.Moduł iostream.h zawiera funkcję cin i cout, które są odpowiednie za czytanie i wyświetlanie danych, iomanip.h zawiera funkcję setw(k) odpowiedzialną za określenie szerokości wyświetlonego pola, conio.h natomiast zawiera funkcję getch(), która czeka na naciśnięcie klawisza, umożliwiając nam obejrzenie wyników działania programu.Przykład//program wczytuje dane, które później wyświetla na ekranie#include<iostream.h>#include<iomanip.h>#include<conio.h>main(){

int a,b,k; //deklaracja zmiennych całkowitychclrscr(); /*czyszczenie ekranu*/cout<<”Podaj dane a=”; //wyświetlenie napisu Podaj dane a=cin>>a; //wczytanie wartości acout<<”Podaj b=”<<endl; /*wyświetlenie napisu Podaj dane b= i przejściedo drugiej linii*/cin>>b; //wczytanie wartości bk=5; //przypisanie zmiennej k wartości 5cout<<”a=”<<setw(k)<<a<<” b=”<<setw(10)<<b<<endl;getch();return 0;

}

125

V ZARZĄDZANIE BAZAMI DANYCH

Page 127: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Wyprowadzenie danych na ekranFunkcja printf()

Instrukcją, która wyprowadza dane na ekran jest funkcja printf(). Pozwala ona na wyprowadzenie na ekran znaków i liczb w odpowiednich formatach. Parametry funkcji można podzielić na dwie grupy, pierwsza to format, według którego będą wyprowadzane dane umieszczone w drugiej grupie.Wzorce formatów wyprowadzają liczbę w postaci

%d – dziesiętnej%o – oktalnej%x – hexadecymalnej%u – adresowej%c – jeden znak%s – wyprowadza ciąg znaków

Format może być wzbogacony o dodatkowe dane np.%5d – liczba zostanie wyprowadzona w polu o szerokości pięciu pól i dosunięta do prawej strony, wolne miejsca zostaną wypełnione spacjami%05d – podobnie, lecz wolne miejsca będą wypełnione zerami%-05d – podobnie, lecz zostanie dosunięte do lewej strony%5.2s – dotyczy tylko ciągów znakowych, ciąg zostaje wyprowadzony na szerokości

5 pól, lecz znajdą się tam tylko dwa pierwsze znaki ciągu wyrównane do prawej strony, pozostałe znaki będą spacjami.

126

V ZARZĄDZANIE BAZAMI DANYCH Wyprowadzenie danych na ekran

Page 128: O AUTORACH

Wyprowadzenie danych na ekran

SPIS TREŚCI ><< ZAKOŃCZ<

PrzykładPoniższy program pozwala zaobserwować działanie poszczególnych formatów.#include<conio.h>#include<studio.h>main(){

clrscr();printf(“%d\n”,12000);printf(“%o\t(8)\n”,255);printf(“%6x\n”,65535);printf(“%u\n”,-1);printf(“%7c\n”,’H’);printf(“%-7c\n”,’H’);printf(“%-10s%s\n”,”wielka”,”gra”);printf(“%1.1s%1.1s%-2.1s…\n”,”ciąg”,”dalszy”,”nastąpi”);printf(“a\bb\n”);printf(“punkt\r1”);printf(“\41”);getch();

}

127

V ZARZĄDZANIE BAZAMI DANYCH

Page 129: O AUTORACH

Wyprowadzenie danych na ekran

SPIS TREŚCI ><< ZAKOŃCZ<

Funkcja cout Jest strumieniem wyjściowym, jest automatycznie otwierany z chwilą uruchomienia programu. Do wstawienia danych do strumienia wyjściowego wykorzystujemy operator << (podwójny znak mniejszości). Należy jeszcze zapamiętać, że wszystkie niezbędne prototypy są umieszczone w pliku nagłówkowym iostream.h (należy go dołączyć przy pomocy dyrektywy # include ).Przykład Poniższy program wczytuje i wyświetla dane# include <iostream. h># include <iomanip. h># include <conio. h>main(){int a, b, k;

clrscr();cout << “ podaj daną a= ”;cin >> a;cout << „ podaj daną b= ”<< endl;cin>> b;k=5;cout << ” a= ”<<setw(k)<<a<< “ b = ”<<setw(k)<< b<< endl;

getch();return 0;}

128

V ZARZĄDZANIE BAZAMI DANYCH

Page 130: O AUTORACH

Wczytywanie danych z klawiatury

SPIS TREŚCI ><< ZAKOŃCZ<

Wczytywanie danych z klawiatury Funkcja Scanf()Służy do wczytywania, pobierania danych z klawiatury i ma następującą postać: Scanf ( ” wzorzec ”, & zmienna );Do wcześniej zadeklarowanej zmiennej o nazwie „zmienna” zapisujemy wartość, którą użytkownik poda z klawiatury. Przed nazwą zmiennej występuje wzorzec konwersji. Określa on typy zmiennej, którą wczytujemy.

Aby wypisać wczytaną w ten sposób liczbę lub znak należy użyć funkcji printf (). Funkcja Cin W Języku C++ cin jest strumieniem wejściowym. Strumień ten jest automatycznie otwierany z chwilą uruchomienia programu. Wstawienie danych do strumienia wejściowego stosujemy operator >> ( podwójny znak większości ).Należy jeszcze zapamiętać, że wszystkie niezbędne prototypy są umieszczone w pliku nagłówkowym iostream.h (należy go dołączyć przy pomocy dyrektywy # include ).

129

Typ zmiennej Deklaracja Wzorzec Przykład

Liczba całkowita int A; %d scanf (” %d ”, & A );

Liczba rzeczywista float B; %f scanf (” %f ”, & float B );

Ciąg znaków char*C; %s scanf (” %s ”, & char*C );

Pojedynczy znak char D; %c scanf (” %c ”, & char D );

V ZARZĄDZANIE BAZAMI DANYCH

Page 131: O AUTORACH

Wczytywanie danych z klawiatury

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład #include<iostream.h>void main(void){

int a, b, c;cout<< “ Podaj wartość zmiennej a: ”;cin>>a;cout<< ” Podaj wartość zmiennej b: ”<<endl;cin>>b;cout<< ” a= ”<<a<<” b = ”<<b<<endl;

}Symbol endl oznacza koniec linii i powoduje przeniesienie kursora do linii następnej.

130

V ZARZĄDZANIE BAZAMI DANYCH

Page 132: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Operatory 2 – argumentoweJeśli zmienna otrzyma wartość, to można tą wartość modyfikować przy użyciu poniższych operatorów.

* -mnożenie+ - dodawanie - -odejmowanie operatory arytmetyczne/ -dzielenie% -reszta z dzielenia<< -przesunięcie bitów w lewo>> -przesunięcie bitów w prawo< -mniejsze > -większe operatory logiczne<= -mniejsze równe>= -większe równe= = -równe!= -różne^ -różnica symetryczna bitów│ -suma bitów&& -koniunkcja operatory bitowe║ -alternatywa?: -operator warunkowy

Zapis skrótowy operacji arytmetycznych = przypisanie wartości

*= a*=b (a=a*b)/= a/=b (a=a/b)%= a%=b (a=a%b)+= a+=b (a=a+b)-= a-=b (a=a-b)

131

V ZARZĄDZANIE BAZAMI DANYCH Operatory 2 - argumentowe

Page 133: O AUTORACH

Operatory 2 - argumentowe

SPIS TREŚCI ><< ZAKOŃCZ<

Zapis skrótowy operacji bitowych<<= a<<=b (a=a<<b)

>>= a>>=b (a=a>>b)&= a&=b (a=a&b)^= a^=b (a=a^b)│= a│=b (a=a│b)

Operatory 1 – argumentowe-a -operator zmiany znaku!a -negacja logiczna++a -preinkrementacjaa++ -postinkrementacja--a -predekrementacjaa-- -postdekrementacja

Inkrementacja to podwyższenie wartości o jednostkę.Dekrementacja to zmniejszenie wartości o jednostkę.Post oznacza, że wartość zmiennej będzie zmieniona po operacji.Pre oznacza, że wartość zmiennej będzie zmieniona przed operacją.

Język C jest bardzo zwięzły w swym zapisie co pozwala skrócić kod źródłowy, ale jednocześnie można zagmatwać działanie programu.Ważne jest to czy operator inkrementacji (dekrementacji) znajduje się przed czy po argumencie, efekt działania programu będzie różny. Oto przykład:a+=b++, a=a+b++ <=> a=a+b, b=b+1++a+=b, a=++a+b <=> a=a+1, a=a+b

Operator SizeofInnym operatorem jednoargumentowym jest Sizeof(int) podaje wielość zajętej pamięci przez typ danej umieszczonej w

nawiasach np.:Sizeof(int)=2,Sizeof(short)=2,Sizeof(float)=4.

132

V ZARZĄDZANIE BAZAMI DANYCH

Page 134: O AUTORACH

Operator warunkowy

SPIS TREŚCI ><< ZAKOŃCZ<

Operator warunkowy Operator warunkowy osiada trzy argumenty, ogólna postać wygląda następująco wartość = ((a>b) ? True : False)lubwarunek ? wartość wyrażenia, jeżeli warunek jest prawdziwy: wartość wyrażenia, jeżeli warunek jest fałszywyZmienna wartość może przyjąć jedną z dwóch wartości True albo False.Zależy to od warunku (a>b), jeśli jest prawdziwy to wartość = True, jeżeli jest fałszywy to wartość = False.

wartość = (3 > 1 ? 4 : 2 )wartość = 4

wartość = (3 < 1 ? 4 : 2 )wartość = 2

Przykład// operator warunkowy #include <iostream.h>#include <conio.h>main(){

char wartosc,k=32;wartosc=k == ' ' ? 'T': 'N';cout<<wartosc<<endl;getch();return 0;

}powyższy program sprawdzi czy k==’ ‘ jeśli tak to przypisze zmiennej wartość znak ‘T’ , jeśli nie to przypisze zmiennej wartość znak ‘N’ następnie wyświetli ją na ekranie.

133

V ZARZĄDZANIE BAZAMI DANYCH

Page 135: O AUTORACH

Kolejność wykonywania działań

SPIS TREŚCI ><< ZAKOŃCZ<

134

Operator Nazwa operatora Wiązanie

( ) Grupowanie wyrażeń Lewe

[ ] Indeksowanie Lewe

—> Odwołanie do pól Lewe

. Odwołanie do struktury Lewe

! Negacja logiczna Prawe

++ Podwyższenie o 1 Prawe

– – Zmniejszenie o 1 Prawe

– Minus Prawe

* Wydobycie Prawe

& Adresowanie Prawe

sizeof Rozmiar typu Prawe

* Mnożenie Lewe

/ Dzielenie Lewe

% Reszta z dzielenia Lewe

+ Dodawanie Lewe

– Odejmowanie Lewe

~ Negacja bitowa Lewe

<< Przesunięcie bitowe w lewo Lewe

>> Przesunięcie bitowe w prawo Lewe

Kolejność wykonywania działań V ZARZĄDZANIE BAZAMI DANYCH

Page 136: O AUTORACH

Kolejność wykonywania działań

SPIS TREŚCI ><< ZAKOŃCZ<

135

< Mniejsze Lewe

<= Niewiększe Lewe

> Większe Lewe

>= Niemniejsze Lewe

== Równość Lewe

!= Różność Lewe

& Iloczyn bitowy Lewe

^ Różnica symetryczna bitowa Lewe

| Suma bitowa Lewe

&& Iloczyn logiczny Lewe

|| Suma logiczna Lewe

?: Operator warunkowy Prawe

= Operator przypisania Prawe

*= a*=b równoważne a=a*b Lewe

/= a/=b równoważne a=a/b Lewe

%= a%=b równoważne a=a%b Lewe

+= a+=b równoważne a=a+b Lewe

– = a-=b równoważne a=a-b Lewe

<<= a<<=b równoważne a=a<<b Lewe

>>= a>>=b równoważne a=a>>b Lewe

&= a&=b równoważne a=a&b Lewe

V ZARZĄDZANIE BAZAMI DANYCH

Page 137: O AUTORACH

Kolejność wykonywania działań

SPIS TREŚCI ><< ZAKOŃCZ<

136

^= a^=b równoważne a=a^b Lewe

|= a|=b równoważne a=a|b Lewe

Wiązanie lewe oznacza, że operator najpierw potrzebuje wartości z lewej strony, analogicznie wiązanie prawe oznacza, że operator potrzebuje najpierw wartości z prawej strony.W wyrażeniu (5-3)*6 mnożenie poczeka na wartość z lewej strony i dopiero pomnoży wynik przez 6. Zbadajmy kilka przykładów dla różnych operatorów A= 5*2*3+ 4/2/6A= 2 +++ 3A= !4 + – – 2A= 4 + !2 +++ 3

V ZARZĄDZANIE BAZAMI DANYCH

Page 138: O AUTORACH

Instrukcje

SPIS TREŚCI ><< ZAKOŃCZ<

InstrukcjeInstrukcja if ... else

Instrukcja warunkowa pozwala na kierowanie działaniem programu w zależności od określonych warunków logicznych.Ogólna postać instrukcji

if (wyrażenie)instrukcja 1;

elseinstrukcja 2;

Prawda w języku C jest to wartość różna od zera, natomiast fałsz jest równy zero. Dla if ... else tylko jedna z instrukcji zostanie wykonana. Program sprawdzi wartość wyrażenia w nawiasach i jeśli będzie to prawda dy zostanie wykonana instrukcja 1, jeśli będzie to fałsz instrukcja 2.

Jest to bardzo przydatne w sytuacjach, w których musimy dokonać wyboru między różnymi drogami rozwiązywania problemu. Przykład//program obrazuje zasadę działania //instrukcji if ... else#include <iostream.h>main(){ int a;cin>>a; if(a>0)cout<< ” Podana liczba jest większa od zera”; //jeśli warunek jest prawdziwyelse

cout<< ” Podana liczba jest mniejsza od 0 ”; //jeśli warunek jest fałszywy}Powyższy program wczytuje wartość a i następnie sprawdza czy a jest większe od zera, jeśli tak to wykonuje instrukcję pod if, jeśli nie to wykonuje instrukcję pod else.

137

V ZARZĄDZANIE BAZAMI DANYCH

Page 139: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład//dzień tygodnia#include<iostream.h>#include<conio.h>main(){

int a;cout<< ’’Podaj nr dnia tygodnia 0 - niedziela ’’<<endl;cin>>a;if (a==0) cout<< ’’ To jest niedziela ’’<<endl;if (a==1) cout<< ’’ To jest poniedziałek ’’<<endl;.

. . if (a==b) cout<< ’’ To jest sobota ’’<<endl; getch();}

138

V ZARZĄDZANIE BAZAMI DANYCH Instrukcje

Page 140: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Częstym przykładem, w którym używa się instrukcji wyboru jest rozwiązywanie równania drugiego stopnia.Przykład //Rozwiązywanie równania kwadratowego#include <stdio.h>#include <conio.h>#include<iostream.h>#include<math.h>main(){

clrscr();floata,b,c,delta;floatx1,x2;cout<<’’Podaj parametry równania a,b,c’’<<endl;

cout<<’’a=’’;cin>>a;cout<<’’b=’’;cin>>b;cout<<’’c=’’;cin>>c;cout<<a<<'' '' <<b<<'' ''<<c<<endl;

delta=b*b-4*a*c;cout<<’’delta=’’<<delta<<endl;if(delta<0){

cout<<’’Błędne dane’’;getch();return 0;

}else

if(delta==0) //jedno rozwiązanie {

x1=-b/2/a;cout<<’’x1=’’<<x1<<endl;

}

139

V ZARZĄDZANIE BAZAMI DANYCH Instrukcje

Page 141: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

else{

x1=(-b-sqrt(delta))/(2*a);cout<<’’x1=’’<<x1<<endl; //dwa pierwiastki równania x2=(-b+sqrt(delta))/(2*a);cout<<’’x2=’’<<x2<<endl;

}getch();return 0;}

140

V ZARZĄDZANIE BAZAMI DANYCH Instrukcje

Page 142: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Instrukcja SWITCHJest to instrukcja wyboru, z kilku możliwości wybieramy tylko jedną i w zależności od tego przełączamy program do

określonej instrukcji, stąd też nazwa switch (przełącznik).#include<stdio.h>#include<conio.h>int main(void){clrscr(); short nr_m; cout<< ”podaj nr miesiąca ”; cin>>nr_m; switch(nr_m) {

case 1: cout<<”styczeń”);break;case 2: cout<<”luty”);break;case 3: cout<<”marzec”);break;case 4: cout<<”kwiecień”);break;case 5: cout<<”maj”);break;case 6: cout<<czerwiec”);break;case 7: cout<<”lipiec”);break;case 8: cout<<”sierpien”);break;case 9: cout<<”wrzesien”);break;case 10: cout<<”pazdziernik”);break;case 11: cout<<”listopad”);break;case 12: cout<<”grudzien”);break;default: cout<<”nie ma takiego miesiąca”);

}getch();return 0;}

141

V ZARZĄDZANIE BAZAMI DANYCH Instrukcje

Page 143: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Program wczyta wartość nr_m i w zależności od podanej wartości wyświetl nazwę miesiąca. Każda inna wartość spoza zakresu spowoduje pojawienie się napisu „nie ma takiego miesiąca”, jest za to odpowiedzialna opcja default.Instrukcja break powoduje zatrzymanie instrukcji switch, w miejscu wystąpi break gdyby to pominąć zostaną wyświetlone wszystkie miesiące poniżej wczytanego miesiąca.

Instrukcja BREAK – Jej działanie polega na przerwaniu wykonywania określonej instrukcji strukturalnej switch, for, while i do… while oraz przejściu do wykonywania następnej instrukcji po nich występującej.

Instrukcja CONTINUE – ma akurat odwrotny kierunek ucieczki w stosunku do break. Powoduje bowiem wyjście z pętli for, while lub do…while, ale do początku. Wznawia więc wykonywanie instrukcji powtarzania.

142

V ZARZĄDZANIE BAZAMI DANYCH Instrukcje

Page 144: O AUTORACH

Pętle

SPIS TREŚCI ><< ZAKOŃCZ<

Pętla polega na wykonywaniu tych samych czynności w kółko tak długo jak długo jest spełniony określony warunek. Trzy najczęściej wykorzystane pętle to: WHILE, DO...WHILE FORWHILEWHILE (wyrażenie){

instrukcje;}

Działanie pętli jest następujące, najpierw sprawdzana jest wartość wyrażenia w nawiasach i jeśli jest prawdą (różna od zera) to wykonywana jest instrukcja. Jeśli wyrażenie jest fałszywe wtedy kończy się działanie pętli. Ilość obrotów pętli nie jest z góry znana,zależy to od wartości wyrażenia. Może się zdarzyć, że pętla nie wykona się ani razu przy zerowej wartości w nawiasie.Przykład//program sumuje wczytane liczby//aż napotka zero, #include<iostream.h>#include<iomanip.h>#include<conio.h>main(){

int a,suma=0;while((cin>>a),a!=0) { cout<<”a=”<<a<<endl;

suma+=a; cout<<”suma=”<<suma<<endl; }return 0;}

143

V ZARZĄDZANIE BAZAMI DANYCH

Page 145: O AUTORACH

Pętle

SPIS TREŚCI ><< ZAKOŃCZ<

DO…WHILEJej działanie jest nieco inne od WHILE różnica polega na tym, że najpierw jest wykonywany ciąg instrukcji a potem sprawdzana wartość.Ta cecha powoduje, że pętla DO...WHILE wykona się przynajmniej raz.

DO{ instrukcje;}WHILE(wyrażenie);

PrzykładPoniższy program wypisuje na ekranie liczby od zera do dziewięciu.#include<stdio.h>#include<conio.h>#include<iostream.h>

main(){

clrscr(); int k=0; do cout<<k++<<endl; while(k<10);}

144

V ZARZĄDZANIE BAZAMI DANYCH

Page 146: O AUTORACH

Pętle

SPIS TREŚCI ><< ZAKOŃCZ<

FOR Jest inna od pozostałych, główną różnicą jest to , że ilość obrotów pętli jest ściśle określona przez warunek wewnątrz nawiasów.

FOR(i=0;i<10;i++){ instrukcje;}

Parametry w nawiasie oznaczają:i=0 początkowa wartość parametru ii<10 warunek który określa koniec pętli,i++ określa o ile ma się zmieniać parametr i, w tym wypadku jest to 1.

Instrukcja wewnątrz pętli wykona się dokładnie 10 razy.Przykład Poniższy przykład obrazuje zastosowanie pętli FOR. Na ekranie zostanie wyświetlony ciągLiczb od 1 do 10. Jest to najczęściej używana pętla nie tylko w języku C++.#include<stdio.h>#include<conio.h>#include<iostream.h>main(){

clrscr(); short i;

for(i=1;i<11;i++) cout<<i<<endl;getch();return 0;}

145

V ZARZĄDZANIE BAZAMI DANYCH

Page 147: O AUTORACH

Pętle

SPIS TREŚCI ><< ZAKOŃCZ<

PrzykładInny przykład z zastosowaniem pętli to wyświetlanie znaków o określonych kodachASCII, w ten sposób można odczytać zawartość komórek pamięci komputera. Znaki alfanumeryczne posiadają kody od wartości 32 do 128. Pierwszym znakiem jest ! ostatnim zamalowany kwadrat.# include <conio.h>main(){

clrscr();short i;for(i=32;i<128;i++) printf(“%c”,i);

getch();}

Należy dbać oto, aby parametry w nawiasach były wyraźnie określone, brak warunku końca pętli spowoduje powstanie pętli nieskończonej tzn. takiej, która nigdy się nie skończy.

146

V ZARZĄDZANIE BAZAMI DANYCH

Page 148: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

FunkcjeFunkcje są to odrębne kawałki, z których można poskładać cały program, mają tą zaletę, że definiuje się je tylko raz a

można wiele razy wywołać, zmniejsza to kod źródłowy Programu. Program staje się łatwiejszy w sprawdzaniu. Raz napisaną funkcję można wykorzystać w innych programach.

Definicja funkcji musi zawierać:typ danej zwracanej przez funkcjęnazwę funkcjiw nawiasach typ i nazwę danych pobieranych przez funkcjęciało funkcji

Przykładfloat fun(char k, int b, float z){ z+=k-sqrt(b)/k;

return (z*z);}Powyższa funkcja nazywa się fun, będzie zwracać wartość typu rzeczywistego równa z*zi pobierać trzy zmienne:zmienną k, która jest typu znakowego,zmienną b typu całkowitego,zmienną z typu rzeczywistegoInstrukcja return kończy działanie funkcji, jeśli podamy wyrażenie po return to zostanie ono udostępnione w postaci wartości tej funkcji. Jeśli w ciele funkcji nie ma instrukcji return, to wartość tej funkcji jest pomijana. Jeśli nie ma oznaczenia typu danej, jaką funkcja zwraca to przyjmuje się typ (int). Podobna sytuacja zachodzi, jeśli nie podane są typy parametrów.

147

V ZARZĄDZANIE BAZAMI DANYCH Funkcje

Page 149: O AUTORACH

Funkcje

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład int dod(int a, int b);main (){

cout<<”suma dwóch liczb wynosi” <<dod(3,4);getch();}

int dod(int a, int b){

return (a+b);}Powyższy program obrazuje sposób definiowania i wywołania funkcji. Na początku programu wypisujemy listę funkcji,

następnie umieszczamy program główny a po nim definicje funkcji. Wywołanie następuje poprzez podanie nazwy funkcji i parametrów aktualnych w nawiasach np. dod(3,4) pod nazwę funkcji podstawi się wartość umieszczona w nawiasach po return.

PrzykładPoniższy program przedstawia funkcję abs();#include<stdio.h>#include<conio.h>#include<iostream.hint abs(int a);main(){

cout << abs (-3)<<endl;cout<< abs (3)<<endl;

getch();return 0;}int abs (int a){return (a>0 ? a: -a );}

148

V ZARZĄDZANIE BAZAMI DANYCH

Page 150: O AUTORACH

Funkcje

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład Poniższy program przedstawia funkcję signum();#include<stdio.h>#include<conio.h>#include<iostream.hint signum (int a);main(){

cout << signum (-3)<<endl;cout<< signum (3)<<endl;cout<< signum (0)<<endl;

getch();return 0;}int signum (int a){return ? (a<0 ? -1: 1 ): 0;}

149

V ZARZĄDZANIE BAZAMI DANYCH

Page 151: O AUTORACH

Rekurencja

SPIS TREŚCI ><< ZAKOŃCZ<

RekurencjaPolega na wywołaniu danej funkcji w jej treści. Rekurencja może być bezpośrednia i pośrednia. Rekurencja bezpośrednia

zachodzi wtedy, gdy w tekście funkcji występuje wywołanie jej samej. Natomiast z rekurencją pośrednią mamy do czynienia wtedy, gdy tekst funkcji zawiera wywołanie funkcji, w wyniku działania której następuje wywołanie danej funkcji.Przykład# include <iostream.h># include <iomanip.h>void main(void){int i, nowa, max, pom[10];// i – zmienna kontrolna// nowa – aktualna liczba// pom – tablica pomocnicza zawierająca liczby w odwrotnej kolejności// odczytanie wartości liczby cout << ” podaj wartość liczby ” <<endl;cin>>nowa;i=0;do

pom[i++]=nowa%10; // następna cyfrawhile ((nowa /=10)>0); // nowa liczba// wypisanie cyfr liczbywhile (--i>=0)

cout<<setw(4)<<pom[i];}

150

V ZARZĄDZANIE BAZAMI DANYCH

Page 152: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Zmienne globalne i lokalne Zmienne globalne są widoczne w całym programie, ich wartość można odczytać w każdym zakątku programu jest to

bardzo pomocne, gdy korzystamy np. ze stałych. Dodatkową cechą tych zmiennych jest to, że są zerowane przy deklaracji.

Zmienne lokalne są widoczne tylko w obszarze funkcji, w której zostały zadeklarowane, poza tą funkcją nie istnieją. W momencie deklaracji otrzymują przypadkowe wartości.

Przykładint k; //zmienna k jest typu globalnego main(){

int b; //zmienna b jest typu lokalnegocout<<a<<” ”<<b;

}Zjawiskiem, które może wystąpić między oboma typami zmiennych to zjawisko przysłaniania. Jeśli nadamy zmiennej

lokalnej i globalnej tą samą nazwę to zmienna lokalna może zasłonić zmienną globalną i będzie dostępna jedynie zmienna lokalna.

151

V ZARZĄDZANIE BAZAMI DANYCH Zmienne globalne i lokalne

Page 153: O AUTORACH

Zmienne globalne i lokalne

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład

#include<iostream.h>f();char ch= 'h';main(){

cout<<ch;f();cout<<ch;f();

}f()

{char ch;ch= 'a';cout <<ch;

} Zostały zdeklarowane dwie zmienne o tej samej nazwie, program w funkcji main () widzi znak 'h' a w funkcji f() znak a. Po uruchomieniu pojawi się napis ...

152

V ZARZĄDZANIE BAZAMI DANYCH

Page 154: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

TabliceTablica jest to ciągły obszar pamięci, w którym możemy przechowywać dane tego samego typu.

Deklaracja tablicy składa się z nazwy typu danych, jakie będzie przechowywać, nazwy oraz wymiaru tablicy w nawiasach kwadratowych.int tablicaFloat dane[3]=Char napis[3]={‘a’,’1’,’a’}Char napis[4]=”ala”

Powyższe definicje deklarują tablice i jednocześnie przypisują im wartości początkowe. Zadeklarowano dwie tablice o nazwie napis, jedna zajmuje 3 pola, druga 4, obie zawierają to samo. Różnica jednego pola wynika z zapisu łańcucha znaków, który dopisuje do łańcucha znak końca ‘\0’, co zwiększa zarezerwowany obszar o jedno pole.

153

V ZARZĄDZANIE BAZAMI DANYCH

Page 155: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład\\ zmiana elementów tablicy#include<conio.h>#include<stdio.h>#include<iostream.h>int tab[3]={1,2,3};int main(void){clrscr(); cout<<tab[0]<<endl; // wypisanie wartościcout<<tab[1]<<endl; // tablicy na ekraniecout<<tab[2]<<endl;tab[0]=-1; // zmiana danychtab[1]+=20; // elementów tablicytab[2]>>=1;cout<<tab[0]<<endl; // wyświetlenie nowychcout<<tab[1]<<endl; // wartości tablicycout<<tab<<[2]<<endl;cout<<tab[3]<<” element poza zakresem;getch();return 0;}

Indeksy tablic zaczynają się od 0, dla tablicy int tab[3] ostatnim elementem jest tab[2].W języku C kompilator nie sprawdza poprawności indeksów, zapis tab[3] jest niepoprawny gdyż nie ma takiego elementu tablicy. Użytkownik musi zwrócić szczególną uwagę na poprawność stosowanych indeksów, gdyż nie zostanie zasygnalizowany błąd a efekty działania programu będą inne od oczekiwanych. Tego typu błąd jest bardzo trudny do odnalezienia.

154

V ZARZĄDZANIE BAZAMI DANYCH

Page 156: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład\\ użycie pętli do wypisania elementów tablicy#include<conio.h>#include<stdio.h>#include<iostream.h>char tab[3]={‘a’,’b’,’c’};main(){

short i;clrscr();for(i=0;i<3;i++)

cout<<tab[i];getch();}

155

V ZARZĄDZANIE BAZAMI DANYCH

Page 157: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład\\ przemienność indeksowania tablic#include<conio.h>#include<stdio.h>#include<iostream.h>char tab[4]={„abc”};main(){

short i;clrscr();printf(„%s”,tab); /* wydruk tablicy jako ciągu znakowego */printf(„%c”,1[tab]); /* wydruk pojedynczego elementu tablicy */printf(„%c”,0[tab]); /* indeksowanie tablicy jest przemienne */

getch();}

Ten przykład obrazuje przypisanie do tablicy łańcucha znakowego, co się wiąże ze zwiększeniem wymiaru o jeden ze względu na znak końca łańcucha. Taką tablicę możnaw całości wyprowadzić przy użyciu formatu %s. Nazwa tablicy reprezentuje adres w pamięci, pod tym samym adresem znajduje się pierwszy element tablicy. Dostęp do dowolnego elementu tablicy możemy uzyskać przez indeksowanie. Zapis tab[1] można przedstawić jak 1[tab], jest to przemienność indeksowania podobnie jak przy mnożeniu czy dodawaniu.

156

V ZARZĄDZANIE BAZAMI DANYCH

Page 158: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład\\ tablica globalna i wielowymiarowa#include<conio.h>#include<iostream.h>int tab[4][5]={{1,2,3,4,5},{1,2},{0}};char znaki[]={„wyraz”};char zdanie[][8]={„zdanie1”,”zdanie2”};main(){

clrscr();cout<<”tab[1][2]=”<<<<[1][2]<<endl;cout<<”znaki[2]=”<<znaki[2]<<endl;cout<<zdanie[0]<<zdanie[1];getch();

}

Tablica tab jest tablicą globalną i ma wymiary 4*5. Wiersz pierwszy posiada dane {1,2,3,4,5}, drugi ma podane jedynie dwa elementy {1,2} reszta zostanie wypełniona zerami podobnie jak wiersz trzeci i czwarty.

Deklaracja char znaki[ ]={„wyraz”} nie określa w sposób jawny wymiaru tablicy, jest to dozwolone gdyż komputer sam obliczy wymiar, podobnie jest w deklaracji char zdanie[][8]={„zdanie1”,”zdanie2”} ta deklaracja również jest prawidłowa, należy jednak pamiętać o tym, że tylko pierwszy wymiar może być nieokreślony pozostałe muszą być jawnie.

157

V ZARZĄDZANIE BAZAMI DANYCH

Page 159: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Operacje na tablicachAby dokonywać jakichkolwiek operacji na tablicach należy najpierw zapisać dane do tablicy, jeżeli jest to tablica

wielowymiarowa to należy zastosować tyle pętli ile jest wymiarów tablicy.Przykład// zapis i odczyt danych z tablicy# include<conio.h># include<iostream.h># include<iomanip.h>main(){

int i,j;int m[2][2];

//zapis danych do tablicyfor(i=0;i<2,i++)for(j=0;j<2;j++){

cout<<”podaj element o współrzędnych „<<i<<” „<<j<<” „;cin>>m[i][j];

}//wyświetlenie danych z tablicy

for(i=0;i<2;i++) { for(j=0;j<2;j++)

cout<<setw(3)<<m[i][j];cout<<endl;

}cout<<endl;

}

158

V ZARZĄDZANIE BAZAMI DANYCH

Page 160: O AUTORACH

Tablice

SPIS TREŚCI ><< ZAKOŃCZ<

Operacjami, które można dokonywać na tablicach jest wiele, przykładem może być mnożenie tablicy przez stałą.Przykład //mnożenie tablicy przez stałą#include<conio.h>#include<iostream.h>#include<iomanip.h>main(){

int stala,i,j;int m[2][2];

//zapis danych do tablicyfor(i=0;i<2;i++)for(j=0;j<2;j++)

{cout<<” podaj element o współrzędnych ”<<i<<” i ”<<j<<” j ” ;

}//wyświetlanie danych z tablicy

for(i=0;i<2;j++) { for(j=0;j<2;j++) cout<<m[i][j]*stala; cout<<endl; } cout<<endl;

}

159

V ZARZĄDZANIE BAZAMI DANYCH

Page 161: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

Wskaźniki

Oprócz zmiennych przechowujących dane typu całkowitego, znakowego, rzeczywistego, istnieją jeszcze zmienne proste, którym można przypisać wskazywanie danych. Nazywają się zmiennymi wskazującymi lub wskaźnikami. Zmienna taka przechowuje wartości, które są adresami w pamięci, pod którymi można znaleźć daną. Wskaźnik jest adresem stąd zawsze powinien zajmować tyle samo miejsca (2 bajty) niezależnie od tego jaka dana wskazuje. Operator adresuOperator adresu jest jednoargumentowy i może być użyty do otrzymania adresu zmiennej w pamięci i jest to ”&”. Może on być użyty do otrzymania adresu zmiennej w pamięci. Np.:main () /* start */{int z; /* deklaracja zmiennej */z=33;printf (” %x ”, & z); /* wydruk adresu zmiennej w pamięci */}Operator wydobyciaJest jednoargumentowy i czyni dokładnie odwrotnie niż operator adresu tzn. mając adres powoduje odczyt zawartości, która znajduje się pod tym adresem. Oznaczamy go „*”. Jego argumentem może być tylko adres.Działania na wskaźnikach

Wskaźniki są adresami, więc wydaje się możliwe podwyższać je i obniżać powodując zmiany wskazań. Przykład main (){char *nazwisko;nazwisko=” KOWALSKI”;}Zmienna nazwisko jest adresem pierwszego znaku w ciągu „ KOWALSKI \ 0 ”. Jeśli ten znak ma być udostępniony, to używa się operatora wydobycia. Dlatego *nazwisko reprezentuje znak ‘K’. Jeśli podwyższymy wskaźnik przez np. nazwisko+ = 1, to zmienna nazwisko wskazuje znak ‘O’ , a wyrażenie *nazwisko jest tymże znakiem.

160

V ZARZĄDZANIE BAZAMI DANYCH

Page 162: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

Tablica a wskaźnikW języku C++ operacje na tablicach można wykonywać przy pomocy wskaźników. Wynika to stąd, że sama nazwa tablicy podaje adres pierwszego elementu tablicy. Na przykład, dla tablicy zadeklarowanej następującoint tab[10]dostęp do pierwszego elementu tablicy ( o indeksie 0 ) zapewnia użycie zarówno tab[0] jak i tab. Wskaźnikami wtab zadeklarowanemu w postaci int wtab;można przypisać adres pierwszego elementu na dwa sposoby:wtab = &tab[0]; // przypisanie adresu pierwszego elementu tablicywtab = tab; // przypisanie adresu pierwszego elementu tablicyŁańcuchy znakowe i wskaźnikW języku C++ teksty przechowuje się w tablicach typu char. Jest to typ umożliwiający zapamiętanie jednego znaku, a w tablicy możemy zapamiętać dowolnie długi tekst w postaci łańcucha znaków. Zwróćmy uwagę, że inicjując tablicę łańcuchem znaków, używamy znaku cudzysłowu (” ”), a przy zapisywaniu pojedynczego znaku wykorzystujemy znak apostrofu (‘ ’). W znakach cudzysłowu występuje stała tekstowa, a w apostrofach stała znakowa (dla stałych tekstowych kompilator automatycznie dodaje znak kończący ‘\0’).

161

V ZARZĄDZANIE BAZAMI DANYCH

Page 163: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład // program pobiera dowolny ciąg znaków do tablicy// i zamieniago według określonego klucza n#include <conio.h>#include <stdio.h>main(){

clrscr();char g; //znak zakodowany przez liczbę nchar tab [ ]=”dowolny ciąg znaków ”;int i, n;i=0;n=1000; //liczba kodowaprintf(” znak\tdzie\tkod\tdzie\n ”);while(tab [ i ]){

g=(tab [i ]+n) %127;printf(”%c\t%d\t%c\t%d\n“, tab [ i ], tab [ i ] ,g , g);i++;

}getch();return 0}

162

V ZARZĄDZANIE BAZAMI DANYCH

Page 164: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

Funkcje znakoweDołączenie pliku nagłówkowego string.h przy pomocy dyrektywy procesora

#include <string.h>daje możliwość korzystania z wielu funkcji wykonujących operacje na tekstach..

funkcja strlen() - liczy długość tekstu

Przykład

#include <stdio.h>#include <string.h>int main(void){ char *string = "Borland International"; printf("%d\n", strlen(string)); return 0;}

163

V ZARZĄDZANIE BAZAMI DANYCH

Page 165: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

funkcja strcmp() - porównuje dwa teksty

Przykład

#include <string.h>#include <stdio.h>int main(void) { char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc"; int ptr; ptr = strcmp(buf2, buf1); if (ptr > 0) printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n"); ptr = strcmp(buf2, buf3); if (ptr > 0) printf("buffer 2 is greater than buffer 3\n"); else printf("buffer 2 is less than buffer 3\n"); return 0; }

164

V ZARZĄDZANIE BAZAMI DANYCH

Page 166: O AUTORACH

Wskaźniki

SPIS TREŚCI ><< ZAKOŃCZ<

funkcja strcpy() – dokonuje kopiowania tekstów

Przykład

#include <stdio.h> #include <string.h>int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0; }

165

V ZARZĄDZANIE BAZAMI DANYCH

Page 167: O AUTORACH

Struktura

SPIS TREŚCI ><< ZAKOŃCZ<

StrukturaW języku C++ można tworzyć bardziej złożone struktury danych, do których zaliczamy struktury oraz unie. W strukturach

mogą być przechowywane elementy różnego typu, które nazywamy polami. Strukturę tworzymy, podając ze słowem kluczowym struct nazwę struktury, a następnie w nawiasach klamrowych deklaracje pól. Oto przykład definicji struktury.struct data {

int dzień, miesiąc, rok;char miejsce[20];

};W powyższej deklaracji struktury są cztery pola o nazwach: dzień, miesiąc, rok oraz miejsce.Trzy pierwsze pola są typu int, a ostatnie to tablica znaków.

Deklaracja struktury data wprowadza nowy typ danych. Zmienne tego typu deklarujemy analogicznie jak inne zmienne.PrzykładPoniższy program obrazuje zastosowanie struktury, której wartość jest przypisywana w momencie deklaracjistruct /* deklaracja struktury z przypisaniem wartości jej polom składowym*/{char ulica [8];int nr_domu; /* zajętość równa 10 bajtów*/}f={‘s’, ’z’, ’e’, ’r’, ’o’, ’k’, ’a’,’\ 0,4};main(){printf (” %d ”, f. nr. domu);printf (” %c ”, f. ulica [2] );}

166

V ZARZĄDZANIE BAZAMI DANYCH

Page 168: O AUTORACH

Unia

SPIS TREŚCI ><< ZAKOŃCZ<

UniaPodobnie jak struktura, unia definiuje typ strukturalny zawierający kilka pól, z tą różnicą, że można przypisywać wartość

tylko jednej składowej unii. Pozostałe pola nie są określone.A oto przykład definicji unii o nazwie unia1 zawierającej dwa pola.union unia1 {

int a;char b;

};Zmienną un1 typu unia1 deklarujemy w zwykły sposóbunia1 un1;Jeżeli przypiszemy pierwszemu polu pewną wartość np.:un1.a=123;to drugie pole nie jest określone, a gdy przypiszemy drugiemu polu pewna wartość np.:un1.b=’x’;to pierwsze pole nie jest określone.

167

V ZARZĄDZANIE BAZAMI DANYCH

Page 169: O AUTORACH

Unia

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład

Do wypełnienia jest ankieta składająca się z czterech rubryk: nazwisko, imię, płeć i właśnie: jeśli ankietowany jest kobietą, to wpisuje nazwisko panieńskie, jeśli zaś mężczyzną, to wpisuje stosunek do służby wojskowej. Nie ma potrzeby przygotowywać pamięci na to, co wpisze kobieta lub mężczyzna, gdyż z powodzeniem jedno pole wystarczy ( kobieta nie służy w wojsku, a mężczyzna nie ma nazwiska panieńskiego).

struct ankieta /* etykieta struktury */{

char *nazwisko; /* 2 bajty */char *imię; /* 2 bajty */short płeć; /* 1 bajt: 1- kobita, 0- mężczyzna */union /* brak etykiety unii */{

char *naz_pan; /* 2 bajty */short wojsko; /* 1 bajt: 0- przedpob. , 1- rez. */

}dane;

}osoba;

168

V ZARZĄDZANIE BAZAMI DANYCH

Page 170: O AUTORACH

Wskaźniki do struktur

SPIS TREŚCI ><< ZAKOŃCZ<

Wskaźniki do struktur Definiowanie stałych - # define Ten rozkaz umożliwia dokonanie tylko zwykłego podstawienia tekstowego. Rozkazy # define podaje się zwykle na zewnątrz definicji funkcji i na początku programu. Definicja

# define void intpowoduje powstanie nowego słowa void, które można stosować w programie. Wszędzie tam, gdzie ona wystąpi kompilator wstawi na jego miejsce słowo int. Definicja taka będzie obowiązywała w całym programie. Przykład Program sprawdza czy podany znak jest spacją i wtedy zwraca 1, a w przeciwnym wypadku zwraca 0. # define TRUE 1# define FALSE 0spacja (ch)

char ch;{

if (ch= ‘ ’)return TRUE;

elsereturn FALSE;

}

169

V ZARZĄDZANIE BAZAMI DANYCH

Page 171: O AUTORACH

Dołączenie pliku # include

SPIS TREŚCI ><< ZAKOŃCZ<

Dołączenie pliku # include

Przed uruchomieniem kompilatora zawsze jest wywoływany preprocesor, który przetwarza wiersze programu rozpoczynające się znakiem #. Taki wiersz nazywamy dyrektywą preprocesora.Podstawową dyrektywą preprocesora jest # include, umożliwiająca włączenie do programu pliku o podanej nazwie. Ma ona dwie postacie:# include <nazwa>lub # include ” nazwa ”Jeżeli nazwa pliku (nazwa ) jest umieszczona w nawiasach kątowych, to oznacza, że jest to plik nagłówkowy dostępny w systemie C++. Natomiast jeżeli nazwa pliku jest podana w cudzysłowie, to jest to plik zdefiniowany przez użytkownika.

Na zakończenie podkreślmy, że dyrektywy preprocesora nie kończą się średnikiem tak jak instrukcje w języku C++ ( końcem dyrektywy jest koniec wiersza ).

170

V ZARZĄDZANIE BAZAMI DANYCH

Page 172: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Praca z plikami (zapis, odczyt)

Plik pełni w C++ właściwie jedną rolę: określa zasięg pliku tzn. zasięg dla globalnych funkcji oraz globalnych zmiennych. Plik jest także tradycyjnie jednostką pamięci i jednostką kompilacji. Skoro plik jest jednostką kompilacji, to po wprowadzeniu do niego jakiejkolwiek zmiany, trzeba cały plik ponownie kompilować. Aby w języku C++ wykonać pewne operacje na plikach należy utworzyć obiekt odpowiedniej klasy. I tak, aby czytać zawartość pliku niezbędny jest obiekt klasy ifstream, do pisania musimy dysponować obiektem klasy ofstream, a do wykonania operacji zapisu lub odczytu musimy utworzyć obiekt klasy fstream. Wymienione klasy będą dostępne dopiero po dodaniu do programu dyrektywy:#include <fstream.h>

171

V ZARZĄDZANIE BAZAMI DANYCH

Page 173: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład

Zapis danych do pliku #include<fstream.h>#include<string.h>void main (void){char nazwa [ 100 ], x[ 100 ], y[ 100 ];int a;

cout<<” Podaj nazwa pliku ”<<endl;cin>>nazwa;

// utworzenie obiektu klasy ofstream ofstream plik_dane (nazwa);if ( ! plik_dane ){

cout<< ” Pliku nie można otworzyć ” <<endl;return;

}strcpy ( x, ”abc”);strcpy ( y, ”xyz”);a = 100;

// zapis danych do pliku plik_dane << x << ” ”<< a << ” ” << y << endl;// zamknięcie plikuplik_dane. close();

}

172

V ZARZĄDZANIE BAZAMI DANYCH

Page 174: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład Program pozwala na zapis i odczyt danych z pliku#include<conio.h>#include<stdio.h>#include<ctype.h>char * znaki=”16jk+-“;main(){

clrscr();FILE *str;int k;str=fopen (“ala.txt” , “w+”); // otwieranie pliku ala.txt do zapisu

if (str!=0)while (* znaki)

putc ( *znaki++, str); //umieszczanie znaków w plikuala.txt

fclose (str); // zamknięcie pliku ala.txtstr=fopen (”ala.txt“, “r“); //otwarcie pliku ala.txt do czytaniawhile ((k=getc (str))!=EOF) //sprawdzenie czy to koniec pliku

{putc(k,str); // wypisywanie znak po znaku na ekranif (!isdigit(k)) // jeśli nie cyfra to zatrzymaj

break;}

ungetc(k , str); // umieść ponowniew buforzeprintf (” \n”);while ((k=getc(str))!=EOF) // jeśli nie koniec pliku

putc(k,stdout); // to wyświetlaj na ekraniefclose (str); // zamknij plikgetch ();

return 0;}

173

V ZARZĄDZANIE BAZAMI DANYCH

Page 175: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Pliki . Txt

Przykład 1

#include<conio.h>#include<stdio.h>maln(){

clrscr();FILE *strumien;strumien=fopen (”u.txt“ , “ r “);if(strumien==0)

printf (“plik nie istnieje !\n”);else

printf (”plik istnieje”);fclose(strumien);getch();return 0;

}

174

V ZARZĄDZANIE BAZAMI DANYCH

Page 176: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 2

#include<conio.h>#include<stdio.h>char znak [ ]=”ala ma kota i konia”;main(){short i;

clrscr();FILE *strumien;strumien=fopen (”znaki.txt” , ”a”); //otwarcie pliku do zapisufor (i=0; i<19; i ++)

putc (znak [i ] ,stdout); //wyprowadzenie na ekranfor (i=0; i<19; i++)

putc (znak [i ],strumien); //wyprowadzenie do plikufclose(strumien); //zamkniecie plikugetch();return 0;

}

175

V ZARZĄDZANIE BAZAMI DANYCH

Page 177: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 3

#include<conio.h>#include<stdio.h>main(){short i;int INT;

clrscr();FILE *strumien;strumien=fopen (“znaki . txt”, ” r ”);if (strumien==0)

printf (“ Plik znaki . txt nie istnieje\n”);while ((INT=getc(strumien))!=EOF)putc(INT,stdout);fclose(strumien);getch();return 0;

}

176

V ZARZĄDZANIE BAZAMI DANYCH

Page 178: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 4

#include<conio.h>#include<stdio.h>#include<ctype.h>char *znaki=”16jk+-”;main(){

clrscr();FILE *str;int k;str=fopen(“ ala.txt “,“ w+ “); //otwieranie pliku ala . txt do zapisuif (str!=0)

while(*znaki)putc(*znaki++,str); //umieszczanie znaków w pliku ala . txt

fclose (str); //zamknięcie pliku ala . txtstr=fopen(” ala .txt ”,” r ”): //otwarcie pliku ala . txt do czytaniawhile ((k=getc(str))!=EOF) //sprawdzenie czy to koniec pliku

{putc(k,stdout); //wypisywanie znak po znaku na ekranif (!isdigit(k) //jeśli nie cyfra to zayrzymaj

break;}

ungetc(k,str); //umieść spowrotem w buforzeprintf (” \n ”);while ((k=getc(str))!=EOF) //jeśli nie koniec plikuputc (k,stdout); //to wyświetlaj na ekraniefclose (str); //zamknij plikgetch();return ;

}

177

V ZARZĄDZANIE BAZAMI DANYCH

Page 179: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 5

#include<conio.h>#include<stdio.h>#include<iostream.h>char z=’z’;char a,z1;main(){

clrscr();FILE *strumienstrumien=fopen(“znaki . txt”,” a ”);fprintf (strumien, %c %d \n”,z,15);fclose(strumien);strumien=fopen (”znaki . txt”,” a ”);a=getc(strumien);z1=getc(strumien);

cout<<z1<<” ”<<a;getch();

return 0;}

178

V ZARZĄDZANIE BAZAMI DANYCH

Page 180: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 6

#include<stdio.h>int main(void){

FILE *stream;int i=100;

char c=’C’;float f=1.234;

/* open a file for update */stream=fopen (“DUMMY.FIL”,” w+”);/* write some data to the file */fprintf (stream, “%d %c%f”, i, c, f);/* close the file */fclose(stream);return 0;}

179

V ZARZĄDZANIE BAZAMI DANYCH

Page 181: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 7

#include<conio.h>#include<stdio.h>char z=’a’;int 1;main(){

clrscr();FILE *strumien;strumien=fopen (”znaki . txt”,” w ”);fprintf (strumien,%c %d \n”,z,15);fclose (strumien);

strumien=fopen (”znaki . txt”,” r ”);fscanf (strumien,”%c %d \n”, &z,&1);printf (’%c %d”,z,1);fclose (strumien);getch();return 0;}

Przykład 8

#include<conio.h>#include<stdio.h>main(){

clrscr();printf (“liczba dziesiętna %d \ n oktalna %o \ n heksadecymalna %h \ n”,41,41,41);getch();return 0;

}

180

V ZARZĄDZANIE BAZAMI DANYCH

Page 182: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 9

#include <iostream.h>#include <iomanip.h>#include <fstream.h>#include <string.h>#include <conio.h>main(){

int i,j,k;

clrscr();ifstream plik(”liczby.txt”);if(!plik){

cout<<”Pliku nie można otworzyć”<<endl;return 0;

}

plik>>i>>j>>k;cout<<i<<” ”<<j<<” ”<<k<<endl;cout<<”średnia wynosi”<<(i+j+k)/3;plik.close()getch();

return 0;}

181

V ZARZĄDZANIE BAZAMI DANYCH

Page 183: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 10

#include<stdio.h>int main(void){

FILE *strumien;strumien=fopen (“znaki . txt”,” w ” );char msg [ ]=”Cześć Stefan \ n”;

int i=0;while (msg [ i ])

putc(msg [ i++ ], strumien);return 0;}

182

V ZARZĄDZANIE BAZAMI DANYCH

Page 184: O AUTORACH

Praca z plikami (zapis, odczyt)

SPIS TREŚCI ><< ZAKOŃCZ<

Przykład 11

// program zapisywania trzech danych do pliku#include<fstream.h>#include<string.h>void main(void){char nazwa [100], x [100], y[100];int a;

cout<<” Podaj nazwę pliku ”<<endl;cin>>nazwa;//utworzenie obiektu klasy ofstreamofstream plik_dane (nazwa);if(!plik_dane){

cout<<”Pliku nie można otworzyć”<<endl;return;

}strcpy(x,”abc”);strcpy(y,”xyz”);a=100;

//zapis danych do plikuplik_dane<<x<<” ”<<a<<” ”<<y<<endl;// zamkniencie plikuplik_dane.close();

}

183

V ZARZĄDZANIE BAZAMI DANYCH

Page 185: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Przykładowy projekt

W przykładzie zaprojektujemy prosty system bazy danych.Podstawowe operacje,które musi realizować program to:odczytanie danych z pliku – funkcja Odczytaj ()zapisanie danych do pliku – funkcja Zapisz ()wczytanie informacji o nowym pracowniku – funkcja CzytajInform ()wyświetlenie informacji o wszystkich pracownikach – funkcja Wszyscy ()usunięcje informacji o pracowniku – funkcja Usuń ()wyszukanie informacji o danym pracowniku – funkcja PracWyświel ()Ponadto dla przykładu program będzi realizował:wyszukanie pracowników w danym wieku – funkcja Wiek ()wyszukanie pracowników zamieszkałych przy danej ulicy – funkcja Zamieszk ()W programie zmienne strukturalne będą typu pracownik. W tablicy twsk zamieścimy wskazania na zmienne typu pracownik, a zatem deklaracja tablicy twsk powinna mieć postać:

pracownik *twsk[DLBAZA];gdzie DLBAZA jest stałą określającą maksymalną liczbę pracowników.

#include<fstream.h>#include<string.h>#define DLBAZA 100#define DLTEKST 20struct ident {char imiepier[DLTEKST], imiedrug[DLTEKST], nazwisko[DLTEKST];};struct data {

int dzień, miesiąc, rok;char miejsce[DLTEKST];

};

184

V ZARZĄDZANIE BAZAMI DANYCH

Page 186: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

struct adresprac {int kod;char miejscowość[DLTEKST], ulica[DLTEKST];nt numer, mieszkanie, telefon;

};struct pracownik {

ident nazw;data urodz;adresprac adres;};//prototypy funkcjiint CzytajInform (int n, pracownik *twsk[ ] );void WyświetlStrukt (pracownik *prac);void Wstaw (int n, pracownik *twsk[ ], pracownik *nowy );int Wyszukaj (int n, char *klucz, pracownik *twsk[ ] );int Odczytaj (pracownik *twsk[ ] );void Zapisz (int n, pracownik *twsk[ ] );void Wszyscy (int n, pracownik *twsk[ ] );void PracWyświetl (int n, pracownik *twsk[ ] );void Zamieszk (int n, pracownik *twsk[ ] );void Wiek (int n, pracownik *twsk[ ] );void Usuń (int &n, pracownik *twsk[ ] );void main (void){

// deklaracja tablicy wskaźnikówpracownik *twsk[DLBAZA];int n, koniec;

char wybór;

185

V ZARZĄDZANIE BAZAMI DANYCH

Page 187: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

// n – liczba określonych wskaźników// koniec – zmienna określająca koniec pętli// wybór – wczytanie jednego znaku sterującego menu// odczytanie zawartości plikun = Odczytaj (twsk);cout << ” Baza danych zawiera ” << n << ”pracowników ” << endl;//utworzenie menukoniec=1;do {

cout << endl << ” MENU ” << endl;cout << “ p : Przegląd wszystkich pracowników ” << endl;cout << ” n : Nowy pracownik ” << endl;cout << ” d : Dane pracownika ” <<endl;cout << ” w : Wiek – wszyscy pracownicy urodzeni ” << ” po danym roku ” << endl;cout << ” z : Wszyscy pracownicy zamieszkali ” << ” przy danej ulicy ” << endl;cout << ” u : Usuń informacje o pracowniku ” <<endl;cout << ” q : Koniec ” << endl;cout << endl << ”WPROWADŹ ODPOWEDNI ZNAK ” << endl;

186

V ZARZĄDZANIE BAZAMI DANYCH

Page 188: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

// wczytanie znaku sterującego wyboremcin >> wybór;switch (wybór) {

case ‘p’:Wszyscy (n, twsk); // wszyscy pracownicyBreak;

case ‘n’:if (n < DLBAZA) {

n = CzytajInform (n, twsk); // nowy pracownik}break;

case ‘d’:PracWyświetl (n, twsk); // konkretny pracownikbreak;

case ‘w’:Wiek (n, twsk); // pracownicy w danym wiekubreak;

case ‘z’:Zamieszk (n, twsk); // zamieszkali przy danej ulicybreak;

case ‘u’:Usuń (n, twsk); // usunięcie pracownikabreak;

case ‘q’:Zapisz (n, twsk); // zapisanie informacji do plikukoniec = 0;break;

} } while (koniec);}

187

V ZARZĄDZANIE BAZAMI DANYCH

Page 189: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Omawianie niezbędnych funkcji rozpoczniemy od sposobu odczytywania danych z pliku i ich zapisywania. Tu musimy podać podstawowe informacje.Otwarcie pliku do odczytu dokonujemy przy pomocy instrukcjiifstream plik_prac (” BAZA.DAT ”); gdzie plik_prac jest nazwą logiczną pliku, a ” BAZA.DAT ” nazwą pliku na dysku.Do wczytanie wartości zmiennej typu całkowitego wykorzystujemy funkcję read() w następujący sposób:plik_prac.read ((char *) &n, sizeof (int))gdzie &n podaje adres zmiennej n, (char *) jest konwersją typów, a sizeof (int) określa rozmiar zmiennej typu int.Natomiast do wczytania wartości zmiennej strukturalnej typu pracownik stosujemy funkcję read ()plik_prac.read ((char *) twsk[i], sizeof (pracownik));gdzie jak pamiętamy twsk[i] jest wskaźnikiem , a sizeof określa rozmiar zmiennej strukturalnej.Funkcja odczytywania danych z pliku ma postać przedstawioną poniżej.int Odczytaj (pracownik *twsk[ ] )// funkcja odczytywania danych z pliku{

int n, i;// otworzenie pliku do odczytuifstream plik_prac ( ” BAZA.DAT ” );// jeśli są dane w plikuif ( plik_prac.read ((char *) &n, sizeof (int )))

for ( i=0; i<n; i++) {// utworzenie nowej zmiennej dynamicznej typu pracowniktwsk[ i ] = new pracownik;// wczytanie wartości jednej zmiennejplik_prac.read (( char *) twsk[ i ], sizeof ( pracownik ));

}else

n = 0;plik_prac.close (); // zamknięcie plikureturn n;

}

188

V ZARZĄDZANIE BAZAMI DANYCH

Page 190: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Omówimy teraz funkcję zapisywania do pliku liczby podającej, ile jest zmiennych strukturalnych oraz wartości tych zmiennych. Otwarcie pliku do zapisu dokonujemy przy pomocy instrukcji:

ofstream plik prac (” BAZA.DAT ”);

Natomiast do zapisywania do pliku wartości liczby wykorzystujemy funkcję write()Plik_prac.write ((char * ) &n, sizeof (int));gdzie tak jak poprzednio &n jest adresem zmiennej n, a sizeof(int) określa rozmiar typu int.

Zapisanie do pliku wartości zmiennej strukturalnej typu pracownik wykonujemy w sposób następujący:if (! plik_prac.write ((char *) twsk[i],sizeof (pracownik)) )

gdzie twsk[i] podaje adres zmiennej typu pracownik, a sizeof (pracownik) określa rozmiar tej zmiennej. Przy okazji sprawdzamy czy zapisanie dokonało się poprawnie, co umożliwia wartość podawana przez funkcję write() ( 0 – zapisanie poprawne). Treść funkcji Zapisz jest następująca.void Zapisz (int n, pracownik *twsk[ ])// funkcja zapisywania danych do pliku

189

V ZARZĄDZANIE BAZAMI DANYCH

Page 191: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

{int i;// otworzenie pliku do zapisuofstream plik_prac („BAZA.DAT”);// zapisanie do pliku liczby nplik_prac.write ((char *) &n, sizeof(int));// zapisanie do pliku n zmiennych strukturalnychfor (i=0; i<n; i++) {

if ( ! plik_prac.write((char *) twsk[i],sizeof (pracownik)) )cout <<”WYSTĄPIŁ BŁĄD PRZY ZAPISYWANIU” << endl;// usunięcie zmiennej strukturalnej wskazywanej przez twsk[i]ddelete twsk[i];

}plik_prac.close(); // zamknięcie pliku

}

190

V ZARZĄDZANIE BAZAMI DANYCH

Page 192: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Wstawienie wskazania na nowego pracownika we właściwe miejsce (w kolejności alfabetycznej według nazwiska) tablicy wskaźników realizuje funkcja Wstaw(). Warto zwrócić uwagę na wykorzystanie funkcji standardowej strcmp() podającej wartość ujemną, jeżeli pierwszy tekst jest położony wcześniej (w kolejności alfabetycznej) i wartość dodatnią, jeżeli drugi tekst jest położony wcześniej. Wykorzystany algorytm polega na przesuwaniu wskaźnika od końca, aż dotrzemy do odpowiedniego miejsca.Konstrukcjatwsk [nr-1] – >nazw.nazwiskojest zwartym zapisem następującej*twsk [nr-1].nazw.nazwiskoa zatem operator - > zastępuje dwa operatory: operator wyłuskania „ * ” oraz operator selekcji „ . ”.A oto treść funkcji Wstaw().void Wstaw( int n, pracownik *twsk[ ], pracownik *nowy)// funkcja wstawiania wskazania na nowego pracownika do tablicy wskaźników// n – liczba pracowników (razem z nowym pracownikiem)// twsk – tablica wskaźników// nowy – wskaźnik na zmienną strukturalną zawierającą informację o nowym pracowniku{

int nr;nr = n-1; // indeks ostatniego elementu tablicyif (n>1) { // jeśli jest co najmniej dwóch pracowników

// znalezienie odpowiedniego miejscawhile (( strcmp (twsk [nr – 1 ] – > nazw.nazwisko,nowy – > nazw.nazwisko) >0)

&& (nr >0)) {twsk [nr] = twsk [nr-1];nr --;

}}twsk[nr] = nowy; //wstawienie wskazania do tablicy

}

191

V ZARZĄDZANIE BAZAMI DANYCH

Page 193: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Funkcja Czytaj() dokonuje wczytania informacji o pracowniku. W treści tej funkcji następuje wywołanie funkcji Wstaw(), co powoduje wstawienie wskazania we właściwe miejsce tablicy wskaźników.int CzytajInform (int n, pracownik *twsk[ ])// funkcja wczytywania informacji o nowym pracowniku{

pracownik *nowy; // deklaracja wskaźnika// utworzenie nowej zmiennej strukturalnej typu pracowniknowy = new pracownik;// wczytanie danychcout <<”Podaj pierwsze imię” << endl;cin >> nowy– > nazw.imiepier;cout <<”Podaj drugie imię” << endl;cin >> nowy – > nazw.imiedrug;cout <<”Podaj nazwisko” << endl;cin >> nowy – > nazw.nazwisko;cout <<”Podaj dzień urodzenia” << endl;cin >> nowy – > urodz.dzien;cout <<”Podaj miesiąc urodzenia” << endl;cin >> nowy – > urodz.miesiac;cout <<”Podaj rok urodzenia” << endl;cin >> nowy– > urodz.rok;cout <<”Podaj miejsce urodzenia” << endl;cin >> nowy – > urodz.miejsce;cout <<”Podaj kod pocztowy” << endl;cin >> nowy– > adres.kod;cout <<”Podaj miejscowość” << endl;cin >> nowy– > adres.miejscowosc;cout <<”Podaj ulicę” << endl;cin >> nowy– > adres. ulica;cout <<”Podaj numer ulicy” << endl;

192

V ZARZĄDZANIE BAZAMI DANYCH

Page 194: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

cin >> nowy– > adres.numer;cout <<”Podaj numer mieszkania” << endl; cin >> nowy – >adres.mieszkanie;cout <<”Podaj numer telefonu” << endl;cin >> nowy – > adres.telefon;n++; // zwiększenie liczby pracowników

// wstawienie wskazania na nowego pracownika we właściwe miejsceWstaw (n, twsk, nowy);

// funkcja podaje aktualną liczbę pracownikówreturn n;

}Zadaniem funkcji WyświetlStrukt() jest tylko wyprowadzenie informacji o danym pracowniku.

void WyświetlStrukt(pracownik *prac)// funkcja wyświetlania informacji dla pracownika wskazywanego przez wskaźnik prac{

char x;cout << „ DANE PRACOWNIKA” << endl;cout <<” Pierwsze imię: ” << prac – > nazw.imiepier << endl;cout << „Drugie imię: ” << prac – > nazw.imiedrug << endl;cout << „Nazwisko: ” << prac – > nazw. Nazwisko << endl;cout << „Dzień urodzenia: ” << prac – >urodz.dzien << endl;cout << „Miesiąc urodzenia: ” << prac– > urodz.miesiac << endl;cout << „Rok urodzenia: ” << prac – >urodz.rok;cout << „Miejsce urodzenia: ” << prac– > urodz.miejsce <<endl;cout << „Miejscowość: ” << prac– > adres.miejscowosc << endl;cout << „Ulica: ” << prac– > adres.ulica << endl;cout << „Numer ulicy: ” << prac– > adres.numer << endl;cout << „Numer mieszkania: ” << prac – >adres.mieszkanie << endl;cout << „Numer telefonu: ” << prac – >adres.telefon << endl;

cout << endl << ” NACIŚNIJ COS ”<<endl;cin>>x;}

193

V ZARZĄDZANIE BAZAMI DANYCH

Page 195: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Funkcja Wyszukaj () została zaprojektowana w oparciu o algorytm wyszukiwania binarnego. Jeżeli dany pracownik został znaleziony, to podaje ona odpowiedni indeks w tablicy wskaźników, a w przeciwnym przypadku wartość 1. int Wyszukaj (int n, char *klucz, pracownik * twsk [ ] )// funkcja wyszukiwania binarnego w tablicy wskaźników// n – aktualny rozmiar tablicy wskaźników twsk// klucz – wskaźnik na tekst zawierający klucz// (dane nazwisko){

int lewy, prawy, środek, wynik;// lewy – lewy kraniec przedziału // prawy kraniec przedziału// środek – środek przedziału // wynik wyszukiwania (1 – znaleziono )lewy = 0; prawy = n-1;wynik = 0;

do {środek = (lewy + prawy ) / 2;

if ( strcmp (twsk [ środek] – > nazw. nazwisko, klucz ) == 0 ) wynik = 1;else if ( strcmp (twsk [ środek] – > nazw. nazwisko, klucz ) < 0 ) lewy = ++ środek;

else prawy = - - środek;

} while (! wynik && lewy < = prawy );if (wynik)return środek;else

return - 1}

194

V ZARZĄDZANIE BAZAMI DANYCH

Page 196: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Zadaniem funkcji Wszyscy () jest wyprowadzenie informacji o wszystkich pracownikach.void Wszyscy (int n, pracownik * twsk [ ] )// funkcja wyświetlania informacji o wszystkich pracownikach// n – {

int i;

for (i = 0; i< n; i++ ) WyświetlStrukt(twsk [i] );

}Funkcja PracWyświetl () żąda wczytania nazwiska pracownika i następnie po jego wyszukaniu wyświetla kompletną informację. void PracWyświetl (int n, pracownik * twsk [ ] )// funkcja wyprowadzania informacji dla konkretnego pracownika// n - aktualny rozmiar tablicy wskaźników twsk{

int wynik; char tekst [ DLTEKST ];cout << ” Podaj nazwisko pracownika ” << endl;cin>> tekst;// wyszukanie pracownika, którego nazwisko znajduje się w tablicy tekstwynik = Wyszukaj (n, tekst, twsk );

if (wynik ! = -1) WyświeltStrukt (twsk [ wynik ] );else cout << ” Pracownika o podanym nazwisku nie ma w bazie ” <<endl;

}

195

V ZARZĄDZANIE BAZAMI DANYCH

Page 197: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

Wykaz pracowników zamieszkałych przy danej ulicy podaje funkcja Zamieszk (). A oto jej treść:void Zamieszk (int n pracownik * twsk [ ] )// funkcja podawania nazwisk pracowników zamieszkałych przy danej ulicy // n - aktualny rozmiar tablicy wskaźników twsk{

char nazwa [DLTEKST ];int i;cout << ” Podaj ulicę ”<<endl;cin>> nazwa;cout << ” Wykaz pracowników zamieszkałych na ulicy ”<< nazwa <<endl;for (i = 0; i< n; i++ )

if ( strcmp (nazwa, twsk [ i ] – > adres. ulica ) == 0 ) cout << twsk [i] – > nazw. imiepier << ” ” << twsk [ i ] – > nazw. nazwisko <<endl;

}

Natomiast wykaz pracowników będących w określonym wieku podaje funkcja Wiek (). void Wiek (int n, pracownik * twsk [ ] )// funkcja podawania nazwisk pracowników będących w określonym wieku // n - aktualny rozmiar tablicy wskaźników twsk{

int graniczny, i;cout << ” Podaj rok graniczny ” <<endl;cin >> graniczny;cout << ” Wykaz pracowników urodzonych po roku: ” << graniczny <<endl;for ( i = 0; i< n; i++ )

if (graniczny < twsk [ i ] – > urodz. rok ) cout << twsk [ i ] – > nazw. imiepier << ” ” << twsk [i ] – > nazw. nazwisko<<endl;

}

196

V ZARZĄDZANIE BAZAMI DANYCH

Page 198: O AUTORACH

Przykładowy projekt

SPIS TREŚCI ><< ZAKOŃCZ<

I ostatnia już funkcja to Usuń (). Umożliwia ona usunięcie informacji o danym pracowniku. void Usuń (int &n, pracownik * twsk [ ] ) // n - aktualny rozmiar tablicy wskaźników twsk// UWAGA: wartość zmiennej n jest przekazywana na zewnątrz funkcji{

chat tekst [DLTEKST];int wynik, i;cout << ” Podaj nazwisko pracownika ” << ” ( będą usunięte informacje ) ”<<endl;cin >> tekst;

// znalezienie pracownika o nazwisku umieszczonym w zmiennej tekstwynik = Wyszukaj (n, tekst, twsk );delete twsk [wynik ]; // usunięcie zmiennej strukturalnej if (wynik != -1 )

{if ( n >1) // jeśli jest co najmniej dwóch pracowników

// przesunięcie wskaźników z usunięciem zbędnego wskaźnika

for (i = wynik; i < n – 1; i++) twsk [ i ] = twsk [ i+1 ]; n - -; // zmniejszenie liczby pracowników cout << ” INFORMACJE USUNIĘTO !!! ” <<ENDL;} else

cout << “ Pracownika o podanym nazwisku nie ma ” << ” w bazie ”<<endl;}

197

V ZARZĄDZANIE BAZAMI DANYCH

Page 199: O AUTORACH

SPIS TREŚCI ><< ZAKOŃCZ<

Najczęstsze błędy podczas pisania programów w języku C++

Kompilacja programu w języku C++ jest podobna do kompilacji programu w języku asemblera. Za efekty odpowiada programista, a ten jest omylny. Dobrą zasadą jest więc zapis programu źródłowego przed uruchomieniem. Kompilator nie kontroluje bowiem wielu spraw, z których kilka można wymienić:•indeksy tablic •rzeczywiste wartości wskaźników•ilość podanych parametrów funkcji w stosunku do zadeklarowanych•wywołania wskaźników do funkcji ( mogą nie być zainicjowane ).

Poniżej przedstawione są najczęstsze przyczyny błędów, których należy unikać pisząc program. •Duże i małe litery są rozróżniane w jezyku C++•Komentarze należy zamykać•Ciągi znakowe powinny być zakończone znakiem ’\0’•Zmienne i wskaźniki powinny otrzymać wartości przed użyciem•Operator ’=’ jest operatorem przypisania, a nie porównania•Indeksy tablic zaczynają się od zera; tablica o n – elementach ma indeksy od 0 do n-1•Nazwa tablicy jest wskaźnikiem od początku danych – nie można jej przypisywać danych; tablica nie może być przekazana jako parametr funkcji•Tablicom automatycznym należy przypisywać dany element po elemencie•Zmienne lokalne i parametry funkcji istnieją na stosie i giną po zakończeniu działania funkcji, w których zostały zadeklarowane•Funkcja odbiera swoje parametry w postaci ich wartości, a nie adresów•Parametry funkcji i ich typy muszą być zgodne w deklaracji i wywołaniach•Tam, gdzie potrzebne są wskaźniki należy ich użyć; w wielu przypadkach należy umieć zastosować operator adresowania ‘ & ‘•Jeśli funkcja nie posiada zadeklarowanych parametrów, to nawiasy przy wywołaniu są potrzebne•Typ zwracanej przez funkcje wartości będzie taki, jak podano na początku deklaracji•Wartość znacznika końca zbioru EOF nie może być testowana przez typ (char), gdyż – 1 równa się wtedy 255, co mogłoby kolidować ze znakiem o kodzie 255•Wyrażenie ++n różni się od wyrażenia n++•Inkrementacja wskaźnika wywołuje jego podwyższenie o rozmiar danej, nie zawsze o 1 bajt; wartość dodana do wskaźnika będzie pomnożona przez rozmiar danej, którą wskazuje

198

V ZARZĄDZANIE BAZAMI DANYCH Najczęstsze błedy podczas ...

Page 200: O AUTORACH

Uwagi i wnioski / Bibloigrafia

SPIS TREŚCI ><< ZAKOŃCZ<

• Kompilator nie bada przepełnienia w operacjach arytmetycznych• Ciąg znakowy zawarty jest miedzy cudzysłowem, a znak między apostrofami• Ciąg znakowy ma rzeczywistą długość jeden bajt większą z powodu znacznika końca NULL (‘0’)• Operatory podzielone są na grupy według kolejności ich wykonywania, co warto mieć na uwadze; w przypadku równych

priorytetów działania wykonywane są od lewej do prawej• Faza ”else” należy do ostatniego ”if”• Instrukcja ”break” powoduje zakończenie działania instrukcji switch• Po warunkach precyzowanych w pętlach ”while” i ”for” nie stawia się średnika, gdyż tworzy się wtedy pętle puste; podobnie jak z

instrukcją ”if”• Instrukcji #define nie kończy się średnikiem• Wszystkie argumenty funkcji scanf () muszą być adresami zmiennych; należy stosować operator ‘&’, jeśli to potrzebne• nie istnieje format %u dla funkcji scanf () – należy stosować format %d• Lepiej zaczynać format funkcji scanf () od spacji, ale nią nie kończyć

Uwagi i wnioskiNiniejsza prezentacja jest przeznaczona dla osób początkujących, które nie zetknęły się z żadnym językiem programowania. Są w niej omówione, od podstaw, wszystkie techniki programowania. Zawiera wiele przykładów programowania, dokładnie wyjaśnionych i omówionych. Z pewnością można powiedzieć, że jej przystępny i prosty charakter pomoże w miły sposób prowadzić w tajniki programowania.

Bibliografia1. K. Mamcarz „ Podstawy Programowania w języku C ” Oficyna Wydawnicza PW ZSMP ” FORUM ”, Warszawa 1989r.2. Stanley B. Lippman „ Podstawy języka C++ ” Wydawnictwo Naukowo – Techniczne, Warszawa.3. A. Struzińska – Walczak, K.Walczak „ Nauka Programowania dla Początkujących C++” Wydawnictwo W & W, Warszawa

1999r.4. K. Barteczko „ Programowanie obiektowe ” , Warszawa 1993r. 5. J. Grębosz „ Pasja C++ ”. Oficyna Kallimach, Kraków 1997r. 6. A. Majczak „ C++ w 48 godzin ”, Intersaftland, Warszawa 1993r.

199

V ZARZĄDZANIE BAZAMI DANYCH

Page 201: O AUTORACH

SPIS TREŚCI ZAKOŃCZ

Autorki pracy:

2004/2005