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 la eliminazione di tutti i nodi della lista che puntano ad elementi uguali ad un elemento passato come parametro: è possibile che, se più nodi puntano ad elementi dello stesso valore, il metodo elimini molti nodi della lista.

Si consideri la relazione di uguaglianza opportuna (equals e non ==) per verificare la condizione di estrazione.

Il metodo abbia la interfaccia: public void removeItems(Object o)
 

public void removeItems(Object o)
{if (first == null) return;

   if (first. getItem(). equals (o))
    {first = first. getNext ();   size--;   return;}

   ListNode nodo = first; ListNode prima = null;
   while (nodo.getNext() != null)
   {
      if (nodo. getItem ().equals(o) )
          {prima. setNext(nodo. getNext());  size--; }
      prima = nodo; nodo = nodo. getNext();
    }
}
 

Si noti che la lista deve esere scorsa tutta: per ogni elemento trovato uguale come oggetto puntato al parametro (la uguaglianza è data con il metodo equals), si deve togliere il nodo trovato. Si vede che si sono usati due puntatori, uno all'elemento da eliminare (nodo) e l'altro al precedente (prima).
Poi si continua a scorrere la lista.
Sono distinti il caso di primo elemento e di lista vuota (non considerato eccezione).
 

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 maiuscoli in minuscoli nel 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 maiuscoli sono 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");
JButton b2 = new JButton("Bottone 3");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Bottoni al momento: PARI");
frame.setBounds(200, 100, 208, 180);
frame.setResizable(false);
Container c = frame.getContentPane();
c.add(panel);

frame.show();
}
}

Si consideri un componente che deve gestire tre bottoni. I bottoni sono associati ad uno stato interno che tiene traccia del numero delle pressioni, discriminando i valori pari e dispari.

Obiettivo del componente grafico è segnalare lo stato dei bottoni: in particolare, sono di interesse le situazioni in cui tutti i bottoni hanno ricevuto un numero pari o dispari di pressioni. Inizialmente, il numero di pressioni per tutti i bottoni è pari; questa situazione, di tutti i bottoni pari, viene segnalata nel (titolo del) frame. Per ogni pressione di un bottone, si deve considerare la variazione del numero di pressioni.

Quando i bottoni si trovano tutti nello stesso stato (o tutti pari o tutti dispari) si deve cambiare il titolo del frame corrispondentemente. Se i bottoni non sono concordi, il titolo del frame deve segnalarlo ("Bottoni NON concordi").

Inoltre, facoltativamente, si consideri la possibilità di fornire una visualizzazione del numero di pressioni per ciascun bottone.
 

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"); JTextField t1 = new JTextField("0", 5);
  JButton b2 = new JButton("Bottone 2"); JTextField t2 = new JTextField("0", 5);
  JButton b3 = new JButton("Bottone 3"); JTextField t3 = new JTextField("0", 5);

  JPanel panel = new JPanel();

    EsameFrame frame= new EsameFrame("Bottoni concordi: al momento PARI",
      b1, b2, b3, t1, t2, t3);
    Container c = frame.getContentPane();
     c.add(panel);
    panel.add(b1); panel.add(t1);
    panel.add(b2); panel.add(t2);
    panel.add(b3); panel.add(t3);

    b1.addActionListener (frame);
    b2.addActionListener (frame);
    b3.addActionListener (frame);
    frame.addWindowListener(new Terminator ());
    frame.show();
 }
}
 
 

class EsameFrame extends JFrame implements ActionListener {
  private int s1 = 0, s2 = 0, s3 = 0, somma;
  private JTextField t1, t2, t3;
  private JButton b1, b2, b3;

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

 public void actionPerformed(ActionEvent e){
    if (e.getSource() == b1)
    { System.out.println (" Bottone 1\n");
      s1 ++;
      t1.setText ("Vale" + s1);
    }
    if (e.getSource() == b2)
    {  System.out.println (" Bottone 2\n");
      s2 ++;
      t2.setText ("Vale" + s2);
    }
    if (e.getSource() == b3)
    { System.out.println (" Bottone 3\n");
      s3 ++;
      t3.setText ("Vale" + s3);
     }

    System.out.println (" Bottoni " + s1 + " " + s2 + " " + s3 + "\n");
    if (s1%2 == 0 &&  s2%2 == 0  && s3%2 ==0)
        setTitle("Bottoni concordi: al momento PARI");
    else if (s1%2 == 1 &&  s2%2 == 1  && s3%2 == 1)
             setTitle("Bottoni concordi: al momento DISPARI");
    else setTitle("Bottoni NON concordi");
 }
}
 
 

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

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){}
}

Si considerino anche soluzioni alternative per la visualizzazione di un intero come stringa (o di un reale, ecc).