Ir ao conteúdo
  • Cadastre-se

Dúvida - Lista com Arquivo


E.M.I.C.I.D.A

Posts recomendados

Boa tarde pessoal !

Estou com uma dúvida, ao tentar pegar o nome do Aluno, da algum BUG que pula a opção para ele colocar o nome e já vai para a opção de colocar a Turma em que ele estuda.

E na hora da impressão, ele imprime 'lixo'.

Bom, inicialmente o problema é esse pessoal. Há algumas coisas a mais no MENU, mas as funções eu ainda colocarei, isso é o de menos.

Poderiam me ajudar por gentileza ?

Obrigado.

Segue programa:


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

struct cadastro
{

long int ra;
char turma[4];
char nome[30];
char end[50];
char cidade[15];
char estado[2];
long int cep;

struct cadastro *prox;
};

typedef struct cadastro lista;

lista *inicializa (void)
{
return NULL;
}

lista *insere (lista *l, int i, char name[30], char turma[4], char endereco[50], char cidade[15], char estado[2], int cep)
{
lista *p;
//char name[30],turma[4],endereco[50],cidade[15],estado[2];
//int cep;



for (p=l;p!=NULL;p=p->prox){

if (p->ra == i){
printf ("RA ja cadastrado!\n");
system("pause");
return l;
}
}
if (p == NULL){
lista *novo = (lista*) malloc (sizeof (lista));
novo -> ra = i;
novo -> nome[30] = name[30];
novo -> turma[4] = turma[4];
novo -> end[50] = endereco[50];
novo -> cidade[15] = cidade[15];
novo -> estado[2] = estado[2];
novo -> cep = cep;
novo -> prox = l;
return novo;
}
}

void imprime (lista*l)
{
lista *p;

if (l == NULL){
printf("Nao existe nehum RA cadastrado !!\n\n\n");
}
for (p=l;p!=NULL;p=p->prox){
printf ("RA = %d\nNome: %s\nTurma: %s\nEndereco: %s\nCidade: %s\nEstado: %s\nCep: %d\n\n",p->ra,p->nome,p->turma,p->end,p->cidade,p->estado,p->cep);
}
}

lista *consulta (lista *l, int v)
{
lista *p;
for (p=l;p!=NULL;p=p->prox)
{
if (p->ra == v){
printf ("RA = %d\nNome: %s\nTurma: %s\nEndereco: %s\nCidade: %s\nEstado: %s\nCep: %d\n\n",p->ra,p->nome,p->turma,p->end,p->cidade,p->estado,p->cep);
return p;
}
}
if (p == NULL){
printf ("RA Nao Cadastrado!!\n\n");
}
}

lista *excluir_lista (lista *l, int v)
{
lista *ant = NULL;
lista *p = l;


while (p!= NULL && p->ra != v)
{
ant = p;
p = p->prox;
}
if (p == NULL){
printf ("RA Nao Cadastrado ! Impossivel Exclui-lo\n\n");
return l;
}
if (ant == NULL)
{
l = p->prox;
free(p);
printf ("Aluno %d Excluido !\n\n",v);
return l;
}
else
{
ant->prox = p->prox;
free(p);
printf ("Aluno %d Excluido !\n\n",v);
}
return l;
}

lista *libera (lista *l){
lista *p;

while (l!= NULL)
{
p=l->prox;
free (l);
l=p;
}
return l=0;
}


int main (void){

lista *l=0;
int opcao,j,num,cep;
char y_n,nome[30],turma[4],endereco[50],cidade[15],estado[2];


while (opcao != 8){
system("cls");
printf ("================================================================================\n");
printf ("=========================== B A S E D E D A D O S ============================\n");
printf ("================================================================================\n\n");

printf ("Selecione a Opcao Desejada:\n\n");

printf ("1- Cria Lista\n\n2- Insere RA\n\n3- Insere Nota\n\n4- Consulta RA\n\n5- Imprime Lista\n\n6- Excluir Lista\n\n7- Liberar Lista\n\n8-Sair\n\n\nOpcao: ");
scanf ("%d",&opcao);



switch (opcao){

case 1:
system ("cls");
if (l!=NULL){
printf("Lista Ja Existente !\n\n");
system("pause");
system("cls");
}
else{
l=inicializa ();
printf ("Lista Criada Com Sucesso !\n\n");
system ("pause");
system("cls");
}break;

case 2:
system("cls");
printf ("Insira o RA:\n");
scanf ("%d",&j);
puts ("Entre com o Nome: ");
gets (nome);
puts ("\n\nEntre com a Turma: ");
gets (turma);
puts ("\n\nEntre com o Endereco: ");
gets (endereco);
puts ("\n\nEntre com a Cidade: ");
gets (cidade);
puts ("\n\nEntre com o Estado: ");
gets (estado);
printf ("\n\nEntre com o CEP: ");
scanf ("%d",&cep);
l = insere (l,j,nome,turma,endereco,cidade,estado,cep);
system("cls");break;

/*case 3:
system ("cls");
printf ("Inserir Para Todos Alunos ? (Y/N)");
scanf ("%s",&y_n);
while (y_n != 'y' && y_n!= 'Y' && y_n!= 'n' && y_n!= 'N'){
system("cls");
printf ("Inserir Para Todos Alunos ? (Y/N)");
scanf ("%s",&y_n);
}
if (y_n == 'Y' || y_n == 'y'){
system("cls");
insere_all (l);
system("cls");
}
else if (y_n == 'N' || y_n== 'n'){
system("cls");
printf ("Digite o RA a Ser Creditado as Notas:\n");
scanf ("%d",&num);
insere_one (l,num);
}

system ("pause");break;
*/
case 4:
system ("cls");
printf ("Digite o RA a ser consultado:\n");
scanf ("%d",&j);
consulta (l,j);
system ("pause");
system ("cls");break;

case 5:
system("cls");
imprime (l);
system("pause");
system("cls");break;

case 6:
system("cls");
printf ("Qual aluno deseja Exluir ?\n");
scanf ("%d",&j);
l=excluir_lista(l,j);
system("pause");break;

case 7:
system ("cls");
if (l == 0 && l != NULL){
printf("Nao existe uma lista para Liberar\n\n");
system("pause");
}

else if (l == NULL){
printf ("A Lista %c Nula, Nao H%c o Que Liberar\n\n",144,160);
system("pause");
system ("cls");
}
else{
l=libera (l);
printf("Lista liberada !\n\n");
system ("pause");
system ("cls");
}break;

}
}
system("cls");
printf("Programa Encerrado !!\n\n\n");
system("pause");

getchar();
return 0;
}
#include <stdio.h>

Link para o comentário
Compartilhar em outros sites

Mas colega, o fgets é para arquivo. Beleza, usarei quando for colocá-lo no arquivo.

Porém, se eu quiser somente armazená-lo na memória, usando o próprio GETS, porque não vai ?

1- fgets funciona para teclado também... E muito bem, diga-se de passagem...

2- Seu problema é atribuição de string...

2.1- Strings em C são arrays de caractere, logo o nome da string é o ponteiro do primeiro elemento, o que já invalida atribuições do tipo:

string1=string2; /* ERRADO! */

A menos, é claro, que string1 e string2 sejam só ponteiros para caractere e você tenha feito o malloc de string2...

2.2- QUALQUER VETOR tem seus elementos acessados por um indexador inteiro entre colchetes [], logo, o que você tentou fazer não só é uma cópia de UM caracter em UMA posição específica, como você está acessando uma posição NÃO ALOCADA para aquele vetor:

Seu código:

    [B]novo -> nome[30] = name[30];
novo -> turma[4] = turma[4];
novo -> end[50] = endereco[50];
novo -> cidade[15] = cidade[15];
novo -> estado[2] = estado[2];[/B]

Porque uma posição não alocada? Ué, basta olhar como você declarou cada vetor:

struct cadastro
{
long int ra;
[B] char turma[4];
char nome[30];
char end[50];
char cidade[15];
char estado[2];[/B]
long int cep;
struct cadastro *prox;
};

Se TODO vetor começa em 0, seus vetores chegam no máx a 3, 29, 49, 14 e 1, respectivamente.

Como sua tentativa de cópia foi para 4, 30, 50, 15 e 2, você estourou o limite em todas elas...

Como resolver?

[B]#include <string.h>
...
strcpy(novo->nome, name);
strcpy(novo->turma, turma);
strcpy(novo->end,endereco);
strcpy(novo->cidade,cidade);
strcpy(novo->estado,estado);[/B]

-

Link para o comentário
Compartilhar em outros sites

Shara Moustache, boa tarde !

Bom, cara, obrigado pela dica.

Mas assim, primeiramente eu queria gravar estas informações na memória e pra isso não consigo usar o fgets, mas sim o gets.

Fiz o que me disse, copiei as informações das variáveis para a estrutra. Beleza ! ;]

Mas mesmo assim, a variável 'nome' continua sendo pulada quando eu executo o programa. Eu gostaria de saber o porque fica pulando a variável 'nome' (não consigo colocar nenhuma informação na variável).

