Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Calcolo della MODA

Ho un archivio su file RND contenente degli immobili e devo calcolare la
MODA del loro prezzo suddivisa per numero locali e zone di appartenenza, in
mancanza della moda devo calcolare la media modale.
Quindi:
Zona        N°Locali        Valore
    1                    1
    1                    2
    1                    3
    2                    2
    2                    4
    ...                   ...
Come ulteriore filtro ho la tipologia dell'immobile (appartamento, villa,
ecc.) e la motivazione dell'interesse (affitto, Acquisto, permuta, ecc).
Qualcosa ho già scritto, ma è particolarmente contorto e lungo.
Funzionare funziona, ma mi piacerebbe sapere se il ragionamento che ho fatto
alla base di tutto fosse giusto o no.
Avete un'idea in merito
Grazie
MAX
Il ragionamento iniziale era:
1) Determino il numero degli immobili per numero di locali appartenenti ad
una determinata zona
2) Pongo il valore in un vettore
3) Calcolo la frequenza del valore
4) Trovo la frequenza massima
5) Se il valore è unico ho la moda altrimenti calcolo la media delle
frequenza massime

 vai al sito XXXdatabase.com

 wrote in message
SdY46.164177$IP1.5...@news1.giganews.com...
 > vai al sito XXXdatabase.com
Credevo si parlasse di Visual Basic in questo NG.
Forse ho sbagliato.

 ha scritto nel messaggio
news:3E156.241263$hk4.11...@news.infostrada.it...


Mi dispiace, ma non ho fatto in tempo... provo per lun/mart prossimi... se
vuoi... contattami!
CiaoZ

 5) Se il valore è unico ho la moda altrimenti calcolo la media delle
frequenza massime
E` da quando e` apparso questo tuo post che ogni giorno lo apro, lo leggo
e... lo richiudo perche' non riesco a capire cosa risponderti. Perche' non
capisco, anzi, non vedo la domanda. Non credo ti interessi un "si`, il
ragionamento e` giusto" e basta. Anche perche'... come si fa a dirlo? Per
esempio, quando dici "Calcolo la frequenza del valore" cosa intendi? Capirei
se dicessi "Calcolo la frequenza *dei valori*". Altrimenti detto cosi` vuol
dire che ottieni due numeri: quante volte il valore e` presente e... quante
non lo e`. E a che ti serve dato che poi parli di "frequenza massima"? No,
mi dispiace... non capisco. Aiutaci ad aiutarti. ;-)
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 wrote in message
7VX46.238278$hk4.11...@news.infostrada.it...


 locali e sono nella stessa zona - così ho interpretato ciò che hai
scritto).
Esatto
[CUT]
Ho risolto così stamattina, ma son sicuro si possa far meglio:
  Dim MaxCodZona, Max As Integer
  Dim CiclaMinCodZona, CiclaMaxCodZona As Integer
  Dim I As Long
  Dim K, J, L, W As Integer
  Dim Trovato As Integer
  Dim ValModa, Cont, Counter, NLocali, NumeroLocali As Integer
  Dim ModaOK As Boolean
  Dim Numero, ModaSimbolo As String
  Dim newNumero As String * 7
  Trovato = -1
  MaxCodZona = V_TabCodZona(UBound(V_TabCodZona)).Codice
  frmElencoModa!lstModa.Clear
  If cboMotivazione.Text <> "" Then
      R_Motivazione = cboMotivazione.ItemData(cboMotivazione.ListIndex)
      frmElencoModa.lblMotivazione.Caption = Trim(cboMotivazione.Text)
  Else
      R_Motivazione = 0
      frmElencoModa.lblMotivazione.Caption = "TUTTI"
  End If
  If cboCodZona.Text <> "" Then
      R_CodZona = cboCodZona.ItemData(cboCodZona.ListIndex)
      frmElencoModa.lblZona.Caption = Trim(cboCodZona.Text)
  Else
      R_CodZona = 0
      frmElencoModa.lblZona.Caption = "TUTTI"
  End If
  If cboTipologia.Text <> "" Then
      R_Tipologia = cboTipologia.ItemData(cboTipologia.ListIndex)
      frmElencoModa.lblTipologia.Caption = Trim(cboTipologia.Text)
  Else
      R_Tipologia = 0
      frmElencoModa.lblTipologia.Caption = "TUTTI"
  End If
  If MaxCodZona < 0 Or G_MaxNumLocali < 0 Then
      MsgBox "Numero zone o numero dei locali non sufficienti per la
compilazione della statistica", 16, "CONTROLLO DATI STATISTICHE"
      Exit Sub                '''''---------->'''''
  End If
  ReDim ContaLocali(MaxCodZona, G_MaxNumLocali)
  ''ASSEGNAMENTO PREZZI A IMMOBILI CON STESSO CODICE ZONA E NUMERO LOCALI''
  ' ===================================================================== '
  If R_CodZona = 0 Then
    CiclaMinCodZona = 2                 '' I=1 non é un codice valido in
T_Clienti.Codzona1
    CiclaMaxCodZona = MaxCodZona
  Else
    CiclaMinCodZona = R_CodZona         '' Limita la ricerca ad un'unica
zona
    CiclaMaxCodZona = R_CodZona
  End If
  For I = CiclaMinCodZona To CiclaMaxCodZona
    For J = 1 To G_MaxNumLocali
      Counter = Counter + 1
      ReDim Prezzo(1)
      NLocali = 0
      For K = LBound(V_Clienti) To UBound(V_Clienti)
        If R_CodZona = 0 Or V_Clienti(K).CodZona1 = R_CodZona Then
          If R_Motivazione = 0 Or V_Clienti(K).Motivazione =  _
            R_Motivazione Then
            If R_Tipologia = 0 Or V_Clienti(K).Tipologia = R_Tipologia Then
              If V_Clienti(K).CodZona1 = I And V_Clienti(K).NumLocali = _
                 J Then
                ContaLocali(V_Clienti(K).CodZona1, V_Clienti(K).NumLocali) _
                    = ContaLocali(V_Clienti(K).CodZona1,
V_Clienti(K).NumLocali) _
                    + 1
                NLocali = NLocali + 1
                ReDim Preserve Prezzo(NLocali)
                Prezzo(NLocali) = V_Clienti(K).Costo
              End If
            End If
          End If
        End If
      Next K
      NumeroLocali = ContaLocali(I, J)
      If NumeroLocali = 0 Then
        GoTo IncrementaCicloJ
      Else
        ''FREQUENZA''
        ReDim FreqPrezzo(NumeroLocali)
        FreqPrezzo(1) = 1
        For K = 2 To NumeroLocali
          For L = 1 To NumeroLocali
            If Prezzo(K) = Prezzo(L) Then
              FreqPrezzo(L) = FreqPrezzo(L) + 1
              Exit For
            End If
          Next
        Next
        ''Ricerca del Max della frequenza
        Max = 0
        For K = 1 To NumeroLocali
          If FreqPrezzo(K) > Max Then
            Max = FreqPrezzo(K)
          End If
        Next
        ReDim Indice(NumeroLocali)
        Cont = 0
        For K = 1 To NumeroLocali
          If FreqPrezzo(K) = Max Then
            Cont = Cont + 1
            Indice(Cont) = K
            Trovato = Trovato + 1
          End If
        Next
        ValModa = 0
        ModaOK = False
        If Cont = 1 Then
          ModaOK = True
          ModaSimbolo = " "
        Else
          ModaOK = False
          ModaSimbolo = "*"
        End If
        For W = 1 To Cont
          ValModa = ValModa + Prezzo(Indice(W))
        Next
        ValModa = ValModa / Cont
        If ModaOK = True Then
          FontItalic = False
          FontBold = True
        Else
          FontItalic = True
          FontBold = False
        End If
        If ValModa > 0 Then
          newNumero = strCosto(ValModa)
          frmElencoModa!lstModa.AddItem V_TabCodZona(I).Descrizione & "    "
_
                & J & "      £ " & newNumero & ModaSimbolo & Space(30) & _
                R_CodZona & " " & R_Motivazione & " " & R_Tipologia
        End If
      End If
IncrementaCicloJ:
    Next
  Next
  If Trovato = -1 Then
    MsgBox "Nessun elemento trovato.", 16, "MESSAGGIO"
    Pulisci
  Else
    frmModa.Hide
    frmElencoModa.Show
  End If
Lo so già che è abbastanza ridondante ma non riesco a pensare altro o a
snellirla (questo a dir la verità è il frutto proprio di uno snellimento
abbastanza robusto).