Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

Formatar data

Recommended Posts

Tenho o seguinte exercício:

 

Faça a função void SeparaData(short data) que recebe o parâmetro data com o seguinte formato:

Dia - bits 15-11

Mês - bits 10-7

Ano - bits 6-0

 

A função deve separar as informações dia, mês e ano e imprimi-lás.

 

Acredito que o usuário deve entrar: 27092008 e a função vai separar né? Não faço idéia de como começar "/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz aki um pequeno esboço de como faria, não fiz testes de data ou números inválidos, só o feijão com arroz mesmo, me parece um pouco gambiarra, mas não achei outro modo não

 

#include <stdio.h>
#include <stdlib.h>

//---------------------------------------------------------------------------

void separaData(int data){
  int dia;
  int mes;
  int ano;

  dia = data / 1000000;
  mes = ((data - (dia * 1000000)) /10000);
  ano = ((data - (dia * 1000000)) - mes * 10000);

  printf("dia: %d\n",dia);
  printf("mes: %d\n",mes);
  printf("ano: %d\n\n",ano);
}

int main(int argc, char* argv[])
{
  separaData(11022001);
  separaData(01152001);
  separaData(01022007);
  system("pause");
  return 0;
}

Quando o número começa com zero ele passa para a notação de octal, ai tem q arrumar um modo de voltar pra decimal.

 

EDIT:

 

Agora que vi que era pra ser feito com short e não com int e short não cabe esse número ai não, vai até 32.000 e alguma coisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou meio gambiarra mesmo, mas o primeiro valor deu certo, não entendi como funciona isso? Assume como a data sendo segundos? Tenho algo a ver com aquele tal de timestamp?

 

Mas de qualquer forma, acho que não é isso velho, o exercício pede pra usar manipulação de bits, campos de bits, sei lá "/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum... vai ter que trabalhar com manipulação de bits tipo:

A manipulação é feita em todos os bits da variável a qual não pode ser do

tipo float ou double.

Operador Ação

& bit and

| bit or

^ bit xor - exclusive or

<< shift left

>> shift right

~ bit not (complemento)

 

x << n irá rotacionar n vezes a variável x à esquerda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oq eu fiz foi seguir oq você imaginava que o exercício faria e bolei um programa baseado nisso, imagine a data como

 

25072005 que você imagina que seja:

 

25/07/2005

 

dividindo o mesmo por 1000000, você retorna apenas o dia 25:

 

25072005 / 1000000 = 20,072005

 

como o inteiro desconsidera a vírgula ele captura apenas o 25 e por ai vai, é apenas uma manipulação de inteiros.

 

Não tem como você passar a data 25072005 pra short pq short vai até 32.000 e 25.072.005 é muito maior que 32.000.

 

Tinha que ter um exemplo pra ver oq ele de fato quer passar como parâmetro

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
void separa_data(unsigned short data) {
  unsigned short dia,mes,ano;
  ano = data & 0x007F;
  mes = (data >> 7) & 0x000F;
  dia = (data >> 11) & 0x001F;
  printf("DIA= %hd \t MES= %hd\t ANO=%hd\n",dia,mes,ano);
}

int main() {
 unsigned short diaD,mesD,anoD;
 scanf("%hd %hd %hd",&diaD,&mesD,&anoD);
 unsigned short T = 0;
 T = T|diaD;
 T = T << 4;
 T = T|mesD;
 T = T << 7;
 T = T|anoD;
 separa_data(T);
 return(0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isis, tenho algumas dúvidas:

 

1º: testei o código que você postou com as seguintes entradas: 10 05 2000. O resultado foi DIA=10 MES=15 ANO=80.

 

2º: qq significa esse %hd?

 

3º: com base em que, você fez essas operações usando deslocamento e o "ou"? Algebra booleana?

 

4º: isso "0x007F" é endereço de memória?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Groove, preste atenção na quantidade de bits do ano: 7 bits = 128 valores possíveis. Os anos variam de 0 a 127, somente.

Se tem que utilizar notação biased isso é outro problema.

 

Notação hexa não se usa somente p/ endereçar memória.Serve de máscara também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Groove, preste atenção na quantidade de bits do ano: 7 bits = 128 valores possíveis. Os anos variam de 0 a 127, somente.

Como assim?

 

Essa notação "0x007F" equivale a 112 em decimal? Outra coisa, esse "0x" indica ser um hexa né? A representação máxima de elementos seria essa "0x0000"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Máscara em hexa é utilizada p/ se extrair bits.

O valor em decimal que você digita para o ano tem que estar entre 0 e 127,já que você quer enfiar isso em 7 bits. 2000 precisa de 11 bits p/ ser representado.

 

0x0000 = 0

0xFFFF = 255

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpem ressucitar este tópico, mas é que precisei de marcara e voltei a este tópico, fiquei com uma duvida, oq acontece com isso:

 

T = T|diaD;

 

?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.