Sie sind auf Seite 1von 10

Programacion estructurada

Programación
estructurada. Es
un paradigma de programación orientado a mejorar la claridad, calidad y tiempo
de desarrollo de un programa de computadora, utilizando únicamente subrutinas y
tres estructuras: secuencia, selección (if y switch) e iteración (bucles for y while),
considerando innecesario y contraproducente el uso de la instrucción
de transferencia incondicional (GOTO), que podría conducir a "código espagueti",
que es mucho más difícil de seguir y de mantener, y era la causa de
muchos errores de programación.
Surgió en la década de 1960, particularmente del trabajo Böhm y Jacopini, y una
famosa carta, La sentencia goto considerada perjudicial, de Edsger Dijkstra en
1968 y fue reforzado teóricamente por el teorema del programa estructurado, y
prácticamente por la aparición de lenguajes como ALGOL con adecuadas y
ricas estructuras de control.

Orígenes de la programación estructurada


A finales de los años 1970 surgió una nueva forma de programar que no
solamente daba lugar a programas fiables y eficientes, sino que además estaban
escritos de manera que facilitaba su mejor comprensión, no sólo proveyendo
ventajas durante la fase de desarrollo, sino también posibilitando una más sencilla
modificación posterior.
El teorema del programa estructurado, propuesto por Böhm-Jacopini, demuestra
que todo programa puede escribirse utilizando únicamente las tres instrucciones
de control siguientes:

 Secuencia
 Instrucción condicional.
 Iteración (bucle de instrucciones) con condición al principio.

Solamente con estas tres estructuras se pueden escribir todos los programas y
aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor
repertorio de estructuras de control, éstas pueden ser construidas mediante las
tres básicas citadas.

Estructuras
Estructura secuencial
Una estructura de programa es secuencial si las instrucciones se ejecutan una tras
otra, a modo de secuencia lineal; es decir, que una instrucción no se ejecuta hasta
que finaliza la anterior, no se bifurca ni se repite el flujo del programa.
Ejemplo en QBASIC:
' introduzco los datos x y y
INPUT x
INPUT y

' intercambio los valores x y y


auxiliar = x ' guardo una copia del valor de x en au
xiliar
x = y ' guardo el valor de y en x, perdiendo
su valor anterior, pero manteniendo una copia en auxiliar.
y = auxiliar ' copio a y el valor de auxiliar, que e
s el valor inicial de x.

' imprimo las variables (que ahora tienen los valores inte
rcambiados)
PRINT x
PRINT y

Estructura selectiva o de selección


La estructura selectiva permite que la ejecución del programa se bifurque a una
instrucción (o conjunto de ellas). Según un criterio o condición lógica sólo uno de
los caminos en la bifurcación será el tomado para ejecutarse.
Ejemplo en QBASIC:
IF a > b THEN ' si a es mayor que
b
PRINT a ; " es mayor que " ; b ' imprime "a es may
or que b"
ELSE ' de lo contrario
PRINT a ; " no es mayor que " ; b ' imprime "a no es
mayor que b"
END IF
Las palabras clave IF, THEN, ELSE y END IF constituyen la estructura de la
instrucción condicional.

Estructura iterativa
Un bucle iterativo o iteración de una secuencia de instrucciones, hace que se
repita su ejecución mientras se cumpla una condición. El número de iteraciones
normalmente está determinado por un cambio en la condición dentro del mismo
bucle, aunque puede ser forzado o explícito por otra condición.
Ejemplo en QBASIC:
a = 0
b = 7
DO WHILE b > a ' mientras b sea mayor que a
PRINT a ' imprime el valor de a
a = a + 1 ' incrementa 'a' en 1
LOOP
Esta instrucción tiene tres palabras reservadas: DO, WHILE y LOOP, que
conforman un bucle WHILE.

Anidamiento
El cuerpo de cualquier estructura puede tener instrucciones simples u otras
estructuras, que a su vez pueden contener a otras.
Ejemplo en QBASIC:
CLS
INPUT "Valor entero para a:"; a
INPUT "Valor entero para b:"; b

IF a > b THEN
REM hacer intercambio de variables
auxiliar = a
a = b
b = auxiliar

REM imprimir diferencia en escala de uno en uno


DO WHILE auxiliar > a
auxiliar = auxiliar - 1
PRINT auxiliar
LOOP
END IF

