// Lösningar till övningstenta 3 // Uppgift 1a Rätt alternativ är b eftersom instansvariabeln list har värdet null. // Uppgift 1b Eftersom listan innehåller tre referenser vilka alla pekar på samma objekt blir utskriften: 1 1 1 // Uppgift 1c Utskrift: olika lika sa, sb och sc är referenser till String-objekt och det är referenserna som jämförs i if-satserna, inte det de refererar till. På andra raden tilldelas referensen sa till referensen sb. Dessa referenser är således lika. På tredje raden skapas först ett nytt String-objekt som referar till texten "abc". Därefter skapas ytterligare ett nytt String-objekt som kommer att referera till texten "ABC". Referensen till detta objekt tilldelas till sc, som alltså refererar till ett annat String-objekt än sa och sb. // Uppgift 2 import java.io.*; public class Find { public static void main(String[] arg) throws IOException { if (arg.length != 3) { System.out.println("Felaktigt antal argument " + arg[0]); System.exit(0); } BufferedReader r = null; try { r = new BufferedReader(new FileReader(arg[0])); } catch (IOException e) { System.out.println("Kan inte öppna filen " + arg[0]); System.exit(0); } PrintWriter w = null; try { w = new PrintWriter(new BufferedWriter(new FileWriter(arg[1]))); } catch (IOException e) { System.out.println("Kan inte skapa filen " + arg[1]); System.exit(0); } while (true) { String s = r.readLine(); if (s == null) break; if (s.indexOf(arg[2]) >= 0) w.println(s); } r.close(); w.close(); } } // Uppgift 3 public class Verktyg { // deluppgift a public static int platsFör(int k, int n) { if (k == n) // klarar även k==0, n==0 return 0; for (int i=0; n>0; n/=10, i++) if (n%10 == k) return i; return -1; // fanns ej } //deluppgift b public static int[] innehåller(int k, int n) { // ger {plats, antal} if (k == n) return new int[] {0,1}; // klarar även k==0, n==0 int[] resultat = new int[] {-1,0}; for (int i=0; n>0; n/=10, i++) if (n%10 == k) { resultat[1]++; if (resultat[0] < 0) resultat[0] = i; } return resultat; } } // Uppgift 4 public class ProduktId { private static int antal; // antal hittills private static int nr; // senaste id-nummer private String namn; // denna produkts namn private int id; // denna produkts id-nummer ProduktId (String namn) { this.namn = namn; nr++; // prova med nästa nummer while (true) { int i4 = Verktyg.platsFör(4, nr); int i7 = Verktyg.platsFör(7, nr); if (i4 < 0 && i7 < 0) break; // inga 4:or eller 7:or if (i4 >= 0) nr += Math.pow(10, i4); if (i7 >= 0) nr += Math.pow(10, i7); } id = nr; antal++; } public int avläsId() { return id; } public String avläsNamn() { return namn; } public static int avläsAntal() { return antal; } } // Uppgift 5 import java.io.*; import java.util.*; class ObsProgram { public static void main(String[] arg) throws IOException { List l = new ArrayList<>(); Scanner fil = new Scanner(new File("obs.txt")); while (fil.hasNext()) { Observation obs = new Observation(); obs.nr = fil.nextInt(); obs.tid.tim = fil.nextInt(); obs.tid.min = fil.nextInt(); obs.temp = fil.nextDouble(); obs.vindhast = fil.nextDouble(); obs.vindrikt = fil.nextInt(); l.add(obs); } Collections.sort(l); for (Observation ob : l) System.out.println(ob.nr + " " + ob.tid + " " + ob.temp); Collections.sort(l,new JfrObs()); for (Observation ob : l) System.out.println(ob.nr + " " + ob.tid + " " + ob.temp); } } class JfrObs implements Comparator { public int compare(Observation o1, Observation o2) { if (o1.nr < o2.nr) return -1; else if (o1.nr == o2.nr) return o1.tid.compareTo(o2.tid); // i andra hand efter tid else return 1; } } // Uppgift 6 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Simhopp extends JFrame implements ActionListener { JPanel topPanel = new JPanel(); JPanel bottomPanel = new JPanel(); JTextField[] points = new JTextField[7]; JTextField diffField = new JTextField(5); JLabel finalPoint = new JLabel("----"); JButton resetButton = new JButton("Nytt hopp"); JButton resultButton = new JButton("Beräkna resultat"); public Simhopp() { add(topPanel, BorderLayout.NORTH); add(bottomPanel, BorderLayout.SOUTH); topPanel.setLayout(new GridLayout(1,7,3,3)); for (int i=0; i<7; i++) { points[i] = new JTextField(" "); topPanel.add(points[i]); } bottomPanel.setLayout(new FlowLayout()); bottomPanel.add(new JLabel("Svårighetsgrad: ")); bottomPanel.add(diffField); bottomPanel.add(new JLabel("Hoppets poäng: ")); bottomPanel.add(finalPoint); bottomPanel.add(resetButton); bottomPanel.add(resultButton); resetButton.addActionListener(this); resultButton.addActionListener(this); setSize(500,100); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { if (e.getSource() == resetButton) { for (int i=0; i<7; i++) { points[i].setText(" "); points[i].setEnabled(true); } finalPoint.setText("----"); diffField.setText(" "); } else if (e.getSource() == resultButton) { double diff = Double.parseDouble(diffField.getText()); java.util.List l1 = new LinkedList<>(); for (int i=0; i < 7; i++) { l1.add(Double.parseDouble(points[i].getText())); points[i].setEnabled(false); } java.util.List l2 = new LinkedList<>(l1); Collections.sort(l2); l2 = l2.subList(2,5); int k = 0; for (int i = 0; k<3 && i<7; i++) if (l2.contains(l1.get(i))) { k++; points[i].setEnabled(true); } double sum = 0; for (Double x: l2) sum += x; finalPoint.setText(String.format(Locale.US, "%1.2f", sum * diff)); } } public static void main (String[] arg) { new Simhopp(); } }