1 / 53

Modernās Programmēšanas Tehnoloģijas (Advanced Programming Technologies )

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 ”

rimona
Download Presentation

Modernās Programmēšanas Tehnoloģijas (Advanced Programming Technologies )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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)

  4. 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];

  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 ];

  6. 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!!!

  7. 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.

  8. 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

  9. 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

  10. Piemērs: masīvu inicializācijas izteiksme Kompilators izmanto inicializācijas izteiksmi lai izdalītu atmiņu un inicializētu masīva elementus

  11. 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

  12. Piemērs: masīvi valodā JAVA Visu arrayelementu vērtību summa

  13. 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

  14. 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

  15. 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

  16. 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.

  17. 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

  18. 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

  19. 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

  20. 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

  21. Piemērs: spēļu kāršu samaisīšana un izdalīšana IV

  22. 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ā

  23. 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];

  24. 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

  25. Piemērs: masīvu nodošana metodēm I Deklarējam5-int arrayar inicializācijas saraksta palīdzību Nododam arraymodifyArraymetodei

  26. 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

  27. 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

  28. 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

  29. Piemērs: GradeBook klase un masīvu lietošana II

  30. 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

  31. 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

  32. Piemērs: GradeBook klase un masīvu lietošana V Cikls pa masīvu grades, lai attēlotu atzīmes

  33. 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

  34. 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

  35. 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

  36. 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

  37. Piemērs: vairākdimensiju masīvu lietošana II Lieto dubultiekavu notāciju, lai piekļūtu divdimensiju masīva elementiem

  38. 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

  39. 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

  40. Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana II

  41. 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

  42. 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

  43. Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana V Aprēķina visu studentu visu atzīmju sadalījumu

  44. Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana VI

  45. 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

  46. Piemērs: GradeBook klase un vairākdimensiju masīvu lietošana VIII

  47. 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

  48. 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

  49. 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.

  50. 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 ]

More Related