Ir ao conteúdo
  • Cadastre-se
Lucas da Veiga Camargo

Problemas com o retorno de variáveis

Recommended Posts

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>
#include<stdlib.h>
#define QTD 3

typedef struct{
	
	char nome[100];
	char sexo;
	int matricula;
	int notap1;
	int notap2;
	int notatrab;
	float media;
}aluno;




void cadastro(aluno pDados[QTD],int &pPosicao);
void exibir(aluno pDados[QTD],int &pPosicao);
void excluir(aluno pDados[QTD],int &pPosicao);
void procurar(aluno pDados[QTD],int &pPosicao);
main(){
	setlocale(LC_ALL,"portuguese");
	int posicao=0;
	char resp;
	aluno dados[QTD];
	
	do{
	system("cls");
	printf("\n\t\t===>Menu de opções<===");
	printf("\n1- Cadastrar Aluno");
	printf("\n2- Exibir Cadastro");
	printf("\n3- Excluir Aluno");
	printf("\n4- Procurar por Nome");
	printf("\n5- Lançar Notas");
	printf("\n6- Relatório por Genêro");
	printf("\n7- Relatório Aprovação");
	printf("\nS- Sair do Programa");
	printf("\nDigite o número correspondente a ação desejada => ");
	fflush(stdin);
	scanf("%c",&resp);
	switch(resp){
	
	case '1': 
	cadastro(dados,posicao);
	break;		
	case '2':
			exibir(dados,posicao);
			break;
	case '3':
		    excluir(dados,posicao);
		break;
	case '4':
		    procurar(dados,posicao);
	}

}while(toupper(resp!='s'));
}
void cadastro(aluno pDados[QTD],int &pPosicao){
	int matri=0;
	system("cls");
	printf("\nDigite o nome do aluno: ");
	fflush(stdin);
	gets(pDados[pPosicao].nome);
	printf("\nDigite M para sexo masculino ou F para feminino: ");
	scanf("%c",&pDados[pPosicao].sexo);
	pDados[pPosicao].sexo = toupper(pDados[pPosicao].sexo);
	matri++;
	pDados[pPosicao].matricula=matri+100;
	pPosicao++;
	pDados[pPosicao].notap1=0;
	pDados[pPosicao].notap2=0;
	pDados[pPosicao].notatrab=0;
	pDados[pPosicao].media=0;
	fflush(stdin);	
}

void exibir(aluno pDados[QTD],int &pPosicao){
	int x;
	system("cls");
	for(x=0;x<pPosicao;x++){
		printf("\n\nNome: %s",pDados[x].nome);
		printf("\nSexo: %c",pDados[x].sexo);
		printf("\nMatrícula: %i\n\n",pDados[x].matricula);
		
	}
system("\npause");
}

void excluir(aluno pDados[QTD],int &pPosicao){
	int remove,x;
	system("cls");
	printf("\nDigite a mátricula do aluno que deseja excluir: ");
	scanf("%i",&remove);
	for(x=0;x<pPosicao;x++){
		if(pDados[x].matricula==remove){
			pDados[x].matricula=pDados[x+1].matricula;
			pDados[x+1].matricula=remove;
		    strcpy(pDados[x].nome,pDados[x+1].nome);
		    pDados[x].sexo=pDados[x+1].sexo;
		    pDados[x].notap1=pDados[x+1].notap1;
		    pDados[x].notap2=pDados[x+1].notap2;
		    pDados[x].notatrab=pDados[x+1].notatrab;
		    pDados[x].media=pDados[x+1].media;
		    pPosicao--;
		}
	}
		
	
}
void procurar(aluno pDados[QTD],int &pPosicao){
	char procurar[100];
	int x,cont=0;
	
	system("cls");
	printf("\nDigite o nome do aluno que deseja procurar: ");
	fflush(stdin);
	gets(procurar);
	for (x=0;x<pPosicao;x++){
		if(strcmp(pDados[x].nome,procurar)==0){
			fflush(stdin);
			printf("\n\nNome: %s",pDados[x].nome);
		    printf("\nSexo: %c",pDados[x].sexo);
		    printf("\nMatrícula: %i",pDados[x].matricula);
		    printf("\nNota P1: %i",pDados[x].notap1);
		    printf("\nNota P2: %i",pDados[x].notap2);
		    printf("\nNota Trabalho: %i",pDados[x].notatrab);
		    printf("\nNota media: %i\n\n",pDados[x].media);
			cont++; 
		}
	
	if(cont<1){
		system("cls");
		printf("NOME NÃO ENCONTRADO\n\n");
		system("pause");
	}
}
system("pause");
}






estou no primeiro semestre de ciência da computação e estava fazendo um exercício e notei um problema que não consigo resolver.Enquanto estava fazendo o código notei que quando tento chamar certas variáveis numa struct o programa retorna números aleatórios( aparentemente aleatórios). Deve ser um problema de iniciante mas alguém poderia me ajudar? 

o problema no caso é quando tento chamar as variaveis notap2 e notatrabalho.

Se alguém puder me ajudar agradeço muito.

 

Editado por Lucas da Veiga Camargo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando reservar memória você está pegando também o lixo que está nesse local, pois lembre que a memória é compartilhada entre todos os programas.

 

#include <stdio.h>
#include <stdlib.h>
typedef struct{
    int n;
}Dados; 

int main (){
    Dados d;
    
    printf("%d", d.n);
    
    getchar();
    return 0;
}

Para evitar esse problema declare as variáveis tal como Dados d={0};. Dessa forma você está colocando todos os dados a a zero dentro da estrutura, isso inclui chars('\0'), ints(0) strings(""), etc, cada tipo de dado ficará corretamente formatado sem valores aleatórios.

 

Por outro lado ao se tratar de um array de structs, se estiver em gcc, você pode usar a seguinte forma Dados d[2]={{0}};,caso contrario você deveria usar um laço for para tal cometido, não sei se funciona em outros compiladores, pode mostrar avisos.

 

Se o array de estruturas tiver 2 inteiros deveria ser da seguinte forma: Dados d[2]={{0,0}};

Se tiver 3 Dados d[2]={{0, 0, 0}};, não importa o tipo de dado, cada um deles fica formatado conforme seu tipo.
 

typedef struct{
    int n;
    char c;
}Dados; 

int main (){

    Dados d[2]={{0,0}};
  ...

Falou?  fui!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ver... isso que você ta falando é um engano. Como falei, você pode pegar lixo e pode que não, tudo depende de se um programa que você tenha usado anteriormente teria ou não usado esse espaço anteriormente, então com só mudar o valor é impossível você assegurar o valor que está contido nesse espaço, se não faça a prova, crie um vetor de 500 structs e imprima cada um deles com um for, você verá que alguns deles vão estar em branco, e outros sim vão ter resíduos, porém da forma que te expliquei você está dando uma "limpeza" nesse espaço que você está usando. Se o problema se resolvesse com só mudar de valor seria um pouco estúpido não acha? o que pode ter acontecido é que ao mudar de tipo, como o float precisa de maior espaço que um int, o sistema tenha mudado a estrutura de lugar, e certamente esse lugar está limpo, faça a reflexão do assunto, force os erros, assim você aprende dos seus erros também.

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

×