Ir ao conteúdo
  • Cadastre-se

C Problema em c juntar listas e mais


Julia Leite

Posts recomendados

Estou com dificuldades em relação a como poderia ler o nome da turma e depois exibir junto na função exibe aluno e como eu poderia juntar a lista das duas turmas em uma só?

image.png.9f8215789abdee89c417fc1e9b1c788b.png

typedef struct{ 
  char nome[20]; 
  int cod; 
}Aluno; 

void leAluno(Aluno *a){ 
  printf("Digite o nome:\n");
  scanf("%s", a->nome);
  printf("Digite o ID:\n");
  scanf("%d", &a->cod);
}

void exibeAluno(Aluno *a){
  //exibir nome da turma 
  printf("\nNome: %s\n",a->nome);
  printf("ID: %d\n", a->cod); 
}

int main(){ 
  Aluno *a,*a2; 
  int TAM,TAM2,i;
  char ord[5];
  
  //ler nome da turma
  scanf("%d",&TAM); 
  // quantidade de alunos na turma
  a = malloc(TAM*sizeof(Aluno));
  for(i=0;i<TAM;i++){
    leAluno(&a[i]); 
  }
  //ler nome da turma 
  scanf("%d",&TAM2); 
  // quantidade de alunos na turma 
  a2 = malloc(TAM2*sizeof(Aluno));
  for(i=0;i<TAM2;i++){ 
    leAluno(&a2[i]); 
  }
  scanf("%s",ord);
  
  //juntar as duas turmas em uma unica lista 
  if(strcmp(ord,"cod") == 0){
    //ordenar lista pelo código 
    exibeAluno(a); } 
  else{ 
    //ordena lista pelo nome do aluno
    exibeAluno(a); 
  } 
  return 0;
}

 

Link para o comentário
Compartilhar em outros sites

image.png.21dfc57cadccb257033bbb22f43308e0.png

 

Talvez eu tenha lido algo diferente ... E mais simples

 

Não está claro que tenha que ler do teclado caso a caso. o que seria muito muito chato

 

De todo modo, a sequência está aí:

  • vem uma linha com o nome da turma
  • vem uma linha com um int que é o número de alunos
  • vem os alunos da turma na forma nome e "cod" o número em vermelho?
  • vem uma linha com uma eventual outra turma

 e a vida segue.

 

Ao final você tem a lista

Como cada aluno tem uma turma você pode salvar isso junto com cada aluno, tipo um indice para o vetor de turmas. Nada novo

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

@herbertbahia A sequência é como o @arfneto mostrou

  • vem uma linha com o nome da turma
  • vem uma linha com um int que é o número de alunos
  • vem os alunos da turma na forma nome e "cod" (número de identificação do aluno)o número em vermelho
  • vem uma linha com uma eventual outra turma

Só serão duas turmas sempre!

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

Acho que tem razão, mas não entendi porque ter o trabalho de ler isso e não digitar isso

TURMA 1
2
JOSE 6
ANA 9
TURMA 2
2 
MARCELO 3
CAROL 10

em um arquivo com o bloco de notas e pronto. E mudar a estrutura um pouco

typedef struct
{ 
  char nome[20]; 
  int cod; 
  int turma;
} Aluno;

char Turma[20][20];
int n_Turmas = 0;

               

E ler as turmas e colocar no vetor e ao ler os alunos colocar o numero da turma e em meia hora terminou o programa

 

E depois que estar certo se fizer mesmo questão pode escrever isso de ler da tela que é um p$%%e

adicionado 0 minutos depois
11 minutos atrás, Julia Leite disse:

@herbertbahia A sequência é como o @arfneto mostrou

  • vem uma linha com o nome da turma
  • vem uma linha com um int que é o número de alunos
  • vem os alunos da turma na forma nome e "cod" (número de identificação do aluno)o número em vermelho
  • vem uma linha com uma eventual outra turma

Só serão duas turmas sempre!

 trivial então

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

7 minutos atrás, Julia Leite disse:

@arfneto @herbertbahia acho que eu confundi vocês um pouquinho, me perdoem mas as turmas são do tipo char, por exemplo matemática e biologia, não necessariamente turma 1 e 2 😕

 

? Não faz diferença, certo? Um char vai de 0 a 255, sem sinal, ou de -128 a 127 com sinal. E o que significa Matemática para um char? 'M'? e biologia 'B'? é só uma convenção. E no enunciado diz "TURMA 1" e "TURMA 2"...

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

  • Membro VIP

@Julia Leite, sobre:

4 horas atrás, Julia Leite disse:

