Sintassi pezzo di codice in C

meganerd
Ciao a tutti, stavo facendo un esercizio riguardo il cifrario di Cesare. Per la verità l'esercizio è piuttosto semplice, tuttavia, mi sono accorto di un problema di cui non riesco a venirne a capo.

Inizialmente avevo scritto questo pezzo di codice

printf("%c", ( (carattere - 'a') % 26 ) + 'a' + scorrimento);

Tuttavia mi dà risultati non corretti. La scrittura giusta è

printf("%c", ( (carattere - 'a' + scorrimento) % 26 ) + 'a');

** Non penso serva inserire tutto il programma, comunque lo scopo è di convertire un carattere in un'altro in base alla posizione nell'alfabeto, spostandosi di un certo numero di posti dati dalla variabile scorrimento.

A me i due pezzi di codice sembrano equivalenti, ma quando li provo non è così e non capisco perchè.

Diciamo che il carattere 'a' nel mio set ha la posizione 100, quindi la z avrà posizione 126, e imposto lo scorrimento a 3. Con il primo costrutto abbiamo:
$((126-100) % 26) + 100 + 3 -> (26 % 26) + 103 = 103$

Con il secondo invece:
$((126 - 100 + 3) % 26 ) + 100) -> (29 % 26) + 100 = 103$

Risposte
apatriarca
Nota che (carattere - 'a') % 26 ) + 'a' è semplicemente uguale a carattere quando questo è compreso tra 'a' e 'z'. La tua formula è quindi del tutto equivalente a carattere + scorrimento che non è corretta per gli ultimi valori dell'alfabeto.

meganerd
Bene, purtroppo di questo me ne ero reso conto. Però non riesco ancora ad afferrare perchè e dov'è che sbaglio quando sostituisco i valori nell'esempio del costrutto 1.

In pratica sostituendo i valori come nel mio esempio, a quanto tu dici uscirebbe 129 e non 103. Lo so che è così, ma non trovo l'errore nel mio esempio. Come dire... so che tu hai ragione, ma non so perchè io ho torto.

Centoventisei meno cento non fa 26? 26 modulo 26 non fa zero?

PS: so già che quando mi farai notare dove sbaglio mi darò del deficiente da solo e mi chiederò come ho fatto a non rendermene conto. Un classico :-D

apatriarca
Il problema è che stai testando un valore che sta al di fuori dell'intervallo che ti interessa. Se hai 26 valori e il primo è uguale a 100, allora l'ultimo valore sarà 125 e non 126. Per cui, considerando 125 nel tuo esempio hai che viene mandato in \( (125 - 100) \mod 26 + 100 + 3 = 128 \). Nell'altro caso hai invece che \( (125 - 100 + 3) \mod 26 + 100 = 102 \).

meganerd
#-o

Grazie! :-D

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