2.  Diagramas de Estado.

Slides:



Advertisements
Presentaciones similares
ESTRUCTURAS DE SECUENCIA
Advertisements

2. Diagramas de Estado. ¿Qué es y para qué se usa? Una técnica para desarrollar programas Espacialmente adecuado para programas que tienen que analizar.
CONSTANTES DENTRO DE UN CÁLCULO O EN LOS PASOS PARA SOLUCIONAR UN PROBLEMA, EXISTIRÁN VALORES QUE NUNCA VAN A CAMBIAR Y SE LOS CONOCE COMO CONSTANTES.
FUNDAMENTOS DE PROGRAMACIÓN VARIABLES, CONSTANTES Y TIPOS DE DATOS EN C.
Applications Development I 6.1 Foro Tomas Anzalotta Alvarado.
Entrada y Salida en C++, Estructuras de Control Prof. Manuel B. Sánchez.
Una vez observado el producto programado que se debe construir, es importante que realice los siguientes ejercicios con la ayuda del docente. 1)Con la.
Algoritmos y Estructura de Datos Exposiciones. Clases de Noviembre 4 Nov – Exposición equipos 1, 2 y 3 11 Nov – Exposición equipos 5,6 y 7 18 Nov – Exposición.
Operaciones con Decimales Suma, Resta, Multiplicación y División Autor: Grupo Océano Colaborador: Prof. Lourdes Barreno Huffman Portal Educa Panamá.
2015-BM5A. ¿Qué estructuras de Programación conocemos? Condicional: If … { } … Else …{ } Condicional por Casos: Switch (opcion) { } Repetitiva exacta:
Curso de Python Clase 5 Dpto. Telemática CUJAE Curso
MATLAB 7 EJERCICIOS. E01. Escribir un programa que permita determinar si un número entero dado es par o impar. (Utilizar el operador mod) E02. Utilizando.
Introducción a la Programación Multimedial
Cifras significativas
¿Cómo almacenar datos dentro del computador?
Estructuras de Control.
Estructuras Repetitivas Estructuras Repetitivas
Clase1: lectura/escritura/asignación
2.  Diagramas de Estado.
Formas de Desisión Operadores lógicos II.
Clase 8: Strings Valeria Herskovic –
ROBERTO PINEDA FLORES. ALEXIS JULIAN VELAZQUEZ NAVA.
Olimpiadas Chilenas de Informática - Formación
Olimpiadas Chilenas de Informática - Formación
Métodos y parámetros.
Manejo de Punteros y objetos en memoria dinámica en C++
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Métodos en Java.
Algunas Características de C++ no presentes en C
Estructuras de Datos Recursividad.
Básicos de Autómatas.
Guía teórica de manejo de estructuras de datos
Tema 4 Elementos para el Desarrollo de Algoritmos
Clase 7: Abreviaturas Valeria Herskovic –
Algunas Características de C++ no presentes en C
Leccion 5: Escogiendo un Tipo de Variable
MATLAB 6.5 Clase 3: Funciones básicas e Introducción a la Programación
Decisiones y orden. Estructura if.
Fundamentos del lenguaje de programación Condicionales, ciclos, Métodos, enumeraciones Escuela Técnica Superior Kinal Instructor Edwin Tumax.
Tema 4 Elementos para el Desarrollo de Algoritmos
LÓGICA DE PROGRAMACIÓN
Procedimientos y Funciones
Expresiones regulares
CAPACIDAD DE DETECCION Y CORRECCION DE ERRORES
Curso de iniciación al trabajo con MatLab 7.0
Aplicaciones de RECURSIVIDAD
Diego Hernández R Pascal Variables Diego Hernández R
Fundamentos de programación
LENGUAJE C.
Tema 2: Lenguaje PHP básico
Programación I MC José Andrés Vázquez Flores
1 Conjuntos numéricos Índice del libro Números naturales
Fundamentos de Informática Especialidad de Electrónica –
 Función cuadrática Definición Es de la forma: f(x) = ax2 + bx + c
Arreglos en Java.
FUNCIONES Y PROCEDIMIENTOS
Estructuras de Control
MC Beatriz Beltrán Martínez Verano 2018
Informática Ingeniería en Electrónica y Automática Industrial
MATRIZ DE CHEQUEO DE PARIDAD
Clase 7 Strings 28 de Marzo (N.Baloian).
CAPACIDAD DE DETECCION Y CORRECCION DE ERRORES
Clase1: lectura/escritura/asignación
Manejo de Punteros y objetos en memoria dinámica en C++
Lo que nosotros vamos a ver son los números enteros negativos
ProcesadorNumero PROBLEMA 1 (Laboratorio N°1)
Estructuras de control
Programación Estructurada
Tema 8. Estructuras de decisión. Clases 1 y 2.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Transcripción de la presentación:

2.  Diagramas de Estado

¿Qué es y para qué se usa? Técnica para desarrollar programas Adecuado para programas que analizan una secuencia de datos y dicen algo al respecto Permite visualizar los estados por los que pasa un programa. Transiciones de un estado a otro se realizan incondicionalmente o bajo una condición. Pueden ir acompañadas de una acción que se realiza con la transición.

Ejemplo: Contar palabras de una frase Simplificación 1: frase almacenada en un string s, y termina con un punto      String s = "Este es un ejemplo."; Simplificación 2: una "palabra" es cualquier secuencia de caracteres consecutivos distintos de blanco (y punto). Estrategia: examinar los caracteres de izquierda a derecha, usando charAt(k) Lo que se haga con cada carácter depende si estábamos dentro o fuera de una palabra. Esto último corresponde a los estados del programa.

El diagrama

Expresando las transiciones como tabla ESTADO INPUT ESTADO++ ACCION INICIO FUERA k=0; np=0; chaAt(k) == ‘ ‘ k++; chaAt(k) !== ‘ ‘ DENTRO np++; k++; chaAt(k) == ‘.’ FIN k++

Programa v1: El miope np = 0; k = 0; estado = FUERA; while(estado != FIN){  c = s.charAt(k);    if( estado==FUERA )        if( c!=' ' ) { estado = DENTRO;         ++np;         ++k; } else if (c == ‘.’) estado = FIN; else ++k;    else  // estado==DENTRO        if( c==' ' ) {         estado = FUERA; } Esto lo podría generar un programa tomando como input la tabla

Programa: 2 versiones más “procesadas” k = 0; np = 0; while( s.charAt(k)!='.' )  { // estado==FUERA     while( s.charAt(k)==' ' )         ++k;     if( s.charAt(k)=='.' )         break;     ++np;     ++k;    // estado==DENTRO     while( s.charAt(k)!=' ' && s.charAt(k)!='.' )         ++k;   } Esta version refleja los estados En el código np = 0; estado = FUERA; k = 0; while((c=s.charAt(k))!='.'){   if( estado==FUERA ) {      if( c!=‘ ')  {        ++np;            estado = DENTRO;      }   } else  // estado==DENTRO      if( c==' ' )        estado = FUERA;   } ++k; }

Ejemplo: Un sistema de alerta ambiental Sistema de alerta de la calidad del aire emite una señal verde cada vez que la medición del aire está bajo el valor 50. Si esta medición sobrepasa los 50 entonces se emite una señal roja. Para volver a emitir una señal verde deben venir por lo menos 3 mediciones bajo los 50, durante las cuales se emite una señal amarilla. Suponga que las medidas para el día se ingresan por teclado cada minuto Al final del día se ingresa un valor negativo y el computador responde con el número de minutos en que se emitió una señal verde, roja y amarilla.

Ejemplo: Un sistema de alerta ambiental Un sistema de alerta de la calidad del aire emite una señal verde cada vez que la medición del aire está bajo el valor 50. Si esta medición sobrepasa los 50 entonces se emite una señal roja. Para volver a emitir una señal verde deben venir por lo menos 3 mediciones bajo los 50, durante las cuales se emite una señal amarilla. Suponga que las medidas para el día se ingresan por teclado cada minuto . Al final del día se ingresa un valor negativo y el computador responde con el número de minutos en que se emitió una señal verde, roja y amarilla. input<=50/++V; input>50/++R; R=A=0; V=1 input>50/++R; V R input>50/++R; input>50/++R; input<=50/++V; input<=50/++A; A1 A2 input<=50/++A;

Programa: dos versiones //versión “míope” V =1; R = A = 0; estado = Verde; while((n=input() >=0){     if( estado==Verde)        if( n >50)  estado = Rojo;++R; else ++V;    else  if (estado = Rojo)        if( n <= 50 )         estado = Amarillo1; ++A; ++R; else if (estado = Amarillo1) if( n <= 50 )         estado = Amarillo2; ++A;         estado = Verde; ++V; } //versión más eficiente V = 1; R = A = 0; estado = Verde; while((n=input() >=0){     if( n >50) { estado = Rojo; ++R; } else //n < 50 if (estado = Rojo) {       estado = Amarillo1; ++A; } else if (estado = Amarillo1){ estado = Amarillo2; } ++A; else       estado = Verde; ++V; }

Relación Invariante-Diagrama Un invariante se puede asociar a un estado del diagrama Ejemplo: Reordenar los elementos de a[0], ..., a[n] dejando a la izquierda los <0 y a la derecha los >=0.

Solución 1 Un invariante : Su diagrama < 0 >=0 desconocidos i j

Invariante alternativo: Solución 2 Invariante alternativo: Su diagrama < 0 desconocidos >=0 i j

El programa correspondiente // Version 1 i = 0; j = n; while( i<j )  {    if(a[i]<0)       ++i;    else if(a[j]>=0)       --j;    else {       a[i] <-> a[j];       --j;     }   }           // Version 2 while( i<j ) {    while( i<j && a[i]<0 )    while( i<j && a[j]>=0 )    if( i<j ) {    } }

Chequeo de expresiones PROBLEMA: Escribir una función con encabezado pubic static double valor(String s) que recibe como parámetro un string  que contiene un número real terminado con un ; y entregue su valor. Si el número está mal escrito debe retornar Math.MAXDOUBLE (el máximo double que puede guardar java). No usar substring !!! Acepta: 345.45; 456; .34; ;(retorna cero) No Acepta: 345.45.34; 456,34; .34e;

El automata (c = s.charAt(k)) Val = 0.0; k = 0; c>= ‘0’ && c>=‘9’/ val+=c-’0’;n*=10;k++; c>= ‘0’ && c>=‘9’/ val=val*10 +c-’0’;k++; c== ‘.’ /n=10;k++; Entero Decimal c== ‘;’/return val Error c== ‘;’/return val Fin c == otro/ return Math.maxDouble; Atención: esto acepta como válido ; y en ese caso retorna 0

El programa // Version 1 double valor = 0; int n; int final ENTERO =1, DECIMAL =2, ERROR =3, FIN =0; estado = ENTERO; for( k=0; k < s.length() && estado != FIN && estado != ERROR; ++k ){     if( estado== ENTERO)         if( s.charAt(k) <= '9' && s.charAt(k) >= '0' )           valor = valor*10 + s.charAt(k)-'0';         else if (s.charAt(k) == ';')           estado = FIN;         else if (s.charAt(k) == '.') {           n = 10;           estado = DECIMAL;         else estado = ERROR;     else if(estado == DECIMAL)        if( s.charAt(k) <= '9' && s.charAt(k) >= '0' ) {           valor = valor + (s.charAt(k)-'0')/n;           n = n*10;         }         else if (s.charAt(k) == ';')           estado = FIN;         else estado = ERROR; } if (estado == FIN)return valor else return Math.MAXDOUBLE;

El programa // Version 2 double valor = 0; k = 0; while(k < s.length() && s.charAt(k) <= '9' && s.charAt(k) >= '0') {           valor = valor*10 + s.charAt(k)-'0';           k++; } if (s.charAt(k) == ';') return valor else if (s.charAt(k) != '.') return Math.MAXDOUBLE; int n = 10; while (k < s.length() && s.charAt(k) <= '9' && s.charAt(k) >= '0') {           valor = valor + (s.charAt(k)-'0')/n;           n = n*10; else  return Math.MAXDOUBLE; 

Propuestos 1- Dibujar un autómata que reconozca expresiones (termine en un estado final si está bien escrita, en uno de error si no) del tipo: unavariable=345+438; o sea <nombre_de_variable>=<entero><op><entero>; 1.1 permita uno o más espacios entre los elementos (variable, signo igual, enteros, operación, punto-coma) 1.2 después del signo = puede venir un solo número, o una cadena de <entero>(<op><entero>)* 1.3 haga una función que devuelva el valor de la expresión suponiendo que solo vienen sumas de números positivos si está bien escrita, o devuelve el valor -1; 2- Dibujar un autómata que quede en un estado final si los primeros dos caracteres de una entrada que puede ser infinitamente larga (no cabe en una variable) coinciden con los últimos dos. 3- Escribir una función que tenga el encabezado public static true valido(String s) que retorna true si el string s empieza con uno o más caracteres 'a' seguidos por uno o más caraceters 'b' y terminados con uno o más caracteres 'c' seguido por un carácter ';'. Además debe imprimir (con System.out.println(....) ) la cantidad de caracteres a, b y c que venían en la secuencia. Por ejemplo: aabbbbcc; , abbbbc; , abc;, aaabc; son secuencias válidas. bbbccc; , axbbccc; , aaaccc; , aabcc  (no tiene ';' al final) son inválidas.