Saturday, December 6, 2014

Examen Resuelto: Informática II Febrero de 2008

Informática II Febrero de 2008

Descarga los archivos Alumnos.txt, Inscripciones.dat, Materias.txt, para probar la resolucion del examen!
Queres ver el codigo usado para crear Inscripciones.dat? click aca


FINAL Tema 1
APELLIDO Y NOMBRE: __________________________________________________________
CANTIDAD DE HOJAS: _________

1) Se tiene un archivo de texto (ALUMNOS.TXT) separado por comas (CSV), con el
siguiente formato:
Número de DNI (Numero entero)
Nombre y Apellido (Cadena de caracteres de longitud variable, máximo 30
caracteres)
Debido a un error, en el archivo se encuentran datos (renglones) repetidos. Se pide
realizar una función que elimine del mismo los renglones repetidos. La longitud del
archivo, y la cantidad de datos se desconoce. Los datos no están en ningún orden
particular. La función debe reescribir el mismo archivo, no está permitido grabar
los datos en otro archivo, por lo que se recomienda trabajar en memoria con alguna
estructura dinámica que considere apropiada y luego sobrescribir el archivo original.


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

struct persona
{
    int dni;
    char nom[30];
};

int es_letra (char l);

int main()
{
    limpiarArchivo();
    return 0;
}
void limpiarArchivo(void)
{
    int i=0,j=10,k=0,sen=0;
    struct persona * personas;
    FILE * arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Alumnos.txt","r");
    int auxdni;
    char auxnom[30];
    personas=malloc(sizeof(struct persona)*j);

    if(arch!=NULL)
    {
        fscanf(arch,"%d,",&(personas[i].dni));
        leer(arch,personas[i].nom,30);
        i++;

        while(!feof(arch))
        {
            sen=0;
            fscanf(arch,"%d,",&auxdni);
            leer(arch,auxnom,30);

            for(k=0;k<i;k++)
            {
                if(auxdni==personas[k].dni)
                    sen=1;
            }
            if(sen==0)
            {
                personas[i].dni=auxdni;
                strcpy(personas[i].nom,auxnom);
                i++;
            }
            if(i>j)
            {
                j+=10;
                personas=realloc(personas,sizeof(struct persona)*j);
            }
        }
        fclose(arch);

        personas=realloc(personas,sizeof(struct persona)*i);
        arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Alumnos.txt","w");

        for(k=0;k<i;k++)
            fprintf(arch,"%d,%s\n",personas[k].dni,personas[k].nom);

free(personas);
        fclose(arch);
    }
}
void leer (FILE * arch, char str[], int max)
{
    int i=0;
    int aux;

    aux=fgetc(arch);
    while((!feof(arch))&&(i<max)&&(es_letra(aux)))
    {
        str[i]=aux;
        i++;
        aux=fgetc(arch);
    }
    str[i]='\0';
}
int es_letra (char l)
{
    if(l!=',' && l!='\n')
        return 1;
    else
        return 0;
}



2) Se tiene un archivo binario (INSCRIPCIONES.DAT), con donde cada registro se
corresponde con la siguiente estructura:
struct inscripciones
{
int DNI;
unsigned char mapa;
int materias[8];
};
La interpretación de cada registro es la siguiente:
DNI: Número entero, representa el DNI de una persona.
materias: es un arreglo de números enteros donde sólo algunas posiciones del mismo
tienen valores que representan un número de materia a las que esa
persona está inscripto. El resto de las posiciones tiene números aleatorios
sin ningún tipo de significado. Para saber que posiciones del arreglo tienen
valores válidos, debe utilizarse la máscara de bits definida en “mapa”.
mapa: es un char donde cada bit indica si esa posición del arreglo de materias
contiene un valor válido (bit = 1) o si debe ignorarse (bit = 0). Los bits de
este char se numeran de 0 a 7, siendo el bit 0 el menos significativo (el de
“la derecha”) y el bit 7 el más significativo (el de la “izquierda”).
Se pide realizar una función que cuente cuantas personas están inscriptas en más de
5 materias (es decir, cuantos registros del archivo tienen mas de 5 valores válidos en
el arreglo de materias). La longitud del archivo, y la cantidad de registros del mismo
se desconoce. Los datos no están en ningún orden particular. Asumir que no hay
registros repetidos.

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

