PDA

View Full Version : [C++] Evitare ripetizioni nell'if ...


pixie
13-02-2010, 19:37
Salve.
Ho un if di questo tipo:
if(cognome[ind1] == 'a' || cognome[ind1] == 'e' ||cognome[ind1] == 'o' || cognome[ind1] == 'u' ... ) // per tutte le vocali

Com'è possibile evitare di continuare a ripetere 'cognome[ind1] == ... ' ??

Ho provato a fare questo ma pur non dandomi errori di sintassi non mi da il risultato voluto.
if(cognome[ind1] == 'a' || 'e' || 'o' || 'u' ... )

Può aiutarmi un costruttore di tipo enum?
Non so ditemi voi cosa è meglio.
A presto!
Grazie!

il-pollo
13-02-2010, 21:17
una soluzione per accorciare soltanto la lunghezza del codice può essere
char c = cognome[ind1];
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ){...}
un'altra soluzione può essere quella di creare una funzione booleana che, dato un carattere, determina se è una vocale

DanieleC88
13-02-2010, 23:45
Una funzione. O una macro:
#define isvowel(c) ((c) == 'a' || (c) == 'e' || (c) == 'i' || (c) == 'o' || (c) == 'u')

/*
* [...]
*/

if (isvowel(cognome[ind1])) {
faiQualcosaDiUtile();
}

marco.r
14-02-2010, 11:32
Una funzione. O una macro:
#define isvowel(c) ((c) == 'a' || (c) == 'e' || (c) == 'i' || (c) == 'o' || (c) == 'u')

/*
* [...]
*/

if (isvowel(cognome[ind1])) {
faiQualcosaDiUtile();
}

Eviterei di usare una macro quando si puo' fare lo stesso con una funzione.
Inoltre userei una variabile temporanea. Evita la valutazione dell'operator[] piu' di una volta.

pixie
14-02-2010, 11:43
grz mille delle risposte! ... la soluzione di il-pollo credo sia la migliore ma già avevo pensato d fare come lui... il fatto è ke cercavo qlcs di più sintetico...
ok dai vedo cosa inventarmi :) ... grz e a presto!

DanieleC88
14-02-2010, 11:54
Eviterei di usare una macro quando si puo' fare lo stesso con una funzione.
Inoltre userei una variabile temporanea. Evita la valutazione dell'operator[] piu' di una volta.

Infatti il primo suggerimento era “Una funzione.”, ma magari così esplora anche il mondo delle macro.

nuovoUtente86
14-02-2010, 12:25
Anche se in questo caso è una soluzione eccessiva, potresti pensare ad una mappa di puntatori a dei funtori.

banryu79
15-02-2010, 08:56
Infatti il primo suggerimento era “Una funzione.”, ma magari così esplora anche il mondo delle macro.
Le macro sono IL male :ciapet:

Noixe
16-02-2010, 11:02
char vocali[] = {'a', 'e', 'i', 'o', 'u'};
bool vocale = false;

for (int i = 0; i < 5; i++)
if (cognome[ind1] == vocali[i])
vocale = true;


Se vocale è rimasta false allora cognome[ind1] non è una vocale, se è diventata true vuol dire che è una vocale.

marco.r
16-02-2010, 13:47
Infatti il primo suggerimento era “Una funzione.”, ma magari così esplora anche il mondo delle macro.
Si', ma non ha senso esplorare le macro per quelle cose che si fanno normalmente per le funzioni. Meglio lasciarle per quelle dove servono informazioni che si hanno solo a tempo di compilazione (e.g. header guards, salvataggio numero di linea, embedding di un argomento in una stringa ... )