Problema em estrutura com String [RESOLVIDO]

1. Problema em estrutura com String [RESOLVIDO]

Wilson
wilsonppjr

(usa Ubuntu)

Enviado em 10/09/2010 - 20:22h

Esse é um código incicial para um cadastro de alunos, estamos com problemas na visualização dos dados que passam pela função InsereInicio, e InsereDepois, onde os dados que são strings do tipo char depois de serem inseridos no programa, não conseguem ser visualizados na função PercorreLista, se alguem puder ajudar, grato desde já, abraço.




/* Wilson Pedroso email: wilsonppjr@gmail.com
Universidade de Franca */





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

struct aluno //Declaração da estrutura aluno
{
int codigo;
char nome[50], endereco[50], curso[50], periodo[50]; //Atributos da estrutura aluno
struct aluno *proximo;
};

struct aluno *inicio; //Primeiro Matricula
////////////////////////////////////////////////////////////////////////////////


//SubRotinas Utilizadas
void insereInicio(int codigo, char nome[50], char endereco, char curso, char periodo);
void removeInicio();
void insereDepois(struct aluno *a, int co, char n, char e, char c, char p);
void remove_depois(struct aluno *a);
void percorreLista();
void insereOrdenado(int codigo,char nome,char endereco,char curso,char periodo);
void remove_ordenado(int codigo);
void cadastra();
void escreveArquivo(int codigo, char nome, char endereco, char curso, char periodo);

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

main(){
struct aluno *a; //Declaração da Estrutura Aluno
int x = 1;
int codigo = 0;
char nome[50], endereco[50], curso[50], periodo[50]; //Declaração dos atributos

a = (struct aluno*)malloc(sizeof(struct aluno)); //Alocando espaço na memória para a estrutura Aluno

while(x != 6)
{
printf("\n*************** Matricula de Aluno ***************\n\n\n");
//Menu
printf("Para cadastrar um novo aluno Ordenadamente.......Digite 1:\n\n");
printf("Para imprimir a lista de alunos..................Digite 2:\n\n");
printf("Para remover um Aluno............................Digite 3:\n\n");
printf("Para sair........................................Digite 4:\n\n");

printf("Escolha: ");
scanf("%d", &x);
system("cls"); //Limpa a Tela

if(x == 1) //Insere um novo cadastro ordenadamente
cadastra();


if(x == 2)//Imprime a lista de alunos
percorreLista();


if(x == 3)// Remove Aluno Ordenadamente
{
printf("Digite o codigo: ");
scanf("%d", &codigo);
remove_ordenado(codigo);
}

if(x == 4)// Sair
{
system("cls"); //Limpa a Tela
printf("\n\nPressione qualquer tecla para sair....");
getch();

}
if(x != 1 && x != 2 && x != 3 && x != 4)
{
system("cls"); //Limpa a Tela
printf("\n\nValor Invalido!\n\nDigite Novamente\n\n");
}
}
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


void insereInicio(int codigo, char nome, char endereco, char curso, char periodo){// Insere um novo Aluno no ínicio da Fila, Passando todos atributos por referência
struct aluno *aux;
aux =(struct aluno*)malloc(sizeof(struct aluno));
fflush(stdin);
aux->codigo = codigo;
fflush(stdin);
aux->nome = nome;
fflush(stdin);
aux->endereco = endereco;
fflush(stdin);
aux->curso = curso;
fflush(stdin);
aux->periodo = periodo;
fflush(stdin);
aux->proximo = inicio;
inicio = aux;
}

void removeInicio(){ // Remove o primeiro registro
struct aluno *aux;
aux = inicio;
inicio = inicio->proximo;
free(aux);
}


////////////////////////////////////////////////////////////////////////////////

void insereDepois(struct aluno *a, int codigo, char nome, char endereco, char curso, char periodo){ //Insere uma matrícula após outra matrícula específica
struct aluno *aux,c;
aux =(struct aluno*)malloc(sizeof(struct aluno));
fflush(stdin);
aux->codigo = codigo;
fflush(stdin);
aux->nome = nome;
fflush(stdin);
aux->endereco = endereco;
fflush(stdin);
aux->curso = curso;
fflush(stdin);
aux->periodo = periodo;
fflush(stdin);
aux->proximo = a->proximo;
a->proximo = aux;
}

void remove_depois(struct aluno *a){ // Remove uma matrícula após outra matrícula específica
struct aluno *aux;
aux = a->proximo;
a->proximo = aux->proximo;
free(aux);
}

////////////////////////////////////////////////////////////////////////////////
void percorreLista() //Faz a listagem de todas matriculas da Estrutura, e as imprimem
{
struct aluno *p;
p = inicio;
printf("\n*************** Alunos Matriculados ***************\n\n\n");
while(p != NULL)
{
fflush(stdin);
printf("Codigo = %d \n\n", p->codigo);
fflush(stdin);
printf("Nome = %s\n\n" ,p->nome);
fflush(stdin);
printf("Endereco = %s \n\n" , p->endereco);
fflush(stdin);
printf("Curso = %s \n\n", p->curso);
fflush(stdin);
printf("Periodo = %s \n\n", p->periodo);
fflush(stdin);
}
getch();
}

////////////////////////////////////////////////////////////////////////////////

void insereOrdenado(int codigo, char nome, char endereco, char curso, char periodo)
/*Insere um valor na lista de alunos de acordo com seu código*/
{
struct aluno *p, *q;
p = inicio;
if((p == NULL)||(codigo < p->codigo))
{
insereInicio(codigo, nome[50], endereco, curso, periodo);
return;
}

q = p;
while((q != NULL) && (q->codigo < codigo))
{
p = q;
q = p->proximo;
}
if((q == NULL) || (q->codigo > codigo))
insereDepois(p,codigo, nome, endereco, curso, periodo);
else
printf("\nElemento já Existe");
}



void remove_ordenado(int codigo)
{
struct aluno *p, *q;
p = inicio;
if (p == NULL)
{
printf("\nLista Vazia!");
getch();
return;
}
if (codigo == p->codigo)
{
removeInicio();
return;
}
q = p;
while(q != NULL && q->codigo < codigo)
{
p = q;
q = p->proximo;
}
if (q!=NULL && q->codigo == codigo)
remove_depois(p);
else
{
printf("\nElemento nao Cadastrado!");

}
}
////////////////////////////////////////////////////////////////////////////////
void escreveArquivo(int co, char n, char e, char c, char pe)
{
FILE *f1;
struct aluno *p;
if((f1 = fopen("C:\\Aluno.txt","w")) == NULL)
{
printf("Arquivo nao pode ser aberto.");
getch();
}
fprintf(f1, "%d\n" ,co);
fprintf(f1, "%s\n" ,n);
fprintf(f1, "%s\n" ,e);
fprintf(f1, "%s\n" ,c);
fprintf(f1, "%s\n" ,pe);
printf("Cadastrado com Sucesso");
fclose(f1);
getch();
}
////////////////////////////////////////////////////////////////////////////////

void cadastra(){
int codigo;
char nome[50], endereco[50], curso[50], periodo[50];
printf("\n*************** Matricula de Aluno ***************\n\n\n");
fflush(stdin);
printf("Digite o codigo: ");
scanf("%d", &codigo);
fflush(stdin);
printf("Digite o Nome: ");
gets(nome);
fflush(stdin);
printf("Digite o Curso: ");
gets(curso);
fflush(stdin);
printf("Digite o Endereco: ");
gets(endereco);
printf("Digite o Periodo: ");
gets(periodo);
fflush(stdin);
system("cls"); //Limpa a Tela
insereOrdenado(codigo, nome[50],endereco[50], curso[50], periodo[50]);
//escreveArquivo(codigo, nome[50], endereco[50], curso[50], periodo[50]);
}







  


2. MELHOR RESPOSTA

Ezequias Rocha
Ezequias Rocha

(usa Ubuntu)

Enviado em 13/09/2010 - 08:44h

Bom, como ponto de partida, tente definir a estrutura "aluno" de uma maneira diferente, crie uma estrutura diferente, com o ponteiro para a estrutura "aluno" embutida, e.g.

struct aluno //Declaração da estrutura aluno
{
int codigo;
char nome[50], endereco[50], curso[50], periodo[50]; //Atributos da estrutura aluno
/* foi retirado "struct aluno *proximo;" */
};

struct proxaluno
{
struct aluno *atual;
struct aluno *proximo;
};

Tudo leva a crer que o problema reside na leitura e/ou escrita de dados na estrutura "aluno". Portanto, ao invés de um única, crie mais (3 ou quatro) estruturas alinhadas (nested), de modo que a maneira de acesso seja mais clara, evitando construções difíceis de depurar. Assim, tanto a atribuição quanto a passagem de parâmetros serão triviais, sem galhos no entendimento.


Embraces!

3. Re: Problema em estrutura com String [RESOLVIDO]

Danillo Souza
danltmz

(usa Ubuntu)

Enviado em 11/09/2010 - 03:07h

1 - Ao invés de "void insereInicio(int codigo, char nome, char endereco, char curso, char periodo)" faça simplismente "void insereInicio(struct aluno *aln)" e trate o resto dentro da função. É muito mais organizado e menos propenso a erro dessa forma.

2 - Não se atribui strings utilizando "=", utilize strncpy(). Ex:

...
strncpy(nome, "Danillo", 7); // Copia 7 caracteres de "Danillo" para o vetor de caracteres 'nome'.
...

Mesmo tendo que usar 1 parâmetro a mais, sempre use 'strncpy()' ao invés de 'strcpy()', para evitar falhas de memória.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts