Ir ao conteúdo
  • Cadastre-se

C Struct Família em c


Posts recomendados

Olá estou com um problema nesta questão: "Escreva um programa que leia e armazene em um vetor os dados de 30 pessoas. Estes dados são o nome da pessoa, sua idade, e os nomes completos do pai e da mãe. A seguir, o programa deve identificar (e mostrar os índices) das pessoas que estão relacionadas por um parentesco avô-neto e irmão-irmão. No caso dos irmãos, deve ser informado ainda qual é o mais novo dos dois."

Eis o código em questão

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

#define NUM 30

struct pessoa {
  char nome[20];
  char mae[20];
  char pai[20];
  int idade;
  };

main() {
  struct pessoa vetorPessoas[NUM];
  int i;
  printf("Digite os dados de %d pessoas:\n", NUM);
  for (i = 0; i < NUM; i++) {
    printf("Digite o nome da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].nome);
    printf("Digite o nome da mae da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].mae);
    printf("Digite o nome do pai da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].pai);
    printf("Digite a idade da pessoa %d: ", i);
    scanf("%d", &vetorPessoas[i].idade);
    }
    if(vetorPessoas[1].nome == vetorPessoas[0].pai){
        printf("Ele e pai");
    }


  }

O problema é que não estou conseguindo achar se a pessoa é irmão/irmã ou avó-neto

Link para o comentário
Compartilhar em outros sites

Citação

Os dois são relacionamentos não-reflexivos, então para todo item deve comparar com todos exceto ele mesmo.


No popular ninguém é irmão ou neto de si mesmo. Isso é o que vai controlar o loop externo, o primeiro.

 

irmão

 

Citação

irmão é um relacionamento simétrico: se A é irmão de B então B é irmão de A


Esse é mais simples. Você pode considerar que basta o mesmo pai ou a mesma mãe para ser irmão. Ou exigir os dois. Não está no enunciado. Então para cada elemento A você varre a lista e exceto para A num segundo loop compare se esse elemento B tem os mesmos pais e então será irmão. Os irmãos vão aparecer duas vezes na lista. O enunciado não fala nada sobre isso.

 

avô/neto

 

Citação

Esse não é simétrico, mas é inverso.


A estrutura só identifica o avô. Não o neto. Mas como um é o inverso do outro tanto faz: vai achar um par de relações, claro.

 

Para cada A você compara com todos B exceto A. Num segundo loop, para cada B,  se B for pai ou mãe de A você procura num terceiro loop todos os C exceto A e B. E se C for pai ou mãe de B então tem um avô. E se tem um avô tem um neto: A é neto de C, C é avô de A.

 

Cuidado para seu programa não entrar em loop com essas condições. São 2 loops no primeiro caso e 3 no segundo, um dentro do outro dentro do outro. Ou eu confundi tudo :) 

Link para o comentário
Compartilhar em outros sites

Agora ele não mostra se o irmão é mais novo ou não, ele só mostra se são irmãos ou não

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

#define NUM 4

struct pessoa {
  char nome[20];
  char mae[20];
  char pai[20];
  int idade;
  };

main() {
  struct pessoa vetorPessoas[NUM];
  int i;
  printf("Digite os dados de %d pessoas:\n", NUM);
  for (i = 0; i < NUM; i++) {
    printf("Digite o nome da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].nome);
    printf("Digite o nome da mae da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].mae);
    printf("Digite o nome do pai da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].pai);
    printf("Digite a idade da pessoa %d: ", i);
    fflush(stdin);
    scanf("%d", &vetorPessoas[i].idade);
    }
   if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].nome)){
        printf("%s e avo de %s\n", vetorPessoas[1].pai, vetorPessoas[0].nome);
   }
   if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].pai)){
        printf("Eles sao irmaos\n");
        if(strcmp(vetorPessoas[0].idade, vetorPessoas[1].idade)){
            printf("%s mais velho\n", vetorPessoas[0].idade);
        }
        if(strcmp(vetorPessoas[1].idade, vetorPessoas[0].idade)){
            printf("%s e mais novo\n", vetorPessoas[1].idade);
        }
    }
   if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].nome)){
        printf("%s e avo de %s\n", vetorPessoas[3].pai, vetorPessoas[2].nome);
   }
   if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].pai)){
        printf("Eles sao irmaos\n");
        if(strcmp(vetorPessoas[2].idade, vetorPessoas[3].idade)){
            printf("%s mais velho\n", vetorPessoas[2].idade);
        }
        if(strcmp(vetorPessoas[3].idade, vetorPessoas[2].idade)){
            printf("%s e mais novo\n", vetorPessoas[3].idade);
        }
    }

O que há de errado?

Link para o comentário
Compartilhar em outros sites

