Newsgroup: it.comp.lang.visual-basic
Titolo: Calcolo

Un saluto a tutti gli amici del NG,
Vi chiedo fin d'ora scusa per il quesito, ma sono un principiante e sto'
 impazzendo con un algoritmo che mi serve per il mio lavoro
:
Supponiamo di avere questo numero:   4 2 0 9 1 3 7 1 6
Devo fare questo calcolo:
I numeri contenenti le posizioni dispari vanno moltiplicati  x 2 , quelle
contenenti
le posizioni pari invece si moltiplicano  x 1.
Quindi avremo: (4x2)+2+(0x2)+9+(1x2)+3+(7x2)+1+(6x2)
quindi :         8 + 2 + 0 + 9 + 3 + 3 + 14 + 1 + 12
pero' se un prodotto delle pos. dispari è di 2 cifre (es.:7x2=14) si sommano
le due cifre(1+4=5)
avremo allora    8 + 2 + 0 + 9 + 2 + 3 + 5 + 1 + 3    =  33
Il numero che devo ottenere è esattamente il numero che manca , in questo
caso al n°33, per arrivare
al multiplo di 10 immediatamente superiore, in questo caso al 40.
Il numero finale dell' operazione è  7   (40 - 33).
Ho provato a ottenere tale risultato con Vb ma non ne ho cavato piede.
qualcuno puo' darmi una mano anche se riconosco la complessità della
domanda.
Ciao e grazie di cuore.
Roberto.


madonna mia... ma a che cosa ti serve una cosa del genere??
prova questa funzione, relativamente però solo alla prima parte del
problema, cioe sommare senza tenere conto dell'ulteiore somma, nel caso
venga un num. di 2 cifre.
funzione SommaAssurda(Numero as string) as long
' la variabile la devi passare come stringa
TotProvv=0
for J=1 to len(Numero)
    if (J mod 2)=0 then
    ' numero pari
    totprovv=totprovv+val(mid$(numero,J,1))
    else
    ' numero dispari
    ' ulteriore if
    stringadasommare$=cstr(2*val(mid$(numero,J,1))))
    if len(stringadasommare$)>1 then
numerodasommare=somma_bis(stringadasommare$) else
numerodasommare=val(stringadasommare$)
    totprovv=totprovv+numerodasommare
    end if
next J
sommaassurda=totprovv
end function
function somma_bis(stringa1$)
tot1=0
for J=1 to len(stringa1$)
tot1=tot1+val(mid$(stringa1$,J,1))
next J
somma_bis=tot1
end function
anf... anf...
fai un po di prove...
MarioH

 Il numero finale dell' operazione è  7   (40 - 33).
Ciao,
mi piacerebbe molto sapere che lavoro fai :-) cmq:
public function CalcoloStrano(num as string) as integer
    dim i as integer
    dim dig as integer
    dim res as integer
    for i = 1 to len(num)
        dig = ((i mod 2) +1) * cint(mid(num, i, 1))
        if dig > 9 then dig = dig - 9
        res = res + dig
    next i
    CalcoloStrano = 10 - (res mod 10)
end function
Non ho provato ma credo che funzioni.
Ciao.
--
Princi, 
princ...@programmer.net
----------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

 qualcuno puo' darmi una mano anche se riconosco la complessità della
domanda.
Option Explicit
Private Sub Main( _
)
  Debug.Print GetBoh(420913716)
End Sub
Private Function GetBoh( _
  ByVal n As String _
) As Byte
  Dim lngLength As Long
  Dim lngIndex  As Long
  Dim strTemp   As String
  Dim lngResult As Long
  lngLength = Len(n)
  For lngIndex = 1 To lngLength Step 2
    strTemp = Mid$(n, lngIndex, 1) * 2
    lngResult = lngResult + Left$(strTemp, 1)
    If Len(strTemp) > 1 _
    Then _
      lngResult = lngResult + Right$(strTemp, 1)
    If lngIndex < lngLength _
    Then _
      lngResult = lngResult + Mid$(n, lngIndex + 1, 1)
  Next
  GetBoh = -Int(-lngResult / 10) * 10 - lngResult
End Function
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 End Function
in VB le funzioni di manipolazione delle stringhe sono veramente lentissime!
Per curiosità ho fatto due prove: anche se la tua funzione cicla la metà
delle volte, a causa di un maggiore accesso alle stringhe, risulta essere
quasi il doppio più lenta.
Quando si possono evitare, e se la chiarezza del codice non ne risente
molto, io cerco (e consiglio) di non abusarne.


 Quando si possono evitare, e se la chiarezza del codice non ne risente
molto, io cerco (e consiglio) di non abusarne.
Si`, lo so e l'avevo considerato ma mi piaceva la linearita` dell'esempio.
((-;
Non c'entrano le stringhe, ma considera anche che la mia da` sempre il
risultato esatto.
/;-))


 per arrivare al multiplo di 10 immediatamente SUPERIORE.
probabilmente la tua interpretazione in questo caso è ugualmente più
corretta, ma *sempre* è una parola pericolosa:
qual'è il multiplo di 10 immediatamente superiore allo zero???


 qual'č il multiplo di 10 immediatamente superiore allo zero???
Questione interessante. Non tanto da un punto di vista info-matematico,
quanto da quello dell'analisi del problema. In mancanza di specifiche non
ambigue da parte del "cliente" entrambi abbiamo dovuto scegliere una
interpretazione. A botta calda. Io ho optato per quella che secondo me era
consequenziale rispetto a tutto il discorso: ridurre tutto ad un numero di
una sola cifra, range fra 0 e 9. (Complemento a nove?)



Bisognerebbe usare sempre gli array di byte, infatti le stringhe non sono
altro che questo, ogni volta che si usa una funzione che manipola una
stringa, VB deve convertire le stringhe in array, processarle e viceversa.
Chi conosce il C sa cosa intendo...