ANALIZANDO DIFERENTES ESTILOS DE PROGRAMACION Estilo de programación (también llamado estándares de código o convención de código) es un término que describe convenciones para escribir código fuente en ciertos lenguajes de programación. FORTAN Hay muchos estilos diferentes de programación, p rogramación, pero se intentará dar algunas guías generales que son de aceptación general. Portabilidad
Para asegurar la portabilidad del código, se recomienda usar sólo el estándar de Fortran 77. La única excepción que se ha hecho en este manual es usar letras minúsculas. Estructura del Programa
La estructura total del programa deberá ser modular. Cada subprograma deberá resolver una tarea bien definida. Mucha gente prefiere escribir cada subprograma en un archivo por separado. Comentarios
Se repite lo que se había indicado previamente: Escriba código legible, pero también agregue comentarios al código fuente para explicar lo que se está haciendo. Es especialmente importante tener una buena cabecera para cada subprograma que explique cada argumento de entrada/salida y que hace el subprograma. Sangrado
Se debe siempre usar el sangrado apropiado para bloques de ciclos y sentencias if como se mostro en el tutorial. Variables
Declarar siempre todas las variables. No se recomienda la declaración implícita. Intentar compactar a 6 caracteres como máximo para nombres de variables, o asegurarse que los primeros 6 caracteres son únicos. Subprogramas
Nunca se debe permitir que las funciones tengan "efectos laterales", por ejemplo no se deben cambiar los valores de los parámetros de entrada. Usar subrutinas en tales casos. En las declaraciones separar los parámetros, bloques comunes y variables locales. Minimizar el uso de bloques comunes. Goto
Minimizar el uso de la sentencia goto. Desafortunadamente se requiere usar goto en algunos ciclos, ya que el ciclo while no es estándar en Fortran. Arreglos
En muchos casos es mejor declarar todos los arreglos grandes en el programa principal y entonces pasarlos como argumentos a las distintas subrutinas. De esta forma toda la asignación de espacio es hecha en un sólo lugar. Recordar que se deben pasar también las dimensiones principales. Evitar el innecesario "redimensionamiento de matrices". Asuntos de Eficiencia
Cuando se tenga un ciclo doble que esta accediendo a un arreglo bidimensional, es usualmente mejor tener el primer índice (renglón) dentro del arreglo más interno. Lo anterior por el esquema de almacenamiento en Fortran. Cuando se tengan sentencias if-then-elseif con condiciones múltiples, intentar colocar primero aquellas condiciones que vayan a ser las más frecuentes f recuentes que ocurran.
C
No existen un conjunto de reglas fijas para programar con legibilidad, ya que cada programador tiene su modo y sus manías y le gusta escribir de una forma determinada. Lo que sí existen son un conjunto de reglas generales, que aplicándolas, a plicándolas, en mayor o menor medida, se consiguen programas bastante legibles. Aquí intentaremos resumir estas reglas. Identificadores significativos
Un identificador es un nombre asociado a un objeto de programa, que puede ser una variable, función, constante, tipo de datos... El nombre de cada identificador debe identificar lo más claramente posible al objeto que identifica (valga la redundancia). Normalmente los identificadores deben empezar por una letra, no pueden contener espacios (ni símbolos raros) y suelen tener una longitud máxima que puede variar, pero que no debería superar los 10-20 caracteres para evitar lecturas muy pesadas. Un identificador debe indicar lo más breve y claramente posible el objeto al que referencia. Por ejemplo, si una variable contiene la nota de un alumno de informática, la variable se puede llamar nota_informatica. Observe que no ponemos los acentos, los cuales pueden dar problemas de compatibilidad en algunos sistemas. El carácter '_' es muy usado para separar palabras en los identificadores. Constantes simbólicas
En un programa es muy normal usar constantes (numéricas, cadenas...). Si estas constantes las usamos directamente en el programa, el programa funcionará, pero es más recomendable usar constantes simbólicas, de forma que las definimos al principio del programa y luego las usamos cuando haga falta. Comentarios, comentarios...
El uso de comentarios en un programa escrito en un lenguaje de alto nivel es una de las ventajas más importantes con respecto a los lenguajes máquina, además de otras más obvias. Los comentarios sirven para aumentar la claridad de un programa, ayudan para la documentación y bien utilizados nos pueden ahorrar mucho tiempo. No se debe abusar de comentarista, ya que esto puede causar una larga y tediosa lectura del programa, pero en caso de duda es mejor poner comentarios de más. Estructura del programa
Un programa debe ser claro, estar bien organizado y que sea fácil de leer y entender. Casi todos los lenguajes de programación son de formato libre, de manera que los espacios no importan, y podemos organizar el código del programa como más nos interese. Para aumentar la claridad no se deben escribir líneas muy largas que se salgan de la pantalla y funciones con muchas líneas de código (especialmente la función principal). Una función demasiado grande demuestra, en general, una programación descuidada y un análisis del problema poco estudiado. Se deberá, en tal caso, dividir el bloque en varias llamadas a otras funciones más simples, para que su lectura sea más agradable. En general se debe modularizar siempre que se pueda, de forma que el programa principal llame a las funciones más generales, y estas vayan llamando a otras, hasta llegar a las funciones primitivas más simples. Esto sigue el principio de divide y vencerás, mediante el cual es más fácil solucionar un problema dividiéndolo en subproblemas (funciones) más simples. Indentación o sangrado
La indentación o sangrado consiste en marginar hacia la derecha todas las sentencias de una misma función o bloque, de forma que se vea rápidamente cuales pertenecen al bloque y cuáles no. Algunos estudios indican que el indentado debe hacerse con 2, 3 ó 4 espacios. Usar más espacios no aumenta la claridad y puede originar que las líneas se salgan de la pantalla, complicando su lectura. La indentación es muy importante para que el lector/programador no pierda la estructura del programa debido a los posibles anidamientos. Presentación Al hacer un programa debemos tener en cuenta quien o quienes van a usarlo o pueden llegar a usarlo, de forma que el intercambio de información entre dichos usuarios y el programa sea de la forma más cómoda, clara y eficaz posible. En general, se debe suponer que el usuario no es un experto en la materia, por lo que se debe implementar un interfaz que sea fácil de usar y de aprender, intuitivo y que permita efectuar la ejecución de la forma más rápida posible.
JAVA
Para lograr la legibilidad de un programa es importante considerar aspectos tales como el nombre de los identificadores, escribir el código con cierta alineación y líneas en blanco en lugares apropiados así como realizar una buena documentación. Identificadores
Los identificadores deben ser elegidos de tal manera que el solo nombre describa el uso que se dará dentro del programa, por tanto no es recomendable usar identificadores de una letra, excepto en el for, ni abreviaturas raras o ambiguas. Además de eso es recomendable que se escriban: Empezando con mayúscula si se trata del nombre de una clase o interfaz, y empezando cada palabra en identificador con mayúscula. CírculoColoreado Sólo con mayúsculas si es el nombre de una constante. DIAS_HABILES Empezando con minúscula si es el nombre de cualquier otro identificador. De preferencia el nombre de cualquier método debe ser un verbo en infinitivo y el de todo atributo un sustantivo. primerJugador, asignarSueldo(). Archivos fuente
Cada programa en Java es una colección de uno o más archivos. El programa ejecutable se obtiene compilando estos archivos. En cada archivo especifica su contenido como sigue: Los paquetes (instrucción package). Los archivos de biblioteca (Instrucciones import). Un comentario explicando el objetivo del archivo. Las clases que defines en ese archivo. Clases
Cada clase debe ir precedida por un comentario que explique su objetivo. Es recomendable especificar sus elementos como sigue: Estructura de los objetos. Primero las variables y luego las constantes. Elementos estáticos. Constructores. Métodos públicos y privados. Métodos estáticos. Clases internas. Deja una línea en blanco después de cada método. Todos los elementos deben estar precedidos por public, private o protected. Las variables deben ser privadas. Los métodos y las constantes pueden ser privados o públicos, según se requiera. Métodos
Todo método excepto main debe empezar con un comentario en formato javadoc El cuerpo de un método no debe exceder 30 líneas de código. Esto te obligará a dividir un método complejo en varios más sencillos. Variables y Constantes
NO definas más de una variable por línea: int horas = 0, minutos = 0; //Mal es mejor: int horas = 0, minutos = 0; Alineación y espacios en blanco
La alineación de instrucciones, se puede hacer de manera automática si se emplea el editor emacs (es recomendable modificar los tabuladores para que dejen sólo tres espacios en blanco). Usa líneas en blanco para separar partes de un método que son lógicamente distintas.
1.2. Evaluación de expresiones Una expresión es una combinación de operadores y operandos de cuya evaluación se obtiene un valor. Los operandos pueden ser nombres que denoten objetos variables o constantes, funciones, literales de cualquier tipo adecuado de acuerdo con los operadores u otras expresiones más simples.
La evaluación de una expresión da lugar a un valor de algún tipo, una expresión se dice que es del tipo de su resultado. Ejemplos de expresiones: a + 5*b (a >= 0) and ((b+5) > 10) a -a * 2 + b -b + sqrt(b**2 - 4*a*c) length(s) > 0
Las expresiones se evalúan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual precedencia, la evaluación se realiza según el or den de escritura, de izquierda a derecha. El orden de evaluación puede modificarse usando paréntesis. Tipos de expresiones Dentro de las expresiones distinguimos dos clases según el tipo de datos que devuelven al evaluarlas: Aritméticas: las que devuelven un valor numérico Lógicas: las que devuelven true o false Las expresiones se utilizan fundamentalmente en las asignaciones y en las partes condicionales de las sentencias if, while y repeat.
1.3. Definición de funciones en distintos lenguajes de programación. FORTRAN Las funciones en Fortran son bastante similares a las funciones matemáticas: ambas toman un conjunto de variables de entrada (parámetros) y regresan un valor de algún tipo. Al inicio de la sección se comento de los subprogramas definidas por el usuario, pero Fortran 77 tiene también funciones incorporadas. Un ejemplo simple muestra cómo usar una función: x = cos(pi/3.0)
En este caso la función coseno cos de 60º, asignará a la variable x el valor de 0.5 (si pi ha sido definido correctamente; Fortran 77 no tiene constantes incorporadas). Hay varias funciones incorporadas en Fortran 77. Algunas de las más comunes son: abs valor absoluto min valor mínimo max valor máximo sqrt raíz cuadrada sin seno cos coseno tan tangente atan arco tangente exp exponencial (natural) log logaritmo (natural) En general, una función siempre tiene un tipo. Varias de las funciones incorporadas mencionadas anteriormente son sin embargo genéricas. Por lo tanto en el ejemplo anterior pi y x podrían ser del tipo real o del tipo double precisión. El compilador revisará los tipos y usará la versión correcta de la función cos (real o double precisión). Desafortunadamente, Fortran no es un lenguaje polimórfico, por lo que en general, el programador debe hacer coincidir los tipos de las variables y las funciones. Se revisa a continuación como implementar las funciones escritas por el usuario. Supongamos el siguiente problema: un meteorólogo ha estudiado los niveles de precipitación en el área de una bahía y ha obtenido un modelo (función) ll (m,t) donde ll es la cantidad de lluvia, m es el mes, y t
es un parámetro escalar que depende de la localidad. Dada la fórmula para ll y el valor de t, calcular la precipitación anual. La forma obvia de resolver el problema es escribir un ciclo que corra sobre todos los meses y sume los valores de ll. Como el cálculo del valor de ll es un subproblema independiente, es conveniente implementarlo como una función. El siguiente programa principal puede ser usado: program lluvia real r, t, suma integer m read (*,*) t suma = 0.0 do m = 1, 12 suma = suma + ll(m, t) end do write (*,*) 'La precipitación Anual es ', suma, 'pulgadas' stop end
C
Una función es un fragmento de código que realiza una tarea bien definida. Por ejemplo, la función printf imprime por la salida estándar los argumentos que le pasamos. Al igual que esta función, existen otras funciones que realizan diversas tareas ya definidas en el estándar ANSI C y que pueden ser utilizadas por el programador. Este tipo de funciones predefinidas son denominadas funciones de biblioteca. Sin embargo, cada programador puede definir sus propias funciones de acuerdo a sus necesidades. Las funciones que define el programador son conocidas como funciones de usuario. La utilización de funciones nos permite dividir un programa extenso en pequeños segmentos que realizan tareas concretas. Probablemente, dentro de un mismo programa se realicen las mismas tareas varias veces, lo que se facilita mediante la utilización de funciones. . Sin embargo, es probable que ciertas funciones no sean reutilizables, pero al usarlas se mejora la legibilidad del programa. Con el propósito de permitir un manejo eficiente de los datos, las funciones en C no se pueden anidar. En otras palabras, una función no se puede declarar dentro d e otra función , por lo que todas las funciones son globales o externas, lo que hace que puedan llamarse desde cualquier parte de un programa. Cuando se accede a una función desde un determinado punto del programa, se le puede pasar información mediante unos identificadores especiales conocidos como argumentos (también denominados parámetros). Una vez que la función procesa esta información, devuelve un valor mediante la instrucción return. La estructura general de una función en C es la siguiente: tipo_de_retorno nombre_de_la_función (lista_de_parámetros) { cuerpo_de_la_función return expresión }
Donde:
• tipo_de_retorno: es el tipo del valor devuelto por la función, o, en caso de que la función no
devuelva valor alguno, la palabra reservada void. • nombre_de_la_función: es el nombre o identificador asignado a la función.
• lista_de_parámetros: es la lista de declaración de los parámetros que son pasados a la función.
Éstos se separan por comas. Debemos tener en cuenta que pueden existir funciones que no utilicen parámetros. • cuerpo_de_la_función: está compuesto por un conjunto de sentencias que llevan a cabo la tarea
específica para la cual ha sido creada la función.
• return expresión: mediante la palabra reservada return, se devuelve el valor de la función, en
este caso representado por expresión
C++
Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. Las funciones pueden tomar parámetros que modifiquen su f uncionamiento. Las funciones son utilizadas para descomponer grandes problemas en tareas simples y para implementar operaciones que son comúnmente utilizadas durante un programa y de esta manera reducir la cantidad de código. Cuando una función es invocada se le pasa el control a la misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual la función fue llamada. [clase::] ( [Parámetros] ) { cuerpo; }
Ejemplo de una función Para comenzar, vamos a considerar el caso en el cual se desea crear la función cuadrado(), que deberá devolver el cuadrado de un número real (de punto flotante), es decir, cuadrado() aceptará números de punto flotante y regresará una respuesta como número flotante. Nota: aunque para la función que veremos el tipo de retorno coincide con el tipo de parámetro pasado, algunas veces las cosas pueden cambiar, es decir, no es obligatorio que una función reciba un parámetro de un tipo y que tenga que regresar una respuesta de dicho tipo.
// regresar el cuadrado de un número double Cuadrado(double n) { return n*n; }
JAVA
En Java una función es un modulo de un programa separado del cuerpo principal, que realiza una tarea específica y que puede regresar un valor a la parte principal del programa u otra función o procedimiento que la invoque. La forma general de una función es: tipodatoregresa Nom_fun(parametros) { cuerpo de instrucciones; intruccion return; }
El tipo especifica el tipo de valor que la función regresara utilizando la instrucción return. Si no se especifica un tipo se asume de default que el tipo regresado es int. La lista de parametros formales es una lista de variables separadas por comas (,) que almacenaran los valores que reciba la función, estas variables actúan como locales dentro del cuerpo de la función. Aunque no se ocupen parametros los paréntesis son requeridos. La declaración de parametros es la especificación de cada tipo de parámetro recibido. INSTRUCCION RETURN Dentro del cuerpo de la función deber haber una instrucción return cuando menos, para regresar el valor, esta instrucción permite regresar datos. Prog.java ejemplo:
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class prog26 extends HttpServlet { public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int x=10; x = funcion1(x,20); PrintWriter pagina; response.setContentType("text/html"); pagina = response.getWriter(); pagina.println(""); pagina.println("x="+x);
pagina.println(""); pagina.close(); }; // termina dopost public int funcion1(int a, int b){return a+b;}; public void destroy(){super.destroy();}; }// termina class
1.4. Disciplina de tipos en distintos lenguajes de programación. La programación funcional es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los 1930s para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda.
1.5. Tipos de datos en distintos lenguajes de programación. FORTRAN
Los tipos de datos permitidos son los siguientes: Logical: Las variables lógicas solo pueden tener dos valores verdadero y falso. Integer: Valores enteros guardados en 4 bytes. Se indican como números sin punto decimal: 1, 2, -3, 25, etc. Real: Valores reales guardados en 4 bytes y con 8 cifras significativas. Se indican con punto decimal,
y de ser necesario el exponente de la potencia de 10 después de una E: 1., -3.1416, 6.25E-10, etc. Doublé: Valores reales de doble precisión guardado s en 8 bytes y con 16 cifras significativas, también se denotan por real (8). Se indican con punto decimal y el exponente de la potencia de 10 después de una D: 1.D0, -3.1416D0, 6.25D-10, etc. Son muy útiles en cálculos numéricos largos, donde los errores de redondeo pueden hacer que las ultimas 4 o 5 cifras significativas de un numero real sean basura. Cuádruple: Valores reales de cuádruple precisión guardados en 16 bytes y con 32cifras significativas, también se denotan por real (16). Se indican con punto decimal y el exponente de la potencia de 10 después de una Q: 1.Q0, -3.1416Q0, 6.25Q-10, etc. Complex: Dos valores reales formando un par y que en operaciones matemáticas Se tratan como la parte real e imaginaria de un numero complejo: (1.,-2.), (1.0E0,-2.0E0). También existen versiones de doble y cuádruple precisión. Character: Variables que corresponden a cadenas de caracteres. Al declarar una variable de este tipo se debe especificar cuantos caracteres puede tener. Estas variables deben estar contenidas en comillas: ’hola’, ’abcdfe’, ’Me llamo Luis’, ’128.3’, etc.
C
Hay dos clases de tipos de datos: tipos fundamentales y tipos derivados. Únicamente vamos a ver los tipos de datos fundamentales. Tipo entero: representa números enteros con o sin signo, que estarán compuestos por los dígitos del 0 al 9, pudiendo ser precedidos por los signos + o -. Algunos ejemplo de datos enteros son: 0, 23, -176, -1, etc. Tipo real: Se emplean para representar números reales (con decimales). Para definir datos reales se antepone la palabra reservada float al identificador de la variable. float identificador = valor; Por ejemplo: float numero1, numero2;
float numero3 = 123.43; float numero3; Tipo carácter: Este tipo de datos se emplea para representar un carácter perteneciente a un determinado código utilizado por el ordenador (normalmente el código ASCII). Para representar este tipo de dato se antepone la palabra reservada char al identificador de la variable. Char identificador = ‘valor’; Una constante tipo char se representa como un solo carácter encerrado entre comillas simples. Tipo cadena de caracteres: una cadena de caracteres es un número de caracteres consecutivos (incluso ninguno) encerrado entre unos delimitadores determinados, que en el lenguaje C son las comillas dobles. Para definir variables de tipo cadena, estas se definen como vectores de caracteres, esto es, anteponiendo la palabra reservadachar al identificador de la variable, y después entre corchetes la longitud máxima de cadena. Char identificador[cantidad] = “ mensaje ”;
C++ Los tipos de datos que maneja C++ son: •Enteros
Dentro de los enteros están los tipos: short, int, long, los cuales varían en rango de acuerdo al compilador que se utilice, siendo long rango mayor y short e l de menor. •Flotantes
Dentro de los flotantes C++ tiene los tipos: float, double y long double donde al igual que los enteros varía el rango de cada uno de acuerdo al compilador que se utilice. De igual forma el float es el de menor rango siendo long double el de rango mayor •Caracteres
Se utiliza el tipo char. Para representar un caracter en C++ se utilizan apóstrofes. Ejemplos: ‘a’, ‘b’ , ‘5’
Para representar una cadena de caracteres se utilizan las comillas. Ejemplo: “soy una cadena”
JAVA Los tipos de datos primitivos que soporta Java son:
Tipo de
Representación
dato
Tamaño
Rango de Valores
Valor
(Bytes)
por
Clase Asociada
defecto byte
Numérico Entero
1
-128 a 127
0
Byte
2
-32768 a 32767
0
Short
4
-2147483648 a 2147483647
0
Integer
con signo short
Numérico Entero con signo
Int
Numérico Entero con signo
long
Numérico Entero
8
Numérico
0
Long
a 9223372036854775807
con signo
float
-9223372036854775808
4
3.4x10-38 a 3.4x1038
0.0
Float
8
1.8x10-
0.0
Double
\u0000
Character
false
Boolean
-
Void
en Coma flotante de precisión simple Norma IEEE 754 double
Numérico
308
308
a 1.8x10
en Coma flotante de precisión doble Norma IEEE 754 char boolean void
Carácter Unicode
2
\u0000 a \uFFFF
Dato lógico
-
true ó false
-
-
-