Ir ao conteúdo

Posts recomendados

Postado

Como usar devidamente essa parte do código

 int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);

  ??

(ob: sou obrigada a usar )

 

 


 

#include <stdio.h>
#include <math.h>

//DATA VALIDA



//Funções para data

int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);



  //Declarando variaveis dia (D),mes(M) e ano (A)
         int main(){
         int D, M, A;

      scanf("%d %d %d", &D, &M, &A);





  //Numeros sao validos para data ,quando :
  if ((D >= 1 && D <= 31) && (M >= 1 && M <= 12) && (A >= 1){
      printf("valida");
      }



  //Verifica o mes de feveireiro
    if (D <= 28 && M == 2){
        printf("valida");
        }

  //Para os meses com 30 dias
     if(( D<= 30) && ( M == 4 ||M == 6 || M == 9 ||M == 11)){
        printf("valida");
        }

     //Para os meses de 31 dias
     if ((D <=31) && (M == 1 || M == 3 || M== 5 ||M == 7 ||M ==8 ||M == 10 ||M == 12)){

   //imprime valida para data valida
                printf("valida");
            }else{

//imprime invalida para data nao valida.
              printf("invalida");
              }
      return 0;
     }

 

Postado

Esse protótipo de função foi dado pelo professor?

Está estranho o que exatamente foi fornecido e o que foi pedido para fazer?

 

Leia minha assinatura abaixo para ver como postar códigos no fórum.

  • Curtir 1
Postado

@Bruna Christina Você deve apenas transferir o código de validação que está em main() para dentro de sua função data() e chamar depois de ler os valores.

 

Provavelmente esse enunciado foi escrito errado...

 

Imagino que a intenção era escrever uma função tipo avaliar_data() que fizesse isso e retornasse o resultado nas duas últimas variáveis.

 

Do modo como está declarado os valores vão passar de main() para data() mas vão morrer lá dentro. A única coisa que vai voltar da função é o que você retornar no óbvio comando return. E claro tem que ser um int porque assim foi declarado.

 

E as duas últimas variáveis não vão servir de nada.

 

Quando você precisa ler os valores de volta da função você passa o endereço deles para a função e não o valor.


Como faz em scanf() quando vai ler os int.

 

Mas aí você declara os parâmetros de acordo, com um * no tipo. No caso desse exemplo seriam 3 int e dois int*, que é como se declara um ponteiro para um int. Algo assim

 

int data(int d, int m, int a, int* bi, int* val);

 

e chamaria assim

int bissexto = 0;
int valida = 0;

...

int retorno = data(12,12,2000, &bissexto, &valida); // por exemplo

 

A função retorna um int mas aparentemente não é usado.

 

Em C zero é falso, o resto é verdadeiro.

 

Sugiro verificar o enunciado...

 

  • Curtir 1
Postado

@arfneto  todas as funções, a main recebe os valores e chamava a eh_data_valida, esta, chamava as outras, caso for válido o dia, o mês e o ano, as outras funções retornavam 1 para eh_data_valida q retornava 1 para main e um if imprime"valida", caso fosse falso, as outras funções retornavam 2 para eh_data_valida, que retornava 2 para main e um outro if imprime "inválida"

adicionado 0 minutos depois
14 horas atrás, Bruna Christina disse:

Como usar devidamente essa parte do código

 int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);  ??

(ob: sou obrigada a usar )

 

 

 

#include <stdio.h>
#include <math.h>

//DATA VALIDA

 

//Funções para data

