Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Exercicio


Lastman

Pergunta

Traveii na parte da leitura das matriculas, preciso fazer com que o usuario não consiga digitar 2 matriculas iguais. Tenho outro duvida, para fazer n cadastros eu precisaria usar malloc ou teria outra solução?

Agradeço pela ajuda.

#include<stdio.h> 

typedef struct Aluno 
{
    int matricula[5];
    float nota1[5];
    float nota2[5];
    float somamedia[5];
    
}Aluno;

void lerAluno (Aluno *p); 
void ordena (Aluno *v);
void imprimi (Aluno *b);

int main()
{
    Aluno a;        
    lerAluno(&a);     
    ordena(&a);     
    imprimi(&a);     
    return 0;
}

void lerAluno (Aluno *p) 
{
    int i;
    int j;
    for(i=0;i<5;i++)
    {
    printf("Matricula: ");
    scanf("%d",&(p->matricula[i]));
     for (j=0; j<i; j++)
    {
    if(p->matricula[i] == p->matricula[j])
    {
    printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
    printf("Nova Matricula: ");
    scanf("%d",&(p->matricula[i]));
    i--;
    }
    }
    printf("Nota1: ");
    scanf("%f",&(p->nota1[i]));
    printf("Nota2: ");
    scanf("%f",&(p->nota2[i]));
    printf("\n");
    p->somamedia[i] = p->nota1[i] + p->nota2[i];
    }
}

void ordena( Aluno *v ) 
{ 
    int i ,j,aux; 
        for(i=0; i < 5; i++) 
        { 
            for(j=i; j < 5; j++) 
                { 
                    if (v->matricula[i] >= v->matricula[j]) 
                        {                                     
                                aux = v->matricula[i]; 
                                v->matricula[i] = v->matricula[j]; 
                                v->matricula[j] = aux; 
                        } 
                } 
        } 



} 

void imprimi(Aluno *b) 
{
    int i;
        for(i=0;i<5;i++)  
    {
    printf("\n-------------------------------------------------------------\n");
    printf("Matricula: %d\n",b->matricula[i]); //imprimi a matricula.
    printf("Nota1: %1.2f\n",b->nota1[i]);      //imprimi a nota1.
    printf("Nota2: %1.2f\n",b->nota2[i]);      //imprimi a nota2.
    printf("Media do Aluno: %1.2f\n",b->somamedia[i]/2); 
        if(b->somamedia[i]/2 < 6.0) 
    printf("Reprovado\n\n");
        else
    printf("Aprovado\n\n");
    }
}

Editado por quintelab
Removido Ajuda do título
Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde!

Ahh, acho que a estrutura que você criou não é muito boa!

Você deve fazer o oposto!

Crie uma estrutura para UM aluno, e depois crie um vetor com 5 estruturas dessa!

typedef struct s_aluno {
    int matricula;
    float nota1;
    float nota2;
    float somamedia;    
} Aluno;
Depois na declaração da variável
Aluno alunos[5];

Cada posição do vetor vai guardar a informação de UM aluno!

Para verificar se uma matrícula você percorre (no caso) a variável alunos, checando o campo matrícula!

Qualquer dúvida é só dar um toque!

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite!

Olha a descrição que eu fiz para o problema

"Através do uso de ponteiros escreva um programa que receba como entrada a matricula, a primeira e a segunda nota de cinco alunos de certa turma, e imprima na tela os dados recebidos e a média de cada aluno.

Condições de funcionamento do programa:

O número da matrícula terá que sair ordenado. Não podem existir duas matrículas iguais cadastradas no sistema. Caso a média < 6, imprima “Reprovado”, senão imprima “Aprovado”."

O código funciona mas ele está aceitando digitar duas matriculas iguais. Isso que eu queria uma solução.

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite!

Hmm, intendi! Foi boa a descrição!

O código é esse que tá postado no primeiro post?

Para resolver o problema da matrícula é simples!

Crie um flag(variável com 2 valores possíveis), enquanto o cara não digitar uma matrícula válida ele tem que digitar outra matrícula...

Seria algo assim:

int matriculaValida = 0;

while( !matriculaValida ){
    printf( "Digite uma nova matricula: " );
    scanf( "%d" , ALGUMAVARIAVEL );

    matriculaValida = 1;
    //Agora você procura pra ver se a matricula já existe
    for( ){//Percorre todos os elementos adicionados até o momento
        if(){//Verifica se matricula atual do loop é igual a digitada
            //Coloca que a matricula digita é invalida
            matriculaValida = 0;  
        }
    }
}

Bom essa é uma solução possível!

Se tiver alguma dúvida posta aí!

Link para o comentário
Compartilhar em outros sites

  • 0

Tentei implementar mas não consegui, o programa da o erro quando digito uma matricula igual mas na nova matricula ele aceita.

