1. Autor: Luis Heladio Garzón Rodríguez
OBJETIVO GENERAL
Propender porque el estudiante se apropie el aprendizaje de las características y
fundamentos del paradigma imperativo, aplicándolo en la construcción de solución a
problemas de programación.
OBJETIVOS ESPECIFICOS
Conocer y comprender las características fundamentales del paradigma imperativo.
Conocer y familiarizarse con las estructuras de control.
Entender el propósito de los procesos interactivos en la programación.
Comprender y poner en práctica la Definición y utilización de funciones
Comprender los conceptos fundamentales de la programación y su importancia.
Conocer y aplicar las estructuras de datos, entendiendo su importancia en la
programación.
Profundizar mediante la investigación de los conceptos aquí tratados de parte del
estudiante.
PARADIGMA IMPERATIVO o PROCEDURAL o ESTRUCTURADO
La programación en el paradigma imperativo consiste en determinar qué datos son
requeridos para el cálculo, asociar a esos datos unas direcciones de memoria, y
efectuar paso a paso una secuencia de transformaciones en los datos almacenados, de
forma que el estado final represente el resultado correcto.
En su forma pura este paradigma sólo soporta sentencias simples que modifican la
memoria y efectúan bifurcaciones condicionales e incondicionales. Incluso cuando se
añade una forma simple de abstracción procedimental, el modelo permanece
básicamente sin cambiar.
Los parámetros de los procedimientos son "alias" de las zonas de memoria, por lo que
pueden alterar su valor, y no retorna ningún tipo de cálculo. La memoria también se
puede actualizar directamente mediante referencias globales.
El paradigma imperativo debe su nombre al papel dominante que desempeñan las
sentencias imperativas. Su esencia es el cálculo iterativo, paso a paso, de valores de
nivel inferior y su asignación a posiciones de memoria.
También conocido como estructurado porque La programación se divide en bloques
(procedimientos y funciones) que pueden o no comunicarse entre sí. Además la
programación se controla con secuencia, selección e iteración. Permite reutilizar código
programado y otorga una mejor compresión de la programación.
UNIDAD I
PARADIGMA IMPERATIVO o PROCEDURAL o ESTRUCTURADO
2. Autor: Luis Heladio Garzón Rodríguez
1. CARACTERISTICAS
Este paradigma se caracteriza por un modelo abstracto de ordenador que consiste en
un gran almacenamiento de memoria.
El ordenador almacena una representación codificada de un cálculo y ejecuta una
secuencia de comandos que modifican el contenido de ese almacenamiento. Este
paradigma viene bien representado por la arquitectura Von Neuman (1903-1957), ya
que utiliza este modelo de máquina para conceptualizar las soluciones: "Existe un
programa en memoria que se va ejecutando secuencialmente, y que toma unos datos
de la memoria, efectúa unos cálculos y actualiza la memoria".
Las características más notables o representativas que se puede enunciar de este
paradigma son:
Concepto de celda de memoria ("variable") para almacenar valores. El
componente principal de la arquitectura es la memoria, compuesto por un gran
número de celdas donde se almacenan los datos. Las celdas tienen nombre
(concepto de variable) que las referencian, y sobre los que se producen efectos
de lado y definiciones de alias.
Operaciones de asignación. Estrechamente ligado a la arquitectura de la
memoria, se encuentra la idea de que cada valor calculado debe ser
"almacenado", es decir asignado a una celda. Esta es la razón de la importancia
de la sentencia de asignación en el paradigma imperativo.
Repetición. Un programa imperativo, normalmente realiza su tarea ejecutando
repetidamente una secuencia de pasos elementales, ya que en este modelo
computacional la única forma de ejecutar algo complejo es repitiendo una
secuencia de instrucciones.
Breve historia
Los primeros programas fueron escritos en código de máquina.
Los primeros en surgir fueron los denominados de bajo nivel (“assembler”)
Los primeros de alto nivel fueron Fortran y Cobol.
Posteriormente aparecen lenguajes como Pascal, Algol-68.
La aparición de Lenguaje C, luego de lenguajes que no llegaron a distribuirse en
forma comercial como A y B, marco un hito importante en los lenguajes
imperativos.
La programación imperativa fue sin duda la dominante hasta mediados de los
90.
Paradigma: Imperativo (Procedural),
Estructurado
Apareció en: 1972
Diseñado por: Dennis M. Ritchie
Desarrollador: Dennis Ritchie y Bell Labs
3. Autor: Luis Heladio Garzón Rodríguez
Última versión
estable:
C99 (Marzo de 2000)
Tipo de dato: Débil, Estático
Implementaciones: Múltiples
Dialectos: Cyclone, Unified Parallel C, Split-
C, Cilk, C*
Influido por: B (BCPL,CPL), ALGOL 68,1
Ensamblador, PL/I, Fortran
Fuente: Wikipedia.com
Lenguajes
Algunos lenguajes representativos en este paradigma son:
PASCAL, C, FORTRAN, ALGOL, COBOL, ADA, CLIPPER, FOX, PL/1, C++, C#, etc.
Características de la Programación Estructurada
Teniendo en cuenta que otro de los nombres que recibe el paradigma imperativo es el
de estructurado, se puede decir que fue la primera manera universalmente aceptada
de organizar un programa que cumpliera los siguientes objetivos:
1. Deber ser fácil de leer y de comprender leyendo el propio código
2. Debe ser fácil de depurar
3. Debe ser fácil de mantener
4. Permitir el trabajo en equipo sobre un mismo programa.
2. LENGUAJE C
Para desarrollar el tema sobre este paradigma, se toma como ejemplo al lenguaje C.
El lenguaje C, fue creado por Dennis M. Ritchie en los laboratorios Dell, es un lenguaje
que permite trabajar con datos simples y estructurados (definidos por el usuario), con
estructuras de control que permiten trabajar selectividad, repetición de instrucciones,
con la facilidad de poder estructurar los programas en módulos o subprogramas más
pequeños también llamados procedimientos y funciones.
C es, probablemente, uno de los lenguajes más utilizados actualmente. Es un lenguaje
estructurado, pero también permite una programación de bajo nivel, lo cual lo hace
adecuado para sistemas operativos (como Unix) y como software de control de
periféricos, aunque se utiliza en todo un tipo de aplicaciones, incluso en las de más alto
nivel, como por ejemplo, librerías gráficas. (Ver más información en la Unidad I.
Introducción a los paradigmas de programación, página 7)
En el siguiente enlace encontrara mayor información sobre el lenguaje C y sus
características http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C
4. Autor: Luis Heladio Garzón Rodríguez
2.1 Tipos de datos
Los tipos de datos básicos en lenguaje C o en los lenguajes de programación en
general, se clasifican en datos simples y estructurados. Los datos simples con datos
numéricos, alfanuméricos y lógicos (Ver mas información en la Unidad I. Introducción
a los paradigmas de programación, tema1.1. Datos, pagina 1.), que en lenguaje C
específicamente presenta algunas variantes, posibilitando una mejor clasificación de
los datos, para optimizar la utilización de la memoria.
Los datos básicos en C son: int, float, doublé, char, void, boolean
Se puede obtener otros tipos de datos, utilizando los modificadores long y short, con
menor o mayor capacidad de almacenamiento, en este caso cada tipo de dato ocupa
una cantidad de bytes diferente, que puede aumentar si emplea long o disminuir si lo
hace con short. Ampliar información sobre datos básicos en C (Ver documento en
curso AVA en plataforma)
En este enlace http://www.carlospes.com/curso_de_lenguaje_c/01_04_tipos_de_datos.php
encontrara mas información sobre los tipos de datos básicos del lenguaje C.
Los datos estructurados están conformados por registros (register) (Ver también tipos
de datos unidad I, Introducción a los paradigmas de programación, datos
estructurados).
2.2 Estructuras de control
Las estructuras de control permiten controlar el flujo de ejecución de las instrucciones
en un programa. Con estas estructuras se puede determinar, el orden, la interacción,
la cantidad de repeticiones que ejecutarán las instrucciones que están dentro de estas
estructuras.
Las estructuras de control impiden se apliquen usos anormales de rompimiento de
secuencia, lo que anteriormente se podía realizar a través de la instrucción GOTO. En
la actualidad se sugiere como buena practica de programación, no utilizar esta
instrucción, pues existe otras formas mas adecuadas para lograr un estilo de
programación limpia.
Las estructuras de control se pueden clasificar en: secuenciales, selectivas y
repetitivas.
La estructura secuencial no representa mayor complejidad, pues las instrucciones se
ejecutan una a una en el orden en que están escritas en el programa.
Las estructuras selectivas a diferencia de la estructura secuencial, permitan bifurcar
(tomar varios caminos) la ejecución del programa, de acuerdo a la evaluación de
condiciones, para ejecutar uno u otro conjunto de instrucciones. Estas se clasifican a s
vez en condicionales y de selección múltiple.
Las estructuras condicionales también se pueden clasificar en:
5. Autor: Luis Heladio Garzón Rodríguez
Estructuras condicionales Simples Solo se ejecutan las instrucciones de la
estructura cuando se evalúa como verdadera la condición.
Sintaxis:
if (<Condición>)
{ <Conjunto de instrucciones>
}
Estructuras condicionales alternas Tiene dos alternativas, para ejecutar un
conjunto diferente de instrucciones, por verdadero o falso, de acuerdo a la evaluación
de la condición.
Sintaxis:
if (<Condición>)
{ <Conjunto de instrucciones>
}
else
{<Conjunto de instrucciones>
}
Estructuras condicionales anidadas Surgen como una derivación de combinar las
estructuras condicionales simples y alternas, permitiendo la evaluación de múltiples
casos como condiciones para soluciones posibles al problema a resolver. Esto significa
que se puede anidar por verdadero o falso, según sea el caso, otras estructuras
condicionales simples o alternas. Con este tipo de estructura se puede plantear
solución a problemas, cuando una variable puede optar o tener varios posibles valores.
Sintaxis:
if (<Condición>)
{ if (<Condición>)
{
<Conjunto de instrucciones>
}
}
else
{
if (<Condición>)
{<Conjunto de instrucciones>
}
}
Estructura de selección múltiple o selectivas Algunos lenguajes como el C, tienen
una estructura de control, que permite simplificar la escritura de soluciones que se
hace a través del uso de las estructuras condicionales anidadas. Esta estructura de
control se trabaja a través del comando switch - case
Sintaxis:
switch (<Variable de control>)
{
case <valor opción 1>{ <conjunto de instrucciones> }; break;
case <valor opción 1>{ <conjunto de instrucciones> }; break;
6. Autor: Luis Heladio Garzón Rodríguez
case <valor opción 1>{ <conjunto de instrucciones> }; break;
other <valor opción 1>{ <conjunto de instrucciones> }; break;
}
Las estructuras repetitivas facilitan que se repita un conjunto de instrucciones, un
número determinado de veces. Las estructuras repetitivas en C son while, do-while,
for. Cada una de ellas se debe utilizar de acuerdo al tipo de problema que se tenga
que resolver. Igual cada una de ellas tiene unas características, que les diferencia para
su aplicación.
Estructura repetitiva for
Esta sentencia o comando, tiene como característica fundamental, que permite ejecutar un conjunto de
instrucciones un número determinado o preciso de veces conocido.
Sintaxis:
for(Vc:= Vi;Vc <condición de fin>; <incremento> )
{
<conjunto de instrucciones>
}
Explicación:
Vc : La variable de control, lleva el conteo para el número de repeticiones
Vi : valor inicial en el que arranca el conteo de la variable de control
Condición de fin : El ciclo repetitivo se cumplirá hasta cuando se cumpla la condición de fin
Incremento : Para controlar el número de repeticiones, se debe indicar el valor de
incremento de cada interacción. Se puede utilizar en forma de decremento también.
Escriba un programa, que calcule la máxima área de un terreno rectangular de lados 100-2x y x
respectivamente, para valores de x entre 10 y 30.
Programa en Seudolenguaje
Var
Entero x, area
Inicio
Para x=10 hasta x<=30 haga //x es la variable de control inicia en 10 y termina en 30
area=100-2*x //Se calcula el área multiplicando 100- y el valor de 2 por x
Esciba x, area //Muestra los valores de x y area
Fin Para
Fin
//Programa en lenguaje C
#include<stdio.h>
main(void)
{ int x,area;
for(x=10; x<=30;x++)
{ area = 100 – 2 * x;
cout<<"Area para “<<x<<” es “<<area<<” Mts 2”;
}
}
La instrucción x++, es el incremento de uno en uno. ++ es uno de los operadores
monarios del lenguaje C.
Otra forma simplificada para este mismo ejercicio puede ser como la que se presenta a
continuación
7. Autor: Luis Heladio Garzón Rodríguez
//Programa en lenguaje C
#include<stdio.h>
main(void)
{ int x,area;
for(x=10; x<=30;x++)
cout<<"%d Area para “<<x<<” es “<<(100-2*x);
}
La simplificación consiste en que se calcula el área en la misma instrucción, donde se
da la orden de mostrar resultados, esta forma a veces puede ser útil cuando no se
requiere almacenar resultados.
Estructura repetitiva while
While es un comando que permite se ejecute un conjunto de instrucciones mientras se
cumpla una condición.
Sintaxis:
while (<condición>)
{
<conjunto de instrucciones>
}
Es importante resaltar, que la variable que se evalúa en la condición, antes de la
instrucción while debe obtener un valor, para que por lo menos se ejecute una vez, de
lo contrario el conjunto de instrucciones no se ejecutara ni una vez. El conjunto de
instrucciones se ejecutara siempre que la evaluación de la condición sea verdadera.
Esta estructura repetitiva se utiliza cuando no existe un numero cierto de veces para
ejecutar las instrucciones, por ejemplo se pudiera trabajar con una variable centinela o
bandera.
Ejercicio:
Usando la instrucción mientras para escribir un programa que imprima la serie 1, 3, 5, 7,9.
Programa seudolenguaje
Var
Entero i
Inicio
i = 1
mientras (i<=9) haga
Escriba i
i = i+2
Fin mientras
Fin
Explicación: Como se puede observar la variable i desempeña el papel de variable de control y en este
caso asume como contador de operaciones hasta cuando llegue al límite que es 9.
La instrucción i = i + 2, es la forma como en Seudolenguaje se expresa un contador, que en este caso
se incrementa de dos en dos, hasta llegar al tope indicado.
//Programa en C
#include<stdio.h>
main(void)
{
int i;
8. Autor: Luis Heladio Garzón Rodríguez
i=1;
while(I <= 9)
{
cout<<" n número= “<<i;
i=i+2;
}
}
Estructura repetitiva do - while
do - while es un comando que permite se ejecute por lo menos una vez un conjunto de
instrucciones hasta cuando se cumpla una condición.
Sintaxis:
do
{
<conjunto de instrucciones>
}
while (<condición>);
Esto se puede interpretar como haga (do) mientras que (while) una condición no se
cumpla. En este caso la condición se encuentra después de ejecutar el conjunto de
instrucciones (al final de la estructura repetitiva), por ello se dice que se ejecuta por lo
menos una vez.
Ejercicio:
Se planteara el mismo problema para el caso del while.
Usando la instrucción haga mientras que, escribir un programa que imprima la serie 1, 3, 5, 7,9.
Programa seudolenguaje
Var
Entero i
Inicio
i = 1
haga
Escriba i
i = i+2
mientras (i<=9)
Fin
Explicación: Como se puede observar la variable i desempeña el papel de variable de control y en este
caso asume como contador de operaciones hasta cuando llegue al límite que es 9. A diferencia del caso
anterior, el comando mientras esta al final, por ello cuando se evalúa la condición se habrá ejecutado
por lo menos una vez, el conjunto de instrucciones.
//Programa en C
#include<stdio.h>
main(void)
{
int i;
i=1;
do
{
cout<<" n número= “<<i;
i=i+2;
9. Autor: Luis Heladio Garzón Rodríguez
}
while(I <= 9);
}
2.3 Procesos o procedimientos
La programación por procedimientos es un paradigma que permite descomponer la
solución de un problema o programa en subprogramas, subrutinas, procesos y/o
funciones, en los que se ejecuta un conjunto de instrucciones. En el lenguaje de
programación C se declaran como funciones y se pueden utilizar con dos fines o de dos
formas.
La primera son funciones utilizadas como subprogramas que hacen alguna operación
pero no retornan un valor, lo que representa el trabajo de un procedimiento. La segunda
son funciones que reciben parámetros, ejecutan instrucciones y retornan un valor.
De que tipo puede ser el valor retornado por una función ?
Se debe diferenciar tres aspectos al trabajar con procedimientos o funciones : declarar,
llamar y definir.
Sintaxis de la definición de una función o procedimiento:
<Tipo de dato> <Identificador función>(Lista de parámetros o argumentos)
{
<Instrucciones>
}
Los procedimientos son subprogramas, también llamadas subrutinas y contienen
conjuntos de instrucciones que se ejecutan al ser invocado o llamado el procedimiento.
Los llamados se pueden hacer con paso de parámetros o no.
El paso de parámetros se hace por valor o por referencia.
Es importante plantear los siguientes interrogantes, cuando se trabaja con
procedimientos o funciones.
Como se llaman los parámetros que se pasa a una función?
Como se llaman los parámetros que recibe a una función?
Que diferencia hay entre paso de parámetros por referencia y por valor?
En que sitio dentro del programa se declara una función?
A que se hace referencia cuando se habla de una función prototipo?
La instrucción return para qué sirve? Cuál es la forma general o sintaxis?
De que forma se llama o invoca una función?
2.4 Definición de funciones
En términos generales aquí se debe aclarar específicamente, que en el lenguaje C, los
procedimientos tienen una forma de declaración idéntica, con la diferencia que se debe
10. Autor: Luis Heladio Garzón Rodríguez
especificar en el tipo de dato si pasa o no parámetro. Si pasa parámetro y retorna valor
se considera función.
Lo revisado en el tema 2.3 es aplicable y valido para este tema.
Sintaxis para definición de una función:
<Tipo de dato> <Identificador función>(Lista de parámetros o argumentos)
{
<Instrucciones>
return(<Variable valor>);
}
El siguiente programa trata de ejemplificar la aplicación de las funciones, en un
ejercicio para calcular el área de un cubo.
//Programa en Lenguaje C explicando el trabajo con una función
#include<stdio.h>
float num, res;
float cubo(int x); //1. Declaración de la función cubo
//Programa principal
main()
{
printf("ingrese un número ");
scanf("%f",&num);
res=cubo(num); //2. Llamado a la función cubo
printf("%f al cubo es: %f",num,res);
return 0; //3. Valor que retorna la función main()
}
//Definición de la función cubo
float cubo(int x) //4. Aquí inicia la función cubo
{ return (x*x*x); } //5.retorna o devuelve el valor del calculo
Explicación del programa
1. float cubo(int x); En la declaración de la función cubo float indica el tipo de dato que retorna o
devuelve la función. cubo es el nombre de la función. int x, es el tipo de dato y la variable, del
parámetro local que recibe el valor, cuando es llamada la función.
2. cubo(num); Para acceder a la función se hace un llamado, colocando entre paréntesis los
identificadores de los parámetros que se halla declarado, se han de pasar. res=cubo(num); esta
instrucción en la parte a la derecha de signo igual corresponde al llamado de la función, a la
izquierda denota que la variable “res” recibe el valor que devuelve la función.
3. return 0; esta instrucción se debe colocar siempre para evitar un error al momento de la
compilación. Se puede obviar si al escribir main() se coloca void main(), que indica al
compilador que la función main, no retorna valor o retorna valor vacio.
4. float cubo(int x) esta primera línea de la declaración puede ser casi idéntica, a la declaración
de la función. float indica el tipo de dato que retorna o devuelve la función. cubo es el nombre
de la función. int x, es el tipo de dato y la variable, del parámetro local que recibe el valor,
cuando es llamada la función.
5. return (x*x*x); en la misma línea se realiza el calculo, cuyo valor se retorna y recibirá la variable
res.
Ejercicio
Escriba un programa que permita calcular la potencia a la que es elavado otro número.
11. Autor: Luis Heladio Garzón Rodríguez
Programa seudolenguaje
Var
Entero b, e
real poten
real potencia(m, n)
Inicio
escriba “Valor de la base : “ Lea b
escriba “Valor del exponente : “ Lea e
poten = potencia(b, e)
escriba “La potencia obtenida es : “, poten
Fin //del programa principal
real Función potencia(m, n)
var
entero i, y
Inicio
y = 1
Para i=1 hasta i<=abs(n) haga
y = y*m
si n<0 entonces
y = 1/y
fin si
Fin Desde
retorne( y )
Fin función
Variables
potencia: es una función
b : valor ingresado
e : valor ingresado
m : toma valores de b
n : toma valores de e
i : variable de control del ciclo for para el contador
y : guarda el valor buscado.
poten : recibe el valor devuelto por la función y acumulado en y
//Programa en lenguaje C
#include<stdio.h>
#include <math.h>
int b,e;
float poten;
float potencia(int m, int n);
void main()
{
cout<<" INGRESE DOS NÚMEROS.. ";
cout<<” Valor para la base : “; cin>>b;
cout<<” Valor para el exponente . “; cin>>e;
poten = potencia(b,e);
cout<<” La potencia obtenida es : “<<poten;
}
float potencia(int m, int n)
{ int i;
12. Autor: Luis Heladio Garzón Rodríguez
float y;
y=1;
for(i=1;i<=abs(n);i++)
{
y=y*m;
if(n<0)
y=1/y;
}
return (y );
}
2.5 Estructuras de datos
2.5.1 Datos Estructurados
Este pertenece al tipo de datos definidos por el usuario. En el que se permite
configurar una combinación de datos de diferente tipo, que no esta predefinido en el
lenguaje de programación.
En el paradigma de programación estructurada se les nombraba como registros. En el
paradigma de programación orientada a objetos, se conocen como objetos.
Es importante profundizar mas sobre este tipo de dato y sus variantes de acuerdo al
paradigma de programación y el lenguaje de programación.
2.5.2 Estructura de datos
Las estructuras de datos corresponden a los tipos de datos definidos por el usuario y le
trabajo con formas de almacenamiento en memoria principal, para manipular datos en
mayor volumen. Los lenguajes de últimas generaciones, permiten definir tipos de
datos que se acoplen a las necesidades específicas del problema a resolver.
Las estructuras de datos se clasifican en estáticas y dinámicas. En el grupo de las
estáticas están los arreglos que a su vez son lineales, bidimensionales y
multidimensionales. Las dinámicas en las que se encuentran las pilas, listas, colas,
grafos y arboles.
2.5.2.1 Arreglos
Los arreglos multidimensionales permiten definir ARRAYS de varias filas y columnas, o
varias filas y varias caras. La forma general para definir arreglos de este tipo es :
<Tipo almacenamiento> <tipo dato> <nombre> [expresión_1] [expresión_2] ... [expresión_n]
Donde Tipo de almacenamiento indica si es : static, automatic, extern.
Tipo de dato el tipo de dato que contendrá el arreglo.
Ejemplo :
int tabla_1 [3] [4];
char em_nom [10];
13. Autor: Luis Heladio Garzón Rodríguez
float deven_n [20] [3];
double deduc_n [N] [2] [3];
Surge en este momento la necesidad de preguntar se puede inicializar un arreglo ?
Como se hace ? En que sitio del programa puede o debe ir ?
Puede identificar la siguiente forma general a que corresponde ?
<Tipo dato> <Nombre> [exp_1] [exp_2]...[exp_n] = {
{valor_1,...valor_n}
{valor_1,...valor_n}
};
Una Estructura es un tipo de dato registro definido por el programador, este permite una
mayor flexibilidad a la hora de manejar información que contiene atributos de un individuo
y en el que los tipos de datos son diferentes. La forma general es :
<[Tipo almacenamiento]> struct <[nombre estructura]> { <Campo_1>;
<Campo_2>;...<Campo_n>;} <Variables>;
El tipo de almacenamiento puede ser opcional, struct es una palabra reservada que siempre
debe ir, nombre estructura identifica al tipo de estructura declarada y puede ser opcional,
los campos son los que integran a esta estructura y las variables se declaran de este tipo de
dato. En una estructura se puede definir un componente de tipo struct definido antes que
esta.
struct datos {
char codigo[4];
char nombre[30];
char tele[8];
char catego;
};
struct registro {
struct datos datos_e;
float sal_bas,deven,deduc;
} emple;
Como interpreta el ejemplo anterior ?
Como haria mensión a los datos del campo datos_e ?
La forma general para la inclusión de estructuras dentro de otra puede ser :
<[Tipo almacenamiento]> struct <[nombre estructura]> { <Campo_1>;
<Campo_2>;struct <Estructura> <Campo_3>;...<Campo_n>;} <Variables>;
La inicialización de variables es importante, entonces se puede inicializar las variables o
componentes de una estructura ?
14. Autor: Luis Heladio Garzón Rodríguez
Que caracteristica debe tener la definición de la estructura para poderla inicializar ? Como
se debe hacer ?
<Tipo almacenamiento> struct <Estructura> <Variable_estructura> =
{<Valor_1,<Valor_2>,...<Valor_n>};
Que significa la forma general descrita antes ?
De esta manera lenguaje C tambien permite definir arreglos de estructuras.
<[Tipo almacenamiento]> struct <[nombre estructura]> { <Campo_1>;
<Campo_2>;...<Campo_n>;} <Arreglo> [Tamaño];
Que significa el siguiente ejemplo :
struct registro {
char codigo[4];
char nombre[30];
char tele[8];
char catego;
float sal_bas;
} emple[50];
Si en la declaración de variables se indica la siguiente orden :
struct registro emple[50]; , debe cambiar la declaración del ejemplo anterior ?
La forma de hacer referencia a los miembros o campos de una estructura varia dependiendo
de si es una estructura registro o un arreglo de estructuras :
<Variable_estructura>.<Campo>;
<Arreglo> [<Posición>] .<Campo>;
typedef es una palabra reservada del lenguaje y permite definir nuevos tipos de datos
equivalentes a los que tiene el lenguaje, esto en el caso de las estructuras es muy aplicable
por evitar hacer referencia a la orden struct en forma repetida, la forma general es :
typedef struct {<Campo_1>;<Campo_2>;...<Campo_n>;} <Nuevo_tipo>;
Como emplearia typedef para el ejemplo anterior ?
Como definiria la variable en la area de declaración de variables?
A que corresponde las siguientes formas generales ?
15. Autor: Luis Heladio Garzón Rodríguez
<Nuevo_tipo> <Variable_1>,<Variable_2>;
<Nuevo_tipo> <Arreglo> [<Tamaño>];
BIBLIOGRAFIA
Ortez, Manuel Antonio. Manual de programación en lenguaje C
http://www.monografias.com/trabajos33/programacion-lenguaje-c/programacion-lenguaje-c.shtml
López Ardao, J. Carlos. Programación en C.
http://www.scribd.com/doc/22283/Manual-De-Programacion-Lenguaje-C
Barzal, Fernando. Introducción a la programación. (Tipos de datos)
http://elvex.ugr.es/decsai/c/apuntes/datos.pdf
Sopla, Abraham. Algoritmos y Lenguaje C. (Estructuras de control)
http://www.mailxmail.com/curso-algoritmos-lenguaje-c/apuntes-lenguaje-c-1
Díaz Cuenca, Josué. Programación en C++.
http://www.mailxmail.com/curso-programacion-c/parametros-valor-referencia (Paso de parámetros)
http://www.mailxmail.com/curso-programacion-c/estructuras-uniones (Estructuras de datos y uniones)
Rodríguez, María Sandra y otros. Tutorial de Estructuras de Datos en C++
http://decsai.ugr.es/~jfv/ed1/c++/cdrom5/index.htm
Fernández Valdivia, Joaquín. Estructuras de datos en C++.
http://decsai.ugr.es/~jfv/ed.html
Estructuras de datos y Algo+.
http://www.algoritmia.net/articles.php?folder=Estructuras%20de%20Datos
16. Autor: Luis Heladio Garzón Rodríguez
OBJETIVO GENERAL
Propender porque el estudiante se apropie el aprendizaje de las características y
fundamentos del paradigma de programación funcional, aplicándolo en la construcción
de solución a problemas de programación.
OBJETIVOS ESPECIFICOS
Conocer y comprender las características fundamentales del paradigma
programación funcional.
Continuar el afianzamiento con las estructuras de control.
Entender el propósito de los procesos de programación funcional.
Comprender y poner en práctica la Definición y utilización de funciones
Comprender los conceptos fundamentales de la programación y su importancia.
Conocer y aplicar las estructuras de datos, entendiendo su importancia en la
programación.
Profundizar mediante la investigación de los conceptos aquí tratados de parte del
estudiante.
PARADIGMA PROGRAMACIÓN FUNCIONAL
El paradigma de programación funcional considera al programa como una función
matemática.
Los orígenes de la programación funcional pueden rastrearse al matemático Alonzo
Church, que trabajaba en la Universidad de Princeton, y, al igual que otros
matemáticos de allí, estaba interesado en la matemática abstracta, particularmente en
el poder computacional de ciertas máquinas abstractas. Las preguntas que se hacía
eran por ejemplo: si dispusiésemos de máquinas de un ilimitado poder de cómputo,
¿qué tipos de problemas se podrían solucionar?, o ¿se pueden resolver todos los
problemas?1
Por ejemplo, podemos escribir en el lenguaje funcional Haskell:
Factorial :: int -> int
factorial 0 = 1
factorial n = n * factorial (n-1)
Es decir, la última es una función sencilla, parecida a la que conocemos de las
matemáticas de la secundaria, que permite calcular el factorial de un número entero
(ver definición de la función factorial más abajo).
1
Rivadera, Gustavo Ramiro. La programación funcional: un poderoso paradigma. 2008.
UNIDAD I
PARADIGMA PROGRAMACIÓN FUNCIONAL
17. Autor: Luis Heladio Garzón Rodríguez
Modelo imperativo (de Labra
1998)
Modelo funcional (de Labra 1998)
Comparativo entre paradigma imperativo y funcional
Comparemos esa línea de código de Haskell con la siguiente en un lenguaje como C#:
unsigned factorial (unsigned n)
{
int product = 1; // valor inicial
while (n > 1)
{
product *= n--; // acumulador
}
return product; // resultado
}
Este ejemplo es muy sencillo y los dos fragmentos de código son muy parecidos. Sin
embargo, la definición de Haskell es mucho más cercana a la matemática:
0! = 1
n! = n * (n - 1)!
3. CARACTERISTICAS
18. Autor: Luis Heladio Garzón Rodríguez
El paradigma de programación funcional, pertenece al grupo de la programación
declarativa. Son características importantes del paradigma funcional2
:
Primero, en los lenguajes funcionales no existe el concepto de variables y
consecuentemente tampoco existen operaciones de asignación. Aunque podría
parecer que los parámetros de una función se comportan como una variable (puesto
que pueden llevar un nombre y su uso es de hecho parecido al de las variables),
esto es incorrecto: El valor de los parámetros es dado como fijo al inicio de la
función.
• Segundo, la existencia de una propiedad llamada transparencia referencial
(Referential transparency), la cual indica que una función sólo depende de sus
parámetros y que tendrá efecto únicamente en su resultado, por lo que podríamos
llamar a una función arbitrariamente sin tener efectos colaterales en el resto de los
cálculos.
• Por último, que una función puede ser utilizada como parámetros y resultados de
cualquier otra función.
Lenguajes
Los lenguajes más utilizados dentro de este paradigma son Standard ML, Haskell y
Scheme9 aunque hoy por hoy LOGO10 figuraría junto con otros dialectos de LISP.
Algunos lenguajes representativos en este paradigma son:
Lenguajes funcionales puros Haskell y Miranda
Lenguajes funcionales hibridos Scala, LISP, Scheme, Ocami, SAP y estándar ML
Otros que contienen el paradigma funcional Perl, Python, Ruby
4. LENGUAJE SCHEME
Para desarrollar el tema sobre este paradigma, se toma como ejemplo al Scheme.
Características del lenguaje:
Paradigma: multi-paradigma
Apareció en: década de 1970
Diseñado por: Guy L. Steele y Gerald Jay Sussman
Tipo de dato: Fuerte, dinámico
Implementaciones: Scheme, Scheme 48, Chicken,
Gambit, FLUENT, Guile, Bigloo,
Chez Scheme, STk, STklos, Larceny,
SCM
2
Zarate Rea, Hector. Paradigmas de programación. Noviembre 2008.
19. Autor: Luis Heladio Garzón Rodríguez
Dialectos: T
Influido por: Lisp, ALGOL
Ha influido a: Common Lisp, JavaScript, Ruby
Scheme es un lenguaje de programación. Es un lenguaje funcional (si bien impuro, ya
que, por ejemplo, sus estructuras de datos no son inmutables) y un dialecto de Lisp.
Fue desarrollado por Guy L. Steele y Gerald Jay Sussman en la década de los setenta e
introducido en el mundo académico a través de una serie de artículos conocidos como
los Lambda Papers de Sussman y Steele.3
La filosofía de Scheme es decididamente minimalista. Su objetivo no es acumular un
gran número de funcionalidades, sino evitar las debilidades y restricciones que hacen
necesaria su adición. Así, Scheme proporciona el mínimo número posible de nociones
primitivas, construyendo todo lo demás a partir de un reducido número de
abstracciones. Por ejemplo, el mecanismo principal para el control de flujo son las
llamadas recursivas finales.
Scheme fue el primer dialecto de Lisp que usó ámbito estático o léxico (en lugar de
dinámico) de forma exclusiva. También fue uno de los primeros lenguajes de
programación con continuaciones explícitas. Scheme ofrece también gestión
automática de memoria (recolección de basura).
2.6 Tipos de datos
Los tipos de datos básicos del lenguaje Scheme son muy similares al estándar de la
lógica de programación, y también a los del lenguaje C.
Los datos simples con datos numéricos, alfanuméricos y lógicos (Ver más información
en la Unidad I. Introducción a los paradigmas de programación, tema1.1. Datos,
pagina 1.), que en lenguaje Scheme presenta algunas variantes respecto del lenguaje
C, revise estas especificidades en Scheme o Manual de referencia de Scheme.
En este enlace http://www.x.edu.uy/inet/IntHaskell98.pdf encontrara más información
sobre el lenguaje de programación Haskell, un lenguaje funcional puro (también puede
bajar el documento de curso virtual de Paradigmas de programación “Introducción al
Lenguaje Haskell”4
).
2.7 Estructuras de control
Al igual que otros lenguajes de programación de alto nivel este lenguaje trabaja con
estructuras de control permiten controlar el flujo de ejecución de las instrucciones en
un programa. Es de recordad que con estas estructuras se puede determinar, el orden,
3
Enciclopedia Wikipedia. http://es.wikipedia.org/wiki/Scheme
4
Labra G, Jose E. Introducción al Lengujae Hasell. Octubre 1998. http://www.x.edu.uy/inet/IntHaskell98.pdf
20. Autor: Luis Heladio Garzón Rodríguez
la interacción, la cantidad de repeticiones que ejecutarán las instrucciones que están
dentro de estas estructuras.
Las estructuras de control se pueden clasificar en: secuenciales, selectivas y
repetitivas.
Para profundizar sobre la sintaxis del scheme, respecto de sus estructuras de control
revise Manual de referencia de Scheme o Scheme, sugiero comparar las estructuras de
control del lenguaje scheme con las del lenguaje C, y establezca si hay diferencias
importantes.
2.8 Funciones y/o procedimientos
Para el lenguaje funcional su principal características es la de abordar la programación a
través de funciones.
Revise cual es la estructura de la sintaxis de las funciones en scheme, notara que al
comparar la forma de declararlas, es muy similar a lo que se revisó en la unidad II
(ítems 2.3 y 2.4), respecto del lenguaje C.
Se debe diferenciar y tener en cuenta tres instancias en las que se hace referencia al
trabajar con procedimientos o funciones: declarar, llamar y definir.
Sintaxis de la definición de una función o procedimiento (establezca la diferencia que hay
entre una función y un procedimiento):
<Tipo de dato> <Identificador función>(Lista de parámetros o argumentos)
{
<Instrucciones>
}
2.9 Estructuras de datos
2.9.1. Datos Estructurados
Este pertenece al tipo de datos definidos por el usuario. En el que se permite
configurar una combinación de datos de diferente tipo, que no esta predefinido en el
lenguaje de programación.
En el paradigma de programación funcional también existe estructuras de datos, es
importante en este caso plantear una reflexión sobre las similitudes y funcionalidades
de estas.
Es importante profundizar mas sobre este tipo de dato y sus variantes de acuerdo al
paradigma de programación y el lenguaje de programación.
2.9.2 Estructura de datos
Las estructuras de datos corresponden a los tipos de datos definidos por el usuario y le
trabajo con formas de almacenamiento en memoria principal, para manipular datos en
21. Autor: Luis Heladio Garzón Rodríguez
mayor volumen. Los lenguajes de últimas generaciones, permiten definir tipos de
datos que se acoplen a las necesidades específicas del problema a resolver.
Las estructuras de datos se clasifican en estáticas y dinámicas. En el grupo de las
estáticas están los arreglos que a su vez son lineales, bidimensionales y
multidimensionales. Las dinámicas en las que se encuentran las pilas, listas, colas,
grafos y árboles.
2.9.3 Arreglos
Los arreglos multidimensionales permiten definir ARRAYS de varias filas y columnas, o
varias filas y varias caras. La forma general para definir arreglos de este tipo es :
BIBLIOGRAFIA
Labra G, Jose E. Introducción al Lengujae Hasell. Octubre 1998.
http://www.x.edu.uy/inet/IntHaskell98.pdf
Manual de referencia Lenguaje Scheme.
http://www.dccia.ua.es/dccia/inf/asignaturas/LPP/2004-2005/doc/scheme.pdf
Enciclopedia Wikipedia. http://es.wikipedia.org/wiki/Scheme
Martinez Villalobos, Gustavo. Paradigmas de programación.
http://www.unibague.edu.co/~gustavo.martinez/cursos/paradigmas/index.html
Estructuras de datos y Algo+.
http://www.algoritmia.net/articles.php?folder=Estructuras%20de%20Datos
22. Autor: Luis Heladio Garzón Rodríguez
OBJETIVO GENERAL
Propender porque el estudiante se apropie el aprendizaje de las características y
fundamentos del paradigma de programación Lógica, aplicándolo en la construcción de
solución a problemas de programación.
OBJETIVOS ESPECIFICOS
Conocer y comprender las características fundamentales del paradigma
programación lógica.
Continuar el afianzamiento con las estructuras de control.
Entender el propósito de los procesos del paradigma de programación lógica.
Comprender y poner en práctica la Definición y utilización de funciones
Comprender los conceptos fundamentales de la programación lógica y su
importancia.
Conocer y aplicar las estructuras de datos, entendiendo su importancia en la
programación lógica.
Profundizar mediante la investigación de los conceptos aquí tratados de parte del
estudiante.
PARADIGMA PROGRAMACIÓN LÓGICA
Programación Lógica es una forma de crear soluciones basadas en la experiencia y la
acumulación del conocimiento, aplicando la inferencia con lo que se obtengan
soluciones en combinación de programas muy aproximado a la realidad.
El paradigma lógico difiere de forma importante de otros paradigmas5
. No sólo en su
Sintaxis o semántica, sino que en él la lógica representa conocimiento, el cual es
manipulado mediante inferencias. A diferencia de los demás paradigmas, trabajar en
este significa especificar qué hacer y no cómo hacerlo, por ello son llamados
lenguajes declarativos.
El proceso general de la programación lógica es que a partir de un conjunto de reglas
(axiomas) e inferencias podamos comprobar nuevas proposiciones que nos sean
relevantes. Este proceso está basado en reglas de lógica de primer orden.
Al ser un paradigma bastante abstracto vale la pena esclarecerlo a través de algunos
ejemplos. Aunque Prolog es el lenguaje más representativo en este paradigma, se
puede hacer ejemplos en Structured Query Language (SQL), un lenguaje para operar
bases de datos y el cual representa otra de las aplicaciones de la programación lógica.
La programación lógica es un tipo de paradigma de programación dentro del
paradigma de programación declarativa. El resto de los subparadigmas de
programación dentro de la programación lógica son: programación funcional,
5
Véase: Mitchell, John. Concepts in Programming Languages, Reino Unido: Cambridge University
Press, 2003.
UNIDAD I
PARADIGMA PROGRAMACIÓN LÓGICA
23. Autor: Luis Heladio Garzón Rodríguez
programación basada en restricciones, programas DSL (de dominio específico) e
híbridos. La programación declarativa gira en torno al concepto de predicado, o
relación entre elementos. La programación funcional se basa en el concepto de
función (que no es más que una evolución de los predicados), de corte más
matemático6
.
La programación lógica, junto con la funcional, forma parte de lo que se conoce como
programación declarativa. En los lenguajes tradicionales, la programación consiste
en indicar cómo resolver un problema mediante sentencias; en la programación lógica,
se trabaja de una forma descriptiva, estableciendo relaciones entre entidades,
indicando no cómo, sino qué hacer. La ecuación de Robert Kowalski (Universidad de
Edimburgo) establece la idea esencial de la programación lógica: algoritmos = lógica +
control. Es decir, un algoritmo se construye especificando conocimiento en un lenguaje
formal (lógica de primer orden), y el problema se resuelve mediante un mecanismo de
inferencia (control) que actúa sobre aquél7
.
Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por
ejemplo vamos a pensar en un coche para tratar de modelarlo en un esquema de POO.
Diríamos que el coche es el elemento principal que tiene una serie de características,
como podrían ser el color, el modelo o la marca. Además tiene una serie de
funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar.
Pues en un esquema POO el coche sería el objeto, las propiedades serían las
características como el color o el modelo y los métodos serían las funcionalidades
asociadas como ponerse en marcha o parar.
Por poner otro ejemplo vamos a ver cómo modelaríamos en un esquema de POO una
fracción, es decir, esa estructura matemática que tiene un numerador y un
denominador que divide al numerador, por ejemplo 3/2.
La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador.
Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o
número, restarse con otra fracción, etc.
Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de
matemáticas harás uso de objetos fracción y en un programa que gestione un taller de
coches utilizarás objetos coche. Los programas Orientados a objetos utilizan muchos
objetos para realizar las acciones que se desean realizar y ellos mismos también son
objetos. Es decir, el taller de coches será un objeto que utilizará objetos coche,
herramienta, mecánico, recambios, etc.
De acuerdo a esto podemos concluir que en la programación orientada a objetos, la
reusabilidad, el empaquetamiento, la ocultación, la encapsulación, la modularidad, la
herencia son características fundamentales para hacer que los esfuerzos de
programación puedan redundar en menores esfuerzos humanos, mayores beneficios o
resultados y baja de costos.
La programación orientada a objetos es una técnica cuyo bloque de construcción
principal son los objetos y las interrelaciones.
6
Wikipedia, programación lógica. http://es.wikipedia.org/wiki/Programaci%C3%B3n_l%C3%B3gica
7
Rossel, Gerardo. http://www.amzi.com/articles/code07_whitepaper.pdf
24. Autor: Luis Heladio Garzón Rodríguez
Un objeto son estructuras de datos más las funciones que operan sobre estas
estructuras.
5. CARACTERISTICAS
La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de
primer orden, aunque también incorporan algunos comportamientos de orden superior.
En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo
lambda, que es la única teoría lógica de orden superior que es demostradamente
computable (hasta el momento)8
.
La programación lógica permite formalizar hechos del mundo real, por ejemplo:
las aves vuelan
los pingüinos no vuelan
"pichurri" es un ave
"sandokan" es un perro
"alegría" es un ave
Lenguajes
La creación de Prolog se dio en 1973. Kowalski y Colmerauer con su equipo a menudo
interactúan en el período 1971-1973. Esto ha influido en sus opiniones y les ayudó a
cristalizar las ideas.
Prolog puede verse como una realización práctica de la idea de los programas de la
lógica. Comenzó como una programación idioma para aplicaciones en el
procesamiento del lenguaje natural, pero poco después se comprobó que se puede
utilizar como un lenguaje de programación de propósito general, también. Un número
de intentos de otros para realizar el cálculo como paradigma de deducción se propone
en la misma época, en particular por Cordell Green y Carl Hewitt, pero la propuesta de
programación lógica, probablemente porque era la más simple y más versátil, se
convirtió en de mayor éxito.
Originalmente, Prolog fue implementado por Philippe Roussel, un colega de
Colmerauer, en forma por un intérprete, escrito en Algol-W. Un avance importante se
logró por David H. Warren quien propuso en 1983 una máquina abstracta, que ahora
se llama WAM (Warren Abstract Machine), que consiste en una arquitectura de la
máquina con un conjunto de instrucciones que sirve como un objetivo independiente
para la máquina Prolog compiladores. WAM se convirtió en una base común para la
aplicación de Prolog y la programación lógica de otros idiomas.
6. LENGUAJE PROLOG
Para desarrollar el tema sobre este paradigma, se toma como ejemplo a Prolog.
Características del lenguaje:
8
Paradigma de programación lógica.
http://es.wikipedia.org/wiki/Programaci%C3%B3n_l%C3%B3gica#Fundamentos
25. Autor: Luis Heladio Garzón Rodríguez
Paradigma: Lógica
Apareció en: 1971
Diseñado por: Alain Colmenaur y Philippe
Roussel
Tipo de dato: Fuerte, Estático
Implementaciones: Numerosas
Influido por:
Ha influido a:
Sistema operativo: Multiplataforma
Licencia de
software:
GNU GPL
Prolog Se trata de un lenguaje de programación ideado a principios de los años 70 en
la Universidad de Aix-Marseille (Marsella, Francia) por los profesores Alain Colmerauer
y Philippe Roussel. Nació de un proyecto que no tenía como objetivo la implementación
de un lenguaje de programación, sino el procesamiento de lenguajes naturales. Alain
Colmerauer y Robert Pasero trabajaban en la parte del procesado del lenguaje natural
y Jean Trudel y Philippe Roussel en la parte de deducción e inferencia del sistema.
Interesado por el método de resolución SL, Trudel persuadió a Robert Kowalski para
que se uniera al proyecto, dando lugar a una versión preliminar del lenguaje Prolog a
finales de 19712
y apareciendo la versión definitiva en 1972.3
Esta primera versión de
Prolog fue programada en ALGOL W.
Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, en 1983,
David H.D. Warren desarrolló un compilador capaz de traducir Prolog en un conjunto
de instrucciones de una máquina abstracta denominada Warren Abstract Machine, o
abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado.
Si bien en un principio se trataba de un lenguaje de uso reducido, la aparición de
intérpretes del mismo para microordenadores de 8 bits (ej: micro-PROLOG) y para
ordenadores domésticos de 16 bits (ej: Turbo PROLOG de Borland, entre otros
muchos) a lo largo de la década de 1980 contribuyó notablemente a su
popularización.4
Otro importante factor en su difusión fue la adopción del mismo para
el desarrollo del proyecto de la quinta generación de computadoras a principios de la
década de los 80,5
en cuyo contexto se desarrolló la implementación paralelizada del
lenguaje llamada KL1 y del que deriva parte del desarrollo moderno de Prolog.
Las primeras versiones del lenguaje diferían, en sus diferentes implementaciones, en
muchos aspectos de sus sintaxis, empleándose mayormente como forma normalizada
el dialecto propuesto por la Universidad de Edimburgo6
, hasta que en 1995 se
estableció un estándar ISO (ISO/IEC 13211-1), llamado ISO-Prolog.
Para profundizar sobre el lenguaje prolog y sus características revise en
http://es.wikipedia.org/wiki/Prolog
26. Autor: Luis Heladio Garzón Rodríguez
http://www.dirinfo.unsl.edu.ar/~analisis/teorias/teo_prolog_2006.pdf
Por cuenta propia debe investigar los temas siguientes, para que pueda ir
estableciendo un comparativo con los otros paradigmas de programación revisados.
2.1 Tipos de datos
2.2 Estructuras de control
2.3 Funciones y/o procedimientos
2.4 Estructuras de datos
2.4.1 Datos Estructurados
2.4.2 Estructura de datos
2.4.2.1 Arreglos
2.5 Creación de objetos
2.6 Constructores
2.7 Reglas de Matching
BIBLIOGRAFIA
El lenguaje de programación Prolog.
http://www.lawebdelprogramador.com/cursos/enlace.php?idp=4805&id=77&texto=Prolog
The GNU Prolog Web Site. http://www.gprolog.org/
Prolog. Wikipedia. http://es.wikipedia.org/wiki/Prolog
Programación lógica. http://www.amzi.com/articles/code07_whitepaper.pdf
Paradigma lógico. http://www-2.dc.uba.ar/materias/plp/20062C/download/clase8.pdf
Programación lógica. http://es.wikipedia.org/wiki/Programaci%C3%B3n_l%C3%B3gica