UNIDEP INTERPRETES Portafolio de evidencias
EDGAR JAVIER URQUIJO RASCÓN MAT: 25113121 ING. SISTEMAS COMPUTACIONALES MAESTRO: DR. BENITO FRANCO URREA
8 OCT 2013
ÍNDICE Información escolar Introducción Definición de intérprete Estructura de un intérprete Ventajas y desventajas de los interpretes Aplicación de los sistemas basados en intérpretes Tipos de intérpretes Introducción a los análisis sintácticos Tareas 1.- investigación de conceptos. DEPURACIÓN, errores sintácticos, errores semánticos, errores en tiempo de ejecución. 2.-Programación imperativa, funcional, aspecto, arboles sintácticos 3.-Matriz de transición de estado Prácticas de clase Modo consola en python Resolución de ejercicios en SharpDevelop
FORMACIONINSTITUCIONAL MISION.
La misión de UNIDEP es formar profesionales de éxito que cuenten con actitudes, habilidades y conocimientos que demanda el sector productivo de la región.
VISION.
La Universidad del Desarrollo Profesional es una institución de educación superior
de
calidad,
que
ofrece
programas
presénciales
y
semipresenciales de bachillerato, profesional asociado, licenciatura, postgrado, diplomados y cursos en México y en el extranjero.
Se distingue por facilitar a sus egresados la incorporación al mercado de trabajo, apoyada en una estrecha vinculación con el sector productivo yen planes de estudios pertinentes y dinámicos.
Es reconocida por su modelo educativo profesionalizante, por la flexibilidad de su oferta académica impartida en ciclos continuos y por horarios y cuotas accesibles, acordes a la disponibilidad de tiempo y recursos económicos del alumno.
Cuenta con profesores de amplia experiencia profesional y educativa. Sus instalaciones
dentro
de
la
ciudad
permiten
el
fácil
acceso. Cuenta con un modelo de administración sistematizado, participativo, operado por personal que es recompensado por su desempeño efectivo que le permite maximizar las aportaciones de sus socios y mantener finanzas sanas.
VALORESYACTITUDESUNIDEP Lealtad._ Los Integrantes de la comunidad Universitaria consideramos la fidelidad como un valor excelso que enaltecemos en nuestro quehacer diario. Justicia._LosintegrantesdelacomunidadUniversitariaactuamosconlaconsta nte y perpetua voluntad de dar a cada cual lo que le corresponde conforme a sus méritos o actos. Honestidad._ Los integrantes de la comunidad universitaria actuamos con sinceridad y honradez en nuestras tareas y en congruencia entre los pensamientos, palabras y acciones. Responsabilidad._ Los integrantes de la comunidad universitaria llevamos a cabo nuestras actividades con integridad, consentido del propósito y apegados a los objetivos institucionales. Esfuerzo._ Los integrantes de la comunidad universitaria usamos nuestra máxima energía para cumplir con los objetivos trazados. Creatividad._ Los integrantes de la comunidad universitaria resolvemos los problemas con imaginación, conocimientos y con un espíritu de mejora continua.
Introducción En este trabajo se reúnen todas las evidencias obtenidas atreves del curso de INTERPRETES, desglosando el contenido del curso, así como analizando los trabajos, ejercicios, tareas, exámenes y todo a aquel documento que registre y haga constar el avance y desarrollo del mismo, sin más a continuación se muestra la presentación del documento.
Definición de intérpretes Un interpretador es un programa informático capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripción en un lenguaje de programación al código de máquina del sistema, los intérpretes sólo realizan la traducción a medida que sea necesaria, típicamente, instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción.
Interpretar: ejecutar un programa escrito en un lenguaje de alto nivel traduciéndolo línea por línea. Compilar: traducir un programa escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel de una vez, en preparación para la ejecución posterior.
Los intérpretes son a menudo usados para construir máquinas virtuales que enlazan la máquina de computación esperada porla semántica y la máquina de computación disponible en elhardware.
Estructura de un intérprete A la hora de construir un intérprete es conveniente utilizar una Representación Interna (RI) del lenguaje fuente a analizar. De esta forma, la organización interna de la mayoría de los intérpretes se descompone en los módulos: 1. Traductor a Representación Interna: Toma como entrada el código del programa P en Lenguaje Fuente, lo analiza y lo transforma a la representación interna correspondiente a dicho programa P. Representación Interna (P/RI): La representación interna debe ser consistente con el programa original. Entre los tipos de representación interna, los árboles sintácticos son los más utilizados y, si las características del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia. Tabla de símbolos: Durante el proceso de traducción, es conveniente ir creando una tabla con información relativa a los símbolos que aparecen. La información a almacenar en dicha tabla de símbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, información sobre identificadores (nombre, tipo, línea en la que aparecen, etc.) o cualquier otro tipo de información que se necesite en la etapa de evaluación. Evaluador de Representación Interna: A partir de la Representación Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluación es necesario contemplar la aparición de errores. Tratamiento de errores: Durante el proceso de evaluación pueden aparecer diversos errores como desbordamiento de la pila, divisiones por cero, etc. que el intérprete debe contemplar.
Ventajas y desventajas de un intérprete Ventajas de un intérprete Flexibilidad: permite realizar acciones complejas, imposibles o muy difíciles con un compilador, como las siguientes: Ejecución de cadenas de caracteres mediante operadores como "execute", "interprete" o "evalquote". Modificar sobre la marcha el significado de los símbolos e incluso prescindir por completo de las declaraciones. Obtener un ligamiento dinámico completo en los sistemas orientados a objetos. Simplificar la gestión de memoria en los programas fuente. Facilidad de depuración de programas: la interpretación puede interrumpirse en cualquier momento para examinar o modificar los valores de las variables o la situación en la ejecución. La tabla de símbolos está disponible. Se pueden corregir los errores y continuar. Trazas y paradas programadas. Saltos en el programa. Abandonos de subrutinas. Rapidez en el desarrollo. Desventajas de un intérprete Velocidad: usualmente un orden de magnitud menor que la de un programa compilado. Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Aplicación de los sistemas basados en intérpretes Los sistemas interpretados han tenido una gran importancia desde la aparición de los primeros ordenadores. En la actualidad, la evolución del hardware abre nuevas posibilidades a los sistemas interpretados. La preocupación ya no es tanto la eficiencia como la capacidad de desarrollo rápido de nuevas aplicaciones. Las principales aplicaciones podrían resumirse en: Intérpretes de Comandos: Los sistemas operativos cuentan con intérpretes de comandos como el Korn-Shell, C-Shell, JCL, etc. Estos intérpretes toman un lenguaje fuente que puede incluir sentencias de control (bucles, condiciones, asignaciones, etc.) y ejecutan los diferentes comandos a medida que aparecen en el lenguaje. Lenguajes basados en Escritos (Scripting Languages), diseñados como herramientas que sirvan de enlace entre diferentes sistemas o aplicaciones. Suelen ser interpretados con el fin de admitir una mayor flexibilidad a la hora
de afrontar las peculiaridades de cada sistema. Podrían destacarse Perl, Tcl/Tk, JavaScript, WordBasic [Ousterhout 97] Entornos de Programación: Existen ciertos lenguajes que contienen características que impiden su compilación o cuya compilación no es efectiva. Estos lenguajes suelen disponer de un Complejo entorno de desarrollo interactivo con facilidades para la depuración de programas. Entre estos sistemas pueden destacarse los entornos de desarrollo para Lisp, Visual Basic, Smalltalk, etc. Lenguajes de Propósito Específico: Ciertos lenguajes incluyen sentencias que realizan tareas complejas en contextos específicos. Existe una gran variedad de aplicaciones en las que se utilizan este tipo de lenguajes como consultas de Bases de Datos, simulación, descripción de hardware, robótica, CAD/CAM, música, etc. Sistemas en Tiempo Real: Entornos que permiten modificar el código de una aplicación en tiempo de ejecución de forma interactiva. Intérprete de Código Intermedio: Una tendencia tradicional en el diseño de compiladores es la generación de un código intermedio para una máquina abstracta, por ejemplo, el P-Code de Pascal o los bytecodes de Java. El siguiente paso puede ser: generación del código objeto a partir del código intermedio para una máquina concreta, finalizando el proceso de compilación o interpretar dicho código intermedio en una máquina concreta. La tendencia habitual es definir un lenguaje intermedio independiente de una máquina concreta. Para ello, suele definirse una máquina virtual que contenga las instrucciones definidas por el lenguaje intermedio, permitiendo una mayor portabilidad. Un ejemplo sería la Máquina Virtual de Java, que es simulada en la mayoría de los visualizadores Web.
Tipos de intérpretes En función de la estructura inter del intérprete se pueden distinguir: Intérpretes puros. Interpretes avanzados. Interpretes incrementales. Evaluadores parciales. Compiladores “Justin Time”. Compiladores continúas. Intérpretes puros: son los que analizan y ejecutan sentencia a sentencia todo el programa fuente. Siguen el modelo de interpretación iterativa y, por tanto, se utilizan principalmente para lenguajes sencillos.
Intérpretes avanzados o normales: incorporan un paso previo de análisis de todo el programa fuente. Generando posteriormente un lenguaje intermedio que es ejecutado por ellos mismos. Permiten realizar un análisis más detallado del programa fuente (comprobación de tipos, optimización de instrucciones, etc.) Interpretes incrementales: Existen ciertos lenguajes que, por sus características, no se pueden compilar directamente. La razón es que pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que se crean dinámicamente en tiempo en ejecución. La idea es compilar aquellas partes estáticas del programa en lenguaje fuente, marcando como dinámicas las que no puedan compilarse. Posteriormente, en tiempo de ejecución, el sistema podrá compilar algunas partes dinámicas o recompilar partes dinámicas que hayan sido modificadas. Evaluadores parciales: La utilización de evaluadores parciales o especializadores surge al considerar que muchos programas contienen dos tipos de datos de entrada. Compiladores “Just in time”: surgen con la necesidad de distribuir programas independientes de la máquina, para evitar la interpretación los códigos bytes se transforman en código nativo, el código es compilado a código nativo justo en el momento que lo necesita el programa.
Compilación continúa: Mejora de “just in time”, mezcla compilación con el código nativo con la interpretación. Dispone de dos módulos: intérprete de código de bytes, un compilador de código de bytes a código nativo. El código es mezcla de código fuente y nativo: al principio está todo sin compilar, a medida que el programa es ejecutado el compilador va generando traducciones a código nativo.
Introducción a los análisis sintácticos También conocido como Análisis Sintáctico por Desplazamiento y Reducción; sus principales operaciones son como su nombre lo dice, desplazar y reducir. Aunque existen en realidad cuatro acciones posibles que puede realizar un analizador LR: desplazar, reducir, aceptar y error.
El análisis sintáctico LR, tiene un conjunto más amplio de gramáticas que el análisis sintáctico LL, además dichas gramáticas son un supra conjunto de los clases de gramáticas que se pueden analizar con analizadores sintáctico predictivos y se pueden generar expresiones más sencillas.
También debido a su sencillez y a su capacidad de análisis para una gran variedad de lenguajes, la técnica de análisis LR es elegida para los generadores automáticos de analizadores sintácticos; ya que con ellos se puede reconocer prácticamente todas las construcciones de los lenguajes de programación y así escribir gramáticas independientes de contexto.
Debido a estas razones y a que el desarrollo de la tabla y la aplicación del algoritmo fueron sencillo, opte por elegir este método de LR sobre el de LL, que considere más complicado en su desarrollo.
ANALISIS SINTACTICO LR
Los códigos de las acciones son:
1. di significa desplazar y meter en la pila el estado i, 2. rj significa reducir por la producción con número j, 3. Ok significa aceptr, 4. el espacio en blanco significa error. apuntar ae al primer símbolo de w$; repeatforeverbegin sea s el estado en la cima de la pila y a el símbolo apuntado por ae; if acción [s,a] = desplazar s thenbegin meter a y después s en la cima de la pila; avanzar ae al siguiente símbolo de entrada end elseif acción[s,a] = reducir A thenbegin sacar 2* símbolos de la pila; sea s el estado que ahora está en la cima de
la pila; meter A y después ir_a [s ,A] en la cima de la pila; emitir la producción A end elseif acción[s,a] = aceptar then return else error( ) end GRAMATICA DEL LENGUAJE P D V C A E T F S G O P Q Z S W
D Inicio C Fin (nume dato) id V ,id ; I L A S id = id ( id const E ) E+T E-T T T*F T/F F ( E ) id const S&& G S || G | G G == O G != O | O O< P O P O >= P P !Q | Q ( S ) id const ( X ) id const Si ( X Y ) { C W } R
C R Si_no { C } I Impr( id ) Impr(“mensaje”) Impr(“mensaje”, id) L Leer( id ) PARA LA TABLA DE OPERADORES ARITMETICOS I: E’ E E E T T T F
E E+T E-T T T*F T/F F (E)
F F
id const
Ir_a ( I , E ) Ir_a ( I , T ) Ir_a ( I , F ) I0: I1: I2: I3: E’ . E E’ E. E T. T F. E . E + T E E. + T T T. * F E . E - T E E. - T T T. / F E .T T .T*F T .T/F T .F F .(E) F . id F . const Ir_a ( I , ( ) Ir_a ( I , id ) Ir_a ( I , const ) Ir_a ( I , + ) I4: I5: I6: I7: F (. E ) F id . F const . E E+ . T E .E+T E .E+TT .T*F E .E–TT .T/F E .TT .F T .T*FF .(E) T . T / F F . id T . F F . const F . ( E ) F . id F . const
Ir_a ( I , - ) Ir_a ( I , * ) Ir_a ( I , / ) Ir_a ( I , E ) I8: I9: I10: I11: E E - . T T T *. F T T /. F F ( E . ) T .T*FF .(E)F .(E)E E.+T T . T / F F . id F . id E E . - T T .FF
Que es la depuraciónTarea 1 (Debugging) Depuración de programas es el proceso de identificar y corregir errores de programación. En inglés se le conoce como debugging, es que se asemeja a la eliminación de bichos (bugs), manera en que se conoce informalmente a los errores de programación. Se dice que el término bug proviene de la época de los ordenadores de válvula termoiónica, en los cuales los problemas se generaban por los insectos que eran atraídos por las luces y estropeaban el equipo. Si bien existen técnicas para la revisión sistemática del código fuente y se cuenta con medios computacionales para la detección de errores (depuradores) y facilidades integradas en los sistemas lowerCASE y en los ambientes de desarrollo integrado, sigue siendo en buena medida una actividad manual, que desafía la paciencia, la imaginación y la intuición del programador. Muchas veces se requiere incluir en el código fuente instrucciones auxiliares que permitan el seguimiento de la ejecución del programa, presentando los valores de variables y direcciones de memoria y ralentizando la salida de datos (modo de depuración). Dentro de un proceso formal de aseguramiento de la calidad, puede ser asimilado al concepto de prueba unitaria.
Errores sintácticos A los errores tipográficos, como por ejemplo la falta de puntos y comas, nombres de variables incorrectas, falta de paréntesis, palabras claves mal escritas, etc. los llamamos errores SINTACTICOS. Un programa no se puede ejecutar sin corregir absolutamente todos los errores sintácticos.
Errores en tiempo de ejecución Un error en tiempo de ejecución es un problema de hardware o software que impide que un programa funcione correctamente. Los errores en tiempo de ejecución pueden ocasionar la pérdida de información en el archivo en el que esté trabajando, causar errores en el archivo (dañándolo) de forma que no pueda trabajar con él o impedir que use una característica.
Errores semánticos Un error semántico se produce cuando la sintaxis del código es correcta, pero la semántica o significado no es el que se pretendía. La construcción obedece las reglas del lenguaje, y por ello el compilador o intérprete no detectan los errores semánticos. Los compiladores e intérpretes sólo se ocupan de la estructura del código que se escribe, y no de su significado. Un error semántico puede hacer que el programa termine de forma anormal, con o sin un mensaje
de error. Hablando en términos coloquiales, puede hacer que el equipo se quede "colgado".
Lenguajes formales y lenguajes naturales Formales: En matemáticas, lógica, y ciencias de la computación, un lenguaje formal es un lenguaje cuyos símbolos primitivos y reglas para unir esos símbolos están formalmente especificados.12 Al conjunto de los símbolos primitivos se le llama el alfabeto (o vocabulario) del lenguaje, y al conjunto de las reglas se lo llama la gramática formal (o sintaxis). A una cadena de símbolos formada de acuerdo a la gramática se la llama una fórmula bien formada (o palabra) del lenguaje. Estrictamente hablando, un lenguaje formal es idéntico al conjunto de todas sus fórmulas bien formadas. A diferencia de lo que ocurre con el alfabeto (que debe ser un conjunto finito) y con cada fórmula bien formada (que debe tener una longitud también finita), un lenguaje formal puede estar compuesto por un número infinito de fórmulas bien formadas.
Naturales: En informática desde siempre se ha buscado que los ordenadores fuesen capaces de comprender el lenguaje humano, de modo que pudiesen obedecer órdenes directas del hombre. Sin embargo, aunque la gramática es sencilla de asimilar para los ordenadores, no asi el resto de variables. El timbre de cada persona, casi único, el tono, los ademanes y gestos… etc, todos ellos forman parte del lenguaje natural humano, y son mucho más difícilmente entendibles para un ordenador. Los avances tecnológicos, sin embargo ya permiten que se hayan hecho ciertos experimentos con éxito de captación de gestos, y reconocimiento de voz.
Clipper: Clipper es un lenguaje de programación procedural e imperativo creado en 1985 por NantucketCorporation y vendido posteriormente a ComputerAssociates, la que lo comercializó como CA-Clipper. En un principio Clipper se creó como un compilador para el sistema gestor intérprete de bases de datos dBase III (de hecho las versiones estacionales de Nantucket incluían una etiqueta que lo indicaba así), pero con el tiempo el producto evolucionó y maduró, convirtiéndose en un lenguaje compilado más poderoso que el original, no sólo por sus propias implementaciones sino también por las ampliaciones desarrolladas por terceros en C, Ensamblador y Pascal, de los que fue heredando características. Esto lo convirtió en la herramienta líder de desarrollo de aplicaciones de bases de datos relacionales bajo sistema operativo MS-DOS, sobre todo programas de gestión, contabilidad y facturación (SAGE-SP, líder del mercado español, lo usa para ContaPlus y FacturaPlus), agendas comerciales y programas de tarificación
(aproximadamente el 80% de las compañías de seguros de España lo utilizaron en los programas de sus agentes).
Fox pro: FoxPro (acrónimo de FoxBASE Professional) es un lenguaje de programación orientado a procedimientos (procedures), a la vez que un Sistema Gestor de Bases de datos o Database Management System (DBMS), publicado originalmente por Fox Software y posteriormente por Microsoft, para los sistemas operativosMS-DOS, MS Windows, Mac OS y UNIX.
Dbase: dBASE fue el primer sistema de gestión de base de datos usado ampliamente para microcomputadoras, publicado por Ashton-Tate para CP/M, y más tarde para Apple II, Apple Macintosh, UNIX[1], VMS[2], e IBM PC bajo DOS donde con su legendaria versión III Plus se convirtió en uno de los títulos de software más vendidos durante un buen número de años.
Infromix: Informix es una familia de productos RDBMS de IBM, adquirida en 2001 a una compañía (también llamada Informix o Informix Software) cuyos orígenes se remontan a 1980. El DBMSInformix fue concebido y diseñado por Roger Sippl a finales de los años 1970. La compañía Informix fue fundada en 1980, salió a bolsa en 1986 y durante parte de los años 1990 fue el segundo sistema de bases de datos más popular después de Oracle. Sin embargo, su éxito no duró mucho y para el año 2000 una serie de tropiezos en su gestión había debilitado seriamente a la compañía desde el punto de vista financiero.
Tarea 2 Programación imperativa Consiste en una secuencia de instrucciones que el ordenador debe ejecutar. Los elementos más importantes en esta forma de programar son: 1. Variables zonas de memoria donde guardamos información. 2. Tipos de datos, son los valores que se pueden almacenar. 3. Expresiones, corresponde a operaciones entre variables (del mismo o distinto tipo) 4. Estructuras de control, que permiten ejecutar un conjunto de instrucciones varias veces, ejecutar una parte del código u otra en función de que se cumpla una condición o abortar la ejecución del programa.
Programación funcional Pese a que trabajamos con funciones, el modelo desarrollado hasta ahora no verifica todos los requisitos del paradigma de programación funcional ya que, en nuestro caso existe el concepto de variable, que no se da en programación funcional. Nuestros programas pueden hacer uso de funciones que realizan su tarea como si de una caja negra se tratase, metemos parámetros de entrada y obtenemos algo a la salida. Nuestras funciones pueden servir como parámetros de entrada para otras funciones.
Programación orientada a aspectos La Programación Orientada a Aspectos (POA) es un paradigma de programación relativamente reciente cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de incumbencias. Gracias a la POA se pueden encapsular los diferentes conceptos que componen una aplicación en entidades bien definidas, eliminando las dependencias entre cada uno de los módulos. De esta forma se consigue razonar mejor sobre los conceptos, se elimina la dispersión del código y las implementaciones resultan más comprensibles, adaptables y reusables. Varias tecnologías con nombres diferentes se encaminan a la consecución de los mismos objetivos y así, el término POA es usado para referirse a varias tecnologías relacionadas como los métodos adaptativos, los filtros de composición, la programación orientada a sujetos o la separación multidimensional de competencias.
Los arboles sintácticos Un asunto habitual para los que comienzan a estudiar sintaxis en un marco como el de Principios y Parámetros es preguntarse cómo desarrollar los árboles de una manera digna. Los intentos de generarlos mediante programas de dibujo básicos se demuestran rápidamente insuficientes, por lo que lo que uno espera es que haya programas específicos que ayuden en esta labor a investigadores, profesores y estudiantes. Si te encuentras en esa tesitura, te alegrará saber que dichos programas existen y que, en algunos casos, se encuentran accesibles online de modo gratuito. Es el caso de PhpSyntaxTree o de RSyntaxTree. En ambos casos el procedimiento es el mismo: tú solo tienes que ofrecerle el enunciado analizado con corchetes rotulados y, tras darle al boton de ‘draw’, el árbol se genera inmediatamente. Un modo fácil, limpio y rápido de generar árboles. Espero que os sea útil. De todos modos, para más información sobre este tema, os recomiendo este post de Babelingua. Ha pasado tiempo desde que se escribió, pero sigue siendo información muy útil.
Tarea 3 Ventajas de un intérprete Flexibilidad: permite realizar acciones complejas, imposibles o muy difíciles con un compilador, como las siguientes: o Ejecución de cadenas de caracteres mediante operadores como "execute", "interprete" o "evalquote". o Modificar sobre la marcha el significado de los símbolos e incluso prescindir por completo de las declaraciones. o Obtener un ligamiento dinámico completo en los sistemas orientados a objetos. o Simplificar la gestión de memoria en los programas fuente. Facilidad de depuración de programas: la interpretación puede interrumpirse en cualquier momento para examinar o modificar los valores de las variables o la situación en la ejecución. La tabla de símbolos está disponible. Se pueden corregir los errores y continuar. Trazas y paradas programadas. Saltos en el programa. Abandonos de subrutinas. Rapidez en el desarrollo.
Desventajas de un intérprete
Velocidad: usualmente un orden de magnitud menor que la de un programa compilado. Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Comandos básicos del Shell de Linux/Unix Ls Lista el contenido de un directorio. Si lo usamos sin argumentos, lista el contenido del directorio actual o corriente. awk awk lee líneas de un archivo. Cada línea se parte en campos, según un separador, por defecto espacio en blanco. A cada línea se le aplica uno o más procedimientos de awk. grep El nombre grep es críptico: significa "global regular expression and print", pero su función es sencilla: encontrar un patrón en una lista de archivos (por ejemplo, todos los archivos que contengan la palabra "CALL").
ps –edaf Los principales usos de ps son: Ver lo que está corriendo-- estimar la carga sobre el sistema. Ver si uno de nuestros procesos todavía está vivo (una corrida larga, por ejemplo) Encontrar el PID de un proceso para matar.
Chmod Este comando se aplica sobre ficheros o carpetas, en el caso de que sean carpetas podemos usar la opción -R para dar permisos recursivamente a todas las carpetas y ficheros que contenga recursivamente. telnet Telnet es un protocolo que sirve para emular una terminal remota, lo que significa que se puede utilizar para ejecutar comandos introducidos con un teclado en un equipo remoto. La herramienta Telnet está implementada por el protocolo Telnet. Esto significa que traduce las especificaciones del protocolo al lenguaje de programación a fin de crear un programa que pueda emular una terminal. ftp Para acceder a nuestro espacio FTP desde la consola Linux debemos conectar con nuestro servidor a través del comando "ftp". Vamos a tomar como ejemplo, que nuestro servidor sea "ficus" (en caso de que nuestro servidor fuera otro, únicamente habría que cambiar ficus por el nombre de nuestro servidor). En primer lugar conectaremos con nuestro servidor: escribiendo "ftp ficus.pntic.mec.es". clear Para limpiar
Para cambiar de directorio Emplearemos el comando cd (ChangeDirectory) Ejemplo: Comando [felix@localhost /etc
Comandos]$
Resultado cd Nos vamos al directorio /etc
Nota: Si simplemente escribimos cd, sin especificar el nombre del directorio, esto será igual que escribir cd /home/nombre-usuario, es decir, me envía a mi propio directorio de trabajo.
Mover, copiar y renombrar La forma más sencilla será utilizando el comando mv desde la terminal de Linux, que aparte de permitirnos mover archivos de un directorio a otro, nos permite renombrar archivos Linux.
Borrar Utiliza el comando rmdir seguido del nombre del directorio que desees borrar.
Prácticas de clase Modo consola en python. Variables, expresiones y sentencias, valores y tipos Los valores pertenecen a diferentes tipos: 2 es un entero, y "Hola, Mundo!" es una cadena, llamada así porque contiene una “cadena” de letras. Usted (y el intérprete) pueden identificar cadenas porque están encerradas entre comillas. La sentencia de impresión también trabaja con enteros. >>>print 4 4 Si no está seguro del tipo que un valor tiene, el intérprete le puede decir. >>>type("Hola, Mundo!") <type ’string’> >>> type(17) <type ’int’> >>> type(3.2) <type ’float’> ¿Qué ocurre con valores como "17" y "3.2"? Parecen números, pero están encerrados entre comillas como las cadenas. >>> type("17") <type ’string’>Ellos son cadenas. >>> type("3.2") <type ’string’>
Variables Una de las características más poderosas en un lenguaje de programación es la capacidad de manipular variables. Una variable es un nombre que se refiere a un valor. La sentencia de asignación crea nuevas variables y les da valores: >>>mensaje = "¿Qué Onda?" >>> n = 17 >>> pi = 3.14159 La sentencia printtambién funciona con variables. >>>print mensaje Qué Onda? >>>print n 17 >>>print pi 3.14159 En cada caso el resultado es el valor de la variable. Las variables también tienen tipos; nuevamente, le podemos preguntar al intérprete cuales son. >>> type(mensaje) <type ’string’>
>>> type(n) <type ’int’> >>> type(pi) <type ’float’> El tipo de una variable es el mismo del valor al que se refiere.
Nombres de variables y palabras reservadas Los programadores, generalmente, escogen nombres significativos para sus variables —que especifiquen para qué se usa la variable. Estos nombres pueden ser arbitrariamente largos. Pueden contener letras y números, pero tienen que empezar con una letra. Aunque es legal usar letras mayúsculas, por convención no lo hacemos. Si usted lo hace, recuerde que la capitalización importa, Pedro y pedro son variables diferentes. El carácter subrayado ( _) puede aparecer en un nombre. A menudo se usa en nombres con múltiples palabras, tales como mi_nombreo precio_del_café_en_china. Si usted le da un nombre ilegal a una variable obtendrá un error sintáctico: >>> 76trombones = "gran desfile" SyntaxError: invalidsyntax 76trombones es ilegal porque no empieza con una letra. >>> mas$ = 1000000 SyntaxError: invalidsyntax mas$ es ilegal porque contiene un carácter ilegal, el símbolo $. >>>class = "introducción a la programación" SyntaxError: invalidsyntax ¿Qué sucede con class? Resulta que classes una de las palabras reservadas (keywords) de Python. Las palabras reservadas definen las reglas del lenguaje y su estructura, y no pueden ser usadas como nombres de variables. Python tiene veintiocho palabras reservadas: and continue else for import not assert def except from in or break del exec global is pass class elif finally if lambda print raise return try while
Evaluando expresiones Una expresión es una combinación de valores, variables y operadores. Si usted digita una expresión en la línea de comandos, el intérprete la avalúa y despliega su resultado: >>> 1 + 1 2
Un valor, por sí mismo, se considera como una expresión, lo mismo ocurre para las variables. >>> 17 17 Aunque es un poco confuso, evaluar una expresión no es lo mismo que imprimir o desplegar un valor. >>>mensaje = "Como le va, Doc?" >>> mensaje "Como le va, Doc?" >>>print mensaje Como le va, Doc? Cuando Python muestra el valor de una expresión que ha evaluado, utiliza el mismo formato que se usaría para entrar un valor. En el caso de las cadenas, esto Implica que se incluyen las comillas. Cuando se usa la sentencia print, el efecto es distinto como usted ya lo ha evidenciado.
Operadores y operandos Los operadores son símbolos especiales que representan cómputos, como la suma y la multiplicación. Los valores que el operador usa se denominan operandos. Los siguientes son expresiones validas en Python, cuyo significado es más o menos claro: 20+32 hora-1 hora*60+minuto minuto/60 5**2 (5+9)*(15-7) Los símbolos +, -, y /, y los paréntesis para agrupar, significan en Python lo mismo que en la matemática. El asterisco (*) es el símbolo para la multiplicación, y ** es el símbolo para la exponenciación. Cuando el nombre de una variable aparece en lugar de un operando, se reemplaza por su valor antes de calcular la operación La suma, resta, multiplicación y exponenciación realizan lo que usted esperaría, pero la división podría sorprenderlo. La siguiente operación tiene un resultado inesperado: >>> minuto = 59 >>> minuto/60 0 El valor de minuto es 59, y 59 dividido por 60 es 0.98333, no 0. La razón para esta discrepancia radica en que Pythonest{a realizando división entera. Cuando los dos operandos son enteros el resultado también debe ser un entero; y, por convención, la división entera siempre redondea hacia abajo, incluso en casos donde el siguiente entero está muy cerca.
Orden de las operaciones Cuando hay más de un operador en una expresión, el orden de evaluación depende de las reglas de precedencia. Python sigue las mismas reglas de precedencia a las que estamos acostumbrados para sus operadores matemáticos. El acrónimo
PEMDAS es útil para recordar el orden de las operaciones: Los Paréntesis tienen la precedencia más alta y pueden usarse para forzar la evaluación de una expresión de la manera que usted desee. Ya que las expresiones en paréntesis se evalúan primero: 2 * (3-1) es 4, y (1+1)**(5-2) es 8. Usted también puede usar paréntesis para que una expresión quede más legible, como en (minuto * 100) / 60, aunque esto no cambie el resultado. La Exponenciación tiene la siguiente precedencia más alta, así que 2**1+1 es 3 y no 4, y 3*1**3 es 3 y no 27. La Multiplicación y la División tienen la misma precedencia, aunque es más alta que la de la Adición y la Sustracción, que también tienen la misma precedencia. Así que 2*3-1 es 5 en lugar de 4, y 2/3-1 es -1, no 1 (recuerde que en división entera, 2/3=0). Los operadores con la misma precedencia se evalúan de izquierda a derecha. Minuto=59, en la expresión minuto*100/60; la multiplicación se hace primero, resultando 5900/60, lo que a su vez da 98. Si las operaciones se hubieran evaluado de derecha a izquierda, el resultado sería 59/1, que es 59, y no es lo correcto.
Operaciones sobre cadenas En general, usted no puede calcular operaciones matemáticas sobre cadenas, incluso si las cadenas lucen como números. Las siguientes operaciones son ilegales (asumiendo que mensaje tiene el tipo cadena): mensaje-1 "Hola"/123 mensaje*"Hola" "15"+2 Sin embargo, el operador + funciona con cadenas, aunque no calcula lo que usted esperaría. Para las cadenas, el operador + representa la concatenación, que significa unir los dos operandos enlazándolos en el orden en que aparecen. Por ejemplo: fruta = "banano" bienCocinada = " pan con nueces" >>>printfruta + bienCocinada La salida de este programa es: banano pan con nueces. El espacio antes de la palabra pan es parte de la cadena y sirve para producir el espacio entre las cadenas concatenadas. El operador * también funciona con las cadenas; hace una repetición. Por ejemplo, ’Fun’*3 es ’FunFunFun’. Uno de los operados tiene que ser una cadena, el otro tiene que ser un entero.
Estas interpretaciones de + y * tienen sentido por la analogía con la suma y la multiplicación. Así como 4*3 es equivalente a 4+4+4, esperamos que "Fun"*3 sea lo mismo que "Fun"+"Fun"+"Fun", y lo es.
Practica 2 Composición Hasta aquí hemos considerado a los elementos de un programa—variables, expresiones y sentencias—aisladamente, sin especificar como combinarlos. Una de las características más útiles de los lenguajes de programación es su capacidad de tomar pequeños bloques para componer con ellos. Por ejemplo, ya que sabemos cómo sumar números y cómo imprimirlos; podemos hacer las dos cosas al mismo tiempo: >>>print 17 + 3 20 De hecho, la suma tiene que calcularse antes que la impresión, así que las acciones no están ocurriendo realmente al mismo tiempo. El punto es que cualquier expresión que tenga números, cadenas y variables puede ser usada en una sentencia de impresión (print). Usted ha visto un ejemplo de esto: >>>minuto=60 >>>hora=60 >>>print "Número de minutos desde media noche: ", hora*60+minuto
Comentarios A medida que los programas se hacen más grandes y complejos, se vuelven más difíciles de leer. Los lenguajes formales son densos; y, a menudo, es difícil mirar una sección de código y saber qué hace, o por qué lo hace. Por esta razón, es una muy buena idea a ˜nadir notas a sus programas para explicar, en lenguaje natural, lo que hacen. Estas notas se denominan comentarios y se marcan con el símbolo #: >>># calcula el porcentaje de la hora que ha pasado >>>porcentaje = (minuto * 100) / 60 En este caso, el comentario aparece en una línea completa. También pueden ir comentarios al final de una línea: >>># precaución: división entera porcentaje = (minute * 100) / 60
Glosario Valor: un número o una cadena (u otra cosa que se introduzca más adelante) que puede ser almacenado en una variable o calculado en una expresión. Tipo: conjunto de valores. El tipo del valor determina como se puede usar en
expresiones. Hasta aquí, los tipos que usted ha visto son enteros (tipo int), números de punto flotante (tipo float) y cadenas (tipo string). Punto flotante: formato para representar números con parte decimal. Variable: nombre que se refiere a un valor. Sentencia: sección de código que representa un comando o acción. Hasta aquí las sentencias que usted ha visto son la de asignación y la de impresión. Asignación: corresponde a la sentencia que pone un valor en una variable. Palabra reservada: es una palabra usada por el compilador para analizar sintácticamente un programa; usted no puede usar palabras reservadas como if, def, y whilecomo nombres de variables. Operador: símbolo especial que representa un simple cálculo como una suma, multiplicación o concatenación de cadenas. Operando: uno de los valores sobre el cual actúa un operador. Expresión: combinación de variables, operadores y valores que representa un único valor de resultado. Evaluar: simplificar una expresión ejecutando varias operaciones a fin de retornar un valor único. División entera: operación que divide un entero por otro y retorna un entero. La división entera retorna el número de veces que el denominador cabe en el numerador y descarta el residuo. Reglas de precedencia: reglas que gobiernan el orden en que las expresiones que tienen múltiples operadores y operandos se evalúan. Concatenar: unir dos operandos en el orden en que aparecen. Composición: es la capacidad de combinar simples expresiones y sentencias dentro de sentencias y expresiones compuestas para representar cálculos complejos concisamente. Comentario: información que se incluye en un programa para otro programador (o lector del código fuente) que no tiene efecto en la ejecución. Conversión de tipos Python proporciona una colección de funciones que convierten valores de un tipo a otro. La función inttoma cualquier valor y lo convierte a un entero, si es posible, de lo contrario se queja: >>>int("32") 32 >>>int("Hola") ValueError: invalid literal for int(): Hola inttambién puede convertir valores de punto flotante a enteros, pero hay que tener en cuenta que va a eliminar la parte decimal: >>>int(3.99999) 3 >>>int(-2.3) -2 La función floatconvierte enteros y cadenas a número de punto flotante: >>>float(32) 32.0 >>>float("3.14159") 3.14159
Finalmente, la función strconvierte al tipo cadena (string): >>>str(32) ’32’ >>>str(3.14149) ’3.14149’
Coerción de tipos Ahora que podemos convertir entre tipos, tenemos otra forma de esquivar a la división entera. Retomando el ejemplo del capítulo anterior, suponga que deseamos calcular la fracción de una hora que ha transcurrido. La expresión más obvia minuto/60, hace división entera, así que el resultado siempre es 0, incluso cuando han transcurrido 59 minutos. Una solución es convertir minuto a punto flotante para realizar la división en punto flotante: >>> minuto = 59 >>>float(minute)/60.0 0.983333333333 Otra alternativa es sacar provecho de las reglas de conversión automática de tipos,que se denominan coerción de tipos. Para los operadores matemáticos, si algún operando es un número flotante, el otro se convierte automáticamente a flotante: >>> minuto = 59 >>> minuto / 60.0 0.983333333333 Así que haciendo el denominador flotante, forzamos a Python a realizar división en punto flotante.
Practica 3 Operadores aritméticos
Operador Descripción Ejemplo +
Suma
r = 3 + 2 # r es 5
-
Resta
r = 4 - 7 # r es -3
Operador Descripción
Ejemplo
-
Negación
r = -7 # r es -7
*
Multiplicación
r=2*6#r
es 12 **
Exponente
r = 2 ** 6 # r es 64
/
División
r = 3.5 / 2 # r es 1.75
//
División entera
r = 3.5 // 2 # r es 1.0
%
Módulo
r=7%2# r es 1
Booleanos Una variable de tipo booleano sólo puede tener dos valores: True (cierto) y False (falso).
Estos son los distintos tipos de operadores con los que podemos trabajar con valores booleanos, los llamados operadores lógicos o condicionales:
Operador Descripción
Ejemplo
and
¿Se cumple a y b? r = True and False # r es False
or
¿Se cumple a o b? r = True or False # r es True
not
No a
r = not True # r es False
Los valores booleanos son además el resultado de expresiones que utilizan operadores relacionales (comparaciones entre valores):
Operador Descripción
Ejemplo
==
¿son iguales a y b?
r = 5 == 3 # r es False
!=
¿son distintos a y b? r = 5 != 3 # r es True
<
¿es a menor que b?
r = 5 < 3 # r es False
>
¿es a mayor que b?
r = 5 > 3 # r es True
<= ¿es a menor o igual que b? r = 5 <= 5 # r es True >= ¿es a mayor o igual que b? r = 5 >= 3 # r es True
Listas La lista es un tipo de colección ordenada. Sería equivalente a lo que en otros lenguajes se conoce por arrays, o vectores. Las listas pueden contener cualquier tipo de dato: números, cadenas, booleanos, … y también listas. Crear una lista es tan sencillo como indicar entre corchetes, y separados por comas, los valores que queremos incluir en la lista:
>>>a = [22, True, “una lista”, [1, 2]]
Podemos acceder a cada uno de los elementos de la lista escribiendo el nombre de la lista e indicando el índice del elemento entre corchetes.
NOTA: Ten en cuenta que el índice del primer elemento de la lista es 0, y no 1:
>>>a[2] ‘una lista’ >>>a[0] 22
Si queremos acceder a un elemento de una lista incluida dentro de otra lista. >>> a = [22, True, “una lista”, [1, 2]] Tendremos que utilizar dos veces este operador, primero para indicar a qué posición de la lista exterior queremos acceder, y el segundo para seleccionar el elemento de la lista interior: si queremos el valor 1 de la sublista [1,2] >>>a[3][0] 1
También podemos utilizar este operador para modificar un elemento de la lista si lo colocamos en la parte izquierda de una asignación: >>>a = [22, True, “una lista”, [1, 2]] >>>a[0] 22 >>>a[0] =99 >>>a[0] 99 Una curiosidad sobre el operador [] de Python es que podemos utilizar también números negativos. Si se utiliza un número negativo como índice, esto se traduce en que el índice empieza a contar desde el final, hacia la izquierda; es decir, con [1] accederíamos al último elemento de la lista, con [-2] al penúltimo, con [-3], al antepenúltimo, y así sucesivamente. >>>a = [22, True, “una lista”, [1, 2]] >>>a[-1] [1,2]
Sentencias condicionales Aquí es donde cobran su importancia el tipo booleano y los operadores lógicos y relacionales que aprendimos en el capítulo sobre los tipos básicos de Python. if La forma más simple de un estamento condicional es un if (del inglés si) seguido de
la condición a evaluar, dos puntos (:) y en la siguiente línea e indentado, el código a ejecutar en caso de que se cumpla dicha condición. >>> valor=”programa” >>>if valor == “programa” : print “Respuesta correcta” if … else >>> valor=”programa” >>>if valor == “programa” : print “Respuesta correcta” …else: print “respuesta incorrecta” Respuesta correcta if … elif … elif … else elifes una contracción de elseif, por lo tanto elif numero > 0 puede leerse como “si no, si numero es mayor que 0”. Es decir, primero se evalúa la condición del if. Si es cierta, se ejecuta su código y se continúa ejecutando el código posterior al condicional; si no se cumple, se evalúa la condición del elif. Si se cumple la condición del elif se ejecuta su código y se continua ejecutando el código posterior al condicional; si no se cumple y hay más de un elif se continúa con el siguiente en orden de aparición. Si no se cumple la condición del if ni de ninguno de los elif, se ejecuta el código del else. >>>numero=1 >>>if numero >0: print “número positivo” …elif numero <0: print “número negativo” …else: print “Cero” número positivo
Practica 4 Entrada estándar La forma más sencilla de obtener información por parte del usuario es mediante la función raw_input. Esta función toma como parámetro una cadena a usar como prompt (es decir, como texto a mostrar al usuario pidiendo la entrada) y devuelve una cadena con los caracteres introducidos por el usuario hasta que pulsó la tecla Enter. Veamos un pequeño ejemplo: >>>nombre = raw_input(“dame tu nombre: “)
Definición de una Función >>>defimprimedoble(dato): …
print dato dato
Esta función toma un argumento y lo asigna a un parámetro llamado dato. El valor del parámetro (en este momento no tenemos idea de lo que será) se imprime dos veces. >>>imprimedoble(“azul”) azulazul >>>imprimedoble(“azul”*3) azulazulazulazulazulazul >>>defconcatenarDoble(parte1, parte2): …
cat = parte1 + parte2
…
imprimaDoble(cat)
>>>concatenarDoble(“uno”,”dos”) unodosunodos
def conteo(n): if n == 0: print "Despegue!" else: print n conteo(n-1)
Resolución de ejercicios en SharpDevelop Crear y ejecutar en el editor SharpDevelop la siguiente función de Ironpython defconteo(n): ifn == 0: print"Despegue!" else: printn conteo(n-1) a=raw_input("presiona enter") conteo(10)
Crear y ejecutar en el editor SharpDevelop la siguiente lista de datos, y con la función len() contar el número de letras de cada palabra en la lista de datos. Utilice la instrucción for para revisar cada palabra de la lista. palabras= ["windows","universidad","ingenieria de software","interpretes"] foriin palabras: print(i, len(i)) a=raw_input("presiona enter")
Crear y ejecutar en el editor SharpDevelop un programa que solicite la edad y nos indique cuantos días hemos vivido, además que se valide que se capturó un número y no una letra. try: edad =raw_input("Cual es tu edad: ") dias=int(edad)*365 print"Has vivido " + str(dias) + " dias" a=raw_input("presiona enter") exceptValueError: print"Eso no es un numero, verifica!" a=raw_input("presiona enter")
Operaciones básicas. num1=raw_input("dame el primer numero") num2=raw_input("dame el segundo numero") suma=int(num1)+int(num2)
print("el resultado de la suma es: ",suma) #a=raw_input("presione enter para continuar") resta=int(num1)-int(num2) print("el resultado de la resta es: ",resta) #a=raw_input("presione enter para continuar") multiplicacion=int(num1)*int(num2) print("el resultado de la multiplicacion es: ",multiplicacion) #a=raw_input("presione enter para continuar") elevar=int(num1)**int(num2) print("el resultado de la elevacion es: ",elevar) #a=raw_input("presione enter paracontinuar") ifint(num2)!=0: division=int(num1)/int(num2) print("el resultado de la division es: ",float(division)) a=raw_input("presione enter para continuar")
Arreglo de tres palabras y cambiar palabra. a= raw_input("Dame tres palabras: ") b= raw_input(", " ) c= raw_input(", " ) palabras = [a, b, c] print(palabras) p= raw_input("desea cambiar una palabra?. Escriba SI o NO: " ) ifp == 'SI': k= raw_input("que palabra desea cambiar? " ) ifk== a: a= raw_input("Dame la nueva palabra: " ) elifk== b: b= raw_input("Dame la nueva palabra: " ) elifk== c: c=raw_input("Dame la nueva palabra: " ) else: print("La palabra no es correcta") else: print("No se cambio ninguna palabra") palabras = [a, b, c] print(palabras) elifo == '6': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") elevar=int(num1)**int(num2) print("el resultado de la elevacion es: ",elevar) elifo == '7': defconteo(n):
ifn == 0: print"Despegue!" else: printn conteo(n-1) a=raw_input("presiona enter") conteo(10) elifo == '8': ñ= raw_input("presione enter parasalir") break
Menú de operaciones. whileTrue: print("1.suma") print("2.resta") print("3.division") print("4.multiplicacion") print("5.arreglo") print("6.elevar") print("7.Instr. for") print("8.Salir") o=raw_input("Seleccione la operación que desea hacer: " ) whileo >'8' oro == '0' oro >= '10': print("¡Ha escrito un número incorrecto! Inténtelo de nuevo") o=raw_input("Seleccione la operación que desea hacer: " ) ifo == '1': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") suma=int(num1)+int(num2) print("el resultado de la suma es: ",suma) elifo == '2': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") resta=int(num1)-int(num2) print("el resultado de la resta es: ",resta) elifo =='3': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") ifint(num2)!=0: division=int(num1)/int(num2) print("el resultado de la division es: ",float(division)) else: print("No puede dividir entre 0") elifo == '4': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") multiplicacion=int(num1)*int(num2) print("el resultado de la multiplicacion es: ",multiplicacion) elifo == '5':
a= raw_input("Dame tres palabras: ") b= raw_input(", " ) c= raw_input(", " ) palabras = [a, b, c] print(palabras) p= raw_input("desea cambiar una palabra?. Escriba SI o NO: " ) ifp == 'SI': k= raw_input("que palabra desea cambiar? " ) ifk== a: a= raw_input("Dame la nueva palabra: " ) elifk== b: b= raw_input("Dame la nueva palabra: " ) elifk== c: c=raw_input("Dame la nueva palabra: " ) else: print("La palabra no es correcta") else: print("No se cambio ninguna palabra") palabras = [a, b, c] print(palabras) elifo == '6': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") elevar=int(num1)**int(num2) print("el resultado de la elevacion es: ",elevar) elifo == '7': defconteo(n): ifn == 0: print"Despegue!" else: printn conteo(n-1) a=raw_input("presiona enter") conteo(10) elifo == '8': 単= raw_input("presione enter parasalir") break
Tablas de multiplicar. numero = raw_input("que tabla quieres?: ") print"tabla del",int(numero) forv in range(1,11): printnumero,"x",v,"=",int(numero) * variable a=raw_input("precioneenter para salir")
Tablas de multiplicar (da la tabla del 1 hasta la tabla que pidas). whileTrue: numero = raw_input("que tabla quieres?: ") print"tabla del",int(numero)
forv in range(1,int(numero) + 1): forj in range(1,11): printv,"x",j,"=",v * j a=raw_input("Deseaotraoperacion (S/N): ") ifa == 'N': break
Conclusiรณn Concluyo que la materia ha sido muy gratificante y que el conocimiento adquirido es muy importante para nuestro desarrollo como ingenieros en software ya que son herramientas bรกsicas que todo desarrollador debe conocer y dominar si quiere emprender una carrera exitosa en este rubro, la programaciรณn basada en interpretes queda demostrado que es mas sencilla ya que gran parte del trabajo ya te lo resuelve el lenguaje interpretado que elijas, en esta ocasiรณn estudiamos ironpython, que fue una herramienta de gran ayuda, ya que nos ayudo a entender de una mejor manera los conceptos teรณricos estudiados.