05/04/2013 - Clase 1: Introducción, Tipos de Memoria, Punteros y Structs

Fecha de publicación: 08-abr-2013 13:46:16

Arrancamos la clase con una presentación.

Nos presentamos los docentes, luego mencionamos el temario de la materia que pueden encontrar acá.

Explicamos un poco la estructura del sitio, aunque no pudimos mostrar algunas cosas porque no teníamos internet :(

Igualmente está explicado en la página de inicio

Contamos que el esquema de evaluación va a ser basado en 3 trabajos prácticos que iremos publicando sobre la cursada. La idea es que le dediquemos tiempo de la clase a estos trabajos prácticos. Por esto es que a partir de la semana que viene vamos a estar cursando en el LABORATORIO en lugar del aula que utilizamos esta primera clase.

Por último, tirando al final del cuatrimestre, vamos a realizar un parcial, con su respectivo recuperatorio.

Dijimos que se puede encontrar la planificación de la cursada en ésta página. Aunque con la salvedad de que puede verse sujeta a cambios.

Luego estuvimos charlando un poco para entender qué habían visto en Programación 1, y en otras materias de la carrera.

Después de esto, ya arrancamos con la Unidad 1

Específicamente vimos una introducción a memoria dinámica, explicando los tipos de memoria: de código, estática, de pila y el heap.

A continuación repasamos algunas cositas de pasaje de parámetros por valor y por referencia en el lenguaje C, para después ver algo de punteros. Esto está en ésta página.

Para terminar con punteros, vimos la relación entre éstos y los array (o vectores/arreglos) en C.

Vimos que a través de aritmética de punteros podemos recorrer la memoria en una forma similar a la que se hace con un array, es decir con el operador puntero[indice] o bien ir incrementando el puntero (puntero += 1). C incrementará la cantidad de bytes de acuerdo al tipo de puntero. Por ejemplo, 4 bytes para ints.

Para eso usamos este ejemplito para imprimir un array en la forma tradicional, y también como puntero.

#include <stdio.h>
#include <stdlib.h>
void printDeArreglo(int edades[], int longitud) {
    int i;
    for (i = 0; i < longitud; i++) {
        printf("%i,", edades[i]);
    }
}
void printContPuntero(int *vector, int longitud) {
    int *puntero = vector;
    for (; puntero < vector + longitud; puntero++) {
        printf("%i,", *puntero);
    }
}
int main(void) {
    int edades[] = { 23, 21, 10 };
    int longitud = sizeof(edades) / sizeof(int);
    printDeArreglo(edades, longitud);
    printf("\n");
    printContPuntero(edades, longitud);
    return 0;
}

Un problema que no mencionamos es que al pasar un array como parámetro a un método, C lo "convierte" en un puntero automáticamente. Con lo cual, incluso en el "printDeArreglo", el parámetro "edades" es en realidad un puntero a int. Esto se puede ver en el hecho de que si dentro de ese método tratamos de calcular el tamaño de "edades", nos va a dar el tamaño de un puntero y no del array. Por eso en este ejemplo ambas funciones recibe por parámetro la longitud, calculada en el main.

A todo esto fuimos hablando de la herramientas, especialmente del entorno de desarrollo o IDE. En la sección de Material, y en Software pueden encontrar instrucciones sobre como instalar el eclipse. Igualmente, la clase que viene vamos a llevar un DVD para distribuir todo y poder instalarlo en el laboratorio sin tener que bajar muchas cosas de internet.

Por último vimos un tema que, si bien forma parte de la Unidad 2, nos va a servir para poder tener ejemplos más "ricos", en la unidad 1, los structs.

Acá está el ejemplo en clase:

#include <stdio.h>
#include <stdlib.h>
struct Producto {
    int codigo;
    float precio;
};
void imprimirProducto(struct Producto unProducto) {
    printf("Producto codigo=%i precio=%.2f\n", unProducto.codigo, unProducto.precio);
}
void aumentarPrecio(struct Producto *unProducto, float incremento) {
    unProducto->precio += incremento;
}
int main_structs(void) {
    struct Producto unProducto;
    unProducto.codigo = 1234;
    unProducto.precio = 2.5;
    imprimirProducto(unProducto);
    aumentarPrecio(&unProducto, 1.0);
    imprimirProducto(unProducto);
    return 0;
}

Así terminamos la clase.

Luego, con la lista de alumnos y sus mails generamos un grupo google con nombre "programacion-ii-uno". Como dijimos en clase, esta va a servir para comunicarnos en ambos sentidos. Siéntanse libres de enviar cualquier consulta sobre TP's, material, y hasta cualquier tema relacionado con la materia o programación en general.

Saludos !