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 un elemento della lista alla 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 removeAt (int i) throws ListException
 

public void removeAt(int i) throws ListException
{
  if(isEmpty())
     throw new ListException("lista con elementi insufficienti");

   if (i == 1 && first != null)
       { first = first. getNext(); size --; return;}

   ListNode nodo = first; ListNode prima = null;
   int position = 1;
   while ((position < i) && (nodo.getNext()!= null))
      {position ++; prima = nodo; nodo = nodo.getNext();}
   if (position < i)
      throw new ListException("lista con elementi insufficienti");
   prima. setNext(nodo. getNext());
   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 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 eliminare tutti i caratteri alfabetici dai 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

"  &%$£"/())=?"

Si noti che non devono essere cancellati gli spazi bianchi. 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 carratere alla volta
 // e non si leggono linee o l'intero file

        if (ch >= 'a' && ch <= 'z'  || ch >= 'A' && ch <= 'Z') continue;

 // solo i caratteri non alfabetici passano in uscita
        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 tOR = new JTextField("True");
JTextField tAND = new JTextField("True");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Bottoni e AND e OR");
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 due oggetti di tipo bottone, considerando che gli stati possibili di un bottone sono True e False. Per ogni bottone, si parte da stato True e ogni pressione cambia lo stato. Quindi, la prima pressione di un bottone cambia lo stato in False, la seconda lo riporta true, ecc.

Il componente deve realizzare la visualizzazione delle funzioni OR logico e AND logico dei due stati correnti dei bottoni. Il testo che riporta il valore della funzione logica OR deve partire da un valore iniziale True, poi, ad ogni pressione deve tenere conto dello stato dei diversi bottoni. Lo stesso per la funzione AND.

Inoltre, facoltativamente, si consideri la possibilità di fornire un numero variabile di bottoni, passandone il numero come argomento di invocazione del programma che rappresenta il componente.
 

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");
  JTextField tOR = new JTextField("OR True", 15);
  JTextField tAND = new JTextField("AND True", 15);

  JTextField t1 = new JTextField("True", 10);
  JTextField t2 = new JTextField("True", 10);

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

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

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

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

    System.out.println (" Bottone AND OR");
    System.out.println (" Bottoni " + s1 + " " + s2 + "\n");
    if (s1 && s2)
        tAND.setText("AND true");
    else tAND.setText("AND false");
    if (s1 || s2)
       tOR.setText("OR true");
    else tOR.setText("OR false");

 }
}
 
 

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

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

Per la realizzazione facoltativa, si veda la soluzione per il compito numero 1. Si facciano gli opportuni cambiamenti.