Primer parcial ICom-2003

Nota: Respete los prototipos de las funciones y no olvide el pseudocódigo para cada ejercicio.

  1. Escriba un programa que lea un texto por teclado hasta encontrar un EOF, y que imprima por pantalla cuantas palabras de 1 letra leyó, cuantas de 2 letras, cuantas de 3 letras, etc. hasta un máximo de 25 letras. (considere una palabra como una secuencia de letras mayúsculas o minúsculas, no cuente las letras con acento ni ñ ni ü ni ninguna otra cosa rara...).

    Si necesita probar su programa, el siguiente texto: "La bella y graciosa moza, marchose a lavar la ropa. La mojo en el arroyuelo y cantando la lavo. La froto sobre una piedra, la colgo de un abedul." tiene 3 de 1, 10 de 2, 1 de 3, 4 de 4, 5 de 5, 2 de 6, 3 de 8, y 1 de 9 para un total de 29 palabras.

  2. Implemente una función que permita pasar un número entero en base 10 a otra base arbitraria y otra que haga lo inverso. Ambas funciones deberán verificar que la base no sea mayor que 10 y, en la segunda función, que el número que se le pasa es consistente con la base en que se dice que está. Prototipos:

    /*transforma el numero decimal numdec a la base base y lo devuelve así transformado */
    int dec_a_base (int numdec, int base);

    /*transforma a decimal el numero numbase que originalmente está en la base base y lo devuelve así transformado*/
    int base_a_dec (int numbase, int base);

    Por ejemplo: el número 321 en base 4 (1 * 4^0 + 2 * 4^1 + 3 * 4^2) corresponde al número 57 en base 10 (decimal).

    Ayuda: en ambos casos conviene comenzar por la cifra menos significativa (es decir la que corresponde a base^0).

  3. El siguiente es un algoritmo para obtener un autovalor y su correspondiente autovector de una matriz cuadrada M. (bueno, hay muchas suposiciones en el medio, pero para muchas matrices si funciona).

    Comenzando con un vector normalizado, elegido al azar (seleccionando cada componente al azar), se lo multiplica por la matriz M.
    Al resultado se lo normaliza y se lo vuelve a multiplicar por la matriz M ( o sea M x V = W ).
    Repitiendo el paso anterior hasta que la diferencia entre el resultado W normalizado y el vector V (medida como la norma de ese vector diferencia dividido por el tamaño del vector) sea menor que un dado epsilon. (La norma de un vector se define como: |V| = raiz_cuadrada(sumatoria(V[i]*V[i])))
    El autovector es W y el autovalor es su norma. Implemente este algoritmo con las siguientes funciones:

    #define N 3

    /* realiza la multiplicación MxV = W, n es la dimensión de V, W y de las filas y columnas de Mat */
    /* no debe utilizar ningún vector ni matriz auxiliar */
    void MultMatVec ( double Mat[][N], double V[], double W[], int n );

    /* calcula y retorna la norma del vector V y también normaliza el vector V */
    /* no debe utilizar ningún vector ni matriz auxiliar */
    double Normaliza ( double V[], int n );

    /* calcula y retorna un autovalor de la matriz M y pone en V su correspondiente autovector normalizado */
    /* n es la dimensión del vector V y también el número de filas y columnas de la matriz M */
    /* epsilon es el error máximo tolerado en el autovector. como se lo describe en el enunciado */
    /* sólo puede utilizar un vector auxiliar, ninguna matriz auxiliar */
    double AutoVyV ( double Mat[][N], double V[], int n, double epsilon );

    Si desea probar su algoritmo, le sugerimos que utlice la siguiente matriz:

    {{0.0159, 0.2176, 0.4909},
    {0.6283, 0.4054, 0.1294},
    {0.8125, 0.5699,0.5909}}

    cuyos autovalores y correspondientes autovectores normalizados son:

    1.2661 -> {{0.3943, 0.4114, 0.8218},

    -0.3475 -> {-0.7566, 0.5792, 0.3033} y

    0.0937 -> {0.3303, -0.8424, 0.4259}.