o que é strcmp()?

    int strcmp(const char *stingr1, const char *string2)

É uma função que compara duas coisas do tipo char*, as tais strings em C, coisas como "teste"

 

O que é idade?

struct pessoa {
  char nome[20];
  char mae[20];
  char pai[20];
  int idade;
  };

Segundo acima é um campo de pessoa, um int.

 

Então... não deve esperar muito ao usar strcmp() pra comparar dois números. Use o simples, > < = != , os operadores comuns...

 

Compilou esse programa com sucesso?

adicionado 0 minutos depois

Entendeu o que te expliquei antes?

adicionado 1 minuto depois

Não teste seus programas dentro de menus. É muito chato e lento. Não leia nada do teclado até a ultima hora. Só dá problema e atrasa

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Igor Lima Kock disse:

eu havia feito só com  > < = != e dava a mesma coisa só mostrava os se era irmão ou não

 

mudar pra usar strcmp() não ajudou em nada.

 

Não respondeu se isso compila ok

 

Não respondeu se entendeu o que expliquei inicialmente, ou mesmo se leu o que eu disse

 

Poste o código como estava então antes de mudar para usar strcmp()

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, arfneto disse:

 

mudar pra usar strcmp() não ajudou em nada.

 

Não respondeu se isso compila ok

 

Não respondeu se entendeu o que expliquei inicialmente, ou mesmo se leu o que eu disse

 

Poste o código como estava então antes de mudar para usar strcmp()

Sim ele havia compilado, agora eu entendi obrigado e eis o código abaixo

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

#define NUM 4

struct pessoa {
  char nome[20];
  char mae[20];
  char pai[20];
  int idade;
  };

main() {
  struct pessoa vetorPessoas[NUM];
  int i;
  printf("Digite os dados de %d pessoas:\n", NUM);
  for (i = 0; i < NUM; i++) {
    printf("Digite o nome da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].nome);
    printf("Digite o nome da mae da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].mae);
    printf("Digite o nome do pai da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].pai);
    printf("Digite a idade da pessoa %d: ", i);
    fflush(stdin);
    scanf("%d", &vetorPessoas[i].idade);
    }
   if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].nome)){
        printf("%s e avo de %s\n", vetorPessoas[1].pai, vetorPessoas[0].nome);
   }
   if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].pai)){
        printf("Eles sao irmaos\n");
        if(vetorPessoas[0].idade > vetorPessoas[1].idade){
            printf("%s mais velho\n", vetorPessoas[0].idade);
        }
       else{
            printf("%s e mais novo\n", vetorPessoas[1].idade);
        }
    }
   if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].nome)){
        printf("%s e avo de %s\n", vetorPessoas[3].pai, vetorPessoas[2].nome);
   }
   if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].pai)){
        printf("Eles sao irmaos\n");
        if(vetorPessoas[2].idade > vetorPessoas[3].idade){
            printf("%s mais velho\n", vetorPessoas[2].idade);
        }
       else{
            printf("%s e mais novo\n", vetorPessoas[3].idade);
        }
    }

 

Link para o comentário
Compartilhar em outros sites

Não entendo porque está usando constantes nos índices, tipo 0,1,2 3.

 

São variáveis. Leia bem o que te disse sobre A, B e C.

 

Não use menus enquanto seu programa não está pronto. Só vai te atrasar. 

 

Escreva seu programa em torno dos dados. Sempre em torno dos dados. E tem que tirar essas constantes daí. Entenda o lance de A B e C e as relações que expliquei inicialmente e isso vai ficar claro

adicionado 2 minutos depois

Ao ler um valor, mostre de novo quando está testando. Vai se sentir mais seguro.

 

Sabe escrever funções? São apenas um bloco de código com um nome, mas ajudam muito

Link para o comentário
Compartilhar em outros sites

🤔

 

E?

 

Eu disse

Não entendo porque está usando constantes nos índices, tipo 0,1,2 3

E você responde
 

3 minutos atrás, Igor Lima Kock disse:

@arfneto  Estou usando indices porque são vetores

 

Certo

 

 

 

Mas porque está usando constantes nos índices?

 

13 minutos atrás, arfneto disse:

São variáveis. Leia bem o que te disse sobre A, B e C.

 

Não use menus enquanto seu programa não está pronto. Só vai te atrasar. 



Entendeu o que perguntei sobre A B e C acima e o que expliquei no primeiro post? 

Link para o comentário
Compartilhar em outros sites

Leia o primeiro tópico apenas e me diga o que você não entende e eu tento explicar de outro modo.

 

Lá está claro que a opção de irmão vai usar dois loops e o lance de avô 3 loops, afinal são 3 gerações e o programa é baseado numa relação REAL.

 

Em especial o lance de A B e C veja se entende e pergunte algo

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, arfneto disse:

Leia o primeiro tópico apenas e me diga o que você não entende e eu tento explicar de outro modo.

 

Lá está claro que a opção de irmão vai usar dois loops e o lance de avô 3 loops, afinal são 3 gerações e o programa é baseado numa relação REAL.

 

Em especial o lance de A B e C veja se entende e pergunte algo

 

Eu não entendi nada porque o jeito que eu estou fazendo é o jeito que fui ensinado

Link para o comentário
Compartilhar em outros sites

@arfneto Nada mesmo pode me explicar melhor?

adicionado 3 minutos depois

@arfneto Eu estava tentando fazer sem as constantes nos índices e agora mostra tudo mesmo o que eu não quero 

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

#define NUM 3

struct pessoa {
  char nome[20];
  char mae[20];
  char pai[20];
  int idade;
  };

main() {
  struct pessoa vetorPessoas[NUM];
  int i;
  printf("Digite os dados de %d pessoas:\n", NUM);
  for (i = 0; i < NUM; i++) {
    printf("Digite o nome da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].nome);
    printf("%s\n", vetorPessoas[i].nome);
    printf("Digite o nome da mae da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].mae);
    printf("%s\n", vetorPessoas[i].mae);
    printf("Digite o nome do pai da pessoa %d: ", i);
    fflush(stdin);
    gets(vetorPessoas[i].pai);
    printf("%s\n", vetorPessoas[i].pai);
    printf("Digite a idade da pessoa %d: ", i);
    fflush(stdin);
    scanf("%d", &vetorPessoas[i].idade);
    printf("%d\n", vetorPessoas[i].idade);
    }
   if(!strcmp(vetorPessoas[i].pai, vetorPessoas[i].nome)){
        printf("%s e pai de %s\n", vetorPessoas[i].pai, vetorPessoas[i].pai);
   }
   if(!strcmp(vetorPessoas[i].pai, vetorPessoas[i].pai)){
        printf("Eles sao irmaos\n");
        if(vetorPessoas[i].idade > vetorPessoas[i].idade){
            printf("%s mais velho\n", vetorPessoas[i].idade);
        }
        else{
            printf("%s e mais novo\n", vetorPessoas[i].idade);
        }
    }
}

 

Link para o comentário
Compartilhar em outros sites

"melhor" vai ser sempre o seu critério. Posso tentar algo

 

Entendeu o que eu disse sobre escrever seu programa SEMPRE a partir dos dados?

 

Veja esse desenho

 

geracao3.thumb.jpg.16afac20ab15d50f4372d84c3954fc46.jpg

 

Tem dois casais, 0 e 1 e 2 e 3. Eles tem filhos, 4 e 5. E Esses tem um filho 6. Então 6 é neto de 0 1 2 e 3, filho de 4 e 5 e tal. Entende isso? É uma árvore genealógica pobre, 3 gerações com o mínimo pra testar seu programa.

 

São os dados. Nada tem a ver com o que foi ensinado.

 

Mas e o programa?

struct pessoa
{
    char nome[20];
    char mae[20];
    char pai[20];
    int idade;
};

Pois é: os caras vão entrar aí. Esses 6 ou 600 deles. No seu programa você tentar acessar por 0 1 e 2 e tal. Isso são pessoas fixas. Não vai resolver nada assim. Seria sempre o 0 1 e 2 do desenho. Precisa usar os índices. Que adianta olhar para pessoa[0]? É sempre o primeiro.

typedef struct pessoa Pessoa;

C tem esse comando que cria um novo tipo, um alias. Para que isso? Conveniência para você não ter que usar toda hora o tal struct pessoa... Use

 

Colocando a família no programa

    Pessoa p[8] =
    {
        { "0","0","0", 30 }, // 0
        { "1","1","1", 30 }, // 1
        { "2","2","2", 30 }, // 2
        { "3","3","3", 30 }, // 3
        { "4","1","0", 20 }, // 4
        { "5","3","2", 20 }, // 5
        { "6","5","4",  2 }  // 6
    };

Veja como a vida fica mais simples: esses são os caras do desenho, da família de teste. Eu não coloquei nomes só porque dá trabalho.  E tem o desenho afinal

 

Aí já mostra quem é filho de quem  porque está na ordem da declaração, certo? nome, mãe, pai, idade

 

E você já pode rodar o programa só com isso. Ele tem que mostrar de 6 é neto de 0 1 2 e 3, como está no desenho.

É isso. Se chama abstração e é o que os programas fazem.

 

E o irmão?

 

É muito mais fácil mas deixei para depois: imagine que 6 tem um irmão, então ele é filho de 4 e 5. Control-C control-V e eis um cara

    Pessoa irmaoDo6 = { "7","5","4",  7 };  // irmão do 6

Sim, filho de 5 e 4, com 7 anos e então irmão de 6 que 2 o Jr.

 

Entende como já temos os dados e nada fizemos ainda?

 

Vamos colocar o cara na família. Reparou que tem 8 no vetor mas só criamos 7 até agora? Sim, foi de propósito

    p[7] = irmaoDo6;

E agora vamos ver se está certo ANTES de continuar com o programa. Escrevendo um programa que mostra o que tem na família.

Pessoa: nome: 0 pai: 0 mae 0 idade = 30
Pessoa: nome: 1 pai: 1 mae 1 idade = 30
Pessoa: nome: 2 pai: 2 mae 2 idade = 30
Pessoa: nome: 3 pai: 3 mae 3 idade = 30
Pessoa: nome: 4 pai: 0 mae 1 idade = 20
Pessoa: nome: 5 pai: 2 mae 3 idade = 20
Pessoa: nome: 6 pai: 4 mae 5 idade = 2
Pessoa: nome: 7 pai: 4 mae 5 idade = 7

E não é que deu certo?

Eis o programa

int main()
{
    Pessoa p[8] =
    {
        { "0","0","0", 30 }, // 0
        { "1","1","1", 30 }, // 1
        { "2","2","2", 30 }, // 2
        { "3","3","3", 30 }, // 3
        { "4","1","0", 20 }, // 4
        { "5","3","2", 20 }, // 5
        { "6","5","4",  2 }  // 6
    };
    Pessoa irmaoDo6 = { "7","5","4",  7 };  // irmão do 6
    p[7] = irmaoDo6;
    for (int i = 0; i < 8; i += 1)
    {
        printf("Pessoa: nome: %s pai: %s mae %s idade = %d\n",
            p[i].nome, p[i].pai, p[i].mae, p[i].idade);
    };  // for()
};

Entende a diferença? Primeiro os dados.

 

Agora o lance de avô e neto é o que te mostrei no tópico 1: A, B, C...

adicionado 1 minuto depois

E sem menus e ler coisas porque demora demais pra testar.

 

Agora o programa tem que mostrar que 6 e 7 são netos de 0 1 2 e 3. São os avós.

E 6 e 7 são irmãos. E todos tem idade.

adicionado 49 minutos depois

Eu te disse que pra achar os irmãos precisa de dois loops --- são duas gerações afinal --- e para achar um avô precisa de 3 loops. Sim, são 3 gerações para ter um neto. 

 

Seu programa não tem nenhum loop exceto o que lê os dados --- e como eu te mostrei não precisava desse antes de escrever a solução --- e assim não vai achar nem os irmãos nem os avós.

 

recomendo ver com atenção o lance de A, B e C no tópico inicial.

 

O enunciado não fala nada sobre isso, mas se tiver 10 irmãos na família se precisar saber o mais novo dos 10 tem que fazer mais umas coisas. Do jeito normalzinho de exercício de loop como esse só vai mostrar par a par, que eles são irmãos, entende? Não vai mostrar o mais novo dos 10, porque não vai agrupar o pessoal. Talvez deva confirmar se precisa disso, porque seria um outro exercício

 

Nesse caso para cada geração teria que marcar os irmãos e agrupar e aí mostrar o mais novo de todos

Link para o comentário
Compartilhar em outros sites

Você entendeu o desenho?  Entendeu o programa? Rodou o programa em seu computador?

adicionado 4 minutos depois
6 horas atrás, arfneto disse:

Para cada A você compara com todos B exceto A. 

 

Leu o tópico #2 mesmo?

    for (int A = 0; A < N; A += 1)
    {
        for (int B = 0; B < N; B += 1)
            if (A != B)
          ...

 

6 horas atrás, arfneto disse:

Para cada A você compara com todos B exceto A. Num segundo loop, para cada B,  se B for pai ou mãe de A você procura num terceiro loop todos os C exceto A e B. E se C for pai ou mãe de B então tem um avô. E se tem um avô tem um neto: A é neto de C, C é avô de A

    for (int A = 0; A < N; A += 1)
    {
        for (int B = 0; B < N; B += 1)
        {
            if (A != B) // nao reflexivo
            {
                if (
                    (strcmp(p[A].nome, p[B].pai) == 0) ||
                    (strcmp(p[A].nome, p[B].mae) == 0)
                    ) // B e filho de A
                {
                    for (int C = 0; C < N; C += 1) 
                        if ((C != B) && (C != A)) // 3 geracoes
                      
                      ...

 

Não tem razão para ser diferente disso, do que está escrito no tópico 2, até com as letras. N é o tamanho da família, claro.

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!