Logo Studenta

practica3

¡Estudia con miles de materiales!

Vista previa del material en texto

INTRODUCCIÓN A LA PROGRAMACIÓN · ESCUELA DE NEGOCIOS, UTDT · PRIMER SEMESTRE 2021
Guía de Ejercicios 3: Condicionales y ciclos
Objetivos:
Familiarizarse con el tipo de datos lógico (bool).
Ejercitar el uso de condicionales (if/elif/else) como herramienta para ejecutar selectiva-
mente segmentos de código, según el estado actual del programa.
Ejercitar la escritura de ciclos (while) como herramienta para repetir la ejecución de seg-
mentos de código.
Importante: Todavía no se debe usar iteradores (for, por ejemplo) ni recursión algorítmica. Esos
temas serán presentados más adelante en la materia. Por ahora es fundamental usar solamente los
elementos de programación vistos en clase.
Ejercicio 1. Evaluación de expresiones.
(a) Para cada una de las siguientes expresiones, determinar su tipo y evaluarla a manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa mano:
(I) True
(II) not False
(III) 1 > 0
(IV) not ('aa' < 'ab')
(V) 1 > 0 or not 'aa' < 'ab'
(VI) 5.6 > 2.0 and len('hola') < 2
(VII) 5.6 > 2.0 or len('hola') < 2
(VIII) int('3') - 1 == len('x' * 2)
(b) Revisar las respuestas del punto anterior, evaluando ahora las expresiones en una consola
ipython y averiguando su tipo con la operación type().
Ejercicio 2. Condicionales.
(a) Sean los siguientes segmentos de código, donde p y q son variables con valores de tipo bool:
1 # segmento I
2 if p:
3 if q:
4 print('A')
5 else:
6 print('B')
1 # segmento II
2 if p:
3 if q:
4 print('A')
5 else:
6 print('B')
(b) ¿Qué diferencia hay entre ambos segmentos de código? De las 4 combinaciones de valores
que pueden tomar p y q, ¿con cuáles se imprime lo mismo por pantalla, y con cuáles no?
(c) Completar en los espacios en blanco a continuación, de modo que cada uno de estos segmen-
tos de código tenga, para todos los posibles valores de p y q, comportamiento equivalente al
segmento correspondiente del punto (a).
1 # segmento I
2 if ________:
3 print('A')
4 elif ________:
5 print('B')
1 # segmento II
2 if ________:
3 print('A')
4 elif ________:
5 print('B')
1
Ejercicio 3. Ciclos.
(a) Escribir un programa que imprima por pantalla una tabla de conversión de grados Fahrenheit
a grados Celsius. La tabla debe mostrar sólo la parte entera de la conversión, empezar en 0◦F
y terminar en 120◦F, tomando intervalos de 10◦F. Es decir, por pantalla debe imprimirse:
0 F = -18 C
10 F = -12 C
...
120 F = 49 C
Importante: ¡No reescribir el código que realiza la conversión dentro del ciclo! En cambio,
reusar la función f2c definida en el Ejercicio 2 de la Guía 2.
(b) Escribir un predicado invariante que describa la evolución de las variables desde el principio
hasta el final de la ejecución del ciclo.
(c) Justificar por qué el ciclo efectivamente termina y sirve para que la función haga lo esperado.
(Para esto, relacionar el predicado invariante del ciclo y la especificación de la función.)
Ejercicio 4. Sea el problema de determinar si una palabra se trata de un palíndromo (que se
lee igual de izquierda a derecha y al revés). Por ejemplo, 'reconocer' es un palíndromo, pero
'desconocer' no lo es.
(a) Escribir una especificación de una función es_palindromo, describiendo sus parámetros,
sus precondiciones, su valor de retorno y su comportamiento esperado.
(b) Armar un conjunto adecuado de casos de test para la función es_palindromo.
(c) Implementar la función es_palindromo, respetando la especificación planteada, y usando
este algoritmo: comparar la primera letra con la última, luego la segunda con la penúltima,
etc. Si no se encuentran diferencias, devolver verdadero; en caso contrario, devolver falso.
(Sugerencia: utilizar la función len(x) para obtener la cantidad de letras de un string x, y
el operador x[i] para acceder a su i-ésimo carácter.)
(d) Escribir un predicado invariante que describa la evolución de las variables desde el princi-
pio hasta el final de la ejecución del ciclo.
(e) Justificar por qué el ciclo efectivamente termina y sirve para que la función haga lo esperado.
(Para esto, relacionar el predicado invariante del ciclo con la precondición y la postcondición
de la función.)
(f) Verificar que la función se ejecute correctamente para los casos de test elegidos.
Ejercicio 5. Un número n ∈ N es primo si y sólo si tiene sólo dos divisores positivos distintos: 1 y
n. Sea el problema de determinar si un número entero positivo es primo o no.
(a) Escribir una especificación de una función es_primo, describiendo sus parámetros, sus pre-
condiciones, su valor de retorno y su comportamiento esperado.
(b) Armar un conjunto adecuado de casos de test para la función es_primo.
(c) Implementar la función es_primo, respetando la especificación planteada.
(d) Escribir un predicado invariante que describa la evolución de las variables desde el princi-
pio hasta el final de la ejecución del ciclo.
2
(e) Justificar por qué el ciclo efectivamente termina y sirve para que la función haga lo esperado.
(Para esto, relacionar el predicado invariante del ciclo con la precondición y la postcondición
de la función.)
(f) Verificar que la función se ejecute correctamente para los casos de test elegidos.
Ejercicio 6. Para cada una de las funciones especificadas en el Ejercicio 3 de la Guía 2:
(a) Implementar la función, respetando la especificación planteada.
(b) Si hay ciclos involucrados, escribir un predicado invariante que describa la evolución de las
variables desde el principio hasta el final de la ejecución del ciclo.
(c) Justificar por qué el ciclo efectivamente termina y sirve para que la función haga lo esperado.
(Para esto, relacionar el predicado invariante del ciclo con la precondición y la postcondición
de la función.)
(d) Verificar que la función se ejecute correctamente para los casos de test elegidos.
Ejercicio 7. Evaluación de cortocircuito de expresiones lógicas (ver el apunte sobre este tema).
(a) Para cada una de las siguientes expresiones, determinar su tipo y evaluarla a manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa manoa mano:
(I) True and (1 / 0)
(II) True or (1 / 0)
(III) False and (1 / 0)
(IV) False or (1 / 0)
(b) Revisar las respuestas del punto anterior, evaluando ahora las expresiones en una consola
ipython y averiguando su tipo con la operación type().
(c) ¿Por qué no arrojan todas error de división por 0? ¿Qué ocurre si se invierte el orden de los
términos de los operadores and y or?
Ejercicio 8. ¿Cuándo y por qué fallan los siguientes programas? ¿Cómo se podría corregir?
(a) .
1 texto:str = '*******! '
2 i:int = 0
3 while texto[i]=='*' and i<len(texto):
4 i = i + 1
5 print('Hay', i, 'asteriscos al principio del string.')
(b) .
1 s:str = 'acfjkpvzqta '
2 j:int = 0
3 while s[j]<s[j+1] and j<len(s) -1:
4 j = j + 1
5 if j==len(s):
6 print('Las letras están ordenadas alfabéticamente ')
7 else:
8 print('Las letras no están ordenadas alfabéticamente ')
3
gasto
Subrayado
I) Error
II) True
III) False
IV) Error
gasto
Subrayado
invertir el orden, pq si no estuviera el ! saltaría error de index out of range
Ejercicio 9. (Idealmente, para hacer después del Ejercicio 3.) Para las siguientes funciones, de-
mostrar que el ciclo efectivamente termina para cualquier entrada válida, escribir un predicado
invariante del ciclo y demostrar que la función hace lo esperado.
(a) .
1 def vocales_a_mayúsculas(s:str) -> str:
2 ''' Pasa a mayúsculas todas las vocales de s.
3 Pre: s tiene solamente letras en minúscula: abcde ...xyz , sin
4 tildes , diéresis ni eñes.
5 Post: len(vr)==len(s), y en toda posición j entre 0 y len(s) -1:
6 vr[j]==s[j] en mayúscula si s[j] es una vocal (aeiou),
7 o bien vr[j]==s[j] en caso contrario.
8 '''
9 vr:str = ''
10 i:int = 0
11 while i<len(s):
12 if s[i] in 'aeiou ':
13 vr = vr + s[i]. upper()
14 else:
15 vr = vr + s[i]
16 i = i + 1
17 return vr
(b) .
1 def sumar_primos_hasta(n:int) -> int:
2 ''' Devuelve la suma de los primos menores o iguales que n.
3 Pre: n>0
4 Post: vr==suma de los números primosentre 0 y n (inclusive).
5 '''
6 vr:int = 0
7 i:int = 2
8 while i <= n:
9 if es_primo(i):
10 vr = vr + i
11 i = i + 1
12 return vr
(c) .
1 def es_prefijo(s:str , t:str) -> bool:
2 ''' Determina si s es prefijo de t.
3 Pre: Ninguna.
4 Post: vr==(en toda posición j entre 0 y len(s) -1: s[j]==t[j])
5 '''
6 vr:bool = True
7 i:int = 0
8 while i<len(s) and i<len(t):
9 vr = vr and s[i]==t[i]
10 i = i + 1
11 return vr and i==len(s)
4

Continuar navegando

Otros materiales