PRINT
PRINT a; b
En el ejemplo anterior hay una estructura WHILE anidada dentro de una estructura
IF. -->

Historia
Fundamentación teórica
El teorema del programa estructurado proporciona la base teórica de la
programación estructurada. Señala que tres maneras de combinar programas son
suficientes para expresar cualquier función computable: secuencia, selección e
iteración. Esta observación no se originó con el movimiento de la programación
estructurada. Estas estructuras son suficientes para describir el ciclo de
instrucción de una unidad central de procesamiento, así como el funcionamiento
de una máquina de Turing. Por lo tanto un procesador siempre está ejecutando un
"programa estructurado" en este sentido, incluso si las instrucciones que lee de la
memoria no son parte de un programa estructurado. Sin embargo, los autores
usualmente acreditan el resultado a un documento escrito en 1966 por Böhm y
Jacopini, posiblemente porque Dijkstra había citado este escrito. El teorema del
programa estructurado no responde a cómo escribir y analizar un programa
estructurado de manera útil. Estos temas fueron abordados durante la década de
1960 y principio de los años 1970, con importantes contribuciones
de Dijkstra, Robert W. Floyd, Tony Hoarey y David Gries.

Debate
P. J. Plauger, uno de los primeros en adoptar la programación estructurada,
describió su reacción con el teorema del programa estructurado:
Nosotros los conversos ondeamos esta interesante pizca de noticias bajo las
narices de los recalcitrantes programadores de lenguaje ensamblador que
mantuvieron trotando adelante retorcidos bits de lógica y diciendo, 'Te apuesto
que no puedes estructurar esto'. Ni la prueba por Böhm y Jacopini, ni nuestros
repetidos éxitos en escribir código estructurado, los llevaron un día antes de lo que
estaban listos para convencerse.
Donald Knuth aceptó el principio de que los programas deben escribirse con
demostratividad en mente, pero no estaba de acuerdo (y aún está en desacuerdo)
con la supresión de la sentencia GOTO. En su escrito de 1974 Programación
estructurada con sentencias Goto, dio ejemplos donde creía que un salto directo
conduce a código más claro y más eficiente sin sacrificar demostratividad. Knuth
propuso una restricción estructural más flexible: debe ser posible establecer un
diagrama de flujo del programa con todas las bifurcaciones hacia adelante a la
izquierda, todas las bifurcaciones hacia atrás a la derecha, y sin bifurcaciones que
se crucen entre sí. Muchos de los expertos en teoría de grafos y compiladores han
abogado por permitir sólo grafos de flujo reducible quién cuándo.
Los teóricos de la programación estructurada ganaron a un aliado importante en la
década de 1970 después de que el investigador de IBM Harlan Millsaplicara su
interpretación de la teoría de la programación estructurada para el desarrollo de un
sistema de indexación para el archivo de investigación del New York Times. El
proyecto fue un gran éxito de la ingeniería, y los directivos de otras empresas lo
citaron en apoyo de la adopción de la programación estructurada, aunque Dijkstra
criticó las maneras en que la interpretación de Mills difería de la obra publicada.
Tan tarde como 1987 fue todavía posible elevar la cuestión de la programación
estructurada en una revista de ciencia de la computación. Frank Rubin lo hizo en
ese año, con una carta, La sentencia GOTO considerada dañina. Numerosas
objeciones siguieron, incluyendo una respuesta de Dijkstra, que criticaba
duramente a Rubin y las concesiones que otros escritores hicieron cuando le
respondieron.
Resultado
A finales del siglo XX casi todos los científicos están convencidos de que es útil
aprender y aplicar los conceptos de programación estructurada. Los lenguajes de
programación de alto nivel que originalmente carecían de estructuras de
programación, como "FORTRAN", "COBOL" y "BASIC", ahora las tienen.

Ventajas de la programación estructurada


Ventajas de la programación estructurada comparada con el modelo anterior (hoy
llamado despectivamente código espagueti).

 Los programas son más fáciles de entender, pueden ser leídos de forma
secuencial y no hay necesidad de hacer engorrosos seguimientos en saltos de
líneas (GOTO) dentro de los bloques de código para intentar entender la
lógica.
 La estructura de los programas es clara, puesto que las instrucciones están
más ligadas o relacionadas entre sí.
 Reducción del esfuerzo en las pruebas y depuración. El seguimiento de los
fallos o errores del programa ("debugging") se facilita debido a su estructura
más sencilla y comprensible, por lo que los errores se pueden detectar y
corregir más fácilmente.
 Reducción de los costos de mantenimiento. Análogamente a la depuración,
durante la fase de mantenimiento, modificar o extender los programas resulta
más fácil.
 Los programas son más sencillos y más rápidos de confeccionar.
 Se incrementa el rendimiento de los programadores, comparado con la forma
anterior que utiliza GOTO.

Programación estructurada de bajo nivel


En un bajo nivel, los programas estructurados con frecuencia están compuestos
de simples estructuras de flujo de programa jerárquicas. Estas son secuencia,
selección y repetición:

 "Secuencia" se refiere a una ejecución ordenada de instrucciones.


 En "selección", una de una serie de sentencias es ejecutada dependiendo del
estado del programa. Esto es usualmente expresado con palabras clave como
if..then..else..endif, switch, o case. En algunos lenguajes las palabras clave no
se puede escribir textualmente, pero debe ser delimitada (stropped).
 En la "repetición" se ejecuta una sentencia hasta que el programa alcance un
estado determinado, o las operaciones han sido aplicadas a cada elemento de
una colección. Esto es usualmente expresado con palabras clave como while,
repeat, for o do..until. A menudo se recomienda que cada bucle sólo debe
tener un punto de entrada (y en la programación estructural original, también
sólo un punto de salida, y pocos lenguajes refuerzan esto).
Un lenguaje es descrito como estructurado en bloques cuando tiene una sintaxis
para encerrar estructuras entre palabras clave tipo corchete, como una sentencia
if..fi en ALGOL 68, o una sección de código entre corchetes BEGIN..END, como
en PL/I - o la de llaves {...} de C y muchos otros lenguajes posteriores.

Lenguajes de programación estructurada


Es posible hacer la programación estructurada en cualquier lenguaje de
programación, aunque es preferible usar algo como un lenguaje de programación
procedimental. Algunos de los lenguajes utilizados inicialmente para programación
estructurada incluyen: ALGOL, Pascal, PL/I y Ada – pero la mayoría de los nuevos
lenguajes de programación procedimentales desde entonces han incluido
características para fomentar la programación estructurada y a veces
deliberadamente omiten características en un esfuerzo para hacer más difícil
la programación no estructurada.

Nuevos paradigmas
Posteriormente a la programación estructurada se han creado nuevos paradigmas
tales como la programación modular, la programación orientada a
objetos, programación por capas, etc, y el desarrollo de entornos de programación
que facilitan la programación de grandes aplicaciones y sistemas.

Véase también
 Teorema del programa estructurado
 Diseño estructurado
 Bloque de código
 Estructuras de control
 Programación por procedimientos
 Programación modular
 Programación orientada a objetos

Fuentes

Estructura de un programa
La estructura básica del lenguaje de programación de Arduino es bastante
simple y se compone de al menos dos partes. Estas dos partes necesarias, o
funciones, encierran bloques que contienen declaraciones, estamentos o
instrucciones.
void setup() //Primera Parte
{
estamentos;
}
void loop() //Segunda Parte
{
estamentos;
}

En donde setup() es la parte encargada de recoger la configuración


y loop() es la que contiene el programa que se ejecutará cíclicamente (de ahí
el término loop –bucle-). Ambas funciones son necesarias para que el
programa trabaje.

La función de configuración (setup) debe contener la declaración de las


variables. Es la primera función a ejecutar en el programa, se ejecuta sólo
una vez, y se utiliza para configurar o inicializar pinMode (modo de trabajo
de las E/S), configuración de la comunicación en serie y otras.

La función bucle (loop) siguiente contiene el código que se ejecutara


continuamente (lectura de entradas, activación de salidas, etc) Esta función
es el núcleo de todos los programas de Arduino y la que realiza la mayor
parte del trabajo.

setup()
La función setup() se invoca una sola vez cuando el programa empieza. Se
utiliza para inicializar los modos de trabajo de los pins, o el puerto serie.
Debe ser incluido en un programa aunque no haya declaración que ejecutar.
Así mismo se puede utilizar para establecer el estado inicial de las salidas de
la placa.

void setup()
{
pinMode(pin, OUTPUT); // configura el 'pin' como salida
digitalWrite(pin, HIGH); // pone el ‘pin’ en estado HIGH
}

