3. Duomenų tipai. Kintamųjų atributai. Kintamųjų skaitiniai tipai. 3.1 Duomenų tipų sąvoka programavimo kalbose Programavimo kalbose vartojami įvairūs duomenys. Pagal savybes jie jungiami į aibes arba klases. Duomenų skirstymo pagrindas programavimo kalbose yra sąvoka – duomenų tipas. Duomenų tipas Duomenų tipas – tai aibė (klasė) objektų, turinčių savo savybes ir operacijas, kurias su tais objektais galima atlikti. Kiekvienas duomenų tipas siejasi su atitinkamos aibės vardu. Pvz., sąvoka „namas“ apibrėžia aibę patalpų, kuriose gali gyventi žmogus, o sąvoka „automobilis“ apibrėžia aibę objektų, su kuriais žmogus gali judėti. Sąvoka gali apibrėžti daug objektų, vieną objektą arba tuščią aibę. Pvz., karalius arba valdovė šachmatuose egzistuoja pavieniui. Bet karaliaus arba valdovės sąvokų apibrėžime svarbu ne tai, kaip atrodo šios figūros šachmatų lentoje, o tai, kokias operacijas jos gali atlikti. Todėl reikia žinoti, kad duomenų tipas apibrėžia ne tik pačius duomenis, bet ir operacijas, kurias su tais duomenimis galima atlikti. Pvz., sveikieji skaičiai priklauso sveikųjų skaičių tipui; su jais galima atlikti šias operacijas: „daugyba“,„sudėtis“,„atimtis“. Šių operacijų rezultatas – sveikasis skaičius. Be to, „dalybos “operacijos rezultatas – realusis skaičius. Duomenys, kurie gali įgyti tik dvi logines reikšmes – True (Tiesa) arba False (Melas), priklauso loginiam tipui. Su jais galima atlikti logines operacijas. Duomenų tipai bei jų struktūrinimo būdai įdiegti į programavimo praktiką kartu su programavimo kalbomis. Galima pasakyti, kad tipų sąvoka atspindi tris veiksnius: žmogaus poreikį, programavimo kalbą ir kompiuterį. Programavimo kalbos tikslas – suderinti dideles kompiuterio galimybes apdoroti skaitinę informaciją su įvairia žmogaus reikme. Todėl į programavimo kalbas įtraukiami tokie duomenų tipai, kuriais žmogus gali patogiai vaizduoti duomenis programoje, ir vėliau juos apdoroti kompiuteriu. 3.2 Kas keičiasi kintamuosiuose? Žmogus, stebėdamas realų pasaulį ir spręsdamas aktualius uždavinius, parenka įvairių tipų duomenis. Registruoja juos kaip skaitinę arba tekstinę informaciją, kaip piešinius arba kitais būdais. Pagal duomenis žmogus kuria žinias – abstrakčiuosius duomenis (tai yra žmogaus proto abstrakcijas apie duomenis, jų prasmę, naudą ir sąryšius). Todėl sprendžiant uždavinius kompiuteriais, taip pat tenka vartoti įvairius abstrakčiuosius duomenis, kurie pasižymi skirtingomis savybėmis. Mes jau minėjome, kad programuotojas dirba su atminties ląstelėmis, naudoja kintamuosius. Bet kintamasis – tai ne abstrakcija, o reali atminties sritis, kurioje yra saugomi duomenis. Kintamajam išskirta atminties sritis turi unikalų vardą, pagal kurį programa gauna priėjimą prie jo reikšmės. Kas keičiasi kintamuosiuose? Vienareikšmiškai galime teigti, kad kintamuosiuose keičiasi duomenys. Bet mes dar karta pabrėžiame, kad kintamieji tai fiziniai objektai – realieji atminties ląstelės. Šį momentą reikia gerai pajusti. Kompiuterio atmintį patogu įsivaizduoti kaip daugybę abstrakčių (ne fizinių) ląstelių. Šiuolaikinių kompiuterių ląstelės dydis – baitas. Toks dydis yra per mažas saugoti daugybei programos kintamųjų reikšmių. Susitarkime, kad abstrakcinė ląstelė turi dydį, kurio užtenka saugoti kintamųjų reikšmių. Todėl toliau mes neskirsime terminų „atminties sritis“ ir „atminties ląstelė“. Žodis „kintamasis“ atėjo į programavimą iš matematikos. Matematika ir fizika jau seniai naudoja kintamojo dydžio sąvoką, bet programuotojai ją sutrumpino ir naudoja sąvoką kintamasis. 3.3 Dvigubas kodavimas (adresacija) Kompiuteris atlieka programoje užrašytas operacijas su kintamųjų reikšmėmis. Jis kažkokiu būdų ima jos reikšmes iš savo atminties, jos apdoroja ir vėl grąžina į atmintį. Kaip tie duomenys atsiranda jo atmintinėje ir kaip kompiuteris atskiria vienus duomenis nuo kitų? Mes žinome, kad kompiuterio atmintis tai daugyba ląstelių duomenims rašyti. Jeigu kintamasis yra kompiuterio atminties sritis, skirta duomenims saugoti (šiuo atveju – kaip objektas, kuris kažką saugo), tai jo pagrindinė savybė – objekto adresas. Adresas gali būti skaitinis arba simbolinis. Koks adresas geresnis – skaitinis ar simbolinis? Galima vienareikšmiškai teigti, kad kompiuteriui patogiau vartoti skaitinius, o žmonėms – simbolinius adresus. Kompiuteris, kaip ir kita skaičiavimo technika, naudoja skaitinius adresus. Taip jam patogiau, nes jis nuosekliai gali apeiti visą atmintį. Pvz., kad galima būtų pereiti nuo adreso iš vieno bito 00000000 į adresą 00000001, reikia pridėti tik vienetą, o tai geriausiai padaryti moka būtent kompiuteriai. Žmonės naudoja simbolinius adresus, pvz., tokį: Jonas Petrauskas, Vilniaus g. 20-45, Vilnius. Jie nuo senų laiku įprato vardais skirti realaus pasaulio objektus. Simbolinis adresas daugiau panašus į vardą. Taigi kintamojo vardas ir yra simbolinis adresas – įvardyta kompiuterio atminties sritis arba abstrakcinė ląstelė. Atminties sritis – tai viena arba daugybė ląstelių, kurios gali būti susietos su duotu kintamuoju. Kompiuterio atmintį patogu įsivaizduoti kaip daugybę abstrakčių (ne fizinių) ląstelių. Šiuolaikinių kompiuterių ląstelės dydis – baitas. Toks dydis yra per mažas saugoti daugybei programos kintamųjų reikšmių. Susitarkime, kad abstrakcinė ląstelė turi dydį, kurio užtenka saugoti su ja susieto kintamojo reikšmei. Todėl toliau mes neskirsime terminų „atminties sritis“ ir „atminties ląstelė“. Simboliniams adresams (kintamųjų vardams) susieti su kompiuterio ląstelėmis naudojamas dvigubas adresų kodavimas (adresacija). Dviguba adresacija Tai lentelė, turinti du stulpelius. Viename įrašyti simboliniai adresai (kintamųjų vardai), o kitame jiems atitinkami skaitiniai adresai. Tokia dviguba adresacija labai patogi. Pvz., kiekviena knyga turi tokia adresacija. Tai knygos turinys, kuriame kiekvienos pastraipos vardas turi atitinkamą puslapio numerį. Kompiuteryje taip pat naudojama dviguba adresacija saugoti failus kietame diske. Tai failų išdėstymo lentelė, kurioje failo vardai susieti su failo skaitiniais adresais. Jie yra užrašyti tam specialiai skirtame kietojo disko sektoriuje. Todėl programuotojui nerūpi, kokiais skaitiniais adresais yra saugomi kompiuterio duomenys. Bet tai labai svarbu kompiuteriui. Jam tai būtina žinoti. Taigi todėl ir reikalinga dviguba adresacija arba simbolinių ir skaitinių adresų atitikimo lentelė. Kol programuotojas rašo programą, jis savo duomenims (kintamiesiems) suteikia simbolinius vardus, o kai programa paleidžiama, vietoje jų įstatomi ląstelių skaitiniai adresai. 3.4 Kintamųjų atributai Veiksmai su duomenimis aprašomi programoje. Tačiau į programą rašomi ne patys duomenys, o jų vardai. Taigi programuotojai dažnai galvoja apie kintamąjį kaip apie vardą, bet kintamasis yra ne tik vardas. Kintamuosius galima apibūdinti šiais atributais: • vardas; • adresas; • reikšmė; • tipas; Kintamojo vardas Programos algoritmas turi apdoroti įvairius pradinius duomenis, pateikiamus į tam tikras programos kintamųjų ir konstantų apibrėžties sritis. Vadinasi, programoje reikia operuoti su iš anksto nežinomais duomenimis. Programoje tokie duomenys susiejami su kintamaisiais, kurie nurodomi vardais, o kompiuteryje susiejami su įvardytomis atminties sritimis. Anksčiau mašinų kodų programavime kintamųjų vardai sutapdavo su atminties adresais. Bet jau asemblerio programavime absoliutiniai atminties adresai buvo pakeisti vardais. Kompiliavimo metu kompiuteris paverčia vardus faktiniais adresais, kuriuos pats išsirenka. Pastaba Labai svarbu suprasti, kad programos kode kintamieji identifikuojami vardais, o atmintyje –faktiniais simboliniais adresais. Vietoje žodžio „vardas“ kartais vartojamas žodis „identifikatorius“. Kintamojo adresas Kintamojo faktinis adresas tai atminties ląstelės adresas, kuri saugo kintamojo reikšmę. Tas faktas yra užrašytas dvigubos adresacijos lentelėje. Vadinasi, kintamojo adresą žino kompiuteris ir gali įrašyti į atminties ląstelę kintamojo reikšmes, kurie programos darbo metu nuolat kinta. Kintamojo vardai, kurie aprašyti tiesiai pagrindinėje programoje, yra susiejami su atminties adresu programos kompiliavimo metu. Jeigu jie aprašyti kaip lokalūs procedūroje arba funkcijoje, tai, iškvietus procedūrą ar funkciją, jie susiejami su steko atminties adresais. Kintamojo reikšmė Kai kalbame apie programos kintamuosiuos, naudojame kintamųjų vardus ir sakome, kad kompiuterio atmintyje saugomos kintamųjų reikšmės. Taigi kintamasis kartu turi vardą ir reikšmę. Jei kalbame apie kintamąjį, neminėdami jo vardo, tai dažnai laikome, kad tas kintamasis yra jo reikšmė. Kintamieji dažniausiai savo reikšmes gauna priskyrimo operatoriumi, pvz: var Kint: Integer; …… Kint:=100; Čia kintamasis vardu Kint gavo prikyrimu reikšmę – skaičių 100. Kartais sakoma, kad atminties ląstelė vardu Kint saugo reikšmė – skaičius 100. Kintamojo tipas Programavime naudojama daug įvairių duomenų. Pagal savybes jie jungiami į skirtingas klases, su kuriomis galima atlikti tam tikras operacijas. Šios klasės vadinamos duomenų tipais. Pvz., visi sveikieji skaičiai, su kuriais galima atlikti aritmetines operacijas, priklauso sveikajam tipui. Duomenys, turintys dvi logines reikšmes – True ir False, priklauso loginiam tipui. Su jais galima atlikti logines operacijas. Kintamojo tipas apibrėžia aibę reikšmių, kurias gali įgyti kintamasis ir kokios operacijos su jomis galima atlikti. Pvz., Paskalyje: • kintamais tipo Integer gali įgyti sveikąsias reikšmes, tai diapazono nuo –32758 iki 32757 skaičiai, su kuriais galima atlikti aritmetines operacijas (operacijos rezultatas taip pat turi priklausyti šiam diapazonui); • kintamais tipo Boolean gali įgyti tik dvi loginės reikšmės – True ir False, su kuriomis galima atlikti visas logines operacijas. Pastaba Patogu, jeigu vienas kintamasis gali įgyti tik vieną to paties tipo reikšmę. Todėl kompiuteriui aišku, kiek vietos atmintyje toms reikšmėms išsaugoti reikės. Taigi vietą kompiuteris rezervuoja iš anksto. Be to, aišku, kokias operacijas bus galima atlikti su šiomis reikšmėmis. Atkreipkite dėmesį, kad kompiuteriui nesvarbus kintamojo vardo ilgis. Jam svarbus tik kintamojo tipas. Duomenų tipas turi savo vardą, kurį pradedantieji programuotojai dažnai klaidingai supranta kaip šio kintamojo vardą. 3.5 Neapibrėžta kintamojo reikšmė Kokia reikšmę turi kintamasis, kai jis aprašytas ir jam išskirta tam tikrą atminties sritis? Aišku, kad kompiuterio ląstelė, kaip realus fizinis objektas, saugo kokią nors bitų kombinaciją, ir nebūtina visi bitai yra nuliai. Vadinasi kad kintamasis saugo atsitiktinę arba, kaip įprasta sakyti, neapibrėžtą reikšmę. Programavime galioja taisyklė – pirmoji aprašyto kintamojo reikšmė yra neapibrėžta. Jeigu jūs po kintamojo aprašymo norėsite šią reikšmę panaudoti, programos vykdymas bus sustabdytas ir kompiuteris praneš apie klaidą. Apskritai visi kompiliatoriai laikosi šios taisyklės. Tačiau yra kompiliatorių, kurie po nuskaitymo kintamojo aprašymo išskiria jam atminties sritį ir ten iš karto rašo nulinius bitus. Tai yra nekorektiška ir gali tapti programos darbo klaidos priežastimi. Vėliau šią klaidą bus labai sunku surasti. Pvz., Paskalyje • visi skaitinio tipo (pvz., Integer, Real ir kt.) kintamieji po aprašymo įgauna nulinę reikšmę, • visi eilutės tipo (pvz., Char, String) kintamieji po aprašymo įgauna tuščios eilutės reikšmę. 3.6 Kintamųjų inicijavimas Kintamųjų inicijavimas Procesas, kurio metu kintamasis įgauna reikšmę, vadinamas inicijavimu. Dažniausiai kintamojo inicijavimą vykdo priskyrimo operatorius Kintamojo inicijavimas priskyrimo operatoriumi Paskalyje priskyrimo operatorius užrašomas tokia sintakse: Kintamasis:= Reiškinys; Reiškinio reikšmė turi būti įrašyta atminties adresu, nurodytu kintamojo vardu. Šį veiksmą galima pavaizduoti taip: Kintamasis Reiškinys. Į kintamąjį kairėje pusėje reikšmė įrašoma iš dešinės pusės. Nagrinėsime programa, kurioje kintamasis inicijuotas priskyrimu: 3.1. Programa program Kintamojo_inicijavimas_priskyrimu; var Kint:Integer; {Kintamojo tipo aprašymas} begin {Paskalyje Integer tipo kintamieji po aprašymo įgauna nulinę reikšmę} WriteLn ('Neinicijuotas kintamasis=> ', Kint); Kint:=17; {Kintamojo Kint inicijavimas priskyrimu} WriteLn ('Inicijuotas kintamasis Kint priskyrimu=> ', Kint); ReadLn; {Stabdymas} end. Kintamojo inicijavimas priskyrimu Reikšmė 17 Žmogui tai – dešimtainis skaičius 1710 Kompiuteriui tai – dvejetainis skaičius 100012 – šešioliktainis skaičius 1116 Veiksmas Rezultatas Komentaras Kompiuteris nuskaito kintamojo tipo aprašymą X: Integer; programos kompiliavimo metu X: ? (0) Atminties ląstelė nesaugo kintamojo reikšmę Kompiuteris rezervuoja kintamajai X atminties ląstelę Kompiuteris nuskaito priskyrimo operatorių X: =17; programos vykdymo metu X: 1710=100012=1116 Atminties ląstelė saugo kintamojo reikšmę Kompiuteris į atminties ląstelę talpina reikšmę 1710=100012=1116 Kintamojo inicijavimas įvedimo operatoriumi Kintamąjį galima inicijuoti įvedimo operatoriumi ReadLn(): 3.2. Programa program Kintamojo_Inicijavimas_Įvedimu; var Kint: Integer; {Kintamojo tipo aprašymas} begin WriteLn ('Neinicijuotas kintamasis=> ', Kint); ReadLn(Kint); {Kintamojo Kint inicijavimas įvedimu} WriteLn ('Inicijuotas kintamasis Kint įvedimu=> ', Kint); ReadLn; {Stabdymas} end. Neinicijuotas kintamasis Nagrinėkime programa, kurioje yra neinicijuotas kintamasis: 3.3. Programa program Neinicijuotas_Kintamasis; var Kint:Integer; {Kintamojo tipo aprašymas} begin {Paskalyje Integer tipo kintamieji po aprašymo įgauna nulinę reikšmę} WriteLn ('Neinicijuotas kintamasis=> ', Kint); ReadLn; {Stabdymas} end. Paspaudžiau klaviatūros klavišą F9 (Vykdyti), galime pastebėti Free Paskaliu pranešimą lange Pranešimai (Messages): Gal būt kintamajam Kint nepriskirta reikšmė Vadinasi, Free Paskalis perspėjo, kad kintamasis Kint dar neinicijuotas. 3.7 Kintamųjų ir reiškinių reikšmių stebėjimas Free Paskalio terpėje. Programos eigos protokolavimas Prisimikime, kad Paskalyje priskyrimo operatoriaus sintaksė tokia: Kintamasis:=Reiškinis; Lange Stebimi reiškiniai (Watches) galima stebėti • kintamųjų reikšmes, kurios aprašomos sekcijoje var; • reiškinių reikšmes iš programos priskyrimo operatoriaus arba najus; Kintamųjų ir reiškinių reikšmių stebėjimui Free Paskalyje reikia jas įdėti į sąrašą lange Stebimi reiškiniai ir palesti derintuvę (derinimo programą). Tam reikia Free Paskalyje atlikti veiksmus. 1) Lange apačioje paspausti mygtuką Stebimi reiškiniai – bus atidarytas langas Stebimi reiškiniai (Watches). 2) Peles žymeklį įdėjus į langą Stebimi reiškiniai, bakstelkite kairįjį pelės klavišą – bus atversta kortelė Stebimasis reiškinys. 3) Įveskite kintamojo vardą ar reiškinį į lauką Reiškinys (Expression) ir paspauskite mygtuką Gerai (OK). 4) Paleiskite derintuvę, paspauskite klaviatūros klavišą F7 (Žengti- Trace into). Prades veikti komanda step, nurodanti vykdyti programos eilutės kodą iki kitos programos eilutės. Šią eilutę nurodo komandos rodyklė. 5) Lange Stebimi reiškiniai stebėsime kintamųjų ir reiškinių reikšmių keitimus. 6) Jei jus norite grįžti atgal prie pirmos programos eilutės, reikia nutraukti derinimo procesą: spausti klaviatūros klavišus Ctrl+F2 (Nutraukti-Reset) (nutraukiama ir uždaroma vykdoma arba derinama programa). Kortelė Stebimasis reiškinys. • Reikšmių tipas. Čia galima pasirinkti reikšmių rodinio tipą. Numatytosios tvarkos rodinio tipas yra Numatytasis. Jo reikšmės tipas bus pateikiamas nustatytu formatu atitinkančiu reiškinio reikšmės tipą. Pvz., 2.1. programoje Kintamasis Kint įgys reikšmę 17, jei reikšmių tipas Sveikasis arba Numatytasis ir 1116 jei reikšmių tipas Šešioliktainis. • Stebėjimas įjungtas (Watch enabled). Čia galima įjungti arba išjungti kintamojo reiškinio reikšmių stebėjimą, keičiant šio laukelio būseną. Kintamojo skaitinis adresas Ženklas @“ parašytas prieš kintamojo vardą lauke Reiškinys (Expression) duoda kintamojo skaitinį adresą lange Stebimi reiškiniai (Watches). Dėmesio. Norėdami sužinoti kintamojo adresą, jo vardą būtinai turime užrašyti lotynų abėcėle. Pastaba Kaip veikia Free Paskalis, galima sužinoti, paspaudomi klavišą F1 arba atversdami failą Fps.hlp. Kitos programos derinimas Norėdami paleisti derintuvę kitos programos derinimui, turime nutraukti prieš tai atliekamos programos derinimą. Tam spaudžiame klaviatūros klavišus Ctrl+F2 (Nutraukti-Reset) (nutraukiama ir uždaroma vykdoma arba derinama programa). Pastaba. Kartais sukompiliuota Paskalio programa gali likti kompiuterio atmintyje, nors ji buvo nutraukta su klavišais Ctrl+F2. Apie tai Free Paskalis perspės pranešimu: Klaida: Nepavyko ištrinti vykdomosios rinkmenos. Kl. nr.: 5 Error: Failed to delete executable file. Err. nr:. 5 Tokiu atveju spauskite tris “linksmus” klavišus Ctrl+Alt+Delete ir lange Close Program pašalinkite Free Paskalio vykdomąjį failą vardu Fpsgdb. Kad būtų dar aiškiau, kaip stebėti kintamųjų ir reiškinių reikšmes arba vykdyti programos eigos protokolavimą Free Paskalio terpėje, nagrinėsime pavyzdį: 3.4. Programa program Kintamųjų_Reikšmių_Stebėjimas; var A, B, Reiskinys1, Reiskinys2: Real; begin A:=15; B:=25; Reiskinys1:=(A+B)/2; Reiskinys2:=Sqrt(A*B); WriteLn(Reiskinys1: 8: 2); WriteLn(Reiskinys2: 8: 2); ReadLn; end. Kintamųjų ir reiškinių reikšmių stebėjimas Pelės žymeklį įdėjus į langą Stebimi reiškiniai atliksime veiksmus. 1) Norėdami stebėti kintamųjų adresus, įvesime pavieniui kintamųjų vardus su ženklu @ prieš vardą @A, @B, @Reiskinys1, @Reiskinys2. ir norėdami nuskaityti dešimtainius adresus, žymėsime perjungiklį Sveikasis (Decimal) kortelėje Stebimasis reiškinys; 2) Norėdami stebėti kintamųjų reikšmes, įvesime pavieniui kintamųjų vardus A, B, Reiskinys1, Reiskinys2. 3) Norėdami stebėti reiškinių reikšmes, įvesime pavieniui reiškinius (A+B)/2, Sqrt (A*B). 4) Paleidome derintuvę pažinksniui, spaudžiant klaviatūros klavišą F7. Jei programa dar kompiliuota, derintuvė ją kompiliuos. Tokiu atveju dar kartą spauskite klaviatūros klavišą F7 Kompiuteris, nuskaitant kintamųjų aprašymą (sekciją var), kintamajam A, B, Reiskinys1, Reiskinys2 programos kompiliavimo metu išskirs atminties vietas. Vadinasi, kiekvienas kintamasis įgys savo skaitinį adresą. Tarkime, kad dešimtainiai skaitiniai adresai lygūs: @A=4254096, @B=4254104, @Reiskinys1=4254112, @Reiskinys2=4254120. Pastaba Programos vykdymas pažinksniui dar neįvyko, bet derintuvė pasiruošė sandėlius – atminties ląsteles, kuriose bus išsaugotos kintamųjų reikšmės programos vykdymo metu. Žengimo per visą programą metu, galėsime stebėti kintamųjų ir reiškinių reikšmių keitimą lange Stebimi reiškiniai (Watches). Dabar galime sukurti dvigubos adresacijos lentelę: Dvigubos adresacijos lentelė Simboliniai adresai – tai programos kintamųjų vardai Skaitiniai adresai – tai skaitiniai atminties ląstelių adresai Kintamųjų vardus sugalvoja pats programuotojas Skaitinius adresus sukūria kompiuteris programos kompiliavimo metu. Dešimtainiai adresai Šešioliktainiai adresai A 4254096 40E990 B 4254104 40E998 Reiskinys1 4254112 40E9A0 Reiskinys2 4254120 40E9A8 Pastaba Dvigubos adresacijos lentelė aiškiai rodo kad, • programoje duomenys identifikuojami kintamųjų vardais, • o kompiuteryje skaitiniais adresais. Programos žengimo metu vykdoma komanda step, nurodanti vykdyti programos eilutės kodą iki kitos programos eilutės. Vadinasi, kiekvienas kintamasis ir reiškinys įgys reikšmę. Pvz., A=15, B= 25, Reiskinys1=20.00, Reiskinys2=19.36, (A+B)/2=20.00, Sqrt(A*B)=20.00. Paskalio programos eigos protokolavimas Programos eigos protokolavimas pažingsniui (Programs Tracing step by step). Žengimas per visą programą su klavišą F7 ir kartu stebėjimas kintamųjų ir reiškinių reikšmių lange Stebimi reiškiniai (Watches) vadinamas “Programos eigos protokolavimu” arba “Programos protokolavimu”. Uždavinys Sukurti programą du skaičius rikiuoti didėjimo tvarka. Skaičiai įvedami klaviatūra ir išvedami į ekraną didėjimo tvarka ir dar sutvarkomi atmintyje didėjimo tvarka. Atlikite programos protokolavimą, kai skaičiai lygūs: 12 ir 5 3.5. Programa program Dvejų_Skaičių_Rikiavimas; {Keitimas reikšmėmis tarp kintamųjų Sk1, Sk2 atmintyje } var Sk1, Sk2, Temp: Integer; begin ReadLn(Sk1, Sk2); if Sk1>Sk2 then begin {Veiksmų seka} Temp:=Sk1; {Kintamojo Sk1 reikšmė talpinsime į kintamąjį Temp – “laikinas sandelis”} Sk1:=Sk2; {Kintamojo reikšmė Sk2 talpinsime į kintamąjį Sk1} Sk2:=Temp; {Kintamojo reikšmė Sk1 gražinsime iš kintamojo Temp} end; {if} WriteLn('Surikiuoti skaičiai => ', Sk1, ' ', Sk2); ReadLn; end. Programos protokolavimas 1) Pelės žymeklį įdėjus į langą Stebimi reiškiniai, įvesime pavieniui į langą Stebimi reiškiniai programos sąryšio operatorių Sk1>Sk2 ir kintamųjų vardus Sk1, Sk2, Temp: Reiškiniai Reikšmės Sk1>Sk2 Temp Sk1 Sk2 2) Paleidome derintuvę pažinksniui, spaudžiant klaviatūros klavišą F7. Jei programa dar kompiliuota, derintuvė ją kompiliuos. Tokiu atveju dar kartą spauskite klaviatūros klavišą F7. Pradės veikti komanda step, nurodanti vykdyti programos eilutės kodą iki kitos programos eilutės. Šią eilutę nurodo komandos rodyklė. • Komandos rodyklė nurodo eilutę programos ReadLn(Sk1, Sk2); Jei duomenys programoje įvedami klaviatūra, Free Paskalio derintuvė paprašys juos įvesti (ant viršaus bus pakrautas jodas ekranas ivedimui). Įvesime skaičius 12, 5 ir lange Stebimi reiškiniai stebėsime: Reiškiniai Reikšmės Sk1>Sk2 Temp Sk1 Sk2 False 0 0 0 • Komandos rodyklė nurodo programos eilutę if Sk1>Sk2 then arba Temp:=Sk1; Lange Stebimi reiškiniai stebėsime: Reiškiniai Reikšmės Sk1>Sk2 Temp Sk1 Sk2 True 0 12 5 • Komandos rodyklė nurodo programos eilutę Sk1:=Sk2; Lange Stebimi reiškiniai stebėsime: Reiškiniai Reikšmės Sk1>Sk2 Temp Sk1 Sk2 True 12 12 5 • Komandos rodyklė nurodo programos eilutę Sk2:=Temp; Lange Stebimi reiškiniai stebėsime: Reiškiniai Reikšmės Sk1>Sk2 Temp:=Sk1 Sk1:=Sk2 Sk2:=Temp True 12 5 5 • Komandos rodyklė nurodo eilutę programos WriteLn('Surikiuoti skaičiai => ', Sk1, ' ', Sk2); Tokiu atveju veiks išvedimo operatorius ir Free Paskalio derintuvė ant viršaus pakraus jodą ekraną išvedimui. • Spaudžiame klavišą ENTER, kol jodas ekranas aktyvus. Tokiu atveju programa baigs darba , o derintuvč išvalis atveju baigs WriteLn('Surikiuoti skaičiai => ', Sk1, ' ', Sk2); Veiks išvedimo operatorius ir Free Paskalio derintuvė ant viršaus pakraus jodą ekraną išvedimui. Lange Stebimi reiškiniai stebėsime: Reiškiniai Reikšmės Sk1>Sk2 Temp Sk1 Sk2 3) Jei jus norite grįžti atgal prie pirmos programos eilutės, reikia nutraukti derinimo procesą: spausti klaviatūros klavišus Ctrl+F2 (Nutraukti-Reset) (nutraukiama ir uždaroma vykdoma arba derinama programa). Pastaba. Kartais sukompiliuota Paskalio programa gali likti kompiuterio atmintyje, nors ji buvo nutraukta su klavišais Ctrl+F2. Apie tai Free Paskalis perspės pranešimu: Klaida: Nepavyko ištrinti vykdomosios rinkmenos. Kl. nr.: 5 Error: Failed to delete executable file. Err. nr:. 5 Tokiu atveju spauskite tris “linksmus” klavišus Ctrl+Alt+Delete ir lange Close Program pašalinkite Free Paskalio vykdomąjį failą vardu Fpsgdb. Programos protokolas Veiksmas Ląstelių reikšmės Komentarai Sk1>Sk2 Temp Sk1 Sk2 begin False 0 0 0 Programs pradžią ReadLn(Sk1, Sk2); True 0 12 5 Nuskaitome skaičius Sk1, Sk2 if Sk1>Sk2 then True 0 12 5 Skaičių lyginimas 12>5 Temp:=Sk1; True 12 12 5 Kintamojo reikšmė Sk1 talpiname į kintamąjį Temp – “laikinas sandelis” Sk1:=Sk2; True 12 5 5 Kintamojo reikšmė Sk2 talpiname į kintamąjį Sk1 Sk2:=Temp; True 12 5 12 Kintamojo reikšmė Sk1 gražiname iš kintamojo Temp WriteLn(Sk1,Sk); True 12 5 12 Išvedimas end. Programs pabaiga 3.8 Operacija @ – kintamojo adreso gavimas Paskalyje yra kintamųjų tipas, kurių pagalba galima išsiminti kintamojo adresą. Šis kintamųjų tipas vadinamas rodykle (pointers), o kintamieji, kurie saugo kintamųjų adresus vadina rodykle. Rodyklę galima palyginti su bibliotekos katalogo kortele. Kiekviena kortelė turi nuorodą į knygą bibliotekoje. Kortelėje yra knygos pavadinimas, autorius ir kiti duomenys, svarbiausias duomuo – kurioje vietoje knyga saugoma bibliotekoje. Bibliotekos kataloge gali būti ir kitos nuorodos į tą pačią knygą. Galima sakyti, kad kortelė yra tarpininkas tarp skaitytojo ir knygos. Mes dabar nenagrinėsime kas yra rodyklės ir kaip su jomis dirbti. Rodyklė – tai kintamasis, užimantis 4 baitus. Jo fizinė prasmė – saugoti atminties srities adresą. Kintamojo adreso gavimas Kintamojo adreso gavimo operacija – tai už kintamojo vardo įdėtas ženklas “@“ be tarpo iš dešinės. Operacijos @ grąžinamą adresą galima priskirti netipizuotoms tipo Pointer rodyklei, Pvz., programos sekcijoje var yra aprašyti kintamasis Kint sveikoko tipo ir kintamasis -rodyklė RodP var Kint: Integer; Rod: Pointer; Programoje priskyrimo operatorius Rod:= @Kint; gražina į kintamąjį-rodyklę kintamojo Kint adresą Nagrinėkime programa, kurioje kintamasis -rodyklė įgauna reikšmę – kito kintamojo adresą : 3.6. Programa program Kintamojo_adreso_gavimas; var X1: Integer; {Sveikojo tipo kintamasis} X2: Real; {Realiojo tipo kintamasis} X3: String; {Eilutės tipo kintamasis} X4: Char; {Siombolio tipo kintamasis} Rod: Pointer; {Rodyklės tipo kintamasis} const KitEil=chr(10)+chr(13); {kita eilutė} begin X1:=17; {Sveikasis skaičius} X2:=0.5; {Realusis skaičius } X3:='Labas'; {Simboliu eilutė} X4:= '*'; {Simbolis “žvaigždutė” } Rod:= @X1; {Kintamojo X1 adresą saugo rodyklė X5} Rod:= @X2; {Kintamojo X2 adresą saugo rodyklė X5} Rod:= @X3; {Kintamojo X3 adresą saugo rodyklė X5} Rod:= @X4; {Kintamojo X4 adresą saugo rodyklė X5} {Išvedimas kintamųjų X1, X2, X3, X4 reikšmes, į atskiras eilutes, naudojant konstanta KitEil} Write(X1,KitEil,X2,KitEil,X3,KitEil,X4,KitEil); ReadLn; {Stabdymas} end. Negalima išvesti kintamųjų X1, X2, X3, X4 adresus į ekraną, naudojant procedūras WriteLn() arba Write() Tačiau, kintamųjų adresus galima stebėti lange Stebimi reiškiniai (Watches). Tokiu atveju peles žymeklį įdėjus į langą Stebimi reiškiniai, atversime kortelę Stebimasis reiškinys ir tenai įvesime kintamojo-rodyklės vardą – Rod į lauką Reiškinys. Paskui atliekame programos derinimą pažinksniui su klavišą F7 (Žengti Trace into). Žengiame per visą programą ir stebime kintamojo-rodyklės Rod reikšmių keitimus. Pastaba. Išvedimo procedūroje Write(X1,KitEil,X2,KitEil,X3,KitEil,X4,KitEil); po kiekvieno kintamojo vardo patalpintas procedūros argumentas, kurio reikšmė – konstanta KitEil. Ši gudrybė duoda galimybę nerašyti programoje daug operatorių WriteLn (išvedimas į kitą eilutė) bei išvesti kintamųjų X1, X2, X3, X4 reikšmes į atskiras eilutes. 3.9 Standartiniai duomenų tipai Kaip nurodyti teisingą duomenų tipą programoje ir pasirinkti jo pateikimą būdą kompiuteryje? Pirma, reikia skirti duomenų tipų klases. Svarbiausia duomenų tipų savybė yra jų reikšmių struktūrinimas. Jeigu reikšmė neturi struktūros ir yra nedaloma į komponentus (elementus), ji vadinama skaliarine. O duomenų tipas, kuris ją aprašo, vadinamas skaliariniu duomenų tipu. Skaliariniai duomenų tipai Kai kurie skaliariniai duomenų tipai taip dažnai naudojami, kad jie aprašomi programavimo kalbose standartiniais žodžiais: Integer, Real, Char, Boolean. Praktiškai kiekvienoje programavimo kalboje yra standartinių duomenų tipų. Standartiniai duomenų tipai yra atomai, iš kurių kuriami visi struktūriniai duomenų tipai. Standartiniams tipams priklauso: • sveikieji skaičiai – Integer, • realieji skaičiai – Real, • simboliai – Char, • loginės reikšmės – Boolean. Norint panaudoti programoje standartinius tipus, reikia aprašyti jų realizaciją ir mokėti naudotis tipo reikšmėms taikomais veiksmais. Visi standartiniai tipai turi keletą atmainų, kurios žymimos skirtingais baziniais vardais. 3.10 Integer – Sveikasis tipas ir jo atmainos Informacija kompiuteryje koduojama nuliais ir vienetais. Mažiausias informacijos matavimo vienetas yra bitas. Vienas bitas gali saugoti tik 2 skirtingas kombinacijas: 0 (nulis) arba 1 (vienetas). Iš viso 21 = 2. Du bitai gali saugoti 4 skirtingas nulio ir vieneto kombinacijas: 00, 01, 10, 11. Iš viso 22 = 4. Trys bitai gali saugoti 8 skirtingas nulio ir vieneto kombinacijas: 000, 001, 010, 011, 100, 101, 110, 111. Iš viso 23 = 8. Paskalyje visi sveikieji Byte tipo skaičiai yra teigiami ir juos saugo vienas baitas, kurį sudaro 8 bitai (1 baitas = 8 bitai). Be abejo, kad vienu baitu galima pavaizduoti vieną iš 28=256 reikšmių. Didžiausia reikšmė, kurią gali įgauti Byte tipo skaičius, užrašyta kaip dvejetainis skaičius, atrodytų taip: 11111111. Jeigu skaičių 11111111 užrašytume kaip dešimtainį skaičių, tai gauname 255. Vadinsi, 111111112=255=28-1 Kodėl 28–1, ar ne paprasčiau 28? Todėl, kad viena 8 baitų kombinacija tik iš nulių turi vaizduoti nulį: 00000002=0. Norint saugoti Paskalyje Integer tipo skaičių, reikia 16 bitų, bet vieną iš šių bitų reikia palikti skaičiaus ženklui saugoti (teigiamas ar neigiamas). Taigi lieka 15 bitų. Didžiausias teigiamas Integer tipo skaičius (jeigu naudosime tik 15 bitų), bus 1111111111111112=32757=215–1. Kodėl 215–1, ar ne paprasčiau 215? Todėl, kad viena 15 baitų kombinacija tik iš nulių turi vaizduoti nulį: 0000000000000002=0. Didžiausias absoliučiuoju didumu neigiamas Integer tipo skaičius, naudojantis tik 15 bitų, bus –215 = –32758. Sprendžiant daugumą uždavinių, pakanka Integer ir Real tipų. Mažiems teigiamiems skaičiams saugoti dažnai naudojamas Byte tipas. Paskalio Integer–Sveikojo tipo atmainos Kintamojo Tipas Atmintis baitais Reikšmių diapazonas Byte 1 baitas 0..255 0..28–1 Word 2 baitai 0..65535 0..216–1 ShortInt 1 baitas –128..127 –27..27–1 Integer 2 baitai –32758..32757 –215..215–1 LongInt 4 baitai –21474836480..2147483647 –231..231–1 Atminties ląstelės persipildymas Tačiau skaičiaus dydis ribojamas ir tą ribą greitai galima pasiekti programos vykdymo metu. Pats didžiausias leistinas sveikasis skaičius tipo Integer yra 32757. Jis žymimas vardu MaxInt. Tai integruota Free Paskalio konstanta. Primikime Paskalio priskyrimo operatorius užrašą: Kintamasis:= Reiškinys. Reiškinio reikšmė turi būti įrašyta atminties adresu, nurodytu kintamojo vardu. Šį veiksmą galima pavaizduoti taip: Kintamasis Reiškinys. Jeigu reiškinio apskaičiavimo rezultatas viršija MaxInt skaičių ir jis priskirtas kintamajam Integer tipo, apskaičiavimo rezultatas prarandamas. Tokia situacija vadinama ląstelės persipildymu arba persipildymu. Vadinasi, mūsų “sandelis” – kintamojo atminties ląstelės dydis, kurioje mes norėjome saugoti reiškinio apskaičiavimo rezultatą, yra per mažas. Pats didžiausias leistinas sveikasis skaičius tipo LongInt yra 2147483647. Jis žymimas vardu MaxLongInt. Tai integruota Free Paskalio konstanta. Analogiškai, gali įvykti ląstelių persipildymas, kai reiškinio apskaičiavimo rezultatas viršys MaxLongInt. Atliekant aritmetines operacijas duomenų tipą reikia parinkti taip, kad rezultatas neviršytų leistinų maksimalių reikšmių. Pav., skaičiuojant suma A + B, kai A = 32000, B = 20000 ir visi kintamieji A, B, C yra Integer tipo, gaunamas persipildymas, nes A + B > 32767. 3.7. Programa program Ląstelių_Persipildamas; var A, B, Suma, Daugyba: Integer; { Integer reikia pakeisti LongInt tipu} begin A:=32000; B:=20000; Suma:=A + B; Daugyba:= A * B; WriteLn('Suma => ', Suma); WriteLn('Daugyba => ', Daugyba); ReadLn; end. 3.11 Funkcija SizeOf(), Paskalyje yra funkcija SizeOf(), kuria gražina atminties dydį, ir jos argumentas – tipo vardas arba kintamojo vardas:
Šį darbą sudaro 6312 žodžiai, tikrai rasi tai, ko ieškai!
★ Klientai rekomenduoja
Šį rašto darbą rekomenduoja mūsų klientai. Ką tai reiškia?
Mūsų svetainėje pateikiama dešimtys tūkstančių skirtingų rašto darbų, kuriuos įkėlė daugybė moksleivių ir studentų su skirtingais gabumais. Būtent šis rašto darbas yra patikrintas specialistų ir rekomenduojamas kitų klientų, kurie po atsisiuntimo įvertino šį mokslo darbą teigiamai. Todėl galite būti tikri, kad šis pasirinkimas geriausias!
Norint atsisiųsti šį darbą spausk ☞ Peržiūrėti darbą mygtuką!
Mūsų mokslo darbų bazėje yra daugybė įvairių mokslo darbų, todėl tikrai atrasi sau tinkamą!
Panašūs darbai
Atsisiuntei rašto darbą ir neradai jame reikalingos informacijos? Pakeisime jį kitu nemokamai.
Pirkdamas daugiau nei vieną darbą, nuo sekančių darbų gausi 25% nuolaidą.
Išsirink norimus rašto darbus ir gauk juos akimirksniu po sėkmingo apmokėjimo!