void lerAluno (Aluno *p)
{
        int i;
        int j;
    int matriculaValida = 0;
        
          while( !matriculaValida )
  {
    for(i=0;i<5;i++)
    {
        printf( "Digite uma nova matricula: " );
        scanf( "%d" , &(p->matricula[i]) );

        matriculaValida = 1;
    
    for(j=0; j<i; j++)
   {
        if(p->matricula[i]==p->matricula[j])
       {
                printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
                matriculaValida = 0;  
        }
    }
     printf("Nota1: ");
        scanf("%f",&(p->nota1[i]));
       
        printf("Nota2: ");
        scanf("%f",&(p->nota2[i]));
       
        printf("\n");
        p->somamedia[i] = p->nota1[i] + p->nota2[i];
    }
       
  }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde!

Tava quase certo!

Só que o while era dentro do for!

Tenta assim oh:

void lerAluno (Aluno *p){
    int i;
    int j;
    int matriculaValida = 0;
        
         
    for(i=0;i<5;i++){
        while( !matriculaValida ){
            printf( "Digite uma nova matricula: " );
            scanf( "%d" , &(p->matricula[i]) );
            matriculaValida = 1;
            
            for(j=0; j<i; j++){
                if(p->matricula[i] == p->matricula[j]){
                    printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
                    matriculaValida = 0;  
                }
            }
        }
        printf("Nota1: ");
        scanf("%f",&(p->nota1[i]));
       
        printf("Nota2: ");
        scanf("%f",&(p->nota2[i]));
       
        printf("\n");
        p->somamedia[i] = p->nota1[i] + p->nota2[i];
    }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Mas desse modo você digita uma matricula e o resto as notas, eu queria digitar uma matricula depois 2 notas, caso a matricula seja igual digitava uma nova, checava a nova e depois 2 notas.

Olha essa solução eu consegui fazer com que o programa não deixe o usuario digitar uma matricula igual. Mas a ordem das notas não estao saindo de acordo com o numero da matricula. Tu consegue me falar alguma solução para isso. Obrigado

void lerAluno (Aluno *p)
{
        int i;
        int j;
        for(i=0;i<5;i++)
        {
        printf("Matricula: ");
        scanf("%d",&(p->matricula[i]));
            for (j=0; j<i; j++)
        {
                if(p->matricula[i]==p->matricula[j])
                {
                printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
                printf("Nova Matricula: ");
                scanf("%d",&(p->matricula[i]));
                j--;
                }
        }
       
        printf("Nota1: ");
        scanf("%f",&(p->nota1[i]));
       
        printf("Nota2: ");
        scanf("%f",&(p->nota2[i]));
       
        printf("\n");
        p->somamedia[i] = p->nota1[i] + p->nota2[i];
        }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Não entendi direito, teoricamente do jeito que eu postei você só vai digitar as notas depois que você inserir uma matrícula válida.

O que você quer é +- assim oh?

- Você digita o conjunto de matrícula+notas, e depois checa a matrícula pra ver se já existe;

- Se a matrícula já existir, você faz o cara digitar uma matrícula válida, e usa o conjunto de matrícula nova + as notas antigas;

É isso?!

EDITADO: Posta o código completo aí!

Editado por p4t0X
Link para o comentário
Compartilhar em outros sites

  • 0

O que eu quero é isso mesmo. Segue o codigo completo

#include<stdio.h> 

typedef struct Aluno 
{
    int matricula[5];
    float nota1[5];
    float nota2[5];
    float somamedia[5];
    
}Aluno;

void lerAluno (Aluno *p); 
void ordena (Aluno *v);
void imprimi (Aluno *b);

int main()
{
    Aluno a;        
    lerAluno(&a);     
    ordena(&a);     
    imprimi(&a);     
    return 0;
}

void lerAluno (Aluno *p)
{
        int i;
        int j;
        for(i=0;i<5;i++)
        {
        printf("Matricula: ");
        scanf("%d",&(p->matricula[i]));
            for (j=0; j<i; j++)
        {
                if(p->matricula[i]==p->matricula[j])
                {
                printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
                printf("Nova Matricula: ");
                scanf("%d",&(p->matricula[i]));
                j--;
                }
        }
       
        printf("Nota1: ");
        scanf("%f",&(p->nota1[i]));
       
        printf("Nota2: ");
        scanf("%f",&(p->nota2[i]));
       
        printf("\n");
        p->somamedia[i] = p->nota1[i] + p->nota2[i];
        }
}

void ordena( Aluno *v ) 
{ 
    int i ,j,aux; 
        for(i=0; i < 5; i++) 
        { 
            for(j=i; j < 5; j++) 
                { 
                    if (v->matricula[i] >= v->matricula[j]) 
                        {                                     
                                aux = v->matricula[i]; 
                                v->matricula[i] = v->matricula[j]; 
                                v->matricula[j] = aux; 
                        } 
                } 
        } 



} 

void imprimi(Aluno *b) 
{
    int i;
        for(i=0;i<5;i++)  
    {
    printf("\n-------------------------------------------------------------\n");
    printf("Matricula: %d\n",b->matricula[i]); //imprimi a matricula.
    printf("Nota1: %1.2f\n",b->nota1[i]);      //imprimi a nota1.
    printf("Nota2: %1.2f\n",b->nota2[i]);      //imprimi a nota2.
    printf("Media do Aluno: %1.2f\n",b->somamedia[i]/2); 
        if(b->somamedia[i]/2 < 6.0) 
    printf("Reprovado\n\n");
        else
    printf("Aprovado\n\n");
    }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde!

Segue:

#include<stdio.h> 

typedef struct Aluno 
{
    int matricula[5];
    float nota1[5];
    float nota2[5];
    float somamedia[5];
    
}Aluno;

void lerAluno (Aluno *p); 
void ordena (Aluno *v);
void imprimi (Aluno *b);

int main()
{
    Aluno a;        
    lerAluno(&a);     
    ordena(&a);     
    imprimi(&a);     
    return 0;
}

void lerAluno (Aluno *p)
{
        int i;
        int j;
        int matriculaValida;
        for(i=0;i<5;i++)
        {
        printf("Matricula: ");
        scanf("%d",&(p->matricula[i]));

        printf("Nota1: ");
        scanf("%f",&(p->nota1[i]));
       
        printf("Nota2: ");
        scanf("%f",&(p->nota2[i]));

        matriculaValida = 0;
        while( !matriculaValida ){
            matriculaValida = 1;
            for (j=0; j<i; j++)
            {
                if(p->matricula[i]==p->matricula[j])
                    {
                    printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n");
                    printf("Nova Matricula: ");
                    scanf("%d",&(p->matricula[i]));
                    matriculaValida = 0;
                }
            }
        }
              
        printf("\n");
        p->somamedia[i] = p->nota1[i] + p->nota2[i];
        }
}

void ordena( Aluno *v ) 
{ 
    int i ,j,aux; 
        for(i=0; i < 5; i++) 
        { 
            for(j=i; j < 5; j++) 
                { 
                    if (v->matricula[i] >= v->matricula[j]) 
                        {                                     
                                aux = v->matricula[i]; 
                                v->matricula[i] = v->matricula[j]; 
                                v->matricula[j] = aux; 
                        } 
                } 
        } 



} 

void imprimi(Aluno *b) 
{
    int i;
        for(i=0;i<5;i++)  
    {
    printf("\n-------------------------------------------------------------\n");
    printf("Matricula: %d\n",b->matricula[i]); //imprimi a matricula.
    printf("Nota1: %1.2f\n",b->nota1[i]);      //imprimi a nota1.
    printf("Nota2: %1.2f\n",b->nota2[i]);      //imprimi a nota2.
    printf("Media do Aluno: %1.2f\n",b->somamedia[i]/2); 
        if(b->somamedia[i]/2 < 6.0) 
    printf("Reprovado\n\n");
        else
    printf("Aprovado\n\n");
    }
}

Só tenho duas coisa a acrescentar:

- Sua função para ordenar as matrículas somente troca o número da matrícula, quando o esperado seria trocar tudo, incluindo as notas;

- Ainda sou a favor de criar a estrutura para UM aluno, e declarar um vetor dessa estrutura;

Qualquer dúvida dá um toque aí!

PS: Para testar a troca de matrícula, insira os seguintes dados:

Matrícula: 5 Notas: 5,5

Matrícula: 4 Notas: 4,4

Matrícula: 3 Notas: 3,3

Matrícula: 2 Notas: 2,2

Matrícula: 1 Notas: 1,1

O resultado esperado seria:

Matrícula: 1 Notas: 1,1

Matrícula: 2 Notas: 2,2

Matrícula: 3 Notas: 3,3

Matrícula: 4 Notas: 4,4

Matrícula: 5 Notas: 5,5

O resultado atual é:

Matrícula: 1 Notas: 5,5

Matrícula: 2 Notas: 4,4

Matrícula: 3 Notas: 3,3

Matrícula: 4 Notas: 2,2

Matrícula: 5 Notas: 1,1

Link para o comentário
Compartilhar em outros sites

  • 0

Problema Resolvido! Agora sim as notas ficam nas ordem corretas.

Mano muito obrigado pelas dicas e pela atenção, me salvo aqui. Qualquer dia posto algumas duvidas de java :P

void ordena( Aluno *p )
{
    int i, j, aux;
   
    for(i=0; i < 5; i++)
    {
        for(j=i; j < 5; j++)
        {
            if (p->matricula[i] >= p->matricula[j])
            {  
                //usando uma variável auxiliar realiza a troca de posição.
                aux = p->matricula[i];
                p->matricula[i] = p->matricula[j];
                p->matricula[j] = aux;
               
                aux = p->nota1[i];
                p->nota1[i] = p->nota1[j];
                p->nota1[j] = aux;
               
                aux = p->nota2[i];
                p->nota2[i] = p->nota2[j];
                p->nota2[j] = aux;
               
                aux = p->somamedia[i];
                p->somamedia[i] = p->somamedia[j];
                p->somamedia[j] = aux;
               
            }
        }
    }
}

Editado por Lastman
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...