Differenze tra le versioni di "Conoscere il numero e la posizione di tutte le occorrenze di una sottostringa in una stringa"

Da Gambas-it.org - Wikipedia.
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Mostriamo alcune modalità per conoscere la posizione di ogni eventuale occorrenza di una parola all'interno di una stringa.
 
Mostriamo alcune modalità per conoscere la posizione di ogni eventuale occorrenza di una parola all'interno di una stringa.
  
 
+
===Usando le sole risorse di Gambas===
===Con le sole risorse di Gambas===
+
  Public Sub Main()
  '''Public''' Sub Main()
 
 
    
 
    
 
   Dim s As String
 
   Dim s As String
 
   Dim i, ris As Integer
 
   Dim i, ris As Integer
 
+
 
  <FONT Color=gray>' ''Poniamo il caso che la stringa sia la seguente...''</font>
 
  <FONT Color=gray>' ''Poniamo il caso che la stringa sia la seguente...''</font>
  s = "mela pera arancia banana pera arancia banana mela pera mela"
+
  s = "mela pera arancia banana pera arancia banana mela pera mela"
 
    
 
    
  Repeat
+
  Repeat
 
  <FONT Color=gray>' ''...e che la parola, di cui cercare le occorrenze, sia "pera":''</font>
 
  <FONT Color=gray>' ''...e che la parola, di cui cercare le occorrenze, sia "pera":''</font>
    i = InStr(s, "pera", i)
+
    i = InStr(s, "pera", i)
    If i Then
+
    If i Then
      Inc i
+
      Inc i
      Inc r
+
      Inc ris
    Endif
+
    Endif
  Until i == 0
+
  Until i == 0
 
    
 
    
  Print ris
+
  Print ris
 
 
'''End'''
 
 
 
 
 
 
 
'''Public''' Sub Main()
 
 
  Dim s As String
 
  Dim ss As String[]
 
  Dim n, c As Short
 
 
    
 
    
    s = "mela pera arancia banana pera arancia banana mela pera mela"
+
  End
   
 
    s = Replace(s, "\n", Chr(32))
 
   
 
    ss = Split(s, " ")
 
   
 
    Print "L'occorrenza è stata trovata alle posizioni:"
 
    For n = 0 To ss.Max
 
      If ss[n] = "pera" Then
 
        Inc c
 
        Print n + 1
 
      Endif
 
    Next
 
   
 
    Print "\nper un totale di "; c; " volte."
 
   
 
  '''End'''
 
  
  
Riga 60: Riga 33:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
Dim s, su As String  
+
  Dim s, su As String  
Dim i As Integer
+
  Dim i As Integer
 
   
 
   
 
  <FONT Color=gray>' ''Va a generare l'apposita libreria dinamica condivisa esterna:''</font>
 
  <FONT Color=gray>' ''Va a generare l'apposita libreria dinamica condivisa esterna:''</font>
Riga 78: Riga 51:
 
   Print "Numero occorrenze della sottostringa '"; su; "': "; i
 
   Print "Numero occorrenze della sottostringa '"; su; "': "; i
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure CreaSo()
+
  Private Procedure CreaSo()
 
    
 
    
 
  <FONT Color=gray>' ''Imposta il sorgente della libreria dinamica condivisa esterna:''</font>
 
  <FONT Color=gray>' ''Imposta il sorgente della libreria dinamica condivisa esterna:''</font>
Riga 91: Riga 64:
 
             "\n\n" &
 
             "\n\n" &
 
             "  do {\n" &
 
             "  do {\n" &
             "      stringa = strstr (stringa, substr);\n" &
+
             "      if (stringa = strstr (stringa, substr)) {;\n" &
            "      if (stringa) {;\n" &
 
 
             "        ++stringa;\n" &
 
             "        ++stringa;\n" &
 
             "        ++i;\n" &
 
             "        ++i;\n" &
             "     }else{\n        break;\n     }" &
+
             "      }" &
             "\n  }\n" &
+
             "\n  } while (stringa);" &
            "  while (stringa);" &
+
             "\n\n  return i;\n\n}")
             "\n\n" &
 
            "   return i;\n\n}")
 
 
              
 
              
 
    
 
    
Riga 105: Riga 75:
 
   Shell "gcc -o /tmp/lib_Occorrenze.so /tmp/lib_Occorrenze.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/lib_Occorrenze.so /tmp/lib_Occorrenze.c -shared -fPIC" Wait
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 16:52, 23 giu 2023

Mostriamo alcune modalità per conoscere la posizione di ogni eventuale occorrenza di una parola all'interno di una stringa.

Usando le sole risorse di Gambas

Public Sub Main()
 
 Dim s As String
 Dim i, ris As Integer

' Poniamo il caso che la stringa sia la seguente...
 s = "mela pera arancia banana pera arancia banana mela pera mela"
 
 Repeat
' ...e che la parola, di cui cercare le occorrenze, sia "pera":
   i = InStr(s, "pera", i)
   If i Then
     Inc i
     Inc ris
   Endif
 Until i == 0
  
 Print ris
 
End


Utilizzando un'apposita libreria dinamica condivisa .so esterna

Quest'altra modalità prevede la creazione e l'uso di un'apposita libreria dinamica condivisa .so esterna, scritta in C, che in sostanza provvederà a cercare il solo numero delle occorrenze della substringa all'interno della stringa:

Library "/tmp/lib_Occorrenze"

' int Occorrenze(const char *stringa, const char *substr)
' Ritorna il numero di occorrenze di una sottostringa all'interno di una stringa.
Private Extern Occorrenze(stringa As String, substr As String) As Integer


Public Sub Main()

 Dim s, su As String 
 Dim i As Integer

' Va a generare l'apposita libreria dinamica condivisa esterna:
 CreaSo()

' La stringa è la seguente:
 s = "mela pera arancia limone pera banana noce mela fico pera noce"
 
' La sottostringa di cui conoscere il numero di occorrenze:
 su = "pera"
 
 i = Occorrenze(s, su)
 
 Print "Numero occorrenze della sottostringa '"; su; "': "; i
 
End


Private Procedure CreaSo()
 
' Imposta il sorgente della libreria dinamica condivisa esterna:
 File.Save("/tmp/lib_Occorrenze.c", "#include <string.h>" &
           "\n\n" &
           "int Occorrenze(const char *stringa, const char *substr) {" &
           "\n\n" &
           "   int i = 0;" &
           "\n\n" &
           "   do {\n" &
           "      if (stringa = strstr (stringa, substr)) {;\n" &
           "         ++stringa;\n" &
           "         ++i;\n" &
           "      }" &
           "\n   } while (stringa);" &
           "\n\n   return i;\n\n}")
           
 
' Genera la libreria dinamica condivisa esterna:
 Shell "gcc -o /tmp/lib_Occorrenze.so /tmp/lib_Occorrenze.c -shared -fPIC" Wait
 
End