Ir ao conteúdo

Posts recomendados

Postado
2 horas atrás, Matheus Maldi disse:

O desafio está completo

 

Esse não é um site de "desafios". Há muitos desses online com problemas mais complexos e possivelmente interessantes.
 Trata-se aqui apenas de ajudar o autor, autora @Julia Leite, em um exercício para iniciantes, que lê duas listas com os mesmos atributos e classifica o resultado do conjunto de dados na saída.

 

Não era o caso de escrever versões do programa e postar antes dela postar algo mais concreto do que ela est;a escrevendo.

 

Os moderadores muitas vezes removem esses tópicos.

 

Mas mostrou uma solução boa eu acho. No entanto para o tipo de enunciado talvez não fosse o caso de usar coisas como ponteiros const void, casts complicados, funções inline estáticas e coisas assim. Ainda que façam parte de seu dia a dia acho que provavelmente é melhor usar um vocabulário mais reduzido de comandos e expressões. size_t pouco acrescenta a um iniciante exceto talvez mais uma dúvida. E para um problema tão simples declarar funções como static inline void apenas para trocar dois elementos de posição pode ser um exagero.

 

Não me leve a mal. É só um palpite num forum de palpites. Eu escrevi ontem um programa desses completo. Dividi o progresso em 5 fases para que fosse fácil de entender. Mas não postei nenhuma das 5 porque acho que pode nem ser preciso. Quando eu tenho tempo em geral eu faço isso

 

 

 

 

 

adicionado 7 minutos depois
50 minutos atrás, isrnick disse:

 

Para um programa de 150 linhas poderia postar aqui ao menos em linhas gerais e poderia ajudar alguém...

 

Esse trecho abaixo é bem parecido com a primeira versão postada por @Matheus Maldi a tarde. E vou perguntar a mesma coisa

//ler nome da turma
  scanf("%s", turma);
  // quantidade de alunos na turma
  scanf("%d",&TAM1); 
  t1 = malloc(TAM1*sizeof(Aluno));
  for(i=0;i<TAM1;i++){
    leAluno(&t1[i]);
    strcpy(t1[i].turma, turma);
  }
  //ler nome da turma 
  scanf("%s", turma);
  // quantidade de alunos na turma 
  scanf(" %d",&TAM2); 
  t2 = malloc(TAM2*sizeof(Aluno));
  for(i=0;i<TAM2;i++){ 
    leAluno(&t2[i]); 
    strcpy(t2[i].turma, turma);
  }
  
  //Unir as duas turmas em uma unica lista:
  // quantidade de alunos
  TAMu = TAM1 + TAM2;
  tu = malloc(TAMu*sizeof(Aluno));
  //Copia t1
  for(i=0;i<TAM1;i++){
    tu[i] = t1[i];
  }
  //Copia t2
  for(i=TAM1;i<TAMu;i++){
    tu[i] = t2[i-TAM1];
  }
  

Para que alocar memória e ler as duas turmas em separado e depois alocar outra estrutura e copiar tudo de novo? A separação entre as turmas é irrelevante: pelo contrário elas serão reunidas para classificar e mostrar os resultados em ordem, com todos os alunos.

 

É mais simples alocar o necessário na primeira vez, carregar os alunos, ler o tamanho da segunda turma, redimensionar a área para o total geral de alunos usando uma única chamada a realloc() e continuar lendo. Só isso. Como @Matheus Maldi fez na segunda versão.

 

E você não liberou a área correspondente a nenhum dos 3 vetores. É um programa para estudantes e podem perder pontos ao não fazer isso ao final...
 

  • Curtir 1
Postado
22 minutos atrás, arfneto disse:

Esse trecho abaixo é bem parecido com a primeira versão postada por @Matheus Maldi a tarde. E vou perguntar a mesma coisa

 

É o trecho postado pela Julia Leite (a criadora do tópico), só peguei e o código e desenvolvi o resto.

 

20 minutos atrás, arfneto disse:

Para que alocar memória e ler as duas turmas em separado e depois alocar outra estrutura e copiar tudo de novo? A separação entre as turmas é irrelevante: pelo contrário elas serão reunidas para classificar e mostrar os resultados em ordem, com todos os alunos.

 

É mais simples alocar o necessário na primeira vez, carregar os alunos, ler o tamanho da segunda turma, redimensionar a área para o total geral de alunos usando uma única chamada a realloc() e continuar lendo. Só isso. Como @Matheus Maldi fez na segunda versão.

 

Sim, claro que seria mais eficiente fazer 1 lista só diretamente, mas está assim por que o enunciado especifica explicitamente que devem ser criadas 2 listas separadas, e depois uni-las e ordenar...

 

25 minutos atrás, arfneto disse:

E você não liberou a área correspondente a nenhum dos 3 vetores. É um programa para estudantes e podem perder pontos ao não fazer isso ao final...

 

Verdade, quebrei minhas próprias regras de sempre criar o free correspondente a cada malloc imediatamente toda vez que usar a função malloc, vou alterar.

 

Segue: https://onlinegdb.com/r1DAelKKU

 

  • Curtir 2
  • 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...