540 likes | 756 Views
Modernās Programmēšanas Tehnoloģijas (Advanced Programming Technologies ). Edgars Celms, Mārtiņš Opmanis (askola@mii.lu.lv). Latvijas Universitātes Matemātikas un informātikas institūts 200 7, Rīga, Latvija. Darbs ar masīviem valodā JAVA. “ Java™ How to Program, Sixth Edition ”
E N D
Modernās Programmēšanas Tehnoloģijas(Advanced Programming Technologies) Edgars Celms, Mārtiņš Opmanis (askola@mii.lu.lv) Latvijas Universitātes Matemātikas un informātikas institūts 2007,Rīga, Latvija
Darbs ar masīviem valodā JAVA • “Java™ How to Program, Sixth Edition” • Chapter 7. Arrays • Masīvi un to lietojums valodā JAVA. • Masīvu deklarēšana, inicializācija, piekļūšana masīvu elementiem • Paplašinātās forinstrukcijas lietojums masīviem • Masīvu nodošana metodēm • Vairākdimensiju masīvi • Metodes ar nenoteikta garuma parametru sarakstu • Komandrindas argumentu (command-line arguments) apstrāde
Masīvi valodā JAVA • Datu struktūras sastāvošas no savstarpēji saistītiem vienāda datu tipa ierakstiem • Valodā Java masīvs ir objekts (Array klases objekts), tātad masīva mainīgajiem ir references tips • Katrs masīva objekts “zin” savu garumu, tas tiek glabāts length laukā • Masīvi pēc to izveidošanas saglabā savu izmēru • Fiksēta garuma ieraksti (fixed-length entities)
Masīvi valodā JAVA • Masīvu indeksi (index, subscription) • Skaitlis stūra iekavās [], kurš nosaka elementa atrašanās vietu masīvā • Indeksam ir jābūt vesela tipa skaitlim (int) vai arī izteiksmei, kuras rezultāts ir vesels skaitlis • indeksam jābūt ar tipu, kuru var “paaugstināt” (promote) par int – t.i., byte, shortvaichar • long tipa lietojums masīva indeksos – kompilācijas kļūda • Pirmajam masīva elementam ir indekss nulle • Indeksu lietojuma piemērs masīvam ca = 5;b = 6;c[ a + b ] += 2; • Masīva elementamc[ 11 ]pieskaita 2 • c ir masīva vārds • c.lengthglabā masīva garumu • csatur 12 elementus (c[0],c[1],…c[11]) • c[0]vērtībair –45 • sum = c[3] + c[5];
Masīvu deklarēšana valodā JAVA • Masīvu deklarēšana un radīšana • Masīvi ir objekti, kuri aizņem atmiņu • Tiek izveidoti dinamiski ar atslēgvārdunew int c[] = newint[ 12 ]; • Tas pats kasint c[]; // declare array variable c = newint[ 12 ]; // create array • c– mainīgais, kurā tiek glabāta masīva reference • Noklusētās masīva elementa vērtības • Primitīvo tipu vērtības – 0 skaitļiem, falseboolean tipa elementiem • References tipa vērtības – null • Varam izveidot objektu masīvus String b[] = new String[ 100 ];
Masīvu deklarēšana valodā JAVA • Masīvu deklarēšana un radīšana • Deklarējam divus masīvus, kuros glabāsim double tipa elementus • double[] array1, array2; • Divas ekvivalentas deklarācijas • double array1[]; • double[] array1; • Vairāku masīvu deklarēšana vienā instrukcijā (vienā koda rindiņā) var būt par iemeslu grūti pamanāmām kļūdām • Ja mēs gribam deklarēt trīs int masīvus a,b un c, tad mēs varam rakstīt • int[] a, b, c; • Bet, ja mēs gribam deklarēt vienu int masīvu a un divus int mainīgos b un c, tad mēs varam rakstīt • int a[], b, c; • Labāk tā nedarīt!!!
Populārākās programmēšanas kļūdas I (Common Programming Error) • Using a value of type long as an array index results in a compilation error. An index must be an int value or a value of a type that can be promoted to int – namely, byte, short or char, but not long. • Use int. • In an array declaration, specifying the number of elements in the square brackets of the declaration (e.g., int c[ 12 ];) is a syntax error.
Piemērs: masīvu izveidošana Deklarējamarraykā int masīvu Izveidojam 10 int instances; katrai no tām ir vērtība pēc noklusēšanas – int array.lengthatgriežmasīva izmēru array[counter]atgriežattiecīgo intvērtību
Masīvu inicializācija • Var inicializēt masīva elementu sākuma vērtības lietojot inicializācijas izteiksmi • Inicializācijas izteiksme • Vērtības iekļautas figūriekavās ({}) • Vērtību saraksts tiek atdalīts ar komatiem int n[] = { 10, 20, 30, 40, 50}; • Rada piecu elementu masīvu • Indeksu pieļaujamās vērtības 0, 1, 2, 3, 4 • Masīva garums • To nosaka elementu skaits inicializācijas sarakstā • Nav nepieciešams izmantot new, lai radītu masīva elementu objektus
Piemērs: masīvu inicializācijas izteiksme Kompilators izmanto inicializācijas izteiksmi lai izdalītu atmiņu un inicializētu masīva elementus
Piemērs: konstanšu lietošana masīviem • Bieži lietots paņēmiens • Pirms konstanti lietot, tai ir jābūt inicializētai • Mēģinājums lietot neinicializētu konstanti → kompilācijas kļūda • Konstantes vērtība nevar tikt mainīta izpildes gaitā → kompilācijas kļūda Deklarējam konstantes tipa mainīgo ARRAY_LENGTHizmantojot final atslēgvārdu Deklarējam un izveidojam array, kurš satur 10int tipa mainīgos
Piemērs: masīvi valodā JAVA Visu arrayelementu vērtību summa
Piemērs: masīvi valodā JAVA • Datu attēlošana “grafiskā” veidā • Atzīmju sadalījums pa vērtējumiem Lietojam 0 formatēšanas karodziņu, lai attēlotu viena cipara skaitli ar nulli priekšā Katram arrayelementam izvada atbilstošo sadalījumu
Piemērs: masīvi valodā JAVA • Masīvu lietojums, lai apkopotu statistikas datus • frequency[0]: netiek izmantots Declare frequency as array of 7 ints Generate 6000 random integers in range 1-6 Increment frequency values at index associated with random number
Piemērs: masīvi valodā JAVA • Masīvu lietojums aptauju rezultātu attēlošanai Declare responses as array to store 40 responses Declare frequency as array of 11int and ignore the first element For each response, increment frequency values at index associated with that response: Evaluated from inner most set of square brackets
Populārākās programmēšanas kļūdas II (Common Programming Error) • When writing code to loop through an array, ensure that the array index is always greater than or equal to 0 and less than the length of the array. The loop-continuation condition should prevent the accessing of elements outside this range. • When a program attempts to access an element outside the array bounds, an ArrayIndexOutOfBoundsException occurs.
Piemērs: programma spēļu kāršu samaisīšanai un izdalīšanai • Programma simulē spēļu kāršu samaisīšanu un izdalīšanu • Gadījumu skaitļu lietošana • Masīvu izmantošana, lai glabātu references uz elementiem, kuri reprezentē kārtis • Trīs klases • Card • Reprezentē spēļu kārti • Implementēta metode toString(), pārrakstīta (override) klases Object metode. • Tiek izsaukta netieši (implicit), tad kad ir nepieciešama kāda objekta virknes reprezentācija • DeckOfCards • Reprezentē 52 spēļu kāršu kavu (deck of 52 playing cards) • DeckOfCardsTest • Klasei, lai nodemonstrētu kāršu samaisīšanu un izdalīšanu
Piemērs: spēļu kāršu samaisīšana un izdalīšana I Atgriež card klases atbilstošā objekta virknes reprezentāciju Virkņu konkatenācija
Piemērs: spēļu kāršu samaisīšana un izdalīšana II Deklarējamdeckkā masīvu, lai glabātu tajā Cardobjektus KonstanteNUMBER_OF_CARDSnosaka kāršu (Cards)skaitu kavā (deck) Deklarējam un inicializējamfacesar atbilstošajām virknēm, kuras reprezentē kārtis Deklarējam un inicializējam suits ar atbilstošajām virknēm, kuras reprezentē kāršu mastu Aizpildam deckmasīvu ar Cards
Piemērs: spēļu kāršu samaisīšana un izdalīšana III Apmainamtekošo Cardar “nejauši” izvēlētu citu Card Pārbaudam vai kāršu kava (deck)nav tukša
Paplašinātā for instrukcija (enhanced forstatement) • Jauna iespēja sākot ar J2SE 5.0 • Dod iespēju iterēt (pārvietoties) pa masīva vai kolekcijas elementiem neizmantojot skaitītājus • Sintakse for ( parameter : arrayName ) statement; • parameter : tips un identifikators • arrayName: masīva vārds pa kuru iterēt • Lietojums • Var piekļūt masīva elementiem • Nevar mainīt masīva elementus • Nav pieejams skaitītājs, kurš norādītu tekošo elementa indeksu masīvā
Katrā iterācijā piešķir nākamā masīva arrayelementa vērtību intmainīgajam number un pēc tam to pieskaita total Piemērs: paplašinātā for instrukcija for (int counter = 0; counter < array.length; counter++) total += array[counter];
Masīvu nodošana metodēm • Nododam masīvu kā argumentu • Ja masīvshourlyTemperaturesir deklarēts kā int hourlyTemperatures [] = new int[ 24 ]; • Tad metodes izsaukums (norādam masīva vārdu bez iekavām) modifyArray( hourlyTemperatures ); • Nodod masīvahourlyTemperaturesreferenci metodei modifyArray • Metode kura saņem masīva referenci • Jānorāda masīvs, kā parametrs metodes parametru sarakstā void modifyArray(int b[]) • Masīvs breferencē to pašu masīva objektu (hourlyTemperatures) no izsaucošās vietas
Piemērs: masīvu nodošana metodēm I Deklarējam5-int arrayar inicializācijas saraksta palīdzību Nododam arraymodifyArraymetodei
Piemērs: masīvu nodošana metodēm II Nododam masīva arrayelementaarray[3]vērtību metodeimodifyElement MetodemodifyArraymaina tiešā veidā masīva arrayelementus MetodemodifyElementstrādā ar primitīvā tipa mainīgā int kopiju
Piezīmes par parametru nodošanu valodā JAVA • Ir divi veidi kā valodā JAVA tiek nodoti argumenti metodēm • Nodošana pēc vērtības (pass-by-value (call-by-value)) • Metodei tiek nodota argumenta kopija • Darbības metodē neatstāj nekādu ietekmi uz oriģinālo mainīgā vērtību izsaukuma vietā • Valodā JAVA – nodošana pēc vērtības ir visiem primitīvajiem tipiem !!! • Nodošana pēc references (pass-by-reference (call-by-reference)) • Izsaucējs dod iespēju izsaucamajai metodei “tiešā” veidā piekļūt izsaucēja datiem (argumentiem) • Izsaucamā metode var mainīt šos datus • Labāka veiktspēja (performance)salīdzinot ar nodošanu pēc vērtības • Nav nepieciešams nodarboties ar kopēšanu • Valodā JAVA – nodošana pēc references ir visiem objektiem • Valodā JAVA masīvi ir references tipa objekti • Tātad tie tiek nodoti pēc references tipa mehānisma
Piemērs: GradeBook klase un masīvu lietošana I Deklarējam masīvu grades kā lauku. Masīvā tiks glabātas studentu individuālās atzīmes Piešķiram masīva referenci laukam grades
Piemērs: GradeBook klase un masīvu lietošana III Cikls pa masīvu grades, lai atrastu zemāko atzīmi Cikls pa masīvu grades, lai atrastu augstāko atzīmi
Piemērs: GradeBook klase un masīvu lietošana IV Cikls pa masīvu grades, lai sasummētu visas studentu atzīmes Cikls pa masīvu grades, lai aprēķinātu atzīmju sadalījumu
Piemērs: GradeBook klase un masīvu lietošana V Cikls pa masīvu grades, lai attēlotu atzīmes
Vairākdimensiju masīvi • Tabulas ar rindiņām un kolonnām • Divdimensiju masīvi • Tiek specificēti ar diviem indeksiem • Pirmais indekss – rindiņa, otrais indekss – kolonna • Masīviem var būt vairāk kā divas dimensijas • Valoda JAVA tiešā veidā neatbalsta vairākdimensiju masīvus • Vairākdimensiju masīvi tiek veidoti specificējot viendimensiju masīvus, kuru elementi arī ir viendimensiju masīvi • Tas nozīmē, ka divdimensiju masīvi patiesībā ir saraksts no neatkarīgiem viendimensiju masīviem • Tas dod ļoti lielu elastīgumu (flexibility)darbā ar šādiem masīviem (nav tipiska lieta citās programmēšanas valodās) • Divdimensiju masīvi atkarībā no rindiņu un kolonnu skaita tiek saukti arī parm x nmasīviem 3 x 4divdimensiju masīvs
Vairākdimensiju masīvi • Divdimensiju masīva b[2][2] deklarēšana • Inicializēšana izmantojot iekļauto inicializācijas izteiksmi int b[][] = { { 1, 2 }, { 3, 4 } }; • 1 un 2 inicializēb[0][0]unb[0][1] • 3 un 4 inicializēb[1][0]unb[1][1] • Rindiņas var būt dažāda garuma int b[][] = { { 1, 2 }, { 3, 4, 5 } }; • 0 rindiņa satur elementus 1 un 2 • 1 rindiņa satur elementus 3, 4 un 5 • Katrs belements – reference uz viendimensiju masīvu, kurā tiek glabātas inttipa mainīgo vērtības
Vairākdimensiju masīvi • Divdimensiju masīva izveidošana izmantojot atslēgvārdu new • Protams arī vairākdimensiju masīvus var izveidot dinamiski • 3 x 4masīvs – kolonnu skaits visām masīva rindiņām vienāds int b[][]; b = newint[ 3 ][4 ]; • Masīva rindiņām var būt atšķirīgs kolonnu skaits int b[][]; b = newint[ 2 ][ ]; // izveido 2 rindiņasb[ 0 ] = newint[ 5 ]; // izveido 5 kolonnas pirmajai rindiņaib[ 1 ] = newint[ 3 ]; // izveido3kolonnas otrajai rindiņai
Piemērs: vairākdimensiju masīvu lietošana I Lieto iekļauto inicializācijas izteiksmi, lai inicializētu masīvu array1 Lieto iekļauto inicializācijas izteiksmi, lai inicializētu dažāda garuma masīvu array2
Piemērs: vairākdimensiju masīvu lietošana II Lieto dubultiekavu notāciju, lai piekļūtu divdimensiju masīva elementiem
Vairākdimensiju masīvi un for instrukcija • Ļoti bieži masīvus apstrādā izmantojot for instrukciju • Kolonnu elementu inicializācija for ( int column = 0; column < a[ 2 ].length; column++ ) a[ 2 ][ column ] = 0; • Visu masīva elementu summa
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana I • Klases GradeBookmācību piemērs • Viendimensiju masīvs – glabā studentu atzīmes par vienu pārbaudījumu kursā (jau bija šāds piemērs) • Divdimensiju masīvs – glabā studentu atzīmes par visiem kursa pārbaudījumiem (apskatīsim tagad...) Deklarē divdimensiju masīvu grades GradeBook klases konstruktors, saņem kā argumentus String un divdimensiju masīvu
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana II
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana III Cikls pa masīva grades rindiņām, lai atrastu vismazāko vērtējumu pa visiem studentiem un visiem pārbaudījumiem
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana IV Cikls pa masīva grades rindiņām, lai atrastu visaugstāko vērtējumu pa visiem studentiem un visiem pārbaudījumiem Aprēķina konkrēta studenta vidējo atzīmi
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana V Aprēķina visu studentu visu atzīmju sadalījumu
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana VI
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana VII Deklarējam gradesArray kā 3x10 divdimensiju masīvu Katra masīva gradesArray rindiņa reprezentē studentu un katra kolonna studenta atzīmes
Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana VIII
Nenoteikta garuma parametru saraksti(variable-length argument lists) • Jauna īpašība sākot ar J2SE 5.0 • Iespēja izveidot metodes, kuras var saņemt nespecificētu argumentu skaitu • ... kopā ar tipu parametru sarakstā • Jābūt parametru saraksta beigās • Var būt tikai vienu reizi parametru sarakstā • Tiek apstrādāts kā masīvs, kura visi elementi ir vienāda tipa
Piemērs: nenoteikta garuma parametru saraksti Metode average saņem nenoteiktu skaitu double tipa parametrus Aprēķina visu double tipa parametru summu Izmanto numbers.length, lai iegūtu numbers masīva garumu Izsauc metodi average ar dažādu argumentu skaitu
Populārākās programmēšanas kļūdas III (Common Programming Error) • Placing an ellipsis (…) in the middle of a method parameter list is a syntax error. An ellipsis may be placed only at the end of the parameter list.
Komandrindas argumentu (command-line arguments) lietojums • Nodot argumentus no komandrindas • String args[] • Tos norāda aiz klases vārda javakomandai izpildot lietojumprogrammu • java MyClass a b • Atdalīti ar tukšumiem (nevis komatiem) • Bieži tiek lietoti, lai nodotu dažādus izpildlaika parametrus lietojumprogrammām • Argumentu skaits, kurš ir nodots no komandrindas • args.length • Pirmais komandrindas arguments • args[ 0 ]