• Goto

    Los chistes sobre programación de XKCD son lo más  ;D
     

  • Disculpen que entre en la discordia, yo soy una persona a la que no le gustan mucho las discusiones, pero bueh...
    1ro. Si hay algo para lo que sirve Pascal es para aprender estructuras dinámicas de datos (pilas,colas,listas,árboles,etc.) y obviamente se implementan con punteros, así que lo de Pascal sin punteros es un poco bastante de desconocimiento.
    2do. En BASIC vale todo pero cuando se usa un lenguaje un poco menos precario, llamese C, Pascal, Cobol, o todas sus versiones modernas y superadas como C++,Visual Basic(puaj),Delphi, si uno pretende programar de manera correcta hay cosas que no van más.
    Por ejemplo, así como una función tiene una única entrada, debe tener una única salida, un ciclo se debe cortar por su condición de corte, no por un break, exit, o cualquiera que fuere su equivalente. Esto permite tener control de la modificaciones posteriores que quisieran hacer y de la claridad del código. Pero como parece que estoy hablando con una manga de herejes hagan lo que se les cante  ;D ;D ;D ;D


    No se si herejes, pero sí algo acá tiene validez, es hacer lo que a cada uno se le canta el toor. ;D ;D ;D ;D
     

  • Disculpen que entre en la discordia, yo soy una persona a la que no le gustan mucho las discusiones, pero bueh...
    1ro. Si hay algo para lo que sirve Pascal es para aprender estructuras dinámicas de datos (pilas,colas,listas,árboles,etc.) y obviamente se implementan con punteros, así que lo de Pascal sin punteros es un poco bastante de desconocimiento.
    2do. En BASIC vale todo pero cuando se usa un lenguaje un poco menos precario, llamese C, Pascal, Cobol, o todas sus versiones modernas y superadas como C++,Visual Basic(puaj),Delphi, si uno pretende programar de manera correcta hay cosas que no van más.
    Por ejemplo, así como una función tiene una única entrada, debe tener una única salida, un ciclo se debe cortar por su condición de corte, no por un break, exit, o cualquiera que fuere su equivalente. Esto permite tener control de la modificaciones posteriores que quisieran hacer y de la claridad del código. Pero como parece que estoy hablando con una manga de herejes hagan lo que se les cante  ;D ;D ;D ;D


    De todas formas, para limpiar un poco mi honor (si ya se, yo afirme que Pascal no tenian punteros) lo que dije fue:
    "De C a Pascal no es tan directo, mira que en Pascal no tenes punteros, y en C, para hacer operaciones basicas tipo strings, a algun manejo de matrices, tenes que usar punteros."
    Dejando de lado de si pascal tiene o no punteros, sigue siendo cierto lo que dije. En C estas obligado a usar punteros, hasta para el "Hola Mundo", y los punteros de C son de mas bajo nivel, estas siempre al borde de colgar todo. En cambio Pascal tiene tipo string, y conoce el tamaño de las matrices, no es puntero que sigue avanzando y modificando memoria hasta que el programador se de cuenta.
    Por eso el C no es bueno para la enseñanza.

    Ahora, al break dejalo tranquilo!!  :) Si queres hacer un programa que haga algo, tenes que meterle breaks cuando llegas a un lugar donde no podes seguir, sino es una complicacion innecesaria que solo queda bien en los libros.

       Saludos
       MARCOS
     

  • Hay cosas que se recomiendan porque esta probado que son utiles, no es seguir a rajatabla un reglamento solo por decir que mi programa es mas correcto que otros, en una de esas el codigo es lindo pero el programa no funciona, o consume recursos exagerados, como ciertos sistemas operativos populares  ::) ;D
    No hay que perder de vista lo que se quiere lograr, que es poder mirar el programa dentro de meses o años y poder entenderlo rapido, o conseguir que otra persona pueda continuar su desarrollo, asi que si un programa esta optimizado, ya sea porque son los requerimientos (por ejemplo si corre en una maquina con recursos limitados) o porque el programador es un maniatico al que simplemente le gusta programar asi, si esta bien documentado y otra persona puede entenderlo esta logrado el objetivo, seran formas mas o menos elegantes que otras, pero se cumple lo que se queria lograr. El asunto es que si se siguen las reglas, hay que documentar menos, porque hay estructuras que se entienden por si solas, lo malo es cuando alguien escribe programas inentendibles, y ademas no documenta, que suele ser demasiado comun.
     

  • Lo de manga de herejes fue obviamente en tono jocoso, mi profundo pensamiento es aún peor....  ;D ;D ;D
    Lo que puedo aportar es que programo desde los 12 años, a los 16 aprendí a hacerlo bien y hoy lo sigo haciendo profesionalmente. Pasé por más lenguajes de los que recuerdo (Basic, Pascal, Cobol, Fortran, Natural, Clipper, Fox, Lingo, Visual Basic(puaj), Delphi y otros tantos) trabajé haciendo juegos y sistemas administrativos, hasta dí clases de programación en un colegio técnico de computación y en institutos privados, y jamás, pero realmente jamás, vi un solo caso en que fuera imperioso poner un break, o que el no ponerlo generara un trabajo adicional.
    Así que, manga de vagos neuronales (va con onda), si les gusta usar el brek solo de puro extravagantes digan que es porque se les canta y dejen de inventar excusas.
     

  • Lo de manga de herejes fue obviamente en tono jocoso, mi profundo pensamiento es aún peor....  ;D ;D ;D
    Lo que puedo aportar es que programo desde los 12 años, a los 16 aprendí a hacerlo bien y hoy lo sigo haciendo profesionalmente. Pasé por más lenguajes de los que recuerdo (Basic, Pascal, Cobol, Fortran, Natural, Clipper, Fox, Lingo, Visual Basic(puaj), Delphi y otros tantos) trabajé haciendo juegos y sistemas administrativos, hasta dí clases de programación en un colegio técnico de computación y en institutos privados, y jamás, pero realmente jamás, vi un solo caso en que fuera imperioso poner un break, o que el no ponerlo generara un trabajo adicional.
    Así que, manga de vagos neuronales (va con onda), si les gusta usar el brek solo de puro extravagantes digan que es porque se les canta y dejen de inventar excusas.


    No entiendo:   confused

               //busqueda binaria de un link x el codigo
    static tDbLinkIdx      doLinkSortedSeek            (tDbPluIdx      iplu)
    {
         tDbLinkIdx      i,i1,i2;
         int                        cmp;

         if (!gDb.Cont.m_qLinkUsed)            //no hay registros
               return 0;

         i1 = 0;
         i2 = gDb.Cont.m_qLinkUsed-1;

         while (TRUE)
         {
               i = (tDbLinkIdx)((i1+i2)/2);
               cmp = doLinkCompare(iplu,gDb.m_LinkSorted[i]
    );
               if (!cmp)                  //encontro
                     return i;

               if (cmp<0)            //es menor, buscar abajo
               {
                     i2=i-1;
                     if (i==i1)      //no se puede retroceder mas
                           break;
               }
               else                  //es mayor, buscar arriba
               {
                     i1=i+1;
                     if (i==i2)      //no se puede avanzar mas
                           break;
               }
         }
                           //devuelve el primero mayor que encontro
         return i2+1;      
    }
    Aca ni bien entra a la funcion, si no hay registros, termina con un tipo de valor distinto a los demas, sin return tendria que ponerle un else {...} y mover todo lo de abajo a la derecha. Puaj!!
    Y dentro del While se entiende mucho mejor teniendo las condiciones por separado que meterlas todas en el comienzo, asi es mucho mas natural.  Reconosco que debe haber miles de ejemplos de busquedas binarias que no recurran al break, pero a mi me quedo comodo asi y es entendible.
    Este codigo forma parte de un programa que como 50.000 lineas (nunca las conte). Lo importante esta en la organizacion del los modulos que forman el programa, que la funcion como unidad sea entendible, estos otros detalles son insignificantes.

      Aguente break-return !!!!

           Saludos
          MARCOS
     

  • Ahi algo que me parece que no se puede negar, si las funciones siguen estando implementadas en los compiladores que cumplen ciertas normas ANSI a esta altura del partido, por algo debe ser. Si generaran codigo erroneo seguramente hubieran pasado a estar 'deprecated' (no se como traducir eso) hace rato.

    Marcos: Podes evitar el break ese con una variable sin modificar la estructura del programa

    int tmp;

    tmp = 0;

    while (tmp == 0){

    //...
    if (cmp<0)            //es menor, buscar abajo
               {
                     i2=i-1;
                     if (i==i1)      //no se puede retroceder mas
                           tmp = 1; //<---Hace que salga del bucle
               }

    //...

    En fin, aunque nunca se me ocurriría usar un goto en C, es una herramienta como cualquier otra, ni buena ni mala. Todo depende del uso que se le dé, de documentar bien el codigo y de ser constante en la convencion de nombres de variables y la forma de identar el codigo.

    Aunque algunas convenciones mejor no usarlas... como la notación Hungara que se supone que hay que usar cuando se escribe codigo para Windows... por diosss
     

  • Me gustaría hacer esa ventanita para poner el código adentro, pero todavía no manejo bien la paleta de herramientas del foro.
    Antes que nada, me gustan estos intercambios y no tiene de mi parte ánimo de ofender a nadie.
    Algunas de las cosas que dije las voy a tratar de ejemplificar en el código que pego a continuación (no estoy muy al día con el lenguaje que usaste Marcos, así que hice mi versión en Delphi, como programaste en Pascal no vas a tener problemas).
    Usé básicamente la misma idea de resolución pero con otra técnica para mi más limpia:

    function Buscar(Lista:TStringList;Valor:WideString): Integer;
     function Iterar(Lista:TStringList;Valor:WideString;LimInf,LimSup:Integer):Integer;
     var
       I: Integer;
     begin
       I := Trunc((LimInf + LimSup) / 2);                      //Determina el punto medio del intervalo
       if Lista[i] = Valor then Result := I                    //Si es igual asigna el valor de devolución
       else begin
         if Lista[i] > Valor then begin                        //Si es menor
           if I = LimInf then Result := I                        //Si llega al tope mínimo asigna el valor de devolución
           else Result := Iterar(Lista,Valor,LimInf,I - 1);      //Sinó vuelve a buscar en un intervalo reducido
         end
         else begin                                           //Si es mayor
           if I = LimSup then Result := LimSup + 1              //Si llega al tope máximo asigna el valor de devolución
           else Result := Iterar(Lista,Valor,I + 1,LimSup);     //Sinó vuelve a buscar en un intervalo reducido
         end;
       end;
     end;
    begin
     if Lista.Count = 0 then Result := -1                    //Devuelve -1 con lista vacía (ya que 0 sería una respuesta válida)
     else begin
       Result := Iterar(Lista,Valor,0,Lista.Count - 1);      //Llamado a una subfunción interna que busca en todo el intervalo
       if (Result > Lista.Count - 1) then Result := Lista.Count - 1; //Devuelve el último elemento si el buscado es mayor que
     end;                                                        // todos en la lista (en tu caso devuelve un subíndice que
    end;                                                          // no existe)

    Primer crítica que haría a lo que mandaste es el ciclo infinito, los puristas (o sea rompebolas como yo) lo consideramos malo porque cuando ves un ciclo deberías saber cuando termina por su condición. De no ser así, y el ciclo contener un par de cientos de lineas en su interior con un par de decenas de breaks y otros tantos returns, se va a complicar al momento de querer modificar algo.
    Una buena práctica también es que las funciones tengan una única salida (el return en tu caso) y eso es al final de la función. Si te fijas en el ejemplo que posteo, ambas funciones siempre van a pasar por el final de la función. Es el mismo caso que los breaks, pero con funciones de gran tamaño.
    El nombre de las variables i,i1,i2 sería interesante que representaran lo que significan (el uso de contadores I,J,K es normal pero el resto...)
    Y finalmente, es más facil programar cuando lo hacés bien de entrada, eso de después correr todo para poner un else no es lo que quise decir.

    Saludos Borg
     

  • .... Pasé por más lenguajes de los que recuerdo (Basic, Pascal, Cobol, Fortran, Natural, Clipper, Fox, Lingo, Visual Basic(puaj), Delphi y otros tantos) trabajé haciendo juegos y sistemas administrativos, hasta dí clases de programación en un colegio técnico de computación y en institutos privados...

    En que colegio estuviste Borg ??
     

  • En el ENET 35 Latzina, Baigorria y Lope de Vega, Capital, también conocido como EMET 5 (cuando lo municipalizaron). Daba clases de programación en 6to año de Técnico en Computación, en el Laboratorio.
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal