Gambas-it

Gambas3 => Programmazione => Topic aperto da: vuott - 09 Gennaio 2017, 15:43:37

Titolo: Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 15:43:37
Vorrei creare una specifica  pagina su detto argomento.

Indicate le possibili modalità che suggerireste per modificare un solo carattere fra due o più identici presenti in una stringa.

Per essere più chiaro, avendo ad esempio questa stringa: aaazbbbzccczddd, indicate tutte le modalità (scrivendo breve, ma adeguato codice) che vi vengono in mente per mutare la sola seconda " z " in uno spazio (ossia codice ASCII &h20), cosicché al termine si abbia questa stringa: aaazbbb ccczddd .

Gli autori degli algoritmi, adottati nella pagina da creare, saranno lì citati.



Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 15:49:57
Dai.... esco io per primo dalla trincea, usando i Memory Stream.

Vedi la pagina della Wiki che si va scrivendo. Il collegamento è in fondo a questa pagina.
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 09 Gennaio 2017, 16:39:52
Riedizione di Mid$ :

Codice: [Seleziona]
Public Sub Main()
   
  Dim s As String = "aaazbbbzccczddd"
 
  Mid$(s, 8, 1) = " "
 
  Print s
   
End
:ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 09 Gennaio 2017, 16:59:17
Altro uso di Mid con vettore:

Codice: [Seleziona]
Public Sub Main()
   
  Dim s As String = "aaazbbbzccczddd"
  Dim c As String
  Dim ss As New String[]
  Dim i As Byte
 
  For i = 1 To Len(s)
    c = Mid(s, i, 1)
    If i = 8 Then c = " "
    ss.Push(c)
  Next
  For i = 0 To ss.Max
    Print ss[i];
  Next
 
End

 :ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 17:09:07
