PROGRAMMERINGSTEKNIK för F1 och TM1 (TIN212)

Relevanta dokument
OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540) Ansvarig: Jan Skansholm, tel eller

PROGRAMMERINGSTEKNIK TIN212

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

DAT043 Objektorienterad Programmering

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540)

TENTAMEN I. OBJEKTORIENTERAD PROGRAMMERING för Z1. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

TENTAMEN OOP

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Lösningar för tenta 3 DAT043,

Föreläsning 14. Filhantering

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Lösningsförslag till tentamen

Mer om grafiska komponenter. Händelsestyrda program

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Tentamen OOP

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Föreläsnings 9 - Exceptions, I/O

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

OOP Tentamen

Malmö högskola 2007/2008 Teknik och samhälle

Laboration 24 Databasen MySQL och java

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Lösningsförslag till tentamen

Lösningsförslag till tentamen

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Lösningsförslag till tentamen

Tentamen FYTA11 Javaprogrammering

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad Programkonstruktion

Lösningsförslag till tentamen

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 3: Händelsestyrda program och användargränssnitt

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

Lösningsförslag till tentamen

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Tentamen i Programmeringsteknik I,, KandMa/Fy,

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

PROGRAMMERING-JAVA TENTAMINA

OOP Objekt-orienterad programmering

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Lösningar för tenta 2 DAT043,

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad programmering D2

Tentamen i Grundläggande Programvaruutveckling, TDA548

Lösningsförslag till tentamen

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Properties. Användbara metoder som kan anropas i propertychanged:

Föreläsning 2, vecka 8: Repetition

Tentamen, EDAA10 Programmering i Java

TENTAMEN OOP

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Lösningsförslag till tentamen

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

PROGRAMMERING-Java TENTAMINA

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

PROGRAMMERINGSTEKNIK TIN212

Objektorienterad programutveckling, fk

Lösningsförslag till tentamen FYTA11 Javaprogrammering

LyckaTill önskar Anna

Examination i PROGRAMMERINGSTEKNIK F1/TM1 TIN212. Dag: Måndag Datum: Tid: (OBS 5 tim) Rum: V+M

OOP Objekt-orienterad programmering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Transkript:

Institutionen för TENTAMEN Data- och informationsteknik 2016-02-13 PROGRAMMERINGSTEKNIK för F1 och TM1 (TIN212) OBS! Det kan finnas kurser med samma eller liknande namn på olika utbildningslinjer. Denna tentamen gäller endast för den eller de utbildningslinjer som anges ovan. Kontrollera därför noga att denna tentamen gäller för den utbildningslinje du själv går på. TID 08:30-13:30 Ansvarig: Jan Skansholm Förfrågningar: Jonathan Orrö, tel. 0708 867104 Betygsgränser: Hjälpmedel: Sammanlagt maximalt 60 poäng. På tentamen ges graderade betyg: CTH: 3:a 24 poäng, 4:a 36 poäng, 5:a 48 poäng Bravaco, Simonson, Java Programming From the Ground Up, eller Horstmann, Java for everyone, eller Morelli, Walde, Java, Java, Java: Object-oriented problem solving, eller Liang, Introduction to Java programming Comprehensive version, eller Eckel, Thinking in Java, eller Skansholm, Java direkt med Swing, Studentlitteratur (Understrykningar och mindre anteckningar i boken är tillåtna.) Inga kalkylatorer är tillåtna. Tänk på: - att skriva tydligt och disponera papperet på ett lämpligt sätt. - att börja varje ny uppgift på nytt blad. Skriv endast på en sida av papperet - Skriv den (anonyma) kod du fått av tentamensvakten på alla blad. De råd och anvisningar som givits under kursen skall följas vid programkonstruktionerna. Det innebär bl.a. att onödigt komplicerade, långa och/eller ostrukturerade lösningar i värsta fall ej bedöms.

