Ir ao conteúdo
  • Cadastre-se

C Codigo em C, retornando valor desconhecido


lucas frois
Ir à solução Resolvido por devair1010,

Posts recomendados

Eu estou fazendo um exercicio em C, em que tenho que imprimir dados de duas pessoas, e comparar qual delas é mais velha, porém na hora de comparar e imprimir o resultado, esta retornando um monte de numeros nada a ver.
Como posso resolver isso ? Segue o codigo!
E quando eu mudo no printf o %d, para %c para mostrar o nome de quem é mais velho, ele mostra só a primeira letra, como faço para resolver isso tambem ?

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

typedef struct{//Data do cliente
    int dia;
    int mes;
    int ano;
    }Data;

typedef struct{//Nome e data do cliente
    char nome[50];
    Data nasc;
    }dados_cliente;

void leia_data(Data *n){//Leitor de data
    Data k;
    printf("\nDia: ");
    scanf("%d", &k.dia);
    printf("\nMes: ");
    scanf("%d", &k.mes);
    printf("\nAno: ");
    scanf("%d", &k.ano);
    n->dia=k.dia; //pesquisar outra forma de fazer isso
    n->mes=k.mes;
    n->ano=k.ano;

    /* Outra forma de fazer a passagem com parâmetro 
    (*n).dia=k.dia
    (*n).mes=k.mes
    (*n).ano=k.ano
    */
}

void escreva(dados_cliente x){//Escrita dados cliente

    printf("\nOs dados do cliente sao:\n\n");
    printf("Nome: %s\n",x.nome);
    printf("Data: %d/%d/%d\n\n",x.nasc.dia,x.nasc.mes,x.nasc.ano);
}

dados_cliente mais_velho(dados_cliente a, dados_cliente b){//Comparador qual cliente é mais velho
    if (a.nasc.ano < b.nasc.ano)
        return a;
    if (a.nasc.ano == b.nasc.ano){
        if (a.nasc.mes < b.nasc.mes)
            return a;
        if (a.nasc.mes > b.nasc.mes)
            return b;
        if (a.nasc.mes == b.nasc.mes){
            if (a.nasc.dia < b.nasc.dia)
            return a;
        if (a.nasc.dia > b.nasc.dia)
            return b;
        }
    }
       

}

int main()
{
    char n1[50], n2[50];
    dados_cliente p1, p2;
    Data nascimento;

    printf("Digite os dados do primeiro cliente:\n\n");
    printf("Nome: ");
    gets(n1);
    leia_data(&nascimento);
    strcpy(p1.nome,n1);
    p1.nasc=nascimento;
    escreva(p1);
    getchar();
    printf("Digite os dados do segundo cliente:\n\n");
    printf("Nome: ");
    gets(n2);
    leia_data(&nascimento);
    strcpy(p2.nome,n2);
    p2.nasc=nascimento;
    escreva(p2);
    getchar();
    printf("O cliente mais velho e: %d", mais_velho(p1,p2));
    return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@lucas frois @lucas frois      a função    "mais_velho"   ,  retorna uma struct   inteira , e na hora de escrever haverá muitos dados e então qual deles quer escrever ?  ,  se for o nome então use %s  de string  ,  mas creio que seria melhor usar uma struct auxiliar para pegar os dados retornados  lá da função , e escrever o que você quer usando essa struct auxiliar ,  e poderia ser assim  :

dados_cliente p1, p2,aux;
aux = mais_velho(p1,p2);
printf("o cliente mais velho eh: \n%s",aux.nome );

e também essa função "gets"   já está em desuso há muito tempo ,   melhor não usar ela e ao invés use  fgets .

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Não sei pra que tanto struct, só precisa de um struct e uma função. Dá pra diminuir em umas 18 linhas esse código. Por exemplo, deixe o nome e a data num struct só, chamado dados_cliente. As datas vão ser valores inteiros de dia, mês e ano.

 

Eu acho que ter uma função "escreva_dados", sendo que o próprio printf já faz isso, só complica desnecessariamente a situação. No caso, você tem uma função para imprimir outras 3 impressões... não é mais fácil imprimir direto? Tudo bem que você vai ter que repetir os códigos de leitura para os 2 clientes, mas como são apenas 2 usados para comparação, então não tem problema prints e leituras no main direto. Se fosse uma montanha de clientes, aí sim talvez uma função a mais fosse útil, porque aí inseria o cliente como parâmetro e a função trataria da sequência de código para preencher os dados.

 

Os nomes das variáveis que você criou as vezes são muito curtos e fáceis de esquecer. a.algumacoisa, b.outra, x.outra, etc. Não tem problema escrever "cliente.nome" por exemplo, é mais legível e também fácil de lembrar do que se trata. Quando você colocou o nome da função no mesmo formato de nome do struct, achei meio confuso pra ser sincero. Escreva MaisVelho pra distinguir a função.

Sobre a lógica da função MaisVelho, dá pra simplificar usando and(&&) e/ou or(||). O "else if", evita de dois ou mais "ifs" coincidirem e dar respostas diferentes ao mesmo tempo, dependendo da situação.

 

Lembre que C não é orientada a objetos, o struct serve mais pra organizar o código do que ser quase que uma obrigação pra tudo que você vai fazer, como é no caso das classes nas linguagens de objeto.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!