Il secondo esempio, però, è una mera complicazione della prima modalità, da te suggerita (e che io ho posto come primo esempio nella pagina della Wiki (http://www.gambas-it.org/wiki/index.php?title=Modificare_un_carattere_di_una_stringa#Note)), in quanto usi nuovamente la funzione Mid( ) come risorsa comunque principale dell'algoritmo. 

Pertanto non la riporterei lì. :-X
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 17:47:25
E' possibile anche usare una variabile vettoriale di tipo Byte( ).

Vedi la pagina della Wiki che si va scrivendo. Il collegamento è in fondo.
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 09 Gennaio 2017, 18:23:58

Pertanto non la riporterei lì. :-X

Va bene capo, sei tu quello che decide  :P
Non ho capito perché se il codice lo propongo io o un altro ne riporti il nome mentre se lo proponi tu no.

Se mi è concesso l'ardire, ti suggerirei un esempio  con il puntatore tipo questo (http://www.gambas-it.org/wiki/index.php?title=Vedere_e_modificare_con_i_Puntatori_un_byte_costituente_il_valore_di_una_variabile)  ;D

 :ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 18:34:16
Non ho capito perché se il codice lo propongo io o un altro ne riporti il nome mentre se lo proponi tu no.
Perchè io nel caso come questo appaio comunque come creatore della pagina, e pertanto io, essendo appunto autore della pagina, penso che si capisca che gli esempi privi di nota di rimando ad uno specifico autore, si intendono suggeriti dal redattore della pagina Wiki, ossia in questo caso da me.



Se mi è concesso l'ardire, ti suggerirei un esempio  con il puntatore tipo questo (http://www.gambas-it.org/wiki/index.php?title=Vedere_e_modificare_con_i_Puntatori_un_byte_costituente_il_valore_di_una_variabile)
Giusta osservazione. Infatti il mio esempio con i Memory Stream come anche quello da te suggerito, si basa sulla capacità di tale risorsa di Gambas di scrivere nelle aree di memoria riservate accedendovi tramite gli indirizzi di memoria contenuti nelle corrispondenti variabili di tipo Puntatore.
Il tuo giusto suggerimento si intende pertanto già pienamente soddisfatto con il mio primo esempio.
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 09 Gennaio 2017, 19:18:26

Se mi è concesso l'ardire, ti suggerirei un esempio  con il puntatore tipo questo (http://www.gambas-it.org/wiki/index.php?title=Vedere_e_modificare_con_i_Puntatori_un_byte_costituente_il_valore_di_una_variabile)
Giusta osservazione. Infatti il mio esempio con i Memory Stream come anche quello da te suggerito, si basa sulla capacità di tale risorsa di Gambas di scrivere nelle aree di memoria riservate accedendovi tramite gli indirizzi di memoria contenuti nelle corrispondenti variabili di tipo Puntatore.
Il tuo giusto suggerimento si intende pertanto già pienamente soddisfatto con il mio primo esempio.

Ops! Non me n'ero accorto, eppure è la prima voce dell'algoritmo  :mad:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 09 Gennaio 2017, 20:08:44
Volendo usare Replace:
Codice: [Seleziona]
Public Sub Main()
   
  Dim s As String = "aaazbbbzccczddd"
  s = Replace(s, "zc", " c")
  Print s
 
End

 :ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 20:37:41
Volendo usare Replace:

Va bene.
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: tornu - 09 Gennaio 2017, 21:22:26
Un metodo come un'altro
Codice: [Seleziona]
Public Sub Main()
  Dim s, sValore1, sValore2 As String

  s = "aaazbbbzccczddd"

  sValore1 = Left(s, 7)
  sValore2 = Right(s, 7)

  Print sValore1 & Space(1) & sValore2
End
:ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Top Fuel - 09 Gennaio 2017, 22:57:28
Un pò lunghino ma funge:
Codice: [Seleziona]
Dim i, conto As Byte
Dim stringa$ As String = "aaazbbbzccczddd"
For i = 1 To Len(stringa$)
   If Mid$(stringa$, i, 1) = "z" Then Inc conto
   If conto = 2 Then
      stringa$ = Replace(stringa$, "bz", "b ")
   Endif
Next
Print stringa$
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 23:07:14
Un metodo come un'altro
Questa va bene, la inserisco, perché hai utilizzato funzioni - Left( ), Right( ) ed anche Space( ) - non usate prima.



Un pò lunghino ma funge:
Apprezzo il tuo contributo e ti ringrazio, ma - seppur funzionante e valido - il tuo esempio utilizza funzioni - Mid( ) e Replace( ) - comunque già usate in modalità più semplice nei precedenti esempi, e già riportati quindi nella pagina della Wiki.
Grazie moltissimo, comunque.
Riprova: magari c'è qualche altra soluzione che ci sfugge.    :-\
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 09 Gennaio 2017, 23:23:28
Abbiamo riportato nella nuova pagina della Wiki su questo tema finora 5 modalità !

http://www.gambas-it.org/wiki/index.php?title=Modificare_un_carattere_di_una_stringa
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 15 Gennaio 2017, 23:02:12
Per questo quesito mi era venuto in mente che si sarebbe anche potuta usare la funzione scan.
Allora ho scritto questo:

Codice: [Seleziona]
Public Sub Main()
 
  Dim i As Byte
  Dim ss As String[]
  Dim s As String = "aaazbbbzccczddd"
  Dim z As String
 
  Print s
  For i = 1 To Len(s)
    z &= "*"
  Next
  ss = Scan(s, z)
  ss.Delete(7) 
  ss.Add(" ", 7) 
  For Each z In ss
    Print z;
  Next

End

Ma non funziona, mi da questo risultato:

Codice: [Seleziona]
aaazbbbzccczddd
 aaazbbbzccczddd

Vale a dire che non cancella e aggiunge lo spazio all'inizio.

Però se io uso il vettore senza popolarlo con scan allora funziona:

Codice: [Seleziona]
Public Sub Main()

  Dim i As Byte
  Dim ss As String[] = ["a", "a", "a", "z", "b", "b", "b", "z", "c", "c", "c", "z", "d", "d", "d"]
  Dim s As String
  Dim z As String = "aaazbbbzccczddd"
 
  Print z
  ss.Delete(7) 
  ss.Add(" ", 7) 
  For Each s In ss
    Print s;
  Next

End
E questo è l'atteso risultato:

Codice: [Seleziona]
aaazbbbzccczddd
aaazbbb ccczddd

Secondo voi perché accade questo?

 :ciao:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 15 Gennaio 2017, 23:05:55
Secondo voi perché accade questo?
Per rovinarti la serata !    :rotfl:
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 15 Gennaio 2017, 23:13:02
Per rovinarti la serata !    :rotfl:

Hai voglia, per così poco  ;D

Seriamente; evidentemente non è un normale vettore su cui puoi lavorare come con gli altri, pertanto Scan risulta limitato  :-\
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 15 Gennaio 2017, 23:15:36
Guarda che cosa hai combinato:   ;D

Codice: [Seleziona]
Public Sub Main()

  Dim i As Byte
  Dim ss As String[]
  Dim s As String = "aaazbbbzccczddd"
  Dim z As String
 
  Print s
  For i = 1 To Len(s)
    z &= "*"
  Next

  ss = Scan(s, z)

  For i = 0 To ss.Max
    Print i,
    If IsNull(ss[i]) Then
      Print "Nullo"
    Else
      Print ss[i]
    Endif
  Next

End
Pertanto, andando a piazzare il valore ASCII 32 nel byte di indice 7, succede che...... (http://forum.ubuntu-it.org/images/smilies/whistle.gif)


Alla funzione Scan( ) c'avevo pensato pure io, ma credo che non sia utilizzabile proficuamente in questo caso.  :-X
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: Gianluigi - 15 Gennaio 2017, 23:28:32

Pertanto, andando a piazzare il valore ASCII 32 nel byte di indice 7, succede che...... (http://forum.ubuntu-it.org/images/smilies/whistle.gif)
antepongo lo spazio alla stringa.
Citazione
Alla funzione Scan( ) c'avevo pensato pure io, ma credo che non sia utilizzabile proficuamente in questo caso.  :-X

Evidentemente. Io facendo le prove con For Each non avrei mai capito, grazie della spiegazione.  :-*
Accidenti non ho indagato a sufficienza.

 :ciao: e ora  :sleepy: più sereno...
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: vuott - 15 Gennaio 2017, 23:31:13
Tutti i lettori di questo forum ti dovrebbero ringraziare per aver posto, comunque, la questione: ha fatto capire molte cose in più.   (http://forum.ubuntu-it.org/images/smilies/sisi.gif)
Titolo: Re:Cambiare un carattere all'interno di una stringa fra molti uguali
Inserito da: kicco - 16 Gennaio 2017, 09:54:33
GRAZIE! GRAZIE! GRAZIE!  :D