Ir ao conteúdo

C Codigo em C, retornando valor desconhecido


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
  • Solução
Postado

@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
Postado

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

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