next up previous contents
Next: Sobre este documento... Up: Técnicas de Programação Utilizando Previous: Ordenação

Manipulação de Strings

Já sabemos como construir uma cadeia de caracteres (String) a partir de outras usando concatenação, representada pelo operador &:

``Banana'' & ``Madura'' = ``BananaMadura''

Vamos agora tratar da operação inversa, ou seja, construir um String que é um ``pedaço'' de outro. Para isso, basta entender que os caracteres em um String podem ser indexados da mesma forma que as posições em um vetor (mas Strings não são apenas vetores de caracteres, pois não possuem tamanho fixo). Por exemplo, o String ``BananaMadura'' pode ser indexado como ilustrado abaixo:

B a n a n a M a d u r a
1 2 3 4 5 6 7 8 9 10 11 12

Para extrair um vetor de outro, usamos a função MID$:

Mid$( <String>, <Posiçao Inicial>, <Número de caracteres a extrair>).

Alguns exemplos:

str = ``BananaMadura''

str2_7 = Mid$( str, 2, 6 ) 'str1 recebe ``ananaM''

char10 = Mid$( str, 10, 1 ) 'char10 recebe ``u''

Uma importante função é aquela que nos dá o tamanho de um String, Len( <String> ) (do inglês, length = comprimento). Por exemplo:

n = Len(``BananaMadura'') 'n recebe 12
x = Len(``12 34'') 'x recebe 5

Outras vezes, gostaríamos de saber se um caracter extraído de um string representa um número ou não. Neste caso usamos a função IsNumeric. Por exemplo,

OK = IsNumeric(``1'') 'OK é verdadeiro
OK = IsNumeric(``;'') 'OK é falso
OK = IsNumeric(`` '') 'OK é falso
OK = IsNumeric(``x'') 'OK é falso

Vamos ilustrar o uso das funçoes Mid$, Len e IsNumeric construindo uma função que, dado um String, filtra todos os caracteres que não são numéricos. Por exemplo, dado o CPF ``123.456.789-01'', retorna o string ``12345678901'', eliminando toda a pontuação.

Function FiltraAlgarismo(strIn As String) As String

Dim pos As Integer 'posicao no string
Dim tamStr As Integer 'tamanho do string
Dim strOut As String 'string de saída
Dim letraCorr As String 'Letra corrente em strIn
pos = 1
tamStr = Len(strIn)
strOut = ""
Do While pos
<= tamStr
letraCorr = Mid$(strIn, pos, 1)
If IsNumeric(letraCorr) Then
strOut = strOut & letraCorr
End If
pos = pos + 1 'próxima posição
Loop
FiltraAlgarismo = strOut
End Function

Esse exemplo transforma, por efeito colateral, um string num vetor de caracteres (com a ressalva que o vetor de caracteres tem que ter tamanho pelo menos igual ao do string).

Sub stringVet(str As String, vet() As Integer)
'Assumimos que o tamanho de vet é
' maior que Len(str)
Dim pos As Integer
Dim strAux As String
strAux = FiltraAlgarismo(str)
pos = 1
Do While pos
<= Len(strAux)
vet(pos) = CInt(Mid$(strAux, pos, 1))
pos = pos + 1 'próxima posição
Loop
End Sub

Outro exemplo é a normalização de datas. Neste caso, uma data (dada por um string) do tipo ``3/2/98'' é transformada em ``19980203'', ou seja, uma data do tipo ``Dia/Mes/Ano'' é transformada em Ano1Mes1Dia1, onde Ano1 está com 4 algarismos, Mes1 e Dia1 com dois.

Function FormataData(data As String) As String
'transforma uma data Dia/Mes/Ano em
' um string AnoMesDia onde
Dim ano As String, mes As String, dia As String
Dim pos As Integer
Dim letraCorr As String
'Inicialização
ano = ""
mes = ""
dia = ""
pos = 1
'obtem o dia, procurando pela primeira '/'
letraCorr = Mid$(data, pos, 1)
Do While letraCorr
<> "/"
dia = dia & letraCorr
pos = pos + 1 'próxima posição
letraCorr = Mid$(data, pos, 1)
Loop
If Len(dia) = 1 Then
dia = "0" & dia
ElseIf Len(dia)
> 2 Or Len(dia) < 1 Then
dia = "00"
End If
'obtem o mes, procurando pela segunda '/'
pos = pos + 1 'vai para a próxima posição
letraCorr = Mid$(data, pos, 1)
Do While letraCorr
<> "/"
mes = mes & letraCorr
pos = pos + 1 'próxima posição
letraCorr = Mid$(data, pos, 1)
Loop
If Len(mes) = 1 Then
mes = "0" & mes
ElseIf Len(mes)
> 2 Or Len(mes) < 1 Then
mes = "00"
End If
'obtem o ano, varrendo data até o fim
pos = pos + 1 'vai para a próxima posição
letraCorr = Mid$(data, pos, 1)
Do While pos
<= Len(data)
ano = ano & letraCorr
pos = pos + 1 'próxima posição
letraCorr = Mid$(data, pos, 1)
Loop
If Len(ano) = 2 Then
ano = "19" & ano
ElseIf Len(ano)
<> 4 Then
ano = "0000"
End If
'Retorno
FormataData = ano & mes & dia
End Function

Por fim, temos uma função que verifica se uma data é valida (com alguns errinhos: quais?) que usa FormataData.

Function DataLegal(data As String) As Boolean
Dim ok As Boolean
Dim ano As Integer
Dim mes As Integer
Dim dia As Integer
Dim dataFormatada As String
ok = True
dataFormatada = FormataData(data)
ano = CInt(Mid$(dataFormatada, 1, 4))
mes = CInt(Mid$(dataFormatada, 5, 2))
dia = CInt(Mid$(dataFormatada, 7, 2))
If ano
< 1900 Or ano > 2050 Then
ok = False
End If
If mes
< 1 Or mes > 12 Then
ok = False
End If
If dia
< 1 Or mes > 31 Then
ok = False
End If
'Retorno
DataLegal = ok
End Function


Exercícios

1.
Fazer uma função que recebe um string como parâmetro e retorna um string obtido ao se eliminar os espaços em branco no início e fim do string:

	"  Bom dia, senhor   " deve ser transformado em "Bom dia, senhor"
	"Bom dia, senhor   "   deve ser transformado em "Bom dia, senhor"
	"  Bom dia, senhor"    deve ser transformado em "Bom dia, senhor"

2.
Fazer uma função que codifica um string pelo método ZENIT-POLAR:

Z E N I T
P O L A R

Ou seja, onde aparece um ``Z'' no string de entrada, aparecerá um ``P'' na saída; e, semelhantemente, onde aparece um ``P'' no string de entrada, aparecerá um ``Z'' na saída. Isto deve ocorrer para todos os pares em ZENIT-POLAR, maiúsculas e minúsculas. As outras letras não são alteradas

Por exemplo, o string ``Parabens a voce'' é codificado para ``Zitibols i veco''.

Ao se aplicar duas vezes a transformação, obtém-se o mesmo string, ou seja, a codificação de ``Zitibols i veco'' é ``Parabens a voce''.

3.
Fazer uma função que inverte um string. ``Parabens a voce'' vira ``ecov a snebaraP''.


next up previous contents
Next: Sobre este documento... Up: Técnicas de Programação Utilizando Previous: Ordenação
Flavio Soares Correa da Silva
2000-04-10