Algoritmo

turtle87crociato
La posto qui perchè mi pare sia più una questione di matematica (e precisamente di algebra booleiana) che di informatica. In ogni caso i moderatori spostino pure il thread (non glielo devo dire io, ma vabbè).

Si tratta di capire, date tre variabili A, B, C indicanti i lati di un triangolo, se il triangolo stesso sia isoscele, equilatero, scaleno.

Io ho provato con tre condizioni indipendenti tra sé (avrei potuto anche considerare il triangolo equilatero come caso particolare di triangolo equilatero, ma non sapevo come implementare), perchè ho voluto agire senza annidamenti (ho preferito non andare oltre il punto del programma cui sono arrivato.

Ho quindi considerato la prima condizione (quella del triangolo isoscele):

Quindi, identificando con x la condizione atomica A=B, con y B=C e con z A=C, sono arrivato a scrivere la seguente condizione:

Ho pensato alla soluzione più semplice "Se x OR y OR z", ma non riuscivo a distinguere i casi in cui il triangolo fosse equilatero o isoscele.
Ho pensato a quella più complessa, con l' XOR
"Se (x AND "y negato") XOR (y AND "x negato") XOR (z and "x negato")", ma osservando le tabelle di verità escono comunque quattro casi di verità (contro i tre che mi dovrebbero uscire), e questo perchè contempla ancora il caso particolare di triangolo isoscele che è il triangolo equilatero.

In sostanza la domanda è: qualcuno mi saprebbe suggerire un'unica condizione tramite la quale scrivere a video, in caso di verità di essa, che il triangolo sia isoscele e non anche equilatero?
O meglio, esiste questa condizione? O devo ricorrere per forza agli annidamenti di condizioni?

Risposte
adaBTTLS1
io, letto così, penso "y negato" come "NON y"
ma che significati dai ai valori booleani? (x AND "y negato") lo fai equivalere a "A diverso da B"? no, perché c'è anche (y AND "x negato")....
insomma, quella frase come si legge in "linguaggio naturale"?
senza questo chiarimento, non so darti un'interpretazione.
ciao.

turtle87crociato
Io avevo pensato all' operatore logico XOR (all'inizio serve solo capire la logica, non programmare).
Quindi tutto ciò che riguarda il triangolo isoscele, io l'avevo scritto così:
(x AND "y negato") XOR (y AND "x negato") XOR (z and "x negato")
Non so se va bene, sinceramente, ma pare che riesca a esprimere un po' tutti i casi in un'unica espressione.
Che ne pensi ada?

adaBTTLS1
se hai un ordine con cui confronti i lati, se vuoi evitare di "annidare", i casi sono addirittura 5:
$[(x=y)^^(x=z)]=>"equilatero"$
$[(x=y)^^(x!=z)]=>"isoscele"$
$[(x!=y)^^(x=z)]=>"isoscele"$
$[(x!=y)^^(x!=z)^^(y=z)]=>"isoscele"$
$[(x!=y)^^(x!=z)^^(y!=z)]=>"scaleno"$

ce n'è qualcuno di troppo?
ciao.

turtle87crociato
Beh, non volevo annidare perchè al punto del corso in cui siamo arrivati non abbiamo ancora affrontato gli annidamenti (so che esistono però). Volevo vedere se riuscivo a fare un buon algoritmo senza annidamenti, perchè comunque l'esercizio è stato proposto a questo punto del corso. O meglio, volevo verificare che non se ne potesse fare a meno.

Raptorista1
non capisco perché non vuoi annidare:

se (x=y)
allora
[
se (y=z) è equilatero
altrimenti
è isoscele
]
altrimenti è scaleno

elgiovo
Secondo me qualcosa lo devi "annidare", perchè una singola espressione booleana può risultare in $0$ o in $1$, mentre i possibili esiti sono tre. In sostanza, hai bisogno di un "contatore" che sia aggiornato sul numero di confronti andati a buon fine.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.