Informatyka odpowiedzi, Polibuda, studia, S12, S3, ważne, informatyka, Stare


1.Co to jest informatyka - jest to dziedzina wiedzy zajmującej się problemami: przetwarzania danych, przesyłania danych.

2.Algorytm-jest to ciąg informacji służących wykonywaniu pewnego zadania. W każdym algorytmie można wyróżnić szereg instrukcji. Aby algorytm był wykonany cel musi znać co chodzi. Komputer rozumie tylko to co ma zaprogramowane, te instrukcje to język programowania.

3.Języki programowania proceduralne i deklaratywne- wiążą się z strukturą danych i reprezentowanych danych w komputerze, wykonywaniem działań i operacji. Składa się z końcowego zbioru reguł zwanych składankami, polecenia dla komputera. Proceduralny- zapisuje się procedurą którą komputer wykonuje (procedura- moduł programu wykonujący określone zadania) synonim programowania moduł działający samodzielnie. Deklaratywny- umożliwia wyszukiwanie danych w dużych zbiorach.

4.Różnica w obliczeniu numerycznym i symbolicznym- obliczanie numeryczne to przetwarzanie liczb, obliczenia związane z fizyką, matematyką lub problemami technicznymi. Obliczanie symboliczne wykorzystywane są do wyszukiwania danych txt i systemach ekspertowych.

5.Czym zajmuje się inżynieria oprogramowania- zajmuje się doskonaleniem i optymalizacją wykonywanego oprogramowania. Dobre oprogramowanie powinno być: zgodne z wymaganiami użytkownika, niezawodne, efektywne, łatwe w konwersacji, ergonomiczne. Powstała bo oprogramowanie nie zdążył za sprzętem, tzw. kryzys oprogramowania. Przyczyny powstania: duża złożoność systemów operacyjnych, niepowtarzalność poszczególnych przedsięwzięć, pozorna łatwość dokonywania poprawek.

6.Co to jest baza danych- zbiór powiązanych informacji z pewnej dziedziny, dane są zorganizowane w taki sposób, aby łatwo je można było przeszukiwać, wyciągać wnioski, podejmować decyzje. Każdy zbiór danych to baza danych, nie musi być komputerowa. Komputerowa baza danych jest podzielona na rekordy. Najprostszą bazą danych jest tabela składająca się z rekordów.

7.Siec komputerowa- Sieć komputerowa to grupa komputerów lub innych urządzeń połączonych ze sobą w celu wymiany danych lub współdzielenia różnych zasobów np. korzystania ze wspólnych urządzeń (drukarek), korzystania ze wspólnego oprogramowania, korzystania ze wspólnej bazy danych, przesyłanie informacji pomiędzy komputerami . Podział sieci- LAN- obejmuje swoim zasięgiem stosunkowo mały obszar (firma, akademik), MAN- sieć miejska, obejmuje kilka sieci LAN, WAN- obejmuje duży obszar geograficzny, wykorzystuje do przenoszenia informacji sieci telekomunikacyjnych.

8.Co to jest Internet i Intranet?

Internet - jest globalną siecią komputerową umożliwiającą wymiane informacji dzięki jednolitemu sposobowi kodowania i przesyłania informacji wanemu protokołem TCP/IP (Transmission Control Protocol / Internet Protocol)

Intranet - sieć oferująca funkcję podobne do Internetu ale w węższym zakresie. Njczęsciej na Obarze przedsiębiorstwa. Nie musi być to sieć ograniczona geograficznie. Najczęściej jest jednak oddzielona od Interntu i nie świadczy usług na zewntrz.

9.Zapisz liczbę 419D w układzie dwójkowym, szesnastkowym.

110100011B ; FA2H

10.Ile w układzie dziesiętnym i dwójkowym wynosi 3F3H.

322H ; 00111110011B

11.Relacja pomiędzy ilościami informacji- 8bitów= 1bajt, 1kbajt=1024bitów, 1Mb=1048576bajtów, 1Gb=1073741824bajtów

12.Cyfrowe kodowanie informacji- dowolna informacja w komputerze występuje tylko w postaci 1,0 potrzebne są zatem reguły które przekształcają różne postacie informacji na postać ciąg cyfr binarnych. Proces przekształcenia informacji nazywamy kodowaniem, polega na wzajemnie przyporządkowanych elementom zbioru kodowego słów, naturalny kod NKB przyporządkowuje dowolnej liczbie 10-tnej odpowiednią liczbę binarną.

13.Co to jest kod ASCI- służy do kodowania textu i przesyłania go między urządzeniami cyfrowymi oprócz znaków alfanumerycznych, koduje także znaki sterujące pracę drukarki, przyporządkowuje znakom alfanumerycznym i znakom sterującym ciąg złożony z 8 cyfr binarnych. Kodowanie ASCI ma 83=256 znaków. Posługując się kodem ASCI możemy każdy tekst zapisać jako ciąg bitów i na odwrót.

14.Porównanie układów kombinacyjnych i sekwencyjnych- Ukł sekwencyjny to układ których stan wyjść zależy tylko od stanu wejść. Bardziej złożone układy kombinacyjne uzyskujemy poprzez połączenie paru prostych. Sekwencyjny- to układ których stan wyjść nie zależy tylko od wejść, ale także od tego co dzieje się wcześniej w układzie.

15.Układ synchroniczny i asynchroniczny- układem asynchronicznym nazywamy taki układ cyfrowy który w każdej chwili wejść działa na wyjście. Układ synchronicznym nazywamy taki układ kiedy stan wejść tylko w danym momencie czasu działa na stany wyjść. Czas czynny i martwy podawany sygnałem zerowym.

16.Co to jest i jak działa rejestr- układ cyfrowy przeznaczony do krótkotrwałego przechowywania niewielkich ilości informacji lub do zmiany informacji z szeregowej na równoległą i na odwrót. Równoległe wprowadzanie informacji do układu polega na wprowadzaniu wszystkich bitów w jednym takcie zegara, w celu zrealizowania takiego wprowadzania liczb zacisków wejściowych układu musi być równe liczbie bitów w wprowadzanym słowie. Wejście szeregowe to takie wejście które umożliwia wprowadzanie informacji do układu bit po bicie. Do wprowadzania słowa n- bitowego potrzeba n taktów a układ ma tylko 1 wejście.

17.Co to jest magistrala- w systemie mikroprocesorowym należy zapewnić przesyłanie informacji między różnymi układami w systemie mikroprocesorowym, najprościej każdy układ z każdym, co jest jednak fizycznie niemożliwe, więc tych połączeń jest mniej, droga przepływ danych, komunikują się wszystkie układy. Magistralą nazywamy zestaw linii i urządzeń połączonych 2 lub więcej układów będących nadajnikami lub odbiornikami informacji.

18.Realizacja sumatora

???

19.Co to jest kod U2- działania na liczbach binarnych ze znakiem”-` można sprowadzić do dodawania i negacji . Kod który umożliwia taką realizację to kod U2. jest to kod wagowy, który dowolnej liczbie całkowitej dziesiętnej przyporządkowuje słowo binarne a1.....a0- spełniające warunek an-1...a0 =-an-1*2n-1+an-2*2n-1+a0*20. jeżeli chcemy sprawdzić liczbę ujemną to najstarszy bit powinien mieć znak `-` 1110=-1*23+1*22+1*21+1*20=-2

20.Kodery i dekodery priorytetu- dekoder ma n wejść i k wyjść k<=2n stosowane są tam gdzie wybieramy coś z wielu możliwości. Koder jest urządzeniem odwrotnym do dekodera, na jego wyjściu pojawia się zakodowany sygnał wejściowy, na którym pojawił się sygnał wyróżniony. Koder priorytetu (gdy wiele urządzeń chce daną informacje) na wyjściu może być więcej niż 1 sygnał wyróżniony, każdemu wyjściu przysługuje różny priorytet.

21.Podział pamięci półprzewodnikowej- w technice komputerowej stosowane są głównie pamięci o dostępie swobodnym, ale tych pamięci czas dostępu jest taki sam dla wszystkich miejsc w pamięci, pamięć sekwencyjna, czas dostępu zależy od miejsca w pamięci. RAM- pamięć ulotna służy do zapisu i odczytu (pamięć operacyjna, grafika). Tą pamięć dzielimy na: DRAM- są to pamięci wolne, tanie, łatwe w miniaturyzacji stosuje się je jako RAM są operacyjne; SDRAM- szybkie, drogie stosuje się je jako pamięci podręczne (cache) w procesorach. Pamięć ROM- pamięć nieulotna przeznaczone są do odczytu.

22 Łączenie pamieci ma na celu a) zwiekszenie długości slowa przy niezmienionej długości slow. B) zwiekszenie ilości slow bez zmiany długości c) zwiekszenie ilości i długości slow. Przy zwiekszeniu długości slowa potrzebna jest szersza magistrala danych z bitow danych kilku układów scalonych pamieci. Magistrale adresowa i sygnaly sterujące lacza się rownolegle. Wniosek: zwiekszenie liczby slow - zwiekszenie liczby adresow, zwiekszenie długości slow - zwiekszenie ilości lini w szynie adresowej

23.Pamięć DRAM, SDRAM,RDRAM- metody skracania czasu dostępu- DRAM-pamięć pracuje w cyklu 5-2-2-2 kolejne odczyty następują w 2 takty zegara, f=66Mhz, SDRAM- pełna synchronizacja z procesorem, pracuje w cyklu 5-1-1-1 czas dostępu 10ns. Standardowo 100Mhz buduje się także 133Mhz, 200Mhz zwiększenie wynika z tego że w1 takcie zegara przekazywane są 2 słowa danych, podczas narastania i opadania sygnału a także 266Mhz. RDRAM- budowane w 3 standardach PC-600, PC-700 i 800, szerokość szyny wynosi tylko 10-20 bitów. Przepustowość pamięci PC800 dla częstotliwości taktowania szyny 400Mhz oraz 184 złącza styku i bardzo się grzeją, szybkość przesyłu jest w zależności od częstotliwości.

24. Roznice miedzy specjalizowanym ukladem cyfrowym a systemami mikroprocesorowymi. W specjalnym ukladzie cyfrowym ,który dziala w scisle ustalony z gory sposób.W tych układach przetwarzanie inforacji zalezy tylko od danego ukladu,jak zostal zaprograowany, tak musi być. Przetwarzanie danych w systemie mikr.najwazniejszy jert procesorowe przetwarzania inforacji za pooca elementow operacji,czyli instrukcji ,ciag instrukcji tworzy program ,my do systemow mikroprocesorowych musimy dostarczyc,poza danymi,programy wg. Którego dane będą przetwarzane.

25. Schemat blokowy systemu mikroprocesorowego/40 elementy up (mikroprocesor)/ 41. Struktura mikroprocesorowa.

CPU centralna jednostka przetwarzajaca, zawiera mikroprocesor( zadania przetwarzanie informacji, sterowanie praca pozostalych elementow sysemu), zegar systemowy (wytwarza przebiegi czasowe niezbędne do racy mikroprocesora i systemu) , opcjonalnie sterownik magistrali (układ wytwarzający na podstawie inf. z mikroprocesora sygnaly sterujące praca układów wejścia i wyjscia układami mem, koprocesorem) PAMIEC ROM,RAM,pamiec operacyjna RAM przechowywany w niej jest progranm wykonywany przez system,i wszystkie dane sa w nim zawarte wylaczenie komputera wymazuje ram.Aby system mikrop. Zaczal dzialac musi być program inicjujacy prace systemu BIOS zapisywany w pamieci ROM.. I/O urzadzenia wejścia i wyjscia , pośredniczą w wymianie inf miedzy UP, MEM a środowiskiem zewnętrznym - monitor, klawiatura,…. Potrzeba istnienia wynika z 3 powodow: 1)rozne predkosci dzialania urządzeń 2) rozne formaty przekazywanych informacji 3) rozne poziomy sygnałów elektrycznych TYPY MAGISRAL: Magistrala danych - sluzy do przekazywania wynikow oraz kodow instrukcji i kierowania,im szybsza tym system wydajniejszy MAGISTRALA ADRESOWA- służy do przesyłania adresow komorek pamieci lub adresow ukladow we/wy ZESTAW LINI STERUJACYCH-sluzy do sterowania ukladami wspolpracujacymi z mikrop.

26. Przykładowe rejestry mikroprocesorowe

1-Rejestr rozkazow(ir)-zawiera kod aktualnie wykonywanego rozkazu,kod jest pobierany z pamieci RAM i deklarowany w dekoterze,sygnal dekodera trafia do ukladow sterowania(wewn lub zew),sygnaly sterujace realizuja rozkaz(przekazuja do urzadzen zewnetrznych).Rejestry wyjsc wykonawczych-wspolpracuja z ALU oraz ukladai sterowania..Wystepuja rejestry dostepne i niedostepne prograowo,zawartosc tych pierwszych oze być zieniana przez procesor w wyniku jakiejs instrukcji naleza do nich: A-akumulator-zawiera 1 z operatorow operacji.

F-zapisuje się dodatkowe informacje,inf.,ze cos jest nie tak (zly znak liczby),FLAGI sa uzywane do rozgalezien w programach. Rejestry B,C,D,E,H,L-rejestry uniwersalne robocze,przechowuja argumenty,bądź wyniki operacji.PC licznik rozkazu IP-wskaznik instrukcji,zawiera adres komurki przechowujacej kod który będzie wykonywany jako nastepny.SP-wskaznik STOSU zawiera adres ostatniej pelnej komurki stosu.

27. Tryby adresowania. -Tryb adresowania natychmiastowego(arguent rozkazu jest zawarty w kodzie rozkazu). -Adresowanie bezposrednie(kod rozkazu zawiera kod operacji i adres komurki paieci,gdzie jest przehowywany arguent).

-Adresowaniwe rejestrowe w kodzie rozkazu okreslonyjest rejestr w który przechowywany jest argument rozkazu. -Adresowanie posrednie-adres arguentu może zieniac swoje polozenie w rejesrze-jest on wyliczany przez program.

-Adresowanie indeksowe z przemieszaniem-adres argumentow w paieci wynika z suy 2 adresow:zawartosc rejestru+przesuniecie.

W procesorach 80*86 istnieje 12 typow adresowania,sa one kobnacyjne w/w.

28 Magistrala sterujaca.. W fazie wykonywania rozkazu a iejsce zdeklarowanie kodu rozkazem(dekoder w ikroprocesoze)i wysylanie sygnalow sterujacych realizujacych dany rozkaz(uklad STERUJACY IKROPROCESOREM).Magistrala sterujaca-jest zestawem lini które sloza do przesylania sygnalow sterujacych wychodzacych i przychodzacych do procesora:-sygnaly wchodzace informuja procesor o stanach ukladow wspolpracujacych z procesorep;-Sygnaly wychodzace steruja jednostka wykonawcza procesora,oraz ukladai zewnetrznymi.

29. Układy We/Wy. Uk. Te posrednicza w wymianie inforacji miedzy pamiecia,procesorem,a urzadzeniami zewnetrz.Ich potrzeba wynika z punktu 3.Uklady we/wy oga być dedykowane tylko do pracy z konkretnym urzadzenie,oraz pracowac z wieloa urzadzeniai porty RS,USB.Wyrorzniamy uklady we/wy :

-Wspoladresowe z paiecia operacyjna-traktuje się te uklady jako pewien zespol rejestrow,które sa wybierane za pomoca adresow(karta grafiki-w celu wyswietlenia grafiki-umieszczony w okreslony obszarze RAM-buforze obrazu).

-Izolowane-obiekt we/wy wybierany jest poprzes podanie uprzedniego sygnalu sterujacego.Przestrzen adresowa ukladu we/wy i paiec oze się pokrywac,o wyborze decyduje sygnal sterujacy (sterowanie dysku IDE).

30. Na czym polega tryb DMA direct memory access -operacje wej/wyj ze sterowanie prograowym przez mikroprocesor.

Transisja danych przebiega miedzy ukladem we/wy ,a obszarem RAM.Transmisje nadzoruje sterownik DMA,nadzor magistrali,generuje potrzebne adresy i sygnaly sterujace,mikroprocesor pracuje dalej,operacje w tym trybie rozpoczyna sygnal urzadzen we/wy,które podaje na procesor rodkaz hold:tryb ten charakteryzuje się:

-zachowuje stan rejestrow-oze pracowac dalej;-separuje się od magistrali;-wysyla sygnal gotowosci,wyjscie sterujacym HOLDA do sterowaniaDma,-transmisja danych. Po zakonczeniu operacji sterownik DMA,zwraca mikroprocesorom kontrole nad magistralami.

31. Procesory Intela: Rodzina 80x86: 8086,8088,80186,80188, 80286.80386,80486,Pentium, II III IV Celeron kompatybilnosc

32. Podstawowe cechy działania procesora Pentium.

64 bitowa magistrala danych, 32 bitowa magistrala adresowa, praca w 3 trybach: rzeczywistym, chroniony tryb wirtualny, wirtualny 8086, sprzętowe elementy ułatwiające projektowanie systemów operacyjnych wspomaga: pamięć wirtualna, praca wielozadaniowa, ochrona zasobów. Architektura procesora umożliwia: praca potokową, dwa potoki przetwarzania instrukcji. Przewidywanie rozgałęzień w programach, segmentacje i stronicowanie pamięci, centralne jednostki arytmetyki zmiennoprzecinkowej, 2 pamięci wewnętrzne podręczne cache dla danych data cache instrukcji programowych code cache, możliwość pracy z pamięciami cache drugiego rzędu.

33. Do czego służą rejestry segmentowe

Wyróżniamy następujące rejestry segmentowe

-rejestr segmentowy programu CS; rejestr segmentowy danych DS; rejestr segmentowy stosu SS; rejestr dodatkowy stosu danych BS, GB, RS. Adres początku bloku (segmentu) = zawartość rejestru segmentowego x16h, blok ten może się przemieszczać ze skokiem równym 16B, adres efektywny (tj. przesunięcie) adres te jest 1bitowy. W pamięci może się znajdywać jednocześnie kilka segmentów pokrywających się.

34. Wyjaśnij idee adresowania w trybie rzeczywistym i chronionym.

W trybie rzeczywistym Pentium zachowuje się jak szybki procesor 16 bitowy 8086, w trybie rzeczywistym procesory są kompatybilne. Generowanie adresu w procesorze 8086, parametry tego procesora: 16 bitowa szyna danych, 16 bitowe rejestry, 20 bitowa magistrala danych, adresowanie pamięci o pojemności 1 MB=220 , aby zaadresować 1MB 1B-bitami adresów opracowano specjalny układ generowania adresu fizycznego.

Praca w systemie chronionym- w tym trybie są dostępne sprzętowe mechanizmy wspomagające obsługę pamięci wirtualnej, pracy wielozadaniowej, ochrony zasobów, stronicowanie pamięci.

35. Różnica pomiędzy trybem adresowania rzeczywistym a wirtualnym

???

36. Praca wielozadaniowa w systemie jednoprocesowym.

Polega ona na tym iż kolejność sekwencji wykonywania pojedynczych zadań, każde zadanie jest wykonywane do momentu żądanego czasu. Żądanie zmiany zadania przez użytkownika, brak informacji potrzebnych do kontynuacji zadania. Uwagi dotyczące tego trybu pracy przy zmianie zadania trzeba zapisać stan procesora przy wykonywanym zadaniu. W systemie musi być mechanizm zabezpieczający dostęp do pamięci używanych przez różne zadania, mechanizm można obsłużyć programowo(zapewnia to system operacyjny). W procesorach Pentium jest wspomaganie sprzętowe- uzyskuje się je przez pamiętanie stanu procesora w pamięci operacyjnej w tzw. systemowych segmentach stanu zadania TSS, procesor posiada rejestr zadania TR, sektor wskazuje na dokładnie wykonywane zadanie, zmiana zawartości segmentu TR powoduje zmianę wykonywanego programu.

37. Cel stosowania oraz sposoby współpracy pamięci cache z mikroprocesorem.

Jest to bardzo szybka pamięć statyczna (dużo szybsza od RAM), potrzeba pamięci cache wynika z tego, że procesor jest dużo szybszy niż RAM, więc potrzeba bufora, który będzie tę pracę wspierał. Jest ona stosunkowo mała od kilku do kilkuset KB. Aby ją obsłużyć i dobrze wykorzystać jest obrany w systemie sterownik cache, który synchronizuje jego pracę z całą resztą. Funkcje pamięci cache: sprawdza czy dana informacje jest w cache, jeżeli tak to mamy tzw. Trafienie, jeżeli jej nie ma to trzeba dogrywać ją z Ram, co trwa długo i jest nieefektywne. Mamy 2 rodzaje współpracy pamięci cache z Procesorem. Przy trafieniu magistrala główna nie jest używana, mogą z niej korzystać inne urządzenia np. sterowniki DMA(zwiększa to działanie systemu). Żądanie informacji z pamięci inicjuje normalny cykl magistrali głównej. Przy trafieniu (informacja znajduje się w pamięci cache) cykl ten jest zawieszany i informacja jest szybka pobrana z pamięci cache. Obecnie pamięci cache znajdują się w samym procesorze. W pamięci cache wyróżniamy:

-blok danych przechowywane są w nim informacje

-katalog pamięci- tzn. sprawdzenie czy dana informacja jest w tym katalogu pamięci cache

-sterownik pamięci cache- jest odpowiedzialny za pracę pamięci cache z systemem, dba o to by informacje w pamięci cache wyglądały tak samo jak są zapisane z systemie (pamięci RAM). Niezgodność zapisu w cache i RAM może być jedynie krótkotrwała. Aby uniknąć niezgodności stosuje się kilka metod adresów zawartości RAM i cache, stosuje się głównie metody zapisu równoległego buforowanego. Pierwszy raz pamięć cache zainstalowano z procesorach Pentium. Cache dzielony był na 2 grupy. I poziom mniejszy II poziom musiał być dużo większy od pamięci I poziomu

cache -cache przechowuje kody instrukcji

date cache wyniki obliczeń

38. Praca potokowa procesora Pentium

Praca w tym trybie polega na jednoczesnym wykonywaniu kilku rozkazów. Rozwinięcie idie prefetchingu w procesorze realizowane w 5 fazach

-F- pobranie kodu instrukcji i pamięci

-01- Etap dekodowania instrukcji (ustala się rodzaj operacji oraz tryb adresowania)

-02- II etap dekodowania instrukcji (obliczany jest adres efektywny lub przygotowywane są argumenty natychmiastowe)

-E- wykonywanie-realizowany jest -jeśli jest wymagany- dostęp do pamięci i wykonywana jest operacja

lub programu), ktory zawiera definicje danego typu obiektowego.

I/O-uklady we/wy sluzya wyianie informacji poiedzy procesorem pamiecia i urzadzeniami zewnetrznymi,poptrzeba posrednictwa wynika z tego ze:urzadzenia dzialaja z rożna szybkoscia trzeba to dopasowac,informacje przesylane nie sa jednorodne,co chwila inny mikrop.dziala wiec rozne napiecie na wyjsciu trzeba usawic tak aby urzadzenie dzialalo. DB-magistrala Tego typu pole i metode nazywamy polami i metodami prywatnymi. Uzycie po sekcji z dyrektywa private, dyrektywy ,,public''powoduje anulowanie ograniczenia zakresu waznosci dla dalszych pol i metod. PRZYKLAD DEKLARACJI TYPOW OBIEKTOWYCH:

TYPE punkt:object

X,Y=integer

End

Pierwszy obiekt (punkt) ma tylko 2 pola typu integer.

W jednoczesnym realizowaniu różnych faz kilku rozkazów w trakcie 5 taktów zegara wykonywanych jest 10 instrukcji

39. Pojecie FSB, Fcore, DDR

FSB (front size bus) zewnetrzne szyny procesora Fcore częstotliwość rdzenia procesora fsb x mnożnik DDR double data rate chyba wiec 2 x fsb

40. Co to jest złożoność algorytmu

Zagadnieniem określenia czasu obliczeń zajmują się informatycy, wprowadzili oni pojecie złożoności algorytmu tj. zależności czasu obliczeń od rozmiaru danych. Wyróżnia się algorytmy o złożoności:

- wykładniczej np. 2n(algorytm rekurencyjny do obliczenia funkcji Fibanowego F(n)

- wielomianowej- czas zależy od potęgi równania problemu, np. linowa 2n kwadratowa 3n2

-logarytmicznej np. log2n -bardzo dobra zbieżność. Czas obliczeń zależy od: liczby operacji, rodzaju operacji, szybkości procesora, ograniczenia programowego(np.wydruk), dostępu do danych (w plikach, w RAM-ie)

41 Pojecie algorytmu iteracyjnego i rekreacyjnego ???

50.Podaj algorytm: poszukiwania NWD, F(n), 2n, n! sprawdzania czy n jest liczbą pierwszą, rozwiązywania równania kwadratowego.

NWD

Szukamy takiego takiego podzielnika liczb X i Y dla którego reszta z dzielenia równa jest 0. Przy czym pierwszym podzielnikiem D jest liczba mniejsza. Jeżeli w wyniku podzielenia obu liczb uzyskamy reszty równe 0 to D jest NWD. Jeśli nie to od liczby większej odejmujemy liczbę mniejszą. Jeżeli nie uzyskamy w wyniku 0, to od wyniku tego odejmowania odejmujemy liczbę mniejszą. Powtarzamy to dopóki nie otrzymamy w wyniku 0. Wtedy NWD będzie przedostatni wynik.

np.

liczby 28 i 12: 28-12=16

16-12=4

12-4=8

8-4=4

4-4=0

n!:

Iteracyjnie: 0!=1

n!=1*2*3*…*(n-1)*n

rekurencyjnie: n!=n*(n-1)!

Najpierw trzeba obliczyć silnię z liczby mniejszej o 1, a następnie kolejne silnie z licz mniejszych od poprzednich, aż do uzyskania 0!=1. Mając policzone poszczególne silnie są one podstawiane z powrotem do wzorów:

4! 4!=4*3!

4!=4*(3*2!)

4!=4*(3*(2*1!))

4!=4*(3*(2*(1*0!))) ale 0!=1 więc:

4!=4*(3*(2*(1*1)))

4!=4*(3*(2*1))

4!=4*(3*2)

4!=4*6

4!=24

F(n):

F(n)= 1) 0 dla n=0

2) 1 dla n=1

3) F(n-1)+F(n-2) dla n>1

Ciąg Fibonacciego wyraża się rekurencyjnym wzorem: F(n)=F(n-2)+F(n-1), gdy F(1)=1 oraz F(2)=1.
Łatwo obliczyć, że:
F(3)=F(1)+F(2)=1+1=2
F(4)=F(2)+F(3)=1+2=3
F(5)=F(3)+F(4)=2+3=5

2^n

2^n= 1) 1 dla n=0

2) (2^(n/2))^2 dla parzystych n

2) 2*(2^trunc( (n)(2) ) )^2 dla nieparzystych

np. n=32

2^32=(2^16)^2=((2^8)^2)^2=(((2^4)^2)^2)^2=((((2^2)^2)^2)^2)^2

Zamiast 32 mnożeń mamy:

2

2*2

4*4

16*16

256*256

65536*65536

n liczbą pierwszą

Jeżeli n dzieli się bez reszty przez którąkolwiek z liczb od 2 do (n-1) to n nie jest liczbą pierwszą.

poprawki:

Wyeliminowanie sprawdzania dla wszystkich liczb. Jeżeli n nie dzieli się przez 2 to też nie dzieli się przez jej wielokrotności (liczby parzyste). Wielokrotności tej liczby są eliminowane z dalszego sprawdzania. Podobnie kolejne liczby.

Dla danego podzielnika p>n^0,5 istnieje zawsze podzielnik q „mały” (q<n^0,5) równy q=n/p. Np. dla n=21, 21^0,5=4,58 p=7, q=21/7=3. Nie trzeba zatem sprawdzać podzielników>n0,5

równanie kwadratowe

Wczytujemy zmienne a,b,c. Dalej liczymy deltę d=b^2-4ac. Warunki: jeżeli delta jest mniejsza od zera brak rozwiązań równania kwadratowego. Jeżeli delta równa się zero jest jedno rozwiązanie x0= -b/2a. Jeżeli delta jest większa od zera są dwa rozwiązania: x1= -b-sqrt(d)/2a x2=-b+sqrt(d)/2a.

51.Instrukcje: przypisania, warunkowa, warunkowa zagnieżdżona, instrukcje do realizacji pętli obliczeń, instrukcja wyboru, break, continua, skoku, typedef - składnia (przykłady).

Przypisania - w językach programowania to instrukcja w której do pewnej lokacji (l-wartości) przypisuje się wartość, która będzie w nim przechowywana.

np. int x=5; a=20; d=a+x;

Warunkowa - umożliwia wykonanie pewnej instrukcji w zależności od wartości wyrażenia. Wszystkie wartości różne od 0 są w języku C++ traktowane jako prawda, równe 0 jako fałsz. Wyrażenia logiczne są liczone tylko do momentu, w którym można określić jego wartość.

if (warunek)

{instrukcja}

else

{instrukcja}

int a=4;

if (a > 5)
cout<<”a jest wieksze od 5”;

else if

cout<<”a jest mniejsze od 5”;

else

cout<<”a jest rowne 5”;

Warunkowa zagnieżdżona instrukcja if...else... wykonuje serię testów aż wystąpi jedna z poniższych sytuacji

-jeden z warunków w instrukcji if lub else if jest prawdziwy. W tym wypadku wykonują się instrukcje występujące po tym warunku

- żaden z testowanych warunków nie jest prawdziwy. Program wykonuje instrukcję z ostatniej instrukcji else (jeżeli występuje)

-jeżeli warunek jest spełniony, po prostu wykonuje instrukcje.

np.

if (warunek)

{if(warunek2)

{ instrukcja1}

else {instrukcja2}

}

else {instrukcja3}

char c ;

clrscr () ;

cout << "Podaj znak" ;

cin >> c ;

if (c >= 'A' && c <= 'Z')

cout << "litera duza\n" ;

else if (c >= 'a' && c <= 'z')

cout << "litera mala\n" ;

else if (c >= '0' && c <= '9')

cout << "cyfra/n" ;

else

cout << "inny znak\n" ;

Pętle

for - pętla ta w C ma bardzo rozpowszechnione zastosowanie może obsługiwać zarówno stałe jak i warunkowe iteracje.

for (inicjacja; warunek; instrukcja1) instrukcja2 ;

{

double a = 10 ;

int n ;

cout << "Podaj liczbe z zakresu [1..30]: " ;

cin << n ;

if (n > 0 && n <= 30)

{

for (int i = 1 ; i <= n ; i++) a += (double)i ;

cout << n << " != " << a << '\n' ;

}

else cout << "Liczba z poza zakresu" ;

return 0 ;

}

dodatkowo pętle:

while :

while (zmienna < 100)

{

instrukcja_1;

instrukcja_2;

instrukcja_3;

}

do-while:

do

{

instrukcja_1;

instrukcja_2;

instrukcja_3;

}

while (zmienna > 10);

Wyboru - switch

- instrukcja wymaga wartości całkowitej, wartość ta może być stałą zmienną, wywołaniem funkcji lub wyrażeniem. Switch nie działa ze zmiennoprzecinkowymi typami danych.

- wartość występująca po każdej etykiecie case musi być stałą.

- C++ nie zezwala na użycie etykiet case z zakresem wartości, każda wartość musi występować w oddzielnej etykiecie case.

- po każdej grupie wykonywanych instrukcji, trzeba użyć instrukcji break. Powoduje ona wyjście programu z instrukcji switch. Jeżeli nie użyje się instrukcji break program przejdzie do wykonania instrukcji po kolejnych etykietach case.

- zbiór instrukcji dla każdej etykiety lub etykiet musi być zawarty w nawiasach klamrowych.

- instrukcja po etykiecie default jest wykonywana gdy nie natrafiono na żadną etykietę else.

Przykład:

char c ;

clrscr () ;

cout << "Podaj znak" ; cin >> c ;

switch (c)

{

case "A":

case "B":

cout << "Duza litera" ;

break ;

case "a":

case "b":

cout << "Mala litera" ;

case "0":

case "1":

cout << "Cyfra" ;

break ;

default :

cout << "Inny znak" ;

}

Break - umożliwia wyjście z pętli Instrukcja ta powoduje przejście programu do końca aktualnej pętli. Składnia dla pętli for:

for (inicjalizacja, test, uaktualnienie)

{

//sekwencja instrukcji nr 1

if (warunek wyjścia z pętli) break ;

//sekwencja instrukcji nr 2

}

//sekwencja instrukcji nr 3

Przykład:

char s [8], FindChar ; // Podaj ciąg znaków (string) s

for (i = 0 ; i < strlen (s) ; i++) // strlen() - zwraca długość łańcucha

if (s [i] == findchar) break ; // znak do wyszukiwania FindChar

if (i < strlen (s)) cout << " " << i << '\n' ;

continue - Instrukcja ta kończy działanie przebiegu kodu pętli - czyli jeżeli gdzieś w pętli wystąpi instrukcja continue to program pomija instrukcje występujące po niej i przystępuje do ponownego sprawdzenia warunku. Instrukcja ta powoduje przedwczesne, bezwarunkowe zakończenie wykonania wewnętrznej instrukcji pętli i podjęcie próby realizacji następnego cyklu pętli.

Instrukcje skoku - goto

Instrukcja goto jest postrzegana przez programistów jako spadek po BASIC'u, ponieważ za jej pomocą możemy wykonywać skoki do deklarowanej etykiety. Większość domorosłych programistów uważa, że jej stosowanie jest przykładem złej znajomości rzeczy, ale tak na prawdę, użycie goto w uzasadnionym przypadku ma swój sens. Konstrukcja goto jest prosta:
goto nazwa_etykiety; // a w kodzie programu umieszczamy:
nazwa_etykiety:
instrukcje_etykiety;
Ograniczenia instrukcji goto nie pozwalają jej na przeskoczenie definicji zmiennej, po każdej etykiecie musi wystąpić co najmniej jedna instrukcja. Instrukcja ta może przydać się choćby do natychmiastowego opuszczenia wielokrotnie zagnieżdżonej pętli. Ponadto goto nie może spowodować przejścia do wykonania instrukcji znajdującej się poza funkcją zawierającą goto.

Typedef- Język C++ umożliwia zdefiniowanie swoich własnych typów danych poprzez

zastosowanie instrukcji typedef. Instrukcja ta jest środkiem, dzięki któremu program może

rozszerzyć podstawowe typy danych języka C. Ogólna postać instrukcji typedef jest na-

stępująca,

typedef deklaracja_typu;

gdzie deklaracja_typu jest identyczna jak deklaracja zmiennej, poza tym że zamiast nazwy_

zmiennej jest użyta nazwa typu. Na przykład instrukcja

typedef int count;

przykład:

main()

{

typedef int group[10]; /* Utworzenie nowego typu 'group' */

group totals; /* Przypisanie nowego typu danych zmiennej */

for (i = 0; i < 10; i++)

totals[i] = 0;

return (0);

}

52.Jakie znasz typy standardowe?

Typ Boolean

Typ Integer

Typ Float

Typ Character

char - typ znakowy. Można za jego pomocą przechowywać znaki w kodzie ASCII (American Standard Code for Information Interchange) lub innym stosowanym na danej maszynie. Bezpiecznie można więc przechowywać liczby z zakresu 0 .. 127. Na ogół typ char ma 1 bajt długości w związku z czym można za jego pomocą przechowywać liczby z zakresu -128 .. 127 (jeśli jest ze znakiem) lub 0 .. 255 (jeśli jest bez znaku).

int - typ całkowity. Zmienne tego typu typu mogą przyjmować wartości całkowite dodatnie lub ujemne.

short int - typ całkowity krótki

long int - typ całkowity długi

float - typ zmiennoprzecinkowy pojedynczej precyzji.

double - typ zmiennoprzecinkowy podwójnej precyzji.

long double - typ zmiennoprzecinkowy podwójnej precyzji długi.

void - typ pusty oznaczający brak wartości (stosowany w ANSI C). ¯adna zmienna nie może być typu void. Tylko parametry przekazywane do funkcji mogą być typu void (oznacza wtedy, że do funkcji nic się nie przekazuje) lub zwracane przez funkcję (funkcja nic nie zwraca). Oprócz tego typ void może być stosowany przy tworzeniu pewnych typów złożonych.

Dla każdego z typów całkowitych: int, short int, long int oraz char możliwe są następujące modyfikatory:

unsigned - typ bez znaku (tylko wartości dodatnie)

bool - zwraca wartość true (1) lub false (0)

53.W jaki sposób możesz zdefiniować typy pochodne (własne)?

Typy pochodne - tworzymy na podstawie typów fundamentalnych za pomocą operatorów deklaracji

* - wskaźnik danego typu - int *w;

& - referencja do danego typu

[] - tablice danego typu

() - funkcja zwracająca dany typ, o parametrach danego typu

54.Jakie znasz zakresy ważności zmiennej (obiektu)?

. Zakresy ważności zmiennych

- czas życia obiektu - od momentu gdy obiekt został zdefiniowany do momentu, kiedy przestaje istnieć

- zakres ważności nazwy - zakres w którym nazwa jest znana kompilatorowi

- zakres lokalny - od punktu deklaracji do końca bloku

- globalny - dla nazwy zadeklarowanej poza klasą lub funkcją, zasięg od punktu deklaracji do końca

pliku zawierającego tą deklarację

- zakres klasy - nazwa widziana tylko przez metody klasy, klas pochodnych i zaprzyjaźnionych

55.Co to jest enum?

Typ wyliczeniowy enum.

Typ wyliczeniowy jest bardzo sprytnym rozwiązaniem polepszającym czytelność kodu oraz

zmniejszającym ilość błędów w programie. Stosuje się go w wypadku, gdy znamy ilość pewnych

stanów układu, oraz jeśli jesteśmy je w stanie wyliczyć. Klasycznym przypadkiem może być typ

użyty do wyliczenia dni tygodnia:

enum dni_tygodnia = {poniedzialek=1, wtorek, sroda, czwartek, piatek, sobota, niedziela};

Taka konstrukcja jest jednak mało przydatna. Najlepiej typ enum połączyć z instrukcją typedef, w

wyniku której otrzymujemy nowy typ:

typedef enum {poniedzialek=1, // pierwszy dzien pracy, moge cos zbadac

wtorek, // dydaktyka,

sroda, // spotkanie z grupa z programowania proceduralnego - bedzie wesolo

czwartek, // badania

piatek, // seminarium wydzialowe

sobota, // weekend

niedziela} // kosciol

dniTygodnia;

56.Struktura programu w języku C++

Struktura programu:

#include <iosteram>

#include <studio.h> //obszar dyrektywy #include

//obszar deklaracji i/lub definicji

int main (void) //nagłówek funkcji main

{ //początek instrukcji złożonej

cout<<”Cześć!”; //instrukcja

return 0; //instrukcja

} //koniec instrukcji złożonej

//obszar deklaracji i/lub definicji

57.Operatory arytmetyczne, relacji, logiczne, bitowe.

Operatory arytmetyczne, relacji, logiczne, bitowe.

Operatory relacji

większe od.. >

mniejsze od.. <

większe lub równe z.. >=

mniejsze lub równe z.. <=

równe z.. ==

rózne od.. !=

operator „>” oznacza: większy od.. Chodzi o taką sytuację:

4 > 2; //prawda

3 > 8; //fałsz

1 > 1; //fałsz

zmienna > 6;

zmienna > zmienna;

5 > zmienna;

Całe wyrażenie ma wartość prawda, gdy warunek jest prawdziwy. W naszym przypadku jest 4 > 2, co jest prawdą. Zatem warunek został spełniony i wyrażenie jest prawdziwe. W drugim przypadku jest 3 > 8, co prawdą nie jest. W związku z tym warunek nie został spełniony i wyrażenie jest fałszem! W trzecim przypadku jest mały podstęp. Czy 1 > 1. Oczywiście nie, więc mamy fałsz.

operator „<” czyli: mniejszy od.. Konkretnie:

21 < 15; //fałsz

11 < 23; //prawda

84 < 84; //fałsz

zmienna < 8;

zmienna < zmienna;

9 < zmienna;

Tutaj jest zupełnie odwrotna sytuacja, choć zasada ta sama. Wyrażenie jest prawdziwe tylko wtedy, gdy wartość stojąca po lewej stronie jest mniejsza od wartości będącej po stronie prawej. Tak dla formalności. Czy liczba 21 < 15? Chyba nie :) Zatem całe wyrażenie jest oczywiście fałszem. Natomiast 11 < 23 jest jak najbardziej prawdziwe, więc całe wyrażenie jest prawdą. Jak będzie w przypadku 84 < 84. Tutaj będzie to fałsz, ponieważ są to te same liczby.

operator „>=” to połączenie operatora > z operatorem ==. Taka mała dygresja. Mówiąc poważnie znaczy on tyle co: większy lub równy z.. Kilka przykładów dla utrwalenia:

2 >= 3; //fałsz

14 >= 13; //prawda

13 >= 13; //prawda

zmienna >= 17;

zmienna >= zmienna;

13 >= zmienna;

I trochę objaśnień. Na początku widzimy zapis: 2 >= 3. Wynika z niego, że 2 jest większe lub równe z 3. Z tym nie możemy się zgodzić, gdyż jest to nie prawdą. Następnie jest 14 >= 13. Tutaj nie ma problemu. Wszystko się zgadza. Nieco ciekawiej jest w trzecim przypadku. Mamy zapis: 13 >= 13. Liczba 13 jest równa 13 [co za odkrycie :) ]. Zatem wyrażenie jest oczywiście prawdziwe.

operator „<=” oznacza on: mniejszy lub równy z.. Tradycyjnie kilka przykładów:

21 <= 3; //fałsz

10 <= 18; //prawda

19 <= 19; //prawda

zmienna <= 42;

zmienna <= zmienna;

2 <= zmienna;

Mamy tutaj wyrażenie: 21 <= 3. Choćby nie wiem, jakby człowiek się gimnastykował to liczba 21 będzie większa od 3. Wiec jest fałsz. Dalej jest 10 <= 18. To też się zgadza! Czyli wyrażenie jest prawdziwe. Jeśli chodzi o zapis 19 <= 19 to dla odmiany nic nie powiem, bo wszystko jest jasne :)

operator „==” służy do porównywania dwóch wartości. Gdy wartości są równe wyrażenie jest prawdą i odwrotnie.

42 == 42; //prawda

4 == 14; //fałsz

zmienna == 1;

zmienna == zmienna;

5 == zmienna;

Właściwie nie ma co wyjaśniać. Jeśli liczby są takie same wyrażenie jest prawdziwe. Jak widać po obu stronach stoi ta sama liczba, więc wyrażenie jest prawdą. W drugim przykładzie jest inaczej. Liczba 4 nie jest równa 14. Czyli mamy fałsz.

operator „!=” również służy do porównywania dwóch wartości. Jednak działa odwrotnie niż poprzednik. Czyli, gdy wartości są jednakowe wyrażenie jest fałszem i vice - versa.

28 != 28; //fałsz

6 != 11; //prawda

zmienna != 15;

zmienna != zmienna;

51 != zmienna;

W przykładzie 28 != 28 widać wyraźnie, że są to jednakowe liczby. Skoro jednakowe, to warunek nie został spełniony, czyli mamy fałsz. Przykład 6 != 11 jest oczywiście prawdziwy, ponieważ są to różne liczby.

Operatory logiczne

Operatory te służą do obliczania wartości "prawda" lub "fałsz". Warunek prawdziwy daje wartość 1 natomiast fałszywy 0.

Negacja logiczna zamienia prawdę w fałsz, a fałsz w prawdę. Np. jeżeli wyrażenie: a==b jest prawdziwe i do niego

zastosujemy wyrażenie !(a==b) to w wyniku otrzymamy fałsz.

Składnia:

!argument

Iloczyn logiczny

Wynikiem iloczynu logicznego jest prawda tylko wtedy gdy oba argumenty też są prawdziwe. Jeżeli tylko jeden jest

fałszywy to wynikiem jest fałsz.

Składnia:

argument1 && argument2

Suma logiczna

Wynikiem sumy logicznej jest prawda wtedy jeżeli przynajmniej jeden argument jest prawdziwy. Tylko jeżeli oba są

fałszywe to wynikiem jest fałsz. Np:

01001010 - zmienna1

00101001 - zmienna2

01101011 - wynik

Składnia:

argument1 || argument2

Równość

Wynikiem jest prawda w tedy gdy wartości obu argumentów są takie same. Składnia:

argument1 == argument2

Nierówność

Wynikiem jest prawda w tedy gdy wartości obu argumentów są różne. Składnia:

argument1 != argument2

Operatory relacji

Wynikiem jest prawda w tedy gdy jest spełniony warunek że coś jest większe, mniejsze, lub równe od siebie. Zależy on

od operatora. Składnia:

argument1 < argument2

argument1 <= argument2

argument1 > argument2

argument1 >= argument2

Operatory przypisania

Argument występujący po lewej stronie przypisania (po lewej stronie znaku =) musi być jedną wartością. Oprócz operatora = istnieją inne. Mają one znaczenie według poniższego schematu:

a op= b

Jest to równe:

a = a op b

gdzie op jest operatorem który znajduje się po lewej stronie znaku =. Np: a *= b;

jest równe zapisowi (albo jak kto woli jest skróconym zapisem):

a = a * b;

Operator arytmetyczny if

Jest to jedyny w języku C++ operator, w którym są wymagane 3 argumenty. ma on

warunek ? wyrażenie1 : wyrażenie2

Zawsze na początku jest obliczany warunek. Jeżeli jest on prawdziwy ( != 0 ) to jest

warunek jest równy 0 to jest obliczane wyrażenie2.

Operator zwiększania

Dodaje on liczbę 1 do zmiennej przy której ten operator występuje. Jest to skrót ot wyrażenia:

a = a + 1; //lub

a += 1;

Składnia:

++zmienna

zmienna++

Operator zmniejszania

Odejmuje on liczbę 1 do zmiennej przy której ten operator występuje. Jest to skrót ot wyrażenia:

a = a - 1; lub

a -= 1;

Składnia:

--zmienna

zmienna--

Operatory bitowe

Operatory bitowe działają osobno na poszczególnych bitach zmiennych

Przesuwanie bitów w lewo

Zakładamy że operacja dzieje się na zmiennych typu unsigned char. Jeżeli zmienna ma wartość przedstawioną w

postaci binarnej:

00100100

to wynikiem takiej operacji zmienna << 2 będzie wynik:

10010000

to polecenie przesuwa bity w lewo o dwie pozycje. Argument traci bity które w wyniku przesunięcia znajdą się poza nim. po prawej stronie na miejsce brakujących bitów wstawia zera. Składnia:

zmienna << liczba bitów

Przesuwanie bitów w prawo .

Jeżeli zmienna ma wartość przedstawioną w

Zakładamy że operacja dzieje się na zmiennych typu unsigned char

postaci binarnej:

00100100

to wynikiem takiej operacji zmienna >> 1 będzie wynik:

00010010

to polecenie przesuwa bity w lewo o jedną pozycję. Argument traci bity które w wyniku przesunięcia znajdą się poza nim. po lewej stronie na miejsce brakujących bitów wstawia zera. Składnia:

zmienna >> liczba bitów

Negacja bitowa

Negacja bitowa zamienia w zmiennej wszystkie zera na jedynki i jedynki na zera. Jeżeli mamy zmienną o wartości:

10011010

to jej negacja bitowa wygląda tak:

01100101

Składnia:

~zmienna

Koniunkcja bitowa

Koniunkcja bitowa jest to mnożenie pojedynczych bitUw. Koniunkcja daje wynik jeden na danej pozycji, gdy w we wszystkich zmiennych na tej pozycji jest jedynka. Jeżeli tylko na jednym miejscu jest 0 to wynikiem jest 0. Przykład:

01101011 - zmienna1

11001101 - zmienna2

01001001 - wynik

Działa on na argumentach całkowitych

Składnia:

zmienna1 & zmienna2

Różnica symetryczna

Wynikiem różnicy symetrycznej jest na danej pozycji jedynka tylko w tedy gdy tylko w jednej zmiennej na danej pozycji jest jedynka. W przeciwnym wypadku jest 0.

01101011 - zmienna1

11001101 - zmienna2

10100110 - wynik

Działa on na argumentach całkowitych

Składnia:

zmienna1 ^ zmienna2

Alternatywa bitowa

Wynikiem alternatywy bitowej jest na danej pozycji jedynka w tedy gdy przynajmniej w jednej zmiennej na danej pozycji jest jedynka. W przeciwnym wypadku jest 0.

01101011 - zmienna1

11001101 - zmienna2

11101111 - wynik

Działa on na argumentach całkowitych

Składnia:

zmienna1 | zmienna2

58.Na czym polega inkrementacja i dekrementacja zmiennej?

Inkrementacja/dekrementacja polega na dodaniu/odjęciu od zmiennej jedynki

#include <iostream>

using namespace std;

int main()

{

int a = 5;

cout << a << endl;

cout << ++a << endl; //preinkrementacja

cout << a++ << endl; //postinkrementacja

cout << a << endl;

return 0;

}

Powyższy program wypisze nam na ekranie:

5

6

6

7

Jak widać na powyższych przykładach rozróżniamy 2 typy inkrementacji - tzw. preinkrementację i postinkrementację. Obie powodują zwiększenie wartości zmiennej o 1 jednak jest między nimi pewna różnica. Otóż operator preinkremencacji

(++a)

zwraca wartość już zwiększoną o 1 (w tym przypadku będzie to 6) natomiast operator postinkrementacji

(a++)

zwraca wartość zmiennej przed procesem inkrementacji (tutaj zwróci wartość 6 natomiast wartość zmiennej 'a' będzie już wynosić 7).

Dokładnie tak samo sprawa wygląda dla operatora dekrementacji - predekrementacji (--a) i postdekrementacji (a--).

59.Podaj przykłady wykorzystania operatorów: sizeof, rzutowania.

Operator sizeof

Operator sizeof przekazuje liczbę bajtów będącą rozmiarem wyrażenia lub specyfikatora typu. Może on występować w jednej z dwóch postaci:
sizeof (specyfikator_typu);
sizeof wyrażenie;

Operator rzutowania

Zmiana typu danych: operator rzutowania

Operator rzutowania służy do zmiany typu danych na inny:

  (typ_danych)x;

gdzie typ_danych oznacza ten typ danych, na który ma zostać zamieniona wartość zmiennej x.

Np. deklaracja:

  (float)5;

spowoduje zmianę stałej całkowitej 5 (typu int) na stałą zmiennoprzecinkową 5.0 (typu float).

60.W jaki sposób można przesyłać argumenty do funkcji - porównaj te sposoby?

Przesyłanie argumentów funkcji przez wartość: występują tutaj argumenty formalne formalne i aktualne. Argumenty formalne to jest to, jak na parametry mówi sobie w środku funkcja, natomiast argumenty aktualne to te, co aktualnie stosujemy w konkretnym wywołaniu funkcji.

Przesyłanie argumentów przez referencje: ( przez przezwisko) , przesyłanie argumentów przez referencje pozwala tej funkcji na modyfikowanie zmiennych ( nawet lokalnych) znajdujących się poza ta funkcja.

61.Na czym polega przeładowanie funkcji.

Przeładowanie funkcji: następuje wtedy, gdy w danym zakresie ważności jest więcej niż jedna funkcja o tej samej nazwie. To, która z tych funkcji zostanie wykonana, zależy od liczby lub typu argumentów, z którymi dana funkcja jest wywoływana.

62. W jaki sposób definiuje się tablice i w jaki sposób przekazuje się je do funkcji (przykłady)?

Tablica to ciąg obiektów tego samego typu, które zajmują ciągły obszar w pamięci. Tablice są typem pochodnym czyli biorąc typ int tablica będzie typy int.

Tablice przesyła się podając funkcji tylko adres początku tej tablicy. Nazwa tablicy jest równocześnie adresem zerowego jej elementu.

definicja np. int liczba[20];

63.Co pojawi się na ekranie monitora w wyniku wykonania fragmentu programu …….

64.Zdefiniuj i napisz do czego wykorzystuje się wskaźniki?

Wskaźnik to zmienna (zwana zmienna wskaźnikową) która zawiera adres pierwszej komórki pamięci, w której przechowana jest inna zmienna. Jeśli zmienna zajmuje więcej niż jedną komórkę pamięci to wskaźnik wskazuje na pierwszą z tych komórek. Dla każdego wskaźnika określany jest jego typ. Wskaźnik typu int wskazuje na zmienną typu int. Dzięki temu, kompilator wie ile komórek w pamięci zajmuje zmienna rozpoczynająca się w komórce, na którą wskazuje wskaźnik. Nierozłącznie ze wskaźnikami związane są dwa operatory. Są to operator wyłuskania, który jest zapisywany jako gwiazdka (*) oraz operator pobrania adresu &. Oba te operatory są operatorami przedrostkowymi (zapisuje się je przed zmienną) oraz jednoargumentowymi. Zastosowanie wskaźników: wskaźniki stosuje się w różnych sytuacjach, a mianowicie gdy chodzi nam o:

- ulepszenie pracy z tablicami

- funkcje mogą zmieniać wartość przesyłanych do nich argumentów

- dostęp do specjalnych komórek pamięci

- rezerwacje obszarów pamięci

int x=1; //deklaracja zmiennej int

int *wskaznik; //deklaracja wskaźnika na typ int

wskaznik = &x; //przypisanie adresu zmiennej wskaźnikowi

*wskaźnik = 99; //zapis równoważny z "x=99;"

Pierwsza linia przedstawionego kodu jest oczywista więc nie będziemy jej spejcajlnie analizować. W drugiej lini zadeklarowaliśmy wskaźnik na typ int. Zatem jak można się domyślać deklaracja wskaźnika wygląda następująco:

<modyfikator> <typ> *nazwa;

Zatem sama deklaracja wskaźnika na zmienną danego typu różni się od deklaracji zmiennej jedynie dodatkowym znakiem '*' poprzedzającym nazwę zmiennej.

65.W jaki sposób definiuje się tablice dynamiczne?

Tablice dynamiczne - ich rozmiar mógł być ustalany w trakcie działania programu.

Coś w tym stylu

int *t;

int rozmiar;

cin>>rozmiar;

t = new int[rozmiar];

lub

int rozmiar;

cin>>rozmiar;

int t[rozmiar];

66.Podaj przykład definicji struktury. W jaki sposób mamy dostęp do elementów składowych struktury?

Struktura- Struktura jest typem zawierającym w sobie zmienne dowolnego typu (tzw. pola). Struktura umożliwia zapakowanie powiązanych ze sobą logicznie danych w jednym obszarze pamięci, który może być przesyłany jako jeden argument.

Struktura w języku C++:

Struktury w C++ są deklarowane tak jak w C, jednak oprócz pól mogą zawierać także funkcje (tzw. Metody) i mogą dziedziczyć z innych klas i struktur. Struktura różni się w C++ od klasy wyłącznie domniemanym zakresem widoczności jej pól i metod - dla klasy jest to private a dla struktur public. Używanie struktur zamiast klas nie jest jednak dobrą praktyką programowania gdyż zaciemnia budowę programu.

/* deklaracja */

struct miasto {

long ludnosc;

char* rzeka;

miasto(long ludnosc,char *rzeka):

ludnosc(ludnosc), rzeka(strdup(rzeka)) {}; /*konstruktor*/

inline char* wez_rzeke() {return rzeka};

~miasto() {free( (void*)rzeka );} /*destruktor*/

};

W takich strukturach dostęp do składowych podstawowych wykonuje się przy pomocy operacji:
struci rect ekran;

a1 = ekran.p1.x

b1 = ekran.p1.y;

67.Podaj przykład definicji klasy i definicji obiektu klasowego.

Definicja klasy: Definicja klasy zawiera dwie części: nagłówka składającego się ze słowa kluczowego class, po którym następuje nazwa klasy oraz z ciała klasy ograniczonego parą nawiasów klamrowych i zakończonego średnikiem.

class TPunkt

{

};

Tworzenie obiektów: To co było do tej pory napisane odnosiło się do klasy, czyli naszego przepisu na stworzenie obiektu. Sam proces tworzenia obiektu nazywamy instancjonowaniem lub konkretyzacją klasy. Tworzenie obiektów dokonuje się tak samo jak tworzenie zmiennych. np.

//nazwa_klasy nazwa_instancji

int i; //zmienna typu int o nazwie i

TPunkt p1; //obiekt klasy TPunkt o nazwie p1

Do obiektów odwołujemy się poprzez kropkę „ . ” lub poprzez „ ->

68.W jaki sposób możemy odwołać się do składników klasy?

W samym kodzie programu dostęp do zmiennych wewnątrz klasy , które są nazywane polami jest uzależniony od tego czy mamy do czynienia ze zmienną typu klasowego, czy wskaźnikiem na ten obiekt:

- W przypadku zmiennej o typie klasa, dostęp do pól uzyskuje się operatorem wyłuskania którym jest (.)

obiekt.pole = wartosc; //przypisanie wartości polu w obiekcie

- Jeżeli mamy do czynienia ze wskaźnikiem, operatorem wyłuskania jest strzałka -> (myślnik i symbol większości)

obiekt->pole = wartosc;

69.Do czego służą etykiety private, protected i public?

Etykiety public, private, protected

Tworząc nową klasę możemy decydować, co ma udostępniać, a co nie. Przykład:

class zmywarka

{

public:

int nr_programu ;

float temp_wody ;

char nazwa[80] ;

bool plukaj( nr_programu, temp_wody ) ;

bool susz( nr_programu ) ;

private:

int cisnienie_wody ;

int obciazenie ;

bool zwolnijzawory( nr_programu ) ;

} ;

Oto rodzaje dostępu do składników klasy:

public - jest dostępny bez ograniczeń.

private - jest dostępny tylko dla funkcji składowych danej klasy i funkcji zaprzyjaźnionych tej klasy.

protected - jest dostępny tak, jak składnik private, ale jest jeszcze dodatkowo dostępny dla klas wywodzących się od tej klasy.

Etykiety te można umieszczać w dowolnej kolejności, mogą też się powtarzać.

Domniemanie - zakłada się, że dopóki nie wystąpi żadna z powyższych etykiet, to składniki mają dostęp private.

Definiując klasę możemy ograniczyć dostęp do niektórych składników klasy. Są trzy rodzaje dostępu do składników:

public 

oznacza, że składniki deklarowane po tej etykiecie są dostępne z każdego miejsca programu,

private 

oznacza, że składniki deklarowane po tej etykiecie dostępne są tylko dla funkcji składowych tej klasy; funkcje globalne (zwykłe) nie mają dostępu do tych składników, a więc z funkcji main również nie ma dostępu do tych danych,

protected 

tak jak w przypadku private z tą tylko różnicą, że dostęp do takich składników mają jeszcze klasy wywodzące się z tej klasy (będzie to wytłumaczone przy dziedziczeniu)

70.Do czego służą konstruktor i destruktor?

Konstruktor w programowaniu obiektowym to specjalna metoda danej klasy, mająca za zadanie utworzyć obiekt tej klasy.

Zadania konstruktora:

Wywołanie konstruktora powoduje wykonanie następujących zadań:

- obliczenie rozmiaru obiektu

- alokacja obiektu w pamięci

- wyczyszczenie (zerowanie) obszaru pamięci zarezerwowanej dla obiektu (tylko w niektórych językach)

- wpisanie do obiektu informacji łączącej go z odpowiadającą mu klasą (połączenie z metodami klasy)

- wykonanie kodu klasy bazowej ( w niektórych językach nie wymagane)

- wykonanie kodu wywołanego konstruktora

Z wyjątkiem ostatniego punktu powyższe zadania są wykonywane wewnętrznie i są wszyte w kompilator lub interpreter języka, lub w niektórych językach stanowią kod klasy bazowej.

Destruktor - w obiektowych językach programowania specjalna metoda, wywoływana przez program przed usunięciem obiektu i niemal nigdy nie jest wywoływana wprost w kodzie używającym obiektu. Pod względem funkcjonalnym jest to przeciwieństwo konstruktora. Destruktor ma za zadanie wykonać czynności składające się na jego "zniszczenie", inne niż zwolnienie pamięci zajmowanej przez sam obiekt, przygotowujące obiekt do fizycznego usunięcia. Po jego wykonaniu obiekt znajduje się w stanie osobliwym i zazwyczaj nie można już z tym obiektem zrobić nic poza fizycznym usunięciem. Destruktor zwykle wykonuje takie czynności, jak zamknięcie połączenia z plikiem/gniazdem/potokiem, odrejestrowanie się z innych obiektów, czasem również zanotowanie faktu usunięcia, a także usunięcie obiektów podległych, które obiekt utworzył lub zostały mu przydzielone jako podległe (jeśli jest ich jedynym właścicielem) lub wyrejestrowanie się z jego użytkowania (jeśli jest to obiekt przezeń współdzielony).

71.Do czego wykorzystuje się wskaźnik this?

Czemu służy wskaźnik this ? Każdy obiekt danej klasy posiada własną kopię zestawu pól. Natomiast funkcje składowe są przechowywane w jednym egzemplarzu; Wskaźnik this pozwala na zidentyfikowanie właściciela danych, do których odwołuje się funkcja składowa; Jeśli chcesz uniknąć kłopotów, nigdy nie zmieniaj wartości wskaźnika this!

72.Wyjaśnij istotę dziedziczenia?

Dziedziczenie (ang. inheritance) to w programowaniu obiektowym operacja polegająca na stworzeniu nowej klasy na bazie klasy już istniejącej. Załóżmy, że w naszym programie wynikła potrzeba użycia dodatkowej klasy, która różni się od tej jedynie w kilku szczegółach. Dzięki dziedziczeniu nie musimy tworzyć takiej klasy od zera, a możemy zamiast tego wprowadzić jedynie konieczne modyfikacje do klasy już istniejącej.

73.Podaj przykład klasy abstrakcyjnej.

W C++ klasą abstrakcyjną jest klasa, która posiada zadeklarowaną co najmniej jedną metodę czysto wirtualną. Każda klasa, która dziedziczy po klasie abstrakcyjnej i sama nie chce być abstrakcyjną, musi implementować wszystkie odziedziczone metody wirtualne.

class Abstrakcyjna {

public:

virtual void metodaCzystoWirtualna() = 0; }; // metoda czysto wirtualna

class Nieabstrakcyjna : public Abstrakcyjna { // dziedziczenie

public:

void metodaCzystoWirtualna() { // implementacja metody czysto wirtualnej

// instrukcje metody

return; }};

int main() {

// Abstrakcyjna obiektX; // błąd, klasa jest abstrakcyjna

Nieabstrakcyjna obiektY; // poprawne

return 0;

}



Wyszukiwarka