- Codice:
int sub(Set *A, Set *B);
e la struttura Set, che rappresenta insiemi di soli caratteri, andava definita come segue:
- Codice:
struct Set
{
char *p
int n;
}
dove p è il puntatore ai caratteri (non è stato imposto di usare stringhe o array di caratteri) ed n rappresenta la cardinalità dell'insieme. Un altro cavillo riguarda i caratteri ASCII non stampabili: andrebbero inclusi o scartati? Io seguendo la filosofia KISS (Keep It Simple Stupid) ho ignorato la questione, ossia "ogni carattere è valido". Un insieme vuoto è così definito:
- Codice:
Set empty = {NULL, 0};
dunque se p = NULL allora l'insieme è vuoto.
Su prototipi e tipi di variabile non c'era possibilità di scelta, anche se per esempio un unsigned long per la cardinalità sarebbe stato meglio.
Per la funzione ricorsiva int sub(Set *A, Set *B) è richiesto l'uso della funzione app. In questo caso non saprei come implementare ricorsivamente la funzione:
- Codice:
//non si esclude A = B
int sub(Set *A, Set *B)
{
//soliti controlli sui parametri
//se un elemento di A non appartiene a B, A non e' sottoinsieme di B
if(condizione con chiamata ad app)
{
return 0;
}
else
{
//chiamata a sub
}
}
L'idea sarebbe questa, di più non sono riuscito a fare per questa funzione infatti l'ho scritta in versione iterativa durante la prova.
Modifica: corretto il prototipo della funzione app.