UME UNIVERSITET Datavetenskap 990824 Uppgift 1 (1+3=4 pošng) L SNINGSF RSLAG TILL TENTAMEN PROGRAMMERING I JAVA, 5P. 990824 Varje java-applikation mœste innehœlla fšljande metod: public static void main(string args[]) É a) varfšr? Fšrklara kortfattat! Alla Java-applikationer mœste ha en main-metod, denna metod exekveras automatiskt av systemet, dvs. hšr startar exekveringen av applikationen. b) vad betyder respektive public, static, void, main, String och args[] i detta sammanhang? public static void main String args innebšr att metoden kan nœs av alla, dvs Šven utanfšr den egna klassen och det egna paketet metoden kan anropas utan att det finns ett objekt instantierat av denna klass metoden returnerar inget všrde metodens namn, i detta fall den metod som automatisk anropas nšr applikationen startar datatyp pœ den efterfšljande parametern parameter som hšr Šr ett fšlt och kommer att innehœlla ev. "in-line commands" som ges vid exekveringskommandot. Uppgift 2 ( 2+1+1=4 pošng) a) TŠnk dig att du vill skriva ut talen 0.1, 0.2 É 1.0 Varfšr Šr det olšmpligt att gšra sœ hšr? Hur bšr man gšra? float y; for ( y = 0.1; y!= 1.0; y = y + 0.1 ) System.out.println( y ); Det Šr inte sškert att 0.1 + 0.1 É + 0.1 blir exakt lika med 1.0, pœ grund av problem att representera flyttal internt i datorn. Det Šr bšttre att anvšnda heltal: UME UNIVERSITETÊ901Ê87ÊÊUME ÊÊÊTel.:Ê090-786 77 08ÊÊÊFax: 090-786Ê61Ê26ÊÊÊe-mail:Êmarie@cs.umu.se
Hur bšr man gšra? for ( int i = 1; i <= 10; i++ ) System.out.println( i / 10.0 ); b) Varfšr fungerar inte fšljande kodavsnitt som programmeraren tšnkt (dvs. škar pœ x till všrdet 11? ) int x = 1; while ( x <= 10 ); x++; While-loopen Šr tom pga. ett semikolon fšr mycket. c) Vad hšnder nšr fšljande program kšrs? class Uppgift public static void main(string args[]) int b[] = new int[ 10 ]; for ( int i = b.length; i >= 0; i-- ) b [ i ] = i + 2; // main //class Uppgift Det blir IndexOutOfBoundsException fšrsta gœngen for-satsen exekveras, eftersom b.length() ger resultatet 10, och hšgsta tillœtna index Šr 9. Uppgift 3 ( 5 pošng) Skriv en metod som sorterar ett fšlt med heltal (datatypen int). FŠltet skall kunna vara av godtycklig lšngd. Du fœr anvšnda vilken sorteringsmetod du vill, prestanda Šr inte viktigt hšr. Det skall gœ att sortera i stigande eller fallande ordning. Metoden skall kunna anropas pœ fšljande sštt: int [] data = 5, 3, -1, 23, 456, 34, -11 ; boolean stigande = true; data = sortera(data, stigande); public static int[] sortera ( int[] data, boolean uppat) //Sortera stigande och kasta om efteråt om det ska vara fallande int sistaindex=data.length-1; boolean bytt=true; //Sortera med bubble-sort //När listan passerats en gång utan byten är den sorterad while (bytt) bytt = false; for ( int i = 0; i <= sistaindex-1; i++) if (data[i] > data[i + 1]) int temp = data[i]; //Byt plats data[i] = data[i + 1]; 2 (7)
data[i + 1] = temp; bytt = true; sistaindex--; //så länge ett byte skett if (!uppat) for ( int i = 0; i <= (data.length-1)/2; i++) //första halvan av fältet int temp = data[i]; //Byt plats data[i] = data[data.length-i-1]; // motsvarande från höger data[data.length-i-1] = temp; //fallande return data; //sortera Uppgift 4 ( 2+2+5=9 pošng) I uppgift 3 var utgœngspunkten att elementens datatyp var kšnd. Nackdelen med detta Šr att man dœ mœste ha en sorteringsmetod fšr varje elementtyp. I Java kan man lšsa detta genom att anvšnda ett interface. HŠr skulle det t.ex. kunna vara : interface Sortable public boolean greaterthan( Sortable item ); a) AnvŠnd interfacet Sortable och modifiera din sorteringsmetod frœn fšregœende uppgift (eller skriv en ny) sœ att den kan sortera ett fšlt dšr elementen har godtycklig datatyp. public static Sortable[] sortera ( Sortable data[], boolean uppat) //Sortera stigande och kasta om efteråt om det ska vara fallande int sistaindex=data.length-1; boolean bytt=true; while (bytt) bytt = false; for ( int i = 0; i <= sistaindex-1; i++) if ((data[i].greaterthan(data[i + 1]))) Sortable temp = data[i]; //Byt plats data[i] = data[i + 1]; data[i + 1] = temp; bytt = true; sistaindex--; //så länge ett byte skett if (!uppat) //Låt elementen byta plats for ( int i = 0; i <= (data.length-1)/2; i++) //första halvan av fältet 3 (7)
Sortable temp = data[i]; //Byt plats data[i] = data[data.length-i-1]; // motsvarande från höger data[data.length-i-1] = temp; //fallande return data; //sortera b) UtgŒ nu frœn fšljande klasser och modifiera dem sœ att de gœr att sortera med sorteringsmetoden i deluppgift a). class Bil implements Sortable int vikt; public Bil(int v) vikt = v; public boolean greaterthan( Sortable item ) return vikt > ((Bil)item).vikt; //Bil class Tenta implements Sortable int poäng; public Tenta (int p) poäng = p; public boolean greaterthan( Sortable item ) return poäng > ((Tenta)item).poäng; //Tenta c) Skriv en komplett applikation som slumpar 20 bilar och 20 tentamensresultat och dšrefter sorterar public class Sorteringstest static Bil[] bilfält; static Tenta[] tentafält; public static void main( String args[] ) bilfält = new Bil[20]; tentafält = new Tenta[20]; for (int i = 0; i < 20; i++) bilfält[i] = new Bil((int)(1000 + 1000 * Math.random()) ); tentafält[i] = new Tenta( (int)(40 * Math.random()) ); //for bilfält = sortera( bilfält, true ); tentafält = sortera( tentafält, false ); //main // Sorteringstest 4 (7)
Uppgift 5 ( 3 pošng) Fšljande metod dividerar tvœ heltal med varandra, och returnerar heltalsdelen av resultatet. TyvŠrr fungerar metoden inte sœ bra om divisorn Šr noll. Utnyttja mšjligheten att gšra ÓexceptionsÓ och modifiera metoden sœ att detta problem fšrsvinner. Du bestšmmer dig fšr att returnera 0 om divisorn Šr 0. (Du fœr alltsœ inte anvšnda if, while, case, do eller?-operatorn.) public int dividera( int dividend, int divisor ) int resultat; resultat = dividend / divisor; return resultat; //metod dividera public int dividera( int dividend, int divisor ) int resultat; try resultat = dividend / divisor; catch (DivideByZeroException e) resultat = 0; return resultat; Uppgift 6 ( 3+2=5 pošng) Class Bild private int[][] pixels; //bildpunkterna private int size; //den kvadratiska matrisens storlek // Skapa en bild med n*n bildpunkter public Bild(int n) pixels = new int [n][n]; size = n; //constructor Bild //ett antal metoder //class Bild a) Metoden checksym ska undersška om bilden, dvs. matrisen i frœga Šr symmetrisk. En matris A Šr symmetrisk om fšr varje i och j ai, j= aj, i Metoden ska returnera sant eller falsk beroende pœ om matrisen Šr symmetrisk eller inte. Implementera denna metod. public boolean checksym() boolean sym=true; //avbryt när symmetri omöjlig int i=1,j; while (sym && i < size) j=i+1; //passera elementen ovanför hd. 5 (8)
while (sym && j<=size) sym = ( pixels[i-1][j-1] == pixels[j-1][i-1] ); j++; //while-loop över kolumnerna i++; //while-loop över raderna return sym; // checksym b) En radsumma i en matris definieras som summan av alla element pœ en viss rad. Implementera en metod comprowsums som beršknar matrisens samtliga radsummor och returnerar dem i en vektor med n st. element. public int[] comprowsums() int[] summor=new int[size]; for (int i=1; i<=size; i++) summor[i-1]=0; for (int j=1; j<=size; j++) summor[i-1]=summor[i-1]+pixels[i-1][j-1]; return summor; //comprowsums Uppgift 7 ( 10 pošng) Du har fœtt i uppdrag att gšra en anvšndaryta fšr att simulera en godisautomat. PŒ ytan ska finnas knappar fšr de olika produkterna i sortimentet knappar som skall simulera att mynt stoppas i automaten, en i taget en knapp som avbryter och betalar ut pengarna igen /* Tentamen 990824 ** Automat med GUI ** Knappar för produktval, inbetalning och "avbryt" ** endast inbetalning och "avbryt" implementerade */ import java.awt.*; import java.awt.event.*; public class Automat private int cols=4; private int rows=8; private DynamicGridLayout dgl; private Frame f; private int inbetalt=0; private Label visainbet; 6 (8)
public Automat(String title) // Skapa en ny frame f = new Frame(title); //Lyssnare för knapparna ButtonListener buttonlistener = new ButtonListener(this); // Initiera layout managern och koppla den till f dgl = new DynamicGridLayout(cols,rows); f.setlayout(dgl); // Lägg in exit-knapp. // knappen kan identifieras med getactioncommand() Button avbryt = new Button("Avbryt"); avbryt.setactioncommand("avbryt"); avbryt.addactionlistener(buttonlistener); // Lyssna på den f.add(avbryt, new Point(3,7)); // Placera knappen i GUI //Skapa "varu"-knappar och placera ut i GUI f.add(new Button("Kaka 7:-"), new Point(0,0)); f.add(new Button("Kaka 23:-"), new Point(0,1)); f.add(new Button("Salt Godis 13:- "), new Point(0,2)); f.add(new Button("Surt godis 14:- "), new Point(0,3)); f.add(new Button("Cafe au Lait 19:- "), new Point(1,0)); f.add(new Button("The 11:- "), new Point(1,1)); f.add(new Button("Hacker-Olja 9:- "), new Point(1,2)); f.add(new Button("Kaffe 10:- "), new Point(1,3)); //Knappar för inbetalning Button c; c = new Button("1:-"); c.setactioncommand("1"); f.add(c, new Point(3,1)); c.addactionlistener(buttonlistener); c = new Button("5:-"); c.setactioncommand("5"); f.add(c, new Point(3,2)); c.addactionlistener(buttonlistener); c = new Button("10:-"); c.setactioncommand("10"); f.add(c, new Point(3,3)); c.addactionlistener(buttonlistener); //Fält för kommunikation Label kommlabel; kommlabel = new Label("Du har lagt i :",Label.RIGHT); f.add(kommlabel, new Point(2,5)); //Utskriftsrad för inbetald summa visainbet = new Label("-------"); f.add(visainbet, new Point(3,5)); f.pack(); f.setlocation(50,50); f.setvisible(true); //Automat - konstruktor public void addinbet(int addera) 7 (8)
inbetalt = inbetalt + addera; visatext(integer.tostring(inbetalt)); //addinbet public void visatext(string text) visainbet.settext(text); //visatext //Automat //Många ytterligare metoder kommer här... // Klass som lyssnar på knappar i Automat import java.awt.event.*; public class ButtonListener implements ActionListener private Automat a; public ButtonListener (Automat listeningto) a = listeningto; //konstruktor ButtonListener public void actionperformed (ActionEvent event) //vilken knapp trycktes? String pressed = event.getactioncommand(); if (pressed.equals("avbryt")) a.visatext("pengarna tillbaka!"); System.exit(0); //försök att stänga fönstret :-( else //inbetalning gjord, öka summan a.addinbet(integer.parseint(pressed)); //actionperformed //ButtonListener /* Delar av GUI till simulering av Godisautomat Tentamensuppgift 990824 "Programmering i Java, 5p., Sommaruniversitetet */ public class GodisAutomaten public static void main(string args[]) new Automat("Godisautomaten Snasken"); //main //GodisAutomaten 8 (8)