Ir ao conteúdo
  • Cadastre-se
saulogoiana

C Programa de Cadastro e Procura de Alunos

Recommended Posts

Olá Fórum!

 

Estou com um problema num algoritmo usando funções para armazenar, imprimir e pesquisar dados de alunos em um vetor.

Parece que está havendo conflito para armazenar sexo e nome de um índice do tipo aluno, pois quando eu retiro a opção de armazenar o sexo ele executa tranquilamente.

O código está no spoiler.

 

Spoiler

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

typedef struct{
	char Sexo[1];
	char Nome[20];
	int Matricula;
	float Media;
	char Status[3];
}Aluno;

void setCadastro(Aluno A[],int nAlunos){
int i,j,auxInt;
float auxFloat,s;
Aluno auxAlu;
char nome[20];
char sexo[1];
	
	for(i=0;i<nAlunos;i++){
		printf("Digite o nome do aluno %i: ",i+1);
		scanf("%s",&nome);
		strcpy(A[i].Nome,nome);
		printf("Digite o sexo <M/F>: ");
		scanf("%s",&sexo);
		sexo[1]=toupper(sexo);
		A[i].Sexo[1]=sexo[1];
		printf("Digite o numero de matricula: ");
		scanf("%i",&auxInt);
		A[i].Matricula=auxInt;
		
		s=0;
		for(j=0;j<4;j++){
			printf("Digite a nota %i:",j+1);
			scanf("%f",&auxFloat);
			s+=auxFloat;
		}
	
		A[i].Media=s/4;
		if(A[i].Media>6){
			strcpy(A[i].Status,"AP");
		}else if(A[i].Media<5){
			strcpy(A[i].Status,"RP");
		}else{
			strcpy(A[i].Status,"PF");
		}
		
		if((A[i].Media<A[i-1].Media)&&(i>0)){
			auxAlu=A[i];
			A[i]=A[i-1];
			A[i-1]=auxAlu;
		}
	printf("\n");
	}
}

void procuraNome(char nome[20],Aluno A[],int nAlunos){
int p=-1,i;

	for(i=0;i<nAlunos;i++){	
		if(A[i].Nome==nome[20]){
			printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Matricula,A[i].Media);
		}
	}

}

void procuraSexo(char sexo[1],Aluno A[],int i,int nAlunos){	

	if(sexo==A[i].Sexo){
		printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Matricula,A[i].Media);
	}

}

void getCadastro(Aluno A[],int n){
int i;	
	printf("------  ALUNOS  ------\n");
	for(i=0;i<n;i++){			
			printf("|%i|\nNome: %s\nSexo: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Sexo,A[i].Matricula,A[i].Media);		
	}
}

void getStatus(Aluno A[],int n){
int i;	
	printf("------  STATUS  ------\n");
	for(i=0;i<n;i++){			
		printf("|%i|\nNome: %s\nEstado: %s\n",i+1,A[i].Nome,A[i].Status);		
		printf("\n");
	}
}

int menu(){
int escolha;
	printf("||||    MENU    ||||\n");	
	printf("Escolha uma das opções:\n");
	printf("1-> Cadastrar Aluno.\t2-> Cadastros.\n");
	printf("3-> Busca por nome.\t4-> Busca por sexo.\n");
	printf("5-> Consultar Aprovados/Reprovados/Prova Final.\t6-> Atualizar cadastros.\n");
	printf("0-> Sair.\n");
	
	scanf("%i",&escolha);
	
	return escolha;
}

main(){
	int i,n,p,esc,esc2=1;
	char nome[20],sexo[1];
	Aluno A[10];

	while(esc2!=0){

		esc=menu();
	
		switch(esc){
		
			case 0:
				esc2=0;
				
				break;
			case 1:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				getch();
				system("cls");
			
				break;
		
			case 2:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					getch();
				}else{
					getCadastro(A,n);
				
					getch();
				}
				system("cls");
				
				break;
			case 3:
				system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						getch();
					}else{
						do{
						printf("|\t\tPROCURA POR NOME\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o nome do aluno: ");
						scanf("%s",&nome);
						procuraNome(nome,A,n);
							if(p>=0){
							printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",p+1,A[p].Nome,A[p].Matricula,A[p].Media);		
							}else{
							printf("|%i|Nome não encontrado!\n",p);
							}
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				case 4:
					system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						getch();
					}else{
						do{
						printf("|\t\tPROCURA POR SEXO\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o sexo do aluno <M/F>: ");
						scanf("%s",&sexo);
						strupr(sexo);
						printf("Alunos do sexo |%s|",sexo);
						
						for(i=0;i<n;i++){
							procuraSexo(sexo[1],A,i,n);
						}
						
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				
				case 5:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					getch();
				}else{
					getStatus(A,n);
				
					getch();
				}
				system("cls");
				
				break;					
				
				case 6:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				getch();
				system("cls");
			
				break;		
		}

	}
	system("cls");
	printf("ENCERRADO!");
		
	getch();
	return 0;
}

 

 

Obrigado por visualizar, se possível me ajude!

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

"char sexo[1];" não faz muito sentido, se é apenas 1 caractere basta escrever "char sexo;", e a função strupr é para strings (qualquer string não vazia tem no mínimo 2 caracteres, 1 caractere + o caractere nulo '\0' para indicar o fim da string), para converter 1 caractere para letra maiúscula use toupper() da biblioteca ctype.h:

 

#include <ctype.h>

char sexo;

scanf("%c%*c", &sexo);
sexo = toupper(sexo);

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz as alterações no código e continuou o problema na hora de ler o sexo.

 

Spoiler

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

typedef struct{
	char Sexo;
	char Nome[20];
	int Matricula;
	float Media;
	char Status[3];
}Aluno;

void setCadastro(Aluno A[],int nAlunos){
int i,j,auxInt;
float auxFloat,s;
Aluno auxAlu;
char nome[20];
char sexo;
	
	for(i=0;i<nAlunos;i++){
		printf("Digite o nome do aluno %i: ",i+1);
		scanf("%s",&nome);
		strcpy(A[i].Nome,nome);
		printf("Digite o sexo <M/F>: ");
		scanf("%c",&sexo);
		sexo=toupper(sexo);
		A[i].Sexo=sexo;
		printf("Digite o numero de matricula: ");
		scanf("%i",&auxInt);
		A[i].Matricula=auxInt;
		
		s=0;
		for(j=0;j<4;j++){
			printf("Digite a nota %i:",j+1);
			scanf("%f",&auxFloat);
			s+=auxFloat;
		}
	
		A[i].Media=s/4;
		if(A[i].Media>6){
			strcpy(A[i].Status,"AP");
		}else if(A[i].Media<5){
			strcpy(A[i].Status,"RP");
		}else{
			strcpy(A[i].Status,"PF");
		}
		
		if((A[i].Media<A[i-1].Media)&&(i>0)){
			auxAlu=A[i];
			A[i]=A[i-1];
			A[i-1]=auxAlu;
		}
	printf("\n");
	}
}

void procuraNome(char nome[20],Aluno A[],int nAlunos){
int p=-1,i;

	for(i=0;i<nAlunos;i++){	
		if(A[i].Nome==nome[20]){
			printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Matricula,A[i].Media);
		}
	}

}

void procuraSexo(char sexo[1],Aluno A[],int i,int nAlunos){	

	if(sexo==A[i].Sexo){
		printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Matricula,A[i].Media);
	}

}

void getCadastro(Aluno A[],int n){
int i;	
	printf("------  ALUNOS  ------\n");
	for(i=0;i<n;i++){			
			printf("|%i|\nNome: %s\nSexo: %s\nMatricula: %i\nMedia: %.2f\n\n",i+1,A[i].Nome,A[i].Sexo,A[i].Matricula,A[i].Media);		
	}
}

void getStatus(Aluno A[],int n){
int i;	
	printf("------  STATUS  ------\n");
	for(i=0;i<n;i++){			
		printf("|%i|\nNome: %s\nEstado: %s\n",i+1,A[i].Nome,A[i].Status);		
		printf("\n");
	}
}

int menu(){
int escolha;
	printf("||||    MENU    ||||\n");	
	printf("Escolha uma das opções:\n");
	printf("1-> Cadastrar Aluno.\t2-> Cadastros.\n");
	printf("3-> Busca por nome.\t4-> Busca por sexo.\n");
	printf("5-> Consultar Aprovados/Reprovados/Prova Final.\t6-> Atualizar cadastros.\n");
	printf("0-> Sair.\n");
	
	scanf("%i",&escolha);
	
	return escolha;
}

