Malmö högskola Teknik och samhälle 2007/2008 Laboration 12, Arrayer Avsikten med denna laboration är att du ska träna på att använda arrayer. Skapa paketet laboration12 i ditt laborationsprojekt innan du fortsätter på denna laboration. Uppgift 1 Skriv metoden public void baklänges(int[] tal) vilken skriver ut talen i en array med heltal baklänges. Talen separeras med komma-tecken och ett mellanslag. Om du testkör metoden med koden: Uppgift1 upp1 = new Uppgift1(); int[] fält1 = {1,2,3}; int[] fält2 = {1000,100,10,1}; System.out.print("Fält 1 baklänges: "); upp1.baklänges(fält1); System.out.println(); System.out.print("Fält 2 baklänges: "); upp1.baklänges(fält2); System.out.println(); så ska du få resultatet till höger. Uppgift 2 Skriv metoden public int finns(int tal, int[] arrayMedTal) vilken kontrollerar om tal finns i arrayen arrayMedTal. Om tal finns i arrayen så returneras positionen för tal i arrayen (första förekomsten om flera gånger) och annars returneras -1. Testprogram Körresultat Uppgift2 upp2 = new Uppgift2(); int[] array = {1,2,3,9,5,9}; int position; position = upp2.finns(7,array); System.out.println("Position för 7: "+position); position = upp2.finns(9,array); System.out.println("Position för 9: "+position); DA129A, Programmering 1 1 Position för 7: -1 Position för 9: 3 Malmö högskola Teknik och samhälle 2007/2008 Uppgift 3 Skriv ett program vilket • deklarerar en array som rymmer 10 heltal • låter användaren mata in tio heltal vilka lagras i arrayen. Inmatningen ska ske med inmatningdialog, t.ex. genom Input.readInt(String). • skriver ut heltalen i den ordning de matades in • skriver vart annat tal framlänges • skriver ut samtliga tal baklänges Programmet ska innehålla metoderna: • skrivTal(int[] array) • skrivVartannat(int[] array) Dessutom bör din lösning använda metoden baklänges, vilken du skrev i uppgift 1. Körresultat vid inmatning av talen: 12 5 8 2 3 3 3 11 221 7: Följande tal matades in: 12, 5, 8, 2, 3, 3, 3, 11, 221, 7 Vartannat tal: 12, 8, 3, 3, 221 Talen baklänges: 7, 221, 11, 3, 3, 3, 2, 8, 5, 12 Uppgift 4 Skriv metoden public double[] baklänges(double[] array) vilken tar en array som input och som returnerar en array med samma element men med elementen i omvänd ordning. Testprogram Utskrifter Uppgift4 upp4 = new Uppgift4(); double[] array = {3.2, 4.7, -13.1, 14, 17.25}; double[] kopia = upp4.baklänges(array); for(int i=0; i<array.length; i++) System.out.print(array[i]+" "); System.out.println(); for(int i=0; i<kopia.length; i++) System.out.print(kopia[i]+" "); System.out.println(); 3.2 17.25 4.7 -13.1 14.0 14.0 -13.1 4.7 17.25 3.2 Tänkbar algoritm för baklänges-metoden 1. Skapa en array med samma kapacitet som input-fältet 2. Kopiera elementen från input-arrayen till den nya arrayen. Men gör det så att elementen byter plats, ungefär med tilldelningen (i är loop-variabel) nyArray[i] = array[array.length-i-1]; 3. Returnera referensen till den nya arrayen. DA129A, Programmering 1 2 Malmö högskola Teknik och samhälle 2007/2008 Uppgift 5 Skriv metoden public double[] intervall(double[] array, double min, double max) vilken tar en array och ett intervall (min-max) som input och som returnerar en ny array som innehåller de element i input-arrayen som är i intervallet (min <= element <= max). Tänkbar algoritm för intervall-metoden 1. Räkna antalet element i input-arrayen som är i intervallet 2. Skapa en ny array med korrekt kapacitet 3. Kopiera över elementen i intervallet, från input-arrayen, till den nya arrayen 4. Returnera referensen till den nya arrayen. Skriv dessutom ett program som testar din lösning. Uppgift 6 Skriv metoden public int[] udda(int[] array) vilken ska returnera en array som innehåller alla udda element i en input-array. Om input-arrayen är {4, 3, 79, 55, 56, 34, 11, 17} så ska retur-arrayen vara {3, 79, 55, 11, 17} Extrauppgift Skriv ett program som simulerar 100000 kast med tre tärningar och som skriver ut resultatet av kasten i tabellform. Vid varje kast så ska tärningarnas siffersumma lagras. Detta sker med fördel i en array: int[] siffersumma = new int[19]; där vardera facket summerar antalet förekomster av en speciell siffersumma. Den minsta möjliga siffersumman är 3 och den största är 18. Exempel: Om tärningarna visar 8 prickar tillsammans så ska siffersumma[8] ökas med ett. Om tärningarna visar 18 prickar tillsammans så ska siffersumma[18] ökas med ett. Om du testar din metod bör den ge ett resultat liknande figuren till höger. DA129A, Programmering 1 3 Malmö högskola Teknik och samhälle 2007/2008 Förslag till lösningar Uppgift 1 public void baklänges(int[] tal) { for(int i=tal.length-1; i>=0; i--) { System.out.print(tal[i]); if(i>0) { System.out.print(", "); } } } Uppgift 2 public int finns(int tal, int[] arrayMedTal) { for(int i=0; i<arrayMedTal.length; i++) { if(tal == arrayMedTal[i]) { return i; } } return -1; } Uppgift 3 public class Uppgift3 { public void inmatning(int[] array) { for(int i=0; i<array.length; i++) { array[i] = extra.Input.readInt("Ange tal " + (i+1)); } } public void skrivTal(int[] array) { System.out.print("Följande tal matades in: "); for(int i=0; i<array.length; i++) { System.out.print(array[i]); if(i<array.length-1) System.out.print(", "); } System.out.println(); } public void skrivVartannat(int[] array) { System.out.print("Vartannat tal: "); for(int i=0; i<array.length; i+=2) { System.out.print(array[i]); if(i<array.length-2) System.out.print(", "); } System.out.println(); } public void program() { Uppgift1 upp1 = new Uppgift1(); int[] heltal = new int[10]; inmatning(heltal); skrivTal(heltal); skrivVartannat(heltal); System.out.print("Talen baklänges: "); upp1.baklänges(heltal); System.out.println(); } public static void main(String[] args) Uppgift3 upp3 = new Uppgift3(); upp3.program(); } } DA129A, Programmering 1 4 { Malmö högskola Teknik och samhälle 2007/2008 Uppgift 4 public double[] baklänges(double[] array) { double[] nyArray = new double[array.length]; for(int i=0; i<array.length; i++) { nyArray[i] = array[array.length-i-1]; } return nyArray; } Uppgift 5 public double[] intervall(double[] array, double min, double max) { int antal = 0, index=0; double[] nyArray; for(int i=0; i<array.length; i++) { if((array[i]>=min) && (array[i]<=max)) antal++; } nyArray = new double[antal]; for(int i=0; i<array.length; i++) { if((array[i]>=min) && (array[i]<=max)) { nyArray[index] = array[i]; index++; } } return nyArray; } Uppgift 6 public int[] udda(int[] array) { int antal=0, index=0; int[] nyArray; for(int i=0; i<array.length; i++) { if(array[i] % 2 == 1) antal++; } nyArray = new int[antal]; for(int i=0; i<array.length; i++) { if(array[i] % 2 == 1) { nyArray[index] = array[i]; index++; } } return nyArray; } DA129A, Programmering 1 5 Malmö högskola Teknik och samhälle 2007/2008 Extrauppgift package laboration12; import extra.*; public class Extrauppgift { public int tärningskast() { return (int)(Math.random()*6)+1; } public void kasta(int[] resultat, int antalKast) { int tärning1, tärning2, tärning3; for(int i=0; i<antalKast; i++) { tärning1 = tärningskast(); tärning2 = tärningskast(); tärning3 = tärningskast(); resultat[tärning1+tärning2+tärning3]++; } } public void skrivResultat(int[] resultat) { System.out.println("Summa Antal"); for(int i=3; i<resultat.length; i++) { System.out.println(Output.format(i,5)+Output.format(resultat[i],8)); } } public void program() { int[] siffersumma = new int[19]; kasta(siffersumma, 100000); skrivResultat(siffersumma); } public static void main(String[] args) { Extrauppgift e = new Extrauppgift(); e.program(); } } DA129A, Programmering 1 6