Strings, Horas e Datas
Em Octave, podem-se representar e manipular strings, isto é, cadeias de caracteres.
Índice
Constantes
Uma string consiste numa sequência de caracteres. Um string pode ser declarada usando " (aspas) ou ' (pelicas).
Exemplo:
"asterix"
'asterix'
Como há carateres especiais como o newline (para indicar o fim de linha), nas strings delimitadas por aspas, é necessário usar o caracter especial '\' para indicar os caracteres especiais. Por exemplo:
octave:30> x = "Os Lusíadas\nLuís Vaz de Camões" x = Os Lusíadas Luís Vaz de Camões
As aspas podem ser inseridas usando o '\'. Exemplo:
octave:31> x = "Os \"Patrícios\""
x = Os "Patrícios"
Alternativamente, a string anterior podia ser introduzida com ', sem necessidade de usar o '\' para indicar os caracteres especiais.
octave:32> x = 'Os "Patrícios"' x = Os "Patrícios"
Nas sequências delimitadas por ', o único caracter especial é a própria '. Para escrever uma string com ', usa-se:
octave:33> x = 'Vitorino d''Almeida' x = Vitorino d'Almeida
Representação interna de strings
Cara caracter é internamente representado por um código. A função toascii devolve o código do(s) caracter(es).
octave:35> toascii('asterix') ans = 97 115 116 101 114 105 120
Significa que o caracter 'a' é representado internamente pelo número 97, o 's' pelo número 115 e assim sucessivamente.
Inversamente, a função char devolve o caracter correspondente a um determinado código.
octave:38> char(97) ans = a
Uma string é representada internamente como um vetor. Ou seja, a string 'bruno' é representada internamente como o vetor:
[98, 114, 117, 110, 111]
Usando a função whos comprova-se que a variável x é um vetor com a dimensão 1x5.
octave:54> x = 'bruno' x = bruno octave:55> whos Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== x 1x5 5 char Total is 5 elements using 5 bytes
Assim sendo, utilizando as funções toascii e char podemos apresentar a string ora com os respetivos códigos, ora com os caracteres.
octave:49> x = 'bruno' x = bruno octave:50> y = toascii(x) y = 98 114 117 110 111 octave:51> z = char(y) z = bruno
Exercício
- Pegue numa string e converta-a numa mensagem secreta, adicionando 3 ao código de cada letra da mensagem.
- Pegue numa string e escreva-a ao contrário.
- Pegue numa string e verifique se é um palíndromo. Veja a lista de palíndromos.
Soluções dos exercícios | Resumo | Resposta |
---|---|---|
1 | mensagem secreta | x = bruno >> char(x+3) ans = euxqr |
2 | Escrever string ao contrário | >> x = 'diana' x = diana >> fliplr(x) ans = anaid |
3 | É palíndromo? | >> f = 'sopapos' f = sopapos >> f == fliplr(f) ans = 1 1 1 1 1 1 1 >> all(f == fliplr(f)) ans = 1 |
3 | É palíndromo? (versão melhorada) | >> pal = 'Ana' pal = Ana >> all(tolower(pal) == fliplr(tolower(pal))) ans = 1 |
Exercício
- Pegue numa frase, contendo espaços, maiúsculas e minúsculas e verifique se é um palíndromo. Use, por exemplo, a frase: "A base do teto desaba"
- Dado o nome completo de uma pessoa, calcule o apelido. Ou seja, aplique uma composição de funções a um nome de maneira a ficar só com o apelido.
- Dado o nome completo de uma pessoa, calcule o primeiro nome. Ou seja, aplique uma composição de funções a um nome de maneira a ficar só com o primeiro nome.
- Dado o nome completo de uma pessoa, diga quantos nomes essa pessoa tem.
Soluções dos exercícios | Resumo | Resposta |
---|---|---|
1 | Filtrar os espaços e passar tudo para minúsculas | >> frase = 'A base do teto desaba' frase = A base do teto desaba >> fliplr(frase) ans = abased otet od esab A >> frase(frase != ' ') ans = Abasedotetodesaba >> lower(frase(frase != ' ')) ans = abasedotetodesaba >> fraselimpa = lower(frase(frase != ' ')) fraselimpa = abasedotetodesaba >> all(fraselimpa == fliplr(fraselimpa)) ans = 1 |
1 | Aproveitar as letras e passar tudo para minúsculas | >> pal = "Socorram-me em Marrocos!" pal = Socorram-me em Marrocos! >> limpa = tolower(pal(isletter(pal))) limpa = socorrammeemmarrocos >> all(limpa == fliplr(limpa)) ans = 1 |
2 | Apelido: do último espaço mais 1 até ao fim | >> nome = 'Jorge Gustavo Rocha' nome = Jorge Gustavo Rocha >> nome(find(isspace(nome))(end)+1:end) ans = Rocha |
3 | Nome próprio: da primeira posição até ao primeiro espaço menos 1 | >> nome = 'Jorge Gustavo Rocha' nome = Jorge Gustavo Rocha >> nome(1:find(isspace(nome))(1)-1) ans = Jorge |
4 | Nº de nomes: número de espaços mais 1 | >> nome = 'Jorge Gustavo Rocha' nome = Jorge Gustavo Rocha >> length(nome(isspace(nome)))+1 ans = 3 |
Datas e horas
A função now
dá-nos a data e hora local.
>> now ans = 735521.933572142
Embora o resultado pareça estranho, na verdade é um número real em que a parte inteira (que se obtém com floor(now)
) representa a data em termos do número de dias depois de 1 de janeiro de 0000.
A parte fracionária (que se obtém com rem (now, 1)
ou now-floor(now)
) corresponde à hora atual.
Uma forma prática de converter o resultado de now
numa sequência legível é através da função datestr
.
>> now ans = 735521.940432831 >> datestr(now) ans = 14-Oct-2013 22:34:20 >> datestr(floor(now)) ans = 14-Oct-2013 >> datestr(rem(now,1)) ans = 22:34 PM
Uma data ou uma hora pode ser apresentada de formas muito diferentes, variando de país para país. A função datestr
aceita um código correspondente a uma formatação típica ou uma regra de formatação, numa sintaxe própria. Para mais informações, deve-se consultar a ajuda da função (help datestr
).
No seguinte exemplo, usa-se uma regra de formatação que nos apresenta apenas as horas (omitindo a data).
>> datestr(now, 'HH:MM:SS') ans = 22:39:33
Uma data/hora pode ser definida a partir dos valores do ano, mês, dia, hora minutos e segundos, pode esta mesma ordem, com a função datenum
.
>> t3 = datenum(1969, 7, 25, 16, 01, 00) t3 = 719369.667361111 >> datestr(t3) ans = 25-Jul-1969 16:01:00
A função datenum
permite também que seja passada uma representação textual da data/hora e o respetivo formato.
>> datenum('1969-07-25', 'yyyy-mm-dd') ans = 719369
Operações
Como vimos, uma data/hora é representada por um número real. Podemos fazer operações diretamente sobre essa representação.
Por exemplo, somando 1 a uma data/hora, qual será o resultado?
>> t3 = datenum(1969, 7, 25, 16, 30, 17) t3 = 719369.687696759 >> t3+1 ans = 719370.687696759 >> datestr(t3+1) ans = 26-Jul-1969 16:30:17
Existe uma função addtodate
que nos permite modificar uma data/hora de uma forma mais simpática. Usa-se da seguinte forma:
addtodate(data/hora, quantidade, componente)
, em que a quantidade é um inteiro positivo ou negativo, e a componente é uma de: 'year', 'month', 'day', 'hour', 'minute', 'second' ou 'millisecond'.
>> addtodate(t3, 1, 'day') ans = 719370.687696759 >> addtodate(t3, -1, 'day') ans = 719368.687696759 >> addtodate(t3, -1, 'month') ans = 719339.687696759 >> addtodate(t3, 2, 'hour') ans = 719369.771030093
Por exemplo, se somarmos 1 segundo mesmo no final do ano, a data muda para o ano seguinte:
>> fimdoano = datenum(2013, 12, 31, 23, 59, 59) fimdoano = 735599.999988426 >> datestr(addtodate(fimdoano, 1, 'second'), 0) ans = 01-Jan-2014 00:00:00
Note que, quando uma das partes da data/hora é zero (a parte da data ou a parte das horas) a função datestr
não apresenta a mesma. Por isso, no exemplo anterior forçamos a apresentação das horas, mesmo sendo 00:00:00 especificando o formato com o código 0 (veja help datestr
). O formato cujo código é 0 é: 'dd-mmm-yyyy HH:MM:SS'.
Diferença entre datas
>> t1 = now t1 = 735521.945864606 >> t2 = now t2 = 735521.945964734 >> datestr(t2-t1, 'HH:MM:SS') ans = 00:00:08
Data/hora num vetor
Por vezes, torna-se útil transformar uma data/hora num vetor constituído pelas componentes da data/hora.
>> LutherKing = datenum('15-01-1929', 'dd-mm-yyyy') LutherKing = 704568 >> datevec(LutherKing) ans = 1929 1 15 0 0 0 >>
Estando cada uma das componentes separadas no vetor, pode-se extrair qualquer uma delas. Por isso, o dia de nascimento de Luther King pode-se extrair com:
>> datevec(LutherKing)(3) ans = 15