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.

Wednesday, November 12, 2014

Sobre el parcial de física I

FISICA 1
Criterios de Evaluación de Parciales
El parcial contiene una parte práctica con tres problemas y una teórica con dos preguntas.
Cada una de estas partes debe aprobarse por separado. Reprobar una de ellas implica reprobar el parcial.
En general, la calificación de una pregunta teórica es “Correcto” o “Incorrecto”. Deben explicarse verbalmente los planteos teóricos asociados, los procedimientos y el resultado, según el caso. Deben responderse las dos preguntas. Preguntas sin respuesta tienen la calificación de “No responde”. En ese caso, la parte teórica se aprueba sólo si la otra pregunta está perfectamente bien contestada.
De la parte práctica, deben tenerse bien resueltos como mínimo dos problemas. Un problema bien resuelto implica, entre otras cosas, que deben especificarse ternas de referencia, nombre y significado de variables introducidas por el alumno en su desarrollo, diagramas de cuerpo libre bien hechos, explicar de donde salen las ecuaciones que se usan, correcta aplicación de ecuaciones vectoriales de dinámica, uso de principios de conservación (energía o momento angular).
En la corrección se tendrá en cuenta que los principios teóricos empleados sean los adecuados, que el procedimiento seguido sea correcto, que los resultados sean dimensionalmente coherentes. Un error de cuentas baja puntos, salvo que el resultado numérico sea un despropósito. Un desarrollo desordenado y letra ilegible predisponen mal en la corrección.
Mas allá del detalle minucioso de la corrección, el parcial es una unidad que expresa el conjunto de conocimientos que manifiesta el alumno en el momento de su realización y más allá de los porotos que puedan haberse anotado en cada detalle da un aspecto global de dicho conocimiento. Por ello, debe tenerse en cuenta que un error conceptual grave en la parte teórica o en la parte práctica, invalida el examen.

Cuarto Parcialito (2º Cuatrimestre 2014)

Programar una funcion que reciba como parametros un arbol y un nivel, en int. El programa debe devolver un entero que contenga la suma de los valores del arbol en ese nivel. Programar esta funcion en un arbol de prueva ingresando: 7,4,12,1,6,15.
suma para el nivel 0: 7
suma para el nivel 1: 16
suma para el nivel 2: 22

RESUELTO:

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

struct s_nodo
{
    int valor;
    struct s_nodo *izq;
    struct s_nodo * der;
};

int sumar_nivel (struct s_nodo * pArbol, int n);

int main()
{
    struct s_nodo * pArbol=NULL;
    int i;
    cargar_valor(&pArbol,7);
    cargar_valor(&pArbol,4);
    cargar_valor(&pArbol,12);
    cargar_valor(&pArbol,1);
    cargar_valor(&pArbol,6);
    cargar_valor(&pArbol,15);

    for(i=0;i<3;i++)
    printf("\nSUMA PARA EL NIVEL (%d) = %d", i,sumar_nivel(pArbol,i));
}
int sumar_nivel (struct s_nodo * pArbol, int n)
{
    if(pArbol!=NULL)
    {
            if(n==0)
            return pArbol->valor;
            else
            return sumar_nivel(pArbol->izq,n-1)+sumar_nivel(pArbol->der,n-1);
    }
    else
        return 0;

}
void cargar_valor (struct s_nodo ** ppArbol, int valor)
{
    if(*ppArbol!=NULL)
    {
        if((*ppArbol)->valor > valor)
            cargar_valor(&(*ppArbol)->izq,valor);
        else
            cargar_valor(&(*ppArbol)->der,valor);
    }
    else
    {
        *ppArbol=malloc(sizeof(struct s_nodo));
        (*ppArbol)->valor=valor;
        (*ppArbol)->izq=NULL;
        (*ppArbol)->der=NULL;
    }

}

Friday, October 24, 2014

Informatica II : Recuperatorio Segundo Parcialito 8/5/2014 (Resuelto!)


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct
{
    char nombre[30];
    char apellido[30];
    int edad;
    unsigned int codigo;
} t_persona;


