Descargar la presentación
La descarga está en progreso. Por favor, espere
1
2. Diagramas de Estado
2
¿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.
3
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.
4
El diagrama
5
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++
6
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
7
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; }
8
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.
9
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;
10
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; }
11
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.
12
Solución 1 Un invariante : Su diagrama < 0 >=0 desconocidos i j
13
Invariante alternativo:
Solución 2 Invariante alternativo: Su diagrama < 0 desconocidos >=0 i j
14
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 ) { } }
15
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: ; 456,34; .34e;
16
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
17
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;
18
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;
19
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= ; 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.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.