Liste

Dato il codice per una lista semplicemente linkata (con le classi per la lista e per i nodi che puntano ad oggetti qualunque), con la lista che conta gli elementi contenuti:

listeEsame.zip

Si scriva il codice di un metodo che produca l’inserimento di un nuovo nodo (con un nuovo elemento specificato come oggetto) dopo la posizione i-esima nella lista.

Si consideri il primo elemento (puntato da first) di posizione 1. In caso la posizione non sia presente e l’inserimento non sia possibile, si deve generare la eccezione ListException.

Il metodo abbia la interfaccia: public void insertAt (Object oggetto, int i) throws ListException
 

public void insertAt (Object o, int i) throws ListException
{int position = 1;
   ListNode nodo = first;

    while ((position < i) && (nodo.getNext()!= null))
      {nodo = nodo.getNext(); position++;}

    if (position < i)
      throw new ListException("lista con elementi insufficienti");

    ListNode nuovoNodo = new ListNode(o, this);
    nuovoNodo. setNext(nodo.getNext());
     if (i == 1) first = nuovoNodo;
    else nodo.setNext(nuovoNodo);
    size++;
}

Si noti che si deve scandire la lista fino alla posizione desiderata: se non esiste si lancia la eccezione richiesta.
In caso la posizione si sia trovata, allora si inserisce l'elemento stesso.
Si noti la differenza fra la rimozione alla prima posizione o in altre.
 
 

Filtri

Scrivere un filtro che prenda l'ingresso da System.in e ponga la propria uscita oltre a System.out su un file di uscita fornito come argomento di invocazione (si controlli che la invocazione avvenga con il numero corretto di argomenti).

Il filtro deve filtrare il file di ingresso considerando che si vogliono trasformare i caratteri minuscoli in maiuscoli sui file di uscita. Si noti che il file di ingresso può essere costituito da un numero qualunque di linee, fino alla fine del file.

Ad esempio, il filtro, invocato con argomento fileout.txt, deve trasformare i caratteri forniti da console:

"Esame di Fondamenti di Informatica A II" in

"ESAME DI FONDAMENTI DI INFORMATICA A II"

Il risultato dell'elaborazione deve essere scritto sia su System.out che su fileout.txt.
 

package filtro;

import java.io.*;

public class Filtro {

  public static void main(String[] args) {
  int totale=0;
    if (args.length != 1)  {
       System.out.println("Problemi di argomenti\n sono" + args.length);
       System.exit(1);
    }
    FileWriter file = null;
    try {
       file = new FileWriter (args[0]);
        }
    catch (IOException e) {
      System.out.println("Errore. Problema nella apertura file.");
      System.exit(2);
      }
    filtra (file);
    System.exit(0);
  }
 
 

  public static void filtra(FileWriter file) {
    InputStreamReader in = new InputStreamReader(System.in);
    OutputStreamWriter out = new OutputStreamWriter(System.out);
    int x;  boolean statoMaiuscolo = false;
    try {
      while ((x = in.read()) >= 0) {
        char ch = (char) x;
        if (ch == '\n') {out.flush();}
 // notate che si esamina un carattere alla volta
 // e non si leggono linee o l'intero file

        if (ch >= 'a' && ch <= 'z') ch += - 'a' + 'A';

 // solo i caratteri minuscoli sono stati cambiati
 // tutti gli altri inalterati

        out.write(ch); file.write (ch);

        }
    }
    catch (IOException e) {
      System.out.println("Errore. Problema nella scrittura ");
      System.exit(3);
      }

    try { out.close(); file.close ();}
    catch (IOException e) {
      System.out.println("Errore. Problema in chiusura");
      System.exit(4);
      }
  }
}
 
 
 
 
 
 

Componenti grafici

Dato il seguente codice:

public class Esame1 {

public static void main(String args[]) {

JButton b1 = new JButton("Bottone 1");
JButton b2 = new JButton("Bottone 2");
JTextField t1 = new JTextField("OFF");
JTextField t2 = new JTextField("OFF");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Frame con Bottoni/Testi");
frame.setBounds(200, 100, 208, 180);
frame.setResizable(false);
Container c = frame.getContentPane();
c.add(panel);

frame.show(); }
}

Si consideri che l'applicazione deve gestire due oggetti bottone. Ogni bottone è associato ad un testo che si occupa di visualizzare lo stato corrente del bottone, considerando che gli stati possibili di un bottone sono OFF e ON.

Per ogni bottone, si parte da stato OFF e ogni pressione cambia lo stato, segnalandolo anche nel campo testo. Quindi, la prima pressione di un bottone deve segnalare nel testo corrispondente al bottone lo stato ON, la successiva lo stato OFF, ecc.

Quando i bottoni (e i testi) sono tutti in stato ON, si deve cambiare il titolo del frame a: "Tutti i Bottoni a ON".

Inoltre, facoltativamente, si consideri la possibilità di fornire un numero variabile di bottoni (e testi) passandone il numero come argomento di invocazione.
 

La soluzione prevede di avere il frame come unico listener per tutti gli eventi.

package esame2;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
 

