Ir ao conteúdo

Posts recomendados

Postado

Bom dia nobres amigos programmers .... estou com um problema em um código e não consigo resolver, já quebrei a cabeça algumas horas e preciso da ajuda de vocês que são mais experientes... segue o mesmo.... desculpem a bagunça do mesmo, ainda estou estudando e identação ainda não é meu forte :(

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct cadastro_de_aluno
{
    char RU[200];
    char nome[200];
    char email[200];
    int vazio,cod;
};
    struct cadastro_de_aluno alunoCad;
   
//AQUI DECLARO AS FUNÇÕES A SEREM USADAS
int verifica_pos(void);
int verifica_cod( int cod );
int opt;
void list();
void consultaCod (void);
void excluirAluno (void);
int main(void){ //INICIO DO MAIN

    int i,Opcao,OpcaoAluno,posicao,retorno;
    int codaux;
    do
    {
        printf("1 - Cadastrar Novo Aluno\n");
        printf("2 - Aluno\n");
        printf("3 - Alterar Aluno\n");
        printf("4 - Excluir Aluno\n");
        printf("5 - Sair\n");
        printf(" Selecione uma opcao por favor: ");
        scanf("%d", &Opcao);
        getchar();
        if (Opcao == 1)
        {
            printf("voce selecionou a opcao 1 - Cadastrar Novo Aluno\n");
            posicao=verifica_pos();

                if ( posicao != -1 )
                {

                    printf("\nEntre com um codigo de 1 a 10 para seu cadastro: \n");
                    scanf("%d",&codaux);fflush(stdin);

                    retorno = verifica_cod( codaux );}

                else
                    printf("\nNao e possivel realizar mais cadastros!\n");

                break;
 
        }
        else if (Opcao == 2)
        {
            system("cls");
            do{
            printf("voce selecionou a opcao 2 - Alunos\n\n");
            printf("1 - Pesquisar aluno por codigo\n");
            printf("2 - Listar todos os alunos\n");
            printf("3 - Voltar ao menu principal\n");
            printf("Selecione uma opcao por favor: ");
            scanf("%d", &OpcaoAluno);
            getchar();
                 if(OpcaoAluno == 1){
                    consultaCod();
                }
                else if(OpcaoAluno == 2){
                    list();
                }
                else if(OpcaoAluno == 3){
                    printf("voce selecionou voltar ao menu principal, pressione ENTER para continuar");
                    getchar();
                    system("cls");
                }
                else
                    printf("Opcao Invalida\n\n");
    }while(OpcaoAluno =!3 || OpcaoAluno > 3 || OpcaoAluno < 0 || OpcaoAluno == 0);
        }
        else if (Opcao == 3)
        {
            printf("voce selecionou a opcao 3 - Alterar Aluno\n");
        }
        else if (Opcao == 4)
        {
            printf("voce selecionou a opcao 4 - Excluir Aluno\n");
            excluirAluno();
        }
        else if (Opcao == 5)
        {
        {
            printf("voce selecionou a opção 5 - Sair\n");
        }
    }
        else{
            printf("Opcao invalida, favor pressione enter para voltar ao menu principal");
            getchar();
            system("cls");
        }
        }    while (Opcao != 5 || Opcao < 5);

} // FIM DO MAIN

void list(){ // Lista os usuarios cadastrados.
    int i,j;   
    for(i=0;i<200;i++){
        if(log[i].cod!=NULL){
            printf("\nCodigo: %d \nNome: %s\nRU: %s\n email: \n\n", log[i].cod,log[i].nome,log[i].RU,log[i]. email,log[i]);
    }
}
    printf("Pressione enter para volta ao menu principal");
    getchar();
    system("cls");

} //FIM DO LIST
void cadastroP(int cod, int pos){ //Cadastro das pessoas
    int i;
    do{
    pos = verifica_pos();
    log[pos].cod = cod;
         printf("\nDigite o RU: ");
        gets(log[pos].RU);
		printf("\nDigite o nome: ");
        gets(log[pos].nome);
        printf("\nDigite o  email: ");
        gets(log[pos]. email);
               log[pos].vazio = 1;
        //printf("\nDigite enter para efetuar novo cadastro ou qualquer outra tecla para voltar ao menu principal");
        //scanf("%d", &opt);
        opt ==1;
        getchar();   
    }while(opt==1);
    system("cls");
    main();

} // FIM DO CADASTRO DE PESSOAS
int verifica_pos( void ) //VERIFICADOR DA POSIÇÃO
{
    int cont = 0;

    while ( cont <= 10 )
    {

        if ( log[cont].vazio == 0 )
            return(cont);

        cont++;

    }

    return(-1);

} // FIM DO VERIFICADOR
int verifica_cod( int cod ) // VERIFICADOR DE CÓDIGO
{
    int cont = 0;

    while ( cont <= 10 )
    {
        if ( log[cont].cod == cod )
            return(0);

        cont++;
    }

    return(1);

} 

        cont++;

        if ( cont > 10 ){
            printf("\nCodigo nao encontrado, pressione enter para volar ao menu principal\n");
            getchar();
            system("cls");
        }

    
} // FIM DA FUNÇÃO CONSULTAR
void excluirAluno(void)  // EXCLUI ALUNO
{
    int cod, cont = 0;
    char resp;
    printf("\nEntre com o codigo do registro que deseja excluir: \n");
    scanf("%d", &cod );

    while ( cont <= 10 )
    {

        if ( log[cont].cod == cod )
        {

            if (log[cont].vazio == 1 )
            {
                printf("\nCodigo: %d \nNome: %s\nRU: %s\n email: %s\n\n", log[cont].cod,log[cont].nome,log[cont].RU,log[cont]. email,);
                getchar();
                printf("\nDeseja realmente exlucir? s/n: ");
                scanf("%s",&resp);

                if ( ( resp == 'S' ) || ( resp == 's' ) )
                {
                    log[cont].vazio=0;
                    log[cont].cod = NULL;
                    printf("\nExclusao feita com sucesso\n");
                    break;
                }
                else
                {
                    if ( ( resp == 'N' ) || ( resp == 'n' ) )
                    {
                        printf("Exclusao cancelada!\n");
                        break;
                    }
                }

            }

        }

        cont++;

        if ( cont > 10 )
            printf("\nCodigo nao encontrado\n");

    }

    system("pause");
    system("cls");

}

 

Postado
adicionado 2 minutos depois
Em 25/03/2019 às 12:27, Hedson disse:

 

meu amigo, como te falei, eu agradeço mas preciso de orientações, tenho dúvidas e seu código pronto está bem acima do meu nível, preciso de orientações para desenvolver o meu código. Mais uma vez obrigado.

adicionado 4 minutos depois

@Flávio Pedroza  meu amigo estou partindo de alguns códigos que vi, e eu estou tentando fazer uma pesquisa de parâmetros cadastrados, tipo... pesquisa por RU, ou por Nome

 

Postado

Vi também que você faz referência a um array "log", mas não declarou o mesmo. Por exemplo:

void list(){ // Lista os usuarios cadastrados.
    int i,j;   
    for(i=0;i<200;i++){
        if(log[i].cod!=NULL){
            printf("\nCodigo: %d \nNome: %s\nRU: %s\n email: \n\n", log[i].cod,log[i].nome,log[i].RU,log[i]. email,log[i]);
    }
}
 

Tem muitos outros erros de sintaxe e lógica. Eu sugiro recomeçar e aos poucos ir adicionando funções.

  • Curtir 1
Postado

pessoal estou tentando refazer o código dessa vez sem franksteins .... 

por favor me ajudem com esse novo algorítimo 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

int main(int argc, char *argv[]) {
	t_cad * ini_cad;
	t_cad * prox_cad;
	int cont;
	int c;

	ini_cad = (t_cad*)malloc(sizeof(t_cad));
	if (ini_cad == NULL)
		exit(1);
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf_s("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf_s("%s",&prox_cad->nome);
		printf("Digite o email:");
		scanf_s("%s", &prox_cad->email);
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf_s("\n %d", &cont);
		if (cont == 1)
		{
			prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
			prox_cad = prox_cad->proximo;
		}
		else
			break;
	}
	printf("\n");
	prox_cad->proximo = NULL;
	prox_cad = ini_cad;
	while (prox_cad != NULL) {

		printf("ru: %d\n nome:\n email:", prox_cad->ru, prox_cad->nome, prox_cad->email);
		prox_cad = prox_cad->proximo;
	}

	return 0;
}

o enunciado do trabalho:

 

Faça um algoritmo em linguagem C que realiza a busca de um aluno. A busca deve ser realizada utilizando uma estrutura de dados bastante eficiente para esta tarefa.
Defina a estrutura de dados que você irá utilizar para fazer esta implementação e JUSTIFIQUE em texto porque você escolheu ela;
1. Deve-se armazenar o nome do aluno, seu e-mail e seu RU. Para o armazenamento utilize uma estrutura heterogênea de dados.
2. Não é necessário fazer a leitura dos dados dos dados dos alunos manualmente. Você já pode deixar pré-cadastrado os dados no seu código. Cadastre pelo menos uns 10 contatos de alunos na sua estrutura de dados. Um dos contatos deverá ser o seu próprio nome e o seu RU ;
3. Em um menu na tela, peça para o usuário digitar um RU. O programa deverá realizar a busca por este RU na estrutura de dados e, caso localize o RU, deverá mostrar o nome correspondente do aluno e o e-mail deste contato. Caso não localize, uma mensagem de erro deve ser apresentada.
4. Para testar o programa, teste a busca com o seu RU e coloque a captura de dela.

Postado
printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); //faltou os "%s"

Para a pesquisa:

int ru;
scanf_s("Digite a RU a ser pesuisada: %d\n", &ru);
prox_cad = ini_cad;
while (prox_cad != NULL) {
		if (prox_cad-> ru == ru)
		{
			printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			break;
		}
		prox_cad = prox_cad->proximo;
}

Veja se consegue alterar para acrescentar uma mensagem de erro caso a RU não seja encontrada.

Postado

Meu colega Flávio, estou tentando implementar um menu, mas estou com problemas pode me ajudar???


/*Faça um algoritmo em linguagem C que realiza a busca de um aluno da UNINTER no AVA. A busca deve ser realizada utilizando uma estrutura de dados bastante eficiente para esta tarefa.
Defina a estrutura de dados que você irá utilizar para fazer esta implementação e JUSTIFIQUE em texto porque você escolheu ela;
1. Deve-se armazenar o nome do aluno, seu e-mail e seu RU. Para o armazenamento utilize uma estrutura heterogênea de dados.
2. Não é necessário fazer a leitura dos dados dos dados dos alunos manualmente. Você já pode deixar pré-cadastrado os dados no seu código. Cadastre pelo menos uns 10 contatos de alunos na sua estrutura de dados. Um dos contatos deverá ser o seu próprio nome e o seu RU da UNINTER;
3. Em um menu na tela, peça para o usuário digitar um RU. O programa deverá realizar a busca por este RU na estrutura de dados e, caso localize o RU, deverá mostrar o nome correspondente do aluno e o e-mail deste contato. Caso não localize, uma mensagem de erro deve ser apresentada.
4. Para testar o programa, teste a busca com o seu RU e coloque a captura de dela.

*/

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

typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

int op;
void cadastro();
void pesquisa();
int main(int argc, char *argv[]) {

	do {
		system("cls");
		printf("*========================*\n");
		printf("| Escolha uma opcao      |\n");
		printf("| 1. Cadastrar Aluno     |\n");
		printf("| 2. Pesquisar Aluno     |\n");
		printf("| 3. Sair                |\n");
		printf("*========================*\n");
		scanf("%d", &op);
		switch (op) {
		case 1:
			cadastro();

			break;

		case 2:
			pesquisa();

			break;

		case 3:

			system("exit");
			break;
		default:
			printf("Opcao Invalida...");
			break;
		}

	} while (op != 3);



	
	return 0;
}
void cadastro() {
	t_cad * ini_cad;
	t_cad * prox_cad;
	int cont;
	
	ini_cad = (t_cad*)malloc(sizeof(t_cad));
	if (ini_cad == NULL)
		exit(1);
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf("%s", &prox_cad->nome);
		printf("Digite o email:");
		scanf("%s", &prox_cad->email);
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf("\n %d", &cont);
				if (cont == 1)
		{
			prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
			prox_cad = prox_cad->proximo;
		}
		else
			break;
	}
	printf("\n");
	prox_cad->proximo = NULL;
	prox_cad = ini_cad;

}

void pesquisa() {
	int ru_aux;
	char nome_aux[60];
	int i;

	do {
		printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n");
		scanf("%d", &op);
		switch (op) {
		case 1:
			printf("\n Digite o RU do Aluno:");
			scanf("%d", &ru_aux);
			
			for (i = 0; i < SIZE; i++) {
				if (cad_aluno.ru[i] == ru_aux) {
					printf("\n RU: %d\n Nome: %s\n Email: %s\n", cad_aluno.ru[i], cad_aluno.nome[i], cad_aluno.email[i]);
				}
			}
			break;
		case 2:
			printf("\n Digite o nome do Aluno:");
			scanf("%s", &cad_aluno.nome);
			for (i = 0; i < SIZE; i++) {
				if (strcmp(cad_aluno.nome[i], nome_aux)==0) {
					printf("\n RU: %d\n Nome: %s\n Email: %s\n", cad_aluno.ru[i], cad_aluno.nome[i], cad_aluno.email[i]);
				}
			}
			break;

		default:
			printf("\n****opcao invalida*****");
			break;
		}
		printf("\ndigite 1 para nova pesquisa e 0 para sair\n");
		scanf("%d", &op);
	} while (op == 1);
}

 

Postado

Acredito que com essas modificações irá funcionar;

typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

Função cadastro

void cadastro() {
	
	int cont;
	t_cad* prox_cad;
	
	if (ini_cad == NULL)
	{
		ini_cad = (t_cad*)malloc(sizeof(t_cad));
		ini_cad ->proximo = NULL;
		if (ini_cad == NULL) exit(1);
	}
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf("%s", &prox_cad->nome);
		printf("Digite o email:");
		scanf("%s", &prox_cad->email);
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf("\n %d", &cont);
		if (cont == 0) break;
	    prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
		prox_cad = prox_cad->proximo;
		prox_cad->proximo = NULL;	
	}
	printf("\n");
}

Função pesquisa

void pesquisa() {
	int ru_aux;
	char nome_aux[60];
	t_cad* prox_cad;

	do {
		printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n");
		scanf("%d", &op);
		if (op == 0) break;
		prox_cad = ini_cad;
		switch (op) {
		case 1:
			printf("\n Digite o RU do Aluno:");
			scanf("%d", &ru_aux);
			while (prox_cad != NULL) {
		     if (prox_cad-> ru == ru_aux)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
			  }	
			  prox_cad = prox_cad->proximo;
			}
            break;
		case 2:
			printf("\n Digite o nome do Aluno:");
			scanf("%s", nome_aux);//não precisa de & para string
			while (prox_cad != NULL) {
		     if (strcmp(prox_cad->nome, nome_aux) == 0)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
		      }
		      prox_cad = prox_cad->proximo;
			}
		    break;

		default:
			printf("\n****opcao invalida*****");
			break;
		}
	} while (1);
}

ATENÇÃO: Você tem que liberar a memória alocada manualmente, o C++ NÃO faz automaticamente.

Função liberamem

void liberarmem()
{
    t_cad *prox_cad;
    while (ini_cad != NULL) {
             prox_cad = ini_cad;
             ini_cad  = prox_cad->proximo;
             free(prox_cad);
		  	}
}

Chamar a função liberamem antes do return 0, no main.

Postado

Meu Amigo Flavio muito obrigado, com ajuda de pessoas como você a gente consegue desenvolver o entendimento para executarmos...👍

  • 4 semanas depois...
Postado

Boa noite pessoal!

 

Primeiramente parabéns ao Flávio pela boa vontade em ajudar.

 

Fiquei com uma duvida na mesma atividade:

Citação

Defina a estrutura de dados que você irá utilizar para fazer esta implementação e JUSTIFIQUE em texto porque você escolheu ela;

 

Qual seria a justificativa desse uso? 

  • mês depois...
Postado
Em 03/04/2019 às 18:50, Flávio Pedroza disse:

Acredito que com essas modificações irá funcionar;


typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

Função cadastro


void cadastro() {
	
	int cont;
	t_cad* prox_cad;
	
	if (ini_cad == NULL)
	{
		ini_cad = (t_cad*)malloc(sizeof(t_cad));
		ini_cad ->proximo = NULL;
		if (ini_cad == NULL) exit(1);
	}
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf("%s", &prox_cad->nome);
		printf("Digite o email:");
		scanf("%s", &prox_cad->email);
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf("\n %d", &cont);
		if (cont == 0) break;
	    prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
		prox_cad = prox_cad->proximo;
		prox_cad->proximo = NULL;	
	}
	printf("\n");
}

Função pesquisa


void pesquisa() {
	int ru_aux;
	char nome_aux[60];
	t_cad* prox_cad;

	do {
		printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n");
		scanf("%d", &op);
		if (op == 0) break;
		prox_cad = ini_cad;
		switch (op) {
		case 1:
			printf("\n Digite o RU do Aluno:");
			scanf("%d", &ru_aux);
			while (prox_cad != NULL) {
		     if (prox_cad-> ru == ru_aux)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
			  }	
			  prox_cad = prox_cad->proximo;
			}
            break;
		case 2:
			printf("\n Digite o nome do Aluno:");
			scanf("%s", nome_aux);//não precisa de & para string
			while (prox_cad != NULL) {
		     if (strcmp(prox_cad->nome, nome_aux) == 0)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
		      }
		      prox_cad = prox_cad->proximo;
			}
		    break;

		default:
			printf("\n****opcao invalida*****");
			break;
		}
	} while (1);
}

ATENÇÃO: Você tem que liberar a memória alocada manualmente, o C++ NÃO faz automaticamente.

Função liberamem


void liberarmem()
{
    t_cad *prox_cad;
    while (ini_cad != NULL) {
             prox_cad = ini_cad;
             ini_cad  = prox_cad->proximo;
             free(prox_cad);
		  	}
}

Chamar a função liberamem antes do return 0, no main.

Bom Dia

 

Montei o código com todas as alterações mais ainda esta aparecendo um erro depois que eu digito o nome, da erro de exclusão, como resolvo este problema. Obrigado

Postado
Em 03/04/2019 às 18:50, Flávio Pedroza disse:

void cadastro() { int cont; t_cad* prox_cad; if (ini_cad == NULL) { ini_cad = (t_cad*)malloc(sizeof(t_cad)); ini_cad ->proximo = NULL; if (ini_cad == NULL) exit(1); } prox_cad = ini_cad; while (1) { printf("Digite o RU:"); scanf("%d", &prox_cad->ru); printf("Digite o Nome:"); scanf("%s", &prox_cad->nome); printf("Digite o email:"); scanf("%s", &prox_cad->email); printf("Deseja continuar??? (1)SIM e (0)NAO"); scanf("\n %d", &cont); if (cont == 0) break; prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad)); prox_cad = prox_cad->proximo; prox_cad->proximo = NULL; } printf("\n"); }

estou com problema nesta parte do código, tentei usar o gets_s mais tambem não funcionou.

 

adicionado 2 minutos depois
4 horas atrás, Heliton Potter disse:

Bom Dia

 

Montei o código com todas as alterações mais ainda esta aparecendo um erro depois que eu digito o nome, da erro de exclusão, como resolvo este problema. Obrigado

 

Em 03/04/2019 às 18:50, Flávio Pedroza disse:

Acredito que com essas modificações irá funcionar;


typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

Função cadastro


void cadastro() {
	
	int cont;
	t_cad* prox_cad;
	
	if (ini_cad == NULL)
	{
		ini_cad = (t_cad*)malloc(sizeof(t_cad));
		ini_cad ->proximo = NULL;
		if (ini_cad == NULL) exit(1);
	}
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf("%s", &prox_cad->nome);
		printf("Digite o email:");
		scanf("%s", &prox_cad->email);
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf("\n %d", &cont);
		if (cont == 0) break;
	    prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
		prox_cad = prox_cad->proximo;
		prox_cad->proximo = NULL;	
	}
	printf("\n");
}

Função pesquisa


void pesquisa() {
	int ru_aux;
	char nome_aux[60];
	t_cad* prox_cad;

	do {
		printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n");
		scanf("%d", &op);
		if (op == 0) break;
		prox_cad = ini_cad;
		switch (op) {
		case 1:
			printf("\n Digite o RU do Aluno:");
			scanf("%d", &ru_aux);
			while (prox_cad != NULL) {
		     if (prox_cad-> ru == ru_aux)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
			  }	
			  prox_cad = prox_cad->proximo;
			}
            break;
		case 2:
			printf("\n Digite o nome do Aluno:");
			scanf("%s", nome_aux);//não precisa de & para string
			while (prox_cad != NULL) {
		     if (strcmp(prox_cad->nome, nome_aux) == 0)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
		      }
		      prox_cad = prox_cad->proximo;
			}
		    break;

		default:
			printf("\n****opcao invalida*****");
			break;
		}
	} while (1);
}

ATENÇÃO: Você tem que liberar a memória alocada manualmente, o C++ NÃO faz automaticamente.

Função liberamem


void liberarmem()
{
    t_cad *prox_cad;
    while (ini_cad != NULL) {
             prox_cad = ini_cad;
             ini_cad  = prox_cad->proximo;
             free(prox_cad);
		  	}
}

Chamar a função liberamem antes do return 0, no main.

Boa Tarde

estou com problema no void cadastro, o codigo esta exatamente como citado, mais esta dando problema no scanf_s por causa da string, quando tendo trocar para gets_s não funciona.

Postado

"Diferentemente scanf e wscanf, scanf_s e wscanf_s exigem que você especificar tamanhos de buffer para alguns parâmetros. Especificar os tamanhos para todos os c, C, s, S, ou conjunto de controles de cadeia de caracteres [] parâmetros. O tamanho do buffer em caracteres é passado como um parâmetro adicional. Ele segue imediatamente o ponteiro para o buffer ou variável. Por exemplo, se você estiver lendo uma cadeia de caracteres, o tamanho do buffer para essa cadeia de caracteres é passado da seguinte maneira:"

https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019

Então, o código seria:

void cadastro() {
	
	int cont;
	t_cad* prox_cad;
	
	if (ini_cad == NULL)
	{
		ini_cad = (t_cad*)malloc(sizeof(t_cad));
		ini_cad ->proximo = NULL;
		if (ini_cad == NULL) exit(1);
	}
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf_s("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf_s("%s", &prox_cad->nome, 45); //nome tem no máximo 45 caracteres
		printf("Digite o email:");
		scanf_s("%s", &prox_cad->email, 60); //email tem no máximo 60 caracteres
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		scanf_s("\n %d", &cont);
		if (cont == 0) break;
	    prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
		prox_cad = prox_cad->proximo;
		prox_cad->proximo = NULL;	
	}
	printf("\n");
}

 

Postado

Boa Noite, deu certo código agora, só não esta dando certo quando tem mais de um nome Ex: Ana Maria. quando coloco dois nome ele ja pula direto pata o sim ou não. e quando pesquiso pelo RU o cadastro fica ana como nome e maria com email...

Postado
9 horas atrás, Flávio Pedroza disse:

Para permitir espaços no scanf:


scanf_s("%[^\n]s", &prox_cad->nome, 45);

 

 

Não vai esse s depois do ] na string de especificação. O especificador %[ já é um especificador de string.

  • 9 meses depois...
Postado

Alguem tem o código funcionando estou precisando!! testei os do post e estou com o seguinte erro:main.c: In function ‘cadastro’: main.c:30:3: warning: implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration] scanf_s("%d", &prox_cad->ru); ^~~~~~~ main.c: In function ‘pesquisa’: main.c:51:16: error: ‘op’ undeclared (first use in this function) scanf("%d", &op); ^~ main.c:51:16: note: each undeclared identifier is reported only once for each function it appears in

Postado
12 horas atrás, Fernando Vieira disse:

Alguem tem o código funcionando estou precisando!! testei os do post e estou com o seguinte erro:main.c: In function ‘cadastro’: main.c:30:3: warning: implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration] scanf_s("%d", &prox_cad->ru); ^~~~~~~ main.c: In function ‘pesquisa’: main.c:51:16: error: ‘op’ undeclared (first use in this function) scanf("%d", &op); ^~ main.c:51:16: note: each undeclared identifier is reported only once for each function it appears in

scanf_s é usado no visual studio. Tire o "_s" se estiver usando outro compilador. E faltou você declarar a variável "op".

Postado

Pode partir disso, está funcionando:

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

// Comandos de variam conforme o sistema operacional
#if defined(_WIN32)
#define limparTela system("cls")
#define esperar system("pause")
#elif defined(__linux__)
#define limparTela system("clear")
#define esperar system("read null")
#endif

// Constantes
#define SEPARADOR_GRANDE "-------------------------------------------------- \n"
#define SEPARADOR_PEQUENO "------------------------- \n"

typedef struct {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

// ----- Essas structs sao necessarias para trabalhar com listas
typedef struct node {
    Aluno aluno;
    struct node *proximo;
} Node;

typedef struct {
    int tamanho;
    Node *primeiro;
} Lista;
// ----- Essas structs sao necessarias para trabalhar com listas

void adicionar(Lista *lista, Aluno aluno);

Aluno cadastrarAluno();

void listar(Lista *lista);

int menu();

int main() {
    Lista *lista = malloc(sizeof(Lista));

    Aluno novoAluno = {};   // Usado na funcao de cadastro

    int opcao = 0;          // Usado para pegar a opcao do menu

    // ----- Criacao de alunos para teste (remover na versao final)
    adicionar(lista, (Aluno) {1, "Aluno 1", "[email protected]"});
    adicionar(lista, (Aluno) {2, "Aluno 2", "[email protected]"});
    adicionar(lista, (Aluno) {3, "Aluno 3", "[email protected]"});
    adicionar(lista, (Aluno) {4, "Aluno 4", "[email protected]"});
    adicionar(lista, (Aluno) {5, "Aluno 5", "[email protected]"});
    // ----- Criacao de alunos para teste (remover na versao final)

    do {
        opcao = menu();

        switch (opcao) {
            case 1:     // Adicionar aluno
                novoAluno = cadastrarAluno();
                adicionar(lista, novoAluno);
                break;
            case 2:     // Listar alunos
                listar(lista);
                break;
            case 0:     // Sair
            default:    // Nunca vai chegar aqui
                break;
        }
    } while (opcao != 0);

    limparTela;
    return EXIT_SUCCESS;
}

/**
 * Adiciona um novo aluno na lista.
 *
 * @param lista Onde sera adicionado.
 * @param aluno Aluno que sera adicionado.
 */
void adicionar(Lista *lista, Aluno aluno) {
    Node *novo = malloc(sizeof(Node));
    novo->aluno = aluno;
    novo->proximo = NULL;

    /*
     * Se a lista estiver vazia, o aluno sera colocado ali, senao colocaremos
     * no final da lista.
     */
    if (lista->tamanho == 0 || lista->primeiro == NULL) {
        lista->primeiro = novo;
    } else {
        Node *temp = lista->primeiro;

        while (temp->proximo != NULL) {
            temp = temp->proximo;
        }

        temp->proximo = novo;
    }

    lista->tamanho += 1;
}

/**
 * Pega os dados para cadastrar um novo aluno.
 *
 * @return Aluno com os dados informados.
 */
Aluno cadastrarAluno() {
    Aluno aluno = {};

    limparTela;
    printf(SEPARADOR_GRANDE);
    printf(">> Cadastro de Aluno \n");
    printf(SEPARADOR_GRANDE);
    printf("Digite o RU: ");
    scanf(" %i%*c", &aluno.ru);

    printf("Digite o Nome: ");
    scanf(" %[^\n]%*c", aluno.nome);

    printf("Digite o Email: ");
    scanf(" %s%*c", aluno.email);

    limparTela;
    return aluno;
}

/**
 * Exibe todos os elementos de uma lista.
 *
 * @param lista Lista com os elementos para serem listados.
 */
void listar(Lista *lista) {
    limparTela;
    printf(SEPARADOR_GRANDE);
    printf(">> Listar \n");
    printf(SEPARADOR_GRANDE);
    printf("Total de items: %i \n", lista->tamanho);

    Node *node = lista->primeiro;

    while (node != NULL) {
        printf("Aluno { RU=%i, Nome='%s', E-mail='%s' } \n", node->aluno.ru, node->aluno.nome, node->aluno.email);
        node = node->proximo;
    }

    printf(SEPARADOR_GRANDE);
    esperar;
    limparTela;
}

/**
 * Exibe o menu principal do programa.
 * E garantido que o valor retornado seja valido.
 *
 * @return Opcao selecionada.
 */
int menu() {
    int opcao = 0;

    do {
        limparTela;
        printf(SEPARADOR_GRANDE);
        printf(">> MENU PRINCIPAL \n");
        printf(SEPARADOR_GRANDE);
        printf("[ 1 ] - Adicionar aluno \n");
        printf("[ 2 ] - Listar alunos \n");
        printf("[ 0 ] - Sair \n");
        printf("> ");
        scanf(" %i%*c", &opcao);
    } while (opcao < 0 || opcao > 2);

    limparTela;
    return opcao;
}

 

Postado
Em 05/04/2020 às 13:08, AdrianoSiqueira disse:

Pode partir disso, está funcionando:


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

// Comandos de variam conforme o sistema operacional
#if defined(_WIN32)
#define limparTela system("cls")
#define esperar system("pause")
#elif defined(__linux__)
#define limparTela system("clear")
#define esperar system("read null")
#endif

// Constantes
#define SEPARADOR_GRANDE "-------------------------------------------------- \n"
#define SEPARADOR_PEQUENO "------------------------- \n"

typedef struct {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

// ----- Essas structs sao necessarias para trabalhar com listas
typedef struct node {
    Aluno aluno;
    struct node *proximo;
} Node;

typedef struct {
    int tamanho;
    Node *primeiro;
} Lista;
// ----- Essas structs sao necessarias para trabalhar com listas

void adicionar(Lista *lista, Aluno aluno);

Aluno cadastrarAluno();

void listar(Lista *lista);

int menu();

int main() {
    Lista *lista = malloc(sizeof(Lista));

    Aluno novoAluno = {};   // Usado na funcao de cadastro

    int opcao = 0;          // Usado para pegar a opcao do menu

    // ----- Criacao de alunos para teste (remover na versao final)
    adicionar(lista, (Aluno) {1, "Aluno 1", "[email protected]"});
    adicionar(lista, (Aluno) {2, "Aluno 2", "[email protected]"});
    adicionar(lista, (Aluno) {3, "Aluno 3", "[email protected]"});
    adicionar(lista, (Aluno) {4, "Aluno 4", "[email protected]"});
    adicionar(lista, (Aluno) {5, "Aluno 5", "[email protected]"});
    // ----- Criacao de alunos para teste (remover na versao final)

    do {
        opcao = menu();

        switch (opcao) {
            case 1:     // Adicionar aluno
                novoAluno = cadastrarAluno();
                adicionar(lista, novoAluno);
                break;
            case 2:     // Listar alunos
                listar(lista);
                break;
            case 0:     // Sair
            default:    // Nunca vai chegar aqui
                break;
        }
    } while (opcao != 0);

    limparTela;
    return EXIT_SUCCESS;
}

/**
 * Adiciona um novo aluno na lista.
 *
 * @param lista Onde sera adicionado.
 * @param aluno Aluno que sera adicionado.
 */
void adicionar(Lista *lista, Aluno aluno) {
    Node *novo = malloc(sizeof(Node));
    novo->aluno = aluno;
    novo->proximo = NULL;

    /*
     * Se a lista estiver vazia, o aluno sera colocado ali, senao colocaremos
     * no final da lista.
     */
    if (lista->tamanho == 0 || lista->primeiro == NULL) {
        lista->primeiro = novo;
    } else {
        Node *temp = lista->primeiro;

        while (temp->proximo != NULL) {
            temp = temp->proximo;
        }

        temp->proximo = novo;
    }

    lista->tamanho += 1;
}

/**
 * Pega os dados para cadastrar um novo aluno.
 *
 * @return Aluno com os dados informados.
 */
Aluno cadastrarAluno() {
    Aluno aluno = {};

    limparTela;
    printf(SEPARADOR_GRANDE);
    printf(">> Cadastro de Aluno \n");
    printf(SEPARADOR_GRANDE);
    printf("Digite o RU: ");
    scanf(" %i%*c", &aluno.ru);

    printf("Digite o Nome: ");
    scanf(" %[^\n]%*c", aluno.nome);

    printf("Digite o Email: ");
    scanf(" %s%*c", aluno.email);

    limparTela;
    return aluno;
}

/**
 * Exibe todos os elementos de uma lista.
 *
 * @param lista Lista com os elementos para serem listados.
 */
void listar(Lista *lista) {
    limparTela;
    printf(SEPARADOR_GRANDE);
    printf(">> Listar \n");
    printf(SEPARADOR_GRANDE);
    printf("Total de items: %i \n", lista->tamanho);

    Node *node = lista->primeiro;

    while (node != NULL) {
        printf("Aluno { RU=%i, Nome='%s', E-mail='%s' } \n", node->aluno.ru, node->aluno.nome, node->aluno.email);
        node = node->proximo;
    }

    printf(SEPARADOR_GRANDE);
    esperar;
    limparTela;
}

/**
 * Exibe o menu principal do programa.
 * E garantido que o valor retornado seja valido.
 *
 * @return Opcao selecionada.
 */
int menu() {
    int opcao = 0;

    do {
        limparTela;
        printf(SEPARADOR_GRANDE);
        printf(">> MENU PRINCIPAL \n");
        printf(SEPARADOR_GRANDE);
        printf("[ 1 ] - Adicionar aluno \n");
        printf("[ 2 ] - Listar alunos \n");
        printf("[ 0 ] - Sair \n");
        printf("> ");
        scanf(" %i%*c", &opcao);
    } while (opcao < 0 || opcao > 2);

    limparTela;
    return opcao;
}

 

 

Esse código me ajudou muito, mas está dando erro de violação de acesso nesse trecho:

void Adicionar(Lista* lista, Aluno aluno)
{
    Node* Novo = (struct Node *)malloc(sizeof(Node));
    Novo->aluno = aluno;
    Novo->prox = NULL;

    if (lista->tamanho == 0 || lista->primeiro == NULL)
    {
        lista->primeiro = Novo;
    }

    else
    {
       Node* temp = lista->primeiro;
       while (temp->prox != NULL) <<<<<<<------ AQUI DA O ERRO DE VIOLAÇÃO, EM TEMP
       {
         temp = temp->prox;
       }

        temp->prox = Novo;
    }

    lista->tamanho += 1;
}

Postado
void adicionar(Lista *lista, Aluno aluno)
{
    Node *novo = malloc(sizeof(Node));
    novo->aluno = aluno;
    novo->proximo = NULL;

    /*
     * Se a lista estiver vazia, o aluno sera colocado ali, senao colocaremos
     * no final da lista.
     */
    if (lista->tamanho == 0 || lista->primeiro == NULL) {
        lista->primeiro = novo;
    } else {
        Node *temp = lista->primeiro;

        while (temp->proximo != NULL) {
            temp = temp->proximo;
        }

        temp->proximo = novo;
    }

    lista->tamanho += 1;
}

Pode postar o código como está usando agora e não o código que inspirou o seu? Assim fica mais fácil de entender...

 

Não posso deixar de comentar esse comentário

    /*
     * Se a lista estiver vazia, o aluno sera colocado ali, senao colocaremos
     * no final da lista.
     */ 

Se a lista estiver vazia, o aluno será colocado "ali". Sim, ali no final da lista. Numa fila de um você é ao mesmo tempo o primeiro e o último :) 

 

Mas não vi no programa a parte onde define os valores inicias de sua lista...

 

Não acha que devia?... Algo assim


    Lista* lista = (Lista*) malloc(sizeof(Lista));
    lista->primeiro = NULL;
    lista->tamanho = 0;

por exemplo...
 

adicionado 4 minutos depois

Se insere só no final porque não coloca um ponteiro para o final lá na estrutura? Fica bem mais simples.

 

Em geral as listas tem 3 funções para inserir:

  1. insere no início
  2. insere no final
  3. insere em alguma ordem

Outro palpite: nunca passe a estrutura inteira como parâmetro e sim um ponteiro para ela

Postado

@arfneto Permita-me comentar seu comentário sobre meu comentário, eu escrevi as pressas, nem prestei atenção nisso 😂.

 

11 horas atrás, arfneto disse:

Mas não vi no programa a parte onde define os valores inicias de sua lista...

Primeira linha do main, eu não declarei explicitamente o elemento primeiro e tamanho, porque o compilador já fez para mim. Não sei se é o comportamento padrão dos demais compiladores....

Postado
1 hora atrás, AdrianoSiqueira disse:

Primeira linha do main, eu não declarei explicitamente o elemento primeiro e tamanho, porque o compilador já fez para mim. Não sei se é o comportamento padrão dos demais compiladores....

 

Nunca conte com isso. Inicialize todos os valores. 

 

O que acontece hoje em dia é que quando um programa inicia e aloca memória o sistema entrega áreas de memória zeradas. Isso acontece por segurança, para evitar a possível injeção de código através de memória alocada --- hacking. Mas depois conforme seu programa roda e vai alocando memória de novo, e liberando, páginas de memória que foram liberadas por seu programa mas ainda não foram liberadas para o sistema, essas áreas podem ser reutilizadas para seu programa e aí não terá garantia do que tem lá. 

 

Isso quer dizer que seu programa pode rodar ok por um tempo e depois dar um crash sem razão aparente.

 

Uma outra coisa para considerar: debug builds e release builds são diferentes. Em muitos casos quando você gera um programa com informações de depuração muitas variáveis são zeradas e mesmo áreas alocadas por malloc() são zeradas como parte da geração do código para debug. Depois quando você gera o código de produção sem essas coisas tudo muda. O código é muito menor, o programa roda muito mais rápido. E às vezes não roda mais! Em muitos casos porque o fato de durante o desenvolvimento só se ter usado o modo de debug, que é o padrão para os estudantes porque é o padrão dos IDE. escondeu esse tipo de problema com inicialização de variáveis... Como no caso dos estudantes a vida do programa termina quando ele fica pronto, ao contrário do mundo normal, os estudantes muitas vezes levam anos para descobrir isso. Quando não forem mais estudantes ;) 
 

image.png.b95504f4767283d617281de03c0a5a19.png


Zerar áreas de memória por padrão não é uma boa ideia. É uma ideia besta em muitos casos. Muitos mesmo. Esperto é quando você tem controle e inicializa se precisa. Estudantes precisam. C e C++ são linguagens de alta performance, usadas em contextos muito diferentes. Em aplicativos de alta performance, tipo um aplicativo de comunicação, você aloca buffers para receber mensagens, às vezes centenas ou milhares delas por segundo. E os buffers vão ser completamente preenchidos pelos dados que vão chegando. Aos milhares. Quem vai pagar pelo tempo perdido zerando a área ocupada por cada buffer alocado, sendo que ele vai ser totalmente preenchido nos próximos milésimos de segundo? Isso vai fazer enorme diferença nos tempos do programa e vai custar dinheiro.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!