Sábado 14 de Diciembre de 2024, 22:49
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con estructuras
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problema con estructuras (Leído 1612 veces)
Leber
Miembro activo
Mensajes: 65
Problema con estructuras
«
en:
Jueves 16 de Octubre de 2008, 00:53 »
0
Buenas, tengo un problema:
Ayer hice una pequeña agenda de notas para practicar un poco, un fichero binario con estructuras, todo funciona bien menos al mostrarme los datos, que hay algunas notas que se repiten( esto no se si es problema de al mostrar datos, o al escribirlos en el fichero)
Por ejemplo:
Yo le inserto en Catalan la nota 1 y hago un listado de notas y me muestra:
Código: Text
Notas [Catalan]:
> 1
Notas [Castellano]:
Notas [Matematicas]:
Notas [Ingles]:
Luego inserto la nota 5 en matematicas y al hacer el listado, sorpresa:
Código: Text
Notas [Catalan]:
> 1
> 1
Notas [Castellano]:
Notas [Matematicas]:
> 5
Notas [Ingles]:
Como ven, salen 2 "1", uno lo puse yo, pero y el otro? He revisado una y otra vez el codigo y no encuentro nada que pueda ser:
Las estructuras son estas:
Código: Text
typedef struct
{
int nota_catalan;
int nota_castellano;
int nota_mates;
int nota_ingles;
}MATERIAS;
typedef struct __notas
{
int trimestre;
MATERIAS m;
struct __notas *sig;
}NOTAS;
Las funciones de escribir, leer son estas:
Escribe en un fichero la estructura con las notas
Código: Text
int
carga_fichero(int nota, int materia, int trimestre)
{
int df;
nodo p;
if(( df = open("notas.dat",O_WRONLY | O_APPEND | O_CREAT,0600)) == -1)
{
perror("notas.dat");
return -1;
}
p=inicializa(p);
if(!p)
return -1;
if( materia == 1)
p->m.nota_catalan=nota;
else if( materia == 2 )
p->m.nota_castellano=nota;
else if( materia == 3)
p->m.nota_mates=nota;
else if( materia == 4)
p->m.nota_ingles=nota;
else
{
fprintf(stderr,"Materia [%d] desconocidan",materia);
return -1;
}
p->trimestre=trimestre;
write(df,p,sizeof(NOTAS));
free(p);
close(df);
return 0;
}
Lee fichero y devuelve estructura:
Código: Text
lista
carga_notas(void)
{
nodo p;
int d_n;
int r_bytes;
lista l=NULL;
int indice=0;
if(( d_n = open("notas.dat",O_RDONLY)) == -1)
{
perror("2datos.dat");
return NULL;
}
p=inicializa(p);
if(!p)
return NULL;
while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
{
p->sig=l;
l=p;
p=inicializa(p);
}
free(p);
close(d_n);
return l;
}
Muestra notas
Código: Text
void mostrar_total_notas(lista l, unsigned int assig)
{
nodo p;
p=l;
while(p)
{
if(assig == 0)
{
if ( p->m.nota_catalan != 0)
{
printf("NOTAS CATALANn");
printf("> %dn",p->m.nota_catalan);
}
}
else if(assig == 1)
{
if(p->m.nota_castellano != 0)
printf("> %dn",p->m.nota_castellano);
}
else if(assig == 2)
{
if(p->m.nota_mates != 0)
printf("> %dn",p->m.nota_mates);
}
else
{
if(p->m.nota_ingles != 0)
printf("> %dn",p->m.nota_ingles);
}
p=p->sig;
}
}
Yo no le veo nada extraño, y de hecho no se porque me lo hace..., a ver si alguien puede arrojar un poco de luz, porque estoy algo preucupado.
Muchas gracias
Tweet
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con estructuras
«
Respuesta #1 en:
Jueves 16 de Octubre de 2008, 09:54 »
0
No has especificado el tipo de dato
list
a. Parece un puntero, por favor postea su especificación, un saludo.
Fr33k K0mpu73r
Leber
Miembro activo
Mensajes: 65
Re: Problema con estructuras
«
Respuesta #2 en:
Jueves 16 de Octubre de 2008, 14:52 »
0
Primero de todo gracias por responder, y gastar un poco de tiempo, aqui van las declaraciones y luego la aplicacion:
Decir que, solo se repite la primera asignatura que escribo una nota, es decir, si arranco el programa y le inserto un 4 a matematicas, me mostrara un 4, como si el programa escribiese un 4 siempre en la nota, las demas asignaturas me las muestro bien.
notas.h
Código: Text
#if !defined(_NOTAS_H)
#define _NOTAS_H
typedef struct
{
int nota_catalan;
int nota_castellano;
int nota_mates;
int nota_ingles;
}MATERIAS;
typedef struct __notas
{
int trimestre;
MATERIAS m;
struct __notas *sig;
}NOTAS;
typedef NOTAS *nodo;
typedef NOTAS *lista;
int menu();
int leer_notas(lista l);
int escribir_nota(lista l);
int escribir_trabajo(lista l);
int total_tp(lista l);
int fin(lista l);
void mostrar_notas(lista l, int tipox);
int getint();
int mostrar_tipos();
int carga_fichero(int nota, int materia, int trimestre);
void carga_notas(lista l);
void _liberar_mem_struct(lista l);
int(*pfunc[])(lista l)=
{
leer_notas,
escribir_nota,
escribir_trabajo,
total_tp,
fin,
};
#endif
Apli:
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "notas.h"
#include <fcntl.h>
#define BUFSIZE 1024
void mostrar_notas(lista l, int tipox);
int getint(void)
{
char c;
int nbytes;
char BUFFER[BUFSIZE];
nbytes=read(0,&c,1);
if(nbytes != 1)
{
perror("READ ");
return -1;
}
nbytes=read(0,BUFFER,BUFSIZE-1);
memset(BUFFER,' ',BUFSIZE);
return (c-'0');
}
int
main()
{
lista l=NULL;
int cod_error;
while(!0)
if(( cod_error=pfunc[menu()](l) ) == -1 )
pfunc[4](l);
return 0;
}
int
menu(void)
{
int elec=0;
printf("Agenda de notas-n");
printf("ntOpciones:
nt1- Leer notas
nt2- Escribir nota
nt3- Escribir trabajo
nt4- Total tp
nt5 -Fn");
puts("--");
elec=(getint())-1;
return (elec < 0 || elec > 4 ) ? 4 : elec;
}
int
escribir_nota(lista l)
{
int (*ptr_wr)();
unsigned int m=0;
unsigned int t=0;
unsigned int n=0;
int cod_error;
ptr_wr=carga_fichero;
printf("Materia:n");
printf("nt1- Catalan
nt2- Castellano
nt3- Matematicas
nt4- Inglesn");
printf("Escoga->n");
m=getint();
printf("Nota:n");
n=getint();
printf("Trimestre:n");
t=getint();
if( (cod_error=((*ptr_wr)(n,m,t)) ) == -1)
{
fprintf(stderr,"Error al escribir en el ficheron");
return -1;
}
return 0;
}
int
mostrar_tipos(void)
{
int opcion=0;
printf("nt1- Visualizar por asignatura
nt2- Visualizar media de una asignatura
nt3- Visualizar media de todas las asignaturas
n");
opcion=getint();
return opcion;
}
void mostrar_total_notas(lista l, unsigned int assig)
{
nodo p;
p=l;
while(p)
{
if(assig == 0)
{
if ( p->m.nota_catalan != 0)
{
printf("NOTAS CATALANn");
printf("> %dn",p->m.nota_catalan);
}
}
else if(assig == 1)
{
if(p->m.nota_castellano != 0)
printf("> %dn",p->m.nota_castellano);
}
else if(assig == 2)
{
if(p->m.nota_mates != 0)
printf("> %dn",p->m.nota_mates);
}
else
{
if(p->m.nota_ingles != 0)
printf("> %dn",p->m.nota_ingles);
}
p=p->sig;
}
}
float media_assignaturas(lista l, int materia_t)
{
nodo p;
int n_notas=0;
float n_media=0;
p=l;
printf("Mat->%dn",materia_t);
if(materia_t != 0)
{
while(p)
{
if(materia_t == 1)
{
if(p->m.nota_catalan != 0)
{
printf("NOTAS CATALANan");
n_media+=p->m.nota_catalan;
n_notas++;
}
}
else if(materia_t == 2)
{
if(p->m.nota_castellano != 0)
{
n_media+=p->m.nota_castellano;
n_notas++;
}
}
else if(materia_t == 3)
{
if(p->m.nota_mates != 0)
{
n_media+=p->m.nota_mates;
n_notas++;
}
}
else
{
if(p->m.nota_ingles != 0)
n_notas++;
}
}
p=p->sig;
}
}
return (n_media/n_notas);
}
void
mostrar_notas(lista l, int tipox)
{
const char *const asignaturas[]={"Catalan","Castellano",
"Matematicas","Ingles"};
unsigned int _numero_assig=0;
unsigned int assig=0;
float media_t;
switch(tipox)
{
default: case 1:
while( _numero_assig < 4 )
{
printf("Notas [%s]:n",asignaturas[_numero_assig]);
mostrar_total_notas(l,_numero_assig);
_numero_assig++;
}
break;
case 2:
printf("Assignatura:n");
assig=getint();
if(assig < 1 || assig > 4 )
{
fprintf(stderr,"Asignatura fuera de rangon");
return;
}
media_t=media_assignaturas(l,assig);
printf(">Media [%s] %4.2fn",asignaturas[assig-1],media_t);
break;
case 3:
while(assig++ < 4)
{
media_t=media_assignaturas(l,assig);
printf("> Media [%s] -> %4.2fn",asignaturas[assig-1],media_t);
}
break;
}
_liberar_mem_struct(l);
}
int
leer_notas(lista l)
{
nodo p;
l=NULL;
if(( l=carga_notas() ) != NULL)
{
/*p=l;
while(p)
{
}*/
mostrar_notas(l, mostrar_tipos());
return 0;
}
return -1;
}
int fin(lista l)
{
_liberar_mem_struct(l);
exit(0);
}
int carga_fichero(int nota, int materia, int trimestre)
{
int df;
nodo p;
static int veces=0;
printf("CARGA FICHEROn");
if((df=open("notas.dat",O_WRONLY | O_APPEND)) == -1)
{
perror("2notas.dat");
return -1;
}
p=inicializa(p);
if(!p)
return -1;
if( materia == 1)
p->m.nota_catalan=nota;
else if( materia == 2 )
p->m.nota_castellano=nota;
else if( materia == 3)
p->m.nota_mates=nota;
else if( materia == 4)
p->m.nota_ingles=nota;
else
{
fprintf(stderr,"Materia [%d] desconocidan",materia);
return -1;
}
p->trimestre=trimestre;
write(df,p,sizeof(NOTAS));
free(p);
num_free++;
close(df);
return 0;
}
lista carga_notas(void)
{
nodo p;
int d_n;
int r_bytes=0;
lista l=NULL;
int indice=0;
if(( d_n = open("notas.dat",O_RDONLY)) == -1)
{
perror("2datos.dat");
return NULL;
}
p=inicializa(p);
if(!p)
return NULL;
while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
{
p->sig=l;
l=p;
p=inicializa(p);
}
free(p);
num_free++;
close(d_n);
return l;
}
nodo inicializa( nodo p)
{
num_malloc++;
p=(nodo)malloc(sizeof(NOTAS));
return p;
}
Gracias antemano
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con estructuras
«
Respuesta #3 en:
Jueves 16 de Octubre de 2008, 16:01 »
0
Mi opinión es que lo haces algo sencillo de una manera excesivamente complicada...
¿Puedes explicarme qué pretendes con lo siguiente?
Código: C
int
(
*
pfunc
[
]
)
(
lista l
)
=
{
leer_notas
,
escribir_nota
,
escribir_trabajo
,
total_tp
,
fin
,
}
;
Fr33k K0mpu73r
Leber
Miembro activo
Mensajes: 65
Re: Problema con estructuras
«
Respuesta #4 en:
Jueves 16 de Octubre de 2008, 16:21 »
0
Si, perdona esque pretendia que las funciones principales tuvieran los mismos parametros y devolvieran lo mismo, asi hacer un while y el valor que retorne la funcion menu, pues ir a sea funcion, pero he simplificado el codigo eliminando tonterias para intentar localizar el problema, pero sigo sin dar con ello.
Código: Text
#if !defined(_NOTAS_H)
#define _NOTAS_H
int menu(void);
typedef struct
{
int nota_catalan;
int nota_castellano;
int nota_mates;
int nota_ingles;
}MATERIAS;
typedef struct __notas
{
int trimestre;
MATERIAS m;
struct __notas *sig;
}NOTAS;
typedef NOTAS *nodo;
typedef NOTAS *lista;
int leer_notas(void);
int escribir_nota(void);
int fin(void);
lista carga_notas(lista l);
nodo inicializa(nodo p);
int carga_fichero(int nota, int materia, int trimestre);
int(*pfunc[])(void)=
{
leer_notas,
escribir_nota,
fin,
};
#endif
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "notas.h"
#include <fcntl.h>
#define BUFSIZE 1024
void mostrar_notas(lista l, int tipox);
static int num_malloc=0;
static int num_free=0;
int getint(void)
{
char c;
int nbytes;
char BUFFER[BUFSIZE];
nbytes=read(0,&c,1);
if(nbytes != 1)
{
perror("READ ");
return -1;
}
while(strlen(fgets(BUFFER,BUFSIZE,stdin)) > 1)
memset(BUFFER,' ',sizeof(BUFFER));
return (c-'0');
}
int
main()
{
int cod_error;
while(!0)
if(( cod_error=pfunc[menu()]() ) == -1 )
pfunc[2]();
return 0;
}
int
menu(void)
{
int elec=0;
printf("Agenda de notas-n");
printf("ntOpciones:
nt1- Leer notas
nt2- Escribir nota
nt3 -Fn");
puts("--");
elec=(getint())-1;
return (elec < 0 || elec > 4 ) ? 4 : elec;
}
int
escribir_nota(void)
{
unsigned int m=0;
unsigned int t=0;
unsigned int n=0;
int cod_error;
ptr_wr=carga_fichero;
printf("Materia:n");
printf("nt1- Catalan
nt2- Castellano
nt3- Matematicas
nt4- Inglesn");
printf("Escoga->n");
m=getint();
printf("Nota:n");
n=getint();
printf("Trimestre:n");
t=getint();
if( (cod_error=(carga_fichero(n,m,t)) == -1)
{
fprintf(stderr,"Error al escribir en el ficheron");
return -1;
}
return 0;
}
int
mostrar_tipos(void)
{
int opcion=0;
printf("nt1- Visualizar por asignatura
nt2- Visualizar media de una asignatura
nt3- Visualizar media de todas las asignaturas
n");
opcion=getint();
return opcion;
}
void mostrar_total_notas(lista l, unsigned int assig)
{
nodo p;
p=l;
while(p)
{
if(assig == 0)
{
// if ( p->m.nota_catalan != 0)
printf("> %dn",p->m.nota_catalan);
}
else if(assig == 1)
{
//if(p->m.nota_castellano != 0)
printf("> %dn",p->m.nota_castellano);
}
else if(assig == 2)
{
//if(p->m.nota_mates != 0)
printf("> %dn",p->m.nota_mates);
}
else
{
//if(p->m.nota_ingles != 0)
printf("> %dn",p->m.nota_ingles);
}
p=p->sig;
}
}
float media_assignaturas(lista l, int materia_t)
{
nodo p;
int n_notas=0;
float n_media=0;
p=l;
if(materia_t != 0)
{
while(p)
{
if(materia_t == 1)
{
if(p->m.nota_catalan != 0)
{
n_media+=p->m.nota_catalan;
n_notas++;
}
}
else if(materia_t == 2)
{
if(p->m.nota_castellano != 0)
{
n_media+=p->m.nota_castellano;
n_notas++;
}
}
else if(materia_t == 3)
{
if(p->m.nota_mates != 0)
{
n_media+=p->m.nota_mates;
n_notas++;
}
}
else
{
if(p->m.nota_ingles != 0)
{
n_media+=p->m.nota_ingles;
n_notas++;
}
}
p=p->sig;
}
}
return (n_media/n_notas);
}
void _liberar_mem_struct(lista l)
{
nodo p;
while(l)
{
p=l;
l=p->sig;
free(p);
num_free++;
}
printf("Free-> %dtMalloc-> %dn",num_free,num_malloc);
}
void
mostrar_notas(lista l, int tipox)
{
char *[]={"Catalan","Castellano",
"Matematicas","Ingles"};
unsigned int _numero_assig=0;
unsigned int assig=0;
float media_t;
switch(tipox)
{
default: case 1:
while( _numero_assig < 4 )
{
printf("Notas [%s]:n",asignaturas[_numero_assig]);
mostrar_total_notas(l,_numero_assig);
_numero_assig++;
}
break;
case 2:
printf("Assignatura:n");
assig=getint();
if(assig < 1 || assig > 4 )
{
fprintf(stderr,"Asignatura fuera de rangon");
return;
}
media_t=media_assignaturas(l,assig);
printf(">Media [%s] ->%4.2fn",asignaturas[assig-1],media_t);
break;
case 3:
while(assig++ < 4)
{
media_t=media_assignaturas(l,assig);
printf("> Media [%s] -> %4.2fn",asignaturas[assig-1],media_t);
}
break;
}
}
int
leer_notas(void)
{
lista l=NULL;
if(( l=carga_notas(l) ) != NULL)
{
mostrar_notas(l, mostrar_tipos());
_liberar_mem_struct(l);
return 0;
}
return -1;
}
int fin(void)
{
exit(0);
}
int carga_fichero(int nota, int materia, int trimestre)
{
int df;
nodo p;
if((df=open("notas.dat",O_WRONLY | O_APPEND | O_CREAT,0600)) == -1)
{
perror("2notas.dat");
return -1;
}
p=inicializa(p);
if(!p)
return -1;
if( materia == 1)
p->m.nota_catalan=nota;
else if( materia == 2 )
p->m.nota_castellano=nota;
else if( materia == 3)
p->m.nota_mates=nota;
else if( materia == 4)
p->m.nota_ingles=nota;
else
{
fprintf(stderr,"Materia [%d] desconocidan",materia);
return -1;
}
p->trimestre=trimestre;
write(df,p,sizeof(NOTAS));
free(p);
num_free++;
close(df);
return 0;
}
lista carga_notas(lista l)
{
nodo p;
int d_n;
int r_bytes=0;
if(( d_n = open("notas.dat",O_RDONLY)) == -1)
{
perror("datos.dat");
return NULL;
}
p=inicializa(p);
if(!p)
return NULL;
while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
{
p->sig=l;
l=p;
p=inicializa(p);
}
free(p);
num_free++;
close(d_n);
return l;
}
nodo inicializa( nodo p)
{
num_malloc++;
p=(nodo)malloc(sizeof(NOTAS));
return p;
}
Aun asi, he arreglado un par de cosillas y tampoco, me repite la nota de la primera asignatura que entro, no se donde más mirar.
Gracias
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con estructuras
«
Respuesta #5 en:
Jueves 16 de Octubre de 2008, 16:35 »
0
Hmm, no sé si estoy ciego
, pero sigo sin encontrar la definición de
lista
...
Fr33k K0mpu73r
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con estructuras
«
Respuesta #6 en:
Jueves 16 de Octubre de 2008, 17:39 »
0
Cita de: "m0skit0"
Hmm, no sé si estoy ciego
, pero sigo sin encontrar la definición de
lista
...
Código: Text
typedef NOTAS *lista;
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Leber
Miembro activo
Mensajes: 65
Re: Problema con estructuras
«
Respuesta #7 en:
Jueves 16 de Octubre de 2008, 21:34 »
0
Si, ahi tienes la deficion. Creo que se donde esta el posible fallo:
En la funcion cargar_notas, hago esto para leer las notas del fichero y pasarlas a la estructura:
Código: Text
# while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
# {
# p->sig=l;
# l=p;
# p=inicializa(p); //si es la ultima vez, l apunta a que? porque p pierde su valor
# }
#
#
# free(p);
Creo que es ahi, ya que en ser la ultima iteracion, inicializamos p, pero ya no quedan mas datos, entonces se pierde ese puntero, no?
Yo diria que si, pero estoy tan desquiciado con esto que quiza veo errores donde no los hay.
Saludos
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con estructuras