Archive for the 'Programación' Category

Aprendiendo a programar: conceptos iniciales

Saturday, February 17th, 2007

Comenzando con la recopilación de apuntes o tutorial de introducción a la programación….

Introducción

¿Qué es un programa? Podríamos definirlo como una secuencia lógica de instrucciones que manipulan unos datos para obtener unos resultados. En esa secuencia podemos distinguir dos partes: una declarativa, donde se definen / especifican los datos a tratar y otra operacional, donde van las instrucciones que procesarán la información.

Cuando se comienza a aprender a programar, antes de comenzar en algún lenguaje concreto, suele verse la llamada metodología, que no es más que desarrollar los programas en papel, de forma genérica, en pseudocódigo. Resolviendo problemas de esta manera y posteriormente pasándolos a un lenguaje concreto es una buena manera de aprender a programar.

Aquí haré un poco mezcla de todo… pseudocódigo, pascal y c… éste ultimo para que veais que una vez sepais resolver problemas (programar), pasar de un lenguaje a otro no es difícil. En el aspecto léxico no me meteré mucho, pues se puede mirar en cualquier tutorial especializado en el lenguaje concreto.


Comenzando

Cuando nos enfrentemos al desarrollo de un programa, debemos tener presente de principio dos cosas: los datos que van a entrar y los que van a salir. Haciendo valoración de ambas, pensaremos en el algoritmo que solucionará nuestro problema. (Los pasos a efectuar para conseguir nuestro objetivo).

Para ello haremos uso de todo lo que veremos a continuación…

Tipos de datos

Hemos hablado de datos, pero no del tipo que son esos datos. Y, esto es importante, pues no trataremos de igual modo un número entero que un número decimal o que una cadena de caracteres. Por lo general, hablaremos de integer (entero), float (decimales de simple precisión), double (decimales de doble precisión), bool (true/false) y char (caracter). Actualmente los lenguajes soportan el tipo string o cadena de caracteres, pero no lo usaremos. (Creando las susodichas cadenas a partir de arrays de char).

También podremos crearnos nuestro propio tipo de dato, a través del type y registros de pascal o las estructuras de C.

Variables

Las variables son contenedores de información. Como su nombre indica, cambian de valor a lo largo de la ejecución del programa. (O mejor dicho, las asignamos nosotros valores diferentes según convenga). Lo explicado sobre los tipos de datos, quedará patente en este apartado. Si queremos meter un 5 en una variable, por ejemplo, esa variable deberá ser de tipo integer, haciendo

var num: integer; num:=5; (* en pascal *)
int num=5; // en C

Con ello, en la variable num tendremos un 5 almacenado para su posterior uso. Hay que poner atención al rango del tipo de datos, pues por ejemplo, si en un entero intentamos meter un número que no está en su rango, dará un error de overflow.

Constantes

En muchos programas, usaremos datos que se mantendrán invariables en todo el programa. Hablamos entonces de constantes. Realmente, también lo podríamos meter en una variable, pero no estaría bien visto, por así decirlo. Poniendo un ejemplo, imaginemos que por algún motivo necesitamos el número pi, 3.14, en muchos puntos del programa. Una solución sería poner en cada uno de sus puntos el número tal cual… pero… imagina que en un momento dado, quieres poner dos decimales más: tendrías que cambiarlo en todos los sitios.

Lo suyo sería definirnos una constante, antes de todo procedimiento, incluso de la función principal.

(* Pascal *)
Const
PI = 3.14

// C
# define PI 3.14

En cualquier punto del programa, podremos hacer referencia a la constante escribiendo su nombre. Las constantes no tienen un tipo específico y se suelen nombrar con todos sus caracteres en mayúscula.

Operadores

Con los datos podemos hacer una serie de operaciones, concretamente, en pascal:

Aritméticas: +, -, *, /, div (división entera), mod (resto)
Relacionales: =,<,>,<=,>=, <>
Lógicas: and, or, not
Asignación: :=

Sentencias de control

If. Sentencia condicional. El código que esté dentro se ejecutará sólo si la condición se cumple. De lo contrario, pasará de largo, ejecutando el resto de código que esté después.

Un if puede contener otros if dentro de él, llamados anidados. Además, puede seguirle una instrucción else, con la que indicaremos el código a ejecutar si la condición no se cumple.

if a>5 then writeln(”a es mayor que 5″)
else writeln(”a es menor o igual a 5″);

En pascal, si dentro de un if y, en general de cualquier bloque, va más de una instrucción, debe llevar un begin al principio y un end al final del bloque. En C, el contenido iría entre llaves. { }

Bucles. Un bucle hace posible que determinado código se ejecute una y otra vez, un número finito de veces. Ese número finito queda definido por una condición.

En pascal, tenemos los bucles for, while y repeat. Algo a tener en cuenta es la diferencia de concepto entre los tres. En el for, se ejecutarán las instrucciones tantas veces como se cumpla la condición, sin poder salir antes del bucle. En el while, se ejecutarán mientras se cumpla la condición (si desde el principio no se cumple, no se ejecutarán) y en el repeat, como el while, pero se ejecutarán al menos una vez, pues la condición va al final.

Y cuando se usa uno u otro? Sabiendo lo anterior y valorando. En una búsqueda, usaremos un while, pues saldremos del bucle en cuanto encontremos lo que buscamos, para recorrer una matriz de principio a fin, usaremos un for… a base de hacer ejercicios y de ir pensando, se va cogiendo soltura… ;) :) Manejando bucles de forma correcta, ireis por el buen camino, pues son el pan diario del programador.

Más sobre variables

