#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;
}