Logo Studenta

Programación 2021

¡Este material tiene más páginas!

Vista previa del material en texto

Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 1 de 27 
Conceptos Básicos de Programación Este apunte incluye conceptos básicos utilizados durante el cursado de Métodos Computacionales I. Debe complementarse con lo expuesto en clase y materiales que profundicen o amplíen estos contenidos. 1. Introducción. Resolución de problemas mediante algoritmos:El ser humano se enfrenta a una diversidad de problemas. ¿Cómo obtener un café de una máquina? ¿Cómo elegir la siguiente jugada en un partido de ajedrez? ¿Cuál es la solución de un sistema de ecuaciones?... etc. Los problemas, computacionales o no, son distintos pero todos pueden plantearse como una diferencia entre un estado inicial o actual y un estado deseado o final. Para pasar de un estado a otro debemos realizar un conjunto de determinadas acciones. 
Algoritmo: Es una secuencia ordenada y finita de pasos (acciones) que permite hallar la solución de un problema. Nos permite pasar desde un estado inicial o actual a un estado final o deseado. Características deseables de un algoritmo: 
• Deben ser suficientemente generales (prever contingencias)
• Deben ser claros para facilitar la comprensión.
• Cada acción es determinada (sin ambigüedades y sin depender de la casualidad)
• Debe involucrar un número finito de pasosEjemplo 1: Algoritmo para reemplazar el vidrio roto de una ventana a un cliente. 1. Inicio.2. Medir ancho y alto de espacio a cubrir con vidrio.3. Calcular tamaño de vidrio nuevo.4. Confeccionar presupuesto.5. ¿El cliente acepta el presupuesto? SI: Ir a paso 6. NO: Ir a paso 9.6. Cortar vidrio nuevo.7. Retirar vidrio roto.8. Colocar vidrio nuevo.9. Fin.
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 2 de 27 
Ejemplo 2: Mostrar por la pantalla de una computadora, una tabla que contenga las temperaturas desde 0° a 10° grados centígrados (con escala de 1°) y sus respectivos valores equivalentes en grados fahrenheit. 1. Inicio.2. Asignar 0 a cantidad de grados centígrados.3. Repetir los pasos 4, 5 y 6 mientras la cantidad de grados centígrados sea menor o igual a 10°:4. Calcular equivalente de grados centígrados, en grados Fahrenheit.5. Mostrar por pantalla grados centígrados y Fahrenheit.6. Incrementar en 1 la cantidad de grados centígrados.7. FinEl ejemplo 2 corresponde a un problema computacional, mientras que el ejemplo 1 es de otro ámbito. En todos los casos, la idea es elaborar un algoritmo que resuelva el problema planteado detallando sus pasos en forma ordenada. El resto de este apunte hará referencia sólo a algoritmos que resuelven problemas computacionales. 
2. Términos presentes en la resolución de problemas computacionales:
• Instrucción: Es una orden o acción clara y precisa.
• Proceso: Ejecución de una o varias instrucciones en forma secuencial (un conjunto deinstrucciones se está ejecutando cuando la computadora está realizando lo indicado por éstas).
• Variable: Es un lugar de memoria donde se almacena un dato que puede ir cambiando. Tienelos siguientes atributos:- Nombre: Es necesario identificar cada variable con un nombre diferente. Es convenienteque sea representativo de la información que representa.- Tipo de dato: Describe el tipo de información que almacenará la variable. Algunos tiposde datos son: Entero, Real, Lógico, Carácter, String (es una cadena de caracteres). El tipode dato limita las operaciones que podrán realizarse con cada variable. A continuaciónse mencionan algunas a modo de ejemplo.TIPO DE DATO ALGUNAS DE LAS OPERACIONES PERMITIDAS Entero Suma, resta, multiplicación, división, potencia Real Suma, resta, multiplicación, división, potencia, parte entera Lógico Conjunción, disyunción, negación String y caracter Concatenación, comparación Nota: Con respecto a los operadores aritméticos incluidos en expresiones algebraicas, el orden de precedencia es: primero términos entre paréntesis, luego potencia y radicación, después multiplicación y división y por último suma y resta (el mismo que utilizan las calculadoras). Dichas expresiones se evalúan de izquierda a derecha. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 3 de 27 
• Programa: Es la codificación de un algoritmo. Se escribe bajo la sintaxis determinada por unlenguaje de programación.
• Lenguaje de programación: Es un lenguaje diseñado para expresar el conjunto de instruccionesque un equipo debe ejecutar. Por lo tanto, un lenguaje de programación es un modo prácticopara que los seres humanos puedan dar instrucciones a un equipo. Está formado por unconjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significadode sus elementos y expresiones.Los lenguajes pueden ser compilados o interpretados:- Lenguaje compilado: Una vez escrito el programa en código fuente, se traduce enbloque por medio de un compilador a código máquina, generándose un archivoejecutable que realiza el conjunto entero de instrucciones indicadas en el código,cuando se lo solicite. Ejemplos: C, Fortran, Basic, etc.- Lenguaje interpretado: Las instrucciones se interpretan y traducen una por una alenguaje máquina en tiempo de ejecución mediante un intérprete. Ejemplos: Lisp,Scilab, etc.En cuanto a velocidad de ejecución, un programa en un lenguaje interpretado se ejecuta más lento que uno compilado, aproximadamente 10 veces. Con respecto al chequeo de tipos de datos, en un lenguaje compilado se hace en tiempo de compilación (estático), es decir, cuando el compilador realiza la traducción. En cambio, en un lenguaje interpretado, se hace en tiempo de ejecución (dinámico). Por tal motivo, en los lenguajes compilados se deben declarar los tipos de datos de las variables dentro del código fuente, mientras que en los interpretados no. 
3. Algoritmos:Los algoritmos se componen de:
• Instrucciones elementales:- Asignación: Permite asociar un valor a una variable, es decir almacenar un dato en elespacio de memoria correspondiente a una variable. Es la instrucción fundamental, yaque todo algoritmo implica una cantidad de asignaciones más o menos complejas.Sintaxis: v = EDonde: v es una variable cualquiera y E puede ser un valor, una expresión que arroja unresultado u otra variable con un valor asignado anteriormente.Se lee como “Asignar a v, el valor de E”.- Entrada/Salida: Permiten la comunicación con el mundo exterior, es decir todo aquelloque está fuera del algoritmo.
� Las instrucciones de entrada permiten asociar un valor a una variable pero este valor es tomado del exterior, por ejemplo desde el teclado o desde un archivo. Sintaxis: Leer v. (Donde: v es el nombre de la variable) 
� Las instrucciones de salida permiten mostrar los resultados obtenidos al exterior, por ejemplo por pantalla o a un archivo. Sin esta instrucción, las soluciones no podrían darse a conocer. Sintaxis: Escribir E. (Donde: E es una expresión) 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 4 de 27 
• Estructuras lógicas básicas:Están compuestas por grupos de instrucciones que se organizan de distintas formas desde elpunto de vista del flujo de la ejecución. Es decir, del orden en que se realizan talesinstrucciones. Las estructuras básicas son:- Secuencial: Está compuesta por una serie de instrucciones que se ejecutan en formaconsecutiva. Se realizan sólo una vez en el mismo lugar del algoritmo.- Alternativa o Condicional: Nos permite tomar decisiones en función del valor de verdadde una condición lógica. Si la condición evaluada resulta verdadera, se ejecuta unasecuencia de instrucciones mientras que si la misma es falsa se ejecuta otra diferente.- Iterativa o Repetitiva: Permite repetir una serie de instrucciones tantas veces como seanecesario. El número de veces debe ser finito.Estas estructuras se pueden combinar entre sí en un mismo nivel (una a continuación de otra) o en forma anidada (una dentro de otra).
4. Resolución de problemas computacionales:La resolución de problemas computacionales conduce a la escritura de un programa y a su posterior ejecución. Aunque este es un proceso creativo, existenuna serie de etapas comunes a seguir en el desarrollo de programas. Estos son: 4.1. Planteo y análisis del problema: Para poder desarrollar un programa, primero se debe entender el problema que se debe resolver. Se debe establecer cuál es el objetivo deseado y como alcanzarlo. 4.2. Diseño del algoritmo: Así como para construir un edificio, primero se debe diseñar en un plano de éste. Para escribir el código de un algoritmo, antes realizaremos su diseño mediante diagramas y pseudocódigo. 4.3. Codificación del algoritmo: Se transcribe el diseño del algoritmo al lenguaje de programación utilizado, en un archivo de texto al que denominaremos “archivo fuente”. 4.4. Generación de código ejecutable. Ejecución, prueba y depuración de errores: A partir del código fuente se genera el código ejecutable, entendible por la máquina. Lo primero durante este proceso, es resolver los errores de sintaxis en el código fuente. Una vez obtenido el ejecutable, se debe probar y determinar si el código hace lo que se desea que haga. Si no es así, quiere decir que existen errores lógicos en el diseño del algoritmo. Finalmente, éstos se deben corregir hasta que el programa funcione correctamente. En las próximas secciones se explicará con más detalle cada una de estas etapas. 
4.1. Planteo y análisis del problema: ¿Cuál es la información que se quiere obtener con el programa a desarrollar, es decir, sus datos de salida? ¿Qué datos de entrada se necesitan para calcular u obtener tal información? ¿Cómo se plantea obtener los datos de salida a partir de los datos con los que se cuenta? ¿Cuáles son las limitaciones? ¿Qué casos particulares deberían preverse? 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 5 de 27 
4.2. Diseño del algoritmo: Para llevar a cabo esta etapa, es conveniente aplicar las reglas establecidas por el diseño estructurado. Es decir, se busca obtener algoritmos que cumplan la propiedad de modularidad. La misma consiste en dividirlos en partes, a las que llamaremos “módulos”, que se diseñan, codifican y prueban por separado. En relación a esto, se deben mencionar dos estrategias: 
• Top-down (“de arriba hacia abajo”): Se formula un resumen del sistema, sin especificardetalles. Cada parte se refina diseñando con mayor detalle. Cada parte nueva es entoncesredefinida, cada vez con mayor detalle, hasta que la especificación completa es losuficientemente detallada.
• Bottom-up (“de abajo hacia arriba”): Las partes individuales se diseñan con detalle y luego seenlazan para formar componentes más grandes, que a su vez se enlazan hasta que se forma elsistema completo.Otra consideración a tener en cuenta cuando se diseña un algoritmo, es que debe ser lo suficientemente ordenado y claro para poder ser entendido en un futuro y además, debe pensarse de tal manera que pueda adaptarse a ampliaciones o a cambios de la funcionalidad requerida (escalabilidad). Para diseñar un algoritmo se pueden utilizar diagramas y/o pseudocódigos, entre otras cosas. Estas herramientas de diseño son independientes del lenguaje de programación que se utilice para codificar. 
• Diagramas: Existen varios de tipos de éstos. Por ejemplo, diagramas de flujo y de llaves.
• Pseudocódigo: La palabra “pseudo” se refiere a algo que no es original, sino que esuna imitación. O sea, estamos realizando una “imitación” de las instrucciones de un códigofuente. El pseudocódigo utiliza palabras claves en lugar de símbolos. Estas son:
� Asignación: variable = expresión 
� Secuencia: Simplemente se escribe una instrucción (acción) bajo la otra. 
� Alternativa: SI / ENTONCES / SI NO / FIN SI 
� Repetitiva: - Si es un conteo controlado: PARA / HASTA / CON PASO / FIN PARA.- Si sólo se repite cuando una condición es verdadera: MIENTRAS / FINMIENTRASA continuación, veremos en forma genérica como representar las estructuras vistas con pseudocódigo: 
• Estructura Secuencial:
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 6 de 27 
• Estructura Condicional o Alternativa:
Si la Condición es verdadera, se realiza la Secuencia de acciones 1. Si no es así, se efectúa la Secuencia de acciones 2. También podría ocurrir que no haya nada que hacer si la Condición no se cumple, como se indica a continuación: 
• Estructuras Iterativas:- Conteo controlado: Las iteraciones se realizan una cantidad de veces, determinada yconocida antes de comenzar a iterar.
Donde: v: es una variable p: Es lo que se denomina paso. Es un valor numérico, usualmente dado en forma de una constante o contenido en una variable. Al comenzar la repetitiva, v se inicializa con Valor Inicial. En cada iteración, se realiza la Secuencia de acciones indicada arriba y se incrementa el valor de v en p. Si p es positivo, se evalúa la condición “v<Valor Final” y, si es verdadera, se efectúa una nueva iteración. Si es falsa, la repetitiva se detiene. El valor de p también podría ser negativo, en ese caso, en cada iteración se evalúa la condición “v>Valor Final” y si es falsa, la repetitiva se detiene. - Repetir Mientras: Se utiliza cuando se desconoce la cantidad de iteraciones antes decomenzar a iterar (como en un conteo controlado) ya que eso depende exclusivamentedel valor de verdad de la Condición. En cada iteración, se evalúa la condición. Si esverdadera, se realiza la Secuencia de acciones y se vuelve a verificar lo mismo. Si es falsa,se corta la repetitiva. Con esta estructura, se pueden realizar 0 o más iteraciones.
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 7 de 27 
- Iterativa con corte dentro de iteración: Las iteraciones se realizan una cantidad deveces determinada al igual que un conteo controlado común. Pero si la Condición de laAlternativa incluida en la iteración es verdadera, entonces la repetitiva se detiene en ellugar donde se indique, aunque no haya efectuado la cantidad de iteraciones previstaantes de iterar.
 PARAR 
