Wstęp do prgramowania

Wstęp do prgramowania

Wprowadzenie do programowania dr in. Zbigniew Wesoowski [email protected] Cel przedmiotu Podstawowym celem przedmiotu jest nauczy podstaw programowania strukturalnego z jzyku C. Wybrane zagadnienia z programu przedmiotu Pojcia podstawowe technik programowania Elementarne wprowadzenie do algorytmiki Zasada dekompozycji i abstrakcji

Typy danych w C Instrukcje jzyka C Liniowe struktury danych Funkcje Rekursja Strumienie i pliki Bezporednie powizania przedmiotu z innymi przedmiotami Algorytmy i struktury danych Programowanie obiektowe Programowanie wspbiene Bazy danych Systemy operacyjne i jzyk C Technologie portali internetowych

Literatura obowizkowa Kernigham B.W., Ritchie D.M. (2003): Jzyk ANSI C. WNT, Warszawa. Delannoy C. (1993): wiczenia z jzyka C. WNT, Warszawa. Kernigham B.W., Pike R.(2002) : Lekcja programowania. WNT, Warszawa. Lippman S.B., Lajoie J.(2001): Podstawy jzyka C++. WNT, Warszawa. Tondo C.L., Leung B.P.(2003): Jzyk ANSI C. wiczenia i rozwizania. WNT, Warszawa. Tondo C.L., Leung B.P.(2001): Podstawy jzyka C++. wiczenia i rozwizania. WNT, Warszawa. Wirth N.(2002): Algorytmy + struktury danych = programy. WNT, Warszawa. Literatura zalecana

Drozdek A., Simon D. L. (1996): Struktury danych w jzyku C. WNT, Warszawa. Knuth D.E. (2002): Sztuka programowania. Tomy 1,2,3. WNT, Warszawa. Hunt A., Thomas D. (2002): Pragmatyczny programista. Od czeladnika do mistrza. WNT, Warszawa. Stroustrup B. (2000): Jzyk C++. WNT, Warszawa. Borowik W., Borowik B. (2001): Meandry jzyka C++. MIKOM, Warszawa. Lippman S.B.: Model obiektu w C++. WNT, Warszawa. Bentley J. (2001): Pereki oprogramowania. WNT, Warszawa. Literatura dla zawansowanych Meyers S.(1998): Jzyk C++ bardziej

efektywny. WNT, Warszawa. Lippman S.B. (1999): Model obiektu w C+ +. WNT, Warszawa. Plauger P.J.(1997): Biblioteka standardowa C++. WNT, Warszawa. B.Stroustrup (1997): Projektowanie i rozwj jzyka C++. WNT, Warszawa. Sutter H.(2002): Wyjtkowy jzyk C++. WNT, Warszawa. Dwugos o C/C++ Jzyki programowania dziel si na takie, ktre wszyscy krytykuj, oraz takie, ktrych nikt nie uywa. Przypisywane Bjarne Stroustrupowi W C kodujemy nasze wasne bdy,

natomiast w C++ moemy je odziedziczy. Przypisywane prof. G.Karamowi z Uniwersytetu w Carleton: Dlaczego C? W jzykach C i C++ zapisano niemal wszystkie liczce si w wiecie systemy operacyjne i ich oprzyrzdowanie programowe. Andrew Tanenbaum wrcz stwierdza: oprogramowanie podstawowe pisze si w C (...real operating systems are often written in C, rarely in Modula 2 and never in Pascal [A.S.Tanenbaum, Modern Operating Systems, s.36. Englewood Cliffs, NJ, Prentice-Hall 1992]). Pojcia podstawowe

Nauka NAUKA, w polskiej tradycji, to przyswajanie jakichkolwiek treci (wiedzy), nabywanie umiejtnoci oraz to, czego si uczy lub naucza. W krajach zachodnioeuropejskich, angielskie i franc. science wywodzce si z ac. scientia (scio 'wiem') to wiedza poddana ustalonym wymaganiom treciowym i metodologicznym, ale niekoniecznie przeznaczona do nauczania. W jzykach i kulturach pozaeuropejskich nauka moe mie cakiem inne okrelenia, ktre do nas nie dotary ze wzgldu na bariery kulturowe.

Dziedziny i dyscypliny naukowe Nauk dzielimy na dziedziny nauki nauki techniczne nauki matematyczne, nauki przyrodnicze, nauki spoeczne, .... Dziedziny dzielimy na dyscypliny naukowe.

nauki techniczne Architektura Budowa maszyn Inynieria ldowa Informatyka .... Informatyka Informatyka (ang. computer science, informatics) jest to dyscyplina naukowa w dziedzinie

nauk technicznych zajmujca si gromadzeniem, przechowywaniem, przetwarzaniem i wizualizacj informacji za pomoc elektronicznych maszyn cyfrowych. Informacja (Encyklopedia PWN) INFORMACJA [ac.] to obiekt abstrakcyjny, ktry w postaci zakodowanej ( dane) moe by przechowywany (na noniku danych), przesyany (np. gosem, fal elektromagnetyczn, prdem elektrycznym), przetwarzany (w trakcie wykonywania algorytmu) i uyty do sterowania (np. komputerem steruje program, bdcy zakodowan

informacj). Definicja informacji stosowana w teorii informacji Informacja to miara niepewnoci zajcia pewnego zdarzenia spord skoczonego zbioru zdarze moliwych. Informacja Informacja jest pojciem pierwotnym, pynnym i otwartym na wiele rnorodnych interpretacji. Jedn z najbardziej oglnych definicji tego pojcia przedstawili Schizias i Lochovsky. Wedug nich informacja

to kady czynnik zwikszajcy zasb naszej wiedzy. Dane Dane to skwantyfikowana, mierzalna informacja. Instancja Instancja (ang. instance), zwana te wystpieniem, jest nazwanym obszarem pamici operacyjnej. Termin ten wyraa zwizek konkretnego bytu z jego definicj (deklaracj) lub typem. Zmienna W informatyce zmienna to opatrzony ustalon,

jednoznaczn nazw instancja, ktrej mog by nadawane (przypisywane) rne wartoci okrelonego typu (np. liczbowe, logiczne). Zasig zmiennej Zasig zmiennej (ang. variable scope) okrela miejsce i czas, w ktrych moliwe jest odczytanie wartoci zmiennej i jej modyfikacja. Wyrnia si dwie techniki okrelania zasigu zmiennych: Technika statycznego okrelania zasigu Technika dynamicznego okrelania zasigu Statyczny zasig zmiennej W technice statycznej, zasig zmiennej wynika z umiejscowienia jej nazwy w programie. Przykadowo, jeli

nazwa zmiennej zostanie umiejscowiona w pewnej funkcji, to jej zakres dotyczy tylko tej funkcji i funkcji w niej zagniedonych. Przykad int a; // zmienna globalna o zasigu statycznym int f(void) { int b; // zmienna lokalna o zasigu statycznym return 0; } Dynamiczny zasig zmiennej Dynamiczne okrelenie zasigu zmiennej polega na czasowym przesoniciu nazwy zmiennej o zasigu statycznym. Przykad

int a; // zmienna globalna o zasigu leksykalnym int f(void) { int a; // zmienna lokalna o zasigu dynamicznym return 0; } Nazwy zmiennych w programie Dobrze jest stosowa rzeczowniki dla oznaczania nazw wszelkich danych (np. licznik), czasowniki dla funkcji i procedur (np. dziel, dodaj), przymiotniki dla zmiennych logicznych (np. prawdziwy). Jednolite nazwy s mao czytelne. Najlepiej jest uywa nazw, ktre co oznaczaj, powiadamiajc tym samym uytkownika (intencjonalnie) o moliwociach funkcji, czy te wskazujc sens

zmiennych, itd. Nazwy bardzo dugie, chocia mog by komunikatywne, s mao praktyczne jeli nie stosujemy wyrnie takich jak due litery czy podkrelenie (underscore) np. nazwa dodajdwieliczby jest mniej czytelna od nazwy DodajDwieLiczby lub od nazwy dodaj_dwie_liczby. Wielkoci stae Naley nadawa nazwy wielkociom staym (wykorzystujc np. kwalifikator const ), a szczeglnie tzw. liczbom magicznym (np. rozmiary tablic). Oprogramowanie Oprogramowanie (ang. software) to zestaw instrukcji oraz danych przeznaczonych do wykonania dla komputera. Oprogramowanie wystpuje w dwch postaciach:

posta rdowa, przeznaczona do przygotowania i obrbki przez ludzi, gwnie programistw posta binarna, przeznaczona do wykonywania przez komputery, cho uytkownikiem jej dziaania moe rwnie by czowiek Programy przeksztacajce oprogramowanie z postaci rdowej na binarn to kompilatory. Niektre oprogramowanie, np. napisane w caoci w jzykach interpretowanych, moe wystpowa tylko w jednej postaci, speniajcej oba zadania. Czym jest programowanie? Programowaniem nazywamy cig wszystkich czynnoci zwizanych z rozwizywaniem problemw przy uyciu komputera.

Historia jzykw programowania Fortran Algol LISP 1960 Simula 1970 Pascal 1980 C Ada

Object Pascal 1990 C++ Ada 95 Smalltalk72 Prolog Smalltalk76 Objective C Eiffel

Java Przyczyny zrnicowania jzykw programowania Nowe osignicia sprztowe, np. komputery wieloprocesorowe umoliwiajce rwnolege i wspbiene wykonywanie programw Nowe i zrnicowane dziedziny zastosowa. Wprowadzenie do notacji Backusa-Naura (BNF- Backus-Naur Form) Notacja BNF Notacja Backhusa-Naura jest formalizmem pozwalajcym wyrazi

zarwno skadni, tzn. zasady budowania sw i zda jak rwnie semantyk, tzn. zasady interpretacji rnorodnych konstrukcji sucych m.in. do definiowania jzykw programowania. W notacji BNF kada konstrukcja jzyka, zwana kategorii skadniowa, jest opisana za pomoc reguy lub kilku regu. Reguy BNF maj nastpujc posta skadajc si z czterech czci (wliczajc znak rwnoci i kropk): LHS = RHS. LHS (lewa strona reguy, ang. left-hand side) jest symbolem sownym oznaczajcym nazw definiowanej kategorii skadniowej. Z kolei RHS (right-hand side) jest cigiem skadajcym si z symboli reprezentujcych rne kategorie definiowanego jzyka, z tak zwanych symboli terminalnych ujtych w cudzysowy, oraz z wymienionych niej operatorw BNF. Prawa strona reguy okrela form, jak mog przyjmowa definiowana kategoria skadniowa (jeli wystpuje dla niej kilka rnych regu, to moe ona przyj dowoln z okrelonych przez te reguy postaci).

Operatory BNF Operatory BNF mogce wystpowa w prawej stronie regu (RHS) s nastpujce: alternatywa - zapisana symbolem | oznacza, e konstrukcja moe wystpi w jednej dwch, lub wicej, form; konkatenacja - operator domylny, przyjmowany w przypadku cigu symboli wypisanych jeden po drugim, oznacza, e definiowana konstrukcja moe przyj form bdc tak sekwencj form reprezentowanych przez te symbole; opcja - zapisana nawiasami kwadratowymi [ ] oznacza, e zawarto tych nawiasw moe wystpi w caoci lub w ogle nie wystpi w opisywanej formie; powtrzenie - zapisane nawiasami klamrowymi { }, oznacza, e zawarto tych nawiasw moe wystpi w caoci powtrzona dowoln ilo razy (0 lub wicej); grupowanie - zapisane zwykymi nawiasami ( ) nie ma

adnego specjalnego znaczenia w reguach BNF i suy w nich do zmiany interpretacji RHS ze wzgldu na priorytety operatorw. Przykad Liczba cakowita. Poniszy zestaw regu BNF okrela pojcie liczby cakowitej. Liczba_calkowita = [znak-liczby] liczba_calkowita_bez_znaku. znak-liczby = + | - . liczba_calkowita_bez_znaku = ciag_cyfr. ciag_cyfr = cyfra {cyfra}. cyfra = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9. Przykady liczb cakowitych: 0; +123; -45.

Przykad Liczba zmiennopozycyjna. Poniszy zestaw regu BNF okrela pojcie liczby zmiennopozycyjnej. liczba_ zmiennopozycyjna = [znak_liczby] liczba_ zmiennopozycyjna _bez_znaku. liczba_ zmiennopozycyjna_bez_znaku = liczba-calkowita-bez-znaku . ciag-cyfr [ e mnoznik_skalujacy ] | liczba_calkowita_bez_znaku e. mnoznik-skalujacy . mnoznik-skalujacy = liczba_calkowita . Przykady liczb rzeczywistych: 0.0; +1.23; 4e5; -0.025e-5.

Forma i znaczenie Zwrmy uwag w powyszych przykadach regu BNF na fakt, e do obydwu kompletach regu zaczone s, wyjanienia sowne sensu tych regu. Same reguy wyjaniaj, tylko form, nie dotycz za w aden sposb znaczenia. Taka jest rola gramatyki okrela ona poprawn form zda jzyka, lecz nie daje informacji, ktre zdania s sensowne, a ktre nie, i jakie jest ich znaczenie. Jednym z czsto przytaczanych przykadw zdania ilustrujcego to zjawisko jest: Bezbarwne zielone pomysy pi wciekle. Zdanie to, jakkolwiek niezrozumiae i bezsensowne, jest cakowicie poprawne i zgodne z gramatyk jzyka polskiego. Diagramy syntaktyczne

Identyfikator Przykady: litera A A1 Mnoznik litera cyfra Litera Przykady: a b A

B a b .... Z _ Cyfra Przykady: 0 9 0 1 ....

8 9 Paradygmaty programowania Najwaniejsze paradygmaty programowania W celu usystematyzowania procesu programowania powstao wiele technik tworzenia programw okrelanych cznie terminem programowania systematycznego. Obecnie uwaa si, e najwaniejszymi z nich s: programowanie proceduralne (ang. procedural programming) programowanie strukturalne (ang. structured

programming) programowanie zorientowane obiektowo (ang. object-oriented programming) - w C nie ma mechanizmw wspierajcych ten paradygmat Programowanie proceduralne (ang. procedural programming) Programowanie proceduralne jest metod tworzenia oprogramowania bazujca na koncepcji jednostek programowych (moduw) i zasigu zmiennej. Program proceduralny skada si z jednej lub wielu moduw. Kady modu skada si z jednej lub wielu procedur (funkcji, podprogramw, metod). Procedury mog by zagniedone.

Kady program moe posiada jeden lub wicej poziomw lub zakresw zawierajcych bloki. Na kadym poziomie mog by definiowane Programowanie strukturalne Podstawy teoretyczne programowania strukturalnego Podstawy teoretyczne programowania strukturalnego dali C. Bohm i G. Jocopini. W roku 1966 wykazali, e wszystkie problemy obliczeniowe daj si doprowadzi do rwnowanej postaci, w ktrej wystpuj tylko trzy struktury

algorytmiczne: Sekwencje Wybr (selekcje) Powtrzenia (iteracje) List Dijkstry W marcu 1968 r. w czasopimie Communication of the ACM (11,3, pp.147-148) zosta opublikowany synny obecnie list prof. E.W. Dijkstry, pt. Uznajc GOTO za szkodliwe. Autor omwi w nim anomalie zdania goto, skrytykowa jego zy wpyw na czytelno i niezawodno programw oraz zaproponowa usunicie go ze wszystkich jzykw programowania. Na podstawie dowodu Bohma i Jocopiniego Dijkstra stworzy on w latach 1968-1972

podstawy programowania strukturalnego. Programowanie strukturalne (ang. structured programming) Programowanie strukturalne to technika tworzenia programw bazujca na zasadach programowania proceduralnego. Najbardziej znanymi podejciami s: Programowanie strukturalne Jacksona , bazujce na uporzdkowanych strukturach danych Programowanie strukturalne Dijkstray , bazujce na podziale programu na podsekcje, z ktrych kada posiada pojedynczy punkt wejcia i pojedynczy punkt wyjcia. Generalnie programowanie strukturalne polega na

podziale kodu na mae jednostki (funkcje), realizujce proste, pojedyncze zadania. Elementarny wstp do algorytmiki Literatura Banachowski L., Diks K., Ryter W.(2003): Algorytmy i struktury danych. WNT, Warszawa. Cormen T.H., Leiserson Ch. E., Rivest R.L. (2002): Wprowadzenie do algorytmw. WNT, Warszawa. Wirth N.(2002): Algorytmy + struktury danych = programy. WNT, Warszawa. Harel D. (2001): Rzecz o istocie informatyki. Algorytmika. WNT, Warszawa.

Algorytmika Algorytmika ta nauka o algorytmach (Harel D. (2001): Rzecz o istocie informatyki. Algorytmika. WNT) obszarze ludzkich docieka, wiedzy i dowiadczeniach w zakresie budowy algorytmw. Harel pisze, e algorytmika tkwi w centrum wszystkich dziaw informatyki i ... mona o niej powiedzie, e jest wana dla wikszoci nauk matematycznoprzyrodniczych, ekonomii i techniki. Etymologia sowa algorytm Pojcie algorytm pochodzi od nazwiska arabskiego matematyka Muhammeda ibn Musy

al-Chorezmi (z Chorezmu), ktry opisa system dziesitnego kodowania liczb i sztuk liczenia w tym systemie (ok. roku 820 n. e.) Definicje algorytmu Algorytm jest pojciem abstrakcyjnym. Jest to dokadny przepis podajcy sposb rozwizania okrelonego zadania w skoczonej liczbie krokw. Algorytm - informatyczny opis rozwizania zadania [Turski] Obecnie przez algorytm rozumie si opis danych wraz z opisem czynnoci, ktre naley wykona z tymi danymi, aby osign okrelony cel. Rodzaje algorytmw

Rozrnia si rodzaje algorytmw: numeryczne, operujce na liczbach (np. algorytm Euklidesa) nienumeryczne, operujce na danych nieliczbowych (np. algorytm sortowania lub wyszukiwania dokumentw w duych zbiorach). Algorytm jest sekwencyjny, gdy kolejno czynnoci jest okrelona jednoznacznie, a niesekwencyjny (rwnolegy, wspbieny), gdy porzdek ten nie jest okrelony midzy pewnymi operacjami. Najwaniejsze cechy algorytmw (1/2) moliwo wyraania algorytmu w rnych jzykach,

np. jzyku naturalnym, w jzykach programowania, poprzez sie dziaa; algorytm zapisany w jzyku programowania nazywa si programem moliwo wyraania algorytmu przy pomocy skoczonej liczby symboli, bez uywania zwrotw odwoujcych si do analogii, jak "itd." realizowalno, tzn. fizyczna moliwo wykonania polece moliwo wielokrotnego wykonywania (na og z rnymi danymi); pojedyncze wykonanie algorytmu nazywa si procesem; wyznaczone przeze dziaania s sformuowane na poziomie elementarnym, uwzgldniajcym moliwoci realizacyjne Najwaniejsze cechy algorytmw (2/2)

Algorytm jest statycznym opisem procesu rozwizania zadania. Dynamik tego procesu osiga si poprzez realizacj programu bdcego zakodowan postaci algorytmu. Algorytm moe by krtki, lub opisywa dugi (nawet niekoczcy si) proces. Przykadw dostarcza statystyka zajmujca si opracowywaniem duych zbiorw danych. Formy zapisu i prezentacji algorytmw Metody sowne Metody graficzne Metody opisowe

(sowne) Metody te oparte s na: jzyku etnicznym lub branowym jzyku formalnym, np. jzyku programowania Metody graficzne (wykrelne) tablice decyzyjne sieci dziaa (schematy blokowe, schematy wykonawcze) strukturo-programy, zwane schematami NassiSchneidermana (N-S) schematy czynnociowe (w tym schematy obiegu dokumentw) schematy przetwarzania (systemw przebiegu) technika grafw tablice krzyowe

matryce sprze Sieci dziaa Definicja sieci dziaa SIE DZIAA to graficzne przedstawienie przepisu rozwizania zadania (algorytmu) w postaci tzw. skrzynek zawierajcych polecenia poszczeglnych czynnoci, poczonych strzakami wskazujcymi kolejno ich wykonywania. Podstawowe rodzaje skrzynek: skrzynki kracowe (skrzynki pocztkowe i skrzynki kocowe) skrzynki warunkowe skrzynki wyboru skrzynki bezwarunkowe (skrzynki operacyjne) skrzynki wejcia-wyjcia

skrzynki kolekcyjne skrzynki cznikowe skrzynki podprogramw Skrzynki kracowe S dwa rodzaje skrzynek kracowych. skrzynka pocztkowa (START) pokazuje miejsce rozpoczcia wykonywania algorytmu. skrzynka kocowa (STOP) pokazuje miejsce lub miejsca zakoczenia wykonywania algorytmu. START

STOP Skrzynki warunkowe Skrzynki warunkowe zawieraj polecenia sprawdzenia wartoci okrelonych wyrae logicznych. Wyraeni e logiczne ?

Nie Tak Skrzynki wyboru Skrzynki wyboru obrazuj wybr jednego z moliwych wariantw w zalenoci od wartoci zmiennej lub wyraenia Zmienna = (Wyraenie =)

w1 w2 ... wi ... wn Skrzynki bezwarunkowe (skrzynki operacyjne) Skrzynki bezwarunkowe zawieraj operacje inne ni sprawdzenie warunkw logicznych. Operacja Skrzynki wejciawyjcia Skrzynki wejciawyjcia obrazuj operacje wprowadzania i

wypisywania danych. Wprowad Skrzynki kolekcyjne Skrzynka kolekcyjna czy dwie rne drogi algorytmu. Skrzynki cznikowe Wyrnia si dwa rodzaje skrzynek cznikowych: skrzynki cznikowe na stronie obrazuj przejcie pomidzy fragmentami algorytmu w ramach tej samej strony

skrzynki cznikowe midzystronicowe obrazuj przejcie pomidzy fragmentami algorytmu znajdujcymi si na rnych stronach Nr Strona | Nr Skrzynki podprogramw Skrzynki podprogramw obrazuje wywoanie podprogramu i

realizowane przez ni zadania. Nazwa podprogramu Przykad Narysowa sie dziaa (schemat blokowy) algorytmu obliczajcego sum dwch liczb cakowitych. Zadania obliczeniowe Okrelenie terminu zadanie obliczeniowe Algorytmy okrelaj sposb rozwizania pewnych rodzajw zada, zwanych zadaniami obliczeniowymi lub algorytmicznymi.

Zadanie obliczeniowe skada si ze: scharakteryzowania dopuszczalnego, by moe nieskoczonego, zestawu danych wejciowych x; Zbir danych wejciowych x y f x specyfikacji podanych wynikw y jako funkcji obliczalnej f danych wejciowych Zbir danych wyjciowych y Rys. Rozwizanie algorytmiczne

f Rodzaje polece w algorytmach Algorytmy zawieraj dwa rodzaje instrukcji (polece do wykonania): Instrukcje akcji (czynnoci), bdce zleceniami wykonania dziaa elementarnych (podstawowych) Instrukcje sterujce, determinujce porzdek wykonywania instrukcji czynnoci. Problemy informatyki Podzia problemw informatyki

Nie wszystkie problemy daj si rozwiza algorytmicznie. Og problemw dzieli si (H. Simon, Newell (1958): Heuristic problem solving. Operations Research, t.4) na: dobrze ustrukturalizowane o nieokrelonej strukturze o sabo okrelonej strukturze Problemy dobrze ustrukturalizowane Problemy dobrze ustrukturalizowane daj si przedstawi w formie ilociowej, a ich rozwizanie w postaci algorytmu. Do ich rozwizania stosuje si metody bada operacyjnych (operations

research). Problemy o nieokrelonej strukturze Problemy o nieokrelonej strukturze mona je przedstawi w postaci sownego opisu; rozwizuje si je przy pomocy metod heurystycznych. Istot metod heurystycznych jest dochodzenie do rozwizania poprzez sformuowanie hipotezy. Problemy o sabo okrelonej strukturze

Problemy o sabo okrelonej strukturze to problemy mieszane o przewadze aspektw jakociowych; do ich rozwizywania stosowane s metody analizy systemowej. Analiza systemowa jest nauk systemow, ktrej przedmiotem jest postrzeganie i wyjanianie istotnych problemw zwizanych z wyborem decyzji lub linii postpowania. Zastosowania algorytmw Algorytmy znajduj zastosowanie w rnych

dziedzinach dziaalnoci czowieka: W informatyce, szczeglnie w zwizku z tworzeniem oprogramowania; W matematyce i naukach przyrodniczych, gdzie przyjmuj posta wzorw i formu; W zarzdzaniu, wymagajcym posugiwania si rnorodnymi zasadami i metodami; W administracji, w ktrej istotn rol odgrywa wydawanie i posugiwanie si rnorodnymi przepisami. 1. 2.

3. 4. 5. Przykad algorytmizacji dziaa algorytm wynalazku Altszullera (sposb rozwizania dowolnego zadania) Faza formuowania zadania P: - wybr i zdefiniowanie P, - ucilenie warunkw odnoszcych si do P, jak i towarzyszcych procesowi jego rozwizywania. Faza analizy P: analiza ucilonej wersji P. Faza oceny P: - ocena istotnoci P, - eliminacja sprzecznoci technicznych,

- (ewentualnie powrt do fazy formuowania zadania P lub do fazy analizy P). Faza syntezy: konstruowanie rozwizania P. Faza decyzji: - jeeli rozwizanie uzyskane w poprzedniej fazie spenia warunki przyjte w fazie formuowania zadania P, to przyjcie tego rozwizania do realizacji; - w przeciwnym przypadku powrt do fazy formuowania zadania. Zasady poprawnego programowania Cechy dobrych programw Poprawno (zgodno z wymogami uytkownika) Niezawodno (zdolno do wspomagania pracy uytkownika)

Przenono (atwo instalacji na rnych komputerach) atwo konserwacji (podatno na zmiany) Czytelno (prostota jest jedn z najwaniejszych cech dobrych programw) Efektywne wykorzystanie zasobw (procesor, pami) Szybko Styl programowania (1/4) Styl programowania to sposb pisania kodu, ktry bdzie czytelny zarwno dla jego twrcy, jak i innych programistw. Dobry styl jest podstaw dobrego programowania.

Dobrego stylu programowania mona nauczy si wycznie poprzez zdobycie praktyki. Nie ma uniwersalnej reguy gwarantujcej pisanie dobrych programw. Istnieje kilka prostych i przydatnych zasad. Styl programowania (2/4) Naley uywa nazw opisowych dla definicji globalnych,

krtkich za dla lokalnych. Naley programowa w sposb jednolity. Uywa nazw czynnoci dla funkcji. Dba o precyzj. Stosowa wcicia, aby uwidoczni struktur. Uywa naturalnej postaci wyrae. Uywa nawiasw, aby rozwia niejasnoci. Dzieli wyraenia zoone. Pisz jasno! Naley uwaa na efekty uboczne.

Styl programowania (3/4) Stosowa jednolity sposb rozmieszczania wci i nawiasw klamrowych. Naley uywa idiomw. Programujc konstrukcje wielokrotnego wyboru, uywa instrukcji else-if. Naley wystrzega si makroinstrukcji grajcych rol funkcji. Tre i argumenty makroinstrukcji ujmowa w nawiasy. Nadawa nazwy liczbom magicznym. Definiowa liczby jako stae. Uywa staych znakowych zamiast liczb cakowitych. Do obliczania rozmiarw instancji (zmiennych, typw) uywa operatorw jzyka. Nie pisa banaw!

Styl programowania (4/4) Komentowa funkcje i dane globalne. Nie komentowa zego kodu, lecz go poprawia. Komentarz nie moe by sprzeczny z kodem. Wyjania, nie gmatwa! To samo rb wszdzie tak samo. Zwalniaj zasoby w tej samej warstwie, w ktrej byy przydzielone. Objanij swj program komu innemu. Trzymaj si standardu. Styl akapitowy w C (C indent style, C bracing style) Styl akapitowy okrela zasady agregacji kodu w postaci blokw w celu budowy

prostej i czytelnej struktury programu. Wyodrbnia si kilka rodzajw stylu akapitowego: Styl BSD/Allmana Styl Kernela/K&R Styl Whitesmithsa Styl GNU Styl BSD/Allmana W stylu tym nawiasw klamrowych uywa si po segmentach inicjujcych. Przykad while(x == y) { something(); somethingelse(); }

Gwn zalet tego stylu jest wyrane rozdzielenie zawartoci bloku od segmentw inicjujcych, w powyszym przykadzie od instrukcji while. Styl Kernela/K&R W tym stylu nawias klamrowy otwierajcy umieszczony jest an tym samym poziomie co segment inicjujcy, natomiast nawias klamrowy zamknity umieszczony jest pod ostatni instrukcj bloku. Przykad while(x == y) { something(); somethingelse(); } Gwn zalet tego stylu jest podkrelenie tego, e blok jest

logicznie zwizany z segmentem inicjujcym. Wad tego stylu w porwnaniu ze stylem BSD jest trudno w lokalizacji pocztku bloku. Styl Whitesmithsa Styl ten jest podobny do BSD: while(x == y) { something(); somethingelse(); } W stylu tym sposb umieszczenia nawiasw klamrowych umoliwia atwe, wizualnie wydzielenie blok. Styl GNU Jest to styl poredni midzy stylami BSD i Whitesmithsa.

while(x == y) { something(); somethingelse(); } Nawiasy klamrowe umieszczane s w jednej kolumnie zajmujcej pozycj rodkow midzy lewym skajem pooeniem, a kolumn, w ktrej pisane s kolejne instrukcje bloku. Styl ten zachowuje zalety stylu BSD i satysfakcjonuje zwolennikw stylu Whitesmithsa. Kryzys oprogramowania Pocztki kryzysu

oprogramowania Inynieria oprogramowania wyrosa z tzw. kryzysu oprogramowania powstaego w latach 60. i 70. XX w., kiedy to wiele projektw programistycznych koczyo si fiaskiem. Wraz ze wzrastajc wszechobecnoci komputerw, wzrastao zapotrzebowanie na coraz lepsze oprogramowanie. Efektywno projektw informatycznych W latach 90. XX w. ok. 90% powanych firm programistycznych w USA uwaa, e czsto zdarzaj si im opnienia w realizacji projektw informatycznych. W Polsce co prawda nie przeprowadzono

podobnych bada, lecz z pobienej obserwacji wynika, e podobne problemy maj polskie firmy softwarowe. Najwaniejsze przyczyny kryzysu oprogramowania (1/2) Dua zawodno systemw komputerowych Dua zoono SI

Niepowtarzalno przedsiwzi informatycznych Nie przejrzysto procesu budowy oprogramowania, co oznacza e proces ten jest bardziej sztuk ni zalgorytmizowan dziaalnoci inyniersk Nieprzewidywalno czasu wytwarzania oprogramowania. Pozorna atwo wytwarzania i dokonywania poprawek w oprogramowaniu Eklektyczny charakter narzdzi i jzykw programowania Uzalenienia organizacji od systemw komputerowych i przyjtych technologii informatycznych Najwaniejsze przyczyny kryzysu oprogramowania (2/2) Frustracje projektantw oprogramowania i programistw wynikajce ze zbyt szybkiego

postpu w zakresie jzykw, narzdzi i metod oraz uciliwoci i dugotrwaoci procesw produkcji, utrzymania i pielgnacji oprogramowania. Problemy wspdziaania niezalenie zbudowanych moduw oprogramowania. Problemy przystosowania istniejcych i dziaajcych systemw do nowych wymaga, tendencji i platform sprztowo-systemowych Przykad nieudanego projektu programistycznego - IBM OS 360 Jednym z najbardziej spektakularnych przykadw projektw zakoczonych niepowodzeniem jest system operacyjny OS 360 dla komputerw IBM 360 Series. Projekt ten by realizowany przez dziesi lat i by jednym z

najbardziej zoonych projektw informatycznych kiedykolwiek realizowanych. I mimo i skada si z ok. 1000 programw, to nigdy nie speni oczekiwa uytkownikw. Ostatecznie, w pnych latach 90. ubiegego wieku, zosta on wczony do Linuxa. Kryzys oprogramowania podsumowanie Kryzys oprogramowania od koca lat 60. Coraz lepszy i taszy sprzt coraz wiksze potrzeby uytkownikw coraz wiksze programy Due programy duo bdw -> due koszty Koniecznoci byo opracowanie metodologii systematycznej pracy. Narodziny inynierii oprogramowania. Programowanie funkcjonalne - programowanie

deklaratywne - programowanie proceduralne / techniki strukturalne - programowanie modularne - programowanie zorientowane obiektowo programowanie komponentowi CASE - UML Jak walczy ze zoonoci ? Zasada dekompozycji: rozdzielenie zoonego problemu na podproblemy, ktre mona rozpatrywa i rozwizywa niezalenie od siebie i niezalenie od caoci. Zasada abstrakcji: eliminacja, ukrycie lub pominicie mniej istotnych szczegw rozwaanego przedmiotu lub mniej istotnej informacji; wyodrbnianie cech wsplnych i niezmiennych dla pewnego zbioru bytw i wprowadzaniu poj lub symboli oznaczajcych takie cechy.

Zasada ponownego uycia: wykorzystanie wczeniej wytworzonych schematw, metod, wzorcw, komponentw projektu, komponentw oprogramowania, itd. Zasada sprzyjania naturalnym ludzkim wasnociom: dopasowanie modeli pojciowych i modeli realizacyjnych systemw do wrodzonych ludzkich wasnoci psychologicznych, instynktw oraz mentalnych mechanizmw percepcji i rozumienia wiata. Jzyk C Jzyk C Jzyk C zosta zaprojektowany przez Dennisa Ritchiego w latach 60. XX wieku w celu pisania oprogramowania systemu UNIX. Gwne cechy jzyka C

Skupia si na realizacji paradygmatw programowania proceduralnego z udogodnieniami stylu programowania strukturalnego. Dostp do oprogramowania niskopoziomowego poprzez wykorzystanie wskanikw do lokalizacji obszarw pamici zajtych przez to oprogramowanie. Stosowanie standardowych funkcji bibliotecznych umoliwiajcych rozwizanie typowych zada. Wykorzystanie jzyka preprocesora umoliwiajcych definiowanie makr, wczanie rnych plikw rdowych oraz wykonywanie kompilacji warunkowej. Statyczny, leksykalny zasig zmiennych. Stosowanie operatorw o zoonoci O(1). Historia C 1968 1973 okres tworzenia C 1973 rekomiplacja jdra UNIX napisanego w C

1978 Dennis Ritchie and Brian Kernighan publikuj ksik The C Programming Language (zwana bia ksig C lub K&R). od pocztku lat 80. XX w, C zdobywa popularno poza Bell Labs; po koca lat 80. ubiegego wieku Bjarne Stroustrup i wsppracownicy z Bell Labs opracowuj jzyk programowania zorientowany obiektowo, nazwany pniej C+ +. Wersje C K&R C ANSI C i ISO C C99 K&R C

Ta wersja C zostaa opisana w ksice Kernighana I Ritchie'go The C Programming Language (1978). Wprowadzono w nim nastpujce elementy do C: Typy strukturalne long int data type unsigned int data type operator (=+) zosta przeksztacony w do postaci (+=); K&R C zosta udokumentowany w standardzie ANSI C ANSI C i ISO C W roku 1989, C zosta po raz pierwszy przedstawiony standard ANSI w dokumencie ANSI X3.159-1989 "Programming Language C". ANSI C stanowi rozwiniecie K&R C. ANSI C zosta wzbogacony o nastpujce elementy: funkcje zwracajce wartoci typu void (void functions);

funkcje zwracajce wartoci typu struct i union; typ void *; kwalifikator const; separowanie nazw pl struktur; biblioteka stdio staa si bibliotek standardow; plik nagwkowy stddef.h I szereg innych plikw stao si standardowymi plikami nagwkowymi. C99 W roku 1999 opublikowany zosta standard ISO 9899:1999, ktry w marcu 2000 roku zosta zaadaptowany przez ANSI jako standard. Nowe elementy tego standardu: Funkcje inline; Nowe typy danych, w tym long long int, boolean i typ reprezentujcy liczby zespolone (complex); Tablice o zmiennej dugoci (variable-length

arrays); Komentarze jednowierszowe (//); Wiele nowych funkcji bibliotecznych i plikw nagwkowych, w tym stdint.h. C++ C++, obiektowy jzyk programowania zaprojektowany przez B. Stroustrupa i in., w warstwie proceduralnej osadzony w notacji jzyka C, wpyw jzykw Algol 68 i Simula 67 oraz Ada, ML i Clu. Charakterystyczne cechy: docianie funkcji i operatorw, dziedziczenie z wielu klas, obsuga wyjtkw, klasy parametryczne. Wersja pierwotna (1979) nosia nazw C z klasami (C with classes), a jej kompilatory generoway kod w jzyku C. Standaryzowany od 1994, standard ostateczny ISO/ANSI C++ (ANSI 14882) z 1 wrzenia 1998. Liczne kompilatory, m. in. Borland C++, Microsoft C++,

Watcom C++, implementacje systemw operacyjnych, baz danych. Java, Smalltalk Przewodnik po jzyku C Strumienie (ang. streams) Strumie to cig danych tego samego lub rnych typw danych, pozwalajcy na sekwencyjny dostp do tych wartoci. Wyrnia si strumienie: binarne s to sekwencje nie przetworzonych bajtw znakw - s to cigi znakw podzielone na wiersze tekstowe cig wierszy, w ktrym kady wiersz zawiera zero lub wicej znakw i koczy si znakiem koca wiersza Strumienie przetwarza si najczciej w ten sposb, e wie

si je z zewntrznymi plikami dyskowymi lub wewntrznymi buforami, ktre mona traktowa jako plik dla czasowego przechowywania danych. Przekierowanie Skompilowany program, np. proba.exe, mona uruchomi z wiersza polece DOS: c>proba.exe > proba.txt, co spowoduje, ze zamiast na ekran dane bd wpisywane do utworzonego pliku tekstowego. Dane z pliku tekstowego (np. dane.txt) mona wczyta do programu wykonywalnego przy pomocy polecenia: c:> proba.exe < dane.txt Dwie ww. operacje mona poczy (zdarza si to rzadko): c:> proba.exe < we.txt >wy.txt "Hello, World!" w C

Poniszy prosty przykad drukuje tekst "Hello, World!" na standardowym urzdzeniu wyjciowym (zwykle jest to monitor). Program ten po raz pierwszy pojawi si w K&R C. #include int main(void) { printf("Hello, World!\n"); return 0; } Formatowane wyjcie: funkcja printf() Skadnia funkcji printf(): int printf(const char *format[, argument, ...]); Funkcja ta pod nadzorem argumentu format, formatuje i wypisuje swoje argumenty do standardowego wyjcia

(stdout). Format zawiera obiekty dwojakiego rodzaju: znaki, ktre s kopiowane do strumienia wyjciowego specyfikacje przeksztace, z ktrych kada wskazuje sposb przeksztacenia i wypisania kolejnego argumentu funkcji. Kad specyfikacj przeksztacenia (slajd+1) rozpoczyna znak %, a koczy znak charakterystyczny dla danego przeksztacenia (slajd+2) Przykad int l=1; char c[]="hello"; printf("%d %s",l,c); Specyfikacje przeksztacenia w printf() Midzy znakiem % i znakiem przeksztacenia mog (w podanej kolejnoci) wystpi:

Minus (-), zalecajcy przesunicie argumentu do lewego kraca jego pola Liczba okrelajca minimalny rozmiar pola. W razie potrzeby pole bdzie uzupenione z lewej strony (lub z prawej, gdy dano dosunicia w lewo) Kropka (.) oddzielajca rozmiar pola dla precyzji. Liczba okrelajca precyzj, tj max. liczb znakw dla tekstu, liczb cyfr po kropce dla wartoci zmiennopozycyjnej lub minimaln liczb cyfr dla wartoci cakowitej. Jedna z liter: h jeli argument cakowity naley wypisa jako short, l jeli jako long. Podstawowe przeksztacenia dla printf()

Zna k d, i Dana wejciowa Typ argume ntu Liczba cakowita dziesitna Int o Liczba cakowita semkowa (bez wiodcego O)

Int x Liczba cakowita szesnastkowa (bez wiodcych 0X) Int u Liczba cakowita dziesitna bez znaku Unsigned int c

Jeden znak Char s Cig znakw do napotkania \0 lub wyczerpania liczby znakw okrelonych przez precyzj Char * f [-]m.dddddd (precyzja domylnie 6 znakw) Double

E, e [-]m.ddddddexx Double G, g Wypisywana w formacie %e jeli wykadnik jest mniejszy ni 4 albo wikszy lub rwny precyzji; w przeciwnym przypadku wypisywany w formacie %f; nie wypisuje nieznaczcych zer i koczcej kropki. Double p Wskanik, posta zalena od implementacji

Void * % Nie bdzie adnego przeksztacenia argumentu; wypisywany znak % Formatowane wejcie: funkcja scanf() Skadnia funkcji scanf(): int scanf(const char *format[, address, ...]); Funkcja ta wczytuje znaki ze standardowego wejcia, interpretuje je zgodnie ze specyfikacjami zawartymi w argumencie format i zapamituje znaki w miejscach wskazanych przez argument address. Funkcja koczy swe dziaanie, gdy zinterpretuje cay format.

Wartoci zwracane przez funkcj: W przypadku sukcesu, funkcja zwraca liczb wprowadzonych wartoci. W przypadku niepowodzenia, funkcja zwraca: - 0 jeli nie odczytano adnych wartoci - EOF jeli odczytany zosta znak koca cigu znakw. Przykad int i,l; l=scanf("%d",&i); fflush(stdin);//ZALECANE-czyci standardowy bufor wej. printf("%d %d",l,i); Podstawowe przeksztacenia dla scanf() Zna

k Dana wejciowa Typ argume ntu d Liczba cakowita dziesitna Int * i Liczba cakowita; moe wystpi w postaci semkowej

(z wiodcym O) lub szesnastkowej (z wiodcymi 0X) Int * o Liczba cakowita semkowa (z lub bez wiodcego O) Int * u Liczba cakowita dziesitna bez znaku Unsigned int *

x Liczba cakowita szesnastkowa (z lub bez wiodcych 0X) Int * c Znaki; nastpne znaki (domylnie 1) umieszcza si we wskazanej tablicy; nie obowizuje zasada pomijania biaych znakw; aby przeczyta najbliszy czarny znak naley zastosowa %1s Char *

s Tekst (ale nie napis, tzn. bez cudzysoww); argument powinien wskazywa na tablic znakow o rozmiarze wystarczajcym do przyjcia tekstu z dodanym na kocu znakiem \0. Char * Liczba zmiennopozycyjna z opcjonalnymi: znakiem, kropk dziesitna i wykadnikiem Float * efg Niektre funkcje

obsugujce znakowe operacje we/wy (1/2) getche() - funkcja zwraca znak wprowadzony z konsoli i wywietla go na ekranie; nie czeka na enter; getchar() funkcja zwraca znak wprowadzony z konsoli i wywietla go na ekranie; wymaga wprowadzenia enter; dziaa nie tylko z konsol, ale rwnie z oglnymi urzdzeniami we/wy; getch() funkcja zwraca znak wprowadzony z konsoli, ale nie wywietla go na ekranie; putch() funkcja wysya pojedynczy znak na ekran; putchar() funkcja wyprowadza znak na ekran; dziaa nie tylko z konsol, ale rwnie z oglnymi urzdzeniami we/wy.

Niektre funkcje obsugujce znakowe operacje we/wy (2/2) #include #include void main (void) { char c1, c2; clrscr(); printf("/n znak 1: "); c1 = getche(); //nie czeka na enter printf("\n znak2: "); c2 = getchar(); //czeka na enter

printf("\n\n znaki: "); putch(c1); putchar(c2); getch(); } Konwencje leksykalne Program w C skada si z jednej lub wikszej liczby jednostek leksykalnych zapisanych w plikach. Program jest tumaczony w kilku fazach. W pierwszej fazie interpretowane s wiersze preprocesora zaczynajce si znakiem # oraz wykonywane s makrodefinicje i makrorozwizania. Po zakoczeniu tej

fazy program jest zredukowany do cigu jednostek leksykalnych Jednostki leksykalne Istnieje sze jednostek leksykalnych: 1. Nazwy (identyfikatory) 2. Sowa kluczowe 3. Stae 4. Napisy 5. Operatory 6. Separatory Ignorowane s biae znaki (odstpy, znaki tabulacji poziomej i pionowej, znaki nowego wiersza i nowej strony, komentarze), chyba e rozdzielaj jednostki leksykalne. Komentarze

Istniej dwa rodzaje komentarzy: 1. Jednowierszowe: zaczynaj si od dwuznaku (//) 2. Wielowierszowe: zaczynaj si od dwuznaku (/*), a kocz dwuznakiem (*/); Komentarze nie mog by zagniedone i nie mog wystpowa w napisach i staych znakowych. Przykad int i=j/k; //dzielenie przez k int i = j//* dzielenie przez k*/k; Nazwy (identyfikatory) Nazwa jest cigiem liter i cyfr i znaku podkrelenia (_). Znak podkrelenia zalicza si do liter.

Ograniczenia: nazwa moe skada si z max. 32 lub 64 znakw pierwszym znakiem musi by litera rozrniane s wielkie i mae litery. Identyfikatory rozpoczynajce si od znaku pojedynczego lub podwjnego znaku podkrelenia (_), (__) s zarezerwowane na uytek biblioteki standardowej. Sowa kluczowe (1/5) Sowo kluczow e Odpowiednik polski

auto break Automaty czny Przerwij Specyfikacja klasy zmiennej (zmienna automatyczna) Instrukcja(przerwij wykonanie bloku/ptli) case Wariant char

Znak Instrukcja (element konstrukcji warunkowej switch-case) Typ danych (pojedynczy bajt, interpretowany domylnie jako kod ASCII znaku) const Staa continu e Kontynuuj

Opis Modyfikator (dodawany do deklaracji w przypadku staych) Instrukcja (wr do pocztku ptli programowej) Sowa kluczowe (2/5) default Domylny Etykieta (element konstrukcji warunkowej switch-case) do Wykonaj

Instrukcja (element instrukcji do-while) double podwjny Typ danych (liczba o podwjnej dugoci i podwjnej precyzji) else Jeli nie, to Instrukcja (element instrukcji if-else-if...) enum

Wyliczeniow y Typ danych (typ porzdkowy, wyliczeniowy) extern Zewntrzny Specyfikator klasy zmiennej (rodzaj pamici) Sowa kluczowe (3/5) float Zmiennoprz ecinkowy

Typ danych (liczby zmiennoprzecinkowe) for Dla Instrukcja (nagwek ptli programowej) goto Id do Instrukcja (przejcie do etykiety) If

Jeli Instrukcja (element konstrukcji warunkowej if-else-if ...) Int Cakowity Typ danych (liczby cakowite, zazwyczaj 2-bajtowe) long Dugi Typ danych (liczba o powikszonej dugoci i precyzji) register

Rejestrowy Specyfikator rodzaju pamici (zmienna do rejestru) Sowa kluczowe (4/5) return Zwr Instrukcja (zwrot wartoci przez funkcj) short Krtki Typ danych (liczba cakowita, krtka)

signed Ze znakiem Specyfikator typu danych (pierwszy bit liczby to znak +/-) static statyczny Specyfikator rodzaju pamici (zmienna statyczna) struct Struktura

Specyfikator typu danych (zoony z danych rnych typw) switch Przecz Instrukcja (element konstrukcji warunkowej switch-case) typedef Definiuj typ Instrukcja (definiuje nowy typ danych) Sowa kluczowe (5/5) union

Unia Specyfikator typu danych unsigned Bez znaku Specyfikator typu danych (liczba bez znaku, tj. tylko dodatnia) void Nieokrelon y

Specyfikator typu danych volatile Ulotny Specyfikator klasy zmiennej (rodzaj pamici); zmienna, ktra moe ulega niezauwaalnemu nadpisaniu, dotyczy np. zmiennych rejestrowych. while Dopki Sowo poprzedzajce warunek (element ptli) Stae

Wyrnia si pi rodzajw staych: 1. Cakowite 2. Znakowe 3. Tekstowe 4. Zmiennopozycyjne 5. Wyliczeniowe Typ staej zaley od jej postaci, wartoci i przyrostka. Stae cakowite Stae cakowite mona zapisywa w postaci: Dziesitnej: uywa si cyfr 0,1,...,9; semkowej: uywa si cyfr 0,1,...,7. Sta uwaa si za semkow, jeeli rozpoczyna si od 0 (liczba zero); Szesnastkowej: uywa si cyfr 0,1,...,9 i liter A,B,...,F. Sta uwaa si za szesnastkow, jeeli rozpoczyna si od 0X (liczba zero i znak x);

Staa cakowita mone by opatrzona przedrostkiem U do oznaczenia, e jest bez znaku (unsigned). Moe by opatrzona przyrostkiem L do oznaczenia, e jest duga (long). Przykady 123 -18 1L U5 013 //liczba semkowa 0X13 //liczba szesnastkowa Stae znakowe Staa znakowa skada si z jednego znaku, zawartym w apostrofach np. x.

Stae znakowe nie zawieraj m.in. Apostrofw () i znakw nowego wiersza. Dla wyraenia tych i innych znakw stosuje si sekwencje specjalne (zwanych niekiedy manipulatorami). Sekwencje specjalne

\b (BS - Backspace) cofnicie \f (FF - Form Feed) nowa strona \n (NL(LF) - New Line) nowa linia \r (CR - carriage return) powrt karetki \t (HT - tabulator) tabulator poziomy \v- (VT - vertical tabulator)- tabulator pionowy \p - adres \a (BEL - alarm) sygna dwikowy \0 NULL Sekwencje specjalne \\ ukonik w lewo (\) \? znak zapytania (?) \ apostrof \ cudzysw \0oo staa semkowa \Xhh staa szesnastkowa

Stae zmiennopozycyjne Staa zmiennopozycyjna skada si z czci cakowitej, kropki, czci uamkowej, litery E, wykadnika potgi (ewentualnie ze znakiem) i opcjonalnego przyrostka F (dla oznaczenia typu float) lub L (dla oznaczenia typu long). Przykad 1.2; 88.5L; 1.0e+3; 12.34e-2; Stae wyliczeniowe Nazwy zadeklarowane jako

wyliczniki (enum) s staymi typu int. Przykad enum dni {pn=1,wt=2,sr=3,cz=4,pi=5,so=6,ni=7} dni_tyg; Napisy Napis (staa napisowa) jest cigiem znakw ujtym w znaki cudzysowu, np. to jest napis. Typem napisu jest tablica znakowa, a klas pamici static. Do koca napisu jest dopisywany (o ile nie jest podany jawnie) znak \0 (NULL), aby program przegldajcy tekst mg znale jego koniec.

Znaczenie identyfikatorw Identyfikatory odnosz si w szczeglnoci do: Funkcji; Etykiet; Struktur; Unii; Klas; Wylicze; Staych wylicze; Nazw typw; Nazw zmiennych. Podstawowe atrybuty zmiennej Zmienna jest miejscem w pamici;

jego interpretacja opiera si na dwch podstawowych atrybutach: - Klasie pamici - Typie Klasa pamici decyduje o ywotnoci zmiennej, natomiast typ nadaje znaczenie wartoci zmiennej. Podstawowe cechy zmiennej Podstawowe cechy zmiennej to: - zasig - czno

Zasig to cz programu, w ktrej zmienna jest znana. czno okrela, czy ta sama nazwa z innym zasigiem odnosi si do tej samej zmiennej lub funkcji, czy te nie. Klasy pamici Istniej dwie klasy pamici: Automatyczna; Statyczna. Klasy pamici s okrelone przez sowa kluczowe (auto, static i register) razem z kontekstem zawierajcym deklaracj zmiennej. Zmienne automatyczne

Zmienne automatyczne s lokalne w bloku i znikaj, gdy sterowanie opuci blok. Deklaracje zawarte w bloku tworz zmienne automatyczne, jeli nie podano klasy pamici lub uyto specyfikatora auto. Zmienne zadeklarowane jako register s automatyczne i umieszczane (jeli to moliwe) w szybkich rejestrach maszyny. Przykad { int i; // zmienne automatyczne auto int a; register int b; // zmienna register } Zmienne statyczne

Zmienne statyczne mog by lokalne dla bloku lub zewntrzne dla wszystkich blokw; w kadym przypadku zachowuj swoje wartoci po opuszczeniu i ponownym wejciu do bloku. Wewntrz bloku zmienne statyczne deklaruje si za pomoc sowa static. Zmienne zadeklarowane na zewntrz wszystkich blokw, s zawsze statyczne. Przykad int i; int main(void) { int i; static int a; return 0 } // zmienna statyczna

// zmienna automatyczna // zmienna statyczna Typy danych Rodzaje typw danych W C wyrnia si dwa rodzaje typw danych: typy podstawowe (predefiniowane) typy pochodne (definiowane przez uzytkownika) Typy podstawowe (1/2) Nazwa typu

Wielko (w bitach) Zakres wartoci Przykadowe zastosowanie unsigned char 8 0 do 255 Zbir znakw

ASCII char 8 -128 do 127 Mae wartoci short int 16 -32,768 do 32,767 Zmienne sterujce

ptli unsigned int 32 0 do 4,294,967,295 Zmienne sterujce ptli int 32 -2,147,483,648 do

2,147,483,647 Zmienne sterujce ptli Typy podstawowe (2/2) unsigned long 32 0 to 4,294,967,295 Odlegoci astronomiczne enum

32 -2,147,483,648 do 2,147,483,647 Uporzdkowane zbiory wartoci long 32 -2,147,483,648 do 2,147,483,647 Liczebnoci

populacji float 32 3.4 *10-38 do 1.7 * 10+38 Obliczenia naukowe z dokadnoci 7 cyfr double 64 1.7 * 10-308 do

3.4 * 10+308 long double 80 3.4 * 10-4932 do 1.1 * 10+4932 Obliczenia naukowe z dokadnoci 15 cyfr Obliczenia naukowe z dokadnoci 18 cyfr

Typy pochodne Oprcz typw podstawowych mona utworzy potencjalnie nieskoczon klas typw pochodnych, konstruowanych z typw podstawowych. S to: Tablice zoone ze zmiennych danego typu; Funkcje zwracajce wartoci danego typu; Wskaniki do zmiennej danego typu; Struktury zawierajce zestawy zmiennych rnych typw; Unie zawierajce dowolny z zestawu zmiennych o rnych typach; Klasy (w C++) - zawierajce zestawy zmiennych rnych typw i funkcji zwracajcych wartoci danego typu. Kwalifikatory typw Z typem zmiennej mog by zwizane kwalifikatory

(modyfikatory). Deklarujc zmienn jako: const (stay) wskazujemy, e ta zmienna nie bdzie zmieniaa wartoci; volatile (ulotny) wskazujemy, e zmienna bdzie miaa specjalne waciwoci, wane przy optymalizacji. Przykad const int i=1; volatile int stan_miernika; Zmienne i l-wartoci Zmienna jest nazwanym obszarem pamici; l-warto (ang. l-value) jest wyraeniem odnoszcym si do zmiennej. Oczywistym

przykadem l-wartoci jest identyfikator o odpowiednim typie i klasie pamici. Przykad int *wsk; // l-wartoci: int j=2; *wsk=j; Przeksztacenia typw W niektrych przypadkach zachodzi potrzeba przeksztacenia wartoci z jednego typu do innego. Przykad int main(void){ int i=2,j=1; float f; f=((float)j/float(i));

return(0); } Promocja typu cakowitego Jeli typ int moe reprezentowa wszystkie wartoci oryginalnego typu, to dana warto jest przeksztacana do typu int; w przeciwnym przypadku t warto przeksztaca si do typu unsigned int. Przeksztacenia cakowite Dowolna wielko cakowita jest przeksztacana do danego typu bez

znaku przez znalezienie takiej najmniejszej nieujemnej wartoci, ktra jest przystajca (kongruentna) do tej wielkoci cakowitej modulo najwiksza warto reprezentowalna w danym typie zwikszona o 1. Wartoci cakowite i zmiennopozycyjne Przy przeksztacaniu wartoci typu zmiennopozycyjnego do typu cakowitego gubi si jej cz uamkow. Przykad int k; float f; f=1.5; k=f;

//k=1 Typy zmiennopozycyjne Przy przeksztacaniu wielkoci zmiennopozycyjnej do typu zmiennopozycyjnego o mniejszej precyzji i jej warto zawiera si w reprezentowalnym przedziale, wynikiem jest najblisza wiksza albo mniejsza reprezentowalna warto. Jeli wynik nie zawiera si w tym przedziale, skutek nie jest zdefiniowany. Przykad float f; double d; f=d; // przeksztacenie wartoci typu double do float Przeksztacenia

arytmetyczne Wiele operatorw powoduje przeksztacenia swoich argumentw i okrela typ wyniku wedug podobnych zasad. W efekcie chodzi o dopasowanie typw argumentw do wsplnego typu, ktry jest take typem wyniku. Przykad int a=2; float r; r=a+2.5; //przeksztacenie do typu float Wskaniki i wartoci cakowite Warto cakowit mona doda

do lub odj od wskanika. Przykad int x[3]={1,2,3}; int *wsk; wsk=x; for (int i=0;i<3;i++) { printf("x=%d\n",*wsk); wsk++; // wsk wskazuje }; na nastepny el. tablicy Typ void Wartoci (nie istniejcej) zmiennej typu void nie mona wykorzysta w aden sposb ani nie mona

przeksztaci, jawnie czy niejawnie, do innego typu rnego od void. Poniewa wyraenie typu void oznacza nie istniejc warto, takich wyrae mona uy jedynie w miejscach, gdzie warto nie jest wymagana, na przykad jako instrukcj wyraeniow (np. deklarowanie funkcji) (przykad 1) lub jako lewy argument operatora przecinkowego (przykad 2). Przykad 1 void komunikat(char *kom) {printf(kom);}; Przykad 2 int init(void) { return 1; } Wskaniki do typu void Kady wskanik do zmiennej moe by

przeksztacony do typu (void *) bez utraty informacji. Przeksztacenie wyniku z powrotem do wskanika oryginalnego typu przywraca oryginalny wskanik. Przykad int x=1; int *wsk; void *vwsk; wsk=&x; vwsk=wsk; wsk=(int*)vwsk; printf(wsk=%d,*wsk); Operatory Operatory i ich priorytety (1/7)

Kolejno wykonywania dziaa w wyraeniach jest uzaleniona od priorytetw operatorw. Prioryt et Operato r Opis Przykad 1.1 ()

Ogranicza wyraenia Izoluje wyraenia warunkowe Wskazuje na wywoanie funkcji x* (y- 3.5 ) if ( x > 10 ) . . . getch ( ); 1.2 [] Wskazuje na wymiar/indeks macierzy char Tekst[12]: 1.3a

. Kropka-odwoanie do elementu struktury, unii puts( STRUKTURA .Text ) : 1.3b -> Wskazanie elementu struktury, unii str_a->d

1.4 :: Widoczno/dostp (scope) puts ( : : Text ); Operatory i ich priorytety (2/7) 2.1 ! Operator negacji logicznej if (!x) . . .

2.2 ~ Operator dopenienia jedynkowego negacja bitowa (NEG) X = ~Y & Z; 2.3a - Jednoargumentowy minus printf( 96d, -Y );

2.3b + Jednoargumentowy plus a=+a; 2.4a ++ Operator jednoargumentowy pre-inkrementacja A = ++X ;

Operatory i ich priorytety (3/7) 2.4 b ++ Operator jednoargumentowy post-inkrementacja for ( i=1; i < 10; i + +) . . . 2.5 a

-- Operator jednoargumentowy pre-dekrementacja A =--X; 2.5 b -- Operator jednoargumentowy post-dekrementacja X--;

2.6 & Operator adresu Scanf(%d,&x); 2.7 * Operator adresowania poredniego Char *string=tekst;

Operatory i ich priorytety (4/7) 2.8 sizeof Operator sizeof N=sizeof(x); 3.1 * Operator multiplikatywny mnoenie

X=y * z; 3.2 / Operator multiplikatywny dzielenie X=y / z; 3.3 % Operator multiplikatywny

modulo X=y % z; 4.1 + Operator addytywny dodawanie X=y + z; 4.2 - Operator addytywny

odejmowanie X=y - z; Operatory i ich priorytety (5/7) 5.1 << Operator przesunicia w lewo x=x << 2; 5.2 >>

Operator przesunicia w prawo x=x >>2; 6.1 < Operator relacji mniejsze ni If (x < 0) ... 6.2 >

Operator relacji wiksze ni If (x > 0) ... 6.3 <= Operator relacji mniejsze lub rwne If (x <= 0) ... 6.4 >=

Operator relacji wiksze lub rwne If (x >= 0) ... Operatory i ich priorytety (6/7) 7.1 == Operator przyrwnania rwne If (x == 0) ... 7.2

!= Operator przyrwnania nie rwne If (x != 0) ... 8.1 & Bitowy operator koniunkcji (AND) x=x&y; 8.2

^ Bitowy operator rnicy symetrycznej (XOR) x=x ^ y; 8.3 | Bitowy operator alternatywy (OR) x=x | y; Operatory i ich priorytety (7/7)

9.1 && Operator iloczynu logicznego (logiczne AND) If ((x>0) && (y<0)) 9.2 || Operator sumy logicznej (logiczne OR) If ((x>0) ||

(y<0)) 10 ?: Operator warunkowy (odpowiednik if (x==0) x++ else x--) (x==0) ? x++ : x--; 11a = Operator przypisania

X = 2; 11b +=, Operatory przypisania =, *=,/ =, %=, >>=, <<= X+=5; 12 ,

Printf(i=%d,i); Przecinek oddziela argumenty funkcji na licie argumentw Niektre operatory i ich priorytety -podsumowanie 1. Kolejno wyrae (); wskazujcy na wymiar tablicy [] 2. unarne (+, -), post- i pre-inkrementacja (++,--) 3. arytmetyczne (*,/, %) 4. arytmetyczne (+, -) 5. przesunicia (<<, >>) 6. relacji (<, >, <=, >=) 7. relacji (==, !=) 8. bitowe (&, ^, |)

9. iloczynu i sumy logicznej (&&, ||) 10. warunkowy (?:) 11. przypisania (=,+=, -=, *=, /=, >>=, <<=) 12. przecinek (,) Wyraenia proste Wyraeniami prostymi s: identyfikatory, stae, napisy lub wyraenia w nawiasach. Przykad int x=1; int *wsk; char t[]={"tekst"}; *wsk=2; x=x+*wsk; printf(x=%d,x); printf("%s\n\n",*t);

//tekst Wyraenia przyrostkowe Wyraeniami przyrostkowymi s: Odwoania do tablic Wywoania funkcji Odwoania do klas i struktur Zwikszanie i zmniejszanie przyrostkowe Operatory w wyraeniach przyrostkowych s lewostronnie czne. Odwoania do tablic Wyraenie przyrostkowe, po ktrym nastpuje wyraenie ujte w nawiasy prostoktne, jest wyraeniem przyrostkowym oznaczajcym

indeksowane odwoanie do tablicy. Przykad char t[]={"tekst"}; //tablica znakowa char *te="inny tekst"; //wskazanie do cigu znakw int x[3]={1,2,3}; //tablica jednowymiarowa int y[2][3] ={{1,2,3},{4,5,6}}; //tab. wielowymiarowa Wywoania funkcji Wywoanie funkcji skada si z wyraenia

przyrostkowego, zwanego oznacznikiem (identyfikatorem) funkcji, po ktrym nastpuje ujta w nawiasy okrge lista (by moe pusta) wyrae przypisania. Wyraenia przypisania, oddzielone od siebie przecinkami, tworz argumenty funkcji. Przykad void swap(int v[], int i, int j) //deklaracja funkcji ... swap(v,0,rand()%n); //wywoanie funkcji Odwoania do klas i struktur (.) Wyraenie przyrostkowe bdce nazw lub

referencj do klasy, struktury lub unii, po ktrym nastpuje kropka i identyfikator, jest wyraeniem przyrostkowym umoliwiajcym dostp do skadowych tych struktur. Przykad class C_Kolejka { public: int licznik; int kolejka[10]; }; C_Kolejka kol; int main(void) { kol.licznik=0; } //deklaracja klasy //deklaracja klasy

//odwoanie do klasy Odwoania do klas i struktur (->) Wyraenie przyrostkowe bdce wskanikiem do klasy, struktury lub unii, po ktrym nastpuje strzaka (zoona ze znakw - i >) i identyfikator, jest wyraeniem przyrostkowym umoliwiajcym dostp do skadowych tych struktur. Przykad class C_Kolejka { public: int licznik; int kolejka[10]; };

//deklaracja klasy C_Kolejka kol,*wkol; //deklaracje klas int main(void) { kol.licznik=1; wkol=&kol; printf(licznik=%d,wkol->licznik); } //odwoanie do pola klasy Zwikszanie i zmniejszanie przyrostkowe Uyty po wyraeniu przyrostkowym operator

(++) lub (--) powoduje, odpowiednio, zwikszenie lub zmniejszenie wartoci argumentu o jeden. Przykad x++; --x; //x=x+1; - post-inkrementacja //x=x-1; - pre-dekremantacja

Operatory jednoargumentowe Operatory jednoargumentowe s prawostronnie czne. S to: Przedrostkowe operatory zwikszania (++) i zmniejszania (--); Operator adresu (&); Operator adresowania poredniego (*); Jednoargumentowy plus (+); Jednoargumentowy minus(-); Operator dopenienia jedynkowego (~); Operator negacji logicznej (!); Operator sizeof. Przedrostkowe operatory zwikszania i zmniejszania Operatorem (++) poprzedzajcy argument

powoduje zwikszenie argumentu o jeden, natomiast operator (--) powoduje zmniejszenie argumentu o jeden. Przykad x++; x--; ++x; x=y- --x; //post-inkrementacja //post-dekrementacja //pre-inkrementacja //pre-dekrementacja Operator adresu Jednoargumentowy operator (&) podaje adres swojego argumentu. Argument musi by lwartoci nie odnoszc si ani do pola

bitowego, ani do zmiennej zadeklarowanej jako register; argument moe by funkcj. Wynikiem jest wskanik do zmiennej lub funkcji wskazanych l-wartoci. Przykad int *r,x=0; r=&x; Operator adresowania poredniego Jednoargumentowy operator (*) oznacza adresowanie porednie i daje w wyniku zmienn lub funkcj wskazywan przez argument. Wynik

jest l-wartoci, jeli argument jest wskanikiem do typu arytmetycznego, klasy, struktury lub unii lub wskanika. Jeli typem argumentu jest wskanik do typu T, to typem wyniku jest T. Przykad int main(void){ int *w1,*w2, i=1; w1=&i; w2=w1; printf("w1=%p w2=%p",w1,w2); getch(); return(0); } //w1=0012FF88 w2=0012FF88 Jednoargumentowy

plus Argument jednoargumentowego operatora (+) musi by typu arytmetycznego lub wskanikowy. Wynikiem jest warto argumentu. Typem wyniku jest promowany typ argumentu. Przykad int i,x=-1; int *wsk; wsk=&x; i=+(*wsk); //i=-1 Jednoargumentowy minus

Argument jednoargumentowego operatora (-) musi by typu arytmetycznego. Wynikiem jest warto argumentu ze zmienionym znakiem. Wynikiem promocji jest typ cakowity. Przykad int i,x=-1; int *wsk; wsk=&x; i=-(*wsk); //i=1 Operator dopenienia jedynkowego Argumentem operatora (~) jest typ cakowity. Wynikiem jest dopenienie jedynkowe wartoci

argumentu. Promowany jest typ cakowity. Przykad int x=0x0000000f; printf(~x=%x,~x); //wynik ~x=fffffff0 Operator negacji logicznej Argumentem operatora (!) jest typ cakowity lub wskanikowy. Wynikiem jest 1, jeli wartoci argumentu jest 0, a 0 w przeciwnym przypadku. Przykad 1 int *wsk,x=0; printf(!x=%x\n,!x); //wynik !x=1 printf(!wsk=%x,!wsk); //wynik !wsk=1 Przykad 2

int *wsk,x=1; wsk=&x; printf(!x=%x\n,!x); //wynik !x=0 printf(!wsk=%x,!wsk); //wynik !wsk=0 Operator sizeof() Argumentem jest albo nazwa zmiennej, albo wyraenie (ktre nie jest obliczane) albo nazwa typu ujta w nawiasy. Wynikiem jest staa

cakowita bez znaku oznaczajca liczb bajtw stosowan do reprezentowania w pamici struktury bdcej argumentem operatora. Operator nie moe odnie si do funkcji, niekompletnego typu lub pola bitowego. Przykad int *w=NULL, i=1; printf("s_w=%d s_i=%d",sizeof(w),sizeof(i)); //s_w=4 s_i=4 Rzutowanie

Poprzedzenie wyraenia jednoargumentowego nazw typu ujt w nawiasy, lub poprzedzenie tego wyraenia nazw typu i ujcie caego wyraenia w nawiasy, powoduje przeksztacenie wartoci tego wyraenia do wskazanego typu. Takie przeksztacenie nazywane jest rzutem. Przykad float f=1.5; int x,y; x=(int)f; y=int(3.5*f); printf(x=%d\n,x); printf(y=%d\n,y); //rzutowanie w stylu C //rzutowanie w stylu C++ //wynik x=1

//wynik y=5 Operatory multiplikatywne Operatory multiplikatywne: - mnoenia (*), - dzielenia (/) - modulo (%). Argumenty wszystkich operatorw musz by arytmetyczne; argumenty operatora (%) musz by cakowite. Operatory addytywne Operatory addytywne: - dodawania (+) - odejmowania (-)

s lewostronnie czne. Operatory przesunicia Operatory przesunicia w lewo (<<) i w prawo (>>) s lewostronnie czne. Ich argumenty musza by cakowite i podlegaj promocji typu cakowitego. Wynik nie jest zdefiniowany, jeli prawy argument jest ujemny, a take jeli jest wikszy lub rwny liczbie bitw w typie lewego argumentu. Wartoci E1<>E2 jest E1 przesunite w prawo o E2 bitw, co jest rwnowane podzieleniu E1 przez 2^E2. Operatory relacji

Wszystkie operatory relacji: - mniejsze ni (<); - wiksze ni (>); - mniejsze lub rwne (<=); - wiksze lub rwne (>=); daj w wyniku warto 1 jeli relacja jest prawdziwa, za 0 jeli jest faszywa. Typem wyniku jest int. Moliwe jest porwnywanie wskanikw, ale tylko wtedy gdy dotycz zmiennych tego samego typu! Operatory przyrwnania Operatory przyrwnania: - rwne (==) - nie rwne (!=), s podobne do operatorw relacji z tym, e maj niszy priorytet, tak

wic zapis a

Przykad m 0000 1111 0000 1111 k 0000 1111 1111 0000 m&k0000 1111 0000 0000 Bitowy operator rnicy symetrycznej (XOR) Bitowy operator rnicy symetrycznej (^) daje w wyniku bitow rnic symetryczn argumentw. Operator odnosi si tylko do argumentw cakowitych. Przykad

m 0000 1111 0000 1111 k 0000 1111 1111 0000 m^k0000 0000 1111 1111 Bitowy alternatywy (OR) Bitowy operator alternatywy (|) daje w wyniku bitow alternatyw argumentw. Operator odnosi si tylko do argumentw cakowitych. Przykad m k m|k 0000 1111 0000 1111 0000 1111 1111 0000

0000 1111 1111 1111 Operator warunkowy Operator warunkowy o postaci: wyraenie_1 ? wyraenie_2 : wyraenie_3 Najpierw obliczane jest wyraenie_1. Jeli jego warto jest rna od 0 (tzn., e ma warto TRUE), to wynikiem jest warto drugiego wyraenia (wyraenie_2), w przeciwnym przypadku wynikiem jest warto trzeciego wyraenia (wyraenie_3). Przykad //if-else: if (x < y) z = x; else z = y; //odpowiednik:

z = (x < y) ? x : y; Wyraenia przypisania Wszystkie operatory przypisania s prawostronnie czne. S nimi: =, *=, /=, +=,-=, <,=, >>=, &=, ^= i |=. Dla wszystkich operatorw przypisania lewy argument musi by l-wartoci. Wyraenie o postaci: E1op=E2 jest rwnowane z wyraeniem E1=E1 op E2, z tym tylko, e wyraenie E1 jest obliczane raz. Operator przecinkowy Operatory przecinkowe stosuje si do rozdzielania elementw listy argumentw

funkcji lub listy inicjatorw. Np. w wywoaniu funkcji: f(a,(t=3,t+2),c); wystpuj trzy argumenty; drugi ma warto 5. Wyraenia stae Wyraenie stae wyraone s za pomoc staych. S one stosowane w nastpujcych kontekstach: Po sowie case; Jako rozmiar tablicy; Jako dugo pola bitowego; Jako warto staej wyliczania; W inicjatorach i niektrych wyraeniach dla preprocesora.

Deklaracje i definicje Deklaracje okrelaj sposb interpretacji identyfikatorw, nie zawsze jednak rezerwuj pami zwizan z identyfikatorami. Deklaracje, ktre rezerwuj pami nazywa si definicjami. Deklaracja musi zawiera przynajmniej jeden deklarator. Deklarator zawiera przynajmniej kwalifikator typu i nazw deklatarora. Przykady deklaracji Skadnia deklaracji Przykad

Typ wynikowy typ nazwa; int count; typ typ nazwa[]; int count[]; Otwarta tablica okrelonego typu typ nazwa[3]; int count[3];

Tablica o ustalonym rozmiarze typ *nazwa; int *count; Wskanik do danego typu typ *nazwa[]; int *count[]; Otwarta tablica wskanikw do danego typu int *(count[]

); typ *(nazwa[]); Jw. typ (*nazwa)[]; int (*count) []; Wskanik do typu otwartej tablicy typ &nazwa; int &count;

Referencja do danego typu (tylko C++) typ nazwa(); int count(); Typ wartoci zwracanej przez funkcj typ *nazwa(); int *count(); Funkcja zwracajca wskanik int typ *(nazwa());

*(count() ); int (*count) Jw. Wskanik do funkcji zwracajcej okrelony typ Specyfikatory klasy pamici Specyfikatorami klasy pamici s: auto register static extern typedef

W deklaracji moe wystpi co najwyej jeden specyfikator pamici. Jeli nie podano adnego, to obowizuj nastpujce zasady: dla zmiennych zadeklarowanych wewntrz funkcji przyjmuje si klas auto; dla zmiennych zadeklarowanych na zewntrz (wszystkich) funkcji przyjmuje si klas extern lub static Specyfikatory auto i register Specyfikatory auto i register nadaj deklarowanej zmiennej automatyczn klas pamici i mog by stosowane wycznie wewntrz funkcji. Takie deklaracje s jednoczenie definicjami i powoduj zarezerwowania pamici. Deklaracja register jest rwnowana z deklaracj auto, ale deklaruje, e instancja bdzie czsto uywana i w miar

moliwoci powinna by umieszczona w rejestrach procesora. Do instancji zadeklarowanych jako register nie wolno stosowa operatora adresu (&). Przykad int main() { register int k; auto int i; i = 5; return i; } Zmienne automatyczne (1/2)

Zmienne zdefiniowane lokalnie w swoim bloku (zasig blokowy), np. zmienne lokalne funkcji. Powstaj i s inicjowane wartociami pocztkowymi (o ile s podane) za kadym razem, gdy sterowanie wejdzie do ich bloku. W momencie, gdy nastpuje koniec realizacji bloku zmienne znikaj (automatyczny czas trwania). Domylnie wszystkie zmienne lokalne funkcji s klasy auto. Mona w tym przypadku pomin w deklaracjach zmiennych sowo kluczowe auto. Umieszczenie tego sowa podkrela zazwyczaj, e zmienna lokalna dubluje deklaracj zmiennej zewntrznej. Zmienne automatyczne nie posiadaj cznoci. Nie mona zadeklarowa dwch zmiennych o tej samej nazwie w tym samym bloku. Zmienne automatyczne o tych samych nazwach, zdefiniowane w rnych blokach, s rnymi obiektami. Deklaracja zmiennej wewntrz bloku przesania jej deklaracj

zewntrzn, take globaln. Domylnie zmienne automatyczne nie otrzymuj adnej wartoci pocztkowej. Nie mona zakada, e warto pocztkowa zmiennej automatycznej jest rwna 0. Zmienne automatyczne (2/2) int y = 21; void main() { int x; // definicja zmiennej globalnej // deklaracja zmiennej klasy auto // definicja zmiennej klasy auto - przykrywa def. zmiennej globalnej: auto int y = 5;

printf(x=%d,x); // warto x przypadkowa printf(y=%d,y); // y = 5 printf(::y=%d,::y) // ::y = 21 (operator :: tylko w C++) { int y = 11; // definicja lokalna printf(y=%d,y); // y = 11 } printf(y++=%d,y++); // y++= 6 } Specyfikator extern Specyfikator extern uyty na zewntrz (wszystkich) funkcji nadaje zmiennej

czno zewntrzn. Przykad extern int _fmode; extern void Factorial(int n); extern "c" void cfunc(int); /* c - ochrona nazwy funkcji przed jej znieksztaceniem w programach C++ */ Zmienne zewntrzne (1/2) Zmienne zdefiniowane poza funkcjami (tylko to decyduje, e zmienne s zewntrzne, a nie specyfikator extern). Istniej i zachowuj swoje wartoci podczas wykonywania caego programu (statyczny czas trwania). Powstaj i s inicjowane wartociami pocztkowymi raz przed rozpoczciem wykonywania programu. W przypadku braku jawnej inicjalizacji otrzymuj warto pocztkow 0. Inicjacja zmiennych zewntrznych moe nastpi tylko raz w miejscu ich definicji.

Zmienne te mog by wykorzystywane do komunikacji midzy funkcjami nalecymi do rnych plikw programu (czno zewntrzna). Deklaracja zmiennej ze sowem kluczowym extern, np. extern int w, nie powoduje zarezerwowania w pamici miejsca dla zmiennej. Informuje ona kompilator, e definicja zmiennej zewntrznej znajduje si w innym miejscu programu, by moe w innym pliku. Jeeli zmienna jest rzeczywicie zdefiniowana w innym pliku lub po definicji funkcji, w ktrej jest wykorzystywana, to uycie specyfikatora extern jest obowizkowe. W pozostaych przypadkach moe by pominite. Deklaracja extern x jest rwnowana deklarcji extern int x. Zmienne zewntrzne (2/2) /**********plik1.cpp************/ int y = 5;

void main(void) { extern int a; // deklaracja zmiennej zewntrznej extern double z; // deklaracja zmiennej zewntrznej printf(y=%d,y) // y = 5 printf(a=%d,a) // a = 0 printf(z=%d,z) // z =145.2 } int a; // definicja zmiennej int a = 0 /**********plik2.cpp*************/ double z = 145.2; // definicja zmiennej

Specyfikator static Specyfikator static nadaje deklarowanej zmiennej statyczn klas pamici i moe by stosowany zarwno wewntrz jak i na zewntrz funkcji. Wewntrz funkcji specyfikator ten powoduje zarezerwowania pamici oznacza wic definicj. Przykad static void printnewline(void) {}; int mai(void) { static int i; } Zmienne statyczne (1/2) Zmienne o zasigu blokowym (tak jak zmienne automatyczne), ale w odrnieniu od zmiennych automatycznych istniejce i zachowujce swoje

wartoci przez cay czas wykonywania programu (statyczny czas trwania). Zmienne statyczne s inicjowane wartociami pocztkowymi tylko raz w miejscu ich definicji. W przypadku, gdy sterowanie opuci blok, w ktrym zmienna jest zdefiniowana aktualna warto zmiennej zostanie zachowana. W przypadku, gdy zmienne statyczne nie s inicjowane adnymi wartociami, podobnie jak zmienne zewntrzne, otrzymuj domylnie warto 0. Zmienne statyczne mona definiowa lokalnie wewntrz funkcji. S one wwczas widoczne tylko wewntrz tych funkcji. Mona rwnie zdefiniowa zmienn statyczn zewntrzn. Zmienna tego typu, w odrnieniu od zwykej zmiennej zewntrznej, jest widoczna tylko przez funkcje znajdujce si w tym samym pliku, co jej definicja.

Zmienne statyczne (2/2) static int p; // zmienna statyczna zewntrzna void pisz(double x ) { static int licznik; // zmienna statyczna licznik = 0 printf(x=%d,x); licznik++; // zwiksz licznik wywoa funkcji } Specyfikator typedef Specyfikator typedef nie rezerwuje pamici. Przykad typedef unsigned char byte; typedef char str40[41];

typedef struct { double re, im; } s_zespolone; Specyfikatory typw Specyfikatorami typw s: - Void - Char - Short - Int - Long - Float - Double - Signed - Unsigned. Wraz z int mona uy jednego ze specyfikatorw long lub short.; znaczenie jest takie samo jakby sowo int byo

pominite. Sowo long mona uy z double. Jeden z identyfikatorw signed lub unsigned moze by uyty z int bd z jego odmian long, short lub char. Specyfikator signed mona uy do wymuszenia znaku arytmetycznego dla zmiennej typu char; dla pozostaych typw cakowitych jest zbdny, cho dozwolony. Jeli specyfikator typu zosta pominity to przyjmuje si int. Kwalifikatory typw: const i volatile Ze specyfikatorami typw mona uy kwalifikatory typw: const lub volatile. Zmienn z kwalifikatorem const mona inicjowa, lecz nie mona mu pniej przypisywa wartoci. Kwalifikator volatile suy do wyczenia deklarowanej zmiennej z ewentualnej optymalizacji wykonywania kodu. Suy to zabezpieczeniu zmiennej przed niepodanymi dziaaniami podejmowanymi przez

kompilator w celu, np. zwikszenia efektywnoci wykonywania kodu. Przykad volatile int temp; printf(%d,temp); printf(%d,temp); Statyczne struktury danych Rodzaje statycznych struktur danych Najwaniejszymi statycznymi strukturami danych w C s: Tablice Struktury Unie

Tablice Definicja tablicy TABLICA to struktura danych zoona z elementw tego samego typu, przy czym dostp do kadego z tych elementw odbywa si przez podanie jego numeru (indeksu w tablicy). Deklarowanie tablic Deklaratory tablic maj skadni: Nazwa_typu deklarator_tablicy; Tablice mona konstruowa z typw predefiniowanych i typw definiowanych przez uytkownika.

Przykad int t[9], *wskt[15]; int tw[2][2]; Inicjowanie tablic (1/2) Elementy tablic mog by inicjowane w miejscu ich deklaracji. Wartoci na licie inicjacyjnej musz by zgodne z liczb, kolejnoci i typem danych tablicy. Przykad. Inicjowanie tablic tekstowych. char t[]={"tekst"}; //jednowymiarowa tablica znakowa printf("%s\n",*t); char *te="inny tekst"; printf("%s\n",te);

//wskazanie do cigu znakw //rwnowane sposoby inicjowania wielowymiarowych tab. teks.: char kolory[][15]={{"CZEROWNY"},{"NIEBIESKI"},{"ZIELONY"}}; char *kolory[15]={{"CZEROWNY"},{"NIEBIESKI"},{"ZIELONY"}}; printf("%s\n",kolory[0]); //CZEROWNY Inicjowanie tablic (2/2) Przykad. Inicjowanie tablic liczbowych. int x[3]={1,2,3}; //tablica jednowymiarowa int y[2][3] ={{1,2,3},{4,5,6}}; //tab. wielowymiarowa Struktury Deklaracje struktur Struktura jest obiektem skadajcym si ze zbioru nazwanych

skadowych o rnych typach. Specyfikator struktury ma posta: struct [] { [ ] ; } [] ; Przykad struct s_przyjaciele { char nazwisko [20], imie[20], nr_telefonu[20]; int wiek, wzrost; } moj_przyjaciel; //dostp do elementu: strcpy(moj_przyjaciel.nazwisko,Abacki); // deklarowanie danych: struct s_przyjaciele moi_przyjaciele[100]; Inicjowanie struktur (1/2) Pola struktur i unii mog by inicjowane w miejscu

ich deklaracji. Wartoci na licie inicjacyjnej musz by zgodne z liczb, kolejnoci i typami danych pl struktury lub unii. Przykad struct ts_osoba { char nazwisko[15]; char imie[15]; long PESEL; unsigned rok, miesiac, dzien; } os1={"Abacki", "Adam",12345678901, 1990, 8,20}, os2={"Babacki", "Bogdan",12345678901, 1991, 4,14}; Inicjowanie struktur (2/2) Jeli na licie inicjacyjnej jest mniej staych ni pl struktury lub unii, to w przypadku struktur statycznych i zewntrznych pozostae skadowe s inicjowane wartociami zerowymi. W pzrypadku struktur

automatycznych zaleny to od kompilatora (najczciej skadowe s inicjowane wartociami zerowymi). Przykad #include #include ... ts_osoba os3={"Cabacki"}; //struktura statyczna int main(void){ ts_osoba os4={"Dabacki"}; //struktura automatyczna printf("naz=%s im=%s pesel=%d",os3.nazwisko, os3.imie, os3.PESEL); //naz=Cabacki im= pesel=0 printf("naz=%s im=%s pesel=%d",os4.nazwisko, os4.imie, os4.PESEL); //naz=Dabacki im= pesel=0 getche(); return 0;

} Nadawanie wartoci skadowym struktur - przykad #include #include #include ... ts_osoba os; int main(void){ //posrednia aktualizacja wartosci pola: strcpy(os.nazwisko,"Abacki"); //podstawiania bezposrednie: os.PESEL=12345678901; os.rok=1990; os.miesiac=10; os.dzien=12;

return 0; } Rezerwacja pamici dla struktur Pola struktury s umieszczane w pamici zgodnie z kolejnoci wystpowania w deklaracji. Kade pole struktury zajmuje osobny obszar pamici. czny rozmiar struktury jest rwny sumie rozmiarw jej skadowych. Rozmiar struktury jest zawsze wikszy lub rwny sumie rozmiarw jej skadowych. Przykad struct ts_osoba { char nazwisko[15]; char imie[15]; long PESEL; unsigned rok, miesiac, dzien; } os;

//size=46 (15+15+4+4+4+4): printf("size=%d",sizeof(ts_osoba)); //adresy pol: printf("adr nazwisko=%p\n",&os.nazwisko[0]); printf("adr imie=%p\n",&os.imie[0]); printf("adr PESEL=%p\n",&os.PESEL); Struktury zagniedone Skadowymi struktur mog by rwnie inne struktury. Odwoanie do pola struktury, ktra sama jest skadow innej struktury odbywa si z wykorzystaniem dwch kropek. Przykad struct ts_data { unsigned rok, miesiac, dzien; }; struct ts_osoba {

char nazwisko[15]; char imie[15]; long PESEL; ts_data data; } os; os.data.rok=1990; Unie Deklaracje unii Unia jest obiektem, ktry w danej chwili zawiera jedn ze swoich kilku skadowych o rnych typach. Specyfikator unii jest analogiczne jak specyfikator struktury: union [] { ; ...

} [] ; Przykad union u_int_lub_long { int i; long l; } liczba; Inicjowanie unii (1/2) W uniach wszystkie skadowe s pamitane we wsplnym obszarze pamici. Dlatego uni inicjuj si jedn dan odpowiadajc typowi pierwszego pola unii. Dla unii statycznych i zewntrznych pola niezainicjowane s ustawiane na wartoci zerowe. Przykad

union tu_znaki_liczba { char znaki[4]; int liczba; } zl={"ABC\0"}; Inicjowanie unii (2/2) Jeli dane inicjujce s innego typu, to (o ile to moliwe) wykonywana jest automatyczna konwersja. Przykad #include #include tu_znaki_liczba zl1={65}; //znaki[0]='A' int main(void){ //znaki[0]=(char)65.66='A' rzutowanie: tu_znaki_liczba zl2={65.56};

printf("znak=%c",zl1.znaki[0]); //znak=A printf("znak=%c",zl2.znaki[0]); //znak=A getche(); return 0; } Rezerwacja pamici dla unii Pola unii s zajmuj wsplny obszar pamici, w zwizku z tym rozmiar unii jest rwny rozmiarowi jej najwikszej skadowej, a wszystkie skadowe maj ten sam adres. Przykad union tu_znaki_liczba { char znaki[4]; int liczba; } z;

printf("size=%d",sizeof(z)); //size=4 (max{4,4}) printf("adr z.znaki=%p\n",&z.znaki[0]); //adr z.znaki=004D06E4 printf("adr z.liczba=%p\n",&z.liczba); //adr z.znaki=004D06E4 Unie anonimowe (C++) W jzyku C++ istnieje moliwo deklarowania statycznych unii bez nazwy typu i bez definiowania nazwy zmiennej. Pola unii s wwczas traktowane jak zwyke zmienne, ktre zajmuj ten sam obszar pamici. W odwoaniach do skadowych unii s wykorzystywane jedynie nazwy skadowych. Dziki wykorzystaniu unii anonimowej uzyskujemy oszczdno pamici. Przykad static union { char znaki[4];

int liczba; }; int liczba; //bd! int main(void){ liczba=2; Pola bitowe Ograniczenia dla wielkoci pl bitowych W przypadku pl typu cakowitego mona w deklaracji struktury (unii) okreli ile bitw bd one zajmoway. Zakres wartoci, ktre mona

przechowywa w danym polu zaley od liczby bitw przydzielonych polu oraz od tego czy jest to pole ze znakiem, czy bez znaku. Najmniejsza ilo pamici przeznaczona na pojedyncze pole wynosi 1 bit. Najwiksza wynosi 16 (instancje int). Jeli pole 1-bitowe jest typu signed int (char), to moe ono przyjmowa wartoci 0 lub 1. Jeli pole jest typu unsigned int (char), to moe ono przyjmowa wartoci 0 lub 1. Jeli nie podamy czy pole typu int (char) jest signed czy unsigned, to sposb interpretacji zaley od kompilatora (na og int jest interpretowane jako signed int). Pole bitowe definiuje si podajc typ danej, nazw pola i po dwukropku liczb bitw wykorzystywanych przez pole. Pole bitowe w strukturze przykad

struct ts_bit { unsigned ubit : 1; int ibit : 1; } b; b.ubit=1; b.ibit=1; //ubit=1 ibit=-1: printf("ubit=%d ibit=%d",b.ubit,b.ibit); Dostp do pl bitowych Dostp do pl bitowych jest realizowany w taki sam sposb jak do zwykych pl. Kompilator automatycznie dodaje kod umoliwiajcy odczytanie zawartoci pola. Rozmiar struktury jest zawsze wikszy lub rwny ni suma rozmiarw pl skadowych. struct atrybut {

int bit1 : 1; int bity2_10 : 9; int bit11 : 1; int bity12_23 : 12; } a; a.bit1 = 1; a.bity2_10 =32; a.bit11 = 1; a.bity12_23=1024; printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n", // rozmiar struktury 23 bity

a.bit1); a.bity2_10); a.bit11); a.bity12_23); sizeof(a)); // -1 // 32 // -1 // 1024 //3 Deklaracje klas (w C++) Klasa jest obiektem skadajcym si ze zbioru nazwanych skadowych: - pl (fields) lub atrybutw (attributes) rnych typw;