Ah e tem um detalhe interessante que eu percebi, eu cadastro a CIDADE do sujeito, porém ele não mostra na tela a cidade cadastrada. Fiz alguns testes e pude perceber que na hora do cadastro, no campo CIDADE, (que fora declarada com 15 posições), eu dou "15" espaços e na décima sexta posição eu escrevo "Sao Paulo" e sabe o que acontece ???

Simplesmente o campo anterior (endereço) é substituído pela cidade que eu escrevi (por exemplo Endereço: 'Sao Paulo').

Porque está acontecendo essas coisas bisonhas ? ;/

Estou tentando aqui, qualquer coisa se eu conseguir antes da resposta aqui, eu posto o resultado.

Obrigadooo ! ;]

Link para o comentário
Compartilhar em outros sites

(...)

Mas assim, primeiramente eu queria gravar estas informações na memória e pra isso não consigo usar o fgets, mas sim o gets.

Cara tem duas pessoas dizendo que fgets funciona e você ainda não procura se informar???

Basta dar stdin como o "arquivo" para fgets, funciona muito bem.

O único problema é que, se a string for menor que o tamanho máximo, o \n é incluído na string, mas isso se resolve rápido.

Mas mesmo assim, a variável 'nome' continua sendo pulada quando eu executo o programa. Eu gostaria de saber o porque fica pulando a variável 'nome' (não consigo colocar nenhuma informação na variável).

O problema é o que está em negrito:

printf ("Insira o RA:\n");
[B]scanf ("%d",&j);[/B]
puts ("Entre com o Nome: ");
gets (nome);

Scanf não retira o \n do buffer de entrada.

Então quando gets é chamado ele já lê o que tem no buffer, pois teoricamente o usuario já digitou a informação visto que existe um \n no buffer...

Ah e tem um detalhe interessante que eu percebi, eu cadastro a CIDADE do sujeito, porém ele não mostra na tela a cidade cadastrada. Fiz alguns testes e pude perceber que na hora do cadastro, no campo CIDADE, (que fora declarada com 15 posições), eu dou "15" espaços e na décima sexta posição eu escrevo "Sao Paulo" e sabe o que acontece ???

Simplesmente o campo anterior (endereço) é substituído pela cidade que eu escrevi (por exemplo Endereço: 'Sao Paulo').

Porque está acontecendo essas coisas bisonhas ? ;/

Pelo simples fato de você estar acessando os bytes da memória correspondentes ao campo endereco...

Quando você aperta enter, scanf joga cada caracter em um byte da memória começando pelo primeiro byte de "cidade" até achar um \n...

Se você digita mais de 15, obviamente ele começa a escrever nos trechos seguintes, no caso coincidiu de ser o trecho correspondente ao endereco...

Link para o comentário
Compartilhar em outros sites

Cara, consegui resolver esses problemas aí. Obrigado !!

Mas estou com um problema de impressão, que é o seguinte :

Coloco todas as informações que necessito para o cadastro, porém, o campo NOME e CIDADE não aparecem na impressão e nem no arquivo *.txt criado.

É como se eu não tivesse colocado nada nas variáveis Nome/Campo.

Já alterei diversas coisas nas variáveis e o jeito do apontamento da Struct, mas até agora eu não consegui.

O que pode ser ?

Segue o programa alterado:


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

struct cadastro
{

long int ra;
char turma[4];
char nome[30];
char end[50];
char cidade[15];
char estado[2];
long int cep;

struct cadastro *prox;
};

typedef struct cadastro lista;

lista *inicializa (void)
{
return NULL;
}

lista *insere (lista *l, int i)
{
lista *p;
char nome[30],turma[4],endereco[50],cidade[15],estado[2];
int cep;

for (p=l;p!=NULL;p=p->prox){

if (p->ra == i){
printf ("RA ja cadastrado!\n");
system("pause");
return l;
}
}

puts ("\nEntre com o Nome: ");
fgets (nome,31,stdin);
fflush(stdin);
puts ("\n\nEntre com a Turma: ");
fgets (turma,5,stdin);
fflush(stdin);
puts ("\n\nEntre com o Endereco: ");
gets (endereco);
fflush(stdin);
puts ("\n\nEntre com a Cidade: ");
fgets (cidade,16,stdin);
fflush(stdin);
puts ("\n\nEntre com o Estado: ");
fgets (estado,3,stdin);
fflush(stdin);
printf ("\n\nEntre com o CEP: ");
scanf ("%d",&cep);

if (p == NULL){
lista *novo = (lista*) malloc (sizeof (lista));
novo -> ra = i;
strcpy (novo -> nome,nome);
strcpy (novo -> turma,turma);
strcpy (novo -> end,endereco);
strcpy (novo -> cidade,cidade);
strcpy (novo -> estado,estado);
novo -> cep = cep;
novo -> prox = l;
return novo;
}
}

void imprime (lista*l)
{
lista *p;

if (l == NULL){
printf("Nao existe nehum RA cadastrado !!\n\n\n");
}
for (p=l;p!=NULL;p=p->prox){
printf ("RA = %d\nNome: %s\nTurma: %s\nEndereco: %s\nCidade: %s\nEstado: %s\nCep: %d\n\n",p->ra,p->nome,p->turma,p->end,p->cidade,p->estado,p->cep);
}
}

lista *consulta (lista *l, int v)
{
lista *p;
for (p=l;p!=NULL;p=p->prox)
{
if (p->ra == v){
printf ("RA = %d\nNome: %s\nTurma: %s\nEndereco: %s\nCidade: %s\nEstado: %s\nCep: %d\n\n",p->ra,p->nome,p->turma,p->end,p->cidade,p->estado,p->cep);
return p;
}
}
if (p == NULL){
printf ("RA Nao Cadastrado!!\n\n");
}
}

lista *excluir_lista (lista *l, int v)
{
lista *ant = NULL;
lista *p = l;


while (p!= NULL && p->ra != v)
{
ant = p;
p = p->prox;
}
if (p == NULL){
printf ("RA Nao Cadastrado ! Impossivel Exclui-lo\n\n");
return l;
}
if (ant == NULL)
{
l = p->prox;
free(p);
printf ("Aluno %d Excluido !\n\n",v);
return l;
}
else
{
ant->prox = p->prox;
free(p);
printf ("Aluno %d Excluido !\n\n",v);
}
return l;
}

lista *libera (lista *l){
lista *p;

while (l!= NULL)
{
p=l->prox;
free (l);
l=p;
}
return l=0;
}

void relatorio (lista *l){

FILE *arquivo;
char *nome = "relatorio.txt";
lista *p;

arquivo = fopen(nome,"w+b");

for (p=l;p!=NULL;p=p->prox){
fprintf (arquivo,"RA = %9d| Turma: %4s|\r\nNome: %30s|\r\nEndereco: %50s|\r\nCidade: %15s| Estado: %2s|\r\nCep: %9d|\r\n\r\n",p->ra,p->turma,p->nome,p->end,p->cidade,p->estado,p->cep);
}
fclose(arquivo);
}

int main (void){

lista *l=0;
int opcao,j,num;
char y_n;


while (opcao != 8){
system("cls");
printf ("================================================================================\n");
printf ("=========================== B A S E D E D A D O S ============================\n");
printf ("================================================================================\n\n");

printf ("Selecione a Opcao Desejada:\n\n");

printf ("1- Cria Lista\n\n2- Insere RA\n\n3- Consulta RA\n\n4- Imprime Relatorio\n\n5- Imprime Lista\n\n6- Excluir Lista\n\n7- Liberar Lista\n\n8-Sair\n\n\nOpcao: ");
scanf ("%d",&opcao);



switch (opcao){

case 1:
system ("cls");
if (l!=NULL){
printf("Lista Ja Existente !\n\n");
system("pause");
system("cls");
}
else{
l=inicializa ();
printf ("Lista Criada Com Sucesso !\n\n");
system ("pause");
system("cls");
}break;

case 2:
system("cls");
printf ("Insira o RA:\n");
scanf ("%d",&j);
fflush(stdin);
l = insere (l,j);
system("cls");break;

case 3:
system ("cls");
printf ("Digite o RA a ser consultado:\n");
scanf ("%d",&j);
consulta (l,j);
system ("pause");
system ("cls");break;

case 4:
system("cls");
relatorio(l);
printf ("Relatorio Impresso !\n\n");
system ("pause");
system ("cls");break;

case 5:
system("cls");
imprime (l);
system("pause");
system("cls");break;

case 6:
system("cls");
printf ("Qual aluno deseja Exluir ?\n");
scanf ("%d",&j);
l=excluir_lista(l,j);
system("pause");break;

case 7:
system ("cls");
if (l == 0 && l != NULL){
printf("Nao existe uma lista para Liberar\n\n");
system("pause");
}

else if (l == NULL){
printf ("A Lista %c Nula, Nao H%c o Que Liberar\n\n",144,160);
system("pause");
system ("cls");
}
else{
l=libera (l);
printf("Lista liberada !\n\n");
system ("pause");
system ("cls");
}break;

}
}
system("cls");
printf("Programa Encerrado !!\n\n\n");
system("pause");

getchar();
return 0;
}
#include <stdio.h>

Obrigado.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!