Autore Topic: classe che ritorni l'indice dell'elemento piu' piccolo di un vettore di interi  (Letto 606 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
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"?
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
Gianluigi correttamente ha usato il Metodo " .Sort( ) ".
...ma tu forse non vuoi, però, effettuare l'ordinamento degli elementi come proposto da Gianluigi....?!

   
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
...ma tu forse non vuoi, però, effettuare l'ordinamento degli elementi come proposto da Gianluigi....?!


Si può sempre passare una copia  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
...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. 
« Ultima modifica: 13 Giugno 2018, 16:19:09 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
...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...  :-[
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
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 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
l'esempio della wiki non mi convince
In che senso ?

(per ora ho modificato il nome della variabile "max")
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
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 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
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
...
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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
...
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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
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....   :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo

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.
« Ultima modifica: 14 Giugno 2018, 15:38:57 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
PS: Dimenticavo, c'è un refuso; la Sub si chiude con Next al posto di End.

Ah, grazie.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline sixam

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
[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-]
« Ultima modifica: 22 Giugno 2018, 12:18:22 da sixam »