Fundamentos de programación

Índice


Introducción
Una máquina es un dispositivo o instrumento físico capaz de realizar un cierto trabajo u operación. Según su funcionamiento:
  • No automáticas: o de control manual, un agente externo desencadena las operaciones.
  •  Automáticas: actúan por sí solas, aunque pueden responder a un estímulo externo.
  • Programables: consta de una parte base fija que se completa con una parte variable, el programa.
Un cómputo es una operación de tratamiento de información. De una información base se obtiene otra como resultado de unos cálculos.

Un computador es una máquina programable para el tratamiento de la información.

La programación es la labor de desarrollar programas. Cuando esta alcanza cotas complejas y se necesita un equipo humano para llevarla a cabo se denomina ingeniería de software. Objetivos de la programación:
  • Corrección: un programa debe realizar el tratamiento esperado y no producir resultados erróneos.
  • Claridad: es muy importante que el código sea claro puesto que es muy probable que un programa tenga que ser modificado después de su primer desarrollo.
  • Eficiencia: los programas eficientes aprovecharán mejor los recursos disponibles y por tanto su empleo será más económico.
Estos objetivos a veces son contrapuestos; a veces para hacer un programa más eficiente hay que introducir complejidad, perdiendo claridad. Obviamente la corrección es el término más importante.

Un lenguaje de programación es la forma de codificar programas en una máquina. A la forma de codificar que puede utilizar una máquina se le denomina código de máquina, que generalmente no se podrá usar en otro modelo de máquina, y son extraordinariamente difíciles de leer por una persona. Los lenguajes de programación sirven para representar simbólicamente el código máquina pudiendo ser leídos más fácilmente por un humana, siendo además independientes de las máquinas particulares que se vayan a usar.

Un compilador un programa que traduce programas de un lenguaje de programación simbólico (código fuente) a código de máquina (programa objeto, ejecutable). La compilación de un programa se hace una vez, y se ejecuta tantas como sean necesarias.

Un intérprete analiza directamente la descripción simbólica del programa fuente y realiza las operaciones conforme las termina. El programa se ejecuta directamente en el intérprete.

Un modelo abstracto de cómputo es un conjunto de conceptos comunes que obtenemos si analizamos un conjunto de lenguajes de programación basados en elementos computaciones similares dejando de lado la notación concreta de cada uno. Un programa puede ser muy diferente en función del modelo usado. Tipos:
  • Modelo funcional: se basa en el empleo de funciones. Las funciones hacen corresponder un conjunto de destino (resultado) a cada elemento de un conjunto de partida (argumentos). Las funciones pueden combinarse unas con otras.
  •  Modelo de flujo de datos: en este modelo un programa corresponde a una red de operadores interconectados entre sí. Un operador espera hasta tener valores presentes en sus entradas y entonces se activa, consume los valores y calcula el resultado enviándolo a la salida
  • Modelo de programación lógica: los elementos conocidos que pueden declarase son hechos y reglas. Un hecho es una relación entre objetos concretos. Una regla es una relación general entre objetos que cumplen ciertas propiedades.
  • Modelo imperativo: lista de órdenes a cumplir. El orden de operaciones puede alterarse mediante el uso de instrucciones de control. Las instrucciones de un programa imperativo pueden hacer uso de valores almacenados en memoria, llamados variables. Se plantea como el cálculo o modificación de sucesivos valores intermedios hasta obtener el resultado final.
Un procesador es una máquina que es capaz de entender las órdenes de un programa y ejecutarlas (llamadas acciones). Para ello utilizará todos los recursos disponibles que le sean necesarios, como aquellos en los que almacenar memoria. A este conjunto de recursos se le denomina entorno.


Tema 2: Elementos básicos de programación
Aclaración: en este resumen todo lo que se habla está particularizado en el lenguaje C±.

Un dato es un elemento de información que puede toma un valor entre varios posibles. Si un dato tiene siempre necesariamente un valor fijo diremos que es una constante. Tipos de valores constantes:
  • Enteros: representan un número exacto de unidades; no pueden tener parte fraccionaria. Si el valor empieza por 0 se considera que el número se está dando en base octal (020=16).
  • Reales: permiten expresar cualquier cantidad. En la notación científica un número real se escribe como una mantisa, que es un número real en la notación decimal habitual, seguida de un factor de escala que se escribe como la letra E seguida del exponente entero de una potencia de 10 por la que se multiplica la mantisa (-23.2E12=-23.2x1012).
  • Caracteres: se escriben ‘x’. Hay que distinguir entre un valor entero de un dígito (ej: 7) y el carácter correspondiente a dicho dígito (ej: ‘7’). Todo carácter que no tenga representación gráfica (como una tabulación, un salto de línea…) tienen secuencias de escape especiales: 
    • '\n': salto al comienzo de una nueva línea de escritura
    • '\r': retorno al comienzo de la misma línea de escritura 
    • '\t': tabulación 
    • '\'': apóstrofo 
    • '\\': barra inclinada 
    • '\f': salto a una nueva página o borrado de pantalla
  • Cadenas de caracteres: secuencia de caracteres incluidos entre comillas dobles.