Para terminar la primera parte, un pequeño matiz sobre variables. Según el uso que las demos, podemos hablar de contadores, interruptores, auxiliares… en esencia no dejaremos de hablar de variables, pero por cumplir una misión específica, se las llama de un modo especial.

Contador: es la variable que usamos, como su nombre indica, para llevar alguna cuenta. Por ejemplo, en los bucles. Se suelen llamar i, j, k… y su incremento o decremento suele ser de uno. Si es de más, también se le llama acumulador. (Por ejemplo, suma=suma+lo leido por teclado).

Interruptores: también llamadas switch. Nos indican el estado de algo concreto en un punto del programa. Se llaman así porque funcionan como el botón de encendido, tomando sólo dos valores, true o false. Por ejemplo, la variable booleana en el típico algoritmo de búsqueda con while.

Auxiliares: las anteriores son clasificadas como auxiliares, pero nos referiremos con este nombre a aquellas que nos sirven para almacenar un valor mientras hacemos otras operaciones. Por ejemplo, en el intercambio de valores en los algoritmos de ordenación, en los que para no perder un dato, debemos guardarlo en un sitio auxiliar, para reubicarlo en su sitio adecuado después.

Consejos para afrontar exámenes de programación

Friday, January 26th, 2007

A modo de recopilación de consejos para afrontar un examen de programación….

- Antes de comenzar a programar de forma concreta, es útil hacer un esbozo o esquema del planteamiento que vas a seguir, es decir, el cómo te lo vas a montar. (Las estructuras de datos que necesitarás, qué aspectos o datos has de tener en cuenta en cada momento…). Si comienzas a codificar sin este paso previo, es muy posible que te encuentres con problemas y te vuelvas loco modificando una y otra vez el programa para que funcione, haciéndote perder mucho tiempo.

- Usa funciones y procedimientos, aunque no te lo pidan de forma expresa. Si tienes una parte de código que se repite en el programa, crea un subprograma para tal fin y llámalo cuando te haga falta. Si, aunque sólo la hagas una vez, la tarea es algo concreto, también pásalo a un subprograma. Mejorarás el orden del código y lo tendrás más limpio para no liarte al repasar.

- Si alguna parte te da problemas… que no sabes por dónde abarcar, pásalo a un subprograma,dejando su contenido en blanco y suponiendo que hace lo que tiene que hacer. Si te sobra tiempo, puedes darle vueltas a eso que te falta sin haber perjudicado el resto del programa. En la vida real esta práctica no te servirá de mucho, pero igual en el examen, si tienes todo lo demás correcto, te puntuen positivamente.

- Recuerda no hacer uso de variables globales. Las que necesites en varios subprogramas, pásalas como parámetros. Muestra especial atención al tipo y al orden de parámetros, y si se han de pasar por valor o por referencia. Equivocarse en el paso de parámetros, suele bajar mucha puntuación.

- Ten en cuenta la eficiencia del algoritmo. Un problema puede resolverse de muchas formas, pero intenta resolverlo usando el menor número de recursos. Las vueltas de más que des en un bucle, por ejemplo, es una cosa importante a evitar.

- Si en el ejercicio te dicen un número concreto de datos, por ejemplo, que el máximo posible de registros va a ser 30, casi con toda seguridad tendrás que hacer uso de un array. De lo contrario, tendrás que montartelo de forma que mantengas la integridad del programa. (Por ejemplo, si en un fichero no sabes cuantos registros puede haber, no los pases a memoria (array) salvo que sea estrictamente necesario. Imagina que declaras un array de 1000 elementos y solo hay un registro en el fichero: estarías desaprovechando 999 elementos. Del mismo modo, imagina que hay 1001: no te cabrían en el array).

- Nombra las variables, funciones.. con un mismo criterio (primera letra con minúscula, o que indique de qué tipo es…) y con un nombre claro que la identifique. En programas largos o que no sólo toques tú, se agradecerá, así como será más apetitoso de leer en el examen. Procura tener el código lo más ordenado / estructurado posible, pues la impresión del profesor que evalúe el examen será muy positiva.

- Cuando revises los ejercicios del examen, pon atención en cosas como la correspondencia entre parámetros formales y parámetros actuales, que las variables que usas previamente las has declarado / inicializado, la sintaxis correcta del lenguaje usado… mucha veces se olvida y es algo que resta puntos.

- A programar, se aprende programando, no estudiando. Estudiar sirve para conocer el lenguaje concreto, algoritmos genéricos, estructuras… pero no sabrás usar todo ello si no te enfrentas a los ejercicios papel / compilador en mano.

- De vuelta a las funciones, lee con atención el enunciado. Si te piden que el subprograma ha de devolver un dato (un número, una cadena…), tendrás que hacer una función. (A una función también se le pueden pasar parámetros por referencia). Si lo haces con un procedimiento y está bien, no te lo darán por válido.

- En el típico algoritmo de búsqueda en un array, fichero… con un while, se usa dentro if, pero sin else. Es muy común al principio tender a poner un else. La idea es que el bucle while tenga dos condiciones: la primera que delimite el rango máximo de busqueda (final del array, final del fichero…) y otra que salga del bucle cuando lo haya encontrado. Dentro del bucle, se coloca un if, si en una vuelta encontramos lo que buscamos, salimos del bucle. Y fuera del bucle, preguntamos con if por qué condición se ha salido del while (si por que lo ha encontrado o por que ha llegado hasta el final del array, fichero… sin encontrarlo…)

- También en los bucles hay que poner cuidado en la variable que funciona como contador: que tenga el valor apropiado para que entre en el bucle, que al acceder al elemento de un array (tipo array[j]), j no sea mayor que el tamaño del array, que haya una condición de parada y que alguna vez entre en esa condición de parada…