Podrecznik 1 - Podstawy Programowania
Download
Report
Transcript Podrecznik 1 - Podstawy Programowania
Elbox
Laboratorium
Informatyki
Multimedialny podręcznik dla Policealnego Studium Technicznego
– Zarządzanie bazami danych
O AUTORACH
>
ZAKOŃCZ
SPIS TREŚCI
I WSTĘP
II CEL PRACY
III 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
<
>
>>
ZAKOŃCZ
1
SPIS TREŚCI
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 projekt
V 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
<
>
ZAKOŃCZ
2
I WSTĘP
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.
SPIS TREŚCI
<
>
ZAKOŃCZ
3
II CEL PRACY
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.
SPIS TREŚCI
<
>
ZAKOŃCZ
4
III ELI
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.
SPIS TREŚCI
<
>
>>
ZAKOŃCZ
5
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
6
III ELI
Wiadomości wstępne
Algorytm
Algorytm
Jest 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ów
Za 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
SPIS TREŚCI
Nieprawidłowe
<<
<
>
>>
ZAKOŃCZ
7
Wiadomości wstępne
III ELI
Edycja klocka / Paleta klocków
Edycja klocka
Wię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ów
Podstawową 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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
8
Wiadomości wstępne
III ELI
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
9
Wiadomości wstępne
III ELI
Paleta klocków
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 sinus
arccos
arcus cosinus
arctg
arcus tangens
pow
funkcja wykładnicza 10 do potęgi
exp
funkcja wykładnicza e do potęgi
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
10
Wiadomości wstępne
III ELI
Paleta klocków
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: <, >, <=, >=, =, !::=
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
11
Wiadomości wstępne
III ELI
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
12
Wiadomości wstępne
III ELI
Tablica
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
13
Wiadomości wstępne
III ELI
Taśma
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:
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
14
Wiadomości wstępne
III ELI
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
15
Wiadomości wstępne
III ELI
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
16
Wiadomości wstępne
III ELI
Projekt
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.
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
17
Wiadomości wstępne
III ELI
Dostępne okna
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
18
Wiadomości wstępne
III ELI
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
19
Wiadomości wstępne
III ELI
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 tablicy
5 z pola numerycznego - zmiana sposobu wyświetlania tablicy
W oknie taśmy
INS - edycja pola taśmy
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
20
Wiadomości wstępne
III ELI
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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
21
Wprowadzenie do budowania..
III ELI
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 liczb
3. Obliczenie sumy tych liczb
4. Wyprowadzenie wyniku
5. 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 .
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
22
Wprowadzenie do budowania..
III ELI
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 )
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
23
Wprowadzenie do budowania..
III ELI
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. Start
2. Wczytać pierwszą liczbę
3 . Wczytać drugą liczbę
4. Sprawdzenie czy większa jest pierwsza liczba
a. Jeśli tak, to wypisujemy ją z objaśnieniem że jest większa od drugiej
b. Jeśli nie, to wypisujemy drugą liczbę z objaśnieniem że jest większa od pierwszej
5. 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).
Zadanie
Zbuduj algorytm który rozpozna przypadek gdy liczby są równe i wyświetli odpowiedni komunikat.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
24
Wprowadzenie do budowania..
III ELI
Algorytm rozwiązania równania kwadratowego
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. Start
2. Wczytanie 3 współczynników
3. Obliczenie wyróżnika
4. Sprawdzenie czy wyróżnik jest dodatni
jeśli tak to
◊ Obliczyć pierwiastki
◊ Wyświetlić oba pierwiastki
◊ Koniec algorytmu
jeśli nie to
◊ Wypisujemy deltę i komunikat brak rozwiązań
◊ Koniec algorytmu
Przykład algorytmu
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
25
Wprowadzenie do budowania..
III ELI
Obliczanie wartości średniej
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 n
2. Wyzerowanie zmiennej suma i licznika i
3. Sprawdzenie czy wszystkie elementy zostały wczytane i<n
jeśli nie to
◊ wczytanie następnego elementu
◊ dodanie do sumy
◊ zwiększenie licznika i
◊ przejście do punktu 3
jeśli tak to
◊ obliczenie średniej
◊ wyświetlenie wyniku
◊ koniec algorytmu
Przykład algorytmu
Zadania
1. 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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
26
Wprowadzenie do budowania..
III ELI
Znajdowanie największej z podanych liczb
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. Start
2. Określenie wartości max = 0
3. Wczytanie kolejnej liczby
4. Sprawdzenie czy jest to liczba dodatnia
jeś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.3
jeśli nie to
◊ Wyświetlenie wartości max
◊ Koniec algorytmu
Przykład algorytmu
Zadania
1. Zbuduj algorytm znajdujący wartość min
2. Zbuduj algorytm znajdujący jednocześnie wartość max i min
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
27
Wprowadzenie do budowania..
III ELI
Największy wspólny dzielnik – algorytm Euklidesa
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łania
1. Start
2. Wczytać dwie liczby a i b
3. Sprawdzić czy te liczby są różne
jeśli tak to
◊ Sprawdzić czy a>b
jeśli tak to a=a-b
jeśli nie to b=b-a
◊ Powrót do punktu 3
jeśli nie to
4. Wyświetl wartość a
5. Koniec algorytmu
Przykład algorytmu
Zadanie
1. Zabezpiecz algorytm przed błędnymi danymi np. a=0
2. Zbuduj algorytm skracający ułamki właściwe
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
28
Wprowadzenie do budowania..
III ELI
Dzielenie liczb całkowitych (pętla DOPÓKI)
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łania
1. Start
2. Wczytanie dzielnej i dzielnika
3. 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 0
4. Dopóki r >=b wykonuj
r =r- b
i =i+ 1
5. Wyświetl iloraz i resztę
W języku C taką pętlę zapisujemy
WHILE (warunek)
{instrukcje}
Przykład algorytmu
Zadania
1. Zbuduj algorytm odporny na błędne dane np. a=0, a=-3
2. 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
29
Wprowadzenie do budowania..
III ELI
Pierwiastek kwadratowy (pętla POWTARZAJ)
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łania
1. Wczytać liczbę i dokładność
2. xn= 1 pierwsze przybliżenie
3. wykonanie obliczeń
xs=xn
xn=( xs+liczba/xs )/2
dx=abs( xn-xs )/ ε
4. dx<l jeśli fałsz to skocz do punktu 3
jeśli prawda to wyświetl xn
5. koniec algorytmu
Przykład algorytmu
Zadania
1. Zbuduj algorytm odporny na błędne dane np. liczba = - 4
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
30
Wprowadzenie do budowania..
III ELI
Sumowanie liczb nieparzystych (pętla DLA)
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łania
1. Wczytać wartość końcową
2. Nadanie zmiennym sterującym obliczone wartości
3. Sprawdzenie czy uzyskaliśmy wartość końcową zmiennej sterującej
jeśli nie to
◊ dodanie do sumy 2
◊ zwiększenie zmiennej sterującej
jeśli tak to
4. 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.
Zadanie
1. 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
31
Wprowadzenie do budowania..
III ELI
Zgadnij liczbę
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łania
1. Wygenerowanie liczby przez komputer
2. Ustawienie licznika prób na 1
3. Wczytanie liczby
4. sprawdzenie czy podana liczba jest trafna
jeśli tak to
◊ gratulacje
◊ koniec algorytmu
jeś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
Zadania
1. Zbuduj algorytm z samodzielnym wyborem zakresu zgadywanych liczb
2. Zbuduj algorytm w którym komputer zgaduje liczbę
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
32
Projekty
III ELI
Sumowanie ułamków
Sumowanie ułamków
Sumowanie ułamków wymaga kolejno:
1. Obliczenia wspólnego mianownika
2. Zsumowania pomnożonych przez odpowiednie współczynniki liczników
3. 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 obliczamy
Licznik1 =5 *nww/6=5 *24/6=20
Licznik2=3 *nww/8=3 *24/8=9
Nasz ułamek przyjmie postać.
20 + 9 == 29
24
24
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.
Plan algorytmu
1. Wczytanie czterech liczb
2. Obliczenie nwd
3. Obliczenie:
a. Wspólnego mianownika nww
b. Liczników
c. Sumy liczników
4. Wypisanie wspólnego mianownika
5. Obliczenie nwd nowego licznika i nww
6. Skrócenie licznika i mianownika (podzielenie przez nwd)
7. Wypisanie licznika i mianownika
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
33
Projekty
III ELI
Sumowanie ułamków
W czasie wykonywania algorytmu dwukrotnie zostaje obliczany nwd, można zastosować procedurę którą dwa razy wywołamy.
Przykład algorytmu
Zadanie
1. Zbuduj algorytm obliczający nwd i nww dla dwóch dowolnych liczb naturalnych,
zastosuj procedurę
2. Zbuduj algorytm dodający trzy ułamki
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
34
Projekty
III ELI
Wykresy funkcji
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łania
1. Start
2. Wczytanie wartości początkowej xpocz
3. Wczytanie wartości końcowej xkon
4. Wczytanie liczby kroków n
5. Obliczenie przyrostu argumentu dx=(xkon-xpocz)/n
6. Sprawdzenie czy x jest większe od xkon
jeśli tak to
koniec
jeśli nie to
obliczenie f(x)
wpisanie x i y do tablicy
zwiększenie x o dx i numeru wiersza o 1
powrót do początku pętli
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
35
Projekty
III ELI
Wykresy funkcji
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.
Zadania
l. Zbuduj algorytm wyświetlający funkcję y=ax+b
2. Zbuduj algorytm wyświetlający funkcję y =ax2+bx+c
3. Zbuduj algorytm wyświetlający funkcje trygonometryczne
4. Sprawdź poprawność równania sin2(x)+cos2(x)=1
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
36
Projekty
III ELI
Rozkład liczby naturalnej na czynniki
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łania
1. Wczytanie liczby
2. Przypisanie czynnikowi wartości 2
3. Sprawdzenie, czy czynnik jest większy od liczby
jeśli tak to
zapisanie liczby i zakończenie działania
jeśli nie to
sprawdzenie czy reszta z dzielenia całkowitego jest równa O
jeśli tak to
zapisanie czynnika i przypisanie liczbie wartości liczba/czynnik
jeśli nie to
zwiększenie czynnika o 1
4. Powrót do punktu 3
Przykład algorytmu
Zadanie
1. Zbuduj algorytm sprawdzający czy podana liczba jest liczbą pierwszą.
2. Zbuduj algorytm wypisujący wszystkie podzielniki podanej liczby
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
37
Projekty
III ELI
Tabliczka mnożenia
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ętli
zewnętrznej w stosunku do pierwszej. Taka konstrukcja nazywa się pętlą w pętli.
Plan działania
1. Start
2. Wczytanie liczby od której zaczniemy wpisywać tabliczkę mnożenia
3. Wczytanie liczby, na której skończymy wpisywanie
4. 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 to
przejś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 wier
powró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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
38
Projekty
III ELI
Tabliczka mnożenia
Przykład algorytmu
Zadania
1. Zbuduj algorytm wypełniający jedynie główną przekątną
2. Zbuduj algorytm wypełniający tablicę iloczynami liczb nieparzystych
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
39
Projekty
III ELI
Z systemu dziesiętnego na dowolny
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 reszty
możemy to zapisać w postaci
:2
6│0
3│1
1│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łania
1. Wczytanie liczby i podstawy
2. Przewinięcie na początek taśmy, na której będziemy zapisywać współczynniki
3. Sprawdzenie czy liczba jest równa 0
jeśli tak to
a. Zakończenie działania
jeśli nie to
a. Obliczenie reszty z dzielenia liczby przez podstawę i ilorazu całkowitego
b. Zapisanie na taśmie reszty z dzielenia
c. Przypisanie liczbie wartości ilorazu
d. Powrót do punktu 3
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
40
Projekty
III ELI
Z systemu dziesiętnego na dowolny
Przykład algorytmu
Zadania
1. Zbuduj algorytm przeliczający z dowolnego systemu na dziesiętny
2. Zbuduj algorytm zamieniający ułamek dziesiętny na postać dwójkowa
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
41
Porządkowanie ciągów
III ELI
Wyszukiwanie liczby
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ątek
2. 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 przeszukiwania
Jej schemat działania jest następujący:
1. przewinięcie taśmy na początek
2. 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 dalej
3. wyprowadzenie komunikatu o braku poszukiwanej liczby
4. zakończenie procedury
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
42
Porządkowanie ciągów
III ELI
Wyszukiwanie liczby
Procedura szukajwart również posiada dwa parametry X - poszukiwana liczba N - liczba elementów do przeszukiwania
Jej 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 liczby
3. Przewinięcie taśmy na początek
4. Przypisanie numerowi i na taśmie wartości 0
5. 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 liczbie
6. 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
Zadania
1. 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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
43
Porządkowanie ciągów
III ELI
Znajdowanie największej liczby
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łania
1. Start
2. Przesunięcie wskaźnika taśmy na początek
3 . Wczytanie pierwszego elementu z taśmy
4. Przyjęcie tej wartości za max i ustawienie numeru liczby na taśmie na 0
5. 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ńczenie
Procedurę należy zbudować według podanego przepisu
1. Początek procedury
2. Sprawdzamy czy max jest nieujemne
jeśli tak to
a. Wyprowadzenie max
b. Przewijanie taśmy na pozycję nrpocz
c. Wpisanie max
d. Przewijanie taśmy na pozycję nrmax
e. Wpisujemy pierwszy element
f. Kończymy procedurę
jeśli nie to
a. Ciąg musiał być pusty, sygnał dźwiękowy
b. Koniec procedury
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
44
Porządkowanie ciągów
III ELI
Znajdowanie największej liczby
Przykład algorytmu
Zadania
1. Zbuduj algorytm znajdujący najmniejszą liczbę
2. Zbuduj algorytm szukający jednocześnie min i max
3. Zbuduj algorytm wyszukujący medianę
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
45
Porządkowanie ciągów
III ELI
Sortowanie ciągu
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łania
1. Start
2. Przypisanie liczbie przestawień wartości 1 początek pętli sortowania
3. Sprawdzenie czy liczba przestawień wynosi 0
jeśli tak to
4. Zakończenie algorytmu
jeśli nie to
a. Ustawienie liczby przestawień na 0 i numeru elementu na 0
b. 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 numerze
d. Wczytanie bieżącego elementu taśmy
e. 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 przestaw
1. Start procedury
2. Wczytanie z taśmy nowego elementu ciągu
3. 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 elementu
e. Koniec procedury
jeśli nie to
elementy są w dobrej kolejności następuje koniec procedury
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
46
Porządkowanie ciągów
III ELI
Sortowanie ciągu
Przykład algorytmu
Zadania
1. Zbuduj algorytm sortujący od najmniejszej do największej liczby
2. Zbuduj algorytm sortujący poprzez znalezienie największej liczby i przestawienie jej na
początek itd.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
47
Porządkowanie ciągów
III ELI
Rozwiązywanie równania metodą połowienia
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łania
1. Start
2. Wczytanie danych i sprawdzenie czy spełnione są założenia (procedura)
3. Obliczenie wartości funkcji dla dolnej granicy i połowy przedziału
4. 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 funkcja
1. obliczenie wartości funkcji dla x
2. zwrócenie tej wartości do głównego algorytmu
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
48
Porządkowanie ciągów
III ELI
Rozwiązywanie równania metodą połowienia
Przykład algorytmu
Zadania
1. Zbuduj algorytm obliczający miejsce zerowe funkcji f(x) =x3 -3x2+ l2x-34
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
49
Rekurencja
III ELI
Wprowadzenie do rekurencji
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
50
Rekurencja
III ELI
Wprowadzenie do rekurencji
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.
Zadania
1. 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
51
Rekurencja
III ELI
Rekurencja pełna
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 algorytmu
1. Start
2. Wczytanie n
3. Wywołanie procedury rekurencyjnej odlicz dla n
4. Zakończenie
Plan procedury odlicz
1. Sprawdź warunek n=0 jeśli n!=0 to
a. Wypisz n
b. Wywołaj procedurę odlicz dla n - l
c. Wypisz n
jeśli n==0 to
a. Wypisz n
b. Zakończ procedurę
Przykład algorytmu
Zadanie
1. Przerobić procedurę z rekurencyjnej na iteracyjną
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
52
Rekurencja
III ELI
Odwracanie ciągu
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 algorytmu
1. Start
2. Wczytanie liczby n
3. Przewinięcie taśmy na początek
4 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 odlicz
1. Start procedury
2. Sprawdzenie warunku
jeśli ile>0 to
a. 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
Zadanie
1. Zbuduj procedurę rekurencyjną która będzie odwracała elementy w tablicy
2. Przerobić procedurę rekurencyjną na iterację
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
53
Rekurencja
III ELI
Funkcja rekurencyjna silnia
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 algorytmu
1. Start
2. Wczytanie liczby n
3. Wywołanie rekurencyjnej SILNIA dla n
4. Wyprowadzenie wyniku
5. Zakończenie
Z definicji funkcji silnia(0)=l, silnia(n)=n* silnia(n -l) wynika schemat rekurencyjny, parametr formalny oznaczmy jako k
Plan procedury
1. jeśli =0 to wynik funkcji 1 i koniec procedury
2. w wypadku przeciwnym wynik funkcji to k*silnia(k-1) czyli ponowne wywołanie
procedury z parametrem o jeden mniejszym k-1
3. wyjście z procedury z parametrem k*silnia
Algorytm należy wykonać w trybie krokowym z otwartym oknem śladu i zmiennych.
Przykład algorytmu
Zadania
1. Zbuduj algorytm rekurencyjny z parametrami n, k, która będzie liczyła wartość iloczynu k*(k+ 1)*... *n
2. Zbuduj algorytm realizujący symbol Newtona
n!‗‗‗‗
k!*(n - k)!
3. Zamień procedurę silnia z rekurencji na iterację
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
54
Rekurencja
III ELI
Zmiana rekurencji na iterację
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 algorytmu
1. Start
2. Wczytanie liczby n
3. Wywołanie funkcji iteracyjnej SILNIA dla n
4. Wyprowadzenie wyniku n!
5. Zakończenie
Plan działania procedury
l. przypisanie zmiennej s wartości początkowej 1
2. przewinięcie taśmy na początek
3. zapisanie na taśmie 1 (0!)
4. dla i od 1 do k
a. przypisanie s =s * i
b. zapis s na taśmie
5. wyjście z procedury z wartością zwracaną s
Przykład algorytmu
Zadania
1. Zbuduj procedurę iteracyjną obliczającą iloraz od k do n
2. Zbuduj algorytm obliczający symbol Newtona metodą iteracyjną
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
55
Rekurencja
III ELI
Kombinacje
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 algorytmu
1. Start
2. Wczytanie liczby elementów zbioru (ile)
3. Przypisanie zmiennej suma wartości 0
4. Dla i od 0 do ile
a. Wywołanie procedury nnadk
b. Zapisanie do tablicy obliczonej wartości
c. Dodanie tej wartości do zmiennej suma
5. Zapisanie do tablicy wartości zmiennej suma
6. 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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
56
Rekurencja
III ELI
Ciąg Fibonacciego
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)
Zbudujmy algorytm rekurencyjny oparty na podanej definicji.
Plan działania
1. Start
2. Wczytanie liczby n
3. Wywołanie procedury rekurencyjnej fib dla n i zwracąjącej wartość wyrn
4. Wyprowadzenie wyniku wyrn
5. Zakończenie
Plan procedury
1. Start procedury fib z parametrem k
2. Sprawdzenie czy k=l
a. Jeśli tak to zakończenie procedury z wynikiem 1
b. 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
57
Rekurencja
III ELI
Ciąg Fibonacciego
Przykład algorytmu
Zadania
1. Zbuduj algorytm obliczający elementy ciągu Fibonaciego
2. 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?
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
58
Rekurencja
III ELI
Sortowanie przez scalanie
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ład
Posortujmy następujący ciąg elementów
7
1
8
6
4
9
5
lewy + prawy
Element ś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
5
1
8
6
4
9
7
Następnie porównujemy 1 i 9 te liczby nie wymagają przestawienia, 8 i 4 należy przestawić miejscami zgodnie z początkowymi
ustaleniami.
5
1
4
6
8
9
7
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 algorytmu
1. Start
2. Wczytywanie numeru wiersza tablicy, w którym zaczyna się ciąg wpocz
3. Wczytanie numeru wiersza tablicy, w którym kończy się ciąg wkonc
4. Wywołanie procedury rekurencyjnej sort z wartościami parametrów wpocz i w konc
5. Koniec
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
59
Rekurencja
III ELI
Sortowanie przez scalanie
Plan procedury
1.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ągu
ii. Posortowanie dolnego podciągu
iii. Scalanie posortowanych podciągów
b. Jeśli nie to zakończenie procedury
3. Zakończenie procedury
Pierwsza procedura oblicza środek, druga i trzecia sortuje podciągi ostatnia scala podciągi.
Plan procedury scalanie
1. Początek procedury scalanie z parametrami pocz, srod, konc, kolumna
2. Nadanie wartości początkowej indeksom elementów pierwszego podciągu i=pocz drugiego
podciągu j=srod ciągu pomocniczego k=pocz
3. 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 l
4. 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 1
5. 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
60
Rekurencja
III ELI
Sortowanie przez scalanie
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+1
7. Zakończenie procedury scal
Plan procedury przepisz
1. Start procedury z parametrami pocz, konc, koldo,koz
2. Dla k od pocz do konc
odczytaj xk z kolumny kolz, wiersza k
zapisz xk do kolumny koldo, wiersza k
3. Zakończenie procedury
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
61
Przykładowy projekt
III ELI
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.
SPIS TREŚCI
a
b
aΛb
avb
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
<<
<
>
>>
ZAKOŃCZ
62
Przykładowy projekt
III ELI
Algorytm główny
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
1
2
3
4
5
6
7
8
9
10
11
12
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
63
Przykładowy projekt
III ELI
Plan algorytmu głównego
1. Początek algorytmu
2. Wczytanie dwóch liczb (0,1)
3. Wywołanie procedury dla koniunkcji
4. Wywołanie procedury dla alternatywy
5. Wywołanie procedury dla implikacji
6. Wywołanie procedury dla równoważności
7. Wypisanie wyniku dla koniunkcji
8. Wypisanie wyniku dla alternatywy
9. Wypisanie wyniku dla implikacji
10. Wypisanie wyniku dla równoważności
11. Zakończenie algorytmu głównego
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
64
Przykładowy projekt
III ELI
Procedura koniunkcji
1. Początek procedury: nazwa- koniunkcja: parametry x,y
2. Sprawdzenie warunku: warunek: x == 0
3. Sprawdzenie warunku: warunek: y == 0
4. Sprawdzenie warunku: warunek: y == 0
5. Koniec procedury: wyrażenie - 0
6. Koniec procedury: wyrażenie - 0
7. Koniec procedury: wyrażenie - 0
8. Koniec procedury: wyrażenie - 1
1
2
4
3
7
5
8
6
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
65
Przykładowy projekt
III ELI
Procedura alternatywy
1. Początek procedury: nazwa- alternatywa: parametry x,y
2. Sprawdzenie warunku: warunek: x == 0
3. Sprawdzenie warunku: warunek: y == 0
4. Sprawdzenie warunku: warunek: y == 0
5. Koniec procedury: wyrażenie - 0
6. Koniec procedury: wyrażenie - 1
7. Koniec procedury: wyrażenie - 1
8. Koniec procedury: wyrażenie - 1
1
2
4
3
7
Plan działania dla procedury alternatywy
5
8
6
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
66
Przykładowy projekt
III ELI
Procedura implikacji
1. Początek procedury: nazwa- implikacja: parametry x,y
2. Sprawdzenie warunku: warunek: x == 0
3. Sprawdzenie warunku: warunek: y == 0
4. Sprawdzenie warunku: warunek: y == 0
5. Koniec procedury: wyrażenie - 1
6. Koniec procedury: wyrażenie - 1
7. Koniec procedury: wyrażenie - 0
8. Koniec procedury: wyrażenie - 1
1
2
4
3
7
Plan działania dla procedury implikacji
5
8
6
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
67
Przykładowy projekt
III ELI
Procedura równoważności
1. Początek procedury: nazwa: równoważności: parametry x,y
2. Sprawdzenie warunku: warunek: x == 0
3. Sprawdzenie warunku: warunek: y == 0
4. Sprawdzenie warunku: warunek: y == 0
5. Koniec procedury: wyrażenie - 1
6. Koniec procedury: wyrażenie - 0
7. Koniec procedury: wyrażenie - 0
8. Koniec procedury: wyrażenie - 1
1
2
4
3
7
5
8
6
Plan działania dla procedury równoważności
1. 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
68
Wiadomości wstępne
IV GRAFIKA
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
69
Wiadomości wstępne
IV GRAFIKA
Wiadomości wstępne
Uruchomienie programu
Aby wejść do programu należy uruchomić:
Dysk C:\ Borland C: \Bin:\ bc.exe
Kompilator
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 klawiaturowe
File
New
- otwarcie nowego okna edycyjnego, którym możemy pisać program
Open
- otwarcie już istniejącego pliku F3
Save
- nagranie programu F2
Save as
- nagranie pod zmienioną nazwą
Save all
- nagranie wszystkiego
Quit
- wyjście z programu Alt+x
Edit
Undo
Redo
Cut
Copy
Paste
Clear
- cofniecie ostatniego polecenia Alt+BkSp
- cofnięcie ostatniego cofnięcia Shift+Alt+BkSp
- uciąć zaznaczony fragment Shift+Del
- kopiowanie zaznaczonego fragmentu Ctrl+Ins
- położenie skopiowanego fragmentu w miejscu kursora Shift+Ins
- wyczyszczenie zaznaczonego fragmentu Ctrl+Del
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
70
Wiadomości wstępne
IV GRAFIKA
Search
Find
Replace
Search again
- szukaj
- zamień
- szukaj ponownie Ctrl+L
Run
Run
Trace into
Step over
- uruchom Ctrl+F9
- śledź program z wejściem w procedury F7
- śledź program bez wchodzenia w procedury F8
Degug
Evaluate/modyfy
Watches/Add watch
- pozwala na obliczanie wyrażeń i modyfikacje zmiennych Ctrl+F4
– dodanie zmienną do okienka, pozwala na śledzenie wartości zmiennych
Window
Zoom
Cascade
Tile
Next
Close
-powiększenie okienka na cały ekran F5
-ustawienie wielu okienek kaskadowo
-umieszczenie okienek obok siebie
-przejście do następnego okienka F6
-zamknięcie okienka Alt+F3
Help
Pomoc
Topic search
Index
– F1
- podpowiedź na temat polecenia, na którym znajduje się kursor Ctrl+F1
-pojawia się lista poleceń Shift+F1
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
71
Wiadomości wstępne
IV GRAFIKA
Tryby graficzne
Tryby graficzne
Funkcje 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 tekstowy
Wykonanie 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 tekstowe
Po 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.
BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
SPIS TREŚCI
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
- czarny (0)
- niebieski (1)
- zielony (2)
- turkusowy (3)
- czerwony (4)
- karmazynowy (5)
- brązowy (6)
- jasnoszary (7)
<<
<
>
- ciemnoszary (8)
- jasnoniebieski (9)
- jasnozielony (10)
- jasnoturkusowy (11)
- jasnoczerwony (12)
- jasnokarmazynowy (13)
- żółty (14)
- biały (15)
>>
ZAKOŃCZ
72
Wiadomości wstępne
IV GRAFIKA
Podprogramy graficzne
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
73
Wiadomości wstępne
IV GRAFIKA
Podprogramy graficzne
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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
74
Wiadomości wstępne
IV GRAFIKA
Struktura programu w C++
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łkowity
drive – numer kart graficznych
DETECT – odszukaj
mode – 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 .
w tym czasie można obejrzeć rysunek oraz return 0.
SPIS TREŚCI
<<
<
>
Funkcją getch()- czeka na wciśnięcie klawisza,
>>
ZAKOŃCZ
75
Wiadomości wstępne
IV GRAFIKA
Struktura programu w C++
Przykład
# include <graphics.h>
main()
{
ciąg poleceń
closegraph ();
getch();
return 0;
}
Przykład
Program 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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
76
Wiadomości wstępne
IV GRAFIKA
Struktura programu w C++
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ład
Program 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;
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
77
Wiadomości wstępne
IV GRAFIKA
Tworzenie animacji przy użyciu strony kart graficznych
Tworzenie animacji przy użyciu strony kart graficznych
Aby stworzyć animacje przy użyciu karty graficznej należy fazy ruchu podzielić na
umieścić na odpowiedniej stronie karty graficznej.
Numery kart i trybów mogą być wyrażone za pomocą następujących symboli.
Symbol karty
CGA
MCGA
EGA
EGA64
EGAMONO
IBM8514
HERCMONO
ATT400
VGA
PC3270
- karta CGA {1}
- karta MCGA {2}
- karta EGA{3}
- karta EGA64 {4}
- karta EGAMONO {5}
- karta IBM8514 {6}
- karta HERCULES{7}
- karta ATT400 {8}
- karta VGA {9}
- karta PC3270 {10}
Symbol trybu
CGACO
CGAC1
CGAC2
CGAC3
CGAHI
MCGAC0
MCGAC1
MCGAC2
MCGAC3
MCGAMED
MCGAHI
EGALO
EGAHI
- 320 x 200,
- 320 x 200,
- 320 x 200,
- 320 x 200,
- 640 x 200,
- 320 x 200,
- 320 x 200,
- 320 x 200,
- 320 x 200,
- 640 x 200,
- 640 x 480,
- 640 x 200,
- 640 x 350,
SPIS TREŚCI
<<
4 obrazki. Każdy z obrazków należy
paleta 0 {0}
paleta 1 {1}
paleta 2 {2}
paleta 3 {3}
1 strona {4}
paleta 0 {0}
paleta 1 {1}
paleta 2 {2}
paleta 3 {3}
1 strona {4}
1 strona {5}
16 kolorów, 4 strony {0}
16 kolorów, 2 strony {1}
<
>
>>
ZAKOŃCZ
78
Wiadomości wstępne
IV GRAFIKA
EGA64LO
EGA64HI
EGAMONOHI
HERCMONOHI
ATT400C0
ATT400C1
ATT400C2
ATT400C3
ATT400MED
ATT400HI
VGALO
VGAMED
VGAHI
PC3270HI
IBM8514LO
IBM8514HI
SPIS TREŚCI
Tworzenie animacji przy użyciu strony kart graficznych
- 640 x 200, 16 kolorów, 1 strona {0}
- 640 x 350, 4 kolory, 1 strona {1}
- 640 x 350, 64 K na karcie, 1 strona {3}
256 K na karcie, 2 strony {3}
- 720 x 348, 2 strony {0}
- 320 x 200, paleta 0 {0}
- 320 x 200, paleta 1 {1}
- 320 x 200, paleta 2 {2}
- 320 x 200, paleta 3 {3}
- 640 x 200, 1 strona {4}
- 640 x 400, 1 strona {5}
- 640 x 200, 16 kolorów, 4 strony {0}
- 640 x 350, 16 kolorów, 2 strony {1}
- 640 x 480, 16 kolorów, 1 strona {2}
- 720 x 350, 1 strona {0}
- 640 x 480, 256 kolorów
- 1024 x 768, 256 kolorów
<<
<
>
>>
ZAKOŃCZ
79
Wiadomości wstępne
IV GRAFIKA
Tworzenie animacji przy użyciu strony kart graficznych
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);
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
80
Wiadomości wstępne
IV GRAFIKA
Tworzenie animacji przy użyciu strony kart graficznych
Przykład
Wykorzystanie 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();
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
81
Wiadomości wstępne
IV GRAFIKA
Style tekstu w trybie graficznym
Style tekstu w trybie graficznym
outtextxy - (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_DIR
1 – pionowo VERT_DIR
Style
DEFAULT_FONT
0
TRIPLEX_FONT
1
SMALL_FONT
2
SANS_SERIF_FONT
3
GOTHIC_FONT
4
Przykł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;
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
82
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
Funkcja getimage i putimage
getimage
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ład
Zapamię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();
Uwagi
clearviewport();
System musi być w trybie graficznym.
putimage(0, 0, Ref, COPY, PUT);
Zaleca się aby rozmiar obszaru był określony za pomocą funkcji imagesize.
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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
83
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
putimage
Umieszczenie obrazu na ekranie. Umieszczenie na ekranie prostokątnego obrazu graficznego zapamiętanego w uprzednim obszarze
pamięci wskazanej przez Bitmap
Wykonanie 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ątek
Jeż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 mor
XOR_PUT
– operacja xor {1}
OR_PUT
– operacja or{2}
AND_PUT
– operacja and {3}
NOT_PUT
– operacja not {4}
Cleardevice – wyczyszczenie ekranu graficznego
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
84
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
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 10
void 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=0
y=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())
{
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
85
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
POZIOMO
{
putimage (X+40,40, arrow, XOR_PUT);
x+=ARROW_SIZE;
if (x>=getmax()/2)
max=0
putimage (x+40,40 arrow, XOR_PUT);
delay (500);
}
PIONOWO
{
putimage (40,y+40, arrow, XOR_PUT);
y+=10;
if (y>=480)
y=0
putimage (40,y+40, arrow, XOR_PUT);
delay (500);
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
86
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
PO SKOSIE
{
putimage (x+40,X+40 arrow, XOR_PUT);
x+=ARROW_SIZE;
if (x>=max)
X=0
putimage (x+40,X+40 arrow, XOR_PUT);
delay (500);
}
}
free (arrow);
closegraph();
return 0;
}
Przykład
Program 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;
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
87
Wiadomości wstępne
IV GRAFIKA
Funkcja getimage i putimage
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;
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
88
Wiadomości wstępne
IV GRAFIKA
Tworzenie linii użytkownika
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 linestyle
SOLID_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}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
89
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
Przerwania – wykorzystanie
Przerwanie 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 0H
Powoduje inicjację myszki, ustawienie przycisków na dwa, określa
współ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 01H
Funkcja wyświetla kursor, wywołanie polega na wpisaniu do AX wartości 1.
Funkcja 2H
Odpowiedzialna 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 3H
Odpowiada 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.
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
90
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
Funkcja 4H
Powoduje 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 05H
Odczytuje 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 6H
Odczytanie 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 7H
Ustawia 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 8H
Ustawia minimalną i maksymalną pozycję kursora.
Wywołanie AX=8
CX – wpisujemy minimalną współrzędną pionową
DX – wpisujemy maksymalną współrzędną pionową
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
91
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
Funkcja 9H
Ustawienie 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 0BH
Zwraca 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 0CH
Pozwala 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
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
92
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
Funkcja 0DH
Włą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=13
Funkcja 0EH
Powoduje włączenie trybu emulacji pióra świetlnego.
Wywołanie AX=14
Funkcja 0FH
Ustalenie 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 poziomej
16 – dla czułości w osi pionowej
Wywoł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 Y
Funkcja 10H
Powoduje zaniechanie wyświetlenia kursora,
Wywołanie AX=16
CX – współrzędna x górnego lewego obszaru
DX – współrzędna y górnego lewego obszaru
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
93
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
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;
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
94
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
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 ”,
*/
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
95
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
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
int 33 h
mov AX, 1
int 33 h
// zainicjowanie myszy
// wyświetlenie kursora
}
}
while ( ! (x <= 50 && y <= 200 && p == 1))
{
asm
{
mov AX, 3h // odczytanie stanu przycisków i
położenia myszy
INT 33h
MOV p, BX
MOV x, CX
MOV y, DX
// przyciski
// współrzędne x
// współrzędne y
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
96
Wiadomości wstępne
IV GRAFIKA
Przerwania - wykorzystanie
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 ();
}
}
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
97
Wiadomości wstępne
IV GRAFIKA
void myszka(void)
{
unsigned int x, y, p;
asm
Przerwania - wykorzystanie
{
mov AX, 0
int 33 h
mov AX, 1
int 33 h
// zainicjowanie myszki
// wyświetlenie kursora
}
}
p=0
while (( p == 0 ))
{
asm
{
MOV AX, 3h // odczytanie stanu przycisków I położenia myszy
INT 33h
MOV p, BX
// przyciski
}
gotoxy (20,20);
printf (” wciśnij myszkę ”);
}
}
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
98
Przykładowy projekt
IV GRAFIKA
Przykładowy projekt
Projekt 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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
99
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
100
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
101
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
102
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
103
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
104
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
105
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
106
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
107
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
108
Przykładowy projekt
IV GRAFIKA
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 !!!");
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
109
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
110
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
111
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
112
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
113
Przykładowy projekt
IV GRAFIKA
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);
SPIS TREŚCI
<<
<
>
>>
ZAKOŃCZ
114
Przykładowy projekt
IV GRAFIKA
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
115
V ZARZĄDZANIE BAZAMI DANYCH
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
116
V ZARZĄDZANIE BAZAMI DANYCH
Stałe - liczby, znaki i ciągi ...
Stałe - liczby, znaki i ciągi znaków, nazwy, słowa kluczowe
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 liczb
Liczby 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ów
W 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
117
V ZARZĄDZANIE BAZAMI DANYCH
Stałe - liczby, znaki i ciągi ...
Pełne zestawienie słów kluczowych języka C++
Słowa kluczowe języka C++
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
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
118
Typy danych – typy zmiennych
V ZARZĄDZANIE BAZAMI DANYCH
Zmienna jest obiektem, któremu można przypisywać wartości. Dana przypisana do zmiennej będzie przez nią reprezentowana w
programie.
Typy danych
Długość
Typ
unsigned char
char
enum
unsigned int
short int
int
unsigned long
long
float
double
long double
Zakres
8 bits
8 bits
16 bits
16 bits
16 bits
16 bits
32 bits
32 bits
32 bits
64 bits
80 bits
0
-128
-32,768
0
-32,768
-32,768
0
-2,147,483,648
3.4 * (10**-38)
1.7 * (10**-308)
3.4 * (10**-4932)
to
to
to
to
to
to
to
to
to
to
to
255
127
32,767
65,535
32,767
32,767
4,294,967,295
2,147,483,647
3.4 * (10**+38)
1.7 * (10**+308)
1.1 * (10**+4932)
Deklarowanie zmiennych
W zależności od typu danej, jaki zmienna będzie reprezentować, należy odpowiednio zadeklarować zmienną, np.:
short x – deklaracja zmiennej x typu short
int 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 zmiennym
int a = 7;
char b = ’a’;
float c = 7.23;
long d = 7;
W ten sposób przypisujemy wartości zmiennych.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
119
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
120
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
Zmiennej można przypisać wartości o różnych systemach liczbowych np.
y=7
zmienna y ma przypisaną wartość w systemie dziesiętnym
z=0xc00
zmienna z ma przypisaną wartość w systemie heksadecymalnym
x=041
zmienna x ma przypisaną wartość w systemie ósemkowym
Istnieje 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 typach
W 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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
121
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
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ści
main()
{
int x;
int y;
int z;
unsigned adres;
char literka;
x=-15;
//przypisanie zmiennej x wartości -15
y=0234;
//przypisanie zmiennej y wartości oktalnej 0234
z=0xad;
//przypisanie zmiennej wartości hexadecymalnej 0xAD
adres=0xFF; //przypisanie zmiennej adres wartości 0xFF
literka=’a’;
//przypisanie zmiennej literka znaku a
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
122
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
123
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
Przykład
Przypisanie może być bardzo elastyczne, oto przykład.
//konwersja typów
main()
{
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
124
V ZARZĄDZANIE BAZAMI DANYCH
Typy danych – typy zmiennych
Struktura programu
Program 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łkowitych
clrscr();
/*czyszczenie ekranu*/
cout<<”Podaj dane a=”;
//wyświetlenie napisu Podaj dane a=
cin>>a;
//wczytanie wartości a
cout<<”Podaj b=”<<endl;
/*wyświetlenie napisu Podaj dane b= i przejście
do drugiej linii*/
cin>>b;
//wczytanie wartości b
k=5;
//przypisanie zmiennej k wartości 5
cout<<”a=”<<setw(k)<<a<<” b=”<<setw(10)<<b<<endl;
getch();
return 0;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
125
V ZARZĄDZANIE BAZAMI DANYCH
Wyprowadzenie danych na ekran
Wyprowadzenie danych na ekran
Funkcja 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
126
V ZARZĄDZANIE BAZAMI DANYCH
Wyprowadzenie danych na ekran
Przykład
Poniż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();
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
127
V ZARZĄDZANIE BAZAMI DANYCH
Wyprowadzenie danych na ekran
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
128
V ZARZĄDZANIE BAZAMI DANYCH
Wczytywanie danych z klawiatury
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.
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 );
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 ).
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
129
V ZARZĄDZANIE BAZAMI DANYCH
Wczytywanie danych z klawiatury
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
130
V ZARZĄDZANIE BAZAMI DANYCH
Operatory 2 - argumentowe
Operatory 2 – argumentowe
Jeś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)
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
131
V ZARZĄDZANIE BAZAMI DANYCH
Operatory 2 - argumentowe
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
-preinkrementacja
a++
-postinkrementacja
--a
-predekrementacja
a--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 Sizeof
Innym 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.
SPIS TREŚCI
ZAKOŃCZ
<<
<
>
132
V ZARZĄDZANIE BAZAMI DANYCH
Operator warunkowy
Operator warunkowy
Operator warunkowy osiada trzy argumenty, ogólna postać wygląda następująco
wartość = ((a>b) ? True : False)
lub
warunek
? wartość wyrażenia, jeżeli warunek jest prawdziwy
: wartość wyrażenia, jeżeli warunek jest fałszywy
Zmienna 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
133
V ZARZĄDZANIE BAZAMI DANYCH
Kolejność wykonywania działań
Kolejność wykonywania działań
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
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
134
V ZARZĄDZANIE BAZAMI DANYCH
Kolejność wykonywania działań
<
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
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
135
V ZARZĄDZANIE BAZAMI DANYCH
Kolejność wykonywania działań
^=
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/6
A= 2 +++ 3
A= !4 + – – 2
A= 4 + !2 +++ 3
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
136
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
Instrukcje
Instrukcja 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;
else
instrukcja 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 prawdziwy
else
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
137
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
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();
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
138
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
139
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
else
{
x1=(-b-sqrt(delta))/(2*a);
cout<<’’x1=’’<<x1<<endl;
x2=(-b+sqrt(delta))/(2*a);
cout<<’’x2=’’<<x2<<endl;
//dwa pierwiastki równania
}
getch();
return 0;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
140
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
Instrukcja SWITCH
Jest 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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
141
V ZARZĄDZANIE BAZAMI DANYCH
Instrukcje
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
142
V ZARZĄDZANIE BAZAMI DANYCH
Pętle
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
FOR
WHILE
WHILE (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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
143
V ZARZĄDZANIE BAZAMI DANYCH
Pętle
DO…WHILE
Jej 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ład
Poniż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);
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
144
V ZARZĄDZANIE BAZAMI DANYCH
Pętle
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 i
i<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ąg
Liczb 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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
145
V ZARZĄDZANIE BAZAMI DANYCH
Pętle
Przykład
Inny przykład z zastosowaniem pętli to wyświetlanie znaków o określonych kodach
ASCII, 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
146
V ZARZĄDZANIE BAZAMI DANYCH
Funkcje
Funkcje
Funkcje 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ę funkcji
w nawiasach typ i nazwę danych pobieranych przez funkcję
ciało funkcji
Przykład
float 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*z
i pobierać trzy zmienne:
zmienną k, która jest typu znakowego,
zmienną b typu całkowitego,
zmienną z typu rzeczywistego
Instrukcja 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
147
V ZARZĄDZANIE BAZAMI DANYCH
Funkcje
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ład
Poniższy program przedstawia funkcję abs();
#include<stdio.h>
#include<conio.h>
#include<iostream.h
int abs(int a);
main()
{
cout << abs (-3)<<endl;
cout<< abs (3)<<endl;
getch();
return 0;
}
int abs (int a)
{
return (a>0 ? a: -a );
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
148
V ZARZĄDZANIE BAZAMI DANYCH
Funkcje
Przykład
Poniższy program przedstawia funkcję signum();
#include<stdio.h>
#include<conio.h>
#include<iostream.h
int 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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
149
V ZARZĄDZANIE BAZAMI DANYCH
Rekurencja
Rekurencja
Polega 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 cyfra
while ((nowa /=10)>0);
// nowa liczba
// wypisanie cyfr liczby
while (--i>=0)
cout<<setw(4)<<pom[i];
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
150
V ZARZĄDZANIE BAZAMI DANYCH
Zmienne globalne i lokalne
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ład
int k;
main()
{
//zmienna k jest typu globalnego
int b;
//zmienna b jest typu lokalnego
cout<<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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
151
V ZARZĄDZANIE BAZAMI DANYCH
Zmienne globalne i lokalne
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 ...
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
152
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
Tablice
Tablica 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 tablica
Float 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
153
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
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;
cout<<tab[1]<<endl;
cout<<tab[2]<<endl;
tab[0]=-1;
tab[1]+=20;
tab[2]>>=1;
cout<<tab[0]<<endl;
cout<<tab[1]<<endl;
cout<<tab<<[2]<<endl;
cout<<tab[3]<<” element poza zakresem;
getch();
return 0;
}
// wypisanie wartości
// tablicy na ekranie
// zmiana danych
// elementów tablicy
// wyświetlenie nowych
// wartości tablicy
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
154
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
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();
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
155
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
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);
printf(„%c”,1[tab]);
printf(„%c”,0[tab]);
getch();
}
/* wydruk tablicy jako ciągu znakowego */
/* wydruk pojedynczego elementu tablicy */
/* indeksowanie tablicy jest przemienne */
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żna
w 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
156
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
157
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
Operacje na tablicach
Aby 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 tablicy
for(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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
158
V ZARZĄDZANIE BAZAMI DANYCH
Tablice
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 tablicy
for(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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
159
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
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 adresu
Operator 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 wydobycia
Jest 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
160
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
Tablica a wskaźnik
W 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ąco
int 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 tablicy
wtab = tab;
// przypisanie adresu pierwszego elementu tablicy
Łańcuchy znakowe i wskaźnik
W 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’).
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
161
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
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ę n
char tab [ ]=”dowolny ciąg znaków ”;
int i, n;
i=0;
n=1000;
//liczba kodowa
printf(” 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
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
162
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
Funkcje znakowe
Dołą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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
163
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
164
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
165
V ZARZĄDZANIE BAZAMI DANYCH
Struktura
Struktura
W 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ład
Poniższy program obrazuje zastosowanie struktury, której wartość jest przypisywana
w momencie deklaracji
struct
/* 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] );
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
166
V ZARZĄDZANIE BAZAMI DANYCH
Unia
Unia
Podobnie 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ób
unia1 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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
167
V ZARZĄDZANIE BAZAMI DANYCH
Unia
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;
char *imię;
short płeć;
union
{
char *naz_pan;
short wojsko;
}
dane;
/* 2 bajty */
/* 2 bajty */
/* 1 bajt: 1- kobita, 0- mężczyzna */
/* brak etykiety unii */
/* 2 bajty */
/* 1 bajt: 0- przedpob. , 1- rez. */
}
osoba;
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
168
V ZARZĄDZANIE BAZAMI DANYCH
Wskaźniki do struktur
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 int
powoduje 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 0
spacja (ch)
char ch;
{
if (ch= ‘ ’)
return TRUE;
else
return FALSE;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
169
V ZARZĄDZANIE BAZAMI DANYCH
Dołączenie pliku # include
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 ).
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
170
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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>
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
171
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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 pliku
plik_dane. close();
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
172
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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 pliku
ala.txt
fclose (str);
// zamknięcie pliku ala.txt
str=fopen (”ala.txt“, “r“);
//otwarcie pliku ala.txt do czytania
while ((k=getc (str))!=EOF)
//sprawdzenie czy to koniec pliku
{
putc(k,str);
// wypisywanie znak po znaku na ekran
if (!isdigit(k))
// jeśli nie cyfra to zatrzymaj
break;
}
ungetc(k , str);
// umieść ponowniew buforze
printf (” \n”);
while ((k=getc(str))!=EOF)
// jeśli nie koniec pliku
putc(k,stdout);
// to wyświetlaj na ekranie
fclose (str);
// zamknij plik
getch ();
return 0;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
173
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
174
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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”);
for (i=0; i<19; i ++)
putc (znak [i ] ,stdout);
for (i=0; i<19; i++)
putc (znak [i ],strumien);
fclose(strumien);
getch();
return 0;
}
SPIS TREŚCI
<<
//otwarcie pliku do zapisu
//wyprowadzenie na ekran
//wyprowadzenie do pliku
//zamkniecie pliku
<
>
ZAKOŃCZ
175
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
176
Praca z plikami (zapis, odczyt)
V ZARZĄDZANIE BAZAMI DANYCH
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+ “);
if (str!=0)
while(*znaki)
//otwieranie pliku ala . txt do zapisu
putc(*znaki++,str);
//umieszczanie znaków w pliku ala . txt
//zamknięcie pliku ala . txt
//otwarcie pliku ala . txt do czytania
//sprawdzenie czy to koniec pliku
fclose (str);
str=fopen(” ala .txt ”,” r ”):
while ((k=getc(str))!=EOF)
{
putc(k,stdout);
if (!isdigit(k)
//wypisywanie znak po znaku na ekran
//jeśli nie cyfra to zayrzymaj
break;
}
//umieść spowrotem w buforze
ungetc(k,str);
printf (” \n ”);
while ((k=getc(str))!=EOF)
putc (k,stdout);
fclose (str);
getch();
return ;
//jeśli nie koniec pliku
//to wyświetlaj na ekranie
//zamknij plik
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
177
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
Przykład 5
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
char z=’z’;
char a,z1;
main()
{
clrscr();
FILE *strumien
strumien=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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
178
Praca z plikami (zapis, odczyt)
V ZARZĄDZANIE BAZAMI DANYCH
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
179
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
180
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
181
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
182
V ZARZĄDZANIE BAZAMI DANYCH
Praca z plikami (zapis, odczyt)
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 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;
// zamkniencie pliku
plik_dane.close();
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
183
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 20
struct ident {
char imiepier[DLTEKST], imiedrug[DLTEKST], nazwisko[DLTEKST];
};
struct data {
int dzień, miesiąc, rok;
char miejsce[DLTEKST];
};
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
184
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
struct adresprac {
int kod;
char miejscowość[DLTEKST], ulica[DLTEKST];
nt numer, mieszkanie, telefon;
};
struct pracownik {
ident nazw;
data urodz;
adresprac adres;
};
//prototypy funkcji
int 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ów
pracownik *twsk[DLBAZA];
int n, koniec;
char wybór;
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
185
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
// 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 pliku
n = Odczytaj (twsk);
cout << ” Baza danych zawiera ” << n << ”pracowników ” << endl;
//utworzenie menu
koniec=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;
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
186
Przykładowy projekt
V ZARZĄDZANIE BAZAMI DANYCH
// wczytanie znaku sterującego wyborem
cin >> wybór;
switch (wybór) {
case ‘p’:
Wszyscy (n, twsk);
Break;
// wszyscy pracownicy
case ‘n’:
if (n < DLBAZA) {
n = CzytajInform (n, twsk); // nowy pracownik
}
break;
case ‘d’:
PracWyświetl (n, twsk);
break;
// konkretny pracownik
Wiek (n, twsk);
break;
// pracownicy w danym wieku
case ‘w’:
case ‘z’:
Zamieszk (n, twsk);
break;
// zamieszkali przy danej ulicy
case ‘u’:
Usuń (n, twsk);
break;
// usunięcie pracownika
Zapisz (n, twsk);
koniec = 0;
break;
// zapisanie informacji do pliku
case ‘q’:
}
} while (koniec);
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
187
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 instrukcji
ifstream 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 odczytu
ifstream plik_prac ( ” BAZA.DAT ” );
// jeśli są dane w pliku
if ( plik_prac.read ((char *) &n, sizeof (int )))
for ( i=0; i<n; i++) {
// utworzenie nowej zmiennej dynamicznej typu pracownik
twsk[ i ] = new pracownik;
// wczytanie wartości jednej zmiennej
plik_prac.read (( char *) twsk[ i ], sizeof ( pracownik ));
}
else
n = 0;
plik_prac.close ();
// zamknięcie pliku
return n;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
188
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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
if (! plik_prac.write ((char *) twsk[i],
sizeof (pracownik)) )
w sposób następujący:
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
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
189
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
{
int i;
// otworzenie pliku do zapisu
ofstream plik_prac („BAZA.DAT”);
// zapisanie do pliku liczby n
plik_prac.write ((char *) &n, sizeof(int));
// zapisanie do pliku n zmiennych strukturalnych
for (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
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
190
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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.
Konstrukcja
twsk [nr-1] – >nazw.nazwisko
jest zwartym zapisem następującej
*twsk [nr-1].nazw.nazwisko
a 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 tablicy
if (n>1) {
// jeśli jest co najmniej dwóch pracowników
// znalezienie odpowiedniego miejsca
while (( 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
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
191
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 pracownik
nowy = new pracownik;
// wczytanie danych
cout <<”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;
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
192
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 miejsce
Wstaw (n, twsk, nowy);
// funkcja podaje aktualną liczbę pracowników
return 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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
193
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
194
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 tekst
wynik = Wyszukaj (n, tekst, twsk );
if (wynik ! = -1)
WyświeltStrukt (twsk [ wynik ] );
else
cout << ” Pracownika o podanym nazwisku nie ma w bazie ” <<endl;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
195
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
196
V ZARZĄDZANIE BAZAMI DANYCH
Przykładowy projekt
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 tekst
wynik = 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 - -;
cout << ” INFORMACJE USUNIĘTO !!! ” <<ENDL;
}
// zmniejszenie liczby pracowników
else
cout << “ Pracownika o podanym nazwisku nie ma ” << ” w bazie ”<<endl;
}
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
197
V ZARZĄDZANIE BAZAMI DANYCH
Najczęstsze błedy podczas ...
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
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
198
V ZARZĄDZANIE BAZAMI DANYCH
•
•
•
•
•
•
•
•
•
•
•
Uwagi i wnioski / Bibloigrafia
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 wnioski
Niniejsza 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.
Bibliografia
1.
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.
SPIS TREŚCI
<<
<
>
ZAKOŃCZ
199
Autorki pracy:
2004/2005
SPIS TREŚCI
ZAKOŃCZ