somma dei soli dispari



  • somma dei soli dispari
    di lookap (utente non iscritto) data: 14/02/2014 18:43:14

    Ragazzi,
    sto cercando di studiare il mondo VBA e per aver iniziato circa 3 o 4 giorni fa direi che non son messo male ma mi sto impuntando su un esercizio che potrebbe aiutarmi nel capirlo ancora meglio.
    Sostanzialemnte bisogna creare una applicazione che permetta di sommare solo i numeri dispari di un range. I numeri però devono essere inseririti tramite degli inputbox e l'ultimo numero deve necessariemante essere = -1
    Ovviamente il risultato finale dovrà essere dichiarato da un MsgBox. Credo e spero di toppare quando tocca effettuare la sommatoria dei vari numeri dispari che ho definito con la variabile X.

    Help
     
    'Esercizio n.2
    
    Option Explicit
    
    Dim a As Integer
    Dim b As Integer
    Dim c As Integer
    Dim d As Integer
    Dim e As Integer
    Dim f As Integer
    Dim g As Integer
    Dim h As Integer
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Integer
    
    Sub InserimentoValori()
    
    a = InputBox("Immettere un numero")
    b = InputBox("Immettere un numero")
    c = InputBox("Immettere un numero")
    d = InputBox("Immettere un numero")
    e = InputBox("Immettere un numero")
    f = InputBox("Immettere un numero")
    g = InputBox("Immettere un numero")
    h = InputBox("Immettere un numero")
    i = InputBox("Immettere un numero")
    j = InputBox("Immettere un numero")
    k = InputBox("Immettere un numero")
    l = -1
    MsgBox (" Verrà utilizzato come numero finale: -1")
    
    End Sub
    
    Sub CalcoloDispari()
    Dim X As Integer
    Dim Risultato As Integer
                  
    For X = a To l
        If X Is Not (Int(X / 2) * 2) Then
    
            Risultato = sommatoria ??????
            
            MsgBox "Il risultato della somma dei numeri dispari è " & Risultato, _
            vbInformation, "Somma i Dispari"
        
        End If
    Next X
                                                   
    End Sub
    
    Sub MacroRiepilogoCalcoloSoloDispari()
    
    Call InserimentoValori
    Call CalcoloDispari
    
    End Sub
    



  • di patel data: 14/02/2014 19:01:50

    non ti conviene utilizzare variabili singole, ma un array per memorizzare i dati di input
     
    dim a(12)
    for i=1 to 11
      a(i) = InputBox("Immettere un numero")
    next
    a(12) = -1
    .......






  • di scossa data: 14/02/2014 20:51:30

    Scusami, ma a cosa servono tutte quelle variabili (b, c, d, e ....) se poi usi solo a?

    Poi potresti spiegare, a parole - non a formule - cosa dovrebbe fare
    If X Is Not (Int(X / 2) * 2) Then

    Anzi, quale sarebbe lo scopo di tutto l'ambaradan (sempre in modo descrittivo)?



  • di Vecchio Frac data: 14/02/2014 20:54:15

    Per aver cominciato solo da pochissimi giorni, complimenti.
    In questo esercizio hai affrontato diversi punti importanti: scomposizione del problema in piccole procedure, uso delle variabili per immagazzinare i dati, interazione con l'utente, dimensionamento con dichiarazione esplicita del tipo di dato, cicli For e istruzioni decisionali.
    I prossimi passi riguarderanno studiare la differenza tra variabili locali e pubbliche, scope (visibilità) di una variabile, uso delle matrici (vettori o array).
    Per il problema specifico, guarda cos'è e come funziona il modulo di un numero (operatore Mod: restituisce il resto di una divisione). In tal modo potrai stabilire se un numero è pari o dispari. In questo caso potrai immagazzinarne il valore per sommarlo in una variabile contatore e fartelo restituire alla fine.
    Un ulteriore passo sarà quello di studiare la differenza tra Sub e Function, con o senza passaggio di parametri.
    Ma per il momento hai già fatto molto ^_^





  • di Vecchio Frac data: 14/02/2014 20:56:58

    cit. "(sempre in modo descrittivo)?"
    ---> Tra le righe, scossa ti sta dando un suggerimento importante anzi fondamentale: descrivi prima il problema a parole, i passi che faresti per la soluzione, utilizzando un linguaggio descrittivo magari per punti successivi. Questo significa "impostare un algoritmo".
    La traduzione dell'algoritmo nel linguaggio scelto (in questo caso VBA) sfruttando magari le caratteristiche offerte dal linguaggio stesso, è un passo successivo ma di facile attuazione.





  • di lookap (utente non iscritto) data: 17/02/2014 18:55:42

    @patel : grazie del suggerimento, ho già utilizzato la matrice nel codice; solo una cosa, ovviamente tocca dichiararla come qualsiasi altra variabile (byte, integer, long, etc)

    @scossa : provo a risponderti per step
    1) dichiaro le variabili di modulo tramite l'array a(12) grazie al suggerimento di patel.
    2) istruisco gli utenti all'inserimento di valori in inputboxes (l'ultimo valore deve necessariamente essere "-1").
    3) tramite altra subroutine (che grazie all'indicazione implicita di VecchioFrac trasformo in Function), cerco
    a) di filtrare solo i numeri dispari che ho provato a definire con la istruzione If a is not (Int(a/2)*2 then in quanto matematicamente l'intero di un qualsiasi numero diviso per 2 e moltiplicato per 2 sia un valore PARI. Proverò ad utilizzare l'istruzione Mod
    b) di sommare tali soli valori dispari con la restituzione del valore somma con un MsgBox;
    4) Richiamo le 2 sub routine per la costruzione della macro.

    @Vecchio Frac : grazie dei suggerimento, proverò a studiare functions, array e scope delle variabili per capirci di più.
     
    
    Option Explicit
    
    Dim a(12) As Integer
    
    Sub InserimentoValori()
    
    For i = 1 To 11
    a(i) = InputBox("Immettere un numero")
    Next
    a(12) = -1
    MsgBox (" Verrà utilizzato come numero finale: -1")
    
    End Sub
                  
    Function SommaDispari() As Integer
    
        If a Is Not (Int(a / 2) * 2) Then
    
            SommaDispari = ???
            
            MsgBox "Il risultato della somma dei numeri dispari è " & SommaDispari, _
            vbInformation, "Somma i Dispari"
        
        End If
        
    End Function
    
    Sub MacroRiepilogoCalcoloSoloDispari()
    
    Call InserimentoValori
    Call SommaDispari
    
    End Sub
    
    



  • di patel data: 18/02/2014 08:10:03

    ripensandoci bene è inutile utilizzare un array, basta una macro del genere, inoltre è inutile chiamare una function senza passare dei parametri.
     
    Sub InserimentoValori()
    MsgBox (" Inserisci -1 come numero finale")
    a = 1
    SommaDispari = 0
    Do While a <> -1
      a = Val(InputBox("Immettere un numero"))
      If a > 0 And a Mod 2 <> 0 Then
        SommaDispari = SommaDispari + a
      End If
    Loop
    MsgBox "Il risultato della somma dei numeri dispari è " & SommaDispari, _
            vbInformation, "Somma i Dispari"
    End Sub
    






  • di lookap (utente non iscritto) data: 18/02/2014 14:13:41

    grazie Patel, ci sono riuscito dopo un piccolo accorgimento (ossia aggiungere il fatto che dovesse essere sommato anche il -1 finale, quindi ho tolto il "a>0" nell'If) ed ho modificato il ciclo da do while/loop a do/loop until giusto per capire se ci potessero essere delle differenze tra i due tipi di cicli di istruzioni.
     
    Option Explicit
    
    Dim a As Integer
    Dim SommaDispari As Integer
    Sub InserimentoValori()
    MsgBox (" Inserisci -1 come numero finale")
    a = 1
    SommaDispari = 0
    Do
      a = Val(InputBox("Immettere un numero"))
      If And a Mod 2 <> 0 Then
        SommaDispari = SommaDispari + a
      End If
    Loop Until a = -1
    MsgBox "Il risultato della somma dei numeri dispari è " & SommaDispari, _
            vbInformation, "Somma i Dispari"
    End Sub



  • di scossa data: 18/02/2014 14:31:17

    Volendo sintetizzare il codice si può evitare anche il costrutto IF:

     
    Sub InserimentoValori2()
    Dim nSumDispari As Integer
    Dim nNum As Integer
    
    nSumDispari = 0
    Do While nNum > -1
      nNum = Application.InputBox("immetter un numero intero (-1 per terminare): ", "Parziale Numeri Dispari: " & nSumDispari, Type:=1)
      nSumDispari = nSumDispari - nNum * Application.IsOdd(nNum)
    Loop
    MsgBox "Il risultato della somma dei numeri dispari è " & nSumDispari, _
            vbInformation, "Somma Numeri Dispari"
    End Sub