Diferencia entre revisiones de «Usuario:ManuelRomero/CursoJavaUml/programacionAlgoritmica»
(→Instrucciones secuenciales) |
|||
(No se muestran 38 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | {{:Usuario:ManuelRomero/CursoJavaUml/nav}} | ||
=Conceptos básicos en la programación= | =Conceptos básicos en la programación= | ||
<br> | <br> | ||
Línea 13: | Línea 14: | ||
=== Estructura secuencial === | === Estructura secuencial === | ||
Consiste en poner una instrucción detrás de otras. El orden de ejecución es secuncial y en orden (Excepción a esta regla los procesadores fuera de orden e instrucciones independientes). | Consiste en poner una instrucción detrás de otras. El orden de ejecución es secuncial y en orden (Excepción a esta regla los procesadores fuera de orden e instrucciones independientes). | ||
+ | <br/> | ||
+ | [[Archivo:secuencial.png]] | ||
=== Instrucciones secuenciales === | === Instrucciones secuenciales === | ||
+ | |||
#Inicio/fin | #Inicio/fin | ||
#declaracion | #declaracion | ||
#asignacion | #asignacion | ||
− | #leer/escribir | + | #leer/escribir |
==== Instrucción inicio/fin de bloque ==== | ==== Instrucción inicio/fin de bloque ==== | ||
Un programa es un bloque de instrucciones que tiene un ''inicio'' y un ''fin''. Dentro de este ''bloque'' puede haber muchos bloques. Siempre cada bloque empezará y terminará con una instrucción de inicio /fin bloque respectivamente | Un programa es un bloque de instrucciones que tiene un ''inicio'' y un ''fin''. Dentro de este ''bloque'' puede haber muchos bloques. Siempre cada bloque empezará y terminará con una instrucción de inicio /fin bloque respectivamente | ||
Línea 36: | Línea 40: | ||
En java el bloque '''inicio''' y '''fin''' está especificado con los caracteres '''{ '''y '''}''' respectivamente | En java el bloque '''inicio''' y '''fin''' está especificado con los caracteres '''{ '''y '''}''' respectivamente | ||
− | |||
<source lang=java> | <source lang=java> | ||
void cabecera_de_un_bloque_principal() | void cabecera_de_un_bloque_principal() | ||
{ | { | ||
− | |||
void otro_bloque_B() | void otro_bloque_B() | ||
{ | { | ||
Línea 52: | Línea 54: | ||
{{nota|Algunos lenguajes como '''Python '''usan directamente la indentación como inidicador de inicio/fin de bloque}} | {{nota|Algunos lenguajes como '''Python '''usan directamente la indentación como inidicador de inicio/fin de bloque}} | ||
− | |||
==== Instrucción de declaración ==== | ==== Instrucción de declaración ==== | ||
Sirve para declarar elementos dentro del programa | Sirve para declarar elementos dentro del programa | ||
Línea 74: | Línea 75: | ||
booano o boolean | booano o boolean | ||
Identificador es un nombre que identifica a la variable.Existen reglas para crear los identificadores y éstas dependen del lenguaje para el que estemos escribiendo código. Por ejemplo en PHP tienen que empezar por '''$''' | Identificador es un nombre que identifica a la variable.Existen reglas para crear los identificadores y éstas dependen del lenguaje para el que estemos escribiendo código. Por ejemplo en PHP tienen que empezar por '''$''' | ||
− | En | + | En ''c''los identificadores siguen la siguiente expresión regular |
[a..zA..Z][a..zA..Z|0..9|_]* | [a..zA..Z][a..zA..Z|0..9|_]* | ||
Línea 97: | Línea 98: | ||
// … mas instrucciones | // … mas instrucciones | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | Definición de subprogramas. | ||
+ | Este es un apartado muy importante que trataremos de manera independiente. Sabemos que puedo escribir un subprograma con una parte del código que semánticamente está muy unido y/o se repite varias veces en a lo largo del programa. | ||
+ | sintácticamente un subprograma tiene la siguiente estructura | ||
+ | tipo_valor_retorno idnetificador_subprograma(lista de parámetros) | ||
+ | |||
+ | En java como C todos los subprogramas son funciones. Existen otros lenguajes como pascal donde si ese subprograma va a devolver un valor es una función, pero si no es un procedimiento. | ||
+ | En java como en C, si un subprograma no devuelve nada, en el tipo retorno se pone '''void''' | ||
<source lang=java> | <source lang=java> | ||
− | |||
//Defino un método ''subprograma'' para que calcule la edad a partir de la fecha de nacimiento | //Defino un método ''subprograma'' para que calcule la edad a partir de la fecha de nacimiento | ||
//Observamos que devuelve un entero | //Observamos que devuelve un entero | ||
Línea 108: | Línea 117: | ||
return edad; | return edad; | ||
} | } | ||
− | |||
</source> | </source> | ||
− | |||
− | |||
==== instrucción de asignación ==== | ==== instrucción de asignación ==== | ||
Consiste en asignar un valor a una variable | Consiste en asignar un valor a una variable | ||
− | + | '''a = valor''' | |
− | '''a = valor''' | + | |
− | + | ||
La parte de la izquierda siempre será una variable ''posición de memoria donde almacenaré el valor'' | La parte de la izquierda siempre será una variable ''posición de memoria donde almacenaré el valor'' | ||
− | |||
'''valor '''se puede expresar de diferentes maneras: | '''valor '''se puede expresar de diferentes maneras: | ||
− | |||
* '''literal''' Directamente aporto el '''valor''', '''constante o identificador de variable '''que directamente me da el valor. | * '''literal''' Directamente aporto el '''valor''', '''constante o identificador de variable '''que directamente me da el valor. | ||
− | * '''expresión''' ==> es un predicado con operadores que es evaluado y de su evaluación obtengo un valor. En función de los operadores las expresiones serán de diferente tipo | + | * '''expresión''' ==> es un predicado con operadores que es evaluado y de su evaluación obtengo un valor. En función de los operadores las expresiones serán de diferente tipo |
** e''xpresiones booleanas o lógicas('' operador booleano AND, OR, NOT). Su evaluación me da un valor booleano (VEDAD o FALSO) | ** e''xpresiones booleanas o lógicas('' operador booleano AND, OR, NOT). Su evaluación me da un valor booleano (VEDAD o FALSO) | ||
** ''expresiones aritméticas ''operadores (+,-,*,/,MOD,) (SU EVALUACIÓN ME DA UN NÚMERO) | ** ''expresiones aritméticas ''operadores (+,-,*,/,MOD,) (SU EVALUACIÓN ME DA UN NÚMERO) | ||
** ''expresiones de comparación ''(=,>,<,>=,<=,!=) (Su evaluación me dá un valor booleano VERDAD o FALSO) | ** ''expresiones de comparación ''(=,>,<,>=,<=,!=) (Su evaluación me dá un valor booleano VERDAD o FALSO) | ||
− | * Función o método que retorna dicho valor: Es un bloque de ejecución ''independiente'' que o bien lo escribo yo en otra parte de este bloque o bien ya está disponibles en el conjunto de funciones o bilbiotecas o API que el entorno me ofrece para utilizar directamente. Por ejemplo antes hemos escrito el método '''calculaEdad...''' | + | *'''Función o método''' que retorna dicho valor: Es un bloque de ejecución ''independiente'' que o bien lo escribo yo en otra parte de este bloque o bien ya está disponibles en el conjunto de funciones o bilbiotecas o API que el entorno me ofrece para utilizar directamente. Por ejemplo antes hemos escrito el método '''calculaEdad...''' |
− | + | ||
==== Instrucciones de leer/escribir ==== | ==== Instrucciones de leer/escribir ==== | ||
En realidad aquí depende de los lenguajes, algunos como Pascal y Modula tiene dentro del lenguaje una instrucción para visualizar un texto por la pantalla y otra para leerlo del teclado y asignárselo a una variable. Otros (la mayoría), como Java, C, python,... esta funcionalidad nos la brinda una función de una biblioteca que previamente debe ser cargada. Otros como PHP tienen ambas cosas echo (parte del lenguaje), print función del sistema, ambas para visualizar caracteres por pantalla. En general con cualquier lenguaje podremos: | En realidad aquí depende de los lenguajes, algunos como Pascal y Modula tiene dentro del lenguaje una instrucción para visualizar un texto por la pantalla y otra para leerlo del teclado y asignárselo a una variable. Otros (la mayoría), como Java, C, python,... esta funcionalidad nos la brinda una función de una biblioteca que previamente debe ser cargada. Otros como PHP tienen ambas cosas echo (parte del lenguaje), print función del sistema, ambas para visualizar caracteres por pantalla. En general con cualquier lenguaje podremos: | ||
− | + | visualizar(”cadena de caracteres , valor de variable” + variable+”expresion) | |
− | visualizar(”cadena de caracteres , valor de variable” + variable+”expresion) | + | |
− | + | ||
y para leer un valor que el usuario introduzca por el teclado y almacenarlo en una variable | y para leer un valor que el usuario introduzca por el teclado y almacenarlo en una variable | ||
− | + | leer(variable); | |
+ | Un Ejemplo algoritmicamente quedaría | ||
<source lang=java> | <source lang=java> | ||
− | |||
void MiPrograma | void MiPrograma | ||
+ | principio | ||
+ | visualizar (“Introduce tu edad”); | ||
+ | leer edad; | ||
+ | visualizar (“Tu edad es de”+ edad); | ||
+ | fin | ||
+ | </source> | ||
− | { | + | En java como veremos realizan esta acción los siguientes que se exponen a continuacion. La lectura de datos del teclado es un poco más compleja de entender pero podrímaos ver |
+ | <source lang=java> | ||
+ | void main{ | ||
+ | Scanner linea = new Scanner(System.in); | ||
+ | System.out.println(“Introduce tu edad”); | ||
+ | edad = linea.getInt(); | ||
+ | System.out.println(“Tu edad es de “+edad); | ||
+ | } | ||
+ | </source> | ||
− | visualizar ( | + | ===Estructuras Selectivas=== |
+ | Las instrucciones que introducen las estructuras selectivas permiten ejecutar unas u otras instrucciones en función de que ocurra una situación o no ocurra. | ||
+ | La sintaxis de las instrucciones selectivas son | ||
+ | si (condicion) entonces | ||
+ | bloque | ||
+ | fin_si | ||
+ | [[Archivo:seleccion_1.png]] | ||
+ | De nuevo condición es una ''expresión booleana'' que tras evaluarse obtenemos un valor verdadero o falso. | ||
+ | alternativamente a esta estructura de control tenemos el sino | ||
+ | si (condicion) entonces | ||
+ | bloque_1 | ||
+ | si_no | ||
+ | bloque_2 | ||
+ | fin_si | ||
+ | [[Archivo:seleccion_2.png]] | ||
+ | y también cabe la posibilidad de incluir varios sino_si | ||
+ | si (condicion) entonces | ||
+ | bloque_1 | ||
+ | sino_si (condicion_2) | ||
+ | bloque_2 | ||
+ | sino_si (condicion_3) | ||
+ | bloque_3 | ||
+ | fin_si | ||
+ | Por ejemplo vamos a suponer que queremos ver en función de la edad si alguien es niño(0..11) adolescente(12-16), joven(17.. 29) adulto(30-65) o mayor 66.. | ||
+ | programa di_situacion_edad | ||
+ | inicio | ||
+ | int edad | ||
+ | visualizar 'dime tu edad' | ||
+ | leer (edad); | ||
+ | si (edad<=11) entonces | ||
+ | visualizar 'Que bien, eres un niño'); | ||
+ | sino_si(edad <= 16) entonces | ||
+ | visualizar 'No te enfades demasiado, Ya eres un adolencente'); | ||
+ | sino_si(edad <= 29) entonces | ||
+ | visualizar 'Ahora eres un joven lábrate el futuro'); | ||
+ | sino_si(edad <= 65) entonces | ||
+ | visualizar 'Ya eres todo un adulto'); | ||
+ | sino_si(edad >65) entonces | ||
+ | visualizar 'Eres mayor, !Cuantas cosas has hecho!, Disfruta de la vida'); | ||
+ | fin_si | ||
+ | fin | ||
+ | En este caso las estructuras de control tienden a complicarse en especial en leguajes como java o c donde el sino_si no es en realidad mas que otro si con su inicio y fin de bloque correspondiente. | ||
+ | =====Alternativa a la estructura de control si===== | ||
+ | Si lo que estamos analizando tiene dos situaciones la estructura de control ''si'' vista anteriormente es muy cómoda | ||
+ | Pero cuando tenemos varias situaciones como es el caso anterior, la edad que estamos analizando tiene 4 posibles sitiaciones, puede ser muy complejo gestionarlo con el si, para esta situaciones esta la estructura de control '''caso''' u '''opcion''' o '''con''' tiene diferentes afecciones | ||
+ | caso variable | ||
+ | caso: valor1 | ||
+ | bloque1 | ||
+ | caso: valor2 | ||
+ | bloque2 | ||
+ | caso: valor3 | ||
+ | bloque3 | ||
+ | caso: valor4 | ||
+ | bloque4 | ||
+ | defecto: | ||
+ | bloque_otro_caso | ||
+ | fin_caso | ||
+ | <br/> | ||
+ | [[Archivo:seleccion_3.png]] | ||
+ | <br/> | ||
+ | De modo que el caso anterior nos quedaría. | ||
+ | |||
+ | programa di_situacion_edad | ||
+ | inicio | ||
+ | int edad | ||
+ | visualizar 'dime tu edad' | ||
+ | leer (edad); | ||
+ | caso edad | ||
+ | caso <=11 | ||
+ | visualizar 'Que bien, eres un niño'); | ||
+ | caso <= 16) entonces | ||
+ | visualizar 'No te enfades demasiado, Ya eres un adolencente'); | ||
+ | caso <= 29) entonces | ||
+ | visualizar 'Ahora eres un joven lábrate el futuro'); | ||
+ | caso <= 65) entonces | ||
+ | visualizar 'Ya eres todo un adulto'); | ||
+ | defecto | ||
+ | visualizar 'Eres mayor, !Cuantas cosas has hecho!, Disfruta de la vida'); | ||
+ | fin_caso | ||
+ | fin | ||
+ | Este ejemplo no se aprecia la utilidad y ventaja de usar el '''case''' en casos donde hay varias posibles situaciones, no obstante a lo largo del curso seguro que lo experimentamos. | ||
− | + | ===Estructuras Iterativas o repetitivas=== | |
+ | Este tipo de estructuras permiten '''repetir''' un bloque de ejecución controlado por una determinada condición | ||
+ | Mientras se produzca la condición repito el bloque de control. | ||
+ | La condición es una expresión booleana (Se evalúa y me da cierto o falso) | ||
+ | algorítmicamente sería | ||
+ | mientras (condición) hacer | ||
+ | bloque_instrucciones | ||
+ | fin_mientras | ||
+ | ====Reglas de oro para realizar bucles==== | ||
+ | En condición normalmente evaluamos alguna/s variables. | ||
+ | Debemos tener en cuenta tres reglas de oro para los bucles | ||
− | + | <ol> | |
− | + | <li><p>inicializar la variable de control</p> | |
+ | <p> | ||
+ | Si realizo la comparación y no he inicializado la variable nunca entraré dentro del cueropo del bucle | ||
+ | </p> | ||
+ | <pre> | ||
+ | programa Error_mientras_1 | ||
+ | inicio | ||
+ | caracter seguir | ||
+ | mientras seguir='s' hacer | ||
+ | visualizar 'dime tu edad' | ||
+ | Leer (edad); | ||
+ | visualizar ' te faltan '+(65-edad)+'años para jubilarte'; | ||
+ | visualizar 'quieres seguir' | ||
+ | leer (seguir); | ||
+ | fin_mientras | ||
+ | </pre> | ||
+ | como vemos en este caso nunca entrare al bloque | ||
+ | </li> | ||
+ | <li><p>actualizar dentro del bucle la variable de control</p> | ||
+ | <p> | ||
+ | Si entro en el cuerpo del bucle y no actualizo la variable de control nunca saldré del bucle | ||
+ | </p> | ||
+ | programa Error_mientras_2 | ||
+ | inicio | ||
+ | int veces; | ||
+ | veces = 1 | ||
+ | mientras veces < 10 hacer | ||
+ | visualizar 'dime tu edad' | ||
+ | Leer (edad); | ||
+ | visualizar ' te faltan '+(65-edad)+'años para jubilarte'; | ||
+ | fin_mientras | ||
− | </ | + | En este caso nunca saldría del bucle produciéndose una situación de '''bucle infinito''' |
+ | </li> | ||
+ | </ol> | ||
+ | #realizar correctamente la condicion | ||
+ | consite en tener cuidado con la condición <, <=... | ||
+ | por ejemplo si quiero visualizar la tabla de multiplicar normal 2*1... 2*10 | ||
+ | programa Error_mientras_3 | ||
+ | inicio | ||
+ | int veces; | ||
+ | int tabla; | ||
+ | veces = 1 | ||
+ | visualizar 'dime un número para sacar su tabla de multiplicar' | ||
+ | Leer (tabla); | ||
+ | mientras veces < 10 hacer | ||
+ | visualizar (tabla +'*'+ veces +'='+tabla*veces); | ||
+ | veces = veces+1; | ||
+ | fin_mientras | ||
+ | Observamos que imprimiría si introducimos el 2 | ||
+ | 2*1=2 2*2=4,.. 2*9=18 | ||
+ | y nos faltaría el 2*10 por que la condición no debería de ser < estricto sino <= | ||
+ | Es cierte que de todos este es el error menos malo, pero dependiendo de situaciones puede ser incluso peor que los anteriores, ya que aparentemente tu programa funciona bien, pero el valor que te retorna es incorrecto :( | ||
− | En | + | ====Tipos de bucles==== |
+ | En realidad cualquier situación iterativa se puede hacer con la estructura '''mientras''' vista anteriormente. | ||
+ | pero existen situaciones en las que ya sabemos de antemano antes de ejecutar el bucle cuantas veces lo vamos a hacer. | ||
+ | #Bucle '''para''' | ||
+ | Para esta situaciones esta la estructura de control '''para''' que a continuación exponemos | ||
+ | como en el caso anterior con la tabla de multiplicar | ||
+ | programa Iteracion_Para | ||
+ | inicio | ||
+ | int veces; | ||
+ | int tabla; | ||
+ | visualizar 'dime un número para sacar su tabla de multiplicar' | ||
+ | Leer (tabla); | ||
+ | para veces = 1 hasta veces = 10 hacer | ||
+ | visualizar (tabla +'*'+ veces +'='+tabla*veces); | ||
+ | fin_para | ||
+ | Como vemos en este caso no tengo que inicializar la variable antes del bucle ni actualizarla dentro | ||
+ | La inicialización se hace en la cabecera | ||
+ | La actualización es transparente al programador (la realiza el cuerpo del bucle) | ||
+ | El número de veces puede ser una variable, no ha de ser conocido en tiempo de compilación. | ||
+ | Por ejemplo el siguiente bucle calcula el sumatorio de n números (desde el 1 hasta n: 1+2+3+4+...) | ||
+ | programa Iteracion_para_2 | ||
+ | inicio | ||
+ | int numNumeros; | ||
+ | int numero; | ||
+ | int total = 0; | ||
+ | visualizar 'dime hasta que número quieres sumar' | ||
+ | Leer (numNumeros); | ||
+ | para numero = 1 hasta numero = numNumeros hacer | ||
+ | total=total+numero | ||
+ | fin_para | ||
+ | visualizar 'el sumatorio desde 1 hasta'+numNumeros+'es'+total | ||
+ | fin | ||
− | + | #Bucle '''hacer''' | |
+ | Hay situaciones en las que sé de antemano que por lo menos una vez sí que se va a ejecutar el cuerpo del bucle. | ||
+ | En estos casos hacer la primera vez una comparación es innecesario. | ||
+ | Para ahorrar esta instrucción, se desarrollo la estructura de control hacer ... hasta que, en la cual la condición de evaluación del bucle se hacer al final del cuerpo del bucle. | ||
+ | Supongamos que le programa quiere visualziar los años para jubilarse de 1 o varias personas. | ||
+ | programa Iteracion_hacer_1 | ||
+ | inicio | ||
+ | caracter seguir | ||
+ | hacer | ||
+ | visualizar 'dime tu edad' | ||
+ | Leer (edad); | ||
+ | visualizar ' te faltan '+(65-edad)+'años para jubilarte'; | ||
+ | visualizar 'quieres seguir' | ||
+ | leer (seguir); | ||
+ | hasta que seguir ='n'; | ||
+ | Como vemos en este caso no hay que inicializar la variable fuera del bucle, sino que se hace en la primera iteración del bucle. | ||
− | |||
− | |||
− | |||
− | </ | + | =LENGUAJES DE PROGRAMACION= |
− | + | <br/> | |
− | Conjunto de '''lexemas''' que se combinan siguiente unas reglas de construcción o '''sintaxis''' y que tienen un significado definido o '''semántica''' que se emplea para expresar un algoritmo | + | {{Definicion| |
− | + | Conjunto de '''lexemas''' que se combinan siguiente unas reglas de construcción o '''sintaxis''' y que tienen un significado definido o '''semántica''' que se emplea para expresar un algoritmo}} | |
− | + | *Dicho ''algoritmo'' es codificado en un ''lenguaje'', constituyendo un ''programa'' escrito en ese leguaje de alto nivel. | |
+ | *El programa una máquina computacional no puede ser capaz de ejecutar | ||
+ | *El lenguaje va acompañado de uno o varios programas (compilador o interprete )que es capaz de generar código máquina a partir del programa expresado en el lenguaje de alto nivel | ||
+ | ==Niveles de lenguajes == | ||
En función de la proximidad de compresión del lenguaje al lenguaje humano se puede hablar de tres niveles de lenguajes de programación. | En función de la proximidad de compresión del lenguaje al lenguaje humano se puede hablar de tres niveles de lenguajes de programación. | ||
− | + | ;Alto nivel | |
− | El lenguaje utiliza lexemas y estructuras sintácticas similares al utilizado en el lenguaje humano | + | :El lenguaje utiliza lexemas y estructuras sintácticas similares al utilizado en el lenguaje humano |
;Bajo nivel | ;Bajo nivel | ||
− | El lenguaje es más próximo a la máquina. Aunque se pueden utilizar lexemas como es el caso de ensamblador, éstos tienen una traducción directa al código máquina 0's y 1's | + | :El lenguaje es más próximo a la máquina. Aunque se pueden utilizar lexemas como es el caso de ensamblador, éstos tienen una traducción directa al código máquina 0's y 1's |
;Nivel de lenguaje máquina | ;Nivel de lenguaje máquina | ||
Conjunto de 0'1 y 1's que corresponden a códigos binarios que el procesador es capaz de entender y ejecutar | Conjunto de 0'1 y 1's que corresponden a códigos binarios que el procesador es capaz de entender y ejecutar | ||
− | + | *También es posible encontra lenguajes como 'c' que se consideran de ''nivel medio¡¡, si bien por su expresibidad son lenguajes de alto nivel, el hecho de que tenga la posibilidad de insertar ensamblador o especificar el acceso directo a registros del procesador, hace que se consideren lenguaje de nivel medio | |
− | + | ===Proceso de transformación=== | |
+ | Entendemos por tal el hecho de pasar de código de alto nivel a código máquina. | ||
+ | Este proceso puede ser una mera traducción como es el caso de pasar de ensamblador a código máquina, o ser un proceso más complejo. | ||
+ | ====Lenguajes compilados==== | ||
+ | |||
+ | generando primero el obj que es binario, pero aún falta enlazar librerías y resolver direccionamiento relativo a direecionamiento absoluto. esta tarea la hace el link que genera el .exe | ||
+ | |||
+ | |||
;Lenguajes interpretados | ;Lenguajes interpretados | ||
;Java un caso especial: lenguaje semicompilado | ;Java un caso especial: lenguaje semicompilado | ||
Línea 182: | Línea 388: | ||
===Ejemplos=== | ===Ejemplos=== | ||
Existen diferentes modos de expresar un algoritmo | Existen diferentes modos de expresar un algoritmo | ||
− | + | Por ejemplo con un ordinograma como la siguiente imagen o seudocódigo como ya hemos visto | |
− | + | [[Archivo:Algoritmo.png|150px|left]] | |
− | + | <br/> | |
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
+ | <br/> | ||
− | = | + | ==FORMAS DE PROGRAMAR: '''PARADIGMAS DE LA PROGRAMACION'''== |
===Concepto=== | ===Concepto=== | ||
− | {{Pregunta| | + | <br/> |
− | + | {{Pregunta|qué es un Paradigma}} | |
*'''Paradigma''' de programa es un conjunto de técnicas o filosofías bien definidas que usamos para realizar programación. | *'''Paradigma''' de programa es un conjunto de técnicas o filosofías bien definidas que usamos para realizar programación. | ||
*No quiere decir que un programa siempre siga un paradigma concreto, puede seguir varios. | *No quiere decir que un programa siempre siga un paradigma concreto, puede seguir varios. | ||
Línea 197: | Línea 414: | ||
*Cuando hablamos de '''paradigmas de la programación''' intentamos descubrir las diferentes formas de ''enfocar y desarrollar'' la programación atendiendo a determinadas reglas | *Cuando hablamos de '''paradigmas de la programación''' intentamos descubrir las diferentes formas de ''enfocar y desarrollar'' la programación atendiendo a determinadas reglas | ||
− | + | ===Paradigmas en la programacion=== | |
+ | #'''Imperativo o procedimental''': Es el paradigma más común y que más líneas de código tiene actualmente en ejecución. Está basado en Datos+instrucciones. Se modula abstrayendo código en subprogramas (procedimientos y funciones). Ejemplos de lenguajes tenemos C, Cobol, Basic, Pascal, Modula, … | ||
+ | #'''Funcional''': En este tipo de paradigma se usan funciones. Todo son funciones Ejemplo Lisp (programación de listas) Suelen se recursivos. Otros ejemplos Scheme o Haskell. | ||
+ | #'''Lógico''': está representado por Prolog. Basados en reglas y hechos para luego plantear preguntas, que se resuelven aplicando la lógica(Basados en lógica aristotélica Vs lógica borrosa | ||
+ | #'''ORIENTADO A OBJETOS''': está representado por Smalltalk (primer lenguaje de programación orientado a objetos puro)Ejemplos de estos lenguajes C++, Java, estos ¿Son puros? cuestiones pragmáticas | ||
+ | #'''Concurrente''' basados en tipos abstractos de datos y permitiendo paralelizar la ejecución de procesos evitando problemas de carreras producidos por recursos o por datos. | ||
===Paradigma imperativo== | ===Paradigma imperativo== | ||
Línea 211: | Línea 433: | ||
===Paradigma imperativo== | ===Paradigma imperativo== | ||
El siguiente ejemplo no completo en su solución (dado que hay dos soluciones y que puede ser que no sean reales sino complejas conjugadas), ilustra como procedemos de forma imperativa usando datos e instrucciones para realizar un programa. | El siguiente ejemplo no completo en su solución (dado que hay dos soluciones y que puede ser que no sean reales sino complejas conjugadas), ilustra como procedemos de forma imperativa usando datos e instrucciones para realizar un programa. | ||
− | [[Archivo:PROGRAMA1.png]] | + | <br/> |
+ | [[Archivo:PROGRAMA1.png|500px]] | ||
+ | <br> | ||
===Paradigma imperativo=== | ===Paradigma imperativo=== | ||
− | *Modulacion | + | |
+ | *Modulacion es una forma de utilziar la programacion estructurada de forma efectiva y organizada | ||
''''DIVIDE Y VENCERAS'''' | ''''DIVIDE Y VENCERAS'''' | ||
**Dividir el problema a resolver en partes mas pequeñas o subproblemas. | **Dividir el problema a resolver en partes mas pequeñas o subproblemas. | ||
Línea 220: | Línea 445: | ||
**Es una filosibía de ''''Divides y vencerás''' | **Es una filosibía de ''''Divides y vencerás''' | ||
**Es más fácil resolver un problema sencillo que uno complejo | **Es más fácil resolver un problema sencillo que uno complejo | ||
− | **Es efectivo y | + | **Es efectivo y práctico |
− | + | *Me permito afirmar que la programacion Orientada a Objetos en gran parte tiene mucha base en la programación modular | |
− | + | *Veremos como la POO está basado en ''programar clases'' '''futuras instancias de objetos''' | |
− | + | La programación de clases se realiza con programación estructurada y modular, por lo que debemos de saber programar de forma estructurada y modular | |
− | + |
Última revisión de 02:17 4 feb 2015
Conceptos básicos en la programación
|
Algunas conceptos previas
- Tipo de dato conjunto de valores para los cuales hay definidos una serie de operaciones
- Variable posición de menoria o registro identificado con un nombre (identificador)cuyo contenido va a almacenar un valor de un determinado tipo que puede ser modificado durante la ejecución de un programa
- Constante poscición de memoria o registro identificado con un nombre cuyo valor no puede ser modificado durante la ejecución de un programa
- Instruccion operacción que indica al procesador la acción que tiene que realizar, siendo ésta una de las características del procesador su set de instrucciones
- Estructura de control Establecen el flujo de ejecución de un programa. Es decir las instrucciones se va a establecer dentro del programa. Un programa visto como un conjunto de instrucciones deberá tener unas determinadas estructuras de control que me permitan establecer el flujo de ejecución del mismo. En mayo de 1.966, dos matemáticos 'Bôhm y Jacopini' demostraron que un programa que algorítmicamente tuviera solución puede ser escrito utilizando solamente tres tipos de estructuras de control
- Sentencias o estructuras de control:
- Sentencias secuenciales
- Sentencias iterativas o repetitivas
- Sentencias selectivas
Estructras de control
Estructura secuencial
Consiste en poner una instrucción detrás de otras. El orden de ejecución es secuncial y en orden (Excepción a esta regla los procesadores fuera de orden e instrucciones independientes).
Instrucciones secuenciales
- Inicio/fin
- declaracion
- asignacion
- leer/escribir
Instrucción inicio/fin de bloque
Un programa es un bloque de instrucciones que tiene un inicio y un fin. Dentro de este bloque puede haber muchos bloques. Siempre cada bloque empezará y terminará con una instrucción de inicio /fin bloque respectivamente
programa MiPrograma
inicio
bloque_dentro_de_mi_programa
inicio
instruciones
fin
...
instrucciones
fin
En java el bloque inicio y fin está especificado con los caracteres { y } respectivamente
void cabecera_de_un_bloque_principal() { void otro_bloque_B() { //instricciones_bloque_B } //instrucciones del bloque princial }
Muy importante es la indentación es decir que todas las instrucciones de un determinado bloque vayan indentadas a un mismo nivel, con el mismo margen. Cada nuevo nivel de bloque aumento la sangría o margen. Si cierro el bloque vuelvo a niveles anteriores.
(: Algunos lenguajes como Python usan directamente la indentación como inidicador de inicio/fin de bloque)
Instrucción de declaración
Sirve para declarar elementos dentro del programa En un programa se pueden declarar
- variables
- constantes
- subprogramas (funciones, procedimientos. En terminología OO métodos)
- En este apartado hay que saber que depende del lenguaje de programacion.
- En función del lenguaje de programación, las variables deben de ser declaradas antes de usarlas (lenguajes fuertemente tipados). Existen otros lenguajes, que si bien los valores con los que trabaja siempre tienen un tipo, este no ha de ser declarado antes de utilizarlo, si no que implícitamete es declarada la primera vez que se utiliza.
La forma de realizar una declaración de variable será
tipo_variables identificador_variable
Necesito declarar el tipo para saber cuanto espacio de memoria debo reservar para almacer el valor de la variable. por ejemplo en un entero puede ser que necesite 2 bytes, pero en un float 8 bytes
identificador_constante = valor
Respecto a los tipos de variable, en otro apartado realizaremos una clasificación más estricta, pero de momento podemos considear
entero o int cadena_caracteres o String real o float booano o boolean
Identificador es un nombre que identifica a la variable.Existen reglas para crear los identificadores y éstas dependen del lenguaje para el que estemos escribiendo código. Por ejemplo en PHP tienen que empezar por $ En clos identificadores siguen la siguiente expresión regular
[a..zA..Z][a..zA..Z|0..9|_]*
Veamos ejemplos de declaración de variables
//Declaramos tres variables (edad, nombre, raiz) de los tipos que precede (entero, string o cadena de caracteres y real o float) int edad; String nombre; float raiz;
Ejemplos de declaración de constantes En principio en la constante no necesito saber el tipo con lo que en muchos lenguajes directamente uso identificador y valor
constante IVA = 3.14; constante MESES = 12;
En java sí que necesito el tipo, ya que no tengo por qué inicializar la constante en el momento de su definición sino en cualquier momento. Eso si, una vez inicializada ya no puedo modificar su valor (como buena constante que es)
//Defino una constante { final float IVA = 3.14; fina int MESES = 12; final float pi = 3.1416; // … mas instrucciones }
Definición de subprogramas. Este es un apartado muy importante que trataremos de manera independiente. Sabemos que puedo escribir un subprograma con una parte del código que semánticamente está muy unido y/o se repite varias veces en a lo largo del programa. sintácticamente un subprograma tiene la siguiente estructura
tipo_valor_retorno idnetificador_subprograma(lista de parámetros)
En java como C todos los subprogramas son funciones. Existen otros lenguajes como pascal donde si ese subprograma va a devolver un valor es una función, pero si no es un procedimiento. En java como en C, si un subprograma no devuelve nada, en el tipo retorno se pone void
//Defino un método ''subprograma'' para que calcule la edad a partir de la fecha de nacimiento //Observamos que devuelve un entero int calculaEdad(Date fnac) { Date fecha = new Date(); int edad; edad = fnac-fecha; return edad; }
instrucción de asignación
Consiste en asignar un valor a una variable
a = valor
La parte de la izquierda siempre será una variable posición de memoria donde almacenaré el valor valor se puede expresar de diferentes maneras:
- literal Directamente aporto el valor, constante o identificador de variable que directamente me da el valor.
- expresión ==> es un predicado con operadores que es evaluado y de su evaluación obtengo un valor. En función de los operadores las expresiones serán de diferente tipo
- expresiones booleanas o lógicas( operador booleano AND, OR, NOT). Su evaluación me da un valor booleano (VEDAD o FALSO)
- expresiones aritméticas operadores (+,-,*,/,MOD,) (SU EVALUACIÓN ME DA UN NÚMERO)
- expresiones de comparación (=,>,<,>=,<=,!=) (Su evaluación me dá un valor booleano VERDAD o FALSO)
- Función o método que retorna dicho valor: Es un bloque de ejecución independiente que o bien lo escribo yo en otra parte de este bloque o bien ya está disponibles en el conjunto de funciones o bilbiotecas o API que el entorno me ofrece para utilizar directamente. Por ejemplo antes hemos escrito el método calculaEdad...
Instrucciones de leer/escribir
En realidad aquí depende de los lenguajes, algunos como Pascal y Modula tiene dentro del lenguaje una instrucción para visualizar un texto por la pantalla y otra para leerlo del teclado y asignárselo a una variable. Otros (la mayoría), como Java, C, python,... esta funcionalidad nos la brinda una función de una biblioteca que previamente debe ser cargada. Otros como PHP tienen ambas cosas echo (parte del lenguaje), print función del sistema, ambas para visualizar caracteres por pantalla. En general con cualquier lenguaje podremos:
visualizar(”cadena de caracteres , valor de variable” + variable+”expresion)
y para leer un valor que el usuario introduzca por el teclado y almacenarlo en una variable
leer(variable);
Un Ejemplo algoritmicamente quedaría
void MiPrograma principio visualizar (“Introduce tu edad”); leer edad; visualizar (“Tu edad es de”+ edad); fin
En java como veremos realizan esta acción los siguientes que se exponen a continuacion. La lectura de datos del teclado es un poco más compleja de entender pero podrímaos ver
void main{ Scanner linea = new Scanner(System.in); System.out.println(“Introduce tu edad”); edad = linea.getInt(); System.out.println(“Tu edad es de “+edad); }
Estructuras Selectivas
Las instrucciones que introducen las estructuras selectivas permiten ejecutar unas u otras instrucciones en función de que ocurra una situación o no ocurra. La sintaxis de las instrucciones selectivas son
si (condicion) entonces bloque fin_si
De nuevo condición es una expresión booleana que tras evaluarse obtenemos un valor verdadero o falso. alternativamente a esta estructura de control tenemos el sino
si (condicion) entonces bloque_1 si_no bloque_2 fin_si
y también cabe la posibilidad de incluir varios sino_si
si (condicion) entonces bloque_1 sino_si (condicion_2) bloque_2 sino_si (condicion_3) bloque_3 fin_si
Por ejemplo vamos a suponer que queremos ver en función de la edad si alguien es niño(0..11) adolescente(12-16), joven(17.. 29) adulto(30-65) o mayor 66..
programa di_situacion_edad inicio int edad visualizar 'dime tu edad' leer (edad); si (edad<=11) entonces visualizar 'Que bien, eres un niño'); sino_si(edad <= 16) entonces visualizar 'No te enfades demasiado, Ya eres un adolencente'); sino_si(edad <= 29) entonces visualizar 'Ahora eres un joven lábrate el futuro'); sino_si(edad <= 65) entonces visualizar 'Ya eres todo un adulto'); sino_si(edad >65) entonces visualizar 'Eres mayor, !Cuantas cosas has hecho!, Disfruta de la vida'); fin_si fin
En este caso las estructuras de control tienden a complicarse en especial en leguajes como java o c donde el sino_si no es en realidad mas que otro si con su inicio y fin de bloque correspondiente.
Alternativa a la estructura de control si
Si lo que estamos analizando tiene dos situaciones la estructura de control si vista anteriormente es muy cómoda Pero cuando tenemos varias situaciones como es el caso anterior, la edad que estamos analizando tiene 4 posibles sitiaciones, puede ser muy complejo gestionarlo con el si, para esta situaciones esta la estructura de control caso u opcion o con tiene diferentes afecciones
caso variable caso: valor1 bloque1 caso: valor2 bloque2 caso: valor3 bloque3 caso: valor4 bloque4 defecto: bloque_otro_caso fin_caso
De modo que el caso anterior nos quedaría.
programa di_situacion_edad inicio int edad visualizar 'dime tu edad' leer (edad); caso edad caso <=11 visualizar 'Que bien, eres un niño'); caso <= 16) entonces visualizar 'No te enfades demasiado, Ya eres un adolencente'); caso <= 29) entonces visualizar 'Ahora eres un joven lábrate el futuro'); caso <= 65) entonces visualizar 'Ya eres todo un adulto'); defecto visualizar 'Eres mayor, !Cuantas cosas has hecho!, Disfruta de la vida'); fin_caso fin
Este ejemplo no se aprecia la utilidad y ventaja de usar el case en casos donde hay varias posibles situaciones, no obstante a lo largo del curso seguro que lo experimentamos.
Estructuras Iterativas o repetitivas
Este tipo de estructuras permiten repetir un bloque de ejecución controlado por una determinada condición Mientras se produzca la condición repito el bloque de control. La condición es una expresión booleana (Se evalúa y me da cierto o falso) algorítmicamente sería
mientras (condición) hacer bloque_instrucciones fin_mientras
Reglas de oro para realizar bucles
En condición normalmente evaluamos alguna/s variables. Debemos tener en cuenta tres reglas de oro para los bucles
inicializar la variable de control
Si realizo la comparación y no he inicializado la variable nunca entraré dentro del cueropo del bucle
programa Error_mientras_1 inicio caracter seguir mientras seguir='s' hacer visualizar 'dime tu edad' Leer (edad); visualizar ' te faltan '+(65-edad)+'años para jubilarte'; visualizar 'quieres seguir' leer (seguir); fin_mientras
como vemos en este caso nunca entrare al bloque
actualizar dentro del bucle la variable de control
Si entro en el cuerpo del bucle y no actualizo la variable de control nunca saldré del bucle
programa Error_mientras_2 inicio int veces; veces = 1 mientras veces < 10 hacer visualizar 'dime tu edad' Leer (edad); visualizar ' te faltan '+(65-edad)+'años para jubilarte'; fin_mientras
En este caso nunca saldría del bucle produciéndose una situación de bucle infinito
- realizar correctamente la condicion
consite en tener cuidado con la condición <, <=... por ejemplo si quiero visualizar la tabla de multiplicar normal 2*1... 2*10
programa Error_mientras_3 inicio int veces; int tabla; veces = 1 visualizar 'dime un número para sacar su tabla de multiplicar' Leer (tabla); mientras veces < 10 hacer visualizar (tabla +'*'+ veces +'='+tabla*veces); veces = veces+1; fin_mientras
Observamos que imprimiría si introducimos el 2
2*1=2 2*2=4,.. 2*9=18
y nos faltaría el 2*10 por que la condición no debería de ser < estricto sino <= Es cierte que de todos este es el error menos malo, pero dependiendo de situaciones puede ser incluso peor que los anteriores, ya que aparentemente tu programa funciona bien, pero el valor que te retorna es incorrecto :(
Tipos de bucles
En realidad cualquier situación iterativa se puede hacer con la estructura mientras vista anteriormente. pero existen situaciones en las que ya sabemos de antemano antes de ejecutar el bucle cuantas veces lo vamos a hacer.
- Bucle para
Para esta situaciones esta la estructura de control para que a continuación exponemos como en el caso anterior con la tabla de multiplicar
programa Iteracion_Para inicio int veces; int tabla; visualizar 'dime un número para sacar su tabla de multiplicar' Leer (tabla); para veces = 1 hasta veces = 10 hacer visualizar (tabla +'*'+ veces +'='+tabla*veces); fin_para
Como vemos en este caso no tengo que inicializar la variable antes del bucle ni actualizarla dentro La inicialización se hace en la cabecera La actualización es transparente al programador (la realiza el cuerpo del bucle) El número de veces puede ser una variable, no ha de ser conocido en tiempo de compilación. Por ejemplo el siguiente bucle calcula el sumatorio de n números (desde el 1 hasta n: 1+2+3+4+...)
programa Iteracion_para_2 inicio int numNumeros; int numero; int total = 0; visualizar 'dime hasta que número quieres sumar' Leer (numNumeros); para numero = 1 hasta numero = numNumeros hacer total=total+numero fin_para visualizar 'el sumatorio desde 1 hasta'+numNumeros+'es'+total fin
- Bucle hacer
Hay situaciones en las que sé de antemano que por lo menos una vez sí que se va a ejecutar el cuerpo del bucle. En estos casos hacer la primera vez una comparación es innecesario. Para ahorrar esta instrucción, se desarrollo la estructura de control hacer ... hasta que, en la cual la condición de evaluación del bucle se hacer al final del cuerpo del bucle. Supongamos que le programa quiere visualziar los años para jubilarse de 1 o varias personas.
programa Iteracion_hacer_1 inicio caracter seguir hacer visualizar 'dime tu edad' Leer (edad); visualizar ' te faltan '+(65-edad)+'años para jubilarte'; visualizar 'quieres seguir' leer (seguir); hasta que seguir ='n';
Como vemos en este caso no hay que inicializar la variable fuera del bucle, sino que se hace en la primera iteración del bucle.
LENGUAJES DE PROGRAMACION
Conjunto de lexemas que se combinan siguiente unas reglas de construcción o sintaxis y que tienen un significado definido o semántica que se emplea para expresar un algoritmo |
- Dicho algoritmo es codificado en un lenguaje, constituyendo un programa escrito en ese leguaje de alto nivel.
- El programa una máquina computacional no puede ser capaz de ejecutar
- El lenguaje va acompañado de uno o varios programas (compilador o interprete )que es capaz de generar código máquina a partir del programa expresado en el lenguaje de alto nivel
Niveles de lenguajes
En función de la proximidad de compresión del lenguaje al lenguaje humano se puede hablar de tres niveles de lenguajes de programación.
- Alto nivel
- El lenguaje utiliza lexemas y estructuras sintácticas similares al utilizado en el lenguaje humano
- Bajo nivel
- El lenguaje es más próximo a la máquina. Aunque se pueden utilizar lexemas como es el caso de ensamblador, éstos tienen una traducción directa al código máquina 0's y 1's
- Nivel de lenguaje máquina
Conjunto de 0'1 y 1's que corresponden a códigos binarios que el procesador es capaz de entender y ejecutar
- También es posible encontra lenguajes como 'c' que se consideran de nivel medio¡¡, si bien por su expresibidad son lenguajes de alto nivel, el hecho de que tenga la posibilidad de insertar ensamblador o especificar el acceso directo a registros del procesador, hace que se consideren lenguaje de nivel medio
Proceso de transformación
Entendemos por tal el hecho de pasar de código de alto nivel a código máquina. Este proceso puede ser una mera traducción como es el caso de pasar de ensamblador a código máquina, o ser un proceso más complejo.
Lenguajes compilados
generando primero el obj que es binario, pero aún falta enlazar librerías y resolver direccionamiento relativo a direecionamiento absoluto. esta tarea la hace el link que genera el .exe
- Lenguajes interpretados
- Java un caso especial
- lenguaje semicompilado
- Para que programar
Ejemplos
Existen diferentes modos de expresar un algoritmo Por ejemplo con un ordinograma como la siguiente imagen o seudocódigo como ya hemos visto
FORMAS DE PROGRAMAR: PARADIGMAS DE LA PROGRAMACION
Concepto
- Paradigma de programa es un conjunto de técnicas o filosofías bien definidas que usamos para realizar programación.
- No quiere decir que un programa siempre siga un paradigma concreto, puede seguir varios.
- Las implementaciones de programas en alto nivel se realizan usando un lenguaje de programación (o varios) concretos.
- Un mismo lenguaje se puede usar para diferentes paradigmas
- Cuando hablamos de paradigmas de la programación intentamos descubrir las diferentes formas de enfocar y desarrollar la programación atendiendo a determinadas reglas
Paradigmas en la programacion
- Imperativo o procedimental: Es el paradigma más común y que más líneas de código tiene actualmente en ejecución. Está basado en Datos+instrucciones. Se modula abstrayendo código en subprogramas (procedimientos y funciones). Ejemplos de lenguajes tenemos C, Cobol, Basic, Pascal, Modula, …
- Funcional: En este tipo de paradigma se usan funciones. Todo son funciones Ejemplo Lisp (programación de listas) Suelen se recursivos. Otros ejemplos Scheme o Haskell.
- Lógico: está representado por Prolog. Basados en reglas y hechos para luego plantear preguntas, que se resuelven aplicando la lógica(Basados en lógica aristotélica Vs lógica borrosa
- ORIENTADO A OBJETOS: está representado por Smalltalk (primer lenguaje de programación orientado a objetos puro)Ejemplos de estos lenguajes C++, Java, estos ¿Son puros? cuestiones pragmáticas
- Concurrente basados en tipos abstractos de datos y permitiendo paralelizar la ejecución de procesos evitando problemas de carreras producidos por recursos o por datos.
=Paradigma imperativo
Este paradigma presenta dos partes diferenciadas:
- una estática
- una dinámica:
- Parte estática:
- ValoresTipos de datos, variables y constantes. Independientemente de que el lenguaje sea no tipado (C, Modula, Pascal Vs PHP, Python,) o más fuertemente tipado (c), o más débilmente tipado (Basic),
- En memoria almacenamos los valores de los datos con los que estamos trabajando dentro del programa. Estos valores los utilizan y modifica la parte dinámica del programa.
- Parte dinámica: Procedimientos y funciones
- Conjuntos de instrucciones que operan sobre valores y realizan acciones
=Paradigma imperativo
El siguiente ejemplo no completo en su solución (dado que hay dos soluciones y que puede ser que no sean reales sino complejas conjugadas), ilustra como procedemos de forma imperativa usando datos e instrucciones para realizar un programa.
Paradigma imperativo
- Modulacion es una forma de utilziar la programacion estructurada de forma efectiva y organizada
'DIVIDE Y VENCERAS'
- Dividir el problema a resolver en partes mas pequeñas o subproblemas.
- Dar solución a cada una de las partes
- Unir las soluciones para solucionar el problema inicial
- Es una filosibía de 'Divides y vencerás
- Es más fácil resolver un problema sencillo que uno complejo
- Es efectivo y práctico
- Me permito afirmar que la programacion Orientada a Objetos en gran parte tiene mucha base en la programación modular
- Veremos como la POO está basado en programar clases futuras instancias de objetos
La programación de clases se realiza con programación estructurada y modular, por lo que debemos de saber programar de forma estructurada y modular