- metod (usug, operacji) (methods, services, operations) zwracajcych wartoci rnych typw. Specyfikator klasy ma posta: class nazwa_klasy [(lista_inicjalizacyjna)] [:nazwa_klasy_bazowej [(lista_wyrazen_inicjujacych)]] [;] Przykad class student { private: float srednia; // pole public: int stu_ocena_sr(int ID_stu); // metoda }; Wyliczenia

Deklarowanie typu wyliczeniowego Wyliczenia s szczeglnymi typami o wartociach ze zbioru nazwanych staych tzw. wylicznikw. Posta specyfikatora wyliczania zostaa zapoyczona od struktur i unii: enum [] { [= ], ...}; Dopuszczalne jest, by dwa rne identyfikatory miay tak sam warto (np. stosowane po to, aby wykonywa t sama akcj dla rnych wartoci typu wyliczeniowego). W przypisaniach mog wystpi wyraenia stae, kompatybilne z typem int. Wyliczenie obejmuje cig wartoci staych o logicznie powizanym znaczeniu. Przykad enum trzy_kolory {CZERWONY, ZIELONY=10, NIEBIESKI=10}

kol1,kol2=ZIELONY,kol3=NIEBIESKI,kol4,kol5; kol1=CZERWONY; printf("%d\n",kol1); //0 printf("%d\n",kol2); //10 printf("%d\n",kol3); //10 kol4=0; printf("%d\n",kol4); //0 kol5=2; printf("%d\n",kol5); //2 Przykad (1/3)

Kolorowe napisy. enum te_kolory {CZER=1, ZIEL=2, NIEB=3}; te_kolory kol; int c; randomize(); c=1+random(16)%3; kol= (te_kolory)(c); // losowanie kolor u switch (kol) { default: textcolor(LIGHTGRAY); cprintf("Kolor szary \n\r"); break; case CZER : textcolor(RED); cprintf("Kolor czerwony \n\r"); break; case ZIEL : textcolor(GREEN); cprintf("Kolor zielony \n\r"); break; case NIEB: textcolor(BLUE); cprintf("Kolor niebieski \n\r"); break; } Przykad (2/3) Wypisywanie nazw kolorw

zdefiniowanych jako wyliczniki. enum te_kolory {CZER=1, ZIEL=2, NIEB=3}; te_kolory kol; char *kolory[15]={{""},{"CZEROWNY"},{"ZIELONY"},{"NIEBIESKI"}}; for (kol=CZER; kol<=NIEB; kol++) printf("%s\n",kolory[kol]); Przykad (3/3) Wykorzystanie typu wyliczeniowego w charakterze typu argumentu funkcji. void wypisz_kolor(te_kolory k) { char *kolory[15]={{""},{"CZEROWNY"},{"ZIELONY"}, {"NIEBIESKI"}}; printf("%s\n",kolory[k]); }

Deklaratory Definicja deklaratora Deklarator to notacja zapisu typw, funkcji, tablic i innych elementw skadni jzyka. Deklaratory pojawiaj si po specyfikatorach klas pamici i typw. Deklaratory wskanikw Deklaratory wskanikw maj skadni: Nazwa_typu *deklarator_wskaznikow; Przykad int i=1; int *a[3];

int *wsk; int *const cwsk=&i; /*cwsk wskazuje zawsze to samo miejsce pamici, chocia warto tego miejsca mona zmienia*/ const int c=3, *pwsk; /* wartoci c nie mona zmienia, ale mona j zainicjowa; wartoc pwsk moe si zmienia, ale wskazanego miejsca pamici nie mona zmienia*/ Deklaratory tablic Deklaratory tablic maj skadni: Nazwa_typu deklarator_tablicy; Przykad int t[9]; char tc[10];

Deklaratory funkcji Deklarator funkcji ma posta: Nazwa_typu deklarator_funkcji; gdzie deklarator_funkcji ma posta: nazwa_funkcji (lista_parametrow) Przykady deklaracji parametrw formalnych funkcji: 1. int func(void) //bez parametrw, np. przykad: printf(f=%d,func()); 2. int func(int t1, int t2, int t3=1) /* trzy parametry typu int, ostatni z domyln wartoci */ przykad: printf(f=%d,func(1,2)); 3. int func(int* ptr1, int& tref) // wskanik i referencja przykad: printf(f=%d,func(&a,b)); //int a,b; Inicjowanie Deklarator zmiennej moe zawiera inicjator.

Inicjator, ktry poprzedza operator (=), jest albo wyraeniem staym, albo list inicjatorw zawart w nawiasach klamrowych. Przykad int i=0; const float pi=3.14; float ppi=2*pi; int t[3]={1,2,3}; int ta[]={2,3,5}; char string[] = to jest napis\n; int y[2][3] ={{1,3,5},{2,4,6}}; /* inicjowanie tablicy wielowymiarowej*/ int y[2][3]={{1},{2}}; //inicjowanie pierwszej kolumny Nazwy typw Podanie nazwy typu danych jest konieczne w kilku przypadkach:

1. Przy wymuszaniu przeksztacenia typu przez rzutowanie; 2. Przy deklarowaniu typw w deklaratorze funkcji; 3. W argumencie operatora sizeof. Przykad 1. int x; x=int(x+1.5); 2. void fun(void); 3. l=sizeof(double); Nazwy typedef Deklaracje, w ktrych specyfikatorem klasy pamici jest typedef, nie deklaruj zmiennej, lecz definiuj identyfikatory jako nazwy typw pochodnych (uytkownika). O takich identyfikatorach mwimy, e s nazwami typedef.

Skadnia nazw typedef ma posta: typedef ; Przykad typedef unsigned char byte; typedef char str40[41]; typedef struct { double re, im; } complex; Instrukcje Instrukcje Jeli nie okrelono inaczej, instrukcje s wykonywane sekwencyjnie. Instrukcje wykonuje si w celu osignicia pewnych efektw, najczciej stosowane s do zapisu algorytmu i do sterowania

wykonywaniem programu. Instrukcje nie maj wartoci. Rozrnia si nastpujce grupy instrukcji: Instrukcje etykietowane; Instrukcje wyraeniowe; Instrukcje zoone; Instrukcje wyboru; Instrukcje powtarzania; Instrukcje skoku. Instrukcje etykietowane Etykieta suy do oznaczania miejsc w obrbie funkcji, gdzie zostanie przeniesione sterowanie wykonywaniem programu po wykonaniu stosownej instrukcji goto. Etykieta ma identyfikator skonstruowany wg tych samych zasad jak identyfikator zmiennej, przy czym koczy si on

dwukropkiem (:). Etykiet mona poprzedzi kad instrukcj w tej samej funkcji, w ktrej wystpuje instrukcja goto. Instrukcje mog by poprzedzone przedrostkami etykietowanymi na dwa sposoby: identyfikator_etykiety : instrukcja; case wyrazenie_stale : instrukcja; default : instrukcja; Etykiety przypadkw (case) i domylna (default) s uywane w instrukcji switch. Przykad 1 et1: // etykieta a=5; ... goto et1; Instrukcje zoone (bloki)

Aby mona byo uy kilku instrukcji, tam gdzie powinna by jedna, wprowadzono instrukcj zoon, zwan blokiem. Skadnia bloku jest nastpujca: {[lista_deklaracji] [lista_instrukcji] } Przykad int i=1; void main(void){ int i=2; { int i=3; printf("i_globalne=%d, i_lokalne=%d",::i,i); } } Instrukcje wyboru Instrukcje wyboru su do wybrania jednej z kilku cieek wykonywania

programu. Wyrnia si nastpujce instrukcje wyboru: Instrukcja if; Instrukcja switch. Instrukcja if Istniej dwie postacie syntaktyczne instrukcji if: - if (wyrazenie) instrukcja; - if (wyrazenie) instrukcja; else instrukcja1; W obu postaciach instrukcji if wyraenie musi mie typ arytmetyczny lub wskanikowy. Jeli warto wyraenie jest rna od zera (TRUE), to wykonywana jest instrukcja. W drugiej postaci, jeli warto wyraenia jest rwna zeru (FALSE), to wykonywana jest instrukcja1.

Przykad if (val==1) printf(TRUE); else printf(FALSE) Instrukcja switch Instrukcja switch powoduje przekazanie sterowania do jednej z szeregu instrukcji, zalenie od wartoci wyraenia, ktre musi mie typ cakowity. Skadnia instrukcji switch: switch ( ) { case : ; [break;] . [default : ;] } Przykad switch (ch) {

case a : printf(A\n); break; case b : printf(B\n); break; default : printf(KONIEC\n); }; Ptle programowe Rozdaje ptli programowych Wyrnia si trzy rodzaje ptli programowych: Ptle z wartownikiem Ptle z licznikiem Ptle oglne Ptle z wartownikiem Ptle z wartownikiem, w ktrej dane s czytane i

przetwarzane a do napotkania szczeglnego, niedozwolonego elementu. Wartownik to warto powodujca zakoczenie ptli. Nie jest ona przetwarzana, a ptla zostaje przerwana. Ptle z wartownikiem wymagaj wczytania danej przed pierwszym wykonaniem testu. T operacj nazywa si odczytem pocztkowym. Pseudokod ptli z wartownikiem ma posta: do { wczytaj dan; przetwrz dan; } while (dana nie jest wartownikiem); Ptle z licznikiem Ptle z licznikiem, stosuje si w sytuacjach, gdy a priori znana jest liczba powtrze ptli. Licznika uywamy do kontroli liczby przebiegw ptli. Najczciej do

implementacji ptli z licznikiem wykorzystuje si instrukcj for, chocia mona uyc instrukcji while, aby wyranie rozdzieli inicjacj od testu i treci ptli. Pseudokody ptli z licznikiem maj postacie: for (inicjowanie licznika; warunek kocowy; wyraenie modyfikujce licznik) przetwarzanie danych; a=10; i=0; while (i

licznikiem. Ptle oglne implementowane s zazwyczaj z uyciem instrukcji while. Instrukcje powtarzania (organizacji ptli programowych Instrukcje powtarzania wskazuj iteracyjne wykonywanie programu. Istniej trzy instrukcje organizacji ptli: while (wyrazenie) instrukcja; do instrukcja while (wyrazenie); for([wyrazenie1]; [wyrazenie2]; [wyrazenie3]) instrukcja; Instrukcja while

W instrukcji while wykonanie instrukcji powtarza si dopty, dopki warto wyraenia jest rna od zera (TRUE); wyraenie musi mie typ arytmetyczny lub wskanikowy. Przykad i=0; while (i<3) { printf(%d,a[i]); i++; }; Instrukcja do-while W instrukcji do-while wykonanie instrukcji powtarza si dopty, dopki warto wyraenia jest rna od zera (TRUE); wyraenie musi mie typ

arytmetyczny lub wskanikowy. Przykad i=0; do { printf(%d,a[i]); i++; } while (i<3); Instrukcja for W instrukcji for wyrazenie1 oblicza si tylko raz; jest to cz inicjujca stan ptli. Nie ma ogranicze dotyczcych typu tego wyraenie. Drugie wyraenie musi mie typ arytmetyczny lub wskanikowy; jest ono obliczane przed kadym przebiegiem ptli i jeli stanie si zerem (FALSE), to wykonanie instrukcji for zostaje przerwane. Trzecie wyraenie jest obliczane po kadym przebiegu ptli i okrela zmian stanu ptli. Nie ma ogranicze dotyczcych typu

tego wyraenie. Dowolne z trzech wyrae mona pomin. Pominicie drugiego wyraenia jest rwnowane z zastpieniem go sta rn od zera. Skadnia: for ([wyrazenie1]; [wyrazenie2]; [wyrazenie3]) instrukcja; Przykad for (i=0;i<3;i++) printf(%d,a[i]); Instrukcje skoku Instrukcje skoku powoduj bezwarunkowe przekazanie sterowania do innego miejsca w programie. Instrukcjami skoku s:

- continue - break -return - goto identyfikator_etykiety Instrukcja continue Instrukcja continue moe wystpi tylko w instrukcjach powtarzania. Powoduje przekazanie sterowania do miejsca wznawiania najcianiej otaczajcej j ptli. Przykad void main (void) { for (i = 0; i < 20; i++) { if (array[i] == 0) continue; array[i] = 1/array[i]; } }

Instrukcja break Instrukcja break moe wystpi tylko w instrukcjach powtarzania i instrukcji switch i powoduje przerwanie najcianiej otaczajcej j takiej instrukcji; sterowanie przekazywane jest do nastpnej po przerwanej instrukcji. Przykad void main (void){ int l=0; for (i = 0; i < 20; i++) { if (array[i] == 0) break; l++; array[i] = 1/array[i]; }; printf(l=%d,l); }

Instrukcja return Instrukcja return powoduje powrt do miejsca wywoania. Jeli po sowie return wystpuje wyraenie, to warto tego wyraenia jest przekazywana do miejsca wywoania. Warto wyraenia jest przeksztacana do typu zwracanego przez funkcj. Przykad double sqr(double x) { return (x*x); } Instrukcja goto W instrukcji goto identyfikator etykiety

musi by umieszczony w tej samej funkcji. Sterowanie jest przekazywane do instrukcji opatrzonej t etykiet. Przykad powtorz: i=x+2; goto powtorz; //etykieta Deklaracje zewntrzne Tekst programu przekazany do kompilatora jest jednostk tumaczenia. Jednostka ta skada si z cigu deklaracji zewntrznych, ktre s albo

instancjami, albo definicjami funkcji. Skadnia deklaracji zewntrznej jest taka sama, jak wszystkich innych deklaracji, jednake tylko na tym poziomie mona zdefiniowa funkcj. Przykad int licznik; //deklaracje zewntrzne int potega(float p, int w); void main (void){} Definicje funkcji Definicja funkcji ma posta: typ identyfikator_funkcji([parametry]) Dozwolonymi specyfikatorami klas pamici w specyfikatorach deklaracji s tylko extern i static. Funkcja moe zwraca wartoci typu arytmetycznego, klas, struktur, uni, wskanik lub void; natomiast nie moe

zwrci funkcji ani tablicy. Przykad int max (int, int, int); //deklaracja funkcji int main(void) { return (0); } int max (int a, int b, int c) //definicja funkcji { int m; m=(a>b) ? a:b; return (m>c) ? m:c; }; Deklaracje zewntrzne Deklaracje zewntrzne opisuj waciwoci przestrzeni nazw, tj. instancji, funkcji, nazwy typedef, staych wylicze (elementy enum), etykiet, identyfikatorw (etykietki) klas, struktur, unii i wylicze (enum). Klas pamici dla zmiennych zadeklarowanych na zewntrz mona pomin lub mona poda jako

extern lub static. Zmienne zadeklarowane zewntrznie s zawsze statyczne. Mona je uczyni wewntrznymi dla danej jednostki kompilacji (pliku) za pomoc sowa kluczowego static; to nadaje im czno wewntrzn. Zmienne staj si globalne dla caego programu, gdy pominie si deklaracj klasy pamici lub stosuje sowo kluczowe extern nadajce im czno zewntrzn. Zasig i czno nazw Cay program nie musi by tumaczony w tym samym czasie: tekst rdowy moe by trzymany w kilku plikach zawierajcych jednostki tumaczenia, a uprzednio przetumaczone podprogramy mona docza z bibliotek. Komunikacja midzy funkcjami programu moe by

realizowana zarwno przez wywoania, jak i przez manipulowanie danymi zewntrznymi. Istniej zatem dwa rodzaje zasigu nazw: 1. Wewntrzny dotyczy tego fragmentu programu, w ktrym znany jest identyfikator; jest to tzw. zasig leksykalny identyfikatora. 2. Zewntrzny dotyczy powiza midzy identyfikatorami pochodzcymi z oddzielnie kompilowanych jednostek tumaczenia. Program w C Model programu Program w C zawiera sekwencje deklaracji i definicji, ktre mog okrela dane lub funkcje.

System typw w C System typw opisuje wartoci, ktre mog by przyjmowane przez okrelone dane. W jzyku C istnieje nieskoczony zbir typw, z ktrych kady mona poczy z konkretn zmienna. Te typy oraz zasady ich konstruowania tworz systemw typw jzyka C. Podstawowe typy danych jzyka C: Znaki (char (-128-127), unsigned char(0-255)); Liczby cakowite (int(-2*109-2*109), short int(-32K-32K), unsigned int (04*109), long(-2*109-2*109), unsigned long (0-4*109)); Liczby zmiennopozycyjne (float(3.4*10-38-3.4*10+38), double(1.7*10-308-1.7*10+308), long double(3.4*10-4932-1.1*10+4932)); Wyliczenia (enum) Wskaniki (near (32 bity), far (32bity)) Reguy formuowania

typw Reguy formuowania typw wymagaj istnienia pewnych typw, ktre mog by albo typami podstawowymi (predefiniowanymi), albo wczeniej skonstruowanymi za pomoc tych regu. Przykady regu formuowania typw w C: Tablice Struktury Unie Wskaniki Specyfikator typedef Specyfikator typedef Specyfikator typedef umoliwia tworzenie synonimw dla nazw typw. Przykady:

typedef unsigned int odleglosc; typedef struct { double re, im; } s_zespol; typedef s_zespol t_zespol[10]; czenie danych Jzyk C zawiera bogaty zestaw operatorw umoliwiajcych manipulowanie danymi i czenie ich wartoci. Operatory podstawowe: 1. Operatory arytmetyczne 2. Operatory logiczne 3. Operatory porwnania 4. Operatory dziaa na poziomie bitowym 5. Operatory przypisania 6. Operatory rzutowania (koercji)

Operatory arytmetyczne Operatory arytmetyczne (atithmetic operators): dwuargumentowe (*, /, +, -) jednoargumentowe (+, -) operator modulo (i % j) operatory zwikszania i zmniejszania o jednostk (++, --) Operatory logiczne

Operatory logiczne (logical operators): koniunkcji (&&): wyraenie x && y zwraca warto 1, jeli oba operandy s rne od zera. Uwaga: warto y w ogle nie jest obliczana, jeli x ma warto 0; alternatywy (||):wyraenie x || y zwraca warto 1, jeli przynajmniej jeden operand jest rny od zera. Uwaga: warto y w ogle nie jest obliczana, jeli x ma warto rn od zera; jednoargumentowy operator negacji (!): wyraenie !x zwraca 0, jeli x jest rzne od zera. trjargumentowy operator warunkowy (?):wyraenie x? y : z zwraca warto y, jeli x jest rne od zera oraz warto y, jeli x jest zerem. Operatory porwnania Operatory porwnania (comparasion operators).

Wynikiem stosowania kadego z szeciu operatorw porwnania (==,!=,<,>,<=,>=) jest 0 jeli relacja jest nieprawdziwa i 1 jeli relacja jest prawdziwa. Operatory dziaa na poziomie bitowym Operatory dziaa na poziomie bitowym (bitwise manipulation operators). Operatory te traktuj liczby cakowite jak cigi bitw odpowiadajce ich reprezentacjom binarnym. Nale do nich operatory: Koniunkcji poziomu bitowego (&) Alternatywy poziomu bitowego (|) Rnicy symetrycznej (^) Przesunicia bitowego w lewo (<<)

Przesunicia bitowego w prawo (>>) Operatory przypisania Operatory przypisania (assignment operators) (=,+=,-=,/ =,*=, %=, <<=, >>=) Operatory koercji Operatory koercji (rzutowania) (coersion operators). Koercja to proces przeksztacania wartoci jednego typu na odpowiadajca jej warto innego typu. Przykad x=float(i)/2 ; Funkcje

Okrelenia funkcji Funkcja to nazwana operacja lub nazwany kod. Funkcja jest grup powizanych instrukcji (fragmentem kodu programu), ktre realizuj okrelone zadanie. Funkcje s podprogramami, ktre mog by wielokrotnie wykonywane dla rnych danych wejciowych. Deklaratory funkcji Deklarator funkcji ma posta: Nazwa_typu deklarator_funkcji; gdzie deklarator_funkcji ma posta: nazwa_funkcji (lista_parametrow) Przykady deklaracji parametrw formalnych funkcji:

1. int func(void) //bez parametrw, np. przykad: printf(f=%d,func()); 2. int func(int t1, int t2, int t3=1) /* trzy parametry typu int, ostatni z domyln wartoci */ przykad: printf(f=%d,func(1,2)); 3. int func(int* ptr1, int& tref) // wskanik i referencja przykad: printf(f=%d,func(&a,b)); //int a,b; Parametry (argumenty) funkcji Funkcja moe przyjmowa i zwraca pewne wartoci. Wartoci przekazywane s do funkcji jako parametry. Wyrnia si dwa rodzaje parametrw: Parametry formalne; Parametry aktualne.

Parametr formalny (formal parameter) to nazwa i typ parametru okrelone w ramach jej definicji lub deklaracji. Parametr aktualny (actual parameter) wyraenie wystpujce w miejscu pewnego parametru formalnego funkcji, albo warto parametru obliczona w momencie wywoania funkcji. Przekazywanie parametrw Przekazywanie parametrw (parameters passing) to przesyanie wartoci lub wyrae uytych w wywoaniu funkcji do rodowiska wykonywania funkcji. W jzyku C istniej dwie techniki przekazywania parametrw: Wywoanie przez warto (call-by-value);

Wywoanie przez referencj (call-byreference), gdzie przekazywana jest referencja do zmiennej. Wywoanie przez wskanik (tylko w C++) Wywoanie przez warto (1/2) Wywoanie przez warto realizowane jest poprzez przekazanie wartoci, np. w postaci kopii wartoci zmiennej. Argument formalny jest traktowany jak zmienna lokalna funkcji, tzn. wszelkie operacje na argumencie trac wano po zakoczeniu funkcji. Przykad 1. int sign(float x){ int s; float eps=0.0001; if (x<0.0) s=-1;

else if (fabs(x)<=eps) s=0; else s=1; return s;} //czy poprawnie? Przykad 2. int plus1(int s){ s=s+1; return s;} int s=1; printf("s=%d s+1= %d",s,plus1(s)); Poprawna posta funkcji sign() int sign(float x) { const float eps=1.0e-5;

if (fabs(x) <=eps) return 0; else if (x

sre=0.0; for (i=0;i

for (j=0;j

int a=1,b=2; printf("a=%d b=%d",a,b); //a=1 b=2 zer(a,b); printf("a=%d b=%d",a,b); //a=1 b=0 Wywoanie przez referencj (2/2) Tablice przekazywane s przez referencj. Przykad. Transponowanie macierzy. //deklaracja (specyfikacja) funkcji: void transp(int n, int t[][3]); int main(void){ int t[3][3]; transp(3,t); }

//definicja funkcji: void transp(int n, int t[][3]){ int i,j,tmp; for (i=0;i<3;i++) for (j=i;j<3;j++) { tmp=t[i][j]; t[i][j]=t[j][i]; t[j][i]=tmp; }} Wywoanie przez wskanik Jest to odmiana przekazywania parametrw przez warto. Funkcja otrzymuje kopie wskanika, ktry moe okrela adres zmiennej nalecej do innej funkcji. Zmiana zawartoci obszaru wskazywanego przez parametry

wskanikowe prowadzi do zmiany wartoci zmiennych utworzonych w innych funkcjach programu. Przekazywanie parametrw przez wskaniki jest stosowane: do przekazywania struktur danych o duych rozmiarach (np. tablic); w celu umoliwienia zwrcenia wicej ni jednej wartoci. t_struct lista(t_struct *head, t_struct *x) Argumentami aktualnymi mog by wskazania do odpowiednich typw (wartoci zmiennych wskanikowych odpowiednich typw): head=lista(head,x); Wasnoci funkcji typ zwracanej wartoci jest podawany przed nazw funkcji; lista parametrw funkcji moe by pusta; mona ten fakt podkreli bezporednio posugujc si sowem kluczowym void;

funkcja moe zwraca wynik dowolnego typu z wyjtkiem tablic i funkcji; jeli nie podano typu funkcji, to domylnie przyjmowany jest typ int; lista parametrw funkcji ma nastpujc posta: typ_1 par1, typ_2 par2, ... parametry deklarowane s tak jak zmienne; kady parametr musi mie indywidualnie zadeklarowany typ; parametry w licie s rozdzielone przecinkami; pocztek i koniec funkcji okrelaj nawiasy klamrowe; w C parametry funkcji mog by przekazywane przez warto lub referencj, w C++ dodatkowo przez wskanik; wewntrz funkcji nie mog pojawia si definicje innych funkcji; za pomoc sowa kluczowego return zwracana jest warto funkcji; return warto koczy dziaanie funkcji; jeeli funkcja nie musi zwraca wyniku, to jako typu wartoci

naley poda void. Deklaracja funkcji Deklaracja funkcji jest pojciem logicznym. Stanowi informacj dla kompilatora, e funkcja o okrelonej nazwie, typie wartoci oraz liczbie i typie parametrw moe zosta uyta (ale nie musi) w danym module programu. Deklaracja funkcji musi koczy si rednikiem. Deklaracja funkcji nazywana jest prototypem funkcji. double sum(double, double); //prototyp funkcji Pliki nagwkowe *.h, doczane dyrektyw #include, zawieraj prototypy funkcji, ktrych kody wynikowe doczane s na etapie czenia z bibliotek standardowych. Prototyp funkcji mwi kompilatorowi jakiego typu warto jest

zwracana przez funkcj oraz jakie s jej parametry. Dziki temu moliwe jest podczas kompilacji sprawdzenie czy w poprawny sposb wykorzystywana jest warto zwracana przez funkcj oraz czy podawane s parametry odpowiednich typw. Ponadto, prototypy pozwalaj szybko zorientowa si jakie funkcje s dostpne i jak z nich korzysta. Definicja funkcji Definicja funkcja mwi o tym co funkcja robi. Zawiera instrukcje umoliwiajce realizacj odpowiedniego fragmentu programu. W odrnieniu od deklaracji przydzielany jest obszar pamici, w ktrym znajdzie si kod wynikowy funkcji. Przykad double sum (double x, double y)// definicja funkcji

{ return (x+y); } Uwagi (1/2) Jeeli typy argumentw przekazywanych do funkcji nie s zgodne z typami okrelonymi w definicji czy prototypie, to przeprowadzane s konwersje do typw okrelonych w prototypie. Podczas kompilacji w trybie jzyka C++ wywoanie funkcji bez prototypu lub definicji traktowane jest jako bd. Ponadto, bdy zgaszane s w nastpujcych przypadkach: podano za mao parametrw, podano zbyt wiele parametrw, wystpuje niezgodno typu parametrw (mimo

konwersji). Zaleca si doczanie prototypw funkcji poprzez wczanie odpowiedniego zbioru nagwkowego dyrektyw #include. Uwagi (2/2) Jeeli podane s prototypy to, definicje o takich samych nagwkach powinny znajdowa si poza funkcj main. W prototypach zazwyczaj nie podaje si nazw argumentw, a jedynie ich typy. Nazwy podane w prototypach nie musz by powtrzone w definicji, gdy i tak sprawdzane s typy danych. Prototyp: double sum(double x, double y); Definicja: double sum(double a, double b) { return (a+b); } Zaleca si, aby nazwy argumentw w prototypach i

definicjach byy zgodne. W jzyku C++ mog istnie funkcje o tych samych nazwach i rnych parametrach, ktre zwane s funkcjami przecionymi. Na podstawie typu funkcji i liczby parametrw kompilator wybiera waciw funkcj. Funkcje z atrybutem inline (1/2) Wywoanie funkcji wie si z umieszczeniem argumentw na stosie oraz wykonaniem skoku pod odpowiedni adres. W przypadku funkcji o niewielkich rozmiarach czas zwizany z jej wywoaniem moe by porwnywalny z czasem wykonania funkcji. Jeeli chcemy, aby kod funkcji by umieszczany w miejscu jej wywoania, to naley poprzedzi definicj funkcji atrybutem inline. Pozwala to zwikszy szybko odwoa do funkcji. Funkcje z atrybutem inline nie powinny zawiera sw

kluczowych: do, while, for, goto, switch, case, break, continue. Wystpienie jednego z wymienionych sw spowoduje, e kompilator potraktuje funkcj jako zwyk funkcj statyczn. Funkcje z atrybutem inline (2/2) inline double pot(double x) { return x*x*x; } inline int max(int a, int b) { return (a > b ? a : b); } void main(void) { int a = 2; int b = 7; printf(x^3=%d,pot(a)); // x^3 = 8 printf(Max=%d, max(9, max(a,b)));

} // Max = 9 W przypadku wywoania max(9, max(a,b)) funkcja max zostanie dwukrotnie wczona do kodu wynikowego. Rekurencja Definicja rekurencji Rekurencja (rekursja) to sposb definiowania (potencjalnie) nieskoczonych struktur danych i podprogramw przy uyciu ich wywoa.

Definicja rekurencyjna Definicja rekurencyjna skada si z dwch czci. W pierwszej, zwanej przypadkiem brzegowym (base case) lub pocztkowym, s wyliczane elementy podstawowe, stanowice czci skadowe wszystkich pozostaych elementw zbioru. W drugiej, zwanej krokiem indukcyjnym (recursion), s podane reguy s podane reguy umoliwiajce konstruowanie owych bytw z elementw podstawowych lub bytw zdefiniowanych wczeniej. Reguy te mona stosowa wielokrotnie, tworzc nowe byty. Przykad. Do skonstruowania zbioru liczb naturalnych potrzebny jest element podstawowy jeden i operacja zwikszania o jeden: 1. 1N 2. jeli nN, to (n+1) N. 3. nie ma adnych innych bytw w zbiorze N oprcz tych, ktrych istnienie wynika z regu 1 i 2. Definicji rekurencyjnych uywa si czsto do:

Definiowania struktur danych Definiowania podprogramw Rekurencyjne (rekursywne) typy danych Rekurencyjny (rekursywny) typ danych to taki typ danych, ktrego definicja zawiera odwoanie do typu definiowanego. Przykad. Drzewo genealogiczne. struct s_rod { char nazwisko[20]; char imie[20]; s_rod *ojciec, *matka; }; ... struct s_rod *my_dg, *my_dg_ojciec; my_dg=(s_rod *)malloc(sizeof(struct s_rod)); strcpy(my_dg->nazwisko,"Abacki");

my_dg_ojciec=(s_rod *)malloc(sizeof(struct s_rod)); strcpy(my_dg_ojciec->nazwisko,"Abacki-senior"); my_dg->ojciec=my_dg_ojciec; free(my_dg_ojciec); free(my_dg); Rekurencyjne definiowanie podprogramw (1/2) Rekurencyjne definiowanie podprogramw stosowane jest najczciej do rozwizywania problemw poprzez rozoenie ich na prostsze podproblemy tego samego rodzaju. Ta metoda jest czasem bardzo pomocna (np. w algorytmie szybkiego sortowania quicksort), a czasem bardzo kopotliwa. Przykad. Definicja rekurencyjna funkcji silnia: n! = n*(n-1)*...*1 = n* (n-1)! Inna posta definicji rekurencyjnej:

1, gdy n 1 przypadek brzegowy n! n * n 1!, gdy n 1 krok indukcyjny Rekurencyjne definiowanie podprogramw (2/2) Przykad. Definicja rekurencyjna liczb wymiernych: 1, gdy n 0

f n 1 f n 1 , gdy n 0 f n 1 Stosujc t definicj uzyskuje si cig liczb

wymiernych: 1,2, 5/2, 29/10, 941/290, ... . Techniki rekurencyjnego wywoywania podprogramw Rekurencyjne wywoywania podprogramw mog by realizowane na wiele sposobw: bezporednio albo w sposb bardziej zawikany, jedno- lub wielokrotnie. Moe by wiele poziomw rekurencji i rzdw zoonoci. Techniki rekurencyjnego wywoywania podprogramw: Rekurencja kocowa Rekurencja niekocowa Rekurencja porednia Rekurencja zagniedona

Rekurencja kocowa Rekurencja kocowa (tail recursion) cechuje si obecnoci tylko jednego wywoania rekurencyjnego na samym kocu podprogramu. Zatem, w miejscu wywoania nie pozostaj ju adne instrukcje do wykonania; nie ma adnych wczeniejszych wywoa rekurencyjnych, bezporednich ani porednich. Przykad. Rekurencja kocowa void tail(int i) { if (i>0) { printf("%d\n",i); tail(i-1);} }; ... tail(3); ///3 2 1

Rekurencja niekocowa (1/2) Rekurencja niekocowa cechuje si obecnoci tym, e w ciele funkcji wystpuje jedno lub wiksza liczba wywoa rekurencyjnych w dowolnym miejscu ciaa funkcji. Przykad. Rekurencja niekocowa. void NoTail(int i) { if (i>0) { NoTail(i-1); printf("%d\n",i); NoTail(i-1);} }; ... NoTail(3); //1 2 1 3 1 2 1 Rekurencja niekocowa (2/2)

Przykad. wypisywanie cigu znakw w odwrotnej do wczytanej kolejnoci. void reverse(void) { char c; if ((c=getchar())!='\n') { reverse(); putchar(c); }} Rekurencja porednia Omawiane dotychczas techniki wywoa rekurencyjnych polegay na bezporednim wywoywaniu funkcji przez sam siebie. Funkcja moe byc wywoywana porednio przez acuch innych wywoa. Przykad. Obliczanie wartoci funkcji trygonometrycznych sinus, cosinus, tangens.

x 3 tg 3 x 3 sin x sin * 3 2 x 1 tg 3 tg x

sin x cos x x cos x 1 2 sin 2 2 przy czym warunek brzegowy okrela wyraenie: x3 sin x x 6 Rekurencja zagniedona (1/2) Rekurencja zagniedona ma miejsce wwczas, gdy funkcja jest nie tylko zdefiniowana przez sam

siebie, ale take jest uyta jako jeden z parametrw. Rekurencja zagniedona (2/2) Przykad. Funkcja Ackermanna. Funkcja Ackermanna Na pocztku XX wieku wydawao si, e funkcje pierwotnie rekurencyjne stanowi klas wszystkich funkcji obliczalnych. Plan Hilberta by skonstruowa ca matematyce na podstawie elementarnych operacji typu tych z funkcji pierwotnie rekurencyjnych, ale funkcja Ackermann'a, ktra wydaje si bardzo dobrze zdefiniowan (podwjn rekurencj) i intuicyjne obliczaln nie jest pierwotnie rekurencyjn, nie moe zatem by rozpatrywana jako podstawa matematyki. Funkcja Ackermanna, zwana rwnie funkcj AckermannaPetera, jest wan w teorii oblicze funkcj rekurencyjn, ktra ma dwa argumenty bdce liczbami naturalnymi i zwraca liczb naturaln.

n 1 dla m 0 A m, n A m 1, n dla m 0 i n 0 A m 1, A m, n 1 dla pozostalych Istota rekurencyjnego wywoania funkcji Rekurencyjne wywoanie funkcji polega na ponownym jej wywoaniu jeszcze przed jej zakoczeniem. Przy kadym wywoaniu rekurencyjnym tworzona jest kopia

rodowiska funkcji cznie ze wszystkimi parametrami i zmiennymi lokalnymi. Wywoanie kadej funkcji powoduje umieszczenie na stosie: informacji umoliwiajcej powrt z funkcji do miejsca wywoania, parametrw funkcji, zmiennych lokalnych (automatycznych) istniejcych w momencie wywoania funkcji. Ze wzgldu na ograniczon pojemno stosu funkcje rekurencyjne nie powinny posiada zbyt duej liczby parametrw i zmiennych lokalnych ani te zmiennych o duych rozmiarach. Rekurencyjne definiowanie funkcji Przykad rekurencyjnej definicji funkcji silnii (factorial fiunction) f(n):

f(0) = 1 f(n) = n *f(n-1) dla kadego naturalnej liczby n > 0 Dla n=3 otrzymujemy: f(3) = 3 f(3-1) = 3 f(2) = 3 2 f(2-1) = 3 2 f(1) = 3 2 1 f(1-1) = 3 2 1 f(0) =3211 =6 Wywoania funkcji i realizacja rekurencji Wszystkie wspczesne jzyki programowania umoliwiaj implementacj funkcji rekurencyjnych. Do rekurencyjnego wywoania w programie funkcji

wykorzystywany jest stos. Stan kadej wywoywanej funkcji jest opisany wartoci wszystkich zmiennych automatycznych i parametrw funkcji oraz adres powrotu, wskazujcy miejsce wznowienia wykonywania procesu, ktry wywoa funkcj. Obszar danych zawierajcy te informacje nosi nazw rekordu wywoa (aktywacji; activation record) lub ramki stosu (stack frame). Jest on umieszczany na stosie programu. Rekord wywoania istnieje a do zakoczenia dziaania funkcji, ktrej dotyczy. W program C/C++ najduej istnieje rekord wywoania dla funkcji main(). Zawarto rekordu wywoania Rekord wywoania zawiera zwykle nastpujce

dane: Wartoci wszystkich parametrw funkcji (adres tablicy i kopie wszystkich pozostaych danych). Wartoci wszystkich zmiennych lokalnych (automatycznych) lub adres miejsca ich przechowywania (zaley to od kompilatora). Adres powrotu adres instrukcji nastpnej po instrukcji wywoujcej funkcj. Dynamiczne dowizanie wskanik do rekordu wywoania procesu wywoujcego funkcj. Zwracana warto tylko, gdy nie jest to warto typu void.

Potga Rekurencyjne wywoywanie funkcji obliczajcej podnoszc dowoln liczb x do nieujemnej cakowitej potgi n. Definicja funkcji potgujcej: gdy n 0 1, x n potega x, n x * x n 1 , gdy n 0 Poziom wywoania 1 2 3

4 Parametry wywoywanej funkcji potega(x,4) potega(x,3) potega(x,2) potega(x,1) 5 potega(x,0) Poziomy wywoania funkcji potgujcej x4 Wartoci zwracane przez wywoywan funkcj

x*x*x*x x*x*x x*x x 1 Schemat Hornera Wielomian: wn(x)=a0xn+a1xn-1++an-1x+an mona zapisac w postaci: wn(x)=(((a0x+a1)x+a2)x+.+an-1)x+an lub w postaci rekurencyjnej: wn(x)= wn-1(x)x+ an, gdzie w0(x)=a0. n=1,2,,

Rekurencyjny algorytm Euklidesa k dla n 0 NWD n , k NWD n %k , k dla n 0 Przykadowo NWD(18,12)=NWD(6,12)=NWD(0,6)=6. Niebezpieczestwa rekurencji Ze stosowaniem rekurencji

zwizanych jest wiele niebezpieczestw. Dwa najwaniejsze spord nich to: dublowanie oblicze przepenienie stosu Dublowanie oblicze Dublowanie oblicze polega na niepotrzebnym wykonywaniu tych samych oblicze. Przykad. Obliczanie wartoci cigu Fibonacciego. Liczby Fibonacciego s zdefiniowane w sposb rekurencyjny: F0=0 F1=1 Fi=Fi-1+ Fi-2 , dla i>=2.

Pocztkowe litery cigu Fibonacciego: 0,1,1,2,3,5,8,13,21,34,55, Liczby Fibonacciego rosn wykadniczo. Implementacja funkcji obliczajcej liczby Fibonacciego Funkcja fib() zwraca warto cigu Fibonacciego dla i>=0. int fib(int i) { If (i<2) return i; else return fib(i-1)+ fib(i-2); }

Drzewo oblicze dla funkcji fib(4). Liczba wywoa funkcji fib() f(n) 6 25 10 177 15

1973 20 21891 25 242785 30 2692537 3000000 2500000 2000000

f(n) Wykazuje si, e w celu obliczenia wartoci fib(n) liczba wywoa funkcji fib() wynosi f(n)=2*fib(n+1)-1. Liczba ta jest ogromna ju dla niewielkich n, co obrazuj tabela i wykres. n 1500000 1000000

500000 0 1 2 3 4 n 5 6 Programowanie dynamiczne

Aby radzi sobie z takimi problemami mona wykorzysta programowanie dynamiczne, ktre najoglniej polega na odejciu od rekurencji na rzecz programowania iteracyjnego. Programowanie dynamiczne mona zastosowa do tych problemw, ktre mona podzieli na wiele podproblemw. Wyniki rozwiza podproblemw s zapamitywane w odpowiednich strukturach danych (najczciej w tablicy), unikajc w ten sposb wielokrotnych oblicze dla tego samego podproblemu. Programowanie dynamiczne polega wic na wykonania oblicze kadego podproblemu tylko raz i zapamitaniu jego wyniku w tabeli. W kadym kolejnym kroku mona z tej tabeli korzysta. Przykad

Ponisza funkcja FIB_DYN zwraca warto cigu Fibonacciego dla i>=0 obliczon metod programowania dynamicznego. FIB_DYN(i) { f[0]1 f[1] 1 k2 while (k

zwraca warto funkcji MacCarthyego dla cakowitego x. MacCarthy(x) { If (x>100) return (x-10) else return MacCarthy(MacCarthy(x+11))} Liczba wywoa funkcji MacCarthy() Wskaniki Wskanik Wskaniki s mechanizmem ustanawiajcym relacje midzy komrkami pamici. 1. Wskanik jest komrk, ktrej zawarto jednoznacznie identyfikuje inn komrk.

2. Wskaniki to adresy wskazujce miejsce pooenia zmiennych dynamicznych w pamici operacyjnej. 3. Wskaniki zawieraj adresy logiczne, ktre s zapisane w postaci segment : offset, gdzie cz segmentowa okrela numer bloku pamici o rozmiarze 64 KB wzgldem, ktrego liczone jest przesunicie offset. Na podstawie adresw logicznych zmiennych i funkcji mona wyznaczy ich adresy fizyczne. Przykad. int *wsk; Klasyfikacja wskanikw (1/2) Wskaniki dziel si na: wskaniki danych (zawieraj adresy zmiennych),

wskaniki kodu (zawieraj adresy funkcji). Wskaniki mog by dalekie (czterobajtowe), definiowane z wykorzystaniem sowa kluczowego far i zoone z dwubajtowej czci segmentowej i dwubajtowej czci offsetowej dane typu unsigned (np. void far *daleki), lub bliskie (dwubajtowe), definiowane za pomoc sowa kluczowego near i zoone tylko z dwubajtowego offsetu (np. void near *bliski). W przypadku braku sowa near lub far (ANSI C) rodzaj wskanika zaley od przyjmowanego w kompilatorze modelu pamici (np. tiny, small, medium). Klasyfikacja wskanikw (2/2) W przypadku, gdy w definicji wskanika

wystpuje (tylko BC++): near (np. double near *y) wskaniki s zawsze bliskie, far (np. double far *x, int far *d) wskaniki s zawsze dalekie, huge (np. double huge *u) s zawsze dalekie znormalizowane, tzn. ich offsety nale zawsze do przedziau od 0 do 15 (przy wszelkich operacjach na wskanikach tego typu nastpuje automatyczna korekcja offsetu i segmentu). Adresy logiczne i fizyczne Wskaniki zawieraj adresy logiczne, ktre maj nastpujc

posta: adres_logiczny = segment : offset Interpretacja czci segmentowej i offsetowej zaley od trybu adresowania. Sposb wyznaczania adresu fizycznego na podstawie znajomoci adresu logicznego (segmentu i offsetu dane typu unsigned) zaley od trybu adresowania. Wyrnia si dwa tryby adresowania: adresowanie rzeczywiste adresowanie wirtualne Adresowanie rzeczywiste W trybie adresowania rzeczywistego (aplikacje dla systemu DOS; kompilator BC) segment

okrela numer bloku pamici o rozmiarze 64KB wzgldem, ktrego liczone jest przesunicie okrelone przez offset. Kady taki blok moe zaczyna si od adresu fizycznego (adresu bazowego) podzielnego przez 16 (przykadowe adresy bazowe 0, 16, 32, 48, itd.). Adres bazowy jest rwny 16segment, natomiast adres fizyczny oblicza si ze wzoru 16segment + offset. Na przykad wskanik 0xb800:0x0001 reprezentuje adres fizyczny rwny 0xb8001. Adresowanie wirtualne W trybie adresowania wirtualnego (aplikacje dla systemu Windows; kompilator BCW) segment jest numerem selektora, ktry identyfikuje deskryptor definiujcy adres pocztku (adres

bazowy) bloku pamici zwizanego ze wskanikiem. Selektor okrela pozycj deskryptora bloku w tablicy deskryptorw, natomiast offset przesunicie w bloku. Adres fizyczny oblicza si ze wzoru adres_bazowy + offset. Zakresy adresowania pamici przy pomocy wskanikw Wskaniki bliskie umoliwiaj dostp do komrek pamici w obrbie bloku 64KB (zmiana offsetu od 0 do 0xFFFF). W trybie adresowania rzeczywistego wskaniki dalekie umoliwiaj dostp do

komrek pamici o adresach z zakresu od 0 do 0xFFFFF (1 MB), natomiast w trybie adresowania wirtualnego dostp do komrek pamici o adresach 32-bitowych, tj. od 0 do 0xFFFFFFFF (4GB). Notacja graficzna dla wskanikw Notacja graficzna pozwala zobrazowa operacje wykonywane na wskanikach. W notacji tej wystpuj kwadraty odpowiadajca komrkom pamici zwizanym z poszczeglnymi zmiennymi, zarwno statycznymi jak i dynamicznymi. Wskaniki, tzn. wartoci zmiennych wskanikowych, przestawia si za pomoc strzaek. Wskazane

przez nie miejsca PAO s dostpne jedynie poprzez wskaniki. Zmienne statyczne posiadaj etykiety bdce ich nazwami. Przykad int *i1, *i2; i1=malloc(sizeof(int)); *i1=5; i2= malloc(sizeof(int)); i1 i1 5 i2

i1 5 i2 i1 5 i1 7 *i2=5; i2=i1;

*i2=7; i2 i2 5 5 5 nieuyt ek Definiowanie wskanikw (1/3) Przykady:

char *wsk_c; // wskanik do zmiennej typu char unsigned char *wsk_uc; // wsk. do zmiennej typu unsigned char int *wsk_i; // wskanik do zmiennej typu int long *wsk_l; // wskanik do zmiennej typu long float *wsk_f; // wskanik do zmiennej typu float double *wsk_d; // wskanik do zmiennej typu double Analogicznie definiuje si wskaniki typu far i huge. float far *wsf;

double huge *wsh; Wskanik danego typu powinien by wykorzystywany do przechowywania adresw zmiennych tego samego typu. Definiowanie wskanikw (2/3) W celu inicjacji wskanika naley przypisa mu adres zmiennej wykorzystujc operator &, ktry podaje adres swojego argumentu. Jeeli x jest zmienn, to &x jest sta okrelajc adres (pooenie w pamici) zmiennej x. Staa &x moe by wykorzystana do zainicjowania wskanika pokazujcego na pocztek bloku pamici, w ktrym przechowywana jest zmienna x. Przykad int x = 5;

// zmienna x typu int zainicjowana sta 5 int *px = &x; // zmienna wskanikowa px zainicjowana sta &x float v = 1.2; // zmienna v typu float zainicjowana sta 1.2 // px = &v; // bd nie mona inicjowa wskanika do typu int // adresem (wskanikiem) do typu float (&v jest typu float *) Definiowanie wskanikw (3/3) Jeeli w miejscu deklaracji wskanika jego warto pocztkowa nie zostanie okrelona (ustawiona na adres zmiennej odpowiedniego typu), to zostanie on zainicjowany automatycznie zgodnie z reguami obowizujcymi dla zmiennych. W szczeglnoci, wskaniki statyczne i zewntrzne

s domylnie inicjowane zerami (wsk = NULL), natomiast wartoci pocztkowe wskanikw lokalnych nie s okrelone (s wartociami przypadkowymi). Wygodnie jest inicjowa wskaniki lokalne wartoci NULL, gdy mona taki przypadek atwo wykry w programie. Na przykad: if (wsk!=NULL) { wykonaj instrukcje; }. Arytmetyka wskanikw Jedynymi dopuszczalnymi operacjami arytmetycznymi na wskanikach s: dodawanie i odejmowanie liczb naturalnych, co powoduje przesunicie wskanika odejmowanie dwch wskanikw pokazujcych na elementy tej samej tablicy. Przykad

int *w1,*w2; int t[3]={1,2,3}; w1=&t[0]; //w1=t; w2=&t[2]; printf("t=%d\n",(w2-w1)); //2 Porwnywanie wskanikw Do porwnywania wskanikw mona wykorzysta wszystkie operatory relacji: ==, !=, <,<=, >, >=. Warto zauway, ze operatory <,<=, >, >= maj sens tylko dla wskanikw pokazujcych na elementy tej samej tablicy. Przykad int *wsk, *wsk1,*wsk2; int t[3]={1,2,3};

wsk1=t; wsk2=&t[n]; if (wsk==NULL) printf(wskaznik nie pokazuje na nic); if (wsk1<=wsk2) int t[3]={1,2,3}; int *wsk; for (wsk=t;wsk

2. operacje na tekstach 3. wskaniki w argumentach funkcji; 4. dynamiczne przydzielanie (alokacja) i zwalnianie (dealokacja) obszarw pamici Praca z tablicami (1/2) Wskaniki mona wykorzysta do indeksowania tablicy. Przykad 1 int *wsk; int t[10]; wsk=&t[n]; wsk++; //wsk wskazuje na n. element tablicy t[] //wsk wskazuje na (n+1). element tablicy t[]

Przykad 2 int *wi; int t[3]={1,2,3}; wi=t; printf("t[0]=%d ma adres=%p\n",*wi,wi); *wi=4; printf("t[0]=%d\n",t[0]); Praca z tablicami (2/2) Dostp do tablic za pomoc wskanikw jest szybszy ni dostp realizowany za pomoc indeksw. W przypadku posugiwania si wyraeniem tab[i] za kadym razem jest obliczane wyraenie &tab[0] + i*sizeof(int), ktre okrela adres i-tego elementu tablicy. for (i=0; i<8; i++) printf("tab[%d] = %3d\n", i, tab[i]); Natomiast, w przypadku posugiwania si wskanikiem int

*wsk=tab realizowana jest tylko operacja wsk++, ktra powoduje przesunicie wskanika do kolejnej pozycji w tablicy. W przypadku programu: for (i=0, wsk=&tab[0]; i<8; i++) printf("*(wsk+%d) = %3d\n", i, *wsk++); Operacje na tekstach (1/3) Wskaniki pozwalaj znacznie skrci operacje na acuchach. char lan[] = "tekst"; char bufor[20]; unsigned h = 0; char *src = &lan[0]; char *dst = &bufor[0]; h = strlen(src); // strlen() zwraca liczb znakw tekstu - bez znaku '\0' printf("Dlugosc lancucha = %d %d\n", h, strlen(lan) );

Zawarto acucha lan mona przekopiowa do acucha bufor na kilka sposobw. Kopiowanie z wykorzystaniem indeksw tablic (2/3) for (i=0; i<=h; i++) bufor[i] = lan[i]; 0 // dla i == h kopiowany znak \ Nazwa tablicy jest staym wskanikiem do jej pierwszego elementu. Mona wic wyprowadzi teksty za pomoc printf("lan = %s\nbufor = %s\n", lan, bufor); lub uwzgldniajc, e src = &lan[0] oraz dst = &bufor[0] printf("lan = %s\nbufor = %s\n", src, dst); Kopiowanie z wykorzystaniem wskanikw

(3/3) Kopiowanie z wykorzystaniem wskanikw char *src = &lan[0]; char *dst = &bufor[0]; Wariant 1. while (*src!=0) { *dst = *src; // przypisanie src++; dst++; // zmiana wskanikw } *dst = '\0'; // dodanie 0 na kocu printf("lan = %s\nbufor = %s\n", lan, bufor); Wariant 2. while (*src) { *dst++ = *src++; } *dst = '\0'; // dodanie 0 na kocu

printf("lan = %s\nbufor = %s\n", lan, bufor); Zastosowanie wskanikw w argumentach funkcji Wskaniki mona wykorzysta do definiowania przekazywania wartoci argumentw funkcji przez referencj. Przykad Porwnajmy dwa sposoby przekazywania wartoci: 1. przez warto: int plus1(int s){ s=s+1; return s;} int s=1; printf("s=%d s+1=%d",s,plus1(s)); //1 2

2. przez refencj: void plus1(int *sf){ *sf=*sf+1;} int s=1; plus1(&s); printf("s=%d",s); //2 Argument formalny bdcy wskanikiem do obiektu const Poniewa, przy przekazywaniu do funkcji tablicy, przekazywany jest jedynie adres tablicy, wic w ciele funkcji jeli element tablicy bdzie l-wartoci, to zmieni si warto tego elementu. Jeli nie chcemy, by funkcja modyfikowaa zawarto tablicy

naley przekaza j jako wskanik do obiektu staego. Przykad void t_pokaz(const int *wsk, int n){ int i,s=0; for (i=0;i

kompilator na podstawie ich definicji. Dostp do takich zmiennych odbywa si za pomoc ich identyfikatorw. Zmienne te posiadaj pewne wasnoci wynikajce z ich zasigu, cznoci i czasu trwania. Stae, zmienne statyczne i zewntrzne maj zarezerwowane miejsce w kodzie wykonywalnym programu (s umieszczane w obszarze danych programu). Zmienne lokalne (automatyczne) funkcji s umieszczane na stosie w momencie, gdy sterowanie wejdzie do bloku, w ktrym zostay zdefiniowane. Zmienne tej klasy znikaj po wyjciu sterowania z bloku. Istnieje moliwo dynamicznego tworzenia i kasowania zmiennych w trakcie dziaania programu. Su do tego celu funkcje malloc() calloc(), i free() (jzyk C/C++) oraz operatory new i delete (tylko C++).

Funkcja malloc() Posta syntaktyczna funkcji: void *malloc(size_t size); Funkcje malloc() i calloc przydzielaj pami z obszaru sterty, zwanej kopcem (heap), w obszarze od 0 do 1 MB i zwracaj wskazanie do przydzielonego obszaru. Rozmiary przydzielanej pamici nie przekraczaj 64 KB (size_t jest typu unsigned) . Jeeli alokacja nie jest moliwa, to zwracany jest wskanik NULL. Funkcja calloc() dodatkowo zeruje przydzielon pami. Funkcje malloc() i calloc() zwracaj wskaniki do typu void dlatego niezbdne s konwersje typu przy podstawieniach do wskanikw innych typw. Przykad. char *str; if ((str = (char *) malloc(10)) == NULL) { printf("Brak wolnej pamieci do alokacji bufora \n"); exit(1); }

strcpy(str,"Hello"); printf("ciag= %s\n", str); free(str); Przydzielanie obszarw wikszych ni 64kB Do przydzielania, w obszarze od 0 do 0xFFFFF (1 MB), blokw pamici o rozmiarze wikszym ni 64 KB oraz alokowania pamici w obszarze tzw. sterty dalekiej, adresowanej przez wskaniki typu far (np. void far *p), su w systemie BC++ odpowiedniki przedstawionych funkcji, tj. void far *farmalloc(long K) oraz void far *farcalloc(long N, long K). Do zwolnienia bloku suy funkcja farfree(). #include void *p = NULL;

void *q = NULL; long a, b; a = 65000; b = 400000; q = farmalloc(b); // alokacja bloku 400000 bajtow printf("%p\n",q); // np. 009029E8 p = malloc(a); // alokacja bloku 65000 bajtow printf("%p\n",p); // np.0096446C free(p); p = NULL; farfree(q); q = NULL; Uwagi o dynamicznym przydzielaniu pamici

W trybie adresowania rzeczywistego sterta moe zajmowa pami o adresach od 0 do 1 MB. Natomiast w trybie adresowania wirtualnego moe by wykorzystywana caa dostpna pami w tym obszar powyej 1 MB. Rozmiar przydzielanej pamici jest proporcjonalny do rozmiaru tworzonego obiektu (zawsze nie mniejszy ni rozmiar tworzonej zmiennej). Utworzona zmienna nie posiada nazwy, ale jej adres jest podstawiany do wskanika odpowie dniego typu. Mona wic uzyska do niej dostp za pomoc operatora wyuskania Wasnoci zmiennych utworzonych za pomoc funkcji malloc() istniej od momentu ich utworzenia za pomoc funkcji malloc() do momentu likwidacji za pomoc funkcji free();

nie posiadaj nazwy; dostp do nich jest moliwy wycznie za pomoc wskanikw; nie podlegaj reguom obowizujcym dla zwykych zmiennych, a dotyczcym zasigu, cznoci i czasu trwania; nie s automatycznie inicjowane wartociami pocztkowymi w momencie utworzenia; przydzielony blok pamici zawiera warto przypadkow; po zwolnieniu pamici wskanik zmiennej nadal zawiera ten sam adres, ale zwolniona pami moe by udostpniona dla innych zmiennych (naley uwaa, aby nie wstawia danych do pamici wskazywanej przez wskanik, ktry wskazuje na zwolniony obszar pamici). Funkcja free() Do zwalniania pamici uprzednio przydzielonej przy

pomocy funkcji calloc(), malloc() lub realloc() suy w C funkcja free() o postaci: void free(void *block); Funkcja free() nie zwraca adnej wartoci. Uwaga: Programista zawsze musi mie wiadomo, e nie mona odwoywa si za pomoc wskanikw do komrek pamici wewntrz zwolnionego bloku; prba dostpu do takiej komrki spowoduje bd! Tworzenie zmiennych dynamicznych i zapamitywanie ich adresw za pomoc wskanikw (1/3) int *wsk_do_int_1(void) //funkcja zwraca wskanik do int { return (int *)malloc(sizeof(int));

} int *w=NULL; w=wsk_do_int_1(); if (w){ *w=1; printf("w=%d\n",*w); //w=1 } free(w); Tworzenie zmiennych dynamicznych i zapamitywanie ich adresw za pomoc wskanikw (2/3) void wsk_do_int_2(int* *x){ //funkcja ustawia wskaznik do int *x=(int *)malloc(sizeof(int)); **x=1;

} int *w=NULL; wsk_do_int_2(&w); if (w) { //*w=1; - rwnowany sposb printf("w=%d\n",*w); //w=1 } free(w); Tworzenie zmiennych dynamicznych i zapamitywanie ich adresw za pomoc wskanikw (3/3) void wsk_do_int_3(int* &x){ //funkcja ustawia referencje do int x=(int *)malloc(sizeof(int)); *x=1;

} int *w=NULL; wsk_do_int_3(w); if (w){ //*w=1; - rwnowany sposb printf("w=%d\n",*w); } free(w); Uwagi Nie naley stosowa funkcji free() dla obiektw, ktre nie zostay utworzone za pomoc funkcji malloc() . Nie wolno rwnie kasowa dwa razy tego samego obiektu. Aby si ustrzec przed tak moliwoci wystarczy po skasowaniu obiektu ustawi jego wskanik na NULL. Zwalnianie wskanika pustego nie powoduje bdu.

Naley rwnie uwaa, aby nie utraci zawartoci wskanika, ktry zawiera adres zmiennej utworzonej za pomoc funkcji malloc() . W takim przypadku nie bdzie mona zwolni przydzielonej pamici, co moe doprowadzi do wyczerpania sterty. Zmienna dynamiczna moe by utworzona wewntrz funkcji. Przydzielony obszar pamici nie znika po zakoczeniu funkcji. Naley jednak zadba o to, aby funkcja przekazaa wskanik do utworzonego obszaru na zewntrz. Operatory new i delete (C++) Operator new Operator new ma posta: new nazwa_typu <(inicjator)> Przykad

int *wsk; wsk=new int(32); //*wsk=32 Operator delete Posta syntaktyczne operatora delete: delete nazwa_obiektu; Operator delete usuwa obiekt z pamici zanim zostanie zlikwidowany wskanik do tego obiektu. Przykad typedef int tint10[10]; tint10 *t; t=(tint10 *)new tint10; ... delete t;

Metody testowania dostpnoci pamici sprawdzanie poprawnoci wykonania operacji przydziau pamici wykorzystanie set_new_handler wykorzystanie instrukcji try/catch(xalloc) Sprawdzanie poprawnoci wykonania operacji przydziau pamici int *wsk; wsk= new int[1234]; if (!wsk) printf(brak pamieci);

Przykad Dynamiczne tworzenie tablicy dwuwymiarowej. int m = 3; //liczba wierszy. int n = 5; //liczba kolumn int i,j; int **data; try { // sprawdzanie mozliwosci utworzenia tablicy data = new long double*[m]; // krok 1: Tworzenie wierszy. for (j = 0; j < m; j++) data[j] = new long double[n]; // Krok 2: Tworzenie kolumn } catch (xalloc) {cout << "NIe mozna utworzyc tablicy";

exit(-1); } for (i = 0; i < m; i++) for (j = 0; j < n; j++) { data[i][j] = i + j; //inicjoanie i drukowanie tablicy cout << data[i][j] << " "; cout << "\n" << endl; for (i = 0; i < m; i++) delete[] data[i]; // Krok 1: Usuwanie kolumn delete[] data;}} // Krok 2: Usuwanie wierszy Wskaniki stae Wartoci wskanika staego nie wolno zmienia po pocztkowym ustalenie jego

wartoci, ale warto wskazywanej komrki pamici moe si zmienia. int i=2; int k=2; int *const wsk = &i; stalym wsk=&k; //bad! i=2; //poprawnie //wsk jest wskaznikiem Wskaniki do staej Wskanik do staego wskazuje na miejsce pamici, ktrego wartoci nie mona zmienia, ale warto samego wskanika

moe by zmieniana. int x[3]={1,2,3}; const int *wsk //wsk jest wskaznikiem do stalej typu int wsk=x; wsk++; *wsk=0; //poruszanie wskaznkiem jest dozwolone //blad! Wskaniki do funkcji Oglna posta deklarowania wskanika do

funkcji: typ (*nazwa_funkcji) (parametry_funkcji) Przykad 1 int (*fun) (void) Funkcja fun jest wskanikiem do funkcji wywoywanej bez adnych parametrw, a zwracajcej warto typu int. Przykad int pierwsza(void); //deklaracje dwoch funkcji, ktre maja by wywolywane int druga(void); int main(void) { int i; int (*fun)(void);

printf("i="); scanf("%d",&i); switch(i){ //przypisanie wartosci funkcji fun() case 1: fun=pierwsza; break; case 2: fun=druga; break; default : fun=NULL; break; } if (fun) (*fun)(); //wywolanie funkcji o okreslonym adresie getch(); return(0); } int pierwsza(void){ printf("pierwsza\n");} int druga(void){ printf("druga\n");}

Funkcje operujce na adresach pamici Odczytanie wartoci segmentu i offsetu wskanika umoliwiaj funkcje: unsigned FP_SEG(void far *wsk); unsigned FP_OFF(void far *wsk); // segment wskanika // offset wskanika Utworzenie wskanika o okrelonym segmencie i offsecie umoliwia funkcja: void far *MK_FP(unsigned segment, unsigned offset). Przykad void far *d = MK_FP(0xB800, 0x0000); unsigned s = FP_SEG(d); // s = 0xB800;

unsigned o = FP_OFF(d); // o = 0x0000; Wskaniki typu void (1/2) Wskanik do zmiennej okrelonego typu zawiera informacj o adresie zmiennej oraz jej typie (co ma znaczenie podczas wykonywania operacji arytmetycznych z udziaem wskanika oraz interpretacji wskazywanego obszaru pamici). Z definicji int *wi; // wskanik do obiektu typu int wynika, e wi wskazuje na obszar pamici o rozmiarze sizeof(int), w ktrym mona zapamita zmienn typu int. Mona bezporednio odwoa si do pamici o adresie wi za pomoc *wi. Istnieje moliwo definiowania wskanikw, ktre wskazuj na typ void. void *x;

// wskanik na dowolny typ Wskaniki typu void mog zawiera adres zmiennej dowolnego typu. Wskaniki typu void (2/2) W przypadku definicji int i = 5; float z = 1.3; int *wi = &i; float *wz = &z; void *x; moliwe s przypisania x = wi oraz x = wz. Wskanikowi typu void mona przypisa wskanik dowolnego typu z wyjtkiem wskanika do zmiennej typu const. const long s = 4;

// staa s typu long void *x = &s; //bd, bo s jest sta Mona jednak wpisa adres obiektu staego do wskanika typu void do staej: const void *x = &s; Rzutowanie wskanikw (1/2) W celu przypisania wskanika typu void innemu wskanikowi naley dokona konwersji typu wskanika (rzutowania wskanika) do typu wymaganego. Operacja rzutowania wskanikw jest rwnie niezbdna w przypadku, gdy przypisujemy wskanik jednego typu do wskanika innego typu.

double zm = 11.2; void *x = &zm; double *d; int *wi; // d = x; // bd brak zgodnoci typw d = (double *) x; // rzutowanie wskanika void * do double * printf("%d\n",*d); //11.2 wi = (int *) d; // rzutowanie double * do int * Rzutowanie wskanikw (2/2) Wskaniki typu void umoliwiaj przekazywanie

do funkcji wskanikw dowolnego (niestaego) typu. Wewntrz funkcji mona dokona konwersji typu wskanika (rzutowania wskanika) do innego typu w celu interpretacji wskazywanego obszaru pamici. void CzytajPamiec(void *x) { char *c = (char *) x; int *i= (int *) x; long *z = (long *) x; } Obsuga ekranu w trybie tekstowym Podstawowe zadania obsugi ekranu

Dostpne funkcje obsugi ekranu umoliwiaj: zmian trybu tekstowego ekranu, sterowanie atrybutami znakw wysyanych na ekran, realizacj operacji wejcia-wyjcia (klawiatura-ekran), obsug pamici ekranu (operacje na blokach pamici), sterowanie pooeniem i ksztatem kursora. Ekran w trybie tekstowym jest podzielony na jednakowe komrki, w kadej moe znale si jeden znak, posiadajcy pewien atrybut (kolor i to). Liczba komrek zaley od aktualnego trybu tekstowego. Na ekranie tekstowym zawsze jest okrelone pewne okno tekstowe, do ktrego wysyane s informacje podczas wykonywania operacji wyjcia na ekran. Standardowo oknem jest cay obszar ekranu, ale mona to zmieni.

Funkcje organizacji i sterowania atrybutami znakw wywietlanych na ekranu Organizacja ekranu: window() okrelanie obszaru ekranu zajmowanego przez okno tekstowe; textmode() przeczanie midzy rnymi trybami pracy ekranu; gettextinfo() informacja o stanie ekranu w trybie tekstowym. Sterowanie atrybutami znakw wysyanych na ekran: textattr() ustawianie atrybutu tekstu; textbackground() ustawianie koloru ta; textcolor() ustawianie koloru znakw #include int main(void) { window(10,10,40,11); textcolor(BLACK); textbackground(WHITE);

cprintf("This is a test\r\n"); return 0; } Sterowanie pozycj kursora gotoxy() ustawianie kursora na zadanej pozycji; wherex(), wherey() pobieranie wsprzdnych kursora; Przykad #include int main(void) { clrscr(); gotoxy(35, 12); cprintf("Hello world"); cprintf(Aktualne wspolrzedne X: %d %d\r\n", wherex(), wherey()); getch();

return 0; } Y: Czyszczenie ekranu clreol() usuwa znaki od pozycji kursora do koca linii; clrscr() kasowanie ekranu; delline() usuwa wiersz na pozycji kursora i przesuwa pozostae; insline() wstawia wiersz na pozycji kursora i przesuwa pozostae Przykad clrscr(); cprintf("Nacisnij klawisz . . ."); //* Przesun kursor do 1. kolumny w 2. linii:

gotoxy(1,2); getch(); delline(); Operacje we/wy (konsola-ekran) kbhit() funkcja sprawdzajca czy nacinicie klawisza jest dostpne ungetch() wprowadzanie znaku na pocztek bufora klawiatury, powodujc, e bdzie on nastpnym odczytanym znakiem cprintf() dziaa jak printf(), ale znaki wysyane s do aktualnego okna tekstowego i z odpowiednim atrybutem Przykad cprintf(Nacisnij klawisz:"); while (!kbhit());// nic nie rob cprintf("\nNacisnieto klawisz...\n");

Operacje na blokach pamici obrazu (1/2) gettext() zapamitanie prostoktnego fragmentu obrazu w buforze pamici movetext() kopiowanie prostoktnego fragmentu obrazu na zadan pozycj; puttext() kopiuje zawarto bufora pamici do ustalonego prostoktnego fragmentu obrazu. Operacje na blokach pamici obrazu (2/2) #include char buffer[4096]; int main(void) { int i;

clrscr(); for (i = 0; i <= 20; i++) cprintf("Line #%d\r\n", i); gettext(1, 1, 80, 25, buffer); gotoxy(1, 25); cprintf("Nacisnij klawisz, aby wyczyscic ekran..."); getch(); clrscr(); gotoxy(1, 25); cprintf("Nacisnij klawisz, aby przywrocic ekran..."); getch(); puttext(1, 1, 80, 25, buffer); gotoxy(1, 25); cprintf("Nacisnij klawisz, aby wyjsc..."); getch(); return 0; }

Preprocesor Preprocesor Preprocesor umoliwia makrogeneracj, kompilacj warunkow oraz wczanie do programw zawartoci wskazanych plikw. Wiersze programu rozpoczynajce si znakiem (#) su do komunikacji z preprocesorem. Granice wierszy s istotne kady wiersz jest rozpatrywany indywidualnie. Definicje i rozwinicia makr Wiersz sterujcy o postaci

# define identyfikator cig-leksemw zleca preprocesorowi zastpowanie dalszych wystpie identyfikatora wskazanym cigiem leksemw; opuszcza si odstpy otaczajce cig leksemw. Wiersz sterujcy o postaci # undef identyfikator zleca preprocesorowi, aby zapomnia definicj identyfikatora. Przykad #define ABSDIFF(a,b) ((a)>(b)?(a)-(b):(b)-(a)) ... x=ABSDIFF(r,y); ... #undef ABSDIFF Wicej o wywoywaniach makrodefinicji Wywoanie makrodefinicji jest podobne do wywoania funkcji. Rnice wystpuj w tych przypadkach, w

ktrych wyraenie bdce parametrem wywoania jest obliczane w kilku etapach. Np. #define KWADRAT(a)((a)(a)) int i=5; long w; w = KWADRAT(i++); // w =25, ale i=7! Wniosek: w odwoaniach do makrodefinicji naley unika przekazywania parametrw, ktrych warto jest obliczana wieloetapowo. Wczanie plikw Wiersz sterujcy o postaci # include zleca wstawienie w jego miejsce caej zawartoci pliku o

podanej nazwie. Inne dopuszczalne postacie tego polecenia: #include - szukaj w folderze \include kompilatora; #include - szukaj we wskazanym miejscu; #include conio.h szukaj wg cieek ustawionych w parametrze PATH systemu operacyjnego; #include - nowa notacja C++; #include - forma akceptowana tylko przez kompilator C++ Kompilacja warunkowa (1/2) Fragmenty programu mog by kompilowane warunkowo, zgodnie z ponisz schematyczn skadni:

#if wyraenie_stae_1 <#elif wyraenie_stae_2 newline sekcja_2> . . . <#elif wyraenie_stae_n newline sekcja_n> <#else skecja_kocowa> <#error komunikat> #endif Kompilacja warunkowa (2/2) Przykad #define AUTO AUDI #if (AUTO==FIAT)

printf (to jest FIAT); #if (AUTO==SEAT) printf (to jest SEAT); #if (AUTO==AUDI) printf (to jest AUDI); #else printf (Nie ma takiej marki w bazie); #error zle podana marka samochodu! #endif #undef AUTO Kompilacja moduw Kompilacja moduw Dobrze zaprojektowany zbir nagwkowy powinien by zabezpieczony przed wielokrotnym wczeniem go do tekstu programu. // plik.h - zbir nagwkowy

#ifndef PLIK_H #define PLIK_H < deklaracje pliku plik.h > #endif #undef Jeli makrodefinicja PLIK_H nie zostaa jeszcze zdefiniowana wwczas kompilator musi przeanalizowa wszystkie dyrektywy i instrukcje znajdujce si midzy #ifndef a #endif. W wyniku przetworzenia wspomnianego obszaru zbadane zostan wszystkie deklaracje znajdujce si w zbiorze nagwkowym plik.h oraz zdefiniowane zostanie makro PLIK_H. Przy ponownym wczeniu zbioru plik.h jego zawarto nie bdzie analizowana. Przykad (1/7) Przykad programu skadajcego si z piciu jednostek kompilacji zapisanych w

plikach: prot.h - zawiera deklaracje typw oraz prototypy funkcji: pisz_wynik(), suma1(), suma2() i suma3() pisz.cpp - zawiera definicj funkcji pisz_wynik() mod1.cpp - zawiera definicj funkcji suma1() mod2.cpp - zawiera definicj funkcji suma2() mod3.cpp - zawiera definicj funkcji suma3() Przykad (2/7) /* plik nagwkowy prot.h zawierajcy deklaracje typw oraz prototypy funkcji */

#ifndef PROT.H #define PROT.H void pisz_wynik(double); double suma1(double, double); void suma2(double, double, double *); void suma3(double, double, double &); #endif Przykad (3/7) /* */ plik pisz.cpp zawierajcy definicj funkcji pisz_wynik

#ifndef PROT.H #include "PROT.H" #endif #include void pisz_wynik(double w) { printf("Wynik= %10.2lf\n",w); } Przykad (4/7) /* */ plik mod1.cpp zawierajcy definicj funkcji suma1 #ifndef PROT.H #include "PROT.H"

#endif #include double suma1(double x, double y) { pisz_wynik(x+y); return x+y; } Przykad (5/7) /* plik mod2.cpp zawierajcy definicj funkcji suma2 */ #ifndef PROT.H #include "PROT.H" #endif

#include void suma2(double x, double y, double *w) { pisz_wynik(x+y); *w = x+y; } Przykad (6/7) /* plik mod3.cpp zawierajcy definicj funkcji suma3 */ #ifndef PROT.H #include "PROT.H" #endif #include void suma3(double x, double y, double &w) {

pisz_wynik(x+y); w = x+y; } Przykad (7/7) /* program gwny glowny.cpp */ #ifndef PROT.H #include "PROT.H #endif #include "mod1.cpp" #include "mod2.cpp" #include "mod3.cpp" #include "pisz.cpp" #include #include #include void main(void)

{ ... } // // // // docz docz docz docz kod kod kod

kod moduu moduu moduu moduu 1 2 3 4 Dyrektywa #error Dyrektywa ta ma posta: #error komunikat Dyrektywa ta powoduje, e po jej napotkaniu kompilacja jest przerywana i wypisywany jest komunikat.

Przykad #if (WERSJA==1) #elif (WERSJA==2) #else #error dopuszczale sa wersje 1 lub 2 #endif Pusta instrukcja preprocesora Wiersz zawierajcy jedynie znak # nie wywouje adnego skutku. Biblioteka standardowa

Biblioteka standardowa Biblioteka standardowa nie jest czci samego jzyka, natomiast pochodz z niej deklaracje funkcji oraz definicje typw i makr oferowanych przez standardowe rodowisko C. Funkcje, typy i makra nalece do biblioteki standardowej s zdefiniowane w standardowych plikach nagwkowych Pliki nagwkowe Nagwki mog by doczane w dowolnej kolejnoci i dowoln liczb razy. Nagwek musi by doczony na zewntrz jakiejkolwiek deklaracji czy definicji i przed uyciem czegokolwiek,

co jest w nim zdefiniowane. Nagwek nie musi by plikiem rdowym. Wejcie i wyjcie: System plikw System plikw (file system) Pliki dyskowe s zorganizowane w sposb hierarchiczny. Na danym poziomie hierarchii, nazywanej folderem, katalogiem lub kartotek plikw, mog istnie indywidualne pliki lub podkatalogi. Kady podkatalog jest normalnym katalogiem i moe zawiera pliki lub

podkatalogi. Pliki mona tworzy, kopiowa, kasowa lub zmienia ich zawarto (aktualizowa). Kady system plikw ma wasny interfejs, za pomoc ktrego zleca si wykonywanie dziaa na plikach i katalogach. Do najpopularniejszych standardw systemu plikw nale: system plikw systemu UNIX; systemy plikw wywodzce si z operacyjnego systemu MD-DOS: FAT (File Allocation Table (IBM/Microsoft)), FAT32, NTFS (NT File System) Wejcie i wyjcie: Strumie jest rdem lub celem danych i moe by skojarzony z dyskiem lub innym urzdzeniem zewntrznym. Biblioteka obsuguje strumienie tekstowe i binarne.

Strumie tekstowy jest cigiem wierszy; kady wiersz zawiera zero lub wiksza liczb znakw i koczy si znakiem \0. Strumie binarny jest cigiem bitw (mapa bitowa). Strumie wie si z plikiem lub urzdzeniem za pomoc otwarcia; to poczenie przerywa si zamykajc strumie. Otwarcie pliku Otwarcie pliku udostpnia wskanik do zmiennej typu FILE, w ktrym gromadzi si wszelkie informacje niezbdne do obsugi strumienia. W momencie rozpoczcia dziaania programu otwierane s trzy strumienie: - stdin standardowe wejcie;

- stdout standardowe wyjcie; - stderr standardowe wyjcie bdw. Funkcje operujce na plikach Zdefiniujmy zmienn stream: FILE *stream; Nastpujce funkcje operuj na plikach: - FILE *fopen() otwiera plik; - int fflush() wypisuje dane z bufora; - int fclose() - wypisuje dane z bufora i zamyka plik; - int remove() usuwa wskazany plik; - int rename() zmienia nazw pliku. Funkcja fopen() (1/2) FILE *fopen(const char *filename, const char *mode)

otwiera plik o nazwie filename i zwraca strumie lub NULL, jeli otwarcie si nie powiedzie. Parametr mode okrela rodzaj dostpu do pliku: r otwrz plik tekstowy do czytania; w - otwrz plik tekstowy do pisania; skasuj poprzednia zawarto, jeli istnieje; a dopisuj; otwrz istniejcy lub utwrz nowy plik do dopisywania na jego kocu; r+ - otwrz plik tekstowy do aktualizacji (czytania i pisania); w+ utwrz plik tekstowy do aktualizacji (do odczuta i zapisu); skasuj poprzednia zawarto, jeli istnieje; a+ otwrz istniejcy lub utwrz nowy plik, dopisujc dane na kocu pliku. Przykad FILE *we; if ((we = fopen(c:\\AUTOEXEC.BAT", "rt")) == NULL) { fprintf(stderr, Nie mona otworzyc pliku.\n"); return 1; }

Funkcja fopen() (2/2) - uwagi Poniewa aktualizacja oznacza moliwo jednoczesnego czytania i pisania z tego samego pliku, midzy wykonywaniem tych czynnoci naley wywoa funkcj fflush() lub funkcje pozycjonujce plik. Jeli w argumencie mode po pocztkowej literze wystpuje litera b, np. rb, r+b, oznacza to plik binarny. Dugo nazwy plikw ograniczona jest do FILENAME_MAX znakw (standardowo 80 znakw w ). Jednoczenie mona otworzy co najwyej FOPEN_MAX plikw znakw (standardowo 48 plikw w ). Funkcja fflush()

int fflush(FILE *stream) dla strumieni wyjciowych funkcja powoduje zapisania do pliku wszystkich danych znajdujcych si w buforze, ktre jeszcze nie zostay w nim zapisane. Dla strumieni wejciowych dziaanie funkcji jest nieokrelone. Funkcja zwraca EOF w przypadku bdu pisania, a zero w pozostaych przypadkach. Wywoanie fflush(NULL) wypisuje dane ze wszystkich strumieni wyjciowych. Przykad FILE *stream; char msg[] = "to jest test"; stream = fopen("test.dan", "w"); fwrite(msg, strlen(msg), 1, stream); fflush(stream); //wypisywanie z bufora bez zamykania pliku ... fclose(stream);

Funkcja fclose() int fclose(FILE *stream) zapisuje do pliku wszystkie nie wypisane dane zwizane ze strumieniem stream; kasuje wszelkie nie przeczytane dane z buforw wejciowych, zwalnia przydzielone bufory i zamyka plik. Funkcja zwraca EOF w przypadku bdu., a zero w pozostaych przypadkach. Przykad int main(void){ FILE *fp; char buf[11] = "0123456789"; fp = fopen(test.txt", "w"); fwrite(buf, strlen(buf), 1, fp); fclose(fp); return 0;

} Funkcja remove() int remove(const char *filename) usuwa wskazany plik tak, e pniejsza prba otworzenia go zakoczy si niepowodzeniem. Funkcja zwraca warto rn od zera w przypadku , gdy usunicie pliku si nie powiedzie. Przykad int main(void) { char file[80]; printf("Nazwa pliku do usuniecia: "); gets(file); if (remove(file) == 0) printf("Usunieto %s.\n",file); else perror(Blad!"); //drukuje do stderr komunikat return 0;

} Funkcja rename() int rename( const char *oldname, const char *newname) zmienia nazw pliku z oldname na newname. Funkcja zwraca warto rn od zera w przypadku , gdy operacja si nie powiedzie. Przykad int main(void) { char oldname[80], newname[80]; printf("Stara nazwa pliku: "); gets(oldname); printf("Nowa nazwa pliku: ");

gets(newname); if (rename(oldname, newname) == 0) printf("Zmiana nazwy pliku %s na %s.\n", oldname, newname); else perror(Blad!"); return 0;} Funkcje zapisujce do strumienia Formatowane wyjcie fprintf() int fprintf(FILE *stream, const char *format[, argument, ...]); - funkcja ta, pod kontrol parametru format, przeksztaca i wypisuje pozostae argumenty do strumienia wyjciowego stream. Warto zwracana przez funkcj jest rwna liczbie wypisanych znakw lub jest liczb ujemn w przypadku bdu. Przykad

int main(void) { FILE *stream; int i = 100; char c = 'C'; float f = 1.234; stream = fopen("dane.txt", "w+"); fprintf(stream, "%d %c %f", i, c, f); fclose(stream); return 0; } Funkcja fwrite() size_t fwrite( const void *ptr, size_t size, size_t n, FILE *stream); - wypisuje do strumienia stream, n jednostek danych kady o

dugoci size bajtw, rozpoczynajc od adresu ptr. Funkcja zwraca liczb jednostek (a nie bajtw) danych wypisanych do strumienia lub warto ujemn w przypadku bdu. Przykad struct mystruct { int i; char ch;} s; int main(void) { FILE *stream; if ((stream = fopen("TEST.$$$", "wb")) == NULL) { fprintf(stderr, "Nie mozna utworzyc pliku.\n"); return 1; } s.i = 0; s.ch = 'A'; fwrite(&s, sizeof(s), 1, stream); fclose(stream); return 0; }

Funkcje odczytujce ze strumienia Formatowane wejcie int fscanf( FILE *stream, const char *format[, argument, ...]); - funkcja ta, pod kontrol parametru format, przypisuje przeksztacone wartoci kolejnym argumentom. Kady z tych argumentw musi by wskanikiem. Funkcja koczy swe dziaanie, gdy zinterpretuje cay format. Funkcja zwraca EOF, jeli napotka koniec pliku lub wystpi jaki bd.; w przeciwnym przypadku zwraca liczb przeksztaconych i przypisanych danych wejciowych. Przykad if (fscanf(stdin,"%d",&i)) printf("i=%d\n", i);

else printf("Blad odczytu.\n"); Funkcja fread() (1/2) size_t fread( void *ptr, size_t size, size_t n, FILE *stream); - funkcja czyta z podanego strumienia n jednostek danych, kady o dugoci size bajtw i kieruje je do obszaru pamici wskazanego przez ptr. Rozmiar czytanych danych wynosi zatem (n*size). Funkcja zwraca liczb odczytanych jednostek danych (a nie bajtw), natomiast w przypadku napotkania koca pliku lub wystpienia bdu

zwraca warto zero. Funkcja fread() int main(void) { FILE *stream; char msg[] = "to jest test"; char buf[20]; if ((stream = fopen("test.txt", "w+"))== NULL) { fprintf(stderr, "Nie mozna utworzyc pliku.\n"); return 1; } fwrite(msg, strlen(msg)+1, 1, stream); fseek(stream, 0,SEEK_SET); //pocztek pliku fread(buf, strlen(msg)+1, 1, stream); printf("%s\n", buf); fclose(stream); return 0;

} Funkcje realizujce wejcie znakowe Podstawowe funkcje wykonujce wejcie znakowe: int fgetc() char *fgets() Funkcja fgetc() int fgetc(FILE *stream) - czyta ze strumienia stream nastpny znak i zwraca jego warto. W przypadku napotkania koca pliku lub wystpienia bdu zwraca EOF. Przykad int main(void) { FILE *stream;

char string[] = "To jest test"; char ch; stream = fopen("test.dan", "w+"); fwrite(string, strlen(string)+1, 1, stream); fseek(stream, 0, SEEK_SET); while (ch = fgetc(stream)) putch(ch); //wyprowadza znak na ekran fclose(stream); return(0); } Funkcja fgets() char *fgets( char *s, int n, FILE *stream); - czyta co najwyej (n-1) znakw i wstawia do tablicy s. Funkcja przerywa czytanie po napotkaniu znaku nowego wiersza; znak ten

take wstawia do tablicy. Cay tekst jest zakoczony znakiem \0'. Funkcja zwraca s lub NULL w przypadku napotkania koca pliku albo bdu. Przykad int main(void) { FILE *stream; char string[] = "To jest test"; char msg[20]; stream = fopen(dane.txt", "w+"); fwrite(string, strlen(string)+1, 1, stream); fseek(stream, 0, SEEK_SET); fgets(msg, strlen(string)+1, stream); printf("%s", msg); fclose(stream); return 0; }

Funkcje realizujce wyjcie znakowe Podstawowe funkcje wykonujce wyjcie znakowe: - int fputc() - int fputs() Funkcja fputc() int fputc(int c, FILE *stream); - wpisuje znak c (przeksztacony do unsigned char) do strumienia stream. Zwraca wypisany znak lub EOF w przypadku bdu. Przykad #include int main(void) { char msg[] = "Hello world";

int i = 0; while (msg[i]) { fputc(msg[i], stdout); i++;} return 0;} Funkcja fputs() int fputs( const char *s, FILE *stream); - wypisuje tekst zawarty w tablicy s (nie musi zawiera '\n') do strumienia stream. Zwraca liczb nieujemn lub EOF w przypadku bdu. Przykad #include int main(void) {

fputs("Hello world\n", stdout); return 0;} Funkcje wyznaczajce pozycj w pliku int fseek() long ftell () void rewind () int fgetpos() int fsetpos () Funkcja fseek() (1/2) int fseek( FILE *stream, long offset, int origin); - wyznacza pozycj w strumieniu stream; nastpne

czytanie lub pisanie bdzie odnosi si do danych rozpoczynajcych si od nowej pozycji. Dla plikw binarnych nowa pozycja wypada w miejscu oddalonym o offset znakw od punktu odniesienia origin, ktry moe mie wartoci: SEEK_SET (pocztek pliku), SEEK_CUR (bieca pozycja) lub SEEK_END (koniec pliku). Dla plikw tekstowych warto offset musi by rwna zeru lub wartoci zwrconej przez funkcj ftell(). Funkcja fseek() zwraca warto rn od zera w przypadku bdu. #include long RozmiarPliku(FILE *stream); int main(void) { FILE *stream;

stream = fopen("mojplik.txt", "w+"); fprintf(stream, "To jest test"); printf("Wielkosc pliku mojplik.txt wynosi %ld bajtow\n", RozmiarPliku(stream)); fclose(stream); return 0;} long RozmiarPliku(FILE *stream) { long AktPozycja, Dlugosc; AktPozycja = ftell(stream); fseek(stream, 0L, SEEK_END); Dlugosc = ftell(stream); fseek(stream, AktPozycja, SEEK_SET); return Dlugosc;} Funkcja ftell() long ftell(FILE *stream) - zwraca warto biecej pozycji dla strumienia stream lub

-1L w przypadku bdu. Przykad #include int main(void) { FILE *stream; stream = fopen("mojplik.txt", "w+"); fprintf(stream,"%s", "Test"); printf("Wskaznik pliku jest na pozycji %ld\ n",ftell(stream)); //4 fclose(stream); return 0;} Funkcja rewind() void rewind (FILE *stream); - przesuwa znacznik pliku na pocztek.

Przykad #include #include int main(void) { FILE *fp; char *fname = "TXXXXXX", *newname, first; //tworzy unikaln nazw pliku wg podanego wzorca: newname = _mktemp(fname); fp = fopen(newname,"w+"); fprintf(fp, %s","abcdefghijklmnopqrstuvwxyz"); rewind(fp); fscanf(fp,"%c",&first); printf("Pierwszy znak: %c\n",first); fclose(fp); remove(newname); //usuwa plik o podanej nazwie return 0;}

Funkcja fgetpos() int fgetpos(FILE *stream, fpos_t *ptr); - zapamituje biec pozycj strumienia stream w miejscu wskazanym przez *ptr. Z tej wartoci mona pniej skorzysta w funkcji fsetpos(). Typ fpos_t jest odpowiednim typem zmiennej do przechowania takiej wartoci. W przypadku bdu funkcja fgetpos() zwraca warto rn od zera. Przykad FILE *stream; //typ przechowujcy pozycj pliku fpos_t pozycja; ... fgetpos(stream, &pozycja); printf("Pozycja pliku: %ld\n", pozycja);

Funkcja fsetpos() int fsetpos(FILE *stream, const fpos_t *ptr); - ustawia biec pozycj strumienia stream wedug wartoci zapamitanej przez funkcj fgetpos() w miejscu wskazanym przez *ptr. W przypadku bdu funkcja fsetpos() zwraca warto rn od zera. #include #include void showpos(FILE *stream); int main(void) { FILE *stream;

fpos_t filepos; stream = fopen("dane.txt", "w+"); fgetpos(stream, &filepos); fprintf(stream, "To jest test"); showpos(stream); if (fsetpos(stream, &filepos) == 0) showpos(stream); else{fprintf(stderr,"Bad we wskazaniu pozycji w pliku.\n"); exit(1); } fclose(stream); return 0;} void showpos(FILE *stream) { fpos_t pos; fgetpos(stream, &pos); printf("Pozycja pliku: %ld\n", pos); } Obsuga bdw

Wprowadzenie Wiele funkcji bibliotecznych ustawia znaczniki stanu dla strumieni po napotkaniu koca pliku lub gdy wystpi bd. Te znaczniki mog by ustawiane i sprawdzane jawnie. Dodatkowo, wartoci wyraenia cakowitego errno (zadeklarowanego w ) moe by numer bdu, ktry bliej okrela ostatnio napotkany bd. Do obsugi bdw wykorzysta mona funkcje: - int ferror() - void clearerr() - void perror() - int feof() Funkcja ferror()

int ferror(FILE *stream) - zwraca warto rn od zera w przypadku, gdy jest ustawiony znacznik bdu dla strumienia stream. void clearerr(FILE *stream) - kasuje znaczniki koca pliku i bdu dla strumienia stream. Przykad int main(void) { FILE *stream; stream = fopen("tes.txt", "w"); getc(stream); //wymuszenie bledu poprzez if (ferror(stream)) { printf("Blad\n"); clearerr(stream); } // kasowanie bledu fclose(stream); return 0;} probe odczytu

strumienia Funkcja perror() void perror(const char *s) -funkcja wypisuje tekst z tablicy s i (zaleny od implementacji) komunikat o bdzie odpowiadajcy wartoci errno. Dziaanie funkcji mona przedstawi jako: fprintf(stderr, "%s: %s\n", s, "komunikat o bledzie"); Przykad int main(void) { FILE *fp; fp = fopen(dane.dan", "r");

if (!fp) perror(dane.dan"); //dane.dan: No such file or directory return 0;} Funkcja feof() int feof(FILE *stream) - zwraca warto rn od zera w przypadku, gdy jest ustawiony znacznik koca pliku dla strumienia stream. Przykad #include int main(void) { FILE *stream; stream = fopen("dane.txt", "r"); fgetc(stream); if (feof(stream)) printf("Koniec pliku\n"); fclose(stream); return 0;}

Klasyfikowanie znakw: nagwek Nagwek zawiera deklaracje funkcji sucych do klasyfikowania znakw. We wszystkich funkcjach argument c jest typu int o wartoci albo rwnej EOF, albo wyraalnej jako unsigned char, a wynik jest typu int. Funkcje zwracaj warto rn od zera (TRUE), jeli argument c spenia podany warunek albo naley do wskazanej klasy znakw; w przeciwnym przypadku zwracaj zero. Funkcje operujce na znakach isalnum(c)

isalpha(c) islower(c) iscntrl(c) isdigit(c) isgraph(c) islower(c) isprint(c) ispunct(c) liter isspace(c) tabulator isupper(c) isxdigit(c) prawd jest albo isalpha(c), albo isdigit(c) prawd jest albo isupper(c), albo

znak kontrolny cyfra dziesitna znak drukowalny za wyjtkiem odstpu maa litera znak drukowalny cznie z odstpem znak drukowalny za wyjtkiem odstpu, i cyfr odstp, nowa strona, nowy wiersz, powrt karetki, tabulator, pionowy wielka litera cyfra szesnastkowa Przykad #include #include int main(void) { char c = 'C';

if (isdigit(c)) printf("%c jest cyfra\n",c); else printf("%c nie jest cyfra \n",c); return 0; } Funkcje zmiany wielkoci liter Ponisze funkcje su do zmiany wielkoci liter: - int tolower(int c) - zamienia c na ma liter - int toupper(int c) - zamienia c na wielk liter Przykad #include #include #include int main(void){ int length, i; char *string = oto tekst";

length = strlen(string); for (i=0; i W nagwku s zdefiniowane dwie grupy funkcji operujcych na tekstach. Do pierwszej grupy nale funkcje, ktrych nazwy rozpoczynaj si od str, do drugiej grupy - od mem. Z wyjtkiem funkcji memmove(), skutek kopiowania instancji, ktre czciowo si pokrywaj, nie jest zdefiniowany.

Argumenty funkcji porwnujcych s traktowane jak tablice zmiennych typu unsigned char. char *strcpy(char *s, const char *ct) - kopiuje tekst z ct do s cznie ze znakiem '\0'; zwraca s char *strncpy(char *s, char *ct, int n) - kopiuje co najwyej n znakw tekstu z ct do s; jeeli ct ma mniej ni n znakw, dopenia s znakami '\0'; zwraca s char *strcat(char *s, char *ct) - dopisuje znaki tekstu z ct na koniec tekstu w s; zwraca s char *strncat(char *s, char *ct, int n) - dopisuje co najwyej n znakw tekstu ct na koniec tekstu w s; tekst w s koczy znakiem '\0'; zwraca s Przykad #include

#include int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0;} int strcmp(char *cs, char *ct) - porwnuje teksty zawarte w cs i ct; zwraca warto < 0 dla cs 0 dla cs>ct int strncmp(char *cs, char *ct, int n) - porwnuje co najwyej n znakw tekstw zawartych w cs i ct; zwraca warto <0 dla cs0 dla cs>ct char *strchr(char *cs, char *c) - zwraca wskanik do pierwszego wystpienia znaku c w tekcie cs lub NULL, jeli

ten znak nie wystpuje char *strrchr(char *cs,int c) - zwraca wskanik do ostatniego wystpienia znaku c w tekcie cs lub NULL, jeli ten znak nie wystpuje Przykad #include #include int main(void) { char *buf1 = "aaa", *buf2 = "bbb"; int ptr; ptr = strcmp(buf2, buf1); if (ptr > 0) printf("bufor 2 jest wiekszy niz bufor 1\ n"); else printf("bufor 2 jest mniejszy niz bufor 1\n"); return 0;} char *strstr(char *cs, char *ct) - zwraca

wskanik do pierwszego wystpienia tekstu ct w tekcie cs lub NULL, jeli ct nie wystpuje w cs char *strtok(char *s, char *ct) - wyszukuje w tekcie s cigi znakw przedzielone znakami z ct Przykad #include #include #include int main(void) { char *str1 = "Hello World", *str2 = "orld", *ptr; ptr = strstr(str1, str2); printf("Podciag: %s\n", ptr); //orld getch(); return 0;} Funkcje mem...

Funkcje mem... su do operowania na zmiennych traktowanych jak tablice znakowe. Z zaoenia maj one dziaa bardzo sprawnie. W funkcjach tych argumenty s i t s typu void*, argumenty cs i ct s typu const void*, argument n jest typu size_t, a argument c jest zmienn typu int przeksztaconym do typu unsigned char. Funkcja memcpy() void *memcpy(s,ct,n) - kopiuje n znakw ze zmiennej ct do instancji s i zwraca s; Przykad #include #include

#include int main(void) { char src[] = "***"; char dest[] = "abc0123456709"; char *ptr; printf("Przed kopiowaniem: %s\n", dest); ptr = (char *) memcpy(dest, src, strlen(src)); if (ptr) printf("Po kopiowaniu: %s\n", dest); else printf("Blad kopiowania\n"); getch(); return 0;} Funkcja memset() void *memset(s,c,n) - wstawia znak c do pocztkowych n znakw zmiennej s i zwraca s

Przykad #include #include #include int main(void) { char buffer[] = "Hello world\n"; printf("Przed memset: %s\n", buffer);//Hello world memset(buffer, '*', strlen(buffer)-1); printf("Po memset: %s\n", buffer); //********** return 0;} Funkcja memchr() void *memchr(cs,c,n) - zwraca wskanik do pierwszego wystpienia znaku c w obiekcie cs lub NULL, gdy c nie wystpuje wrd pocztkowych n znakw cs Przykad

#include #include #include int main(void) { char str[17]; char *ptr; strcpy(str, "To jest string"); ptr = (char *) memchr(str, 'r', strlen(str)); if (ptr) printf("Znak 'r' jest na pozycji: %d\n", ptr - str); else printf("Znaku 'r' nie znaleziono\n"); getch(); return 0;} Funkcja memcmp() int memcmp(cs,ct,n) - porwnuje pocztkowe n znakw zawartych w zmiennej cs i

ct; zwraca tak sam warto jak strcmp(); (tzn. <0, gdy, csn0, gdy csn>ctn) Przykad #include #include #include int main(void) { char *buf1 = "aaa"; char *buf2 = "bbb"; int stat; stat = memcmp(buf2, buf1, strlen(buf2)); if (stat > 0) printf("bufor 2 jest wiekszy niz bufor 1\n"); else printf("bufor 2 jest mniejszy niz bufor 1\n"); getch(); return 0;} Funkcja strchr()

char *strrchr(char *cs,int c) - zwraca wskanik do ostatniego wystpienia znaku c w tekcie cs lub NULL, gdy ten znak nie wystpuje Przykad int main(void) { char string[15]; char *ptr, c = 'r'; strcpy(string, Oto string"); ptr = strchr(string, c); if (ptr) printf("Znak %c jest na pozycji: %d\n", c, ptr-string); else printf("Nie ma takiego znaku\n"); return 0;} Funkcje matematyczne

Funkcje matematyczne: nagwek Nagwek zawiera deklaracje funkcji i makr matematycznych. Bd dziedziny wystpuje, gdy argument funkcji nie naley do dziedziny, dla ktrej funkcja zostaa zdefiniowana. Bd zakresu wystpuje wwczas, gdy warto funkcji nie moe by wyraona jako double. Jeli wynik jest nadmiarowy, to funkcja zwraca HUGE_VAL z waciwym znakiem. Jeli wynik jest nie domiarowy, to funkcja zwraca zero. Funkcje matematyczne Argumenty x i y s typu double, a argument n jest typu int. Wszystkie

funkcje zwracaj warto typu double. Wartoci ktw dla funkcji trygonometrycznych wyraa si w radianach. sin(x) sinus cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y,x) sinh(x) cosh(x) tanh(x) exp(x) log(x)

log10(x) " >0 pow(x,y) x cosinus x tangens x sini-1(x) w przedziale [-/2, +/2], x [-1, 1 ] cos-1 (x) w przedziale [0, ], x [-1, 1 ] tan-1 (x) w przedziale [-/2, /2] tan-1 (y/x) w przedziale [-,] sinus hiperboliczny x cosinus hiperboliczny x tangens hiperboliczny x funkcja wykadnicza e^x logarytm naturalny: ln(x), x > 0

logarytm o podstawie 10: log10(x), x x^y sqrt(x) ceil(x) x >x>= 0 najmniejsza liczba cakowita nie mniejsza ni x; wynik typu double floor(x) najwiksza liczba cakowita nie wiksza ni x; wynik typu double fabs(x) warto bezwzgldna x idexp(x,n) x *2n

frexp(x, int *exp) Rozdziela x na znormalizowan cz uamkow z przedziau [ 1 /2, 1]i wykadnik potgi 2; funkcja zwraca cz uamkow, a wykadnik potgi wstawia do *exp; jeli x jest rwne zero, to obie czci wyniku s rwne zero. Funkcje narzdziowe Funkcje narzdziowe: nagwek Nagwek zawiera

deklaracje funkcji sucych do przeksztacania liczb, przydzielania pamici i innych podobnych zada. Funkcja atof() double atof(const char *s) - przeksztaca tekst zawarty w s na warto typu double; Przykad #include #include int main(void) { float f; char *str = "12345.67"; f = atof(str); printf("string = %s float = %f\n", str, f); return 0;}

Funkcja atoi() int atoi(const char *s) - przeksztaca tekst zawarty w s na warto typu int Przykad int main(void) { int n; char *str = "12345.67"; n = atoi(str); printf("string = %s integer = %d\n", str, n); return 0; } Funkcja rand() int rand(void) - zwraca pseudolosow liczb cakowit z przedziau midzy

0 i RAND_MAX. Warto RAND_MAX wynosi co najmniej 32767. Przykad int main(void) int i; randomize(); printf("Liczby for(i=0; i<10; printf("%d\n", return 0; } { losowe z przedzialu od 0 do 99\n\n"); i++) rand() % 100);

Funkcja malloc() void *malloc(size_t size) - zwraca wskanik do obszaru pamici przeznaczonego dla zmiennej o rozmiarze size. Funkcja zwraca NULL, jeli to polecenie nie moe by wykonane. Obszar nie jest inicjowany. Przykad #include #include #include #include int main(void) { char *str; if ((str = (char *) malloc(10)) == NULL) //rezerwacja pamieci { printf("Za malo pamieci\n"); exit(1); } strcpy(str, "Hello"); printf("String %s\n", str);

free(str); return 0; } Funkcja free() void free(void *p) zwalnia obszar pamici wskazany przez p; nie robi nic, jeeli p rwna si NULL. Argument p musi by wskanikiem do obszaru uprzednio przydzielonego przez jedn z funkcji: calloc(), malloc() lub realloc(). Przykad char *str; str = (char *) malloc(10); strcpy(str, "Hello"); printf("String= %s\n", str); free(str);

Funkcja abort() void abort(void); - powoduje nienormalne zakoczenie programu Przykad int main(void) { printf("Wywolanie abort()\n"); abort(); return 0; /* Do tego miejsca program nigdy nie dotrze */ } Funkcja exit() void exit(int status); - powoduje normalne zakoczenie

programu Przykad #include #include #include int main(void) { int status; printf("Wprowadz 1 lub 2\n"); status = getch(); exit(status - '0'); // ustalanie statusu bledu dla DOS return 0; // Do tego miejsca program nigdy nie dotrze } Obsuga daty i czasu Obsuga daty i czasu: nagwek

W nagwku znajduj si deklaracje typw i funkcji sucych do obsugi daty i czasu. Niektre funkcje operuj czasem lokalnym, ktry moe by rny od czasu kalendarzowego na skutek np. rnicy stref czasowych. W time.h stosowane s typy clock_t i time_t, reprezentujce czas, oraz struktura struct tm, ktra mieci w sobie skadniki czasu kalendarzowego Funkcja clock() clock_t clock(void); - zwraca czas procesora wykorzystany przez program od rozpoczcia dziaania lub -1, gdy ta informacja jest niedostpna. Wyraenie clock()/CLOCKS_PER_SEC daje czas w sekundach. Przykad

int main(void) { clock_t start, end; start = clock(); delay(2000); //opoznienie w ms end = clock(); printf(Rnica czasu: %f\n", (end - start) / CLK_TCK); // CLK_TCK liczba imp. Na sek. return 0; } Funkcja time() time_t time(time_t *tp); - zwraca aktualny czas kalendarzowy lub -1, gdy ta informacja jest niedostpna. Jeli argument tp jest rny od NULL, zwracana warto jest rwnie wstawiana do *tp. Przykad #include

#include #include int main(void) { time_t t; t = time(NULL); printf("Liczba sekund od 1 stycznia 1970 = %ld",t); return 0; } Struktura tm Struct tm{ int tm_sec; //sekundy, ktre upyny po minucie (0, 61) int tm_min; //minuty, ktre upyny po godzinie (0, 59) int tm _hour; //godziny, ktre upyny od pnocy (0, 23)

int tm_mday; //dzie miesica (1, 31) int tm_mon; //miesice, ktre upyny od stycznia (0, 11) int tm_year; //lata, ktre upyny od 1900 r. int tm _wday; //dni, ktre upyny od niedzieli (0, 6) int tm_yday; //dni, ktre upyny od 1 stycznia (0, 365) int tm_isdst; /*znacznik letniej zmiany czasu. Jest dodatni, gdy obowizuje czas letni; zero - gdy nie obowizuje, i ujemny - w przypadku braku takiej informacji*/} Struktuta tm wykorzystwana jest przez funkcje asctime, gmtime,localtime, mktime.

Funkcje wykorzystujce struktur tm char *asctime(const struct tm *tblock); - funkcja konewrtuje bic dat i czas na ciag ASCII. struct tm *gmtime(const time_t *timer); - konwertuje biec dat i czas do GMT (Greenwich mean time). struct tm *localtime(const time_t *timer); konwertuje dat i czas GMT (Greenwich mean time) do daty i czasu lokalnego time_t mktime(struct tm *t); - konwertuje biec dat i czas do formatu kalendarzowego. Dopuszczalny zakres daty i czasu kalendarzowego: 01.01.1970 00:00:00 do 19.01.2038 03:14:07. Funkcja zwraca czas kalendarzowy lub 1 w przypadku bdu. Funkcja asctime() char *asctime(const struct tm *tblock); - funkcja konewrtuje

bic dat i czas na ciag ASCII. int main(void) { struct tm t; char str[80]; t.tm_sec = 1; /* Sekundy */ t.tm_min = 30; /* Minuty */ t.tm_hour = 9; /* godzina*/ t.tm_mday = 22; /* dzien miesiaca*/ t.tm_mon = 11; /* Miesiac*/ t.tm_year = 2003; /* rok */ t.tm_wday

= 4; /* dzien tygodnia */ t.tm_yday = 0; /*kolejny dzien roku nie pokazuj*/ t.tm_isdst = 0; /* nie obowiazuje czas letni */ strcpy(str, asctime(&t)); printf("%s\n", str); return 0;} Rekurencja Definicja rekurencji Definicja: Mwimy, e funkcja lub typ danych s rekurencyjne, jeeli w ich definicji nastpuje odwoanie do nich samych. Przykad. Definicja rekurencyjna funkcji silnia: n! = n*(n-1)*...*1 = n* (n-1)! Definicja programowa jest nastpujca:

1, gdy n 1 si ln ia n n * si ln ia n 1, gdy n 1 Rekurencyjne definiowanie funkcji Przykad rekurencyjnej definicji funkcji silnii (factorial fiunction) f(n): f(0) = 1 f(n) = n *f(n-1) dla kadego naturalnej liczby n > 0 Dla n=3 otrzymujemy: f(3) = 3 f(3-1)

= 3 f(2) = 3 2 f(2-1) = 3 2 f(1) = 3 2 1 f(1-1) = 3 2 1 f(0) =3211 =6 Wywoania funkcji i realizacja rekurencji Wszystkie wspczesne jzyki programowania umoliwiaj implementacj funkcji rekurencyjnych. Do rekurencyjnego wywoania w programie funkcji wykorzystywany jest stos. Stan kadej wywoywanej funkcji jest opisany wartoci wszystkich zmiennych automatycznych i parametrw funkcji oraz adres powrotu, wskazujcy miejsce wznowienia

wykonywania procesu, ktry wywoa funkcj. Obszar danych zawierajcy te informacje nosi nazw rekordu wywoa (aktywacji; activation record) lub ramki stosu (stack frame). Jest on umieszczany na stosie programu. Rekord wywoania istnieje a do zakoczenia dziaania funkcji, ktrej dotyczy. W program C/C++ najduej istnieje rekord wywoania dla funkcji main(). Zawarto rekordu wywoania Rekord wywoania zawiera zwykle nastpujce

dane: Wartoci wszystkich parametrw funkcji (adres tablicy i kopie wszystkich pozostaych danych). Wartoci wszystkich zmiennych lokalnych (automatycznych) lub adres miejsca ich przechowywania (zaley to od kompilatora). Adres powrotu adres instrukcji nastpnej po instrukcji wywoujcej funkcj. Dynamiczne dowizanie wskanik do rekordu wywoania procesu wywoujcego funkcj. Zwracana warto tylko, gdy nie jest to warto typu void. Potga Rekurencyjne wywoywanie funkcji obliczajcej podnoszc dowoln liczb x do nieujemnej cakowitej potgi n.

Definicja funkcji potgujcej: gdy n 0 1, x n potega x, n x * x n 1 , gdy n 0 Poziom wywoania 1 2 3 4 Parametry wywoywanej funkcji

Wartoci zwracane przez wywoywan funkcj potega(x,4) x*x*x*x potega(x,3) potega(x,2) potega(x,1) 5 potega(x,0) Poziomy wywoania funkcji potgujcej x4

x*x*x x*x x 1 Schemat Hornera Wielomian: wn(x)=a0xn+a1xn-1++an-1x+an mona zapisac w postaci: wn(x)=(((a0x+a1)x+a2)x+.+an-1)x+an lub w postaci rekurencyjnej: wn(x)= wn-1(x)x+ an, gdzie w0(x)=a0. n=1,2,, Rekurencyjny algorytm

Euklidesa k dla n 0 NWD n , k NWD n %k , k dla n 0 Przykadowo NWD(18,12)=NWD(6,12)=NWD(0,6)=6. Niebezpieczestwa rekurencji Ze stosowaniem rekurencji zwizanych jest wiele

niebezpieczestw. Dwa najwaniejsze spord nich to: dublowanie oblicze przepenienie stosu Dublowanie oblicze Dublowanie oblicze polega na niepotrzebnym wykonywaniu tych samych oblicze. Przykad. Obliczanie wartoci cigu Fibonacciego. Liczby Fibonacciego s zdefiniowane w sposb rekurencyjny: F0=0 F1=1 Fi=Fi-1+ Fi-2 , dla i>=2. Pocztkowe litery cigu Fibonacciego:

0,1,1,2,3,5,8,13,21,34,55, Liczby Fibonacciego rosn wykadniczo. Implementacja funkcji obliczajcej liczby Fibonacciego Funkcja fib() zwraca warto cigu Fibonacciego dla i>=0. int fib(int i) { If (i<2) return i; else return fib(i-1)+ fib(i-2); }

Drzewo oblicze dla funkcji fib(4). Liczba wywoa funkcji fib() f(n) 6 25 10 177 15

1973 20 21891 25 242785 30 2692537 3000000 2500000

2000000 f(n) Wykazuje si, e w celu obliczenia wartoci fib(n) liczba wywoa funkcji fib() wynosi f(n)=2*fib(n+1)-1. Liczba ta jest ogromna ju dla niewielkich n, co obrazuj tabela i wykres. n 1500000

1000000 500000 0 1 2 3 4 n 5 6 Programowanie

dynamiczne Aby radzi sobie z takimi problemami mona wykorzysta programowanie dynamiczne, ktre najoglniej polega na odejciu od rekurencji na rzecz programowania iteracyjnego. Programowanie dynamiczne mona zastosowa do tych problemw, ktre mona podzieli na wiele podproblemw. Wyniki rozwiza podproblemw s zapamitywane w odpowiednich strukturach danych (najczciej w tablicy), unikajc w ten sposb wielokrotnych oblicze dla tego samego podproblemu. Programowanie dynamiczne polega wic na wykonania oblicze kadego podproblemu tylko raz i zapamitaniu jego wyniku w tabeli. W kadym kolejnym kroku mona z tej tabeli korzysta.

Przykad Ponisza funkcja FIB_DYN zwraca warto cigu Fibonacciego dla i>=0 obliczon metod programowania dynamicznego. FIB_DYN(i) { f[0]1 f[1] 1 k2 while (k

Przykad. Ponisza funkcja zwraca warto funkcji MacCarthyego dla cakowitego x. MacCarthy(x) { If (x>100) return (x-10) else return MacCarthy(MacCarthy(x+11))} Liczba wywoa funkcji MacCarthy() Dzikuj Tryby adresowania i modele pamici Zagadnienia

Tryb adresowania rzeczywistego Tryb adresowania wirtualnego Interpretacja pamici Stronicowanie pamici Modele pamici Struktura programu wykonywalnego Tryby adresowania i modele pamici Adresy logiczne przechowywane we wskanikach maj nastpujc posta adres_logiczny = segment : offset Segment jest numerem bloku z zakresu od 0 do 0xFFFF o rozmiarze 64KB wzgldem pocztku, ktrego jest liczone przesunicie offset, w ramach

bloku. Sposb wyznaczania adresu fizycznego na podstawie adresu logicznego zaley od trybu adresowania. Tryb adresowania rzeczywistego W trybie adresowania rzeczywistego (tryb rzeczywisty procesora, np. tryb DOS-u; kompilator BC++) adres fizyczny okrela zaleno: adres_fizyczny = adres_bazowy + offset = = 16segment + offset. Segment (nr segmentu) i offset (przesunicie w ramach bloku 64 KB o numerze segment) s liczbami 16 bitowymi bez znaku (typu unsigned). Adresy fizyczne s liczbami 20 bitowymi o wartociach od 0 do 0xFFFFF (adresowanie do 1 MB). Warto 16segment jest adresem bazowym wzgldem, ktrego liczone jest przesunicie okrelone przez offset. Na przykad dla wskanika 0xB800 : 0x0002 adres bazowy

wynosi 0xB8000 (mnoenie przez 16 polega na dopisaniu zera do wartoci segmentu w postaci szesnastkowej), natomiast adres fizyczny wynosi 0xB8002. Funkcja wyznaczajca adres fizyczny wskanika typu void far * w trybie rzeczywistym moe by zdefiniowana nastpujco: unsigned long adres(void far *x){ return 16UL* FP_SEG(x) + FP_OFF(x); // 16UL zamiana na typ ul } Tryb adresowania wirtualnego (1/) W trybie adresowania wirtualnego (tryb wirtualny, chroniony wymaga przeczenia procesora, np. Windows NT; kompilator BCW) adresy logiczne przechowywane we wskanikach maj nastpujc posta: adres_logiczny = selektor : offset.

Selektor jest liczb dwubajtow (typu unsigned), ktra zawiera numer (indeks) pola w tablicy deskryptorw (TDskr) opisujcego waciwoci wskazywanego obszaru pamici. Kady deskryptor skada si z 8 bajtw i zawiera informacje o adresie pocztkowym (adresie bazowym) bloku, rozmiarze bloku oraz prawach dostpu do bloku (czytanie, zapis, usuwanie). Offset jest liczb dwubajtow (typu unsigned), ktra okrela przesunicie od pocztku adresu bazowego (przesunicie nie moe przekroczy rozmiaru bloku). Na podstawie adresu bazowego mona wyznaczy adres liniowy (adres wirtualny) bloku (segmentu), ktry w przypadku braku stronicowania pamici (automatycznej wymiany ramek stron pomidzy pamici operacyjn i dyskow) jest rwny adresowi

fizycznemu bloku. adres_liniowy=adres_bazowy+offset Wyznaczanie adresu liniowego Poczwszy od procesorw 80386 adres bazowy moe by 32-bitowy (czterobajtowy). Pozwala to adresowa liniowy blok pamici o rozmiarze do 4GB. Adresy wykraczajce poza obszar pamici operacyjnej komputera znajduj si w pamici dyskowej. Dane lub fragmenty programu znajdujce si pod tymi adresami s adowane z dysku do pamici w momencie, gdy s potrzebne. Tryb chroniony W trybie wirtualnym istnieje moliwo ograniczenia swobody dostpu programw (aplikacji) do blokw pamici wykorzystywanych

przez inne programy. Wystarczy w tym celu ustawi atrybuty segmentw i zapamita je w odpowiednich polach statusowych zwizanych z nimi deskryptorw (np. segmenty kodu maj domylnie ustawiony atrybut tylko do czytania). Dziki wspomnianej wasnoci tryb adresowania wirtualnego czsto jest nazywany trybem chronionym. Praca w trybie chronionym pozwala na implementacj wielozadaniowoci. Struktura deskryptora Kady deskryptor skada sisegmentu z 8 bajtw, opisujcych fizyczny blok (segment) w pamici wirtualnej. Znaczenie elementw deskryptora segmentu jest nastpujce: rozmiar segmentu (16 bitw); bajty 1,2;

adres pocztkowy (bazowy) segmentu (bity 0...15); bajty 3,4; adres pocztkowy (bazowy) segmentu (bity 16...23); bajt 5; prawa dostpu do segmentu (dla 80286); bajt 6; rozszerzenie dla procesora 80386; bajty 7,8. W przypadku procesora 80286, bajty 7, 8 deskryptora segmentu s rwne zero. W przypadku procesora 80386 ich znaczenie jest nastpujce: bity 0...3 stanowi rozszerzenie rozmiaru segmentu (20-bitowy rozmiar segmentu dla 80386) bity 4...7 okrelaj rozszerzenie praw dostpu bity 8...15 stanowi rozszerzenie adresu pocztkowego segmentu (32-bitowy adres bazowy dla 80386). Z przedstawionych rozwaa wynika, e wartoci kolejnych selektorw w adresach logicznych rni si zawsze o sta 8. Tablica deskryptorw segmentw ma rozmiar 64KB, a wic mona w niej zapamita 8K (8192) deskryptorw. W praktyce dostpne s dwie tablice deskryptorw, globalna (GDT)

i lokalna (LDT). Adresy tablic deskryptorw pamitane s w 40bitowych rejestrach GDTR i LDTR. Deskryptor segmentu Limit - rozmiar segmentu; Baza - adres pocztkowy (bazowy) segmentu; Status286 - prawa dostpu do segmentu - w przypadku procesora 80286; Status386 - prawa dostpu do segmentu - w przypadku procesora 80386. W przypadku procesora 80286 maksymalna dugo segmentu wynosi 64KB, natomiast w przypadku procesora 80386 maksymalna dugo segmentu wynosi 1MB, a przy wczonym bicie granulacji (bit nr 3 w polu Status386 deskryptora) wynosi 4K 1MB = 4GB. Dostpne s dwie tablice deskryptorw, globalna (GDT) i lokalna (LDT), co daje czn, wirtualn przestrze adresow 16K 4GB = 64TB (tera bajtw). Interpretacja pamici

Procesor 808x Pami wirtualna Pami liniowa Pami fizyczna RAM Procesor 80286 Pami wirtualna Pami liniowa Pami fizyczna RAM |----------------| 1 MB |----------------| 1 MB |-----------|----| 1 MB 640 KB |-------------------------| 16 MB |-------------------------| 16 MB |-----------| - - - - - - -| 16 MB 640 KB

Procesor 80386 Pami wirtualna pami dyskowa |-------------------------------------------| 64 TB 4 GB Pami liniowa (1 selektor) |-----------------------------| - - - - - - -| Pami fizyczna RAM |-----------|- - - - - - - - - -| 4 GB 640 KB

Stronicowanie pamici Procesor 80386 implementuje wirtualne stronicowanie pamici sprztowo. Wszystkie informacje niezbdne do jego realizacji s przechowywane na dysku w postaci katalogu stron i kilku tablic stron. Mechanizm stronicowania wykorzystuje pojcie adresu liniowego (adresu wirtualnego). W procesorach 808x i 80286, ktre nie posiadaj moliwoci stronicowania pamici oraz w przypadku pracy w trybie rzeczywistym lub przy wyczonym stronicowaniu pamici, adresy liniowe rwnaj si adresom fizycznym. Jeeli natomiast stronicowanie jest dostpne, to adresy wirtualne musz by tumaczone na adresy fizyczne - co jest realizowane sprztowo.

Stronicowanie pamici wyznaczanie adresu fizycznego (1/2) Adres liniowy Numer wirtualnej strony = Adres liniowy div 4096 31 21 11 Katalog Strona Przesunicie 31 RS

12 Ramka Strony 0 Przesunicie TS CR3 Katalog Stron Adres fizyczny Tablica

Stron 1 MB stron (ramek stron) po 4 KB = 4 GB CR3 rejestr procesora. Katalog okrela numer tablicy stron, w ktrej znajduje si ramka strony. Strona okrela pozycj adresu strony (ramki strony). Stronicowanie pamici wyznaczanie adresu fizycznego (2/2) Sposb implementacji trybu chronionego zaley od wykorzystywanego kompilatora (np. w systemie Borland C++ 3.1 tryb chroniony mona wykorzystywa w rodowisku Windows w oparciu o kompilator BCW). Do zarzdzania pamici w trybie chronionym mona wykorzystywa funkcje klasy Global (np. GlobalAlloc, GlobalLock, GlobalFree). Za

pomoc funkcji GlobalAlloc mona przydzieli dynamicznie w pamici rozszerzonej (powyej 1 MB) blok o rozmiarze do 16 MB. Modele pamici (1/4) Adresowanie oparte na segmentach (selektorach) jest cile powizane ze struktur programu wykonywalnego (exe), ktry skada si z segmentu kodu, danych i stosu oraz obszaru przeznaczonego dla zmiennych dynamicznych - nazywanego stert (stosem zmiennych dynamicznych). W jzyku C/C++ program moe skada si z wielu moduw. Po kompila cji programu (moduu) utworzony zostanie kod wykonywalny (wyniko wy), ktry moe skada si z nastpujcych segmentw: kodu (instrukcje do wykonania), danych zainicjowanych (np. stae), danych niezainicjowanych, stosu (zmienne automatyczne i parametry funkcji), sterty (stosu zmiennych dynamicznych).

Kady z tych segmentw posiada swoj nazw i klas, ktre s acuchami znakw (np. segment kodu jest klasy CODE i ma domyln nazw _TEXT). Klasa stanowi informacj dla programu czcego o sposobie czenia i kolejnoci rozmieszczania w pamici segmentw nalecych do poszczeglnych moduw. Modele pamici (2/4) Rozmiar segmentw kodu i danych nie moe przekroczy 64KB dla pojedynczego moduu programu. Stos programu nie moe przekroczy 64KB, natomiast sterta moe zajmowa ca dostpn pami (ograniczenia wynikaj z moliwoci kompilatora). W przypadku programw wielomoduowych cakowity rozmiar kodu i danych programu oraz rozmieszczenie moduw w pamici zaley od przyjmowanego w kompilatorze modelu pamici. Na przykad system BC++ 3.1

oferuje sze modeli: TINY, SMALL, MEDIUM, COMPACT, LARGE i HUGE (BCW++3.1 modele: SMALL, MEDIUM, COMPACT, LARGE). Kady z tych modeli nakada pewne ograniczenia na maksymalny rozmiar obszaru danych, rozmiar kodu programu oraz domylny typ wskanikw kodu i danych (wskaniki dalekie lub bliskie). Modele pamici (3/4) We wszystkich modelach, oprcz modelu HUGE, obszar danych statycznych jest wsplny dla wszystkich moduw programu, a jego rozmiar nie moe przekroczy 64KB. W modelu TINY maksymalny rozmiar, cznie, kodu i danych (cznie ze stert, tj. obszarem zmiennych dynamicznych) nie moe przekroczy 64KB. Model SMALL ogranicza kod do 64KB i dane do 64KB. W modelu MEDIUM

kod jest ograniczony do 1MB, natomiast dane do 64KB. Model COMPACT ogranicza kod do 64KB oraz dane do 1MB. W modelach LARGE i HUGE kod i dane, kade z osobna, nie mog przekroczy 1MB. Modele pamici (4/4) Model pamici okrela domylny typ wskanikw kodu i danych (wskaniki dalekie lub bliskie). W szczeglnoci, wskanik zdefiniowany jako int *wsk jest wskanikiem bliskim (dwubajtowym) w modelach TINY, SMALL i MEDIUM, natomiast wskanikiem dalekim w pozostaych modelach. Model TINY SMALL MEDIUM COMPACT

LARGE HUGE Ograniczenia Wskaniki: Kod Kod + Dane < 64KB Bliskie Kod < 64KB, Dane < 64KB Bliskie Kod < 1MB, Dane < 64KB Dalekie Kod < 64KB, Dane < 1MB Bliskie Kod < 1MB, Dane < 1MB Dalekie Kod < 1MB, Dane < 1MB Dalekie

Dane Bliskie Bliskie Bliskie Dalekie Dalekie Dalekie We wszystkich modelach pamici jedynie zmienne automatyczne i parametry funkcji posiadaj cile okrelone, niezalene od modelu pamici miejsce przechowywania - stos procesora (segment stosu). Struktura programu wykonywalnego Struktura programu

wykonywalnego Program wykonywalny ma rn struktur w zalenoci od wykorzystywanego modelu pamici. Model TINY Model ten jest przeznaczony do tworzenia programw o niewielkich rozmiarach. W modelu tym rozmiar obszaru przeznaczonego na kod, dane i stos nie moe przekroczy 64KB. Wskaniki kodu i

danych s bliskie. Programy tej klasy mog by przeksztacone do wersji com. Wysokie adresy ------------------------------ pocztek stosu STOS ------------------------------ koniec stosu STERTA (obszar zmiennych dynamicznych) ------------------------------ pocztek sterty do 64KB

DANE_NZ (dane niezainicjowane) -----------------------------DANE (dane zainicjowane) -----------------------------KOD (kod programu) ------------------------------ pocztek programu Niskie adresy Model SMALL (1/2)

Model ten jest przeznaczony do tworzenia programw, w ktrych kod i dane znajduj si w osobnych segmentach. Rozmiar kodu nie moe przekroczy 64 KB oraz rozmiar danych nie moe przekroczy 64KB. Wskaniki kodu i danych s bliskie. Istniej dwa rodzaje sterty: bliska w obszarze segmentu danych oraz daleka od pocztku stosu do koca dostpnej pamici. Segmenty danych, sterty bliskiej i stosu zajmuj ten sam obszar pamici (segment danych). Do przydzielania pamici w obszarze sterty bliskiej su funkcje malloc() i calloc() ANSI C (zwolnienie pamici funkcja free), natomiast w obszarze sterty dalekiej funkcje farmalloc() i farcalloc() BC++ od 3.1 (zwolnienie pamici funkcja farfree). Operator new przydziela pami domylnie w obszarze sterty bliskiej.

Struktura pamici w modelu SMALL Wysokie adresy 1MB -----------------------------STERTA DALEKA (do koca pamici) ------------------------------ pocztek stosu STOS ------------------------------ koniec stosu do 64KB STERTA (obszar zmiennych dynamicznych) ------------------------------ pocztek sterty DANE_NZ

(dane niezainicjowane) -----------------------------DANE (dane zainicjowane) -----------------------------do 64KB KOD (kod programu) ------------------------------ pocztek programu Niskie adresy Model MEDIUM (1/2)

Model ten jest przeznaczony do tworzenia programw o znacznych rozmiarach kodu i niewielkiej iloci danych. Segmenty kodu nalece do rnych moduw s umieszczane kolejno w pamici. Rozmiar kadego z nich moe mie maksymalnie do 64KB, ale cznie nie mog zajmowa wicej ni 64 KB. Adres segmentu kodowego jest ustalany w momencie odwoania do funkcji zdefiniowanej w danym module. Dane statyczne, sterta bliska i stos s poczone w jeden segment danych, ktrego rozmiar nie moe przekroczy 64KB. Wskaniki kodu s dalekie, natomiast danych bliskie. Struktura pamici w modelu MEDIUM Wysokie adresy 1MB -----------------------------STERTA DALEKA (do koca pamici)

------------------------------ pocztek stosu STOS ------------------------------ koniec stosu do 64KB STERTA (obszar zmiennych dynamicznych) ------------------------------ pocztek sterty DANE_NZ (dane niezainicjowane) -----------------------------DANE

kady plik do 64KB (dane zainicjowane) -----------------------------Kod Moduu_N -----------------------------... (kod programu) -----------------------------Kod Moduu_2 -----------------------------Kod Moduu_1 ------------------------------ pocztek programu Niskie adresy Model COMPACT (1/2) Model ten jest przeznaczony do tworzenia

programw o niewielkich rozmiarach (do 64KB), ale zarzdzajcych wielkimi strukturami danych. Rozmiar obszaru danych nie moe przekroczy 64KB. Skada si on z segmentu danych zainicjowanych i niezainicjowanych. Dane i sterta cznie nie mog zajmowa wicej ni 1MB. Stos jest niezalenym segmentem o rozmiarze do 64KB. Istnieje tylko daleka sterta zmiennych dynamicznych. Wskaniki kodu s bliskie, danych dalekie. Struktura pamici w modelu COMPACT Wysokie adresy 1MB -----------------------------STERTA DALEKA do 64 KB

------------------------------ pocztek stosu STOS ------------------------------ koniec stosu DANE_NZ do 64KB (do koca pamici) (dane niezainicjowane) -----------------------------DANE (dane zainicjowane)

-----------------------------do 64KB KOD (kod programu) ------------------------------ pocztek programu Niskie adresy Model LARGE (1/2) Model ten jest przeznaczony do tworzenia programw o znacznych rozmiarach kodu i danych. Segmenty kodu nalece do rnych moduw s umieszczane kolejno w pamici. Rozmiar kadego z nich moe mie maksymalnie do 64KB, ale cznie nie mog zajmowa wicej ni 1MB. Adres segmentu kodowego jest ustalany w momencie

odwoania do funkcji zdefiniowanej w danym module. Obszar danych nie moe przekroczy 64KB. Skada si on z segmentu danych zainicjo wanych i niezainicjowanych. Dane i sterta cznie nie mog zajmowa wicej ni 1MB. Stos jest niezalenym segmentem o rozmiarze do 64KB. Istnieje tylko daleka sterta zmiennych dynamicznych. Wskaniki kodu i danych s dalekie. Struktura pamici w modelu LARGE Wysokie adresy 1MB -----------------------------STERTA DALEKA do 64 KB ------------------------------ pocztek stosu STOS

------------------------------ koniec stosu DANE_NZ do 64KB (dane niezainicjowane) -----------------------------DANE kady plik do 64KB (do koca pamici)

(dane zainicjowane) -----------------------------Kod Moduu_N -----------------------------... (kod programu) -----------------------------Kod Moduu_2 -----------------------------Kod Moduu_1 ------------------------------ pocztek programu Niskie adresy Model HUGE Model ten jest przeznaczony do tworzenia programw o znacznych rozmiarach kodu i danych. Segmenty kodu nalece do rnych moduw s umieszczane kolejno w pamici. Rozmiar kadego z nich moe mie maksymalnie do 64KB. Obszar danych statycznych moe mie rozmiar wikszy ni 64KB. Skada si on z

segmentw danych nalecych do poszczeglnych moduw kady o rozmiarze nie przekraczajcym 64KB. Segmenty danych nalece do rnych moduw s umieszczane kolejno w pamici. Dane i sterta cznie nie mog zajmowa wicej ni 1MB. Adres segmentu kodowego jest ustalany w momencie odwoania do funkcji zdefiniowanej w danym module. Podobnie adres segmentu danych jest ustalany w momencie odwoania do danej zdefiniowanej w odpowiednim segmencie. Stos jest niezalenym segmentem o rozmiarze do 64KB. Istnieje tylko daleka sterta zmiennych dynamicznych. Wskaniki kodu i danych s dalekie. Struktura pamici w modelu HUGE Wysokie adresy 1MB -----------------------------STERTA DALEKA

(do koca pamici) ------------------------------ pocztek stosu do 64 KB STOS ------------------------------ koniec stosu Dane Moduu_N -----------------------------kady ... (dane zainicjowane programu) plik do -----------------------------64KB Dane Moduu_2 -----------------------------Dane Moduu_1 -----------------------------Kod Moduu_N

-----------------------------kady ... (kod programu) plik do -----------------------------64KB Kod Moduu_2 -----------------------------Kod Moduu_1 ------------------------------ pocztek programu Niskie adresy Sortowanie plikw Sortowanie plikw metod prostego scalania Wejcie: danych jest mN plikw z danymi. Dane kadego z plikw kopiujemy do tablic A1[1..n1], A2[1..n2], , Am[1..nm], gdzie

niN, i=1,2,,m s liczbami danych zapisanych w poszczeglnych plikach. Algorytm: algorytm sortowania przez scalanie polega na iteracyjnym: scalaniu tablic Ai oraz Ai+1, dla i=1,2,..m-1; po scaleniu tablic Ai oraz Ai+1 wykonywana jest operacja ich sortowania. Wyjcie: posortowana tablica A[1..n], gdzie n=n1+n2++nm. Koniec Systemy komputerowe Komputer Komputer - elektroniczna maszyna cyfrowa suca do automatycznego przetwarzania

danych przedstawionych cyfrowo (tzn. za pomoc odpowiednio zakodowanych liczb). Istotn cech odrniajc komputer od innych urzdze jest jego programowalno, tzn. wykonywanie konkretnych zada (np. oblicze) jest zwizane z wykonywaniem zapisanych w pamici komputera programw. ARCHITEKTURA KOMPUTERA Architektura komputera to struktura komputera wyraajca si doborem sposobu czenia jego urzdze skadowych, przy czym dotyczy ona zwizkw funkcjonalnych midzy tymi elementami, a nie przestrzennych (jak w architekturze budowli); np. dobr typu

procesorw, moduw pamici, sterownikw urzdze peryferyjnych oraz sposb ich sprzgania tak, aby cao speniaa pewne kryteria uytkowe. Architektura Von Neumanna Architektura wspczesnych komputerw zostaa sformuowana po raz pierwszy w 1964 roku przez Von Neumanna. System komputerowy zbudowany w oparciu o architektur Von Neumanna powinien: Mie skoczon i funkcjonalnie pen list rozkazw Mie moliwo wprowadzenia programu do systemu komputerowego poprzez urzdzenia

zewntrzne i jego przechowywanie w pamici w sposb identyczny jak danych Dane i instrukcje w takim systemie powinny by jednakowo dostpne dla procesora; Informacja jest tam przetwarzana dziki sekwencyjnemu odczytywaniu instrukcji z pamici komputera i wykonywaniu tych instrukcji w procesorze. sie dziaa komputera Main memory CPU bus Video controller

Monitor Disk controller Hard disk Floppy disk Controller other peripherals

Komputer osobisty Urzdzenia zewntrzne dla PC Poziomy suchania Ignorowanie Udawanie Suchanie selektywne Suchanie empatyczne Postaraj si dostrzec pikne strony programowania

Recently Viewed Presentations

  • Professionalism in the Workplace PROFESSIONAL DEVELOPMENT TRAINING AMANDA

    Professionalism in the Workplace PROFESSIONAL DEVELOPMENT TRAINING AMANDA

    Professionalism by the Books. Professionalism Defined. the conduct or qualities that characterize or mark an individual holding an occupation . the skill level, of course, but also good judgment and polite behavior that is expected from a person who is...
  • Lake Charles Harbor and Terminal District

    Lake Charles Harbor and Terminal District

    PORT OF LAKE CHARLES CITY DOCKS 11 USAID/USDA approved transit sheds 13 Ship Berths 1.3 million square feet waterfront storage 600,000 square feet of warehousing behind the waterfront Vegetable oil packaging plant Automated Bag Handling Facility Public Grain Elevator PUBLIC...
  • Title of Poster Here: Use Myriad Pro or

    Title of Poster Here: Use Myriad Pro or

    Arial MS Pゴシック Calibri Calibri Light Helvetica Verdana Default Design 1_Default Design PowerPoint Presentation ...
  • Ethics - chillicothe.va.gov

    Ethics - chillicothe.va.gov

    A nurse refuses to treat a patient in the ICU for reasons of conscience, and the nursing supervisor must decide whether the refusal is appropriate. A patient with decision-making capacity wants to return home, but his family and the clinical...
  • Searching Historical Archives for Near-Duplicate Figures

    Searching Historical Archives for Near-Duplicate Figures

    Eamonn Keogh. What is a near-duplicate pattern? A History of Infusoria, including Desmidiaceae and Diatomaceae, 1861. Biddulphia. alternans. A Synopsis of the British Diatomaceae, 1853. ... Searching Historical Archives for Near-Duplicate Figures
  • www.mtsd.k12.nj.us

    www.mtsd.k12.nj.us

    born in 1928 in Sighet, Transylvania, now part of Romania . In 1944 he was taken from his home at the age of 15 with his parents and three sisters and sent to the Auschwitz concentration camp, then to Buna,...
  • Pwn 2 - Florida State University

    Pwn 2 - Florida State University

    ROP Based Leaks - We will discuss these later today . Buffer overflow leak before canaries ended with a null byte. Buffer overflow in a loop (Small example below) Buffer Overflow In A loop. Notice the check happens after the...
  • Ambiguous Genitalia - American College Health Association

    Ambiguous Genitalia - American College Health Association

    TRANS HEALTH CARE 2013: A VIEW FROM THE FRONTLINES ACHA ANNUAL MEETING BOSTON 2013 Norman Spack, M.D. Co-Founder, GeMS-DSD Program Endocrine Division