loop()
Después de llamar a setup(), la función loop() hace precisamente lo que
sugiere su nombre, se ejecuta de forma cíclica, lo que posibilita que el
programa esté respondiendo continuamente ante los eventos que se
produzcan en la placa.

void loop()
{
digitalWrite(pin, HIGH); // pone en uno (on, 5v) el 'pin'
delay(1000); // espera un segundo (1000 ms)
digitalWrite(pin, LOW); // pone en cero (off, 0v.) el 'pin'
delay(1000);
}

funciones
Una función es un bloque de código que tiene un nombre y un conjunto de
instrucciones que son ejecutadas cuando se llama a la función. Son
funciones setup() y loop() de las que ya se ha hablado. Las funciones de
usuario pueden ser escritas para realizar tareas repetitivas y para reducir el
tamaño de un programa. Las funciones se declaran asociadas a un tipo de
valor “type”. Este valor será el que devolverá la función, por ejemplo 'int' se
utilizará cuando la función devuelve un dato numérico de tipo entero. Si la
función no devuelve ningún valor entonces se colocará delante la palabra
“void”, que significa “función vacía”. Después de declarar el tipo de dato que
devuelve la función se debe escribir el nombre de la función y entre
paréntesis se escribirán, si es necesario, los parámetros que se deben pasar a
la función para que se ejecute.

type nombreFunción(parámetros)
{
instrucción;
}

La función siguiente devuelve un número entero, delayVal() se utiliza para


poner un valor de retraso en un programa que lee una variable analógica de
un potenciómetro conectado a una entrada de Arduino. Al principio se
declara como una variable local, 'v' recoge el valor leído del potenciómetro
que estará comprendido entre 0 y 1023, luego se divide el valor por 4 para
ajustarlo a un margen comprendido entre 0 y 255, finalmente se devuelve el
valor 'v' y se retornaría al programa principal. Esta función cuando se
ejecuta devuelve el valor de tipo entero 'v'.

int delayVal()
{
int v; // crea una variable temporal 'v'
v= analogRead(pot); // lee el valor del potenciómetro
v /= 4; // convierte 0-1023 a 0-255
return v; // devuelve el valor final
}

{} entre llaves
Las llaves sirven para definir el principio y el final de un bloque de
instrucciones. Se utilizan para los bloques de programación setup(), loop(),
if.., etc.

type funcion()
{
instrucciones;
}

Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”,
si no es así el programa dará errores.

El entorno de programación de Arduino incluye una herramienta de gran


utilidad para comprobar el total de llaves. Sólo tienes que hacer click en el
punto de inserción de una llave abierta e inmediatamente se marca el
correspondiente cierre de ese bloque (llave cerrada).

; punto y coma
El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de
programación de Arduino. También se utiliza para separar elementos en una
instrucción de tipo “bucle for”.

int x = 13; /* declara la variable 'x' como tipo entero de valor 13 */

Nota: Olvidaos de poner fin a una línea con un punto y coma o se producirá
en un error de compilación. El texto de error puede ser obvio, y se referirá a
la falta de una coma, o puede que no. Si se produce un error raro y de difícil
detección lo primero que debemos hacer es comprobar que los puntos y
comas están colocados al final de las instrucciones.

/*… */ bloque de comentarios


Los bloques de comentarios, o comentarios multi-línea son áreas de texto
ignorados por el programa que se utilizan para las descripciones del código
o comentarios que ayudan a comprender el programa. Comienzan con / * y
terminan con * / y pueden abarcar varias líneas.

/* esto es un bloque de comentario no se debe olvidar


cerrar los comentarios estos deben estar equilibrados */

Debido a que los comentarios son ignorados por el compilador y no ocupan


espacio en la memoria de Arduino pueden ser utilizados con generosidad.
También pueden utilizarse para "comentar" bloques de código con el
propósito de anotar informaciones para depuración y hacerlo mas
comprensible para cualquiera.

Nota: Dentro de una misma línea de un bloque de comentarios NO se puede


escribir otro bloque de comentarios (usando /*..*/).

// línea de comentarios
Una línea de comentario empieza con // y terminan con la siguiente línea de
código. Al igual que los comentarios de bloque, los de línea son ignoradas
por el programa y no ocupan espacio en la memoria.

// esto es un comentario

Una línea de comentario se utiliza a menudo después de una instrucción,


para proporcionar más información acerca de lo que hace ésta o para
recordarla más adelante.

Das könnte Ihnen auch gefallen