Autore Topic: Comparare due stringhe  (Letto 1842 volte)

Offline paociao

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Comparare due stringhe
« il: 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!!

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #1 il: 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
« Ultima modifica: 10 Dicembre 2012, 17:01:10 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #2 il: 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.

Offline paociao

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #3 il: 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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #4 il: 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 !
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #5 il: 11 Dicembre 2012, 10:23:18 »
Inutile che mi "infioretti", tanto non becchi 'neuro...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #6 il: 11 Dicembre 2012, 10:32:26 »
Inutile che mi "infioretti", tanto non becchi 'neuro...  ;D

Provar non nuoce... nuoce non provar ! :devil:
« 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 paociao

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #7 il: 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:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #8 il: 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 ?
« Ultima modifica: 13 Dicembre 2012, 13:33:54 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #9 il: 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...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #10 il: 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
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #11 il: 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.
« Ultima modifica: 16 Dicembre 2012, 16:59:55 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #12 il: 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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #13 il: 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

« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Comparare due stringhe
« Risposta #14 il: 13 Dicembre 2012, 16:40:27 »
Gli effetti sono molto peggio, senza pensare alle "collaterali"...  ;D