marcelogarberoglio / PI

Para realizar consultas
6 stars 0 forks source link

EJ 10, TP6 #139

Open VieraFederico opened 1 year ago

VieraFederico commented 1 year ago

Estimado Marcelo:

No estoy pudiendo encontrar mi error en el código, pero al usar el programa de testeo me imprime un cielo diferente al que debería imprimirse. Dejo el código de la función a continuación:

void graficar (const int cielo[][COLUMNAS], int filas, int columnas)
{
    int suma;
    for(int i=0;i<filas;i++)
    {
        for(int j=0;j<columnas;j++)
        {
            suma=0;
            for(int k=-1;k<=1;k++)
            {
                if((i+k)>=0 && (i+k)<filas)
                {
                    suma+=cielo[i+k][j];
                    if((j-1)>=0)
                        suma+=cielo[i+k][j-1];
                    if((j+1)<columnas)
                        suma+=cielo[i+k][j+1];
                }
            }
            if((float)suma/9.0 >10)
            {
                printf("*");
            }
            else
                printf(" ");
        }
        printf("\n");
    }
}

Muchas gracias por adelantado.

marcelogarberoglio commented 1 year ago

No tenés que considerar los bordes, o sea que i, j deben empezar en 1 y ser menores que filas-1 y columnas-1 Al ser un solo caracter es mejor usar putchar en vez de printf

VieraFederico commented 1 year ago

Estimado Marcelo, muchas gracias por tu respuesta. Ahí cambie los índices de como indicaste, aunque se ahora se parece mas a lo que debería mostrar, sigue siendo un "cielo2" diferente. También, usar el putchar en vez del printf, el programa me tira warnings e imprime "n" y no "*". Te dejo el codigo a continuacion:

void graficar (const int cielo[][COLUMNAS], int filas, int columnas)
{
    int suma;
    for(int i=1;i<(filas-1);i++)
    {
        for(int j=1;j<(columnas-1);j++)
        {
            suma=0;
            for(int k=-1;k<=1;k++)
            {
                if((i+k)>=1 && (i+k)<(filas-1))
                {
                    suma+=cielo[i+k][j];
                    if((j-1)>=1)
                        suma+=cielo[i+k][j-1];
                    if((j+1)<(columnas-1))
                        suma+=cielo[i+k][j+1];
                }
            }
            if((float)suma/9.0 >10)
            {
                putchar("*");
            }
            else
                printf(" ");
        }
        printf("\n");
    }
}

Muchas gracias por adelantado.

marcelogarberoglio commented 1 year ago

Fijate que ahora en los dos ciclos recorrés únicamente la "matriz interna" por lo tanto estos if ya no son necesarios (sí serían necesarios si tenés que recorrer toda la matriz) if((i+k)>=1 && (i+k)<(filas-1)) if((j-1)>=1) if((j+1)<(columnas-1))

por otro lado, en vez de hacer las tres sumas podrías hacer otro ciclo similar al de k

Y te imprime mal porque comillas dobles es para strings, debería ser

putchar('*');

VieraFederico commented 1 year ago

Estimado Marcelo: Cada vez se parece mas. Cambie el ciclo para sacar la necesidad de hacer 3 sumatorias y use el putchar correctamente. Todavía no se parece al "Cielo2" del test. A continuacion te dejo la funcion:

void graficar (const int cielo[][COLUMNAS], int filas, int columnas)
{
    int suma;
    for(int i=1;i<(filas-1);i++)
    {
        for(int j=1;j<(columnas-1);j++)
        {
            suma=0;
            for(int k=-1;k<=1;k++)
            {
                for(int m=-1;m<=1;m++)
                {
                    suma+=cielo[i+k][j+m];
                }
            }

            if(((float)suma/9.0) > 10.0)
                putchar('*');
            else
                putchar(' ');
        }
        printf("\n");
    }
}

Y aca el output:

-----------------------------
A continuaci├│n su funci├│n debe mostrar esto:
 **     **      *****    *
 *              *****   ***
         *      *****   ***
   *     ****  ******   ***
 ****    ***   ******   ***
 ****   *****  ******   ***
   *    *****   *****   ***
 **     *****   *****   ***
-----------------------------
Y muestra esto:
**   *****    ******   *** *
*    * ***     *****   *** *
   * * ***    ******   *** *
* **    **** *******   *** *
****   ***** *******   *** *
*****  *************   *** *
 ***   *****  ******   *** *
***    *****  ******   *** *
-----------------------------

Muchas gracias por adelantado y disculpame la molestia.

marcelogarberoglio commented 1 year ago

El algoritmo está bien. La diferencia con el testeo se da por la forma en que se hace la división, nosotros la hicimos con divisiónn entera, o sea if(suma/9 > 10) putchar('*'); else putchar(' '); por lo que en los casos en que la división te da un número real con parte entera 10 y parte decimal mayor a cero, como 10.5, 10.1, etc a vos te dibuja una estrealla y a nosotros no.

VieraFederico commented 1 year ago

Perfecto, ya lo arregle e imprime correctamente. Muchísimas gracias por tu ayuda Marcelo