[...] como eu poderia juntar a lista das duas turmas em uma só?

 

É tudo uma questão de abstração. Na verdade, a estrutura para armazenamento seria uma lista só mesmo. "A lista de alunos de uma turma" nada mais é que uma "sub-lista" da lista geral de alunos de todas as turmas", ou seja: seria "todos os alunos onde a turma é, por exemplo, TURMA1".

 

 

Mas vamos lá:

Para o teu programa, basicamente precisa fazer 3 coisas:

  1. Obter os dados, no caso os cadastros dos corredores (via arquivos? via teclado?);
  2. Ordenar os dados, no caso necessariamente utilizando o Bubble Sort;
  3. Exibir os dados.

Só isso...

 

 

Eu não consegui supor como vai obter os dados, mas isso é o menos importante por enquanto... o foco é em como armazenar os dados, como ordenar e exibir.

 

Sugiro o seguinte:

  1. Fixe os dados no próprio código. Basicamente faça um mock;
  2. Exibe esses dados na tela

 

Ou seja: você NÃO vai se preocupar em ordenar por enquanto, vai apenas focar em como vai estruturar o armazenamento do dados e também como exibir esses dados na tela.

 

Obs.: perceba que ordenar os dados é apenas um "detalhe"... que pode ser implementado depois. Assim como descobrir se vai ser via arquivos de texto ou via teclado é só um detalhe... exercite a abração, ou seja: não faz a menor diferença O COMO os dados vão ser armazenado por enquanto, apenas que você vai ter alguns dados e precisa trabalhar com eles... mudar para arquivos ou leitura via teclado será apenas um detalhe.

 

 

 

Seguindo o enunciado, segue um exemplo de estrutura:

typedef struct
{ 
  char curso[20]; 
  int cod; 
  int nome;
} Corredor;

 

Daí você precisa de uma forma para armazenar os cadastro: aqui é o mesmo, ou seja: não importa! faz da forma mais simples possível por enquanto... se é para armazenar de outra forma, apenas muda essa forma... o restante da lógica do programa vai ser a mesma (apenas tendo alguns detalhes para ajustar as possíveis mudanças).

 

Ex.:

Corredor corredores[100];

 

Pronto! daí faz o mock. Ex.:

corredores[0].curso = "TURMA1";
corredores[0].nome = "JOSE"
corredores[0].cod = 6
corredores[1].curso = "TURMA1";
corredores[1].nome = "ANA";
corredores[1].cod = 9;

corredores[2].curso = "TURMA2";
corredores[2].nome = "MARCELO"
corredores[2].cod = 3
corredores[3].curso = "TURMA2";
corredores[3].nome = "CAROL";
corredores[3].cod = 10;

 

 

Após, colocar para exibir os dados de acordo como solicitado na saída:

 

4 horas atrás, Julia Leite disse:

image.png.9f8215789abdee89c417fc1e9b1c788b.png

 

 

RESUMINDO:
Apenas coloque para ter os dados e exibir os dados na tela (fora de ordem mesmo). O objetivo é treinar e fazer algo funcionar!!!! Aí poste o código aqui....   só após conseguir isso, implementa uma nova parte, como por exemplo o Bubble Sort.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Bubble Sort é bem simples, você percorre a lista várias vezes do começo até a penúltima, e compara o item atual da lista com o próximo, se o próximo for menor que o atual então deve trocar os items de posição, assim os menores vão sendo movidos para o começo da lista, para uma lista com N items percorre a lista inteira N-1 vezes fazendo trocas e vai obter a lista ordenada, ou então pode parar de percorrer se percorrer a lista inteira uma vez sem fazer nenhuma troca.

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

43 minutos atrás, isrnick disse:

mas deveria ser um vetor de char

 

20 minutos atrás, Julia Leite disse:

realmente, vou corrigir aqui, passou despercebido

 

Não é necessário: só há dois critérios e poderia ser um único bit: 0 para COD e 1 para nome por exemplo. 

 

E para a classificação não faz diferença tampouco. Só é usado na comparação afinal... Meses atrás eu postei aqui eu acho uma rotina que classifica um vetor com esse bubble sort, com uma animação para mostrar algo sobre as comparações. 
 

image.png.6e411d331b41bf0ea54a53efc3bc2b2b.png

 

Acho que era uma aposta aqui e uma discussão aí sobre essa nomenclatura besta de bolha quando na implementação normal a bolha desce ao invés de subir... ;) 
 

De todo modo o programa pode servir de algo porque eu implementei dos dois "modos": o modo  "âncora" convencional e o modo "bolha" mesmo, e os dois com uma animação como aquelas de aparecem  na Wikipedia. Só que esse que eu escrevi ilustra melhor as comparações e as trocas.

 

Aos moderadores: há já um número enorme de implementações disso em várias linguagens na internet de modo que não acrescenta muito em falar disso aqui ou postar um programa. E meu programa tem esse aspecto didático de ilustrar as comparações e trocas... O programa é um único arquivo em C e a parte do sort é mínima. Pode ser baixado aqui ou visto aqui ou esquecido aqui ;)  

 

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

Gif do Bubble Sort:

Bubble-sort-example-300px.gif

 

11 minutos atrás, arfneto disse:

Não é necessário: só há dois critérios e poderia ser um único bit: 0 para COD e 1 para nome por exemplo. 

 

Sim, tecnicamente é desnecessário, mas o exemplo de entradas usa o texto "cod" ao invés de um número.

(Principalmente se a resposta for testada por um programa ao invés do professor, qualquer mudança é considerada um erro pelo programa.)

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

  • Membro VIP

Na minha opinião, o Bubble Sort é um problema a parte e deverá ser "estudado" a parte. Para o problema do enunciado, simplesmente vai usar uma fórmula pronta... não precisa reinventar a roda, ou seja: estudar o algoritmo de ordenação será para o sentido de absorver o conteúdo (não para recriar o algoritmo que por definição está pronto).

 

Poderia utilizar, por exemplo, o código lá do Git:

int bubbleUp_sort(int vetor[], int N)
{
   int passo, elemento, temp;
  
   for (passo = 0; passo < N - 1; passo = passo + 1)
   {
      int mudou_algo = 0;
      
      for (elemento = N - 1; elemento > passo; elemento = elemento - 1)
      {
         if (vetor[elemento] < vetor[elemento - 1])
         {
            temp = vetor[elemento];
            vetor[elemento] = vetor[elemento - 1];
            vetor[elemento - 1] = temp;
            mudou_algo = 1;
         }
      }
     
      if (mudou_algo == 0)
         return passo + 1;
    }
  
   return passo + 1;
};


Observação: @Julia Leite, não precisa em se preocupar em ordenar agora!!! deixa isso para o fim!!! é algo que precisa se aprofundar um pouco, mas que não vai fazer a menor diferença para o desenvolvimento do código por enquanto, ou seja: o importante é ter os dados e exibir os dados... após isso pronto, simplesmente vai inserir um código Bubble Sort "qualquer" no meio!!! Entretanto, tentar fazer isso ao mesmo tempo (preparar a estrutura, e ajustar um algoritmo de ordenação), apenas vai atrapalhar!!! Melhor fazer uma coisa de cada vez.

 

Apenas tenha os dados, e depois exiba-os na tela.

 

 

adicionado 9 minutos depois
3 minutos atrás, isrnick disse:
14 minutos atrás, arfneto disse:

Não é necessário: só há dois critérios e poderia ser um único bit: 0 para COD e 1 para nome por exemplo. 

 

Sim, tecnicamente é desnecessário, mas o exemplo de entradas usa o texto "cod" ao invés de um número.

(Principalmente se a resposta for testada por um programa ao invés do professor, qualquer mudança é considerada um erro pelo programa.)

 

Exatamente! Pelo enunciado, está informando o "critério de ordenação" por uma string. Lá tem "cod"...

 

Entretanto, assim como o uso/entendimento do Bubble Sort, não é importante no momento. Vejam: estaria perdendo um tempo desnecessário para entender o funcionamento de uma estrutura de ordenação ou qual vai ser um tipo de uma variável... mas que ainda nem tem a estrutura que vai ser ordenada!!!

 

Pensem assim: com um código "pronto" apenas faria algo como: "oh! ali tem que ser char*, pois.......". Ou: "O Bubble Sort está com erro ali e a culá....."

 

Primeiro faz a estrutura... depois se preocupa nos detalhes. Até mesmo por quê, para ordenar, terá que ter a estrutura pronta antes.

 

adicionado 11 minutos depois

*O "cod" está ali na imagem da primeira postagem. O último valor de entrada.

adicionado 12 minutos depois

Na imagem do enunciado também tem... o outro seria "nome".

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

53 minutos atrás, isrnick disse:

mas o exemplo de entradas usa o texto "cod" ao invés de um número.

(Principalmente se a resposta for testada por um programa ao invés do professor, qualquer mudança é considerada um erro pelo programa

 

que tal algo assim: se for lido "cod" na última linha um certo int declarado ?

int criterio = 0;

continua a valer zero e caso contrário passa a valer 1? E aí uma rotina de comparação declarada assim

int compara(int primeiro, int segundo, int criterio, Aluno aluno[]);

faz o sort com a ordem esperada? Não é original mas funciona. Todos os algoritmos fazem assim, sem querer ou de propósito. Os meus também.

int     compara(int primeiro, int segundo, int criterio, Aluno aluno[])
{
    // criterio 0 classifica pela ordem de codigo do aluno
    if (criterio == 0)
        return(aluno[primeiro].cod > aluno[segundo].cod);
    // criterio nao zero vai usar a ordem de nome
    return strcmp(aluno[primeiro].nome,
                  aluno[segundo].nome);
};  // compara()

Assim resolve
 

1 hora atrás, Simon Viegas disse:

Primeiro faz a estrutura... depois se preocupa nos detalhes. Até mesmo por quê, para ordenar, terá que ter a estrutura pronta antes

 

Sábias palavras. Leia tudo e prepare os dados.

 

1 hora atrás, Simon Viegas disse:

Na imagem do enunciado também tem... o outro seria "nome"

 

Como são só dois, o outro seria "não esse". Não "cod".

adicionado 4 minutos depois
1 hora atrás, Simon Viegas disse:

Apenas tenha os dados, e depois exiba-os na tela

 

Vai ganhar tempo se fizer isso @Julia Leite

O sort vai ser feito no próprio vetor de alunos: É assim que o bubble sort funciona. Se chama in-place sorting na literatura. Então se você tiver os valores lá certinhos estará quase tudo pronto. E se não tiver não adianta nada querer se arriscar com o algoritmo no meio de um outro problema...

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

2 horas atrás, isrnick disse:

Gif do Bubble Sort:

Bubble-sort-example-300px.gif

 

 

Sim, tecnicamente é desnecessário, mas o exemplo de entradas usa o texto "cod" ao invés de um número.

(Principalmente se a resposta for testada por um programa ao invés do professor, qualquer mudança é considerada um erro pelo programa.)

 

Pobre aluno que tentar acompanhar esse gif de oito dias... Muito lerdo.Pelo menos no meu programa as comparações são mais dinâmicas e o intervalo é parametrizável. O da wikipedia é mais legal.
 

image.png.95b2443f797b851071c58434f87b929b.pngimage.png.c82e6b846f5752a3fe0661fa9e93ea60.png

 


pode não ensinar nada mas é bonitinho!

  • Haha 2
Link para o comentário
Compartilhar em outros sites

@arfneto Esse GIF que postei é da Wikipedia (aliás só peguei o endereço da imagem e postei aqui, se olhar os detalhes da imagem vai ver que a URL é da Wikipedia), mas é da versão em inglês do artigo sobre o Bubble Sort (que aliás é sempre muito mais completa que a versão em português).

 

https://en.wikipedia.org/wiki/Bubble_sort

 

E segue link Wikipedia do seu GIF bonitinho também:

 

Bubble_sort_animation.gif

 

 

😁

Link para o comentário
Compartilhar em outros sites

49 minutos atrás, isrnick disse:

@arfneto Esse GIF que postei é da Wikipedia (aliás só peguei o endereço da imagem e postei aqui, se olhar os detalhes da imagem vai ver que a URL é da Wikipedia), mas é da versão em inglês do artigo sobre o Bubble Sort (que aliás é sempre muito mais completa que a versão em português).

 

https://en.wikipedia.org/wiki/Bubble_sort

 

E segue link Wikipedia do seu GIF bonitinho também:

 

Bubble_sort_animation.gif

 

 

😁

 

foi o que eu disse :D pode não explicar nada mas é bonitinho.

 

O que eu escrevi é mais instrutivo :) e o objetivo era outro: mostrar a "bobagem" da bolha de afunda. Ganhei uma aposta até. Âncora versus Bolha. Eu implementei "direito": a bolha que sobe. E a animação das duas opções: a que afunda, como a da wikipedia aqui acima e a outra, mais de acordo com o que se espera de uma bolha, que sobe para a superfície...
Abraço a todos

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Nunca consegui entender direito esse gif... kkkkkkkkkkkkk

 

Apenas que, nessa representação, no centro significa que está organizado, certo?... e que o algoritmo tem como consequência ir deixando organizado de cima para baixo, ou seja: a cada ciclo maior, as últimas posições vão ficando já organizadas.... mas não faço ideia o que significa esta movimentação em direção ao centro.

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!