Oppure

Loading
23/12/11 18:46
giova95
Innanzitutto buona sera e buon natale :)
Mi scuso se ho sbagliato la sezione ma essendo praticamente autodidatta non so la differenza tra visual basic 5 o 6 e tutti gli altri :(

Ho recentemente sviluppato un programmino per codificare delle stringe di testo. Il programma è molto semplice e si basa sulla conversione di ogni singola lettera in un numero, poi il numero viene sommato al numero della "chiave di criptazione" e il risultato viene riconvertito in lettera. Come già detto sono autodidatta e so anche che non è il miglior modo per codificare, ma a me interessava solo allenarmi su visual basic, non devo nascondere informazioni della N.A.S.A. :)

Dopo una serie di passaggi ottengo nella variabile S un valore, e in base al valore di S (che può essere compreso tra 0 e 114) il programma mi restituisce un output diverso.
Il problema è che l'output che corrisponde al valore 0 è uguale all'output di 58.
Così come 1 corrisponde a 59, 2 corrisponde a 60.... 57 corrisponde a 114
Queste corrispondenze nascono da questo passaggio

If y < x Then
S = x - y
Else
S = z - y
End If

Ed il fatto è che sono obbligato a fare questo passaggio... quindi evitate di dirmi di editare questa struttura :)
Il mio dubbio si presenta nel momento in cui devo verificare il valore di S.
In precedenza avevo fatto in questo modo:

Select Case S
Case 1, 58
output = "a"
Case 2, 59
output = "b"
.
.
.
Case 57, 114
output = " "
End Select

Ora ricontrollando il tutto mi è venuto in mente che potevo fare in questa maniera:

If y < x then
S = x - y
Select Case S
Case 1
output = "a"
Case 2
output = "b"
.
.
.
Case 57
output = " "
End Select
Else
Select Case S
Case 58
output = "a"
Case 59
output = "b"
.
.
.
Case 114
output = " "
End Select
End If

So che la differenza risulterà di pochi millisecondi, ma secondo voi quale dei 2 modi è il più veloce?

Grazie in ogni caso ;)
Gio
aaa
23/12/11 20:16
lorenzo
anche se sei autodidatta non significa che la logica sia da buttar via.
TI sei chiesto come fare a decriptare con il tuo algoritmo? Se l'output non è univoco, non potrai mai sapere da quale chiave sei partito no?

Inizia a pensare ad un algoritmo migliore ed allora vedrai che non ti capiteranno più casi in cui scegliere tra due strutture "select case" come hai postato.

Comunque, tra le due, preferisco la prima perché è la più chiara...non mi piace ripetere troppo codice simile quando si può evitare. Però ripeto...sono due scelte sbagliate tutte e due. Ripensa prima al tuo algoritmo.
aaa
24/12/11 11:13
Il Totem
Più che millisecondi, direi che la differenza è appena quantificabile...

Un modo più compatto è, ad esempio:
output = Chr(96 + S % 57)

Infatti per S = 1 o S = 58, S % 57 = 1, perciò output = "a".
Funziona se i carattere che intendi porre in output seguono l'ordinamento consueto ascii. Dato che l'ultimo carattere è lo spazio, direi che non segui la codifica, ma se in alcuni intervalli le lettere sono in ordine, puoi comunque adattare il calcolo a pochi casi particolari.
aaa
24/12/11 16:23
nessuno
Il primo codice potrà essere più veloce in maniera impercettibile.

Ma sarebbe saggio seguire quello che ti ha scritto Totem.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.