- 2 - Uppgift 1) a) Följande fil innehåller fyra fel som upptäcks vid kompileringen. Vilka är dessa? Ange radnummer. För poäng krävs att felen förklaras. 1 interface A { 2 abstract int m1(int i); 3 4 5 interface B implements A { 6 public int k = 0; 7 public int m2(int i); 8 9 10 interface C { 11 int i=0; 12 int m3(int i); 13 14 15 public abstract class D extends C implements B { 16 public D(int i) {k = i; 17 public int m4(int i); 18 b) Antag att vi har följande klasser: public interface Vehicle {... public class Car implements Vehicle {... public class Suv extends Car {... Ange för var och en av följande rader om den är korrekt eller felaktig. Vehicle v = new Car(); Vehicle v = new Suv(); Vehicle v = new Vehicle(); Car c = new Suv(); Car c = new Vehicle(); Suv s = new Suv(); Suv s = new Car(); (2 p) (2 p) c) Avsikten med följande programrader är att ta bort alla element som innehåller värdet noll ur en lista li av typen List<Integer>. Men det fungerar inte alltid som man tänkt. Ge ett exempel på när detta kan ske och föreslå hur man kan skriva om programraderna så att det fungerar. if (li!= null) for (int i=0; i < li.size(); i++) if (li.get(i)!= null && li.get(i) == 0) li.remove(i); (2 p) Uppgift 2) Konstruera en klass Tärning som skall beskriva en vanlig tärning som man använder t.ex. när man spelar Fia. Följande metoder skall finnas: kasta, som ger tärningen ett slumpmässigt värde mellan 1 och 6, avläsvärde som avläser tärningens värde och ger det som resultat samt sättvärde som har en parameter vilken anger vilket sida på tärningen man vill skall vara upp. Vidare skall det finnas två konstruktorer, en som initierar tärningen till ett slumpmässigt värde och en som gör det möjligt att ge ett visst första värde till tärningen. Parametern till metoden sättvärde och till den andra konstruktorn måste ha ett värde mellan 1 och 6. Skulle så inte vara fallet skall klassen ge en exception av typen IllegalArgumentException. (4 p)

- 3 - Uppgift 3) Ett sätt att kryptera hemliga meddelanden är att använda Vigenèrekryptot. Meddelandet som skall krypteras skrivs då med stora bokstäver och man har tagit bort alla tecken som inte är bokstäver Man använder bara bokstäverna A-Z. Förutom meddelandet som skall krypteras har man också en hemlig nyckel. Denna är också en text som bara innehåller stora bokstäver. Bokstäverna A-Z numreras från 0 till 25. Krypteringen görs sedan genom att man skriver nyckeln under meddelandet och adderar bokstävernas nummer parvis. Additionen sker modulus 26. Man får då numret på den bokstav som skall ingå i det krypterade meddelandet. Om nyckeln är kortare än meddelandet upprepar man nyckeln. Det kan t.ex. se ut på följande sätt. KOMIDAG CTHCTHC MHTKWHI (meddelande) (nyckel) (krypterat meddelande) För att dekryptera meddelandet måste man förstås känna till den hemliga nyckeln. Dekrypteringen går till på samma sätt som krypteringen, men istället för att addera bokstävernas nummer så subtraherar man numren för bokstäverna i nyckeln från numren för motsvarande bokstäver i det krypterade meddelandet. Din uppgift är att skriva en klassmetod som utför kryptering eller dekryptering och som ger det krypterade resp. det dekrypterade meddelandet som resultat. Metoden ska ha tre parametrar: meddelandet som ska krypteras eller dekrypteras, nyckeln samt en boolean som anger om det gäller kryptering eller dekryptering. De två första parametrarna samt resultatet ska vara av typen String. Du får förutsätta att meddelandet och nyckeln bara innehåller stora bokstäver A-Z. Tips: Man kan tilldela ett värde av typen char direkt till en int, men för att tilldela åt andra hållet krävs en explicit typomvandling. (12 p) Uppgift 4) Man har i en textfil samlat uppgifter om ett antal personer. För varje person finns två rader i filen. På första raden står personens namn och adress och på andra raden finns personens ålder, längd och vikt. Längden anges i cm och vikten i kg. Man vill göra en medicinsk studie av överviktiga personer och söker därför personer vilkas s.k. body mass index (BMI) överstiger 30. BMI beräknas enligt formeln m/h 2 där m är vikten i kg och h längden i m. Skriv ett program som läser filen med personuppgifter. Programmet skall skapa en ny textfil som bara innehåller uppgifterna för dem vilkas BMI överstiger 30. När man startar programmet skall det från kommandofönstret (via System.in) läsa in namnet på den befintliga filen och namnet på den nya filen. Om någon av filerna inte går att öppna skall programmet ge en lämplig felutskrift (med ev. filnamn) och avslutas. Tips. Om man misslyckas med att öppna en fil får man en IOException. (12 p)

- 4 - Uppgift 5) Standardklassen String har som du vet egenskapen att det inte går att ändra ett visst String-objekt. Varje gång man vill lägga en text i ett String-objekt skapas det ju et nytt objekt. Detta kan förstås vara lite ineffektivt om man arbetar med texter som skall ändras ofta. I Java finns emellertid även klasserna StringBuilder och StringBuffer. Objekt av dessa klasser innehåller också texter men texterna är ändringsbara. I denna uppgift skall du skriva en egen (kraftigt förkortad) version av klassen StringBuilder. Din klass skall heta MyStringBuilder. I din klass skall texten lagras i en intern array med komponenter av typen char. (Du får inte lagra texten som en String.) Antalet komponenter i arrayen kallas kapaciteten. I arrayen kan man lagra texter vilkas längd inte överskrider kapaciteten. Om man försöker lagra en längre text skall kapaciteten automatiskt ökas (vi återkommer till detta). I klassen MyStringBuilder skall det finnas två konstruktorer: Den första skall vara parameterlös och när den används skall den initiera det nya objektet så att kapaciteten blir lika med 16. Den andra konstruktorn skall ha en parameter av typen String. När denna konstruktor används skall kapaciteten bli lika med parameterns längd plus 16. Dessutom skall den text som finns i parametern placeras i början av den interna arrayen. Förutom konstruktorerna skall klassen MyStringBuilder ha följande metoder: - length(), ger längden av den text som finns i objektet, - capacity(), ger objektets kapacitet, - ensurecapacity(k), utökar (om så behövs) objektets kapacitet så att den blir större än eller lika med k. Kapaciteten skall (ev. upprepade gånger) fördubblas tills villkoret är uppfyllt. - insert(p,s), skjuter in texten s (en String) med början i position p (en int), utökar kapaciteten om så behövs. Skall kontrollera att p är större än eller lika med noll och mindre än eller lika med length(). Om så inte är fallet skall en exception av standardklassen IndexOutOfBounds genereras. Om p är mindre än length() måste en del av den tidigare texten förskjutas för att bereda plats för s. - substring(p,m), ger som resultat en String som består av tecknen i positionerna p till m-1. Om p eller m är negativa eller större än length() eller om p > m så skall en exception av standardklassen IndexOutOfBounds genereras. - append(s), lägger till texten s (en String) sist, utökar kapaciteten om så behövs. - tostring, returnerar texten i objektet som en String. Tips: Några metoder blir väldigt enkla om du är smart och utnyttjar annat du gjort. (14 p)

- 5 - Uppgift 6) Uppgiften är att skriva ett program som visar ett virtuellt tangentbord på skärmen, dvs ett program som visar en massa knappar vilka fungerar som ett vanligt tangentbord. När du kör ditt program skall det se ut som i följande figur (den nedersta långa knappen är mellanslag). Ovanför knapparna skall den inmatade texten visas. När man trycker på en av knapparna läggs dess tecken till i slutet av texten. Det går inte att sudda det som redan står i texten och det skall inte gå att skriva eller förändra texten på något annat sätt än genom att trycka på knapparna. Det finns många knappar för att uppgiften inte skall gå att lösa med klipp-och-klistra-programmering. Försök istället hitta en mer strukturerad lösning, som inte är beroende av antalet knappar. Lösningar som innehåller och så gör vi alla de andra knapparna på samma sätt, och så vidare,... eller liknande kommer inte att godkännas, utan du måste skriva ut hela din lösning. (12 p)

Lösningar till tentamen 2016-02-13 // Uppgift 1 a rad 5: skall stå extends, inte implements. Ett gränssnitt kan utöka ett annat, dvs. lägga till fler krav, inte implementera det, dvs. innehålla hela metoder. rad 15: Det får inte stå extends C eftersom C är ett gränssnitt, inte en klass rad 16: Tilldelningen till k är felaktigeftersom k har egenskapen final. rad 17: Metoden m4 måste antingen deklareras som abstrakt eller innehålla en metodkropp. // Uppgift 1 b Vehicle v = new Car(); // ok Vehicle v = new Suv(); // ok Vehicle v = new Vehicle(); // Vehicle is abstract; cannot be //instantiated Car c = new Suv(); // ok Car c = new Vehicle(); // Vehicle is abstract; cannot be //instantiated Suv s = new Suv(); // ok Suv s = new Car(); // incompatible types // Uppgift 1 c Om två intilliggande element båda innehåller värdet 0 kommer det andra av dessa element inte att tas bort. Ett sätt att lösa det är att gå igenom listan baklänges. // Uppgift 2 public class Tarning { private int värde; public Tarning() { kasta(); public Tarning(int v) { sättvärde(v); public int avläsvärde() { return värde; public void sättvärde(int v) { if (v >= 1 && v <= 6) värde = v; else throw new IllegalArgumentException(); 1

public void kasta() { värde = (int) (Math.random() * 6) + 1; // Uppgift 3 public static String crypt(string mes, String key, boolean decrypt) { int j = 0; String r = ""; for (int i=0; i<mes.length(); i++) { int m = mes.charat(i) - A ; int k = key.charat(j) - A ; j = (j+1) % key.length(); int n; if (decrypt) n = (26 + m - k) % 26; else n = (m + k) % 26; r += (char)(n + A ); return r; // Uppgift 4 import java.io.*; import java.util.*; public class BMI { public static void main(string[] arg) { System.out.println("Namnet på den befintliga filen? "); Scanner sc = new Scanner(System.in); String namn1 = sc.nextline(); System.out.println("Namnet på den nya filen? "); String namn2 = sc.nextline(); try { sc = new Scanner(new File(namn1)); catch (IOException e) { System.out.println("Kan inte öppna filen " + namn1); System.exit(1); PrintWriter utström = null; try { utström = new PrintWriter(new BufferedWriter(new FileWriter(namn2))); catch (IOException e) { System.out.println("Kan inte skapa filen " + namn2); System.exit(2); 2

while(sc.hasnext()) { String rad1 = sc.nextline(); int ålder = sc.nextint(); int längd = sc.nextint(); double vikt = sc.nextdouble(); sc.nextline(); // avsluta rad 2 double bmi = vikt / (0.01*längd*0.01*längd); if (bmi > 30) { utström.println(rad1); utström.println(ålder + " " + längd + " " + vikt); utström.close(); // Uppgift 5 public class MyStringBuilder { private char[] b; private int n = 0; // arrayen med texten // längden public MyStringBuilder() { b = new char[16]; public MyStringBuilder(String s) { n = s.length(); b = new char[n + 16]; for (int i=0; i<n; i++) b[i] = s.charat(i); public int length() { return n; public int capacity() { return b.length; public void ensurecapacity(int k) { int cap = b.length; // beräkna ny kapacitet while (cap < k) cap *= 2; // skapa nytt fält om kapaciteten behövde utökas if (b.length < k) { char[] b2 = new char[cap]; // skapa en ny array for (int i=0; i<b.length; i++) // kopiera tidigare text b2[i] = b[i]; b = b2; 3

public void insert(int p, String s) { int d = s.length(); if (p < 0 p > n) throw new IndexOutOfBoundsException(); ensurecapacity(n+d); for (int i=n-1; i>=p; i--) b[i+d] = b[i]; for (int i=0; i<d; i++) b[p+i] = s.charat(i); n += d; public void append(string s) { insert(n, s); // förskjut tidigare text d steg // åt höger // lägg in ny text public String substring(int p, int m) { if (p < 0 p > n m < 0 m > n p > m) throw new IndexOutOfBoundsException(); String s = ""; for (int i=p; i<m; i++) s += b[i]; return s; @Override public String tostring() { return substring(0, n); // Alternativ version som använder fler standardmetoder class MyStringBuilder2 { private char[] b; private int n = 0; // arrayen med texten // längden public MyStringBuilder2() { b = new char[16]; public MyStringBuilder2(String s) { n = s.length(); b = new char[n + 16]; s.getchars(0, n, b, 0); // kopiera från s till b public int length() { return n; 4

public int capacity() { return b.length; public void ensurecapacity(int k) { int cap = b.length; // beräkna ny kapacitet while (cap < k) cap *= 2; // skapa nytt fält om kapaciteten behövde utökas if (b.length < k) { char[] b2 = new char[cap]; // skapa ny array System.arraycopy(b, 0, b2, 0, b.length); b = b2; // kopiera från // b till b2 public void insert(int p, String s) { int d = s.length(); if (p < 0 p > n) throw new IndexOutOfBoundsException(); ensurecapacity(n+d); System.arraycopy(b, p, b, p+d, n-p); // förskjut tidigare text // d steg åt höger s.getchars(0, d, b, p); // lägg in ny text n += d; public void append(string s) { insert(n, s); public String substring(int p, int m) { if (p < 0 p > n m < 0 m > n p > m) throw new IndexOutOfBoundsException(); return new String(b, p, m-p); @Override public String tostring() { return new String(b, 0, n); // Uppgift 6 import java.awt.*; import java.awt.event.*; import javax.swing.*; 5

public class Tangentbord extends JFrame implements ActionListener { private final String[] b = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "Å", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Ö", "Ä", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "-"; private JLabel output = new JLabel(" "); public Tangentbord() { setlayout(new BorderLayout()); add(output, BorderLayout.NORTH); JPanel buttons = new JPanel(new GridLayout(4, 11)); for (int i = 0; i < b.length; i++) { JButton tmp = new JButton(b[i]); tmp.addactionlistener(this); buttons.add(tmp); add(buttons, BorderLayout.CENTER); JButton tmp = new JButton(" "); tmp.addactionlistener(this); add(tmp, BorderLayout.SOUTH); pack(); setdefaultcloseoperation(exit_on_close); setvisible(true); public void actionperformed(actionevent e) { JButton jb = (JButton) e.getsource(); output.settext(output.gettext() + jb.gettext()); public static void main(string[] arg) { new Tangentbord(); 6