PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

Ejercicio bordes #27

Open ssommerr opened 2 months ago

ssommerr commented 2 months ago

Hola! Cómo están? Quería consultar sobre el ejercicio de bordes; lo hice y probé con algunos de los tests, (no probe con todos porque no encontraba la consigna por lo que hice alguna cosita diferente al enunciado y tenía que modificar demasiadas cosas que crei que no eran el centro del ej) y funciona pero quería preguntar por la eficiencia y estilo; creo que no recorre cosas 2 veces, pero cree una función para calcular el tamaño que va a tener que tener mi nueva matriz y eso ya me suena medio raro. Me podrían decir que opinan? En el main hay cosas que solo me sirvieron para chequear algunos puntos por separado del programa, pero no va a su funcionamiento real.

include

int vueltasadar(int dim){ int contador=0, resto=0;

do
{
 resto+=dim%2;
 dim/=2;
 contador++;
}
while(dim>1);
return (contador+resto);

}

void funcionbordes(int dim, int matriz[][dim],int matrizrta[]){ int vueltas=vueltasadar(dim);

   int inicio=0, fin=(dim-1);
    for (int posicionfija=0 ; posicionfija<vueltas ; posicionfija++ )
    {
        int suma=0;
        for (int j=inicio;  j<=fin; j++)
        {
            suma+=matriz[j][posicionfija];
            suma+=matriz[j][dim-1-posicionfija];
        }
        inicio++;
        fin--;
        for(int i=inicio ;i<=fin ; i++ )
        {
             suma+=matriz[posicionfija][i];
             suma+=matriz[dim-1-posicionfija][i];
        }
        matrizrta[posicionfija]=suma;
    }

}

int main() { int mat_input_3[][6] = { {1, 1, 1, 1, 1, 1}, {1, -2, 2, -2, 2, 1}, {1, 4, 1, 2, -4, 1}, {1, 0, 3, 3, 0, 1}, {1, -2, -2, 2, 2, 1}, {1, 1, 1, 1, 1, 1} };

int dim=vueltasadar(6);
int matriznueva[dim];
funcionbordes(6, mat_input_3, matriznueva);
for(int i=0; i<dim ; i++)
{
    printf("%d\n", matriznueva[i]);
}
}
ssommerr commented 2 months ago

perdón en esta parte me ffalto agregar el if para que si es el num del medio en una matriz 5x5 x ej, no se sume 2 veces: suma+=matriz[j][posicionfija]; if ((dim-1-posicionfija]!=posicionfija) suma+=matriz[j][dim-1-posicionfija];

marcelogarberoglio commented 2 months ago

Fijate de probarlo con este programa, y en todo caso mandá el código completo, la versión final, así lo vemos

#include <assert.h>
#include <stdio.h>
int main(void)
{
  const int mat[M][M] = {
      {1, 1, 1, 1, 1, 1},
      {1, 2, 2, 2, 2, 1},
      {1, 2, 3, 3, 2, 1},
      {1, 2, 3, 3, 2, 1},
      {1, 2, 2, 2, 2, 1},
      {1, 1, 1, 1, 1, 1}
  };
  int borders[M / 2];

  sum_borders(mat, borders);

  for (int i = 0; i < M / 2; i++)
  {
    printf("Border %d: %d\n", i, borders[i]);
  }
assert(bodes[0]==20;
assert(bodes[1]==24;
assert(bodes[2]==12;

  return 0;
}
marcelogarberoglio commented 2 months ago

Lo que sí te anticipo es que la función vueltasAdar no tendría que existir, deberías poder calcularlo sin hacer ciclos