public class Esame2 {

public static void main(String args[]) {
  JButton b1 = new JButton("Bottone 1");
  JButton b2 = new JButton("Bottone 2");
  JButton b3 = new JButton("Bottone 3");
  JTextField t1 = new JTextField("OFF");
  JTextField t2 = new JTextField("OFF");

   JPanel panel = new JPanel();
    EsameFrame frame= new EsameFrame("Frame per Bottoni e Label",
      b1, b2, t1, t2);
    Container c = frame.getContentPane();
     c.add(panel);
    panel.add(b1); panel.add(t1);
    panel.add(b2); panel.add(t2);
    b1.addActionListener (frame);
    b2.addActionListener (frame);
    frame.addWindowListener(new Terminator ());
    frame.show();
 }
}
 
 

class EsameFrame extends JFrame implements ActionListener {
  private boolean s1 = false, s2 = false;
  private JTextField t1, t2;
  private JButton b1, b2;

 public EsameFrame (String t, JButton b1, JButton b2,
    JTextField t1, JTextField t2) {
  super(t);
  setBounds(200, 100, 400, 300);
//  this.setResizable(false);
  this. t1 = t1; this. t2 = t2;
  this. b1 = b1; this. b2 = b2;
  }

 public void actionPerformed(ActionEvent e){
    if (e.getSource() == b1)
    { System.out.println (" Bottone 1\n");
      s1 = !s1;
      if (s1) t1.setText ("ON"); else t1.setText("OFF");
    }
    if (e.getSource() == b2)
    {  System.out.println (" Bottone 2\n");
      s2 = !s2;
      if (s2) t2.setText ("ON"); else t2.setText("OFF");
    }

    System.out.println (" Bottoni " + s1 + " " + s2 + "\n");
    if (s1 && s2)
        setTitle("  ON di tutti ");
    else setTitle("Frame per Bottoni e Label");

 }
}
 
 

//----------------------------

class Terminator implements WindowListener {
  public void windowClosed(WindowEvent e){}
 public void windowClosing(WindowEvent e){ System.exit(0); }
 public void windowOpened(WindowEvent e){}
 public void windowIconified(WindowEvent e){}
 public void windowDeiconified(WindowEvent e){}
 public void windowActivated(WindowEvent e){}
 public void windowDeactivated(WindowEvent e){}
}
 

Quanto al facoltativo, si veda la implementazione seguente che prevede una invocazione del programma con un valore intero, che rappresenta il numero di elementi da considerare. Si noti la importanza di un linguaggio che consenta di istanziare un array decidendo la dimensione al momento della esecuzione e non in fase di dichiarazione.

package esame2;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
 

public class Esame2 {

public static void main(String args[]) {

 int i, n = 0;
 JButton butts [];
 JTextField txts [];

  if (args.length != 1)  {
       System.out.println("Necessario un argomento\n sono invece " + args.length);
       System.exit(1);
  }
  try {
       n = Integer.parseInt (args[0]);
       }
  catch (NumberFormatException e)
    {System.out.println ("Non valore giusto: non intero");
     System. exit (1);}

  butts = new JButton [n];
  txts = new JTextField [n];

  for (i=0; i < n; i++)
        { butts [i] = new JButton("Bottone " + i);
          txts[i]   = new JTextField("OFF");
        }

  JPanel panel = new JPanel();
  EsameFrame frame= new EsameFrame("Frame per Bottoni/Testo",
     butts, txts);
  frame.setBounds(200, 100, 208, 400);
/*  frame.setResizable(false); */
  Container c = frame.getContentPane();
  c.add(panel);

  for (i=0; i < n; i++)
  { panel.add(butts [i]);
    panel.add(txts[i]);
    butts[i].addActionListener (frame);
  }
  frame.addWindowListener(new Terminator ());
  frame.show();

 }
}
 
 

class EsameFrame extends JFrame implements ActionListener {
  private boolean states [];
  private JTextField txts[];
  private JButton butts[];
  int n;

 public EsameFrame (String t, JButton bs[], JTextField ts [])
{
  super(t);
/*  setBounds(200, 100, 210, 200);
  this.setResizable(false);    */
  n = bs.length;
  butts = new JButton [n];
  txts = new JTextField [n];
  states = new boolean [n];

  for ( int i = 0; i < n; i++)
  {this. txts [i]  = ts [i];
   this. butts [i] = bs [i];
  }
}

 public void actionPerformed(ActionEvent e){

  for (int i = 0 ; i < n; i++)
    if (e.getSource() == butts[i])
    { System.out.println (" Bottone " + i);
      states[i] = !states[i];
      if (states[i]) txts[i].setText ("ON"); else txts[i].setText("OFF");
    }

  for (int i = 0; i < n; i++)
    System.out.println (" Bottone " + i + " vale " + states[i]);

  if (andall (states))
        setTitle("  ON di tutti ");
  else setTitle("Frame per Bottoni/Testo");

 }

 private boolean andall (boolean v[])
 {for (int i = 0; i < v.length; i++)
    if (! v[i]) return false;
  return true;
 }
}
 
 

//----------------------------

class Terminator implements WindowListener {
  public void windowClosed(WindowEvent e){}
 public void windowClosing(WindowEvent e){ System.exit(0); }
 public void windowOpened(WindowEvent e){}
 public void windowIconified(WindowEvent e){}
 public void windowDeiconified(WindowEvent e){}
 public void windowActivated(WindowEvent e){}
 public void windowDeactivated(WindowEvent e){}
}