Nota: Las Secuencias de acciones indicadas en este pseudocódigo podrían contener 0 o más instrucciones. A continuación, se muestra un ejemplo concreto de las estructuras mencionadas expresadas con pseudocódigo. Ejemplo 3: Leer dos datos de entrada naturales a y b. El valor a debe ser menor o igual que b, de lo contrario se deben intercambiar sus valores. Calcular la sumatoria de los números naturales pares que existen entre a y b inclusive. Los números que no sean pares, deben sumarse duplicados. El pseudocódigo es el siguiente: INICIO LEER a, b SI (a>b) ENTONCES aux=a a=b b=aux FIN SI S=0 PARA i=a HASTA b, CON PASO 1: SI (i/2 = int(i/2)) ENTONCES s=s+i SI NO s=s+i*2 FIN SI FIN PARA ESCRIBIR s FIN 
Observaciones: 
• Los datos a y b se leen desdeteclado y el resultado s semuestra por pantalla.
• La función int devuelve la parteentera de un valor.
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 8 de 27 
Funciones: Las funciones contienen un conjunto de instrucciones que se pueden ejecutar cada vez que se lo requiera, evitando repeticiones de código. Las funciones poseen: 
• Nombre: Rigen las mismas reglas que para el nombre de cualquier variable.
• Parámetros de Entrada: Son variables que contienen los datos que necesita la función paraejecutar sus instrucciones. Pueden ser varios, uno o ninguno.
• Parámetros de Salida: Son variables en las que se devuelven los resultados generados por lafunción. Pueden ser varios, uno o ninguno.Cada vez que se necesiten ejecutar las instrucciones de determinada función, la misma se invoca a través de su nombre y enviando valores a través de sus parámetros de entrada. El uso de funciones favorece a la modularidad, ya que se envían los datos necesarios y se obtienen los resultados deseados independientemente de cómo se haya implementado la función, lo cual es desconocido desde afuera de la misma, permitiendo poner el foco en otros aspectos del programa. A continuación, se muestra el pseudocódigo de una función: INICIO FUNCIÓN Nombre PARÁMETROS DE ENTRADA (PE): lista_de_variables PARÁMETROS DE SALIDA (PS): lista_de_variables … Secuencia de instruccionescontenidas en la función … FIN FUNCIÓN Podemos resolver el Ejemplo 3 en forma de una función. En este caso, los datos a y b son sus parámetros de entrada. El resultado s se retorna al exterior de la función desde donde es llamada. INICIO FUNCIÓN Ejemplo3 Parámetros de Entrada: a, b Parámetros de Salida: s SI (a>b) ENTONCES aux=a a=b b=aux FIN SI S=0 PARA i=a HASTA b, CON PASO 1: SI (i/2 = int(i/2)) ENTONCES s=s+i SI NO s=s+i*2 FIN SI FIN PARA FIN FUNCIÓN 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 9 de 27 
4.3. Codificación del algoritmo Las acciones incluidas en un diagrama de flujo o pseudocódigo se deben traducir a instrucciones que serán escritas en un archivo de texto utilizando la sintaxis establecida por el lenguaje de programación. Tales instrucciones traducidas constituyen el “código fuente” y el archivo se denomina “archivo fuente”. De esta manera, escribimos el programa, que es la codificación de un algoritmo. Es importante realizar una buena documentación de lo desarrollado. En esta etapa, eso tiene que ver con la elección de los nombres de las variables (que hagan referencia a su contenido, en lo posible) y con comentarios dentro del código que ayuden a entenderlo, pero eso no es todo. La documentación también es parte de otras etapas del desarrollo ya que incluye modelaciones, diagramas, pruebas, manuales de usuario, manuales técnicos, etc; todo con el propósito de eventuales correcciones, mantenimiento futuro y ampliaciones del programa. En el presente cursado, trabajaremos con Scilab: Es un software libre y de código abierto para aplicaciones en ingeniería y ciencias que incluye un lenguaje de programación interpretado. Se puede descargar desde el sitio www.scilab.org . Como se mencionó antes, en este lenguaje no es necesario declarar las variables y sus tipos en el código fuente antes de usarlas. Aquí se expondrá una breve introducción a este lenguaje, es imprescindible completar el tema. Para ello, se publica en Pedco material sobre Scilab. También el software cuenta con una Ayuda que brinda descripción y ejemplos de diferentes temas a utilizar durante la programación. También es una buena opción buscar en Internet lo que necesitamos a medida que avanzamos en el código. Nota: Las imágenes que se exponen a continuación corresponden a la versión 5.5.1, la cual era la última en el momento en que se confeccionó esta parte del apunte. No se han reemplazado ya que los cambios en la versión posterior no implican modificaciones en estas imágenes, a excepción de la barra de títulos. Para comenzar a trabajar, se debe abrir la Consola de Scilab. Esta se muestra a continuación: 
También la consola podría estar junto con otras aplicaciones (Explorador de $Variables, Historial de comandos o Explorador de Archivos) en la misma ventana como se muestra en la siguiente figura. Allí, se ve la consola en la parte central. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 10 de 27 
Se pueden escribir las instrucciones directamente en consola y ver su resultado al presionar la tecla “Enter”. Si no estamos interesados en que el resultado se muestre, bastará con agregar “;” al final de la instrucción. Ejemplo: 
1°. Se asigna 100 a la variable a. 2°. Se asigna a c, el resultado de dividir a por 99 y sumar a multiplicada por 2.5. Es útil aclarar que el valor de a no cambia, ya que no está en el lado izquierdo de la asignación. 3°. Se asigna a c, la suma del valor actual de c más 10. En este caso, el valor de c se modificará, pero no se muestra en consola porque la instrucción finaliza con “;”. 4°. El resultado de escribir el nombre de la variable c en consola, es el valor actual de la variable misma. Vemos que fue modificado por la instrucción anterior. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 11 de 27 
Las instrucciones que hemos ejecutado permanecen en un historial al que accedemos con las teclas y , “hacia atrás” y “hacia adelante” respectivamente. De manera que al presionar esas teclas, veremos las instrucciones anteriores en consola nuevamente, sin necesidad de volver a escribirlas. 
Ayuda: Para acceder a la Ayuda de Scilab, una forma puede ser escribir la palabra “help” en la consola y presionar “Enter”. Otra forma es hacer clic en el menú “?” y elegir Ayuda de Scilab. Como sea, se accederá a la siguiente ventana: 
Se distinguen 2 solapas: - La primera, con la imagen de un libro, muestra los temas en orden. Es la que está activa enla figura de arriba.- La segunda, con la imagen de una lupa, permite buscar aquello que queremos consultar,por ejemplo, una instrucción. Simplemente lo escribimos y presionamos enter. Luego, semostrará una lista de coincidencias del lado izquierdo. Al seleccionar una de éstas,aparecerá su descripción del lado derecho, incluso con algunos ejemplos. La figuraexpuesta en la siguiente página ilustra lo dicho, allí se buscó la instrucción “for”, utilizadaen Scilab para repetitivas.
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 12 de 27 
Continuando con el tema de ejecución de instrucciones en consola, si tenemos que escribir varias instrucciones seguidas allí, como ocurre al codificar un algoritmo completo, esto se torna engorroso. Entonces, podemos optar por escribir el código fuente completo en otro archivo y después ejecutarlo. Para eso, se podría utilizar cualquier editor de texto (por ejemplo, el Bloc de Notas) y escribir allí el código utilizando la sintaxis estipulada por el lenguaje. Pero es conveniente y recomendable usar el editor provisto por Scilab para este fin, ya que nos brinda la funcionalidad adecuada para eso. Por ejemplo, resaltará palabras reservadas escritas en el código, permitirá grabarlo y ejecutarlo, etc. Scilab provee un editor llamado SciNotes. Una manera de acceder a éste es ir al menú “Aplicaciones” y elegir SciNotes. La ventana del editor mencionado se muestra a continuación: 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 13 de 27 
Allí podemos escribir el código desarrollado en forma de Script o Función: Scripts: Contienen una secuencia de instrucciones. Los datos de entrada suelen obtenerse desde el exterior, sea desde teclado o desde archivos. Las variables utilizadas son globales. Eso quiere decir son reconocidas dentro y fuera del script. Se podría asignar un valor a una variable x dentro del script y al utilizar esa variable x en la consola o en otro archivo en ejecución, continuará teniendo el valor que se había asignado en el script. Es decir, debemos estar atentos a que el valor de una variable que utilicemos en un momento, no haya sido modificado involuntariamente dentro de algún script ejecutado, que utiliza el mismo nombre de variable para otra cosa. Funciones: Usualmente utilizan parámetros de entrada y de salida. Las variables definidas dentro de las mismas son locales. Es decir, sólo son reconocidas dentro del ámbito de la función a la que pertenecen y desde afuera no están definidas (también se pueden utilizar variables globales desde una función cuyos valores fueron asignados fuera de la misma, pero no se hace esto con frecuencia ya que es preferible trabajar con los parámetros de la función). El uso de funciones nos evitaría un inconveniente como el que se mencionó para el caso de los scripts. Además favorece a la modularidad y reusabilidad del código. Los nombres de los parámetros de entrada y salida expuestos en la declaración de la función también son locales (esto no ocurre con los nombres de los parámetros ingresados en la llamada de la función). Sintaxis de la declaración de una función: function [s1, s2, …] = Nombre de la función(e1, e2, …) … Cuerpo de la función … endfunction Donde: - e1, e2, … : Son parámetros de entrada. Son variables que guardan valores que necesita lafunción para realizar sus cálculos.- s1, s2, … : Son parámetros de salida. Son variables que guardan los valores que devuelve lafunción al exterior.Después de declarar una función y ejecutarla, está lista para ser llamada y obtenersu/s resultado/s ingresando valores para sus parámetros de entrada. Una función puede ser invocada desde el mismo archivo donde se declaró, desde consola o desde otro archivo .sci o .sce. La sintáxis de llamada de una función es: [r1, r2, …] = Nombre de la función(p1, p2, …) 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 14 de 27 
Donde: - r1, r2, … : Son variables que guardarán los valores de los parámetros de salida de la función s1,s2,…. - p1, p2,…: Son los valores asignados a los parámetros de entrada e1, e2, … de la función. Estospueden estar dados por constantes, variables o expresiones.No es necesario que sean iguales los nombres de los parámetros utilizados en la declaración y en la llamada. Sólo se verifica que coincida la cantidad de parámetros, además deben tener tipos compatibles con las operaciones en las que participarán dentro de la función. Es decir, por ejemplo, no se podría enviar como parámetro un caracter si en el cuerpo de la función multiplica ese valor por un real. Un archivo pueden contener una o más funciones. No es necesario, ni conveniente escribir una función en cada archivo. También Scilab permite tener en un archivo scripts y funciones juntos. Como regla general, los scripts deben guardarse en archivos con extensión .sce y las funciones con extensión .sci, aunque en la práctica Scilab permite otras combinaciones. Una vez escrito el código, debe guardarse. Una forma es hacer clic en botón de la barra de herramientas. Luego, puede ejecutarse mediante el botón . También podría hacerse estos dos pasos juntos con el botón (guardar y ejecutar) o desde la barra de menúes, desplegando el menú Ejecutar y eligiendo las opciones deseadas o desde consola como se explica en el apunte de Scilab publicado en Pedco. Instrucciones frecuentemente utilizadas en Scilab: Instrucciones básicas: 
• Asignación. Sintaxis: v = e. Donde:- v es una variable- e puede ser un valor, una expresión que arroja un resultado u otra variable con un valorasignado anteriormente.
• Entrada. Sintaxis: v = input(mensaje). Donde:- v es una variable- mensaje es una cadena de caracteres a mostrar por pantalla mientras se espera elingreso del valor de v.Permite ingresar el valor de v por teclado. 
• Salida. Generalmente, utilizaremos dos funciones: “disp” y “printf”.Sintaxis: disp(e1, e2, … ). Muestra por pantalla de la última a la primera ei. Donde:- ei pueden ser variables, constantes o expresiones. Sintaxis: printf(“formato”, e1, e2, …). Muestra por pantalla e1, e2, … utilizando el formato indicado en el primer parámetro. Donde: - Formato es una cadena de caracteres que incluye localización y formatos específicosde salida de cada ei. Por ejemplo: %f: Muestra un número en forma flotante (utilizadopara valores reales), %i: Muestra un número en forma de entero, etc.
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 15 de 27 
Instrucciones para implementar las estructuras lógicas básicas: 
• Secuencia. Se escriben las asignaciones una debajo de otra o separadas por “;”
• Estructura Condicional. Sintaxis:if (Condición) then Secuencia de acciones 1 en código Scilab else Secuencia de acciones 2 en código Scilab end Los paréntesis que encierran la Condición, se pueden omitir. Corresponde al diseño: 
Si cuando la Condición no se cumple no se debe hacer nada, la instrucción se reduce a: if (Condición) then Secuencia de acciones 1 en código Scilab end 
• Estructuras iterativas- Conteo controlado. Sintaxis:for v = Valor inicial : p : Valor final Secuencia de acciones en código Scilab end Si el paso p es 1, se podría omitir de la instrucción. Es decir, la misma línea se podría escribir “for v = Valor inicial : Valor final” Corresponde al diseño: 
Para un conteo controlado en el que v se decremente en cada iteración, la sintaxis Scilab es la misma. Sólo cambian los valores inicial, final y el paso. - Repetir mientras. Sintaxis:while (Condición) Secuencia de acciones traducidas a código Scilab end (Los paréntesis que encierran la Condición, se pueden omitir) 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 16 de 27 
Corresponde al diseño: 
• Los caracteres “//” se utilizan para incluir comentarios en el código. Lo que se escribe acontinuación de estas dos barras en la misma línea, se ignora durante la ejecución. A partir dela versión 6.0 inclusive, se permite incluir comentarios multilínea, los cuales deben estar entrelos símbolos “/*” y “*/”.Nota: en esta Primer Parte del apunte sólo se mencionan variables simples que almacenan un solo valor (aunque éste se modifique). Es necesario aclarar que usualmente en el cursado también trabajaremos con variables compuestas que almacenan más de un valor, denominadas arreglos. A continuación, se muestra el código Scilab correspondiente al ejemplo 3 representado en la etapa de diseño: En forma de script: a=input("ingrese 1er numero natural: ") b=input("ingrese 2do numero natural: ") if (a>b) then aux=a a=b b=aux end s=0 for i=a:1:b if (i/2 == int(i/2)) then //pares s=s+i else s=s+i*2 end end disp(s) 
En forma de función: function [s]=Ejemplo3(a, b) if (a>b) then aux=a a=b b=aux end s=0 for i=a:1:b if (i/2 == int(i/2)) then //pares s=s+i else //impares s=s+i*2 end end endfunction Nota: la función “int(valor)” es provista por Scilab. Devuelve la parte entera de valor. 4.3. Generación de código ejecutable. Ejecución, prueba y depuración de errores Una vez que el código fuente se ha escrito, el intérprete (o compilador, según el tipo de lenguaje de programación) lo traduce a código ejecutable. Durante esta traducción, lo primero que se hace es detectar los errores de sintaxis en el código fuente y mostrarlos. Si hay errores de este tipo, el programador debe volver a la etapa de Codificación del algoritmo, en la que deben ser corregidos revisando las reglas sintácticas del lenguaje de programación. Luego, se continúa con la siguiente etapa. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 17 de 27 
En el caso de Scilab, después de ejecutar el código contenido en un archivo: - Si hay errores sintácticos, se detallarán en la consola, como se ve en el ejemplo de la imagen:
Como se observa, se exponen los errores y los números de línea en que se encuentran. No siempre esto es exacto, es lo que detecta el intérprete, pero es una buena guía para buscarlos en el código fuente y corregirlos. Después de eso, hay que guardar y ejecutar nuevamente. Esto se repite hasta que el código ya no contenga errores sintácticos. - Si el código está sintácticamente correcto se podrá ver, por ejemplo, lo expuesto en la siguientefigura. Allí vemos que no se indican errores.
Para cualquier lenguaje, si un código es sintácticamente correcto, se genera el archivo ejecutable escrito en lenguaje máquina entendible por la computadora. Después, éste debe ejecutarse para determinar si realmente hace lo que se espera, es decir, si no se han cometido errores lógicos. Para eso, se ejecuta el programa suministrándole conjuntos de datos de entrada requeridos para poder realizar los cálculos (o acciones en general) correspondientes y se comparan los resultados obtenidos con los esperados. Si no coinciden, es porque hay errores lógicos que se arrastran desde el diseño. Una forma útil de detectarlos es hacer un seguimiento de código (o traza), descripto mas adelante. En ese caso, hay que volver a la etapa de Diseño del algoritmo, corregir los errores lógicos y seguir con las siguientes etapas de desarrollo. Al llegar a la última, nuevamente se depuran errores de ambos tipos. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 18 de 27 
Así, se produce una retroalimentación. Se trata de un proceso cíclico formado por las etapas de desarrollo de un programa, que se detiene cuando el código funciona correctamente. Es decir, cuando ya no hay errores para corregir. Seguimiento de código (o traza): Consiste en hacer el rol de la máquina cuando ejecuta una por una las instrucciones que hemos escritoen el código, respetando el orden en que se encuentran. Las instrucciones van generando distintos valores en las variables hasta que finalmente la ejecución se detiene y se quedan con sus valores finales. Algunos de estos últimos constituirán la salida del programa. Es decir, son los que se devuelve al usuario mediante algún medio entendible por éste como la pantalla, archivos y otros. No está demás aclarar que en un punto de la ejecución, el valor almacenado en una variable siempre será el último, los anteriores que tuvo se sobrescriben con los nuevos y se pierden si no se almacenan en otra variable o medio de almacenamiento. Una forma de realizar el seguimiento de código, es detallarlo en unatabla, con tantas columnas como variables haya y una fila por instrucción ejecutada.En esta etapa, se ha mencionado este procedimiento como una herramienta útil para darnos cuenta cuales son los errores lógicos cometidos en un código que no funciona correctamente. Pero es necesario destacar que el seguimiento de código o traza permite entender “que hace” exactamente un código y cuál es su salida, sea incorrecto o no. Por ejemplo, podrían darnos un código que no hemos visto antes y esta es una forma de seguirlo y entenderlo. A continuación, se muestra un seguimiento de código de un ejemplo dado en la etapa de Codificación: Seguimiento de código del Ejemplo 3, implementado mediante una función. Dada la llamada a función: [r]=Suma(10, 15), la traza sería la siguiente: a b aux s i 10 15 0 10 0+10 = 10 11 10+11*2 = 32 12 32+12 = 44 13 44+13*2 = 70 14 70+14 = 84 15 84+15*2 = 114 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 19 de 27 
Cuando finaliza la ejecución de la función Suma, ésta devuelve al exterior el valor de su parámetro de salida almacenado en la variable s, en este caso. Entonces, en el ámbito en el que se hizo esta llamada, se asigna el valor de s devuelto por la función a la variable r. Allí se desconoce por completo la existencia de las variables a, b, aux, s e i, ya que son locales al ámbito de la función Suma y sólo son reconocidas allí. Seguimiento de código del Ejemplo 3, en el que se implementa una función. Esta traza representa los que pasa cuando los parámetros de entrada anteriores se ingresan invertidos. Si la llamada hubiese sido: -->[r]=Suma(15, 10), sólo variaría al principio y el resto se mantendría igual, como se ve a continuación: a b aux s i 15 10 15 10 15 0 10 0+10 = 10 11 10+11*2 = 32 12 32+12 = 44 13 44+13*2 = 70 14 70+14 = 84 15 84+15*2 = 114 Después de ejecutar la función en consola, se verá el resultado de Suma asignado a la variable r: 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 20 de 27 
Si se ejecutara el Script codificado en el ejemplo 5 de la etapa de Codificación, en Consola se verá: 
Para seguir el mismo ejemplo dado para función, se ingresará 10. Entonces, el valor 10 se asigna a la variable a. Después se verá: 
Allí, hemos ingresado 15 para el 2do número natural y esto provocará que se asigne 15 a la variable b. El resto de lo que ocurre es lo mismo expresado en la traza de la función. Excepto al final donde, en el script, se indica que se muestre por pantalla el valor de s. Para ello, se debe agregar una columna a la traza que contenga el valor emitido por pantalla. En consola, se verá: 
En el caso de que los números ingresados estén invertidos, primero se asignará 15 a la variable a, luego 10 a la variable b. El resto de la traza es el mismo mostrado para la función aplicada a estos valores. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 21 de 27 
Arreglos A continuación, se incluyen algunos ejemplos de Arreglos. Se asume que la introducción ha sido dada en clase, en lecciones o apuntes publicados por ambos módulos. Ejemplo de Vectores (arreglos unidimensionales): Implementar una función en Scilab que tenga como parámetro de entrada, una cantidad n de valores a leer por teclado, los cuales deben cargarse en un vector v. Luego, las componentes de v se deben desplazar un lugar a la izquierda y el primer elemento debe quedar al final. Finalmente, la función debe devolver el vector v como parámetro de salida. Pseudocódigo Inicio Función ElemVector Parámetros de Entrada (PE): n Parámetros de Salida (PS): v Para i=1 hasta n, con paso 1: Leer v(i) Fin Para aux=v(1) Para i=1 hasta n-1, con paso 1: v(i)=v(i+1) Fin Para v(n)=aux Fin Función 
Código Scilab function [v]=ElemVector(n) for i=1:n v(i)=input("Ingrese valor: ") end aux=v(1) for i=1:n-1 v(i)=v(i+1) end v(n)=aux endfunction 
Seguimiento de código o Traza: Con la llamada a la función: [w]=ElemVector(3), las variables toman los siguientes valores: n i v aux w 3 1 11 <- Se asume que se ha ingresado 11 por teclado 2 11 12 <- Se asume que se ha ingresado 12 por teclado 3 11 12 13 <- Se asume que se ha ingresado 13 por teclado 11 1 12 12 13 2 12 13 13 12 13 11 12 13 11 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 22 de 27 
NOTA: Otra versión podría ser que v y n sean parámetros de entrada y no se haga la carga dentro de la función. En ese caso, el pseudocódigo y código serían: Pseudocódigo Inicio Función ElemVector Parámetros de Entrada (PE): v, n Parámetros de Salida (PS): v aux=v(1) Para i=1 hasta n-1, con paso 1: v(i)=v(i+1) Fin Para v(n)=aux Fin Función 
Código Scilab function [v]=ElemVector(v, n) aux=v(1) for i=1:n-1 v(i)=v(i+1) end v(n)=aux endfunction 
Considerando los mismos valores, se los podría asignar a un vector v como sigue: v=[11 12 13] Después, se podría hacer la llamada a la función: [w]=ElemVector(v, 3) Y generaría el siguiente seguimiento de código: n i v aux w 3 11 12 13 11 1 12 12 13 2 12 13 13 12 13 11 12 13 11 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 23 de 27 
Ejemplo de matrices (arreglos bidimensionales): Realizar una función en Scilab que tenga como parámetro de entrada la dimensión de una matriz (cantidad de filas y de columnas). La función debe leer los elementos de la matriz desde teclado. Luego, calcular la productoria de los elementos ubicados en la última columna. Finalmente, debe retornar la matriz y el resultado de la productoria, como parámetros de salida. Pseudocódigo Inicio Función ElemMatriz PE: n, m PS: A,p Mostrar (“Ingrese elementos por fila:") Para fila=1 hasta n, con paso 1 Para col=1 hasta m Leer(A(fila, col)) Fin Para Fin para p=1 Para fila=1 hasta n, con paso 1 p=p*A(fila,m) Fin para Fin Función 
Código Scilab function [A, p]=ElemMatriz(n,m) //Carga de elementos disp("Ingrese elementos por fila:") for fila=1:n for col=1:m A(fila, col)=input("Ingrese elem:") end end //Multiplicación elem de última columna p=1 for fila=1:n p=p*A(fila,m) end endfunction NOTA: La instrucción A(fila, col)=input("Ingrese elem:") podría mejorarse incluyendo, en el mensaje, el número de fila y de columna leído. Entonces, se podría reemplazar por: A(fila, col)=input("Ingrese elemento de fila " + string(fila) + ", columna " + string(col) + ":"). Por ejemplo, si fila es 2 y col es 3, en consola se verá: “Ingrese elemento de fila 2, columna 3:” Abajo se muestra la consola después de la llamada a la función [A, p]= ElemMatriz(2,3) (allí se ha utilizado la mejora de salida por pantalla indicada en la nota de arriba). En este caso, los elementos de la matriz ingresados por teclado son: 11 12 13 14 15 16 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 24 de 27 
Seguimiento de código o Traza: Con la llamada a la función: [A, p]=ElemMatriz(2,3) e ingresando por teclado los valores anteriormente mencionados, las variables toman los valores que se ven a continuación: n m fila col A p 2 3 1 1 [11] 2 [11 12] 3 [11 12 13] 2 1 11 12 13 14 2 11 12 13 14 15 3 11 12 13 14 15 16 1 p=1 1 1*13=13 p*A(1,3) 2 13*16=208 p*A(2,3) NOTA: Otra versión utilizada más frecuentemente, es que todos los elementos de A sean asignados de una sola vez. En ese caso, losparámetros de entrada de la función serían: A, n y m. El pseudocódigo, código Scilab y seguimiento serían: Pseudocódigo Inicio Función ElemMatriz PE: A, n, m PS: p p=1 Para fila=1 hasta n, con paso 1 p=p*A(fila,m) Fin para Fin Función 
Código Scilab function [p]=ElemMatriz(A,n,m) //Multiplicación elem de última columna p=1 for fila=1:n p=p*A(fila,m) end endfunction 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 25 de 27 
Para el ejemplo anterior, la asignación de A sería: A=[11 12 13; 14 15 16] Luego, se realizaría la llamada de la siguiente manera: [p]=ElemMatriz(A, 2,3) El Seguimiento de código de la llamada a la función: [p]=ElemMatriz(A,3) sería: n m fila col A p 2 3 11 12 13 14 15 16 1 p=1 1 1*13=13 p*A(1,3) 2 13*16=208 p*A(2,3) 
Otros ejemplos de Códigos: En adelante, se incluyen ejemplos de funciones implementadas en Scilab. Se deben probar realizando llamadas a las mismas asignando valores a sus parámetros de entrada y realizando un seguimiento de código en cada caso. Es importante destacar que hay más de una forma de implementar un ejercicio, aquí sólo se muestra una de ellas. Ejemplo I: Escribir una función que, dado un vector como parámetro de entrada, lo devuelva invertido como parámetro de salida. function [v]=Invertir(v) n=length(v) k=int(n/2) for i=1:k a=v(i) v(i)=v(n+1-i) v(n+1-i)=a end endfunction Nota: La instrucción for i=1:k también podría ser: for i=n:-1:n-k+1. 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 26 de 27 
Ejemplo II: Implementar el método de la burbuja para ordenar los elementos de un vector en forma ascendente. Este método funciona revisando cada elemento del vector con el siguiente e intercambiándolos si están en el orden equivocado. Es necesario revisar hasta que no se necesiten más intercambios, lo cual significa que el vector está ordenado. 
function [v]=Ord(v) n=length(v) cantIntercambios=n while (cantIntercambios>0) cantIntercambios=0 for i=1:n-1 if (v(i)>v(i+1)) then aux=v(i) v(i)=v(i+1) v(i+1)=aux cantIntercambios=cantIntercambios+1 end end end endfunction 
Ejemplo III: Implementar una función que tenga como parámetros de entrada, una matriz M, una fila p y un valor k. Para cada fila f posterior a p, se deben restar los elementos de f multiplicados por k a los elementos de p y asignar el resultado a la fila f. 
function [M]=Modif(M, p, k) [n m]=size(M) for f=p+1:n for c=1:m M(f,c)=M(p,c)-M(f,c)*k end end endfunction 
Métodos Computacionales I Año 2021 
Lic. Lidia Ferreyra Página 27 de 27 
Ejemplo IV: Escribir una función en Scilab que verifique si una matriz dada como parámetro de entrada, cumple con la condición de que cada uno de sus elementos no se repite en la fila y columna a la que pertenece. Si cumple, se debe devolver el valor 1 en un parámetro de salida. Si no es así, devolver 0. function [r]=Rep(M) [n m]=size(M) r=1 for f=1:n for c=1:m elem=M(f,c) for i=1:n if (elem==M(i,c) && f<>i) then r=0 break end end for j=1:m if (elem==M(f,j) && c<>j) then r=0 break end end end end endfunction

Continuar navegando