Ir ao conteúdo
  • Cadastre-se
Gabbie1

C Dividir um vetor em outros 2 vetores

Posts recomendados

Então gente, eu tô tendo dificuldade com esse código, como posso pra fazer ele verificar as notas e depois passar os dados da struct pro outro vetor. Eu tentei fazer de 2 jeitos. Nesse primeiro ele nem compila, no segundo ele compila mas quando escolho a opção pra dividir em aprovados ou reprovados o console trava. 

/*Faça um programa que leia os dados de 10 alunos (nome, matricula, média
final), armazenados num vetor. Uma vez lido os dados, divida estes dados em 2
novos vetores, o vetor dos aprovados e o vetor dos reprovados. Considere a
média mínima para a aprovação como sendo 6.0. Exibir na tela os dados do
vetor de aprovados, seguido dos dados do vetor de reprovados. */
#include <stdio.h>
#include <string.h>
#define tf 10


struct medialunos {
    int matricula;
    char nome[20];
    double mediafinal; 
};

void leitura (struct medialunos vet[tf], int vet1[tf], int vet2[tf]){
    int i, j; 
    for (i=0;i<tf;i++){
        for (j=0; j<tf;j++){
            printf ("\nEntre com a matricula: ");
            scanf ("%d", &vet[i].matricula);
            
            printf ("\nEntre com o nome: ");
            fflush (stdin);
            fgets (vet[i].nome,20,stdin);
            
            printf ("\nEntre com a media final: ");
            scanf ("%lf", &vet[i].mediafinal);
            
            printf ("\n_____________________________________________\n");
            
                if (vet[i].mediafinal >= 6){
                vet1[j] = vet[i];
                vet++;
        }
                else {
                vet2[j] = vet[i];
                vet2++;
            }
            }
        }
    }


void exibevet (struct medialunos vetor[tf]){
    int i;
    for (i=0;i<tf;i++){
        printf ("\nMatricula do aluno: %d", vetor[i].matricula);
        printf ("\nNome do aluno: %s", vetor[i].nome);
        printf ("\nMedia do aluno: %.2lf", vetor[i].mediafinal);
        printf ("\n___________________________________________________\n");
    }
}

void aprovados (struct medialunos vt[tf], int vtaprov[tf]){
    int i;
    for (i=0;i<tf;i++){
        printf ("\nAprovado!");
        printf ("\nMatricula do aluno: %d", vtaprov[i].matricula);
        printf ("\nNome do aluno: %s", vtaprov[i].nome);
        printf ("\nMedia do aluno: %.2lf", vtaprov[i].mediafinal);
    }    
}

void reprovados (struct medialunos vt[tf], int vetreprov[tf]){
    int i;
    for (i=0;i<tf;i++){
        printf ("Reprovado!");
        printf ("\nMatricula do aluno: %d", vetreprov[i].matricula);
        printf ("\nNome do aluno: %s", vetreprov[i].nome);
        printf ("\nMedia do aluno: %.2lf", vetreprov[i].mediafinal);
    }
}

int main (){
    struct medialunos vt[tf];
    int vtaprov[tf], vtreprov[tf];
    int opcao = 0;
    
    while (opcao != 5){
        
        printf ("\n\n################ MENU ##########################");
        printf ("\n1 - Leitura dos alunos");
        printf ("\n2 - Exibir todos os alunos");
        printf ("\n3 - Exibir Vetor Aprovados");
        printf ("\n4 - Exibir Vetor Reprovados"); 
        printf ("\n5 - Sair");
        printf ("\n\nQual a sua opcao? ");
        scanf ("%d", &opcao);
        
        switch (opcao){
            case 1: leitura (vt, vtaprov, vtreprov);
                    break;
            
            case 2: exibevet (vt);
                    break; 
                    
            case 3: aprovados (vt, vtaprov);
                    break;
                    
            case 4: reprovados (vt, vtreprov);
                    break; 
            
            default: 
                    printf ("\nOpcao invalida!");
        }
        
    }
    
}

Agora com os ifs em duas funções 

 

/*Faça um programa que leia os dados de 10 alunos (nome, matricula, média
final), armazenados num vetor. Uma vez lido os dados, divida estes dados em 2
novos vetores, o vetor dos aprovados e o vetor dos reprovados. Considere a
média mínima para a aprovação como sendo 6.0. Exibir na tela os dados do
vetor de aprovados, seguido dos dados do vetor de reprovados. */
#include <stdio.h>
#include <string.h>
#define tf 3


struct medialunos {
    int matricula;
    char nome[20];
    double mediafinal; 
};

void leitura (struct medialunos vet[tf], struct medialunos aprov[tf], struct medialunos reprov[tf]){
    int i;
    for (i=0, aprov =0, reprov = 0;i<tf;i++){
            printf ("\nEntre com a matricula: ");
            scanf ("%d", &vet.matricula);
            
            printf ("\nEntre com o nome: ");
            fflush (stdin);
            fgets (vet.nome,20,stdin);
            
            printf ("\nEntre com a media final: ");
            scanf ("%lf", &vet.mediafinal);
            
            printf ("\n_____________________________________________\n");
            
    }
}

void exibevet (struct medialunos vetor[tf]){
    int i;
    for (i=0;i<tf;i++){
        printf ("\nMatricula do aluno: %d", vetor.matricula);
        printf ("\nNome do aluno: %s", vetor.nome);
        printf ("\nMedia do aluno: %.2lf", vetor.mediafinal);
        printf ("\n___________________________________________________\n");
    }
}

void aprovados (struct medialunos vt[tf], struct medialunos aprov[tf], struct medialunos reprov[tf] ){
    int i;
    for (i=0, aprov = 0, reprov = 0;i<tf;i++){
                if (vt.mediafinal >= 6) {
            vt = aprov;
            aprov++;
                
   }
   printf ("\nAprovado!");
                printf ("\nMatricula do aluno: %d", aprov.matricula);
                printf ("\nNome do aluno: %s", aprov.nome);
        printf ("\nMedia do aluno: %.2lf", aprov.mediafinal);
        
        
        
    }    
}

void reprovados (struct medialunos vt[tf], struct medialunos reprov[tf]){
    int i;
    for (i=0;i<tf;i++){
        if (vt.mediafinal < 6) {
            vt = reprov;
            reprov++;
        }
        printf ("Reprovado!");
        printf ("\nMatricula do aluno: %d", reprov.matricula);
        printf ("\nNome do aluno: %s", reprov.nome);
        printf ("\nMedia do aluno: %.2lf", reprov.mediafinal);
    }
}

int main (){
    struct medialunos vt[tf];
    struct medialunos vtaprov[tf], vtreprov[tf];
    int opcao = 0;
    
    while (opcao != 5){
        
        printf ("\n\n################ MENU ##########################");
        printf ("\n1 - Leitura dos alunos");
        printf ("\n2 - Exibir todos os alunos");
        printf ("\n3 - Exibir Vetor Aprovados");
        printf ("\n4 - Exibir Vetor Reprovados"); 
        printf ("\n5 - Sair");
        printf ("\n\nQual a sua opcao? ");
        scanf ("%d", &opcao);
        
        switch (opcao){
            case 1: leitura (vt, vtaprov, vtreprov);
                    break;
            
            case 2: exibevet (vt);
                    break; 
                    
            case 3: aprovados (vt, vtaprov, vtreprov);
                    break;
            
            default: 
                    printf ("\nOpcao invalida!");
        }
        
    }
    
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabbie1 Já pensou em fazer algo mais simples assim

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

/* Constantes */
#define T_NOME 15
#define NOTA_MEDIA 6
#define QUANTIDADE_ALUNOS 10

/* Tipos */
/* Dados do aluno */
typedef struct
{
  int n_matricula;
  char nome[T_NOME];
  int media_final;
}TAluno;

/* para a quantidade de alunos aprovados ou reprovados */
typedef struct
{
  TAluno alunos[QUANTIDADE_ALUNOS];
  int quantidade;
}TQuantidade_alunos;


int main()
{
  TQuantidade_alunos reprovados,aprovados;
  TAluno alunos[QUANTIDADE_ALUNOS];
  int cont;
  /* Inicia os valores */
  reprovados.quantidade=aprovados.quantidade=0;
  /* pega os dados 
  ...
  ... */
  /* Verifica quem foi aprovado e reprovado */
  for(cont=0; cont<QUANTIDADE_ALUNOS; cont++)
    if(alunos[cont].media_final>NOTA_MEDIA)
    {
      aprovados.alunos[aprovados.quantidade]=alunos[cont];
      aprovados.quantidade++;
    }
    else
    {
      reprovados.alunos[reprovados.quantidade]=alunos[cont];
      reprovados.quantidade++;
    }
  /* Mostra quem foi reprovado e aprovado 
  ...
  ... */
  getchar();
  return(0);
}

Evite usar fflush, ele acaba quebrando o programa, ao invés de fflush use um getchar depois de cada scanf.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Obrigada! Vou dar uma estudada, tem muita dica boa aí. Vou tentar começar o typedef também. 

É que eu tô estudando pra prova e a professora exige que use função e menu. 

Ok! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabbie1 Generalizar (deixar mais fácil de reutilizar) as funções também e um bom caminho, fazendo dessa maneira 

void VerificaAprovados(TAluno *alunos,int quantidade,TQuantidade_alunos *reprovados,TQuantidade_alunos *aprovados)
{
  int cont;
  for(cont=0; cont<QUANTIDADE_ALUNOS; cont++)
    if(alunos[cont].media_final>NOTA_MEDIA)
    {
      aprovados->alunos[aprovados->quantidade]=alunos[cont];
      aprovados->quantidade++;
    }
    else
    {
      reprovados->alunos[reprovados->quantidade]=alunos[cont];
      reprovados->quantidade++;
    }
}

você pode reutilizar sem ter que fazer modificações profundas no código, podendo passar o vetor de qualquer tamanho para a função.

VerificaAprovados(alunos,QUANTIDADE_ALUNOS,&reprovados,&aprovados);

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Obrigada! Vou testar e praticar desse modo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
58 minutos atrás, KXSY disse:

for(cont=0; cont<QUANTIDADE_ALUNOS; cont++)

aqui eu errei era pra ser "quantidade" ao invés de quantidade alunos "QUANTIDADE_ALUNOS" passar a media da nota também é uma boa pratica (esses nomes que eu usei são realmente grandes kkkk).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!