for y do while

Iniciado por m@o_614, 30 Junio 2013, 23:01 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

saludos tengo que hacer un programa que me calcule la multiplicacion de 2 matrices de diferentes dimensiones, ya se como hacer la multiplicacion pero tengo una duda en la parte donde le tienes que ingresar las filas y columnas de la matriz a y las filas y columnas de la matriz b


        printf("Dame el numero de filas de a :");
        scanf("%d",&n);
        printf("Dame el numero de columnas de a : ");
        scanf("%d",&m);
        printf("Dame el numero de filas de b :");
        scanf("%d",&n2);
        printf("Dame el numero de columnas de b : ");
        scanf("%d",&m2);


estaba pensando que para no repetir el mismo codigo para a y a para b alomejor podria utilizar un do-while para ingresar los datos:

   
  int n[2],m[2];
  char letra[] = {'a','b'};
  int  i=0;
    do
    {
        printf("Dame el numero de filas de %c :",letra[i]);
        scanf("%d",&n[i]);
        printf("Dame el numero de columnas de %c : ",letra[i]);
        scanf("%d",&m[i]);
        system("cls");
        i++;
    }while(i < 2);


cual de las dos opciones creen que es la mejor??
gracias

amchacon

Es buena práctica trabajar así, si después quieres cambiar las 2 matrices por 27 no habrá problema  ;)

¿Desventajas? Bueno pierdes un pelín de rendimiento, pero es despreciable (un nanosegundo?).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ivancea96

Cita de: m@o_614 en 30 Junio 2013, 23:01 PM
cual de las dos opciones creen que es la mejor??
Cualquiera es buena, aunque yo recomiendo, en este caso, el for.
Así, digamos que queda más legible el "i++".
Lo encapsulas todo dentro de el mismo FOR, evitando poner el i++ por ahí.
Además, defines la variable i dentro de el mismo for, más sencillo
"for(int i=0;i<2;i++){}"

Pero es mi opinión.

En cuento a rendimiento, lo que dijo amchacon.

eferion

Yo fíjate que propondría una tercera forma... ponerlo en una función independiente.

En el mundo de la programación se le puede sacar bastante rendimiento al "divide y vencerás".


void CreaMatriz( char letra, int* filas, int* columnas )
{
  system("cls");
  printf("Dame el numero de filas de %c :", letra);
  scanf("%d",filas);
  printf("Dame el numero de columnas de %c : ", letra);
  scanf("%d",columnas);
}


En este caso la función es sumamente simple... pero nunca está de más adquirir buenas costumbres a la hora de programar.

Mi experiencia es que generalmente los profesores se preocupan más de que la gente conozca las funciones del lenguaje que de que enseñar buenos hábitos.

amchacon

Pues fíjate Eferion, eso último que has puesto no me convence nada. Hacer una iteración sobre una función me parece un desperdicio de rendimiento.

Sí es cierto que a la hora de pedir datos el rendimiento no es importante, pero es una manía mía ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ivancea96

La verdad, el procedimiento que propone Eferion me parece también abstante bueno. E incluso podría hacerse un bucle while/for para llamarlo, suponiendo que hubiera muchas letras.

eferion

Cita de: amchacon en  1 Julio 2013, 13:20 PM
Pues fíjate Eferion, eso último que has puesto no me convence nada. Hacer una iteración sobre una función me parece un desperdicio de rendimiento.

Sí es cierto que a la hora de pedir datos el rendimiento no es importante, pero es una manía mía ;)

Cuando compiles en modo release el compilador, al optimizar, seguramente convierta esa función en inline, ya que no tiene bucles ni condicionales... overhead cero. Si eso no te convence piensa que un bucle for o while tiene saltos igualmente...

En cualquier caso es lo que digo... las prácticas de programación son un momento perfecto para aprender buenos hábitos. Es como cuando te sacas el carnet... ningún conductor se tira 45 minutos dando vueltas por las calles más puñeteras de una ciudad para no ir a ningún sitio... esto es igual... vale que la función quizás no merezca la pena en términos de productividad, mantenimiento y rendimiento... pero son habilidades y hábitos que adquieres al aprender y eso te ayuda a evitar malos vicios después.

m@o_614

hay alguna manera de poder hacer lo mismo con los siguientes dos fors??

for(i=0;i < n[0];i++)
        {
            for(j=0;j < m[0];j++)
            {
                printf("Dame el elemento (%d,%d) de a:\n",i,j);
                scanf("%d",&a[i][j]);
                system("cls");
            }
        }
        for(i=0;i < n[1];i++)
        {
            for(j=0;j < m[1];j++)
            {
                printf("Dame el elemento (%d,%d) de b:\n",i,j);
                scanf("%d",&b[i][j]);
                system("cls");
            }
        }
es que tambien me parece demasiado repetitivo el codigo, ingresarle para una matriz, luego ingresarle para otra.. seria bueno hacerlo con una funcion como dijo eferion???

eferion

a y b entiendo que son matrices dinámicas, no?

Código (cpp) [Seleccionar]

int** a, b;


o las estás declarando con un tamaño estático y rezas para que el usuario no pida un tamaño superior al que has definido ??

Lo pregunto porque las soluciones serían ligeramente diferentes.

Cita de: m@o_614 en  1 Julio 2013, 17:10 PMes que tambien me parece demasiado repetitivo el codigo, ingresarle para una matriz, luego ingresarle para otra.. seria bueno hacerlo con una funcion como dijo eferion???

Yo solo hice una apreciación y es que aprender a dividir el código en funciones no es siempre una tarea fácil... practicarlo con ejemplos sencillos ayuda luego a desenvolverse con códigos más complejos... pero no deja de ser una decisión tuya si pones funciones o todo junto.

El código puede funcionar igual de bien... otra cosa es lo que tu practiques y, en consecuencia, aprendas, al hacer estas prácticas.