Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: paociao - 10 Dicembre 2012, 16:17:01

Titolo: Comparare due stringhe
Inserito da: paociao - 10 Dicembre 2012, 16:17:01
Buon pomeriggio a tutti!

Sono una nuova "gamberetta"! Da qualche mese sono stata incaricati di realizzare un programmino molto banale per chi sa programmare...io purtroppo non vado molto d'accordo con i vari linguaggi di programmazione e ora mi trovo un pò in crisi!!! :hatecomputer: :hatecomputer: :hatecomputer:

Il mio problema è questo:

Ho una sequenza di 0 e 1 che formano una stringa (chiamiamola "prima_stringa" per comodità), la quale viene poi modificata (cioè alcuni 0 diventeranno 1 e viceversa). La nuova stringa (chiamiamola "stringa_modificata") deve essere confrontata con "prima_stringa" e devo contare quanti caratteri hanno di differenza queste due stringhe.

Come posso fare??? ??? ??? ??? ???
Aiutatemi, vi prego!!
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 10 Dicembre 2012, 16:27:52
Mi sembra di capire che si tratta di due "Stringhe" contenenti caratteri numerici... ad ogni modo, puoi utilizzare l'apposita e semplice funzione Comp, che compara due stringhe:
http://gambasdoc.org/help/lang/comp?it


Per ottenere il numero di caratteri differenti, dovresti comparare carattere per carattere....
...potrebbe essere per esempio una cosa di questo genere:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim s, ss As String
 Dim j As Byte
 Dim a As Short

  s = "0101"
  ss = "0111"

' Contiamo fino al numero pari alla lunghezza di una stringa
' (le stringhe tu hai detto che sono di lunghezza uguale,
' seppur con caratteri successivamente modificati):
    For j = 1 To Len(s)
' Se i rispettivi caratteri in posizione j all'interno delle due stringhe sono "diversi"...
    If Mid(s, j, 1) <> Mid(ss, j, 1) Then
'...allora incrementa la variabile "a" di un'unità:
      Inc a
    Endif
  Next

    Print "Il numero di caratteri differenti fra le due stringhe è:  "; a

End
Titolo: Re: Comparare due stringhe
Inserito da: md9327 - 10 Dicembre 2012, 16:45:40
In pratica, devi confrontare:
Codice: [Seleziona]
a = "0010010001100"

con

b = "1111000110011"

Il problema, cui penso di aver capito sia il tuo obiettivo, è che oltre a capire che sono diversi, anche qual'è il carattere diverso, invertendone il valore in base ad alcune condizioni.
Sempre se parliamo di stringhe, e non di un valore binario, potresti crearti un array di Byte, in cui splitti tutti i caratteri della stringa. Analizzare poi il singolo Byte diventa piuttosto semplice, come anche ricreare la stringa eventualmente modificata.

Altra alternativa, se i valori possono assumere due sole condizioni (0 e 1), è quella di trasformare la stringa sempre in un array di Integer (o equivalenti), convertendo opportunamente i singoli byte estratti dalla stringa. Anche in questo caso, a parte la conversione String->Integer, la gestione diventerebbe più semplice.
Titolo: Re: Comparare due stringhe
Inserito da: paociao - 10 Dicembre 2012, 19:06:06
Volevo ringraziarvi tantissimo!!! ne sapete una più del diavolo!!

@vuott: il tuo pezzo di codice mi è stato super stra mega utilissimo!!! ;) ;) ;) ;)

Davvero grazie a tutte e due!! ;D ;D ;D ;D ;D
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 10 Dicembre 2012, 19:40:56
Volevo ringraziarvi tantissimo!!! ne sapete una più del diavolo!!

Io sono semplicemente un asino in Gambas.

md9327 è, invece, un vero moschettiere che tira di fioretto !
(http://t0.gstatic.com/images?q=tbn:ANd9GcTcBPJlOl51Ra8L35XbRUzGiZp7beYZdT7YI99Y8NqxrERx1Bm1)
Titolo: Re: Comparare due stringhe
Inserito da: md9327 - 11 Dicembre 2012, 10:23:18
Inutile che mi "infioretti", tanto non becchi 'neuro...  ;D
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 11 Dicembre 2012, 10:32:26
Inutile che mi "infioretti", tanto non becchi 'neuro...  ;D

Provar non nuoce... nuoce non provar ! :devil:
Titolo: Re: Comparare due stringhe
Inserito da: paociao - 13 Dicembre 2012, 09:54:19
So che qui non è il posto giusto, ma mi sembrati particolarmente agguerriti!! :2birre:

Il mio problema ora è questo:

Ho un numero binario che devo convertire nel corrispondente carattere ASCII (es. 1100011 -> c). Ho fatto il passaggio intermedio di convertirlo prima in numero decimale e poi in carattere. A questo punto vorrei che il carattere si stampasse all'interno di una TextBox. Fin qui tutto bene, se non fosse che questo procedimento dev'essere ripetuto per molti numeri e vorrei che nella TextBox venissero stampate tutte le lettere e non solo l'ultima.

Mi spiego meglio: se, ad esempio, ho la sequenza 1100011 1101001 1100001 1101111 vorrei che mi venissero stampate le lettere c i a o l'una accanto all'altra e non solo l'ultima lettera.  :'( :'( :'( :'( :'( Come posso fare?

Oppure, domanda più intelligente, in Gambas esiste una funzione che direttamente da sequenze di bit a carattere? :hard: :hard: :hard:
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 13 Dicembre 2012, 10:53:44
se, ad esempio, ho la sequenza 1100011 1101001 1100001 1101111 vorrei che mi venissero stampate le lettere c i a o l'una accanto all'altra e non solo l'ultima lettera.  Come posso fare?

Oppure, domanda più intelligente, in Gambas esiste una funzione che direttamente da sequenze di bit a carattere?

1) Non voglio fare il Ceskho della situazione... ;D ...ma sarebbe più opportuno, in quanto meglio leggibile ed anche più utile per i futuri lettori, che nuovi problemi fossero posti in nuove discussioni nel forum.

2) Ci puoi passare la parte di codice con il quale converti e stampi le lettere ? In tal modo potremmo suggerirti magari l'integrazione più coerente con il codice medesimo per ottenere il risultato da te voluto.

3) non mi risulta che esista una specifica funzione per la conversione diretta di un valore di formato binario (intendo in tal caso sequenze di 1 e 0) in carattere. :-\

4) ...tu hai a disposizione il manuale base di Gambas ?
Titolo: Re: Comparare due stringhe
Inserito da: md9327 - 13 Dicembre 2012, 11:27:26
Tieni conto che i byte che stai tentando di interpretare sono da 8 bit, e quindi eventualmente si riferiscono alla tabella Ascii standard (spero...).
In gambas, le stringhe vengono trattate in UTF8, e quindi i singoli caratteri potrebbero avere valori superiori ai 256 bit.

Ad ogni modo, la conversione di un binario (visto che stai trattando questo tipo di dati si presume che sai quello che stai facendo...) è relativamente semplice, in quanto gambas offre una serie di funzioni per lavorare appunto sui singoli bit.
Anche accodare i singoli byte in una stringa è molto semplice.
E' sottinteso che dovrai effettuare un doppio passaggio, che la sequenza dei bit che ricevi sono in formato "1" e "0" ascii (ovvero 0x30 e 0x31).
Se, invece, stai trattando valori già binari, allora i passaggi e le conversioni sono minori.
Dalle informazioni che ci dai, non è chiaro il formato dei dati di partenza.
E attenzione a non confondere binario con carattere (anche se la base è la stessa...).

Come suggerito da vuott, dovresti dare prima un'occhiata alle funzioni fornite in gambas, e già l'help in linea fornisce questa possibilità.

Quello che dico sempre, è tentare di usare una determinata funzione, ed eventualmente chiedere se si incontrano problemi con l'interpretazione dell'help, o con un funzionamento anomalo o inaspettato della stessa.

Perdona, ma fornire soluzioni immediate e funzionanti non è lo spirito di questo forum...
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 13 Dicembre 2012, 13:07:45
Perdona, ma fornire soluzioni immediate e funzionanti non è lo spirito di questo forum...
...questo non è un tiro di fioretto, bensì una randellata ! ;D
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 13 Dicembre 2012, 13:22:58
.... vorrei che mi venissero stampate le lettere c i a o l'una accanto all'altra e non solo l'ultima lettera. Come posso fare?

Violando il giusto approccio pedagogico di md9327 (e quindi rischiando anche io le randellate), solitamente se si hanno più caratteri da aggiungere fra loro, si procede aggiungendo il nuovo carattere al precedente contenuto di un oggetto di testo (come nel tuo caso) o di una variabile di tipo stringa:
Codice: gambas [Seleziona]

  TextArea1.Text = TextArea1.Text & nuovo_carattere


Esempio pratico banalissimo :
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim carat As String = "b"

' Aggiungo al testo, già presente nella "TextArea" , il carattere "A":
  TextArea1.Text = TextArea1.Text & "A"

' Aggiungo al testo, già presente nella "TextArea" , il carattere "l":
   TextArea1.Text = TextArea1.Text & "l"

' Aggiungo....... etc......etc.......
   TextArea1.Text = TextArea1.Text & "i"

   TextArea1.Text = TextArea1.Text & "b"

   TextArea1.Text = TextArea1.Text & "a"

   TextArea1.Text = TextArea1.Text & carat

   TextArea1.Text = TextArea1.Text & Chr(97)

End

Il codice, sopra scritto, è a titolo meramente esemplificativo, e solo ed esclusivamente per mostrare come si aggiungono i caratteri. Ovviamente tale modalità vale anche se al posto dello specifico carattere hai variabili di tipo stringa.

Però, ripeto, ti conviene fare prima le ricerche nel forum, e scaricare il manuale base di Gambassss.
Titolo: Re: Comparare due stringhe
Inserito da: md9327 - 13 Dicembre 2012, 15:08:52
Randellate a IOSA!!!!  :evil: >:(

Non volevo anzi, volevo  ;D , essere cattivo...

Scherzi a parte, la mia era solo per chiarire un concetto, che a volte viene dimenticato o non ben percepito da chi si avvicina ad un linguaggio.

Ad ogni modo, gli esempi di vuott sono sicuramente utili, se lo scopo è quello che si intende ottenere.

Codice: [Seleziona]
Ulteriore suggerimento:
...
TextArea1.Text &= nuovo_carattere
...
che permette di scrivere un pochino meno...
  :D

Comunque, quello che intendevo, era:

1) spiegare meglio che tipo di dato hai in ingresso, in particolare se sono una serie di bit, o caratteri rappresentanti dei bit ("0" e "1")
2) una volta identificato quello che tocca trattare, si può procedere a identificare i singoli valori
3) eventuali trasformazioni dovranno essere basate sul tipo di dato originale, quindi o binario o carattere
4) visualizzare e/o stampare il dato convertito in stringa, quindi direttamente leggibile, a video o verso qualunque altra destinazione

la sequenza segue la logica che deve essere adottata, e quindi necessita di sapere esattamente il punto di partenza, cioè il dato e il suo formato.

Questo serve anche a noi per poterti dare suggerimenti validi, ed evitare di darti informazioni sbagliate e/o fuorvianti.


P.S.: per vuott:
stai rischiando grosso... se capita ancora ti infetto con la ceskhonite rossa...  ;D
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 13 Dicembre 2012, 16:02:09
P.S.: per vuott:
stai rischiando grosso... se capita ancora ti infetto con la ceskhonite rossa...  ;D

....tipo 'sta roba ? :-X
(http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Monkeypox.jpg/270px-Monkeypox.jpg)
Titolo: Re: Comparare due stringhe
Inserito da: md9327 - 13 Dicembre 2012, 16:40:27
Gli effetti sono molto peggio, senza pensare alle "collaterali"...  ;D
Titolo: Re: Comparare due stringhe
Inserito da: vuott - 13 Dicembre 2012, 16:45:36
Gli effetti sono molto peggio, senza pensare alle "collaterali"...  ;D

...diventerò un asino cotto ?

O forse un asino in cattedra !
(http://www.lenguadetrapo.com/images/images/003.jpg)
Titolo: Re: Comparare due stringhe
Inserito da: paociao - 16 Dicembre 2012, 15:34:47
Chiedo scusa a tutti!! so che avrei dovuto scrivere in una nuova discussione, ma erano piaciute le vostre risposte e avevo piacere di chiedere a voi in modo particolare...non sapendo in che altro modo fare ho scritto qui! :'( :'( :'( :'( chiedo venia! :-\ :-\

Inoltre vi ringrazio per le risposte che ho letto solo ora...in realtà avevo risolto poco dopo l'aver inserito la domanda scrivendo questo codice (che è come avete suggerito voi!!):

Codice: [Seleziona]
PUBLIC SUB ritorno_Click()

  DIM b AS Integer
  DIM a AS String
  DIM Intero, InteroFinale AS Integer 
  DIM Esponente, crt AS Integer 
  DIM divisa AS String[]
  DIM Sb AS String 
  DIM bit AS String = messbit.Text
  DIM finale AS String
 
   
  divisa = Split(bit, " ")
 

 FOR EACH a IN divisa

 Esponente = 0 
 InteroFinale = 0
 FOR b = Len(a) TO 1 STEP -1 
 
  crt = Int(Val(Mid(a, b, 1))) 
   
  Intero = crt * 2 ^ Esponente 
 
  Esponente += 1 
   
  InteroFinale = InteroFinale + Intero 
 
  finale = Chr(InteroFinale)
 
 
 NEXT 
 testo.Text = testo.Text & finale
 
 NEXT

END


dove messbit è la TextArea in cui ho una serie di 0 e 1 che derivano dalla conversione in binario dei caratteri precedentemente inseriti in una TextArea che ho chiamato testo.
Probabilmente inorridirete quando leggerete il codice, ma è l'unica soluzione che ho trovato io...portate pazienza...la programmazione non fa proprio per me!! :mad: :mad: :mad:

Ah, ora mi è rimasto solo il problema che l'ultima lettera si stampa 3 volte invece che una sola...probabilmente il ciclo viene eseguito due volte in più del necessario, ma ora vedrò di risolvere!!! :coder: :coder:


Titolo: Re: Comparare due stringhe
Inserito da: vuott - 16 Dicembre 2012, 15:54:16
Ah, ora mi è rimasto solo il problema che l'ultima lettera si stampa 3 volte invece che una sola...probabilmente il ciclo viene eseguito due volte in più del necessario, ma ora vedrò di risolvere!!!

...è forse una velata richiesta di aiuto anche su questo problema ?   ;D
Titolo: Re: Comparare due stringhe
Inserito da: paociao - 17 Dicembre 2012, 11:18:22
No, ti ringrazio!!! :coder: :coder: