Hola Mundo 03

download Hola Mundo 03

of 11

description

kjbjb

Transcript of Hola Mundo 03

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 1/11

    .java.c.pas

    7 D E A G O S T O D E 2 0 0 7

    Captulo 3

    .Procedimientos y Funciones

    El uso de procedimientos y funciones tiene dos objetivos bien definidos:

    La reutilizacin de cdigo (o de algoritmos).La modularizacin de un algoritmo complejo en partes ms simples, pequeas yfciles de resolver.

    Por ejemplo hemos analizado un ejercicio de manejo de fechas en el que se ingresa un valorentero de 8 dgitos que representa una fecha (con el formato ddmmaaaa). Sera ideal teneruna funcin que reciba ese valor entero y que retorne el da. O bien una funcin que retorne elfactorial de un nmero.

    Justamente eso es lo que permiten hacer las funciones.

    Funciones

    Una funcin es un subprograma que al al ser invocado retorna un valor en funcin de losargumentos que recibe. Igual que las funciones matemticas.

    Por ejemplo la funcin seno(x)

    si x vale 90 entonces seno(x) = 1si x vale 0 entonces seno(x) = 0si x vale 270 entonces seno(x) = 1

    Vemos que el resultado de la funcin seno(x) depende del valor del argumento x. De la mismamanera podemos definir funciones para luego invocarlas desde nuestros programas.

    Volveremos a analizar el problema de mostrar el factorial del nmero ingresado peroconsiderando ahora la funcin factorial.

    Publicaciones del Autor

    >> Click para Ms Informacin

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 2/11

    AnlisisA la izquierda vemos el programa principal. Leemos el valor e invocamos a la funcinfactorial pasndole como parmetro el valor leido (n). El resultado lo almacenamos en lavariable result y luego lo mostramos.

    A la derecha vemos el diagrama de la funcin factorial. Esta funcin recibe un parmetro (p),calcula su factorial y retorna ese valor.

    Recordemos que Pascal es un lenguaje fuertemente tipado por lo tanto tenemos queespecificar el tipo de datos de los parmetros y del valor de retorno de la funcin.

    En el caso de la funcin factorial hemos especificado que el parmetro p ser de tipo integery el valor de retorno de la funcin sera de tipo real (esto lo estudiaremos ms adelante).

    Por ltimo, el valor que queremos retornar al momento de invocar la funcin debe ser asignadoal mismo nombre de la funcin (como si el nombre de la funcin fuera una variable).

    testFuncionFactorial.pas

    1:2: //funcionfactorial3: functionfactorial(p:integer):real;4: vari:integer;fact:real;5: begin6: i:=1;7: fact:=1;8: while(i

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 3/11

    Es decir que siempre que identifiquemos funciones independientes sera bueno poderlas tenerpor separado, de forma tal que vayamos conformando nuestra propia librera de funcionespara poderlas invocar desde cualquier programa donde las necesitemos.

    En Pascal podemos tener archivos que solo contengan funciones y procedimientos para luegoinvocarlos desde nuestros programas. Estos archivos son llamados unidades (o unit). Acontinuacin veremos una unit en el que definiremos la funcin factorial.

    libreria.pas

    1:2: //nombredelaunit(debecoincidarconelnombre3: //delarchivo)4: unitlibreria;5:6: interface7: //enestaseccionsedefinenlosprototiposdelos8: //procedimientosyfuncionesquetendremosen9: //estearchivo10:11: functionfactorial(p:integer):real;12:13: implementation14: //enestaseccionseprogramanlosprodecimientos15: //yfuncionesdefinidosenlaseccioninterface16:17: functionfactorial(p:integer):real;18: vari:integer;fact:real;19: begin20: i:=1;21: fact:=1;22: while(i

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 4/11

    Procedimientos

    Al igual que las funciones, los procedimientos son subprogramas. La diferencia es que losprocedimientos no tienen valor de retorno. La nica forma de devolver algn valor que tieneun procedimiento es modificando el valor de los parmetros. Para esto el parmetros debenrecibirse por referencia.

    Parmetros por valor y por referencia

    Los parmetros se pueden recibir por valor o por referencia. Cuando se reciben por valor, elprocedimiento o la funcin no puede modificar su valor. Cuando se reciben por referencia elprocedimiento o la funcin puede modificarlo.

    El ejemplo tpico para analizar esto es un procedimiento permutar(a,b). Recibe dosparmetros y permuta sus valores.

    Analicemos el siguiente problema para estudiar este caso.

    Problema 3.1Leer dos valores numricos por teclado. Realizar un procedimiento que los reciba y lospermute.

    AnlisisEl programa principal simplemente lee los valores x e y, e invoca al procedimiento permutarpasndole como parmetro los dos valores. Luego muestra el valor de x y el valor de y.

    Diagramamos dos versiones del procedimiento permutar. Las dos versiones son idnticas. Lanica diferencia est en la definicin de los parmetros (en la versin de abajo se antepone lapalabra var).

    Cuando un procedimiento o una funcin recibe parmetros anteponiendo la palabra var losparmetros se reciben por referencia con lo cual su valor podr ser modificado dentro delprocedimiento. En cambio, si no se antepone la palabra var los parmetros se reciben porvalor, lo que significa que si se los modifica dentro del procedimiento o funcin lamodificacin solo ser vlida dentro de ese contexto (dentro del procedimiento) pero alsalir de este (y retornar al programa principal) sus valores originales no se vern modificados.

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 5/11

    Probemos esto en Pascal.

    problema3.1.pas

    1:2: //recibedosparametrosypermutasusvalores3: procedurepermutar(vara,b:integer);4: varaux:integer;5: begin6: aux:=a;7: a:=b;8: b:=aux;9: end;10:11: //programaprincipal12: varx,y:integer;13: begin14: write('Ingresedosvalores:');15: readln(x,y);16: permutar(x,y);17: writeln('xvale:',x,'yvale:',y);18: end.19:

    Si compilamos y ejecutamos este programa veremos que el procedimiento permutarefectivamente permuta los valores de los parmetros x e y.

    Ingresamos los valores x=4 e y=1 pero el programa al mostrar los valores de x e y muestra 1 y4. El procedimiento permutar permut sus valores.

    Una prueba interesante para el lector ser eliminar el prefijo var de los parmetros delprocedimiento permutar y volver a ejecutar el programa. Podr observar que los valores nose modifican.

    Tipos de Datos

    Cuando definimos variables e indicamos que son de un tipo de datos en particular estamosindicando la cantidad de bytes de memoria que se reservar para almacenar los valores queestas variables puedan contener durante la corrida del programa.

    Como la cantidad de bytes definida para cada tipo de datos es una cantidad finita resulta quelos valores que las variables vayan a contener estarn acotados por estas cantidades finitas debytes.

    Por ejemplo:

    El tipo integer implica 2 bytes con bit de signo. Veamos la representacin de estos bytes.

    Vemos que de los 16 bits que componen los 2 bytes del integer solo se utilizan 15 ya que elms significativo (el primero comenzando desde la izquierda) es el bit de signo. 0 indica queel nmero representado en estos dos bytes es positivo y 1 indica que el nmero representadoes negativo.

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 6/11

    El mayor nmero que podemos almacenar en una variable de 2 bytes con signo (o sea uninteger) es el nmero binario:

    |01111111|11111111|.

    Cada bit del nmero binario representa una potencia de 2. El menos significativo (el ms a laderecha) representa la potencia 0 (es decir 2 elevado a la cero) que vale 1. El siguiente(hacia la izquierda) representa la potencia 1 (o sea 2 elevado a la 1) que vale 2 y as.

    La conversin entonces surje de sumar los valores representados por los bits del nmerobinario que estn en 1.

    b1 = |00000000|00010000| en decimal es 16 ya que solo sumamos el valor representadopor el bit que est en 1.

    b2 = |00000000|00010001| en decimal es 17. Resulta de sumar los valores representadospor los bits en las posiciones 0 y 4, es decir: 2 elevado a la cero + 2 elevado a la 4. Resulta:1+16 = 17.

    Vemos entonces que el mayor nmero que podemos obtener en 2 bytes con bit de signo (esdecir ignorando el bit ms a la izquierda) es el nmero representado por todos unos salvo el designo.

    Luego sumamos las potencias de 2 representadas por todos esos unos (2 a la cero + 2 a la 1 +...+ 2 a la 15). Esto da: 32767. Este es el mayor nmero que puede contener una variable detipo integer. Y el menor ser un nmero binario con todos los bits en 1, incluso el de signo.Est es 32768.

    En reglas generales diremos que en n bits, el mayor nmero entero decimal que podemosalmacenar es (2 a la n) 1.

    En Pascal podemos utilizar los siguientes tipos de datos:

    Numricos Enteros:

    byte (1 byte sin signo) [ 0 , 255 ]shortint (1 byte con signo) [ 128 , 127 ]integer (2 bytes con signo) [ 32768 , 32767 ]word (2 bytes sin signo) [0 , 65535]longint (4 bytes con signo) [2147483648 , 2147483647]

    Resumiendo:

    Numricos Reales

    real (6 bytes) [1E38 , 1E+38]single (4 bytes) [7 dgitos significativos]double (8 bytes) [15 dgitos significativos]

    Alfanumricos

    string[n] (n+1 bytes)char (1 byte)

    Problema 3.2Considere dos circunferencias en un plano y un conjunto de 10 puntos. Realizar un programaque indique:

    1. Cuantos puntos caen dentro de la circunferencia 1

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 7/11

    2. Cuantos puntos caen dentro de la circunferencia 23. Cuantos puntos estn afuera de la circunferencia 14. Cuantos puntos estn afuera de la circunferencia 25. Cuantos puntos caen en el centro de la circunferencia 16. Cuantos puntos caen en el centro de la circunferencia 27. Cuantos puntos caen dentro de la interseccin de las dos circunferencias8. Cuantos puntos caen afuera de las dos circunferencias

    Para describir una circunferencia se ingresan tres valores reales: el radio y sus coordenadas(x, y). Para describir un punto se ingresan sus coordenadas (xp, yp).

    AnlisisVeamos un grfico para poder comprender mejor el problema.

    Consideremos la circunferencia 1. Dado un punto (xp, yp) podemos calcular la distancia entreeste punto y el punto central de la circunferencia (x1, y1). Luego, si esa distancia es mayorque el radio, el punto estar afuera de la circunferencia. Si la distancia es menor o igual queel radio, el punto estar adentro de la circunferencia. Si la distancia es igual a cero el puntoestar en el centro.

    Por lo tanto los puntos en cuestin son: (x1, y1) y (xp, yp). La distancia entre esos puntos sepuede calcular como:

    dist: = sqrt( (xp x1)2 + (yp y1)2 )

    El problema entonces consiste en leer los 10 puntos, por cada punto calcular la distancia alcentro de cada una de las circunferencias y mantener los contadores que correspondan.

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 8/11

    Para resolver el problema definimos la funcion procesaCirc. Esta funcin recibe los datos deuna circunferencia (r, x1, y1), los datos de un punto (xp,yp) y retorna un valor negativo opositivo segn el punto est dentro o fuera de la circunferencia.

    Adems, la funcin se encarga de incrementar los contadores que correspondan. Por estemotivo tambin recibe el contador de puntos dentro (cCirc1 o cCirc2) el contador de puntosfuera (cFue1 o cFue2) y el contador de puntos en el centro (cCentro1 o cCentro2). Comoestos contadores sern incrementados dentro de la funcin (segn corresponda) deben recibirsepor referencia (anteponiendo la palabra var) para que la funcin pueda modificar su valor.

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 9/11

    Analizando la funcin vemos que calcula la distancia (d) entre los dos puntos (cx,cy) y(px,py), y luego evala: si d

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 10/11

    27: cCentro1,cCentro2,28: cFue1,cFue2,cInter,cNing:integer;29: d1,d2:real;30: r1,x1,y1,r2,x2,y2:real;31: xp,yp:real;32: i:integer;33: begin34: cCirc1:=0;35: cCirc2:=0;36: cCentro1:=0;37: cCentro2:=0;38: cFue1:=0;39: cFue2:=0;40: cInter:=0;41: cNing:=0;42:43: write('Ingresecircunferencia1(r1,x1,y1):');44: readln(r1,x1,y1);45:46: write('Ingresecircunferencia2(r2,x2,y2):');47: readln(r2,x2,y2);48:49: fori:=1to10dobegin50:51: write('Ingresepunto',i,'(xp,yp):');52: readln(xp,yp);53:54: d1:=procesaCirc(r1,x1,y1,xp,yp,cCirc155: ,cCentro1,cFue1);56: d2:=procesaCirc(r2,x2,y2,xp,yp,cCirc257: ,cCentro2,cFue2);58:59: if((d10))thenbegin63: cNing:=cNing+1;64: end;65: end;66: end;67:68: writeln('Circunferencia1:Adentro:',cCirc169: ,'Centros:',cCentro1,'Afuera:',cFue1);70: writeln('Circunferencia2:Adentro:',cCirc271: ,'Centros:',cCentro2,'Afuera:',cFue2);72: writeln('Interseccion:',cInter73: ,'Afueradelasdos:',cNing);74: end.75:

    Argumentos en Lnea de Comandos

    Muchas veces necesitamos pasarle parmetros (o argumentos) directamente al programaprincipal. Ejemplos de esto son:

    format C:copy archivo1.exe archivo2.exegrep "buscando esto" *.pas

    Los programas copy, format y grep reciben sus argumentos directamente desde la lnea decomandos (desde el "DOS" o "command prompt") y realizan su tarea en funcin de losargumentos recibidos.

    En Pascal (y en todos los lenguajes de programacin) podemos hacer que nuestros programasreciban este tipo de argumentos. Veamos el siguiente ejemplo.

    testArg1.pas

    1:2: vari,n:integer;p:string;3: begin4: //obtengolacantidaddeparametrosquerecibe5: //elprogramaprincipal6: n:=paramCount();7:8: writeln('paramCount():',n);

  • 15/10/2015 HolaMundo.pascal(online):Captulo3

    http://holamundopascal.blogspot.mx/2007/08/capitulo3.html 11/11

    Entrada ms reciente Entrada antigua

    9:10: //ahoramuestrocadaunodeesosparametros11: //identificadosporsuposicion12:13: fori:=1tondobegin14: //accedoalparametro1,luegoal2yasi...15: p:=paramStr(i);16: writeln(p);17: end;18: end.19:

    Este programa recibe argumentos en lnea de comandos, muestra la cantidad de argumentosque recibe y luego muestra cada uno de esos argumentos.

    Pascal provee las funciones paramCount y paramStr. La primera retorna la cantidad deparmetros que el programa est recibiendo (ver lnea 6). Si no recibi ningn parmetroentonces retorna cero. La segunda recibe el nmero del parmetro al cual queremos acceder yretorna el parmetro ubicado en dicha posicin. Es decir: si queremos leer el valor del primerparmetro le pasamos 1, si queremos leer el valor del segundo parmetro le pasamos 2 y assucesivamente (ver lnea 15).

    Luego de compilar este programa podemos ejecutarlo y pasarle parmetros como vemos acontinuacin.

    En la imagen vemos que se invoca al programa testArg1 con los parmetros pablo, analia,jose y marcos. El programa muestra la cantidad de parmetros recibidos (4) y luego muestracada uno de estos parmetros, uno debajo del otro.

    Algoritmos y Estructuras de Datos UTN UBA..

    Publicado por PabloSZ

    No hay comentarios:

    Publicar un comentario en la entrada

    Pgina principal

    Suscribirse a: Enviar comentarios (Atom)

    Todos los Derechos Reservados Propiedad Intelectual Nro. 591212