Temas:
inst | -> ; | La instrucción vacía |
-> exp ; | La evaluación de una expresión | |
-> tipo ident; | Declaración sin inicialización | |
-> tipo ident= exp; | Declaración con inicialización | |
-> break; | El quiebre de ciclos | |
-> if ( exp ) inst | If sin parte else | |
-> if ( exp ) inst else inst | If con parte else | |
-> while ( exp ) inst | Ciclo while | |
-> { lista-inst } | Grupo de instrucciones | |
lista-inst | -> | |
-> inst lista-inst |
while ( readInt()!=0 )
;
Construir el árbol sintáctico del siguiente programa.
Solución: Para economizar espacio, no describiremos en detalle
el árbol de las expresiones. Utilizaremos la notación
exp => ... para indicar que una expresión puede
ser ... aplicando varias reglas sintácticas sucesivas.
while(x!=y) if (x>y) x= x-y; else y= y-x; println(x);
while (x!=y) if ( x>y ) x= x-y; else y= y-x; println(x);
\ | || \ \ | || | || | || ||
\ \ exp \ \ \ exp | exp | exp exp
\ \ \ \ \ \ | | / | |
\ \ \ \ \ \ | inst / inst inst
\ \ \ \ \ \ \ | / / /
\ \ \ \ \ \ \ / / / /
\ \ \ | ----inst---------- /
\ \ \ | / /
\ \ \ | / /
----inst-- /
\ /
------lista-inst-- lista-inst
\ /
lista-inst
A partir del árbol se puede deducir la indentación correcta para este programa:
La recomendación es muy simple: cada vez que una instrucción forma
parte de otra instrucción (como un while o un if),
se indenta en dos espacios a la derecha. En el ejemplo, x=x-y;
aparece indentado con respecto al if porque forma parte de él.
En cambio println(x); no se indenta con respecto al while
porque ambas instrucciones están al mismo nivel.
while (x!=y)
if ( x>y )
x= x-y;
else
y= y-x;
println(x);
Sobre indentación no hay reglas estrictas, sólo recomendaciones. Cada persona indenta de acuerdo a su gusto, ¡pero no indentar produce programas completamente ilegibles!
Desambiguación del if:
El siguiente programa es ambiguo porque posee dos árboles sintácticos:
La regla de desambiguación dice que el else se asocia al
if más cercano, para el cual no se haya determinado aún su
parte else. Por lo tanto, el else se asocia con el segundo
if y no con el primero.
if ( ... ) ... if ( ... ) ... else ...
El siguiente programa no es ambiguo:
¿Por qué?
if ( ... ) ... if ( ... ) ... else ... else ...
Propuesto:
(No haga el árbol sintáctico detallado de las expresiones.)
print("? "); int a= readInt(); while (a>=0) { if (a==2) println("2");
else if (a==1) println("1"); } println("termino");
Motivación:
Se ha hecho una elección en la que participaron 8 candidatos. Cada candidato se identifica por un número entre 1 y 8. El resultado de la elección se encuentra en un archivo ``votos.txt'' que contiene una línea por cada sufragante. Esta línea indica el número del candidato que prefiere ese sufragante. Por ejemplo el contenido del archivo podría ser:
Construir un programa que haga el recuento de los votos. El
resultado de este programa debe ser:
Problema: Se repite muchas veces el código. ¿Y si fueran 100 candidatos?
Problema: Leer un archivo en disco toma tiempo. Leerlo 8 veces
toma demasiado tiempo, sobretodo cuando hay muchos votantes.
Problema: ¿Qué es un arreglo?
3
8
1
3
1
En el archivo se observa que el candidato número 3 tiene 2 votos,
al igual que el número 1 y que el candidato 8 tiene 1 voto.
Candidato 1: xxx votos
Candidato 2: yyy votos
...
Candidato 8: zzz votos
Soluciones: