INFORMATYKA WYKŁAD
KOD BINARNY PROSTY
27 (128) | 26 (64) | 25 (32) | 24 (16) | 23 (8) | 22 (4) | 21 (2) | 20 (1) |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Najmniejszą liczbą całkowitą przedstawioną za pomocą kodu binarnego jest 0, największa zależy od długości stosowanego ciągu binarnego, w ogólności dla n-bitowego ciągu mamy 2n − 1
74110= 7•102 + 4 • 101 + 1•100
10112 = 1• 23 + 0 •22 + 1•21 + 1•20
KOD UZUPEŁNIENIOWY
Wynik odejmowania i dodawania wartości uzupełnionej są identyczne po odrzuceniu przeniesienia z pozycji najbardziej znaczącej.
Kod uzupełnieniowy jest powszechnie wykorzystywany w operacjach arytmetycznych gdyż urządzenie sumujące może być jednocześnie odejmującym. Z punktu widzenia zależności podzespołów jednostek arytmetycznych jest to poważną zaletą.
ZAPIS ZMIENNOPOZYCYJNY
Liczba zmiennopozycyjna składa się z dwóch części: ułamka M, zwanego mantysą, liczby całkowitej C, zwanej cechą. Dziesiętny odpowiednik takiej liczby wynosi W(10) = M(10) • 2C(10). Format ten umożliwia przedstawienie liczb dziesiętnych w zakresie:
−22L − 1 < X(10) < 22L − 1 – 1
mantysa (ułamek) zajmuje 3 bajty, cecha(liczba całkowita) zajmuje 1 bajt (1bajt = 8 bitów) -> łącznie 4 bajty
Dla jednobitowej cechy (L=8) otrzymamy mnożnik cechę 2127 ≈ 1038 (typ single).
Zakres reprezentowanych wartości jest bardzo duży. Odbywa się to kosztem zmniejszenia dokładności przedstawienia liczy, która jest uzależniona od okrojonej przez bity cechy, długości mantysy. Dodatkowym problemem są braki reprezentacji.
Przepełnieniem nazywa się przekroczenie przez wynik operacji arytmetycznej zakresu wartości reprezentowanej przez ciąg binarny o zadanej długości i z użyciem określonego kodu.
N – pozycja w ciągu bitowym | zakres MIN | zakres MAX | TYP |
---|---|---|---|
8 | 0 | 255 | byte |
16 | 0 | 65535 | word |
32 | 0 | 232 – 1 | longword |
8 | -128 | 127 | shortint |
16 | -32768 | 32767 | smallint |
32 | −231 |
231 - 1 | integer |
ZDJĘCIE 1
var – deklaracja zmiennych
procedure
var x,y,z:single;
Begin
x:=strtofloat(Edit1.Text);
y:=strtofloat(Edit2.Text);
z:=x+y;
Panel1.Caption:=floattostr(z);
end;
ADRES FIZYCZNY
zapisujemy w postaci sześciu par cyfr szesnastkowych oddzielonych myślnikami:
03-ab-01-00-04-fa
binarnie to:
00000011-10101011-00000001-00000000-00000100-11111010
dziesiętnie to:
3-171-1-0-4-250
kod szesnastkowy
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111
ADRES SIECIOWY
zapisujemy w postaci czterech liczb oddzielonych kropkami:
153.122.14.23
binarnie jest to:
10011001.01111010.00001110.00010111
szesnastkowo:
99.7a.0e.17
Podstawy:
Każdy element użyty w programie musi mieć nazwę (której pierwszym znakiem musi być litera).
Niektóre nazwy generowane są przez środowisko. Modyfikacja takich nazw jest możliwa tylko za pomocą inspektora obiektów.
Dla użytkowanych elementów miejsce w pamięci rezerwujemy poprzez deklarację (wtedy możemy też określić wartość początkową). Wyjątkiem są obiekty, które do utworzenia wymagają wywołania konstruktora klasy.
Deklaracja określa typ wartości i ewentualnie wartość początkową.
Typ elementu definiuje:
- sposób reprezentacji wartości; pośrednio też zakres wartości;
- operacje jakie można na tych wartościach realizować;
Klasa to „projekt tworzenia” obiektów.
Obiekt to struktura skonstruowana z zastosowaniem konstruktora konkretnego „projektu”.
Podstawy – budowa programu:
Tworzony kod programu to tylko część aplikacji wynikowej.
Składowymi całości są moduły zadeklarowane w sekcji USES.
- każdy tworzony program zawiera ograniczoną listę podstawowych i niezbędnych modułów;
Jeżeli trzeba skorzystać z gotowych procedur opracowanych przez innych, należy umieścić nazwę odpowiedniego modułu we wspomnianej sekcji.
Elementy występujące w interfejsach wymienionych modułów nie powinny być ponownie deklarowane.
Ponowna deklaracja „przykrywa” oryginał.
Typy napisowe
TYP | NAJWIĘKSZA DŁUGOŚĆ | WYKORZYSTYWANY DO |
---|---|---|
ShortString | 255 znaków | zachowania kompatybilności z poprzednimi środowiskami |
AnsiString (string) | ~ 2^31 znaków | zapisu 8 bitowych znaków ANSI |
WideString | ~2^30 znaków | zapisu znaków z użyciem Unikodu |
var nazwisko, imię: shortstring;
begin
nazwisko:=’Kowalski’;
imię:=’Jan’;
nazwisko:=’nazwisko –‘ + nazwisko + ‘imię –‘ + imię;
!!! coś zamkniętego w apostrofy to STAŁA ALFANUMERYCZNA np. ‘nazwisko’
OPERATORY
Wszystkie operatory można podzielić na pięć kategorii; stosownie do kolejności realizowanych operacji są to:
- JEDNOARGUMENTOWY OPERATOR ZMIANY ZNAKU;
- JEDNOARGUMENTOWY OPERATOR NOT;
- OPERATOR TYPU MNOŻENIE: *, /, div, mod, AND, shl ,shr;
- OPERATOR TYPU DODAWANIE: +, -, OR, XOR;
- OPERATOR RELACJI: =, <>, >=, >, <=, <, IN;
ZDJĘCIE 2
INSTRUKCJA PODSTAWIANIA
Służy do nadania wartości zmiennej bądź właściwości. Podstawienie możliwe jest tylko w przypadku zgodności typów elementu określonego (po lewe stronie operatora podstawienia :=) i typy wartości wyrażenia stojącego po prawej stronie. Odstępstwem od tej reguły jest przypisanie zmiennej rzeczywistej wartości typu całkowitego. Zgodność typów można osiągnąć poprzez wykorzystywanie jednej z funkcji zmiany reprezentacji lub poprzez operacji rzutowania.
INSTRUKCJA WARUNKOWA
Specyfikuje operacje, które mogą zostać wykonane w przypadku spełnienia pewnego warunku.
if warunek then instrukcja;
Możliwa jest również specyfikacja operacji dla nieprawdziwości warunku w konstrukcji.
if warunek then instrukcja_dla prawdy else instrukcja_dla fałszu;
Należy zwrócić uwagę na brak średnika przed słowem else.
Słowo warunek oznacza wyrażenie, którego wynik jest typu boolowskiego. Przykładami poprawnych instrukcji warunkowych są:
1. if x>y then x:=x+3;
2. if znaleziono then zmien(p,q);
3. if (suma>2) and (suma<20) then
begin
suma:=0.9*suma;
x:=11
end;
NAWIASY PROGRAMOWE
Pod pojęciem instrukcja (instrukcja_dla_...) rozumie się pojedynczą operację, lecz również dowolną ich ilość zamkniętą w nawiasy programowe begin end;
Przykład.
Jeżeli x jest większe od y to zwiększ Z o 10 a W zmniejsz o 2, w przypadku przeciwnym zmniejsz Z o 10 a W zwiększ o 2.
if x>ythen
begin Z:Z+10; W:=W-2 end
end
begin Z:Z-10; W:=W+2 end;
INSTRUKCJA FOR
Na przykład:
suma:=0;
for i:=2 to 12 do
if i AND 1=1 then suma:suma+i;
Instrukcja ta powoduje, że całkowita zmienna sterująca przyjmuje kolejne wartości z przedziału wyznaczonego przez wartość początkową i końcową. Dla każdej nowej wartości tej zmiennej realizowana jest instrukcja umieszczona po słowie do.
Na przykład:
suma:=0; iloczyn:=1;
for i:=1 to 10 do
begin
suma:=suma+i;
iloczyn:=iloczyn* i div 2
end;
Instrukcja ta powoduje, że zmienna sterująca, przyjmuje kolejne wartości z przedziału <1,10>. Dla każdej wartości tej zmiennej realizowane są dwie instrukcje umieszczone po słowie do.
INSTRUKCJA ITERACYJNA FOR (inna postać)
Przykład konstrukcji operującej na elementach zbioru:
for element in Zbior do … ;
for a in memo1.lines do … ;
Formuła, która sumuje wszystkie wartości z komponentu (przy wykorzystaniu komponentu Memo)
procedure TForm1.Panel1Click…
var ELEMENT: string; suma: integer;
Begin
suma:=0;
for ELEMENT in Memo1.lines do
suma:= suma+ strtoint(ELEMENT);
Panel1.Caption:=’suma równa’ = inttostr(suma);
TABLICA jest:
uporządkowaną kolekcją danych określonego typu. Każdy element posiada ściśle określoną pozycję w ramach kolekcji. Popularnie o takich zbiorach danych mówi się jak o tablicach lub macierzach. Tablice mogą być jedno-, dwu- lub wielowymiarowe. Liczba wymiarów może być dowolna.
Deklaracja tablicy:
var nazwa: array[zakres_wskaźników] of typ_elementu;
Tablice – wskaźniki:
Zakres wskaźników okesla rozmiar tablicy oraz identyfikatory kolejnych elementów i najczęściej występuje w postaci dolny_wskaźnik.. górna_wskaźnik. Gdzie dolny_wskaźnik oznacza indeks pierwszego a górny_wskaźnik ostatniego elementu w pewnym wymiarze. Indeksy muszą być podane jako stałe.
np.
var tab.:array[1..5] of smallint;
deklaruje pięcioelementową tablicę, w której pierwszy wyraz ma numer 1 a ostatni 5.
W tablicach wielowymiarowych liczba zakresów wskaźników oddzielonych od sieba przecinkami wskazuje na wymiary.
Deklaracja:
var
mojainnatab:
array[1..10,-1..1] of
integer;
nakazuje zarezerwować miesce na dziesięciowierszową i trójkolumnową macierz, w której pierwszy wyraz ma nr 1 a pierwsza kolumna nr -1.
CIĄG ZNAKOWY
Specjalnym typem tablicowym jest ciąg znakowy zwany stringiem. Elementami takiego ciągu są znaki.
Deklaracja:
var napis: shortstring;
begin napis:= ’ALA MA KOTA’
rezerwuje miejsce na ciąg znaków złozony z 11 elementów. Pierwszy znak zawsze posiada numer 1.
Kody ALFANUMERYCZNE (wszystkie teksty) – kod ASCII lub UNICODE.
Zdjęcie 3
PROCEDURY I FUNKCJI
Stanowią podstawową konstrukcję programistyczną umożliwiającą modularyzację programu. Programy komputerowy mogą mieć tysiące wierszy kodu. Konieczne staje się wyodrębnienie fragmentów kodu stanowiących logiczną całość.
FUKNKCJA
Funkcja to procedura, która poza wykonaniem kodu oblicza pewną wartość – wynik funkcji – nadawany w trakcie wykonania jej identyfikatorowi, tak jak zmiennej.
Nagłówek procedury
procedure nazwa_procedury
(lista_parametrów)
przy czym:
nazwa_procedury to identyfikator utworzony z ciągu znaków i cyfr, pierwsza musi być litera;
lista_parametrów zawiera specyfikację parametrów formalnych składających się z grup zawierających nazwy zmiennych i ich typy. Poszczególne grupy parametrów oddziela się średnikiem;
Nagłówek funkcji
powinien być zgodny ze schematem:
function nazwa_funkcji
(lista_parametrów): typ_wyniku;
Przykład poprawnego nagłówka procedury i funkcji:
procedure zmienna (var x, y: integer);
function szukanie (x:real):real;
Nagłówek metody (procedury, funkcji)
skrojone z pewną klasą
procedure nazwa_klasy, nazwa_procedury
(lista_parametrów)
function nazwa_klasy, nazwa_funkcji
(lista parametrów): typ_wyniku;
LISTA MOŻE BYĆ PUSTA
CHARAKTERYSTYCZNA JEST SPECYFIKACJA TYPU ZWRACANEJ WARTOŚCI
Przykład poprawnych nagłówków funkcji i procedury (metod):
function Topendialog.execute: boolean;
procedury Tstringlist.sort;
W implementacji metody pojawia się nazwa klasy.
Definicja metody wymaga wskazania klasy formy.
Metody związane są z klasami, deklaracja metody ma miejsce w ramach definicji klasy. Procedury a także funkcje, które mają być traktowane w tradycyjny sposób należy deklarować poza definicjami klasy.
Implementacja metody wymaga wskazania klasy. Wywołanie zaś metody wiąże się z koniecznością wskazania obiektu, do którego metoda należy. Metody są ściśle związane z konkretnymi strukturami, instancjami zbudowanymi w oparciu o zdefiniowane klasy.
Parametry procedury lub funkcji
Można przekazywać przez wartość, przez wskazanie (adres) oraz przez stałą. Sposób zależy od deklaracji parametrów formalnych. Zastosowania słowa VAR określa adres jako mechanizm odwoływania się do wartości. Zmiany dokonane w procedurze na parametrach wskazywanych są widoczne w bloku wywołującym.
Parametrami aktualnymi w takim przypadku mogą być elementy posiadające adres. Wyrażenie można stosować przy przekazywaniu parametrów przez wartość.
Zastosowanie słowa const oznacza wykorzystanie stałych do przekazywania parametrów wyłącznie typu wejściowego.
Przekazywanie parametrów przez wartość
Nagłówek procedury – w deklaracji parametrów formalnych NIE MA słowa VAR.
np.
procedure moja(x: integer);
wywołanie procedury – przykłady:
moja(45 div suma);
moja(15);
Parametrem aktualnym jest dowolne wyrażenie zwracające wynik stosowanego typu.
Zmiany dokonywane na wartości parametru nie widoczne są w bloku wywołującym.
Przekazywanie parametrów przez adres
Nagłówek procedury – w deklaracji parametrów formalnych występuje słowo kluczowe VAR.
np.
procedure inna(var param: integer);
Wywołanie procedury – przykłady:
innap(suma);
inna(xxy);
niepoprawnie: inna(45);
Parametrem aktualnym może być tylko element (zmienna) stosowanego typu.
Wyrażenie nie jest dopuszczalne.
Zmiany dokonane na wartości parametru są widoczne w bloku wywołującym.
PROCEDURA PODSTAWIANIA WARTOŚCI
procedure zmien(var x, y: integer);
var p: integer;
begin
p:= x; x:=y; y:=p
end;
PRZECIĄŻENIE FUNKCJI I PROCEDUR
W tym samym modelu można zdeklarować procedury lub funkcje o identycznych nazwach lecz o różnych listach patametrów.
function podziel(x,y: real): real; overload;
begin
result:= x/y;
end;
function podziel(x,y: integer): integer; overload;
begin
result:= x div y;
end;
Poprzednie deklaracje tworzą dwie funkcje o nazwie podziel lecz o różnych zbiorach parametrów formalnych. W momencie wywołania kompilator na podstawie parametrów aktualnych określa, który kod będzie uaktywniony.
np.
podziel(6.0,3.0)
wywoła pierwszą funkcję gdyż argumenty wywołania są rzeczywiste.
Wykorzystanie metody – funkcji
Przykładem nich będzie konstrukcja warunkowa:
if opendialog.execute then … ;
Metoda o nazwie EXECUTE, która jest funkcją, obiektu opendialog wyświetla okno wyboru plików i zwraca wartość boolowską true wtedy kiedy użytkownik wybrał potrzebną mu pozycję i nacisnął Otwórz. Funkcja zwraca wartość false gdy zrezygnowano z wyboru, naciskają przycisk Anuluj lub zamykając okno przy pomocy przycisku systemowego z ikoną X. Jako funkcje zaimplementowano większość odwołań systemowych. Zwracana wartość najczęściej pozwala na identyfikację przyczyn niepowodzenia.
Klasa Tmojaklasa
demonstracja wykorzystania koncepcji programowania obiektowego
przykłady klasy rozszerzonej funkcjonalność klasy bazowej Tstringlist w zakresie możliwości wyboru porządkowania alfabetycznego (rosnącego) i malejącego.
definicja metody porządkuj
procedure Tmojaklasa.porzadkuj(x:boolean);
var i,k,kk: integer; pomocnicza: string;
begin
self.sort; exit
end
else
begin
self.sort; k:=self.count-1;kk:=self.count
div 2
for i:=0to kk do
begin
pomocnicza:=self.strings[i];
self.strings[i]:=self.strings[k-i];
self.strings[k-i]:=pomocnicza;
end end end;
definicja klasy
type
Tmojaklasa=class(Tstringlist)
procedure porządkuj (x:boolean);
end;
konstrukcja obiektu i sortowanie
procedure TForm1.Button1.Click(Sender:TObject);
var lista: Tmojaklasa;
begin
if not opendialog1.execute then exit;
memo1.lines.LoadFromFile(opendialog1.FileName);
lista:=Tmojaklasa.Create;
lista.Assign(memo1.lines);
lista,porzadkuj(checkbox1.checked);
memo1.lines.Assign(lista);
if sevedialog1.execute then
memo1.lines.SaveToFile(savedialog1.FileName);
end;
W pewnym module zdefiniowano klasę:
type Tklasa = class(Tbaza)
x: integer;
procedure nowa(x: integer): integer;
end; …
Składowanie tej klasy o nazwie nowa to:
nieprawidłowa jest metoda implementowana jako procedura, procedura NIE zwraca wyniku