Strings, Horas e Datas

De GNU Octave
Ir para: navegação, pesquisa

Em Octave, podem-se representar e manipular strings, isto é, cadeias de caracteres.

Constantes

Uma string consiste numa sequência de caracteres. Um string pode ser declarada usando " (aspas) ou ' (apóstrofo).

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
  1. Pegue numa string e converta-a numa mensagem secreta, adicionando 3 ao código de cada letra da mensagem.
  2. Pegue numa string e escreva-a ao contrário.
  3. Pegue numa string e verifique se é um palíndromo. Veja a lista de palíndromos.
Exercício
  1. 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"
  2. 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.
  3. 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.
  4. Dado o nome completo de uma pessoa, diga quantos nomes essa pessoa tem.

Concatenação (junção) de strings

Duas strings podem ser coladas usando a notação das matrizes.

Ou seja:

>> ela = 'Maria'
ela = Maria
>> [ela ' da ' 'Fonte']
ans = Maria da Fonte

Há outras formas de colar strings. As funções strcat e cstrcat servem também para colar strings. Note que há uma pequena diferença entre elas. A função strcat remove os espaços no fim de cada uma das strings antes de as colar.

>> strcat(ela, ' da ', 'Fonte')
ans = Maria daFonte
>> cstrcat(ela, ' da ', 'Fonte')
ans = Maria da Fonte
Exercício
  1. Pegue no nome completo de uma pessoa, e escreva-o novamente começando pelo apelido, seguido de uma vírgula e um espaço, e depois o resto do nome. Ou seja, o nome Jorge Gustavo Rocha devia aparecer como:
    Rocha, Jorge Gustavo

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
Exercício
  1. Calcule o número de dias que viveu até hoje.
  2. Em que dia da semana nasceu?
  3. Imagine que começou a fumar aos 17 anos. Isto é, não fumou durante os seus primeiros 16 anos de vida. A partir dos 17 anos fuma meio maço de cigarros por dia, sendo que cada maço de 20 cigarros custa 3,70 €. Calcule quanto teria gasto em tabaco até hoje.