int main()
{
    t_persona persona[3];
    int i;
    char auxn,auxa;

    for (i=0; i<3; i++)
    {
        persona[i].codigo=0;

        printf("Ingresar nombre:");
        cargar_txt(persona[i].nombre);
        printf("\nIngresar apellido:");
        cargar_txt(persona[i].apellido);
        printf("\nIngresar edad:");
        scanf("%d", &(persona[i].edad));

        auxn=persona[i].nombre[0];
        if(es_mayuscula(auxn))
        {
            auxn=auxn^32;
        }
        persona[i].codigo=persona[i].codigo|auxn;
        persona[i].codigo=persona[i].codigo<<8;

        auxa=persona[i].apellido[0];
        if(es_mayuscula(auxa))
        {
            auxa=auxa^32;
        }
        persona[i].codigo=persona[i].codigo|auxa;
        persona[i].codigo=persona[i].codigo<<8;

        persona[i].codigo=persona[i].codigo|persona[i].edad;
    }
    for(i=0;i<3;i++)
    {
        mostrar_bin(persona[i].codigo);
        printf("\n");
    }


    return 0;
}
void cargar_txt(char txt[])
{
    char l;
    int i=0;
    do
    {
        l=getche();
        if(l!='\r')
        {
            txt[i]=l;
            i++;
        }
    }
    while ((l!='\r')&&(i<29));
    txt[i]='\0';
}
void es_mayuscula(char l)
{
    if((l>='A')&&(l<='Z'))
        return 1;
    else
        return 0;
}
void mostrar_bin (unsigned int var)
{
    int i;
    int aux;
    unsigned int mask=1;
    mask=mask<<((sizeof(unsigned int)*8)-1);
    for(i=0;i<(sizeof(unsigned int)*8);i++)
    {
        aux=var&mask;
        var=var<<1;
        if(aux!=0)
            printf("1");
        else
            printf("0");
    }
}

Wednesday, October 15, 2014

Tercer Parcialito Informática II

/*
programar una funcion:
int * datos_frase(char*)
recibe una frase y devuelve un arreglo de enteros que en cada posicion va a tener la cantidad de letras de cada palabra de la frase.
Con lo cual, si mi frace es hola mundo, va a devolver un arreglo de 2 posiciones que va a tener un 4 y un 5.
sin desperdiciar memoria.
*/


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

int * datos_frase (char * frase);
int es_letra (char l);

int main()
{
    int * palabras=datos_frase("Hola Mundo!, como estan?, yo muy muy muy muy muy bien");
    printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",palabras[0],palabras[1], palabras[2], palabras[3],palabras[4],palabras[5], palabras[6], palabras[7],palabras[8],palabras[9], palabras[10], palabras[11]);
    free(palabras);
    return 0;
}
int * datos_frase (char * frase)
{
    int a=10;
    int * palabras=(int *)malloc(sizeof(int)*a);
    if(palabras==NULL)
        printf("Falta de memoria");
    char l;
    int i=0,j=0;
    int cont=0;

    do
    {
        if(es_letra(frase[i]))
        {
            cont++;
        }
        if(!es_letra(frase[i+1])&&(es_letra (frase[i])))
        {
            palabras[j]=cont;
            j++;
            if(j>=a)
            {
                a+=10;
                palabras=(int*)realloc(palabras,sizeof(int)*a);
            }
        cont=0;
        }
        i++;
    }while(frase[i]!='\0');
    palabras=(int*)realloc(palabras, sizeof(int)*(j));
    return palabras;
}
int es_letra (char l)
{
    if((l>='a'&&l<='z')||(l>='A'&&l<='Z'))
        return 1;
    else
        return 0;
}

Ejercicios Resueltos | Practica 4 | Informática II


Wednesday, September 24, 2014

Segundo Parcialito (2º Cuatrimestre 2014)

Parcialito II Informática II
Apellido y Nombre:__________________________________

Se quiere realizar un control sobre los productos de un supermercado. Para esto se cuenta con dos estructuras:

  • struct s_producto, que representa un producto a la venta (nombre, marca, cantidad, fecha de elaboración, fecha de vencimiento)
  • struct s_fecha, que representa una fecha calendario (dia,mes,año)
Realizar un programa que, utilizando las estructuras mencionadas, permita registrar por teclado 3 productos (con todos sus datos completos) e informe cuantos ya superaron su fecha de vencimiento.

Aclaraciones: las fechas de la estructura struct s_producto deben ser de tipo struct s_fecha, y los productos ingresados deben ser almacenados en un arreglo de 3 posiciones de tipo struct s_producto.




Resuelto:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 30

struct s_fecha
{
    int dia,mes,ano;
};

struct s_producto
{
    char nombre[30];
    char marca [30];
    int cantidad;
    struct s_fecha elaboracion;
    struct s_fecha vencimiento;
};

int main()
{
    struct s_fecha hoy= {24,9,2014};
    struct s_producto producto[3];
    int i=0,r=0,vencidos;
    char l='a', aux;
    for(r=0; r<3; r++)
    {
        printf("Ingrese el nombre del producto %d:\n", r+1);
        aux='a';
        while(aux!='\r')
        {
            aux=getche();
            if(aux!='\r')
            {
                l=aux;
                producto[r].nombre[i]=l;
                i++;
            }
        }
        producto[r].nombre[i]='\0';
        aux='a';
        printf("\nIngrese la marca del producto:\n");
        while(aux!='\r')
        {
            aux=getche();
            if(aux!='\r')
            {
                l=aux;
                producto[r].marca[i]=l;
                i++;
            }
        }
        producto[r].marca[i]='\0';

        printf("\nIngrese la cantidad:\n");
        scanf("%d", &producto[r].cantidad);

        printf("\nIngrese la fecha de elaboracion: \nDia:");
        scanf("%d", &producto[r].elaboracion.dia);
        printf("\nMes:");
        scanf("%d", &producto[r].elaboracion.mes);
        printf("\nAño:");
        scanf("%d", &producto[r].elaboracion.ano);

        printf("\nIngrese la fecha de vencimiento: \nDia:");
        scanf("%d", &producto[r].vencimiento.dia);
        printf("\nMes:");
        scanf("%d", &producto[r].vencimiento.mes);
        printf("\nAño:");
        scanf("%d", &producto[r].vencimiento.ano);

        printf("\n______________________________________________________\n");
    }
    vencidos=contar_vencidos(producto);

    printf("De los 3 productos ingresados, %d estan vencidos a la fecha. (%d/%d/%d)",vencidos,hoy.dia,hoy.mes,hoy.ano);
    return 0;
}
int contar_vencidos(struct s_producto producto[])
{
    int i, cont=0;
    struct s_fecha hoy= {24,9,2014};

    for(i=0; i<3; i++)
    {
        if(producto[i].vencimiento.ano<hoy.ano)
        {
            cont++;
        }
        else
        {
            if(producto[i].vencimiento.ano==hoy.ano)
            {
                if(producto[i].vencimiento.mes<hoy.mes)
                    cont++;
                else
                {
                    if(producto[i].vencimiento.mes==hoy.mes)
                    {
                        if(producto[i].vencimiento.dia<hoy.dia)
                            cont++;
                    }
                }
            }
        }
    }
    return cont;
}

Thursday, September 4, 2014

Primer Parcialito | 2º Cuatrimestre 2014 | Informática II

1)Armar una función que cargue una matriz de unsigned int de NxM.
2)Armar una función que muestre una matriz de unsigned int de NxM.
3)Armar una función que ponga en 1 los bits '3' y '5' de una variable unsigned int.
4)Armar un programa que cargue una matriz NxM, la muestre, y luego ponga en 1 los bits '3' y '5' de cada una de las posiciones de la matriz para mostrarla de nuevo luego de hecha la transformación.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N 3
#define M 4

void cargar_matriz ( unsigned int mat [N][M]);
void mostrar_matriz ( unsigned int mat [N][M]);
unsigned int transformar ( unsigned int num);

int main()
{
    unsigned int mat[N][M];
    srand(time(NULL));
    cargar_matriz (mat);
    mostrar_matriz(mat);
    transformar_matriz (mat);
    printf("Matriz transformada:\n");
    mostrar_matriz (mat);

    return 0;
}

void cargar_matriz (unsigned int mat [N][M])
{
        int i,j;
        for(i=0;i<N;i++)
        {
            for(j=0;j<M;j++)
            {
                mat[i][j]=rand()%6;
            }
        }
}
void mostrar_matriz (unsigned int mat [N][M])
{
    int i,j;
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            printf("|%d|", mat[i][j]);
        }
        printf("\n");
    }
}
unsigned int transformar ( unsigned int num)
{
    unsigned int mask=pow(2,5)+pow(2,3);

    return num|mask;

}
void transformar_matriz (unsigned int mat [N][M])
{
    int i,j;
        for(i=0;i<N;i++)
        {
            for(j=0;j<M;j++)
            {
                mat[i][j]=transformar(mat[i][j]);
            }
        }
}