Dentro de una misma clase de valores pueden definirse varios tipos diferentes, tanto definidos por el usuario como predefinidos en el lenguaje. 
  • Tipo entero (int): Valores enteros positivos y negativos. Los límites se puede consultar con las constantes INT_MIN y INT_MAX que se encuentran en la librería limits.h. Al dividir dos enteros que producen racionales, el resultado se trunca obteniendo el valor más cercano a cero.
  • Tiplo real (float): números reales negativos y positivos. El rango y precisión depende de la plataforma.
  • Tipo carácter (char): un carácter se representa internamente como un código numérico entero. La colección completa se establece en unas tablas llamadas charsets. Interesante el módulo ctype.h, que incluye funciones para facilitar el manejo de caracteres. Las más interesantes: 
    • isalpha( c ): Indica si c es una letra  
    • isascii( c ): Indica si ces un carácter ASCII  
    • isblank( c ): Indica si c es un carácter de espacio o tabulación  
    • iscntrl( c ): Inidica si c es un carácter de control  
    • isdigit( c ): Indica si c es un carácter numérico  
    • islower( c ): Indica si c es minúscula  
    • isspace( c ): Indica si c es espacio en blanco o salto de línea o página
    • isupper( c ): Indica si c es mayúscula   
    • tolower( c ): Devuelve la minúscula correspondiente a c 
    • toupper( c ): Devuelve la mayúscula correspondiente a c
El procedimiento printf pertenece al módulo stdio.h, escribe en la pantalla los datos que obtenga por parámetros. Mediante %x se representan los tipos de datos que no sea texto plano:
d
Entero
Para obtener espacios en blanco para formatear resultados: %5d


Para especificar número de decimales al representar reales: %.4f
f
Real
e
Real con notación exponencial
g
Real con/sin notación exponencial
c
Carácter
s
Cadena de caracteres



Tema 3: Constantes y variables
Los identificadores sirven para hacer referencia a los diferentes elementos que intervienen en un programa, dándoles un nombre a cada uno. Son una palabra formada con caracteres alfabéticos o numéricos, sin espacios en blanco ni signos de puntuación y que debe comenzar por una letra. Pueden usarse las 52 letras mayúsculas y minúsculas del alfabeto inglés, el guión bajo y los números. Se distinguen mayúsculas y minúsculas.

Una constante es un valor fijo. Ejemplo: const float Pi = 3.14159265;

Las variables son el concepto abstracto equivalente a la memoria física de la máquina. Sirven para almacenar en memoria información para ser usada de cualquier modo en cualquier momento cuantas veces sea necesario.

El procedimiento scanf pertenece al módulo stdio.h. Sirve para leer datos de entrada y almacenarlos en determinadas variables:

scanf(“Introducir datos: “, &variable1, &variable2,…);

Importante observar que el nombre de las variables se proceden con un &. Además el primer parámetro debe contener un formato de conversión (%x) por cada variable a leer.

Tema 4: estructuras básicas
La sentencia de selección se programa como una sentencia if que tiene el siguiente formato:

if (condición){
     Acción A
} else {
     Acción B
}

Puede prescindirse del else o anidar todos los else que sean necesarios con elseif (condición).

La estructura de iteración se consigue mediante la sentencia while, que tiene el siguiente formato:

while(condición){
     acción
}

Mientras la condición resulte cierta se ejecuta la acción de forma repetitiva. Cuando el resultado es falso finaliza la ejecución de la sentencia. Si la condición resulta falsa en la primera evaluación la acción no se ejecuta nunca. 

Cuando la ejecución de un bucle va a tener un número fijo determinado de iteraciones se hace uso de la sentencia for:

For(int índice=inicio; índice<=final; índice++)

 
Tema 5: funciones y procedimientos
Un subprograma como su propio nombre indica es un programa que depende de uno padre. Debe usarse cuando un programa es demasiado complejo con el fin de facilitar la visión de su estructura, o bien cuando un proceso se debe ser usado en varias ocasiones.

Una función es un tipo de subprograma que calcula como resultado un valor único a partir de otros valores dados como argumentos. Se declaran:

TipoResultado NombreFuncion ( Tipo1 argumento1, Tipo2 argumento2, …)

Con la sentencia return devolvemos el resultado de una función: return volumen; Esta sentencia finaliza la ejecución de la función.

Una función que no produzca efectos laterales (modificar variable externa) se denomina función pura.

Un procedimiento es un subprograma que realiza una determinada acción. No tiene como objetivo, en general, devolver un valor obtenido por un cálculo.

void NombreProcedimiento (Tipo1 argument1, Tipo2 argumento2, …)

Se puede usar return pero sin ningún valor a devolver para finalizar el procedimiento en un punto deseado.

Existen dos formas de pasar argumentos a un subprograma: 
  • Por valor: Se evalúan las expresiones de los argumentos reales usados en la llamada. Los obtenidos se copian en los formales. Los formales se usan como variables dentro del subprograma sin que afecten de ninguna forma a los reales.
  • Por referencia: se indica en la cabecera del subprograma anteponiendo el símbolo & al nombre del argumento formal. En el subprograma se ejecutarán las sentencias como si los argumentos formales fuesen los reales.
Cuando dentro del bloque de un subprograma se declara un elemento con el mismo nombre que otro elemento global, se pierde la accesibilidad al elemento global. Desaconsejable hacerlo por la claridad del programa.