Ir para conteúdo
Fórum Script Brasil
  • 0

Dia da semana em c.


{Nando}

Pergunta

Tem um algorítmo que não estou entendo. É do livro do Jaime Evaristo "Aprendendo a Programar Programando em C"

"Tomando como base o ano de 1600, e sabendo que o primeiro dia deste ano foi um sábado, para se determinar o dia da semana de uma data dada basta se calcular o número de dias decorridos entre a data dada e o dia 01/01/1600. Como a associação do dia da semana a uma data é periódica, de período 7, o resto da divisão do número de dias referido acima por 7 indica a relação entre o dia da semana procurado e o sábado: se o resto for 1, o dia da semana é sábado; se o resto for 2 o dia da semana é domingo, e assim sucessivamente.

Para se calcular o número de dias entre uma data dada e 01/01/1600, basta multiplicar o número de anos por 365, acrescentar a quantidade de anos bissextos e o número de dias decorridos no ano corrente:"

/* Algoritmo para determinar o dia da semana entre uma data dada. */
  #include <stdio.h>
  main()
{
int Dia, Mes, Ano, DiasDoAno, Dias31, AnosBiss;
long int Anos, NumDias;

  printf ( "Digite dia, mes e ano: \n" );
  scanf ( "%d %d %d", &Dia, &Mes, &Ano );
  Anos = Ano - 1600;

  /* Número de mêses com 31 dias até o mes dado. */
  if ( Mes < 9 )
      Dias31 = Mes / 2;
  else
      Dias31 = ( Mes + 1 ) / 2;

  /* Números de dias do ano dado, considerando fevereiro como
   * tendo 30 dias. */
  DiasDoAno = 30 * ( Mes - 1 ) + Dia + Dias31;

  /* Retifica o número de dias de fevereiro */
  if ( Mes >= 2 )
    if ( ( Ano % 4 != 0 ) || ( ( Ano % 100 == 0 ) && ( Ano % 400 != 0 ) ) ) /*aqui faltava o if */
      DiasDoAno = DiasDoAno - 2;
  else
      DiasDoAno = DiasDoAno - 1;

  /* Número de anos bissextos entre o ano dado e 1600 */
  AnosBiss = Ano / 4 - 400 - ( Ano / 100 - 16 ) + ( Ano / 400 - 4 ) + 1;

  /* Número de dias entre a dara dada e 01/01/1600. */
  if ( Ano == 1600 )
      NumDias = DiasDoAno;
  else
      NumDias = Anos * 365 + DiasDoAno + AnosBiss;

  /* Dia da semana. */
  switch ( NumDias % 7 )
      {
      case 1 : printf ( "\n Sábado." ); break;
      case 2 : printf ( "\n Domingo." ); break;
      case 3 : printf ( "\n Segunda." ); break;
      case 4 : printf ( "\n Terça." ); break;
      case 5 : printf ( "\n Quarta." ); break;
      case 6 : printf ( "\n Quinta." ); break;
      case 7 : printf ( "\n Sexta." ); break;
      }
}

Aqui está o paste. (sintax colorida)

pastebin

Bom, aprincípio não estou entendeno a parte /* Número de mêses com 31 dias até o mes dado. */ e a parte

/* Número de anos bissextos entre o ano dado e 1600 */.

Edit: estava faltando um if

Editado por {Nando}
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Para dar um up, e também para expilcar melhor o meu problema (eu esatava atrasado outro dia), não entedo

porque

if ( Mes < 9 )
      Dias31 = Mes / 2;
  else
      Dias31 = ( Mes + 1 ) / 2;
? E esta parte:
AnosBiss = Ano / 4 - 400 - ( Ano / 100 - 16 ) + ( Ano / 400 - 4 ) + 1;

Estou realmente precisando de ajuda com a lógica deste algorítmo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...