PDA

View Full Version : [C++] uppercase - conversione da lettere minuscole a maiuscole


mistergks
31-03-2011, 01:09
Uno dei mie tanti dubbi:
Ho un array con una serie di lettere minuscole.. vorrei creare una funzione che converta tutte le lettere minuscole in maiuscolo..
Avevo pensato a uno switch in cui mettere tutte le lettere dell'alfabeto e nel caso in cui la funzione trova quella lettera sarà presente in uno dei case dello switch e all'interno di questo case sarà presente uno scambio cosi ad esempio:


for(int i=0; array[i]!='\0'; i++){
switch(array[i]){
case 'a': array[i]='A';
break;
case 'b': array[i]='B';
break;
...
...
//e cosi' via....

}//switch
}//for


E' giusto questo algoritmo? C'è un ragionamento migliore e magari piu' efficiente?

tomminno
31-03-2011, 01:12
std::transform(text.begin(), text.end(), text.begin(), std::toupper);

GByTe87
31-03-2011, 09:51
Altrimenti giochi con la rappresentazione numerica del char sottraendogli una costante (controlla l'ascii table).

TRF83
31-03-2011, 15:34
Altrimenti giochi con la rappresentazione numerica del char sottraendogli una costante (controlla l'ascii table).

Io farei così! ;) ovviamente funziona se hai del testo ASCII 8bit..se hai UDF prova la funzione transform postata da tomminno!

WarDuck
31-03-2011, 15:54
Ancora meglio se giocate con i bit :D.

Praticamente tra lettere minuscole e maiuscole cambia solo il 6° bit (contando da destra) :D.

mistergks
31-03-2011, 15:55
ma a me serve un modo un pò piu' efficiente ma sempre molto elementare!! dato che mi sto preparando per un esame di fondamenti! Quindi niente funzioni pronte e niente librerie!

darksax
31-03-2011, 16:05
L'algoritmo e' corretto. Cambia l'implementazione!
Nel senso che in un caso (il tuo) effettui il tutto a mano mentre
in quello di tomminno fai fare il lavoro alla libreria (che fara' in modo sicuramente piu' ottimizzato il ragionamento che hai fatto tu).
Anche la sostituzione 'aritmetica' del carattere ascii e' una strada, ma la puoi applicare anche utilizzando le funzioni di conversione del C.

---(p.e.)--------
int i=0;

while(array[i])
{
if (isalpha(array[i]))
array[i]=toupper(array[i]);
i++;
}
--------


Ciao

GByTe87
31-03-2011, 16:41
Ancora meglio se giocate con i bit :D.

Praticamente tra lettere minuscole e maiuscole cambia solo il 6° bit (contando da destra) :D.

In effetti la differenza è 32, non ci avevo mai pensato. :D

mistergks
31-03-2011, 17:03
cioè?! come si gioca con i bit??!:muro:

WarDuck
31-03-2011, 17:28
cioè?! come si gioca con i bit??!:muro:

Usando gli operatori bitwise, & (and), | (or), ^ (xor) e ~ (not).


char bits
'a' 110 0001
'A' 100 0001


Per passare da 'a' a 'A' dunque devi disattivare il bit numero 6.
Sapendo che sono tutte potenze di 2 basta calcolare 2^5 (perché si parte da 0) che fa 32 come detto correttamente da GByte.

Dunque:

int bits
32 010 0000
~32 101 1111



char bits
'a' 110 0001 AND
~32 101 1111 =
-----------------
'A' 100 0001


Una soluzione potrebbe essere dunque:

char little = 'a';
char big = little & ~32; // disattivi il 6° bit


Supponendo di volere fare l'operazione inversa (da grande a piccolo):

char big = 'A';
char little = big | 32; // attivi il 6° bit


Puoi usare anche lo XOR, che ti consente di uniformare i due operatori, comportandosi da "interruttore":


'a' ^ 32 => 'A'
'A' ^ 32 => 'a'