Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 12 Giugno 2018, 18:59:30

Titolo: classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: allegfede - 12 Giugno 2018, 18:59:30
ho un vettore di interi e mi serve di capire quale elemento ha il valore piu' alto (o piu' basso).

A parte banalmente scansioare il vettore elemento per elemento .. c'e' una classe o proprieta' predefinita di qualche oggetto vettore "custom"?
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 12 Giugno 2018, 19:32:02
A me viene in mente questo:

Codice: [Seleziona]
Public Sub Main()

  Dim ii As Integer[] = [5, 1, 3, 7, 2, 6, 8, 10, 22, 9, 18]
 
  ii.Sort(gb.Ascent)
  Print "Numero più basso "; ii[0]
  Print "Numero più alto "; ii[ii.Max]

End

 :ciao: :ciao:
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: vuott - 12 Giugno 2018, 21:16:44
Gianluigi correttamente ha usato il Metodo " .Sort( ) ".
...ma tu forse non vuoi, però, effettuare l'ordinamento degli elementi come proposto da Gianluigi....?!

(http://i39.tinypic.com/vqscpz.gif)   
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 13 Giugno 2018, 13:33:41
...ma tu forse non vuoi, però, effettuare l'ordinamento degli elementi come proposto da Gianluigi....?!


Si può sempre passare una copia  :-\
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: vuott - 13 Giugno 2018, 15:17:26
...ma lui ha chiesto nel titolo di conoscere l'indice contenente il valore minore.
Alterando l'indice originario del vettore mediante il proprosto metodo " .Sort( ) ", salta la ragione della richiesta. 
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 13 Giugno 2018, 15:27:20
...ma lui ha domandato nel titolo di conoscere l'indice contenente il valore minore.
Alterando l'indice originario del vettore mediante il proprosto metodo " .Sort( ) ", salta la ragione della richiesta.
Hai ragione, ho letto male la domanda e chi male intende...  :-[
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 14 Giugno 2018, 11:42:49
ho un vettore di interi e mi serve di capire quale elemento ha il valore piu' alto (o piu' basso).

A parte banalmente scansioare il vettore elemento per elemento .. c'e' una classe o proprieta' predefinita di qualche oggetto vettore "custom"?

A me non è venuto in mente altro che la "banale scansione"  :) solo ti vorrei consigliare di assegnare il valore alla variabile iMin e iMax in questo modo, perché l'esempio (http://www.gambas-it.org/wiki/index.php?title=Conoscere_il_valore_numerico_pi%C3%B9_alto_contenuto_da_un_vettore) della wiki non mi convince:
Codice: [Seleziona]
Public Sub Main()

 Dim i, iMax, iMin, iIndMax, iIndMin As Integer
 Dim ii As Integer[]

  ii = [106, 11, 33, 77, -89, 105, -22, 66, 44, 55, -107, 115]
  iMax = ii[0]
  iMin = ii[0]
  For i = 0 To ii.Max
    If ii[i] > iMax Then
      iMax = ii[i]
      iIndMax = i
    Endif
    If ii[i] < iMin Then
      iMin = ii[i]
      iIndMin = i
    Endif
  Next
 
  Print "Il numero più piccolo è: "; iMin; " il cui indice è: "; iIndMin;;
  Print "Il numero più grande è: "; iMax; " il cui indice è: "; iIndMax

End

 :ciao: :ciao:
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: vuott - 14 Giugno 2018, 13:04:58
l'esempio della wiki non mi convince
In che senso ?

(per ora ho modificato il nome della variabile "max")
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: allegfede - 14 Giugno 2018, 13:37:33
ho un vettore di interi e mi serve di capire quale elemento ha il valore piu' alto (o piu' basso).

A parte banalmente scansioare il vettore elemento per elemento .. c'e' una classe o proprieta' predefinita di qualche oggetto vettore "custom"?

A me non è venuto in mente altro che la "banale scansione"  :) solo ti vorrei consigliare di assegnare il valore alla variabile iMin e iMax in questo modo, perché l'esempio (http://www.gambas-it.org/wiki/index.php?title=Conoscere_il_valore_numerico_pi%C3%B9_alto_contenuto_da_un_vettore) della wiki non mi convince:
Codice: [Seleziona]
Public Sub Main()

 Dim i, iMax, iMin, iIndMax, iIndMin As Integer
 Dim ii As Integer[]

  ii = [106, 11, 33, 77, -89, 105, -22, 66, 44, 55, -107, 115]
  iMax = ii[0]
  iMin = ii[0]
  For i = 0 To ii.Max
    If ii[i] > iMax Then
      iMax = ii[i]
      iIndMax = i
    Endif
    If ii[i] < iMin Then
      iMin = ii[i]
      iIndMin = i
    Endif
  Next
 
  Print "Il numero più piccolo è: "; iMin; " il cui indice è: "; iIndMin;;
  Print "Il numero più grande è: "; iMax; " il cui indice è: "; iIndMax

End

 :ciao: :ciao:

eh si, penso che sia l'unica Gian ... pero' il tuo metodo mi piace molto.

Si usare .sort distrugge  la struttura. Avrei forse dovuto usare una matrice, con coppie (indice, valore), che alla creazione hanno incice di matrice uguale al contenuto indice, e dopo il .sort, andare a leggere il contenuto del primo (od ultimo) elemento .... troppo complicato :D

e scansione sia. Thanks
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 14 Giugno 2018, 13:55:37
...
e scansione sia. Thanks

Prego, ma fossi in te aspetterei per vedere se vuott se ne esce con qualcosa di meglio  :D

l'esempio della wiki non mi convince
In che senso ?

(per ora ho modificato il nome della variabile "max")
Perché intanto non serve che iMax sia una variabile globale e poi uno alle prime armi potrebbe pensare che quel numero (-xxx) vada bene anche per short o long.
Passando come valore la prima occorrenza del vettore, l'assegnazione va bene per tutti i tipi di dato numerico.

 :ciao: :ciao:
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 14 Giugno 2018, 14:16:05
...
Si usare .sort distrugge  la struttura. Avrei forse dovuto usare una matrice, con coppie (indice, valore), che alla creazione hanno incice di matrice uguale al contenuto indice, e dopo il .sort, andare a leggere il contenuto del primo (od ultimo) elemento .... troppo complicato :D

Volendo usare una copia...:
Codice: [Seleziona]
Public Sub Main()

 Dim iMax, iMin, iIndMax, iIndMin As Integer
 Dim ii, cc As Integer[]

  ii = [106, 11, 33, 77, -89, 105, -22, 66, 44, 55, -107, 115]
  cc = ii.Copy()
  cc.Sort()
  iMax = cc[cc.Max]
  iMin = cc[0]
  iIndMax = ii.Find(iMax)
  iIndMin = ii.Find(iMin)

  Print "Il numero più piccolo è: "; iMin; " il cui indice è: "; iIndMin;;
  Print "Il numero più grande è: "; iMax; " il cui indice è: "; iIndMax

End

 :ciao: :ciao:
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: vuott - 14 Giugno 2018, 14:50:45
a fossi in te aspetterei per vedere se vuott se ne esce con qualcosa di meglio  :D
Utilizzare un ciclo, in fondo, non è una cosa orribile.



Perché intanto non serve che iMax sia una variabile globale
Sì, ora l'ho ridotta a variabile locale.



... uno alle prime armi potrebbe pensare che quel numero (-xxx) vada bene anche per short o long.
Ma lì è dichiarato come "Intero".
Inoltre, in caso di dubbio, sarebbe bene che il neofita studiasse bene i "tipi di dati".



Passando come valore la prima occorrenza del vettore, l'assegnazione va bene per tutti i tipi di dato numerico.
...non ho capito bene....   :-\
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: Gianluigi - 14 Giugno 2018, 15:32:57

Passando come valore la prima occorrenza del vettore, l'assegnazione va bene per tutti i tipi di dato numerico.
...non ho capito bene....   :-\

Mi devo ripetere, ma ora lo faccio con un esempio:

Codice: [Seleziona]
  iMax = ii[0] ' va bene anche se ii è un vettore di tipo Long'
  Dim iMax as Long = -2147483648 ' malfunzionamento se i valori nel vettore sono tutti minori di questo numero.
Ma se tu invece pensi che come è impostato l'esempio sia meglio perché è chiaramente sottinteso essere quello il valore più basso del tipo integer e che se cambiamo il tipo è altrettanto chiaro che va cambiato il valore, allora lascialo pure così.  :)

 :ciao: :ciao:

PS: Dimenticavo, c'è un refuso; la Sub si chiude con Next al posto di End.
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: vuott - 14 Giugno 2018, 17:02:04
PS: Dimenticavo, c'è un refuso; la Sub si chiude con Next al posto di End.

Ah, grazie.
Titolo: Re:classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi
Inserito da: sixam - 22 Giugno 2018, 12:04:16
[cut]
eh si, penso che sia l'unica Gian ... pero' il tuo metodo mi piace molto.

Si potrebbero unire le 2 soluzioni in una classe:
1) passo l'array originale come proprietà della classe
2) all'interno, ne creo una copia, la ordino e individuo i valori Min e Max
3) spazzolo l'array originale una sola volta, ed appena trovo i valori Min e Max mi memorizzo gli  indici

Codice: [Seleziona]
Create Static

' Utilizzo:
'  ii = [106, 11, 33, 77, -89, 125, -22, 66, 44, 55, -107, 115]
'  cSortList.Lista = ii
'  cSortList.Elabora
'  lblMinimo.Text = "Minimo: " & cSortList.Minimo & " alla posizione " & cSortList.MinimoPos
'  lblMassimo.Text = "Massimo: " & cSortList.Massimo & " alla posizione " & cSortList.MassimoPos


Private aLista As Integer[]

Private iMinimo As Integer = -1
Private iMinimoPos As Integer = -1
Private iMassimo As Integer = -1
Private iMassimoPos As Integer = -1

Property Lista As Integer[]

Property Read Minimo As Integer
Property Read MinimoPos As Integer
Property Read Massimo As Integer
Property Read MassimoPos As Integer


Private Function Lista_Read() As Integer[]
  Return aLista 
End

Private Function Lista_Write(aTmp As Integer[])
  aLista = atmp
End

Private Function Minimo_Read() As Integer
  Return iMinimo
End

Private Function Massimo_Read() As Integer
  Return iMassimo
End
Private Function MinimoPos_Read() As Integer
  Return iMinimoPos
End

Private Function MassimoPos_Read() As Integer
  Return iMassimoPos
End

Public Sub Elabora()
 
Dim aTmp As Integer[]
Dim iCount As Integer
Dim iMax As Integer

  iMinimo = -1
  iMinimoPos = -1
  iMassimo = -1
  iMassimoPos = -1
 
  iMax = alista.Count - 1
 
  atmp = aLista.Copy()
  atmp.Sort()
  iMinimo = atmp[0]
  iMassimo = atmp[imax]
 
  For icount = 0 To imax
    If iMinimoPos = -1 Then
      If aLista[icount] = iminimo Then
        iminimopos = icount
      Endif
    Endif
    If imassimopos = -1 Then
      If aLista[icount] = imassimo Then
        imassimopos = icount
      Endif
    Endif
    If iminimopos <> -1 And imassimopos <> -1 Then
      Exit
    Endif
  Next
 
End

Bye by SixaM 8-]