struct inscripciones
{

    int DNI;
    unsigned char mapa;
    int materias[8];
};

int main()
{
    printf("%d\n",contar());
    return 0;
}
int contar (void)
{

    FILE * arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Inscripciones.dat","rb");
    int cont=0,i=0,valor=0;
    struct inscripciones persona;
    fread(&persona,sizeof(struct inscripciones),1,arch);

    while(!feof(arch))
    {
        for(i=0;i<8;i++)
        {
            if(persona.mapa&1)
            cont++;
            persona.mapa=persona.mapa>>1;
        }
        if(cont>=5)
            valor++;
        cont=0;
        fread(&persona,sizeof(struct inscripciones),1,arch);
    }
    return valor;
}






3) Se tiene un archivo de texto (MATERIAS.TXT) separado por comas (CSV), ordenado
ascendentemente por número de materia con el siguiente formato:
Número materia (Numero entero)
Nombre de materia (Cadena de caracteres de longitud variable, máximo 30
caracteres)
Se pide realizar una función que reciba un “Nombre y Apellido” de alumno, como un
arreglo de caracteres (máximo 30 chars) y que utilizando este archivo y los otros dos
descriptos anteriormente, los relacione e imprima por pantalla los nombres de las
materias donde dicho alumno se encuentra inscripto. La longitud del archivo, y la
cantidad de datos se desconoce. Asumir para este punto, que el primer archivo
(ALUMNOS.TXT) ya no cuenta con datos repetidos.

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

struct inscripciones
{

    int DNI;
    unsigned char mapa;
    int materias[8];
};

int es_letra (char l);

int main()
{
    materias("Anabelle Grand");
    return 0;
}
void materias (char nom[30])
{
    FILE * arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Alumnos.txt","r");
    int i;
    int dni,auxdni;
    int mat,auxmat;
    char nommat[30];
    char auxnom[30];
    struct inscripciones persona;
    struct inscripciones auxpersona;

    if(arch!=NULL)
    {
        fscanf(arch,"%d,",&auxdni);
        leer(arch,auxnom,30);

        while(!feof(arch))
        {
            if(strcmp(nom,auxnom)==0)
                dni=auxdni;
            fscanf(arch,"%d,",&auxdni);
            leer(arch,auxnom,30);
        }
        fclose(arch);

        arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Inscripciones.dat","rb");
        if(arch!=NULL)
        {
            fread(&auxpersona,sizeof(struct inscripciones),1,arch);

            while(!feof(arch))
            {
                if(auxpersona.DNI==dni)
                    persona=auxpersona;
                fread(&auxpersona,sizeof(struct inscripciones),1,arch);
            }
        }
        fclose(arch);

        arch=fopen("E:\\Ale\\Desktop\\Informatica II Final Mar 2008\\Materias.txt","r");
        if(arch!=NULL)
        {
            fscanf(arch,"%d,",&auxmat);
            leer(arch,nommat,30);
            printf("\n\nEl alumno %s cursa: \n",nom);

            while(!feof(arch))
            {
                for(i=0;i<8;i++)
                {
                    if(auxmat==persona.materias[i])
                    {
                        if((persona.mapa>>i)&1)
                            printf("%s\n",nommat);
                    }
                }
                fscanf(arch,"%d,",&auxmat);
                leer(arch,nommat,30);
            }
        }
        fclose(arch);
    }
}
void leer (FILE * arch, char str[], int max)
{
    int i=0;
    int aux;

    aux=fgetc(arch);
    while((!feof(arch))&&(i<max)&&(es_letra(aux)))
    {
        str[i]=aux;
        i++;
        aux=fgetc(arch);
    }
    str[i]='\0';
}
int es_letra (char l)
{
    if(l!=',' && l!='\n')
        return 1;
    else
        return 0;
}





Condiciones para ambos ejercicios:
- Declarar todos los “struct” y “typedef” que utilice para resolver el ejercicio.
- No desperdiciar memoria. Liberar todos los espacios que se hayan reservado y que
no se utilicen.
- Se pueden programar funciones adicionales, respetando los puntos anteriores.