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

[AJUDA] anos bissexto


vandal

Pergunta

Olá pessoal, boa tarde.

Poderiam me ajudar na seguinte missão:

Escrever um programa que peça três inteiros, correspondentes a dia , mês e ano. Peça os números até conseguir valores que estejam na faixa correta (dias entre 1 e 31, mês entre 1 e 12 e ano entre 1900 e 2100). Verifique se o mês e o número de dias batem (incluindo verificação de anos bissextos).

E por ultimo imprimir o numero que aquele dia corresponde ao ano... :(

Desde já obrigado.

Super CPP, ta por aí? hehehe :D

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Olá Vandal,

Vou te dar a missão de melhorar o calculo do ano bissexto ok.

Tem algo mais que deve ser considerado.

Também tá faltando os includes necessários.

void main(void)
{
    int meses[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int dia, mes, ano;
    
    printf("\nDIA: ); scanf("%d", &dia);
    printf("\nMES: ); scanf("%d", &mes);
    printf("\nANO: ); scanf("%d", &ano);
    
    if ((ano % 4) == 0)
        meses[1] = 29;
    if ((mes < 1 || mes > 12) || (dia < 1 || dia > meses[mes - 1]))
        printf("\nData invalida: ");
    else
        printf("\nData Valida: ");
    printf("%02d/%02d/%04d\n\n", dia, mes, ano);
}

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo CPP.

mudei alguma coisa, veja se ficou legal.

#include <stdio.h>
#include <conio.h>

int main()
{
    int meses[] = {31,28,31,30,31,30,31,31,30,31,30,31};
     int dia, mes, ano;
    
    do{
        printf("\nDia:");
        scanf("%d",&dia);
        }while(dia < 1||dia > 31);
        
    do{
        printf("\nMes:");
        scanf("%d", &mes);
        }while(mes <1|| mes >12);
        
    do{
        printf("Ano");
        scanf("%d",&ano);
        }while(ano <1900||ano>2100);
      
    if (ano%4==0 && (ano%400==0||ano%100!=0))
        meses[1] = 29;
    if ((mes < 1 || mes > 12) || (dia < 1 || dia > meses[mes - 1]))
        printf("\nData invalida: ");
        
    else
        printf("\nData Valida: ");
    printf("%02d/%02d/%04d\n\n", dia, mes, ano);
    
    getch();
}

A próposito, pode me ajudar a incluir em qual dia do ano a data se encotra? (de 1900 a 2100).

Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Vandal,

Eu fiz uma função básica pra contar dias entre duas datas.

Existe uma forma mais científica de fazer isso. Inclusive tenho essa versão num dos módulos do sistema.

Mas, acho essa versão mais didática.

Espero que atenda suas expectativas.

Você pode conferir os resultados com uma planilha excel.

Eu fiz usando parametros de linha de comando então você precisa digitar: datas <menor data> <maior data>

Sempre no formato "dd/mm/aaaa" (com as barras)

Qualquer dúvida avisa ai mano.

Abs

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

int IsValidDate(char *data);

unsigned int diffdate(char *data1, char *data2)
{
    if (!IsValidDate(data1) || !IsValidDate(data2))
        return 0;
    int meses[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int dia, mes, ano;
    unsigned soma = 0;
    char auxData[10], datax[10];
    strcpy(datax, data1);
    // dd/mm/aaaa
    datax[2] = 0;
    datax[5] = 0;
    dia = atoi(datax);
    mes = atoi(datax + 3);
    ano = atoi(datax + 6);
    do
        {
        if (ano%4==0 && (ano%400==0||ano%100!=0))
            meses[1] = 29;
        else
            meses[1] = 28;
        dia++;
        if (dia > meses[mes - 1])
            {
            dia = 1;
            mes++;
            if (mes > 12)
                {
                mes = 1;
                ano++;
                }
            }
        soma++;
        sprintf(auxData, "%02d/%02d/%04d", dia, mes, ano);
        } while(strcmp(auxData, data2));
    return soma + 1;
}

int IsValidDate(char *dataIn)
{
    int meses[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int dia, mes, ano;
    char data[10];
    strcpy(data, dataIn);
    // dd/mm/aaaa
    data[2] = 0;
    data[5] = 0;
    dia = atoi(data);
    mes = atoi(data + 3);
    ano = atoi(data + 6);
    if (ano%4==0 && (ano%400==0||ano%100!=0))
        meses[1] = 29;
    if ((mes < 1 || mes > 12) || (dia < 1 || dia > meses[mes - 1]))
        return 0;    // data invalida
    return 1; // data valida
}

void main(int argc, char **argv)
{
    if (!IsValidDate(argv[1]))
        {
        printf("Data invalida (%s)\n", argv[1]);
        exit(1);
        }
        
    printf("Diferenca entre %s e %s = %u\n", argv[1], argv[2], diffdate(argv[1], argv[2]));
}

Editado por CPP
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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...