int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);

 

  //Declarando variaveis dia (D),mes(M) e ano (A)
         int main(){
         int D, M, A;

      scanf("%d %d %d", &D, &M, &A);

 

 

  //Numeros sao validos para data ,quando :
  if ((D >= 1 && D <= 31) && (M >= 1 && M <= 12) && (A >= 1){
      printf("valida");
      }

 

  //Verifica o mes de feveireiro
    if (D <= 28 && M == 2){
        printf("valida");
        }

  //Para os meses com 30 dias
     if(( D<= 30) && ( M == 4 ||M == 6 || M == 9 ||M == 11)){
        printf("valida");
        }

     //Para os meses de 31 dias
     if ((D <=31) && (M == 1 || M == 3 || M== 5 ||M == 7 ||M ==8 ||M == 10 ||M == 12)){

   //imprime valida para data valida
                printf("valida");
            }else{

//imprime invalida para data nao valida.
              printf("invalida");
              }
      return 0;
     }
 

todas as funções, a main recebe os valores e chamava a eh_data_valida, esta, chamava as outras, caso for válido o dia, o mês e o ano, as outras funções retornavam 1 para eh_data_valida q retornava 1 para main e um if imprime"valida", caso fosse falso, as outras funções retornavam 2 para eh_data_valida, que retornava 2 para main e um outro if imprime "inválida"

Postado

Acho que pode ser feito assim:

int data(int avaliar_dia, int avaliar_mes, int avaliar_ano, int *eh_bissexto, int *eh_data_valida) {
    // Condicoes gerais de data invalida
    if ((avaliar_dia < 1 || avaliar_dia > 31) ||
        (avaliar_mes < 1 || avaliar_mes > 12) ||
        (avaliar_ano < 0)) {
        *eh_data_valida = 0;
        return 0;
    }

    *eh_bissexto = (avaliar_ano % 4 == 0 && avaliar_ano % 100 != 0);

    // Teste mais profundo
    if (avaliar_mes == 2) {
        if (*eh_bissexto == 1) {
            *eh_data_valida = (avaliar_dia <= 29);
        } else {
            *eh_data_valida = (avaliar_dia <= 28);
        }
    } else if (avaliar_mes == 1 || avaliar_mes == 3 || avaliar_mes == 5 || avaliar_mes == 7 ||
               avaliar_mes == 8 || avaliar_mes == 10 || avaliar_mes == 12) {
        *eh_data_valida = (avaliar_dia <= 31);
    } else {
        *eh_data_valida = (avaliar_dia <= 30);
    }

    return *eh_data_valida;
}

Nos meus testes funcionou .

  • Obrigado 1
Postado

Quase o meu pensamento com diferença na tua data(...) que está fazendo tudo e no "enunciado" de @Bruna Christina (autora do post) que não tem ponteiros no protótipo.

 

Nós (alunos) temos liberdade de acrescentar, de alterar não!

  • Curtir 1
Postado

@Mauro Britivaldo Obrigada pessoal,vou refazer aqui com a contribuição já dada  e depois posto a ultima versão !

3 minutos atrás, Mauro Britivaldo disse:

@Bruna Christina Exatamente.

O que o membro @AdrianoSiqueira  fez agora dá uma excelente noção do que VOCÊ tem de fazer.

 

Mãos a obra!

 

Postado
50 minutos atrás, Bruna Christina disse:

@Mauro Britivaldo Obrigada pessoal,vou refazer aqui com a contribuição já dada  e depois posto a ultima versão !

 

Post apenas os fragmentos (para evitar plágio) ou melhor faça apenas perguntas objetivas se/quando precisar de ajuda.

 

Bons Estudos!!

Postado
//Funções para data

int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);

 

7 horas atrás, Bruna Christina disse:

todas as funções, a main recebe os valores e chamava a eh_data_valida, esta, chamava as outras, caso for válido o dia, o mês e o ano, as outras funções retornavam 1 para eh_data_valida q retornava 1 para main e um if imprime"valida", caso fosse falso, as outras funções retornavam 2 para eh_data_valida, que retornava 2 para main e um outro if imprime "inválida"

 

Pois é... aquilo que você escreveu inicialmente e que está no seu código também, é uma declaração de função. Uma função chamada data() que recebe 5 argumentos int e retorna um int. E não faz então sentido.

 

O que você descreveu é outra coisa, e também não faz muito sentido  :(: 5 funções e uma sequência de encadeamento. Quando você escreve "todas as funções" eu vou imaginar que pretendia escrever que "são todas funções". Me corrija se não for o caso.


A sequência que descreveu:
 

main() lê os valores e chama eh_data-valida() e esta chama as outras se a data for valid. As outras seriam as funções eh_bissexto() e eh+data_valida()


E aí parece fazer sentido.

 

A parte dos dois if nem tanto...
 

8 horas atrás, Bruna Christina disse:

e um if imprime"valida", caso fosse falso, as outras funções retornavam 2 para eh_data_valida, que retornava 2 para main e um outro if imprime "inválida"

 

Ainda estou tentando entender, mas imagino que seja o mesmo if em main. Provavelmente a vírgula depois de "falso" está aí por engano e você pretendia escrever algo como
 

Citação

eh_data_valida()  retorna 1 para main() que num if imprime válida. Se as outras funções retornarem 2 para eh_data_valida() ela retorna 2 para main() que no if imprime "invalida"

 

Talvez seja isso. E a função data() citada no início vou esquecer porque não vejo onde encaixar isso...

 

Talvez você possa explicar melhor...

 

Uma interpretação:

//Funcoes para data

int data(int avaliar_dia,
         int avaliar_mes,
         int avaliar_ano,
         int eh_bissexto,
         int eh_data_valida);

que não faz sentido, se torna

//Funcoes para data

int avaliar_dia(int);
int avaliar_mes(int);
int avaliar_ano(int);
int eh_bissexto(int);
int eh_data_valida(int,int,int);

Em main()

int main() {
    int D, M, A;

    printf("Entre com Dia Mes e Ano: ");
    scanf("%d %d %d", &D, &M, &A);
    printf("Testando para %d/%d/%a\n", D, M, A);
    int n = eh_data_valida(D, M, A);

    if (n == 1)
        printf("valida\n");
    else
        if (n == 2)
            printf("invalida\n");
        else
            printf("Algo saiu errado: funcao retornou %d\n", n);
    return 0;
};  // main()

eh_data_valida()

int eh_data_valida(int dia, int mes, int ano)
{
    // '!' e o operador NOT
    if (!avaliar_dia(dia)) return 2; // dia invalido
    if (!avaliar_mes(mes)) return 2; // mes invalido
    if (!avaliar_ano(ano)) return 2; // ano invalido

    // se chegamos aqui dia mes e ano ok

    if (eh_bissexto(ano))
        printf("ano %d eh bissexto\n", ano);
    else
        printf("ano %d nao eh bissexto\n", ano);

    return 1;
};

E as funções auxiliares

int avaliar_dia(int dia)
{
    printf("avaliando dia %d\n", dia);
    return 1;
};

int avaliar_mes(int mes)
{
    printf("avaliando mes %d\n", mes);
    return 1;
};

int avaliar_ano(int ano)
{
    printf("avaliando ano %d\n", ano);
    return 1;
};

int eh_bissexto(int ano)
{
    printf("avaliando se ano %d eh bissexto\n", ano);
    return 0;
};

Ao menos faz sentido algo assim:

#include <stdio.h>
#include <math.h>

//DATA VALIDA



//Funcoes para data

int avaliar_dia(int);
int avaliar_mes(int);
int avaliar_ano(int);
int eh_bissexto(int);
int eh_data_valida(int,int,int);


//Declarando variaveis dia (D),mes(M) e ano (A)
int main() {
    int D, M, A;

    printf("Entre com Dia Mes e Ano: ");
    scanf("%d %d %d", &D, &M, &A);
    printf("Testando para %d/%d/%a\n", D, M, A);
    int n = eh_data_valida(D, M, A);

    if (n == 1)
        printf("valida\n");
    else
        if (n == 2)
            printf("invalida\n");
        else
            printf("Algo saiu errado: funcao retornou %d\n", n);
    return 0;
};  // main()

int avaliar_dia(int dia)
{
    printf("avaliando dia %d\n", dia);
    return 1;
};

int avaliar_mes(int mes)
{
    printf("avaliando mes %d\n", mes);
    return 1;
};

int avaliar_ano(int ano)
{
    printf("avaliando ano %d\n", ano);
    return 1;
};

int eh_bissexto(int ano)
{
    printf("avaliando se ano %d eh bissexto\n", ano);
    return 0;
};

int eh_data_valida(int dia, int mes, int ano)
{
    // '!' e o operador NOT
    if (!avaliar_dia(dia)) return 2; // dia invalido
    if (!avaliar_mes(mes)) return 2; // mes invalido
    if (!avaliar_ano(ano)) return 2; // ano invalido

    // se chegamos aqui dia mes e ano ok

    if (eh_bissexto(ano))
        printf("ano %d eh bissexto\n", ano);
    else
        printf("ano %d nao eh bissexto\n", ano);

    return 1;
};

 

Pode não ser nada disso. Sua explicação não foi nada formal. E fiz de conta que a função inicial que você mostrou não existia... A tal int data()

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!