1.Informatyka-Jest to dziedzina wiedzy zajmująca się problemami: przetwarzania danych, przechowywania danych, przesyłania. danych
2.Algorytm- opis procesu przetwarzania informacji (ciąg instrukcji służący wykon określonego zadania)
3.Rodzaje języków programowania:
proceduralne: zapisuje się procedury, które następnie wykonuje komputer (procedura-moduł programu wykonania określone zadanie-synonim programu mogący działać samodzielnie)
deklaratywne: (Cobol ,prolog) umożliwiają m.in. wyszukiwanie danych w oparciu o pytania o listę rekordów zawierających określone informacje, a nie konkretne dane w konkretnych polach. Definiuje się w nich zespół faktów i zależności pozwalających zadawać pytania o konkretne wnioski.
4. Obliczenia numeryczne- związane są z przetwarzaniem liczb. Obliczenia takie prowadzone są w celu rozwiązywania zagadnień
z fizyki, matematyki i problemów technicznych.
Obliczenia symboliczne - (zw. z przetwarzaniem symboli, znaków) Kody źródłowe programów przetwarzających symbole
pisane są za pomocą deklaratywnych języków programowania(cobol, prolog, Lisp, język zapytań strukturalnych SQL)
Wynikiem obliczeń symbolicznych są znaki.
5. Inżynieria oprogramowania-jest to dziedzina zajmująca się wszelkimi aspektami produkcji oprogramowania-od analizy
i określenia wymagań przez projektowanie i wdrażanie aż do ewolucji gotowego oprogramowania.
6. Baza danych: Zbiór powiązanych ze sobą informacji, dotyczy on zazwyczaj wybranej dziedziny. Dane te zorganizowane są w
taki sposób aby łatwo można było je: a) Przeszukiwać b)wyciągać z nich wnioski c)podejmować na ich podst. decyzje.
Komputerowa baza danych składa się z danych i programu komputerowego wyspecjalizowanego do gromadzenia
przetwarzania tych danych. Program ten lub zestaw programów nazywany jest systemem zarządzania- bazą danych.
7. 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.: wspólne urządzenia, oprogramowanie, bazy danych.
Rodzaje sieci komputerowych: -asymetryczne (1 komputer jest serwerem); -symetryczne(komputery mają jednakowe uprawnienie). Podział sieci komputerowych:
-LAN sieci miejskie obejmujące swoim zasięgiem stos.nieduży obszar(np. oddział firmy,budynek)
-MAN sieci miejskie obejmujące kilka połączonych ze sobą sieci lokalnych znajdujących się np. na obszarze osiedla czy miasta
-WAN sieci obejmujące swoim zasięgiem duży obszar geograficzny. Sieć rozległa-wykorzystuje do przenoszenia sygnałów prywatne lub publiczne sieci telekomunikacyjne.
8. Internet-jest globalnie działającą siecią komputerową umożliwiającą wymianę informacji dzięki jednolitemu sposobowi kodowania i przesyłania informacji zwanym TCP/IP .
Intranet - sieć komputerowa, ograniczająca się do komputerów np. w firmie lub organizacji. Po zamontowaniu serwera, umożliwiającego korzystanie w obrębie sieci LAN z usług takich, jak strony WWW, poczta elektroniczna etc., czyli usług typowo internetowych, można mówić o intranecie. Do intranetu dostęp mają zazwyczaj tylko pracownicy danej firmy.
11.Relcja pomiędzy ilościami danych: 8 bitów=8b=1 bajt=1B takimi porcjami informacji posługiwano się w pierwszych komputerach. Większe porcje to: 1kB=2^10B=1024B, 1MB=2^10kB=1024kB=1048576B, 1GB=1024MB=1073741824B.
12.Kodowanie-proces przekształcania informacji polegający na wzajemnie jednoznacznym przyporządkowaniu elementom zbioru kodowanego słów kodowanych.(ciągów liczb binarnych)
13. Kod ASCII służy do kodowania tekstów i przesyłania ich pomiędzy urządzeniami cyfrowymi. Oprócz znaków
alfanumerycznych (litery, symbole, cyfry) koduje on także znaki sterujące pracą drukarki. Przyporządkowuje on znakom alfanumerycznym i sterującym słowa(ciąg) złożony z ośmiu cyfr binarnych (8 bitów-1B). Kod ten podawany jest w postaci tabeli zawierającej kodowane znaki i odpowiadający im kod cyfrowy. Kod cyfrowy znaku w tabeli może być wyrażany binarnie, dziesiętnie,
lub szesnastkowo.
14.Układem kombinacyjnym - nazywamy taki układ cyfrowy , w którym stan wejść jednoznacznie określa stan wyjść. Najprostsze
układy kombinacyjne-bramki logiczne;
Logiczne układy sekwencyjne- układy , w których stan wyjść zależy od stanu wejść oraz od poprzednich stanów układu. Są to układy, w których można pamiętać informację (najprostszy przykład - przerzutnik)
15.Układem asynchronicznym - nazywamy taki układ cyfrowy dla którego w dowolnym momencie jego działania stan wejść
oddziaływuje na stan wyjść.
Układem synchronicznym nazywamy układ cyfrowy dla, którego stan wejść wpływa na stan wyjść jedynie w pewnych określonych odcinkach czasu pracy układu (w tzw. czasie czynnym) natomiast natomiast w pozostałych odcinkach czasu (w czasie martwym)stan wejść nie ma wpływu na stan wyjść.Odcinki czasu martwego martwego czynnego określane są przez podanie specjalnego przebiegu zwanego sygnałem zegarowym) (taktującym) na wejście zegarowe (taktujące). Zachowanie układów
synchronicznych zależy więc od przebiegu sygnału sterującego.
16.Rejestr- przeznaczony jest do krótkoterminowego przechowywania niewielkiej ilości informacji lub zmiany postaci informacji z
szeregowej na równoległą i odwrotnie. Informacja może być wprowadzana do rejestru szeregowo lub równolegle. Zbudowane są one z
przerzutników synchronicznych.
Równoległe wprowadzanie informacji-polega na wprowadzeniu wszystkich bitów w takcie jednego zegarowym. W celu zrealizowania takiego wprowadzania informacji liczba zacisków wejściowych układu musi być równa liczbie bitów we wprowadzonym słowie.
Wejście cyfrowe szeregowe-takie wejście, które umożliwia wprowadzenie informacji do układu bit po bicie. Do wprowadzenia słowa n- bitowego potrzeba zatem n-taktów zegara. Układ ma tylko 1 wejście dla danych.
Z uwagi na sposób wprowadzania i wyprowadzania informacji dzieli się rejestry na:
-wej/wyj równoległe PIPO (stosuje się je w pamięciach DRAM)
-wej/wyj szeregowe SISO
-wej szer./wyj równoległe SIPO
-wej. Równoległe/wyjście szeregowe PISO (te 2 ostatnie stos. się do zamiany postaci informacji z szeregowej na równoległą i odwrotnie)
17. Pojęcie magistrali- Magistralą nazywamy zestaw linii i układów przełączających łączących dwa lub więcej układy będące nadajnikami lub odbiornikami informacji. Przesyłanie zachodzi zawsze pomiędzy dokładnie 1 układem- nadajnikiem a dokładnie 1 układem będącym odbiornikiem. Pozostałe układy są wówczas od magistral odseparowane.
18 .Realizacja sumatora-??????????
19. 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. Dekodery i kodery priorytetu
Dekoderem priorytetu nazywamy układ cyfrowy majacy n wejść i k-wyjść, gdzie k<= 2^n. Stosuje się je tam gdzie za pomocą liczby(adresu) wybieramy jeden z wielu obiektów.np. miejsce w pamięci operacyjnej czy jeden z wielu układów wej / wyj. Na wejście dekodera podawany jest zakodowany numer wyjścia, na którym ma pojawić się wyróżniony sygnał o wartości równej np. 0.a na pozostałych wyjściach sygnał 1.Wejście ENABLE sterujące aktywnością dekodera(=0 dekoder jest aktywny). Jeśli wejście jest n-bitowe to możemy zakodować k=2^n = 2^3 =8 różnych słów n-bitowych. Mamy zatem k-linii wyjściowych.
Koder Priorytetu - działanie jego jest odwrotne do działania dekodera. Na wyjściu kodera pojawia się zakodowany numer wejścia, na którym pojawi się sygnał wyróżniony. Ma ona następujące właściwości:
- na wejściu kodera może pojawić się więcej niż 1 sygnał wyróżniony .
-każdemu wejściu przyporządkowywany jest poziom ważności- priorytet.
-na wyjściu pojawia się zakodowany numer wejścia z wyróżnionym sygnałem o najwyższym priorytecie.
21.Podział pamięci półprzewodnikowych
-RAM-pamięć ulotna przeznaczona do zapisu i odczytu. Dzieli się na:
-DRAM- pamięci dynamiczne(wolne, tanie, łatwe w miniaturyzowaniu, stosowane w pamięciach operacyjnych.
-SRAM- pamięci statyczne(szybkie,drogie,stosuje się je jako pamięć podręczną cache)
-ROM-pamięć nieulotna przeznaczona tylko do odczytu.
22. Łączenie układów pamięci: ma ono na celu:
-zwiększanie długości słowa przy niezmienionej długości słów; -zwiększanie ilości słów przy niezmienionej ich długości
-łącznie obydwa przypadki. Przy zwiększaniu długości słowa pamięci buduje się szerszą magistralę danych z bitów danych kilku układów scalonych pamięci. Magistralę adresową i sygnały sterujące łączy się wówczas równolegle. Zwiększanie liczby słów pamięci wymaga zwiększenia liczby adresów -liczby bitów szyny adresowej, zwiększenie
długości słowa-liczby linii szyny danych, wzrost liczby i długości słów wiąże się ze wzrostem szerokości magistral adresowych i danych.
23. Metody skracania czasu - przy odczycie kolejnych słow z wiersza wystarczy zmieniać tylko adres kolumny(skraca się czas dostępu bo nie trzeba wprowadzać adresu wiersza). Jest to dostęp do pamięci w trybie stronnicowym. Dostęp w trybie seryjnym polega na odczytaniu/zapisaniu informacji całymi wierszami. W takim przypadku adresy kolejnych kolumn są generowane wewnątrz pamięci. Zmniejszenie czasu dostępu przez podawanie adresu następnego słowa jeszcze podczas realizacji odczytu słowa poprzedniego(adresu potokowego).
24. Na czym polega odświeżanie pamięci - ???????????
25. Porównanie własności pamięci Dram, SDram - 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.
26. Pamięć ROM i jej typy.
ROM - jest to pamięć nieulotna przeznaczona tylko do odczytu. Nie można jej zapisać podczas normalnej pracy systemu. Typy:
- MROM - ich zawartość ustala sie w procesie produkcji przez wykonanie odpowiednich masek. Ich zawartość może być zmieniana.
- PROM - pamięć jednokrotnie programowalna
- EPROM - pamięć wielokrotnie programowalna. Do kasowania zawartości używa sie promieni UV. Kasowanie i programowanie odbywa sie poza systemem.
- EEPROM - pamięć kasowalna i programowalna elektronicznie, bez wypompowanie jej z systemu. Przechowuje sie w niej np. Flash- BIOS.
27. Różnice między specjalizowanym układem cyfrowym a systemem mikroprocesorowym.
W specjalizowanym układzie cyfrowym realizowany jest z góry sposób przetwarzania informacji. Sposób ten zależy tylko od sprzętu. W systemie mikroprocesorowym( układ przetwarzający to procesor) przetwarzanie informacji przez procesor odbywa sie za pomocą elem. Instrukcji( program). Do systemu mikroprocesorowego dostarczamy nie tylko program, ale i dane. Podejście takie ułatwia zmianę sposobu przetw. informacji- wystarczy zmienić tylko program.
28. schemat blokowy układu mikroprocesorowego
- mikroprocesor - : przetwarza informacje, sterują pracą pozostałych elementów systemu.
- zegar - wytwarza przebiegi czasowe niezbędne do pracy µP i systemu.
-sterownik magistral - układ wytwarzający na podstawie informacji z µP sygnały sterujące: pracą układów we/wy, układem pamięci. koprocesorem arytmetycznym.
- pamięć - w pamięci (RAM) przechowywany jest wykonywany w systemie program( oraz dane i wyniki)
BIOS - przechowywany w pamięci ROM. Służy do uruchamiania systemu oraz umożliwia m.in. wprowadzenie do pamięci oper. Innych programów.
- układy WE/WY - ich funkcja polega na pośredniczeniu w wymianie informacji pomiędzy µP, pamięcią a urządzeniami zewnętrznymi.
29. ALU (jednostka arytmetyczno-logiczna) - jest to uniwersalny układ cyfrowy przeznaczony do wykonywania operacji arytmetycznych i logicznych ( dodawanie, odejmowanie, przesuwanie bitów słowa, porównywanie dwóch wartości, iloczyn, suma, itp.). Wyboru operacji dokonuje sie za pomocą sygnałów sterujących. Do zestawu operacji wykonywanych przez ALU należy min:
-dodawanie, -odejmowanie, -przesuwanie bitów słowa w prawo i w lewo, -porównanie(komparacja) wartości 2 słów, -operacje iloczynu i sumy algebr., -negacji; -alternatywy ,itd. Wyboru operacji dokonujemy za pomocą sygnałów sterujących. Każdej operacji odpowiada inny ciąg cyfr binarnych (sygnałów sterujących).
30. Struktura mikroprocesora CPU centralna jednostka przetwarzajacą, zawiera mikroprocesor(zadania przetwarzanie informacji, sterowanie praca pozostałych elementów systemu), zegar systemowy (wytwarza przebiegi czasowe niezbędne do racy mikroprocesora i systemu) , opcjonalnie sterownik magistrali (układ wytwarzający na podstawie inf. z mikroprocesora sygnały sterujące praca układów wejścia i wyjścia układami MEM, koprocesorem) PAMIEC ROM, RAM, pamięć operacyjna RAM przechowywany w niej jest program wykonywany przez system, i wszystkie dane są w nim zawarte wyłączenie komputera wymazuje RAM. Aby system mikrop. Zaczął działać musi być program inicjujący prace systemu BIOS zapisywany w pamięci ROM.. I/O urządzenia wejścia i wyjścia , pośredniczą w wymianie informacji miedzy UP, MEM a środowiskiem zewnętrznym- monitor, klawiatura,…. Potrzeba istnienia wynika z 3 powodów: 1)różne prędkości działania urządzeń 2)różne formaty przekazywanych informacji 3)różne poziomy sygnałów elektrycznych TYPY MAGISRAL: Magistrala danych - służy do przekazywania wyników oraz kodów instrukcji i kierowania, im szybsza tym system wydajniejszy MAGISTRALA ADRESOWA-służy do przesyłania adresów komórek pamięci lub adresów układów we/wy ZESTAW LINI STERUJĄCYCH- służy do sterowania układami współpracującymi z mikroprocesorem..
31. przykładowe rejestry mikroprocesora:
- rejestr rozkazów - zawiera kod aktualnie wykonywanego rozkazu.
- akumulator- zawiera on jeden z operandów operacji i do niego ładowany jest wynik operacji.
- rejestr znaczników (flagowy) - zawiera on dodatkowe informacje o wynikach np. znak przekroczenia zakresu.
- uniwersalne rejestry robocze- mogą np. przechowywać argumenty operacji, wyniki itp.
-PC licznik rozkazów - zawiera adres komórki pamięci, w której jest przechowywany kod rozkazu, który będzie wykonywany, jako następny.
- SP wskaźnik stosu - zawiera adres ostatniej zapełnionej komórki adresu.
32. funkcje stosu: stosem nazywany wyróżniony obszar pamięci zorganizowany według reguł :
- dane zapisywane są na stos do kolejnych komórek przy czym żadnego adresu nie można pominąć
- informacje odczytywane są w odwrotnej kolejności do ich zapisu.
- informacje odczytywane są z ostatniej zapełnionej komórki, a zapisywane do pierwszej wolnej.
33.Magistrale w systemie Mikroprocesorowym magistrala sterująca - służy do sterowania układów współpracujących z µP oraz do sygnalizacji ich terowania, Magistrala danych - służy do przechowywania wyników oraz kodów instrukcji. Jest dwukierunkowa. Magistrala adresowa - przesyła adresy komórek pamięci lub adresów układów we/wy . jest jednokierunkowa.
34. Omów cykl adresowy adresowanie 2 fazy: wraz z opadającym zboczem sygnału RAS, z szyną adresową uzyskuje się adres wiersza, przy opadaniu zbocza CAS uzyskuje się adres kolumny, w ten sposób za pomocą 10 linii adresowych oraz linii RAS, CAS uzyskuje się 20bitowy adres. Adresowanie stopniowe- nie podajemy adresu wiersza tylko kolumnę. Adresowanie potokowe- w trybie seryjnym polega na zapisie i odczycie informacji całymi wierszami, adresy kolejnych kolumn są generowane wewnątrz pamięci. Podczas odczytu słowa już się podaje nowy adres. Synchronizacja działania pamięci z zegara procesora, wykorzystane z pamięci dynamicznej.
35. Tryby adresownia.
- tryb adresowania natychmiastowego - argument rozkazu zawarty jest w kodzie rozkazu, jest znany przy pisaniu programu.
- adresowanie bezpośrednie - kod rozkazu zawiera adres komórki pamięci, w której przechowywany jest argument.
- adresowanie adresowe - w kodzie rozkazu określa sie rejestr w którym przechowywany jest argument.
- adresowanie pośrednie - adres argumentu może zmienić swoje położenie w rejestrach - jest ono wyliczanie przez program.
- adresowanie indeksowe z przemieszczeniem - adres argumentu w pamięci wynika z sumy zawartości rejestru i przesunięcia
umieszczonego programu.
36. Do czego służą i jakie znasz rodzaje wejścia/wyjścia- Pośredniczą one w wymianie informacji pomiędzy procesorem i pamięcią a urządzeniami peryferyjnymi.
- układy we/wy współadresowalne z pamięcią operacyjną - traktuje się je jako zespół rejestrów wybieranych za pomocą adresów (np. karta graficzna - w celu wyświetlenia obrazu jest umieszczony w określonym obszarze pamięci RAM - buforze adresu).
- układu we/wy izolowane - obiekt we/wy wybierany jest sygnałem sterującym. Przestrzeń adresowa układów we/wy i pamięci może sie pokrywać. O wyborze decyduje sygnał sterujący (np. Sterownik dysku IDE).
37. Na czym polega Tryb DMA? -w trybie tym transmisja danych przebiega między układem we/wy a wydzielonym obszarem buforowym pamięci. transmisje nadzoruje sterownik DMA tzn. Nadzoruje on magistrale, generuje wszystkie potrzebne adresy i sygnały sterujące, przesyła dane, mikroprocesor pracuje dalej. Operacje w trybie DMA rozpoczyna się na żądanie urządzenia we/wy przez podanie sygnału HOLD do mikroprocesora. Mikroprocesor: a) zachowuje stan rejestrów - może pracować dalej. b) separuje sie od magistrali c) wysyła sygnał gotowości wyjściem sterującym HLDA do sterowania DMA d) transmisja danych( pojedynczymi słowami, blokowo, na żądanie).
38. Procesory rodziny Intel - porównanie podstawowych własności.
Do rodziny 80x86 należą procesory: 8086, 8088, 80186, 80188, 80286, 80386, 80486, 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.
39. Główne elementy schematu blokowego procesora Pentium.
-magistrale zewnętrzne : 64 bitowa magistrala danych, 32 bitowa magistrala adresowa, 67 lini magistrali sterującej. Zarządza nimi blok sterowania magistralami(BIU)
- część wykonawcza - zawiera dwie jednostki ALU, współpracuje z nimi kilka zestawów rejestrów.
- część kodowania
40. Do czego służą rejestry segmentowe. Rejestr procesora stworzony do przechowywania adresu początkowego obszaru pamięci, w którym umieszczone są rozkazy, dane albo stos programu. Rejestrem segmentowym może być: CS-16 bitowy rejestr segmentu kodu programu, DS-16 bitowy rejestr segmentu danych, SS-16 bitowy rejestr segmentu stosu, ES, FS, GS-16 bitowe rejestry pomocnicze dla danych
41. 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.
42. Co to jest i do czego służy tablica deskryptorów? Jest to tablica odpowiedzialna za przetłumaczenie adresu wirtualnego na rzeczywisty oraz sprawdzenie obecności poszukiwanej informacji w bloku. Tablica ta znajduje sie w pamięci operacyjnej.
43. Różnice między trybem adresowania rzeczywistym, a trybem wirtualnym 8086-????????????
44. Na czym polega praca wielozadaniowa w systemach jednoprocesorowych? Polega na sekwencyjnym wykonaniu pojedynczego zadania. Każde z zadań wykonywanie jest do momentu: - upływu czasu zadania, - żądania zmiany zadania przez użytkownika,
- braku informacji potrzebnej do kontynuowania zadania
45. Cel stosowania oraz sposoby współpracy pamięci cache z mikroprocesorem. Jest to bardzo szybka pamięć statyczna. Potrzeba jej wprowadzenia wynika z niedostosowania do szybkości procesora czasu dostępu do pamięci dynamicznej. Oczywiście w systemie musi być układ sterujący współpracą tej pamięci z pozostałymi elem. Systemu - sterownik pamięci cache. Sterownik ten sprawdza np. czy poszukiwana dane znajduje się w tej pamięci. jeśli tak to mamy tzw. trafienie i następuje wykonanie operacji. Jeśli nie ma trafienia to tracony jest czas na jej odczyt z informacji. Sposoby współpracy: 1. Przy trafieniu magistrala główna nie jest używana - mogą ją używać inni zarządcy. Przy braku trafienia inicjowany jest cykl magistrali głównej z koniecznym oczekiwaniem na informacje. 2.Żądanie informacji z pamięci inicjuje normalny cykl magistrali głównej. Przy trafieniu cykl ten jest zawieszany i informacja jest szybko pobierana z pamięci cache. Przy braku trafienia pobieranie informacji trwa dłużej - kontynuowany jest dalej normalny cykl adresowy.
46. Na czym polega praca potokowa procesora Pentium Praca w tym trybie polega na jednoczesnym wykonywaniu kilku rozkazów. Rozwinięcie ideii 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, który zawiera definicje danego typu obiektowego.
I/O- układy we/wy służą wymianie informacji pomiędzy procesorem pamięcią i urządzeniami zewnętrznymi, potrzeba pośrednictwa
wynika z tego ze urządzenia działają z rożna szybkością trzeba to dopasować, informacje przesyłane nie są jednorodne, co chwila inny mikroprocesor działa wiec rożne napięcie na wyjściu trzeba ustawić tak aby urządzenie działało. DB- magistrala Tego typu pole i metodę nazywamy polami i metodami prywatnymi. Użycie po sekcji z dyrektywa private, dyrektywy, public'' powoduje anulowanie ograniczenia zakresu ważności dla dalszych połączeń 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
47. Wyjaśnij pojęcia: FSB, Fcore, DDR.
Front Side Bus (FSB) jest występującą w wielu architekturach komputerów PC magistralą łączącą CPU z kontrolerem pamięci (najczęściej zlokalizowanym w mostku północnym). Składa się ona z linii adresowych, linii danych oraz linii sterowania. Parametry FSB (liczba linii poszczególnych typów, częstotliwość) zależne są od zastosowanego procesora.
Fcore - częstotliwość wewnętrzna procesora, jest kilkakrotnie większa od częstotliwość zewnętrznej( wynika ona z mnożnika ustawionego np. za pomocą zworek)
DDR - rodzaj pamięci RAM w którym zmniejszenie czasu dostępu wynika z podwojenia szybkości transmisji danych dla ządaniej częstotliwości taktowania. Związanie jest to z taktowaniem pamięci SDRAM narastającym i opadającym zboczem imp. Zegara systemowego. W jednym takcie zegara przechowywane są 2 słowa danych.
48. Złożoność algorytmu (czasowa) to zależność pomiędzy rozmiarem danych wejściowych, a liczbą operacji elementarnych, wykonywanych w trakcie przebiegu algorytmu (podawana jako funkcja rozmiaru danych, których wartości podają liczbę operacji). W praktyce złożoność czasowa algorytmu decyduje o przydatności algorytmów.
49. Algorytm - zbiór reguł i poleceń rozwiązywania problemu/zadania. W każdym algorytmie można wyróżnić 2 części: opis danych, na których algorytm działa i opis czynności wykonywanych na tych danych. Program źródłowy (napisanym w języku programowania) jest tłumaczony na program binarny. Tłumaczenie - kompilacja polega na zastąpieniu operacji języka programowania na operacje kodu maszynowego. W algorytmie iteracyjnym wynik uzyskuje się poprzez wykonanie operacji określoną ilość razy. Złożoność takiego algorytmu jest liniowa, czyli proporcjonalna do n. Algorytm rekurencyjny to taki w którym następuje wywołanie samego siebie. Sama rekurencja polega na wywołaniu z danego algorytmu tego samego algorytmu. Wywołania te są w sobie zagnieżdżone i w każdym z nich są inne argumenty. Złożoność algorytmu rekurencyjnego jest ok. 2^n. W przeciwieństwie do iteracyjnego, w algorytmie rekurencyjnym obliczone wcześniej wyniki służą bezpośrednio do obliczenia kolejnych, dzięki czemu nie ma wielokrotnego powtarzania tych samych obliczeń.
50. NWD: Szukamy 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
Czy n jest l. 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
51. Instrukcje:
Przypisanie - 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.
int s;
int x;
s=x+3;
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 (wyrażenie) instrukcja else instrukcja2
przykład:
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”;
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.
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.
F or (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 ;
}
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 nastę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. 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. 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. 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. 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:
#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
Dyrektywy preprocesora
Dyrektywy preprocesora rozpoczynają się znakiem # i mogą wystąpić w prawie dowolnym miejscu kodu źródłowego. Dyrektywy #include, których początkujący programista najczęściej używa, występują jednak z reguły na początku pliku - tak jak w przedstawionym przykładzie.
Obszar deklaracji i/lub definicji
Obszar ten, zaznaczony w przykładzie, jest wygodnym miejscem na deklarowanie lub definiowanie własnych funkcji, typów danych, lub zmiennych globalnych. Tych ostatnich należy jednak bardzo unikać, ze względu na możliwość wystąpienia późniejszych trudności przy wykorzystaniu pisanego programu jako części innego.
Możliwe jest również umieszczanie definicji za funkcją main, jednakże wtedy definiowane funkcje muszą być zadeklarowane przed miejscem ich użycia, czyli np. przed funkcją main.
Nagłówek funkcji main
Definiuje funkcję o nazwie 'main'. Nazwa ta jest zastrzeżona, ponieważ funkcja main jest tożsama z programem, jako takim, i wywoływana jest przez system operacyjny, w chwili uruchomienia naszego skompilowanego programu. Możliwe są inne definicje nagłówka - tu przedstawiona została najbardziej podstawowa.
Początek i koniec instrukcji złożonej
Nawiasy { oraz } oznaczają odpowiednio początek i koniec tzw. instrukcji złożonej. Instrukcja złożona stanowi blok instrukcji, objęty właśnie tymi nawiasami. Przy definiowaniu jakiejkolwiek funkcji (nie tylko main) pierwszym widocznym znakiem, jaki musi wystąpić po nagłówku funkcji, jest właśnie nawias {. Widoczny znak, to znak inny, niż spacja, tabulator, czy znak końca linii.
Instrukcje
Instrukcje proste, to instrukcje nie będące instrukcjami złożonymi - patrz wyżej. W naszym przykładzie występują dwie instrukcje proste:
printf("Czesc!\n");
oraz
return 0;
Pierwsza z nich powoduje wypisanie na konsoli tekstowej programu tekstu, który znajduje się w cudzysłowach, druga natomiast powoduje zakończenie działania funkcji main (czyli, jak już wiemy, naszego programu), ze zwróceniem do systemu operacyjnego kodu powrotu o wartości 0.
Widać, że każda instrukcja prosta musi być zakończona średnikiem „ ; ”
57. 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. 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. 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. 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. 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. 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.
63. Co pojawi się na ekranie monitora w wyniku wykonania fragmentu programu…………
64. 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
66. 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. 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 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. 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. 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. 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.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. 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;
}