Opracowanie part 1
*Ada jest nieczuła na małe/duże znaki.
* symbol „ ` „ służy do wywoływania atrybutów danego obiektu
A: Integer := Integer’image(x) -> używane w celu wyświetlenia wartości Typu in ( zmienna)
Co w przypadku nowych typów?
INT X
TYPE INT IS NEW …
W tej sytuacji
Int’image(x) -> będzie działać
Integer’image(x) -> Nie będzie
Jeśli użyjemy subtype ze Int jest subtypem Integera to obydwa wywołania atrybutu są dopuszczalne.
Operaory ady
:= podstaw
= równe
/= Nie równe
Mod reszta dzielenia
Rem ?
Abs ?
Sposoby deklaracji
I : Integer;
A,b,c, :Integer
X: Integer:=0;
K,l:Integer:=1; ( deklaruje kilka zmiennych wartością 1);
Constant nie Const jak w c
X:constant Integer :=7
Nie musimy deklarować typu, kompilator dobierze wtedy najbardziej odpowiedni typ do reprezentacji wartości
X:constant:=7
Type INT is new Integer;
Int jest teraz nową formą zapisu Integer ale operacje na różnych nazwach jak INT , Integer wywalają błąd, nie można zrobić a:=b;
---------FUNKCJE SĄ OSOBNE. Nie należy walić Type Int, a pod spodem Subtype----------
Subtype INT is Integer
Jak wyżej, tylko teraz można wykonywać operację
Jedną z najważniejszych cech SUBTYPE jest możliwość ograniczania rodzica co do zakresu dolnego/górnego dla wartości INT. ( cokolwiek to znaczy )
Ada nie Ma Unsigned INT robi się to typem „range” samemu
Typ modularnym – Typ o podanym jakimś zakresie maxymalnym, cyklicznym czyli coś jak licznik, osiąga wartość i się przekręca, nie może wystąpić liczba spoza zakresu, mniejsza czy to wyższa.
a)Type BYTE is mod 256
Max to 255
Byte:=-250 wynik to 6
Byte:=-256 wali error ale jeśli podstawimy Byte:=0 to nagle jest ok:
________________________________________________________________ <- dlaczego
b) type BYTE is mod 2**8 <- The fuck is this?
Typ Character I Typ Boolean są zdefniowane domyślnie w pakiecie standard. ‘ ‘
STRINGI ” ”
Nie wolno używać ( wali error) Stringa bez podania długości w deklaracjach czyli
Shit:String; NIE
String(1..2) ok
Najniższa wartość musi być minimum 1
Definiowanie zakresu string to 1..4 itp.
Jeśli damy String 1..20 to słowo które później przypiszemy MUSI I NIE MA ŻE BOLI mieć dokładnie tyle znaków inaczej wali error.
Stringa można dać od razu w : Put_Line(zmienna);
Floaty
Są dwa typy floatów Float i Fixed
::FLoat::
a)Type Floating is new Float
MUSI być float, jeśli damy 5 to wali error
Jeśli przypiszemy na start Float= 4.2 a później gdzieś z dzielenia wyjdzie, 4/2=1 wali ERROR
Normalnie wyświetla 6 znaków liczbą od cyfry przed kropką
b)type zmienna is digits 5
pozwala sterować ilością wyświetlanych znaków po przecinku ( max 18)
c) Tyczy się obydwu zapisów
Cyfra z przodu może mieć max 9. Jeśli damy np: 1.23 + 10= 11.2 to przesunie to do 1.123
Używanie floata a później przypisanie wyników floata do np. type kropki is digit 3
Wali błąd
::FIXED:: Nie wiem, doczytać, coś z dokładnością, mam w notatkach
Enumeracja
Deklarowanie zakresu zmiennej za pomocą range
Type Hours is new Integer range 1..13; - z podaniem typu
Type Hour is range 2..56; - bez podania typu
Można robić typ
Type Hours is new range 0..23;
I do niego podtyp
Subtype Minutes is Hours range 1..12;
Sprawdzić dlaczego są różne zapisy Hours, czym sie to różni, co to robi
Teraz MINUTY są POTOMKIEM Godzin, Potomek nie może mieć zakresu większego niż rodzic
Inaczej można też zapisać zakres słowami:
Type days is (piątek,sobota,niedziela,poniedziałek);
I do tego znowu tez dorobić sobie podtyp
Subtype weekend is days range piątek ... niedziela ;
Atrybuty dla enumeracji:
Succ- zwraca wartość KOLEJNĄ co do tej którą podaliśmy, nie może wyjścia poza zakres, tj. nie przekręca się. Niedziela(succ) error
Pred- j.w tylko POPRZEDNIĄ, i to samo, Poniedziałek (pred) error
Val-Zwraca wartość enumeracji o danym numerze jak VAL(2) Wtorek, przy czym Val(0)=Val(1)
Pos- zwraca pozycje danego atrybutu, POS(Środa) = 3
First-Zwraca pierwsza wartość zakresu
Last-Zwraca ostatni warosc zakresu
Length- Zwraca liczbę obiektów w zakresie ( dla 0..100 zwroci 101)
Range- Zwraca wartość która mu daliśmy… wtf?
*dzień’succ(wtorek)=środa
*dzień’pred(wtorek)=poniedziałek
*dzień’val(2)=wtorek
*dzień’first=poniedziałek
*dzień’last=niedziela
*dzień’Succ(dzien’pred(wtorek))=wtorek;
TABLICE
Znaków:
array(1..30) of Characters
String(1..30)
Intów:
Array(0..4) of Integer;
Wymiarowe:
Array(0..5) of array (0..2) of Integer
Array(0..5,0..2) of Integer
Typ tablicowy
Type Name_type is array (1..30) of Character;
Definiowanie elementów
Tablica(2):=1;
Tablica(0,3):=2;
Jakaś notka , że a:=b przenosi elementy b do a
Ustalanie zakresu NIE zerowego, ustalanie indexowania od zakresu niższego do wyższego
Tablica(-10..10) of Integer
Normalnie tablice są indexowane liczbowo typu INT więc nie trzeba dawać zakresu
Odnoszenie się do wartości z tablicy w np.: put_line
Put_Line("[2]="&Integer'image(tablica(2)));
Wpisywanie wartości tablicy do zmiennej:
x:=tablica(3);
Tablica z zakresem innym niż typu INT jest definiowana:
Hours_Worked: array(All_days range Monday..Friday) gdzie All Days to typ a range to zakres z tego typu
WEKTORY Nie wiem o co chodzi, doczytać to.-----------------------
Pierwszy i ostatni element tabicy ( do wykonywania pętli po tablicy )
- Jeden wymiar
Example:array(1..10) of Integer;
For I in Example’first.. Example’last loop
For I in Example’range loop
-Wiele wymiarów
Example(wymiar)’atrybut
Inicjalizacja danych tablicy
Init:array(0..3)of Integer:=(0..3 =>1); Przypisze 1 do wszystkich
Init: array (0..3) of Integer :=(0=>1,others=>0); Przypisze 1 do elementu zero a reszcie 0.
Cięcie tablic, przypisywanie fragment jednej do drugiej
Obydwa fragmenty muszą być tego samego typu, wymiarowości i rozmiaru (wykrojów)
Large: array (0..100) of Integer;
Small:array (0..3) of Integer
-przenoszenie fragmentu jednego taba do drugiego
Small(0..3):=Large(10..13);
-zamiana połówek tablicy miejscami
Large:=Large(51..100)&Large(1..50);
Rekordy są w jego wykładach
W adzie ZMIENNE muszą być deklarowane w bloku deklaracji zanim zacznie się wykonanie
W If można używać ELSEIF ile chcemy
If wyrażenie then czynność
Elsif wyrażenie then czynność
Endif;
Switch musi mieć wyrażenie decyzyjne stałego skalarnego typu ( int np.)
Switch ady nie wymaga po Cas-ie break; gdyż nowy case; jest breakiem dla funkcji
case value is
when 1..4 => value_ok:=1;
when 5|6|7=> null;
end case
Pętle ady mają ciało loop statement end loop;
While w adzie jest jak w C
While expression loop
Statment
End loop;
W adzie nie ma odpowiednika DO WHILE
For w adzie jest trochę inny od C ale pozwala dokonywać iteracji na zakresie
For zmienna in Typ range loop
Statement
End loop;
-zmienna istnieje TYLKO dla tego for a, jeśli nie podamy typu tej zmiennej to sama dobierze sobie typ najlepiej reprezentujący wartości Range.
?? W Online MUSI być, albo źle pisze.
-Pętla wsteczne od 10 do 1
For i in reverse 1..10 loop
Null; // Dla funkcji pustych MUSI BYĆ null;
End loop;
W c jest Break; np dla switcha , w adzie Exit; ma własności breaka
-Można z tego zrobić DO WHILE
Loop
Statement
Exit when expressionl
End loop;
Exit NIE przerywa pętli nadrzędnych typu While w pętli while będącej w while. (3x)
Ale np. IF w petli a w nim EXIT przerwie petle zawierajaca If-a
(Break and Continue 5. Wtf? )
Funkcje
Function nazwa(parametry) return typ_zwracany is
Deklaracje
Begin
Kondycje
End nazwa
Funkcje umieszcza sie w procedurze, PRZED BEGIN, Później wywołuje się ją w BEGIN ale Trzeba coś zrobić z wyjściem funkcji bo inaczej jebie błędy bezsensowne. Czyli robimy np.:
c:=test(a,b);
Ale podanie w funkcji np. 3 zmiennych i zwrócenie 3iej która miałaby być wynikową też wali błąd.
Procedura w adzie jest odpowiednikiem VOIDA w Cpp gdzie Procedura nie zwracan wartości.
Procedure można umiescic tylko 1 w pliku. Ale w procedurze można umiescic inna funkcje PRZED BEGIN procedury;