main(){
	int i,n,p,esc,esc2=1;
	char nome[20],sexo;
	Aluno A[10];

	while(esc2!=0){

		esc=menu();
	
		switch(esc){
		
			case 0:
				esc2=0;
				
				break;
			case 1:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				getch();
				system("cls");
			
				break;
		
			case 2:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					getch();
				}else{
					getCadastro(A,n);
				
					getch();
				}
				system("cls");
				
				break;
			case 3:
				system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						getch();
					}else{
						do{
						printf("|\t\tPROCURA POR NOME\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o nome do aluno: ");
						scanf("%s",&nome);
						procuraNome(nome,A,n);
							if(p>=0){
							printf("\n-- %i --\nNome: %s\nMatricula: %i\nMedia: %.2f\n\n",p+1,A[p].Nome,A[p].Matricula,A[p].Media);		
							}else{
							printf("|%i|Nome não encontrado!\n",p);
							}
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				case 4:
					system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						getch();
					}else{
						do{
						printf("|\t\tPROCURA POR SEXO\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o sexo do aluno <M/F>: ");
						scanf("%s",&sexo);
						strupr(sexo);
						printf("Alunos do sexo |%c|",sexo);
						
						for(i=0;i<n;i++){
							procuraSexo(sexo,A,i,n);
						}
						
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				
				case 5:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					getch();
				}else{
					getStatus(A,n);
				
					getch();
				}
				system("cls");
				
				break;					
				
				case 6:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				getch();
				system("cls");
			
				break;		
		}

	}
	system("cls");
	printf("ENCERRADO!");
		
	getch();
	return 0;
}

Obrigado pela atenção.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o típico problema de ficar lixo no buffer de entrada, você precisa limpar os caracteres que não foram lidos pelo scanf para evitar que o próximo scanf os leia ao invés do que deveria ser digitado e capturado pelo scanf.

 

Coloque essa função no programa:

void flush_stdin(){
    int c;
    while((c = getchar()) != '\n' && c != EOF);
}

 

E use-a após cada scanf para limpar o que ficou no buffer:

scanf("%s",&nome);
flush_stdin();

 

Normalmente apenas o caractere nova linha '\n' fica sobrando (o caractere é inserido quando você aperta Enter após digitar algo no prompt/cmd/terminal), mas essa função vai limpar qualquer coisa.

 

 

Aliás, se a intenção é fazer o scanf pegar nomes completos, não apenas o primeiro nome, use %[^\n] no scanf, ao invés de %s, pois %s captura apenas 1 palavra, ou seja para de capturar no primeiro caractere vazio encontrado (espaço, nova linha ou tabulação).

scanf("%[^\n]",&nome);

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Muito Obrigado!

O problema da leitura do sexo foi resolvido.

Eu adoraria saber como eu posso corrigir minha função para procurar um nome no vetor.

 

Spoiler

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

typedef struct{
	char Sexo;
	char Nome[20];
	int Matricula;
	float Media;
	char Status[3];
}Aluno;

void flush_stdin(){
    int ch;
    do {
        ch = fgetc(stdin);
    } while (ch != EOF && ch != '\n');
}

void setCadastro(Aluno A[],int nAlunos){
int i,j,auxInt;
float auxFloat,s;
Aluno auxAlu;
char nome[20];
char sexo;
	
	for(i=0;i<nAlunos;i++){
		printf("Digite o nome do aluno %i: ",i+1);
		scanf("%s",&nome);
		flush_stdin();
		strcpy(A[i].Nome,nome);
		printf("Digite o sexo <M/F>: ");
		scanf("%c",&sexo);
		flush_stdin();
		sexo=toupper(sexo);
		A[i].Sexo=sexo;
		printf("Digite o numero de matricula: ");
		scanf("%i",&auxInt);
		flush_stdin();
		A[i].Matricula=auxInt;
		
		s=0;
		for(j=0;j<4;j++){
			printf("Digite a nota %i:",j+1);
			scanf("%f",&auxFloat);
			flush_stdin();
			s+=auxFloat;
		}
	
		A[i].Media=s/4;
		if(A[i].Media>6){
			strcpy(A[i].Status,"AP");
		}else if(A[i].Media<5){
			strcpy(A[i].Status,"RP");
		}else{
			strcpy(A[i].Status,"PF");
		}
		
		if((A[i].Media<A[i-1].Media)&&(i>0)){
			auxAlu=A[i];
			A[i]=A[i-1];
			A[i-1]=auxAlu;
		}
	printf("\n");
	}
}

void procuraNome(char nome[],Aluno A[],int i){

	if(nome==A[i].Nome){
		printf("\n-- %i --\nNome: %s\nMatricula: %i\n",i+1,A[i].Nome,A[i].Matricula);
		printf("Media: %.2f\n\n",A[i].Media);
	}

}

void procuraSexo(char sexo,Aluno A[],int i){	

	if(sexo==A[i].Sexo){
		printf("\n-- %i --\nNome: %s\nMatricula: %i\n",i+1,A[i].Nome,A[i].Matricula);
		printf("Media: %.2f\n\n",A[i].Media);
	}

}

void getCadastro(Aluno A[],int n){
int i;	
	printf("------  ALUNOS  ------\n");
	for(i=0;i<n;i++){			
		printf("|%i|\nNome: %s\nSexo: %c\n",i+1,A[i].Nome,A[i].Sexo);
		printf("Matricula: %i\nMedia: %.2f\n\n",A[i].Matricula,A[i].Media);		
	}
}

void getStatus(Aluno A[],int n){
int i;	
	printf("------  STATUS  ------\n");
	for(i=0;i<n;i++){			
		printf("|%i|\nNome: %s\nEstado: %s\n",i+1,A[i].Nome,A[i].Status);		
		printf("\n");
	}
}

int menu(){
int escolha;
	printf("||||    MENU    ||||\n");	
	printf("Escolha uma das opções:\n");
	printf("1-> Cadastrar Aluno.\t2-> Cadastros.\n");
	printf("3-> Busca por nome.\t4-> Busca por sexo.\n");
	printf("5-> Consultar Aprovados/Reprovados/Prova Final.\n6-> Atualizar cadastros.\n");
	printf("0-> Sair.\n");
	
	scanf("%i",&escolha);
	flush_stdin();
	
	return escolha;
}

main(){
	int i,n,p,esc,esc2=1;
	char nome[20],sexo;
	Aluno A[10];

	while(esc2!=0){

		esc=menu();
	
		switch(esc){
		
			case 0:
				esc2=0;
				
				break;
			case 1:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				flush_stdin();
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				system("pause");
				system("cls");
			
				break;
		
			case 2:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					system("pause");
				}else{
					getCadastro(A,n);
				
					system("pause");
				}
				system("cls");
				
				break;
			case 3:
				system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						system("pause");
					}else{
						do{
						printf("|\t\tPROCURA POR NOME\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o nome do aluno: ");
						scanf("%s",&nome);
						flush_stdin();
						
						for(i=0;i<n;i++){
							procuraNome(nome,A,i);
						}
						
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						flush_stdin();
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				case 4:
					system("cls");
					if(n==0){
						printf("ERRO! Nenhum cadastrado armazenado!\n");
					
						system("pause");
					}else{
						do{
						printf("|\t\tPROCURA POR SEXO\t\t|\n");
						printf("%i CADASTRO(S)\n",n);
						printf("Digite o sexo do aluno <M/F>: ");
						scanf("%c",&sexo);
						flush_stdin();
						sexo=toupper(sexo);
						printf("Alunos do sexo |%c|",sexo);
						
						for(i=0;i<n;i++){
							procuraSexo(sexo,A,i);
						}
						
						printf("Repetir busca? CONTINUAR<1>/SAIR<2>\n");
						scanf("%i",&esc2);
						flush_stdin();
						
						system("cls");
						}while(esc2!=2);
				
					}
				system("cls");
				
				break;
				
				case 5:
				system("cls");
				if(n==0){
					printf("ERRO! Nenhum cadastro armazenado!\n");
				
					system("pause");
				}else{
					getStatus(A,n);
				
					system("pause");
				}
				system("cls");
				
				break;					
				
				case 6:
				system("cls");
				printf("||||  CADASTRAR ALUNOS  ||||\n\n");
				printf("Digite a quantidade de alunos a serem cadastrados: ");
				scanf("%i",&n);
				flush_stdin();
				printf("\n");
				setCadastro(A,n);
			
				printf("\nCADASTROS EFETUADOS!\n");
				system("pause");
				system("cls");
			
				break;		
		}

	}
	system("cls");
	printf("ENCERRADO!\n\n");
		
	system("pause");
	return 0;
}

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para comparar strings use a função strcmp(string1, string2), que retorna 0 se string1 é igual a string2, um número maior que 0 se string1 > string2, e um número menor que 0 se string1 < string2  (maior e menor dependendo da ordem alfabética seguindo os valores dos caracteres na tabela ASCII).

if (strcmp(nome, A[i].Nome) == 0) //Se 'nome' e 'A[i].Nome' são iguais

 

  • Obrigado 1

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

×