Ir ao conteúdo

Posts recomendados

Postado

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
Postado

"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
Postado

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
Postado

É 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
Postado

@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
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!