Diferència entre revisions de la pàgina «ASIX-M3-UF2-A1.1-Exercicis disseny descendent»
(Hi ha 52 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 1: | Línia 1: | ||
− | + | '''1. Càlcul múltiple''' | |
− | + | Crea un programa que demani a l'usuari, per pantalla dos nombres enters i determineu si algun és múltiple de l'altre. Crea una funció anomenada CalMultiple que rebi i torni els dos números si el primer és múltiple del segon. | |
− | |||
− | |||
− | 2. Regne de Dracs | + | <source lang="python"> |
+ | |||
+ | # Función CalMultiple: Recibe dos número e indica si el primero el múltiplo del | ||
+ | # segundo. Para ello calculo el resto de la división, si es 0 es múltiplo. | ||
+ | # Parámetros de entrada: dos números | ||
+ | # Dato devuelto: múltiplo: Valor lógico verdadero si el primero es múltiplo | ||
+ | # del segundo, Falso en caso contrario. | ||
+ | |||
+ | def CalMultiple(num1,num2): | ||
+ | if num1 % num2 == 0: | ||
+ | return True | ||
+ | else: | ||
+ | return False | ||
+ | |||
+ | numero1 = int(input("Número 1:")) | ||
+ | numero2 = int(input("Número 2:")) | ||
+ | |||
+ | if CalMultiple(numero1,numero2): | ||
+ | print(numero1,"es múltiplo de",numero2) | ||
+ | else: | ||
+ | print(numero1,"no es múltiplo de",numero2) | ||
+ | |||
+ | </source> | ||
+ | <!-- | ||
+ | --> | ||
+ | '''2. Càlcul temperatura mitjana''' | ||
+ | |||
+ | Crear un programa que sol·liciti les temperatures màximes i mínimes de cada dia i mostri la mitjana. El programa demanarà la quantitat de dies que cal introduir, i les temperatures màxima i mínima, calculant per mitjà d'una funció la temperatura mitjana del dia. | ||
+ | |||
+ | <source lang="python"> | ||
+ | |||
+ | # Función calcularTemperaturaMedia: R | ||
+ | |||
+ | def calcularTemperaturaMedia(temp1,temp2): | ||
+ | return (temp1 + temp2)/2 | ||
+ | |||
+ | # Crear una función que calcule la temperatura media de un día a partir de la | ||
+ | # temperatura máxima y mínima. | ||
+ | |||
+ | cantidad=int(input("¿Cuántas temperaturas vas a calcular?:")) | ||
+ | for indice in range(cantidad): | ||
+ | tmin = float(input("Introduce temperatura mínima:")) | ||
+ | tmax = float(input("Introduce temperatura máxima:")) | ||
+ | print("Temperatura media:",calcularTemperaturaMedia(tmin,tmax)) | ||
+ | |||
+ | </source> | ||
+ | |||
+ | '''3. Cálculo de tiempo''' | ||
+ | |||
+ | Escribir un programa con dos funciones que permitan calcular: | ||
+ | |||
+ | 1ª La cantidad de segundos en un período de tiempo determinado en términos de horas, minutos y segundos. | ||
+ | |||
+ | 2º La cantidad de horas, minutos y segundos que componen un período de tiempo determinado en segundos. 2ª | ||
+ | |||
+ | Escribe un programa principal con un menú que permita convertir a segundos, convertir a horas, minutos y segundos o salir. | ||
+ | |||
+ | |||
+ | <source lang="python"> | ||
+ | |||
+ | # Función Convertir_A_Segundos: Recibe una cantidad de horas, minutos y segundos | ||
+ | # y calcula a cuantos segundos corresponde. | ||
+ | # Parámetros de entrada: hora, minutos y segundos | ||
+ | # Dato devuelto: Segundos totales | ||
+ | |||
+ | def Convertir_A_Segundos(h,m,s): | ||
+ | return h * 3600 + m * 60 + s | ||
+ | |||
+ | # Función Convertir_A_HMS: Recibe una cantidad de segundos y debe calcular a | ||
+ | # que hora, minutos y segundos corresponde | ||
+ | # Parámetros de entrada: segundos | ||
+ | # Valores de salida: hora,minutos y segundos | ||
+ | |||
+ | def Convertir_A_HMS(seg): | ||
+ | # Horas = Divisíón entera de los segundos entre 3600 | ||
+ | h = seg//3600 | ||
+ | # Decremento los segundos que me quedan por convertir | ||
+ | seg = seg - h*3600 | ||
+ | # Minutos = División entera de los segundos entre 60 | ||
+ | m = seg//60 | ||
+ | # Decremento los segundos que me quedan por convertir | ||
+ | seg = seg - m*60 | ||
+ | # Lo que me quedan corresponden a los segundos | ||
+ | s = seg | ||
+ | return h,m,s | ||
+ | |||
+ | # Escribe un programa principal con un menú donde se pueda elegir la opción de | ||
+ | # convertir a segundos, convertir a horas,minutos y segundos o salir del programa. | ||
+ | |||
+ | while True: | ||
+ | print("1.- Convertir a segundos") | ||
+ | print("2.- Convertir a horas, minutos y segundos") | ||
+ | print("3.- Salir") | ||
+ | opcion = int(input()) | ||
+ | if opcion == 1: | ||
+ | hor = int(input("Horas:")) | ||
+ | minu = int(input("Minutos:")) | ||
+ | seg = int(input("Segundos:")) | ||
+ | print("Corresponde a",Convertir_A_Segundos(hor,minu,seg),"segundos.") | ||
+ | elif opcion == 2: | ||
+ | segund=int(input("Segundos:")) | ||
+ | hor,minu,seg = Convertir_A_HMS(segund) | ||
+ | print("Corresponde a ",hor,":",minu,":",seg) | ||
+ | elif opcion == 3: | ||
+ | break | ||
+ | else: | ||
+ | print("Opción incorrecta") | ||
+ | |||
+ | </source> | ||
+ | |||
+ | '''4. ''Exercici:'' construir un joc "'' 'Guess The number' ''"''' | ||
+ | |||
+ | Demanar a l'usuari que introdueixi dos números entre 0 i 100. | ||
+ | Fer que l'usuari endevini el nombre, el programa anirà fitant entre els números introduïts, reduint possibilitats, fins a trobar el nombre desitjat. | ||
+ | |||
+ | <pre> | ||
+ | Exemple de com haurien de funcionar les peticions de dades per pantalla d'aquest programa: | ||
+ | |||
+ | (Els números introduïts són teòrics, podrien ser uns altres) | ||
+ | |||
+ | El número a buscar puede introducirse manualmente o bien ser aleatorio (Random) | ||
+ | |||
+ | Quin és el límit inferior?: 0 | ||
+ | |||
+ | Quin és el límit superior?: 100 | ||
+ | |||
+ | Introduïu el número a endevinar entre 0 i 100 inclosos: 50 | ||
+ | |||
+ | Endevineu el nombre entre 0 i 100 inclosos: 40 | ||
+ | |||
+ | Massa petit | ||
+ | |||
+ | Endevineu el número entre 41 i 100 inclosos: 60 | ||
+ | |||
+ | Massa gran | ||
+ | |||
+ | Endevineu el número entre 41 i 59 inclosos: 50 | ||
+ | |||
+ | Ha guanyat! | ||
+ | |||
+ | Podeu veure que el número a encert ho hem introduït nosaltres, en aquest cas 50, així podreu fer les proves més ràpidament, però en un joc real, el número a introduir hauria de ser a l'atzar. | ||
+ | |||
+ | Notas: | ||
+ | |||
+ | Utilitzar import sys | ||
+ | |||
+ | Aquest programa s'ha de constituir mitjançant funcions: | ||
+ | |||
+ | exemple: | ||
+ | def pedir_numero, | ||
+ | def pedir_numero_limite, | ||
+ | def jugar_una_vez | ||
+ | def jugar | ||
+ | def decidir_limites | ||
+ | def pedir_numero_incognita | ||
+ | etc.. | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
+ | import sys | ||
+ | import random | ||
+ | |||
+ | MIN = 0 | ||
+ | MAX = 99 | ||
+ | |||
+ | minimo = '' | ||
+ | maximo = '' | ||
+ | |||
+ | def pedir_numero(invitacion): | ||
+ | """ | ||
+ | Esta función se contenta con comprobar que se obtiene un número | ||
+ | """ | ||
+ | while True: | ||
+ | # Se entra en un bucle infinito | ||
+ | |||
+ | # Se pide un número | ||
+ | print(invitacion, end=": ") | ||
+ | entrada = input() | ||
+ | |||
+ | try: | ||
+ | entrada = int(entrada) | ||
+ | except: | ||
+ | print("Solo están autorizados los caracteres [0-9].", file=sys.stderr) | ||
+ | else: | ||
+ | # Tenemos lo que queríamos, se sale del bucle saliendo de la función | ||
+ | return entrada | ||
+ | |||
+ | def pedir_numero_limite(invitacion, minimo=MIN, maximo=MAX): | ||
+ | """ | ||
+ | Esta función utiliza la anterior y agrega una post-condición | ||
+ | sobre los límites del número a introducir | ||
+ | """ | ||
+ | while True: | ||
+ | # Se entra en un bucle infinito | ||
+ | |||
+ | # Se pide un número | ||
+ | invitacion = "{} entre {} y {} incluidos".format(invitacion, minimo, maximo) | ||
+ | entrada = pedir_numero(invitacion) | ||
+ | |||
+ | if minimo <= entrada <= maximo: | ||
+ | # Tenemos lo que queríamos, se sale del bucle saliendo de la función | ||
+ | return entrada | ||
+ | |||
+ | |||
+ | def jugar_una_vez(numero, minimo, maximo): | ||
+ | intento = pedir_numero_limite("Adivine el número", minimo, maximo) | ||
+ | |||
+ | # Se comprueba si el intento es correcto o no | ||
+ | if intento < numero: | ||
+ | print("Demasiado pequeño") | ||
+ | minimo = intento + 1 | ||
+ | victoria = False | ||
+ | elif intento > numero: | ||
+ | print("Demasiado grande") | ||
+ | maximo = intento - 1 | ||
+ | victoria = False | ||
+ | else: | ||
+ | print("¡Ha ganado!") | ||
+ | victoria = True | ||
+ | minimo = maximo = intento | ||
+ | return victoria, minimo, maximo | ||
+ | |||
+ | |||
+ | def decidir_limites(): | ||
+ | while True: | ||
+ | minimo = pedir_numero("¿Cuál es el límite inferior?") | ||
+ | maximo = pedir_numero("¿Cuál es el límite superior?") | ||
+ | if maximo > minimo: | ||
+ | return minimo, maximo | ||
+ | |||
+ | |||
+ | def pedir_numero_incognita(minimo, maximo): | ||
+ | #return pedir_numero_limite("Introduzca el número a adivinar", | ||
+ | # minimo, maximo) | ||
+ | return random.randint(minimo, maximo) | ||
+ | |||
+ | |||
+ | def jugar_una_PARTIDA(numero, minimo, maximo): | ||
+ | while True: | ||
+ | # Se entra en un bucle infinito | ||
+ | # que permite jugar varias veces | ||
+ | |||
+ | victoria, minimo, maximo = jugar_una_vez(numero, minimo, maximo) | ||
+ | |||
+ | if (victoria): | ||
+ | return | ||
+ | |||
+ | |||
+ | def jugar(): | ||
+ | minimo, maximo = decidir_limites() | ||
+ | numero = pedir_numero_incognita(minimo, maximo) | ||
+ | jugar_una_PARTIDA(numero, minimo, maximo) | ||
+ | |||
+ | |||
+ | if __name__ == '__main__': | ||
+ | print("Se ha ejecutado el módulo") | ||
+ | jugar() | ||
+ | else: | ||
+ | print("Se ha importado el módulo") | ||
+ | </pre> | ||
+ | |||
+ | '''5º Cobro multa, validar fecha, importe y DNI.''' | ||
+ | |||
+ | Introducir la fecha y validar si es correcta. | ||
+ | Introducir el importe a pagar (150€), que debe existir en el sistema. | ||
+ | Pide un DNI y comprueba que es correcto, será correcto si tiene 9 caracteres y la letra es correcta. | ||
+ | Para calcular la letra se divide el número entre 23 y el resto indica la posición de la cadena de letras: | ||
+ | "TRWAGMYFPDXBNJZSQVHLCKE". | ||
+ | <pre> | ||
+ | Usar funciones para: | ||
+ | Validar la fecha. | ||
+ | Validar el importe introducido | ||
+ | Validar el DNI y otra que te devuelva la letra del mismo | ||
+ | """ | ||
+ | </pre> | ||
+ | <pre> | ||
+ | def dni_correcto(dni): | ||
+ | """ | ||
+ | Valida el DNI. | ||
+ | |||
+ | El DNI será válido cuando tenga nueve caracteres, los ocho primeros | ||
+ | sean números y la letra sea correcta. | ||
+ | """ | ||
+ | |||
+ | return len(dni) == 9 and dni[:8].isdecimal() and letra_dni_correcta(dni) | ||
+ | |||
+ | |||
+ | def letra_dni_correcta(dni): | ||
+ | """ | ||
+ | Valida la letra del DNI pasado como parámetro. | ||
+ | |||
+ | La letra será válida si coincide con la letra resultante de usar el índice del | ||
+ | resto de la división del número del DNI entre 23 para la cadena de letras: | ||
+ | "TRWAGMYFPDXBNJZSQVHLCKE" | ||
+ | """ | ||
+ | |||
+ | num_dni = int(dni[:8]) | ||
+ | letra_dni = dni[8].upper() | ||
+ | return letra_dni == "TRWAGMYFPDXBNJZSQVHLCKE"[num_dni % 23] | ||
+ | |||
+ | def comprobar_fecha(text): | ||
+ | try: | ||
+ | from datetime import datetime | ||
+ | fecha = text | ||
+ | datetime.strptime(fecha, '%Y/%m/%d') | ||
+ | print("Fecha válida") | ||
+ | except ValueError: | ||
+ | print("Fecha inválida") | ||
+ | |||
+ | # --------- | ||
+ | # Principal | ||
+ | # --------- | ||
+ | |||
+ | print("Multa a pagar por escupir en la calle - Valor 150€") | ||
+ | valor = 150 | ||
+ | |||
+ | fecha = input("Dame una fecha (YYYY/MM/DD): ") | ||
+ | impo = int(input("Entrar el importe a pagar: " )) | ||
+ | dni = input("Dame un DNI: ") | ||
+ | |||
+ | ret=(comprobar_fecha(fecha)) | ||
+ | if ret != "ERROR": | ||
+ | if impo == valor: | ||
+ | if dni_correcto(dni): | ||
+ | print("El DNI", dni, "es válido") | ||
+ | print("Operación realizada con éxito") | ||
+ | else: | ||
+ | print("El DNI", dni, "es incorrecto") | ||
+ | else: | ||
+ | print("El importe a pagar debe ser", valor) | ||
+ | else: | ||
+ | print("El formato debe ser YYYY/MM/DD") | ||
+ | </pre> | ||
+ | |||
+ | '''6º Llamada a funciones externas:.''' | ||
+ | |||
+ | Crear un programa que llame a tres funciones externas: | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | from paquets_funcions.misfuncions import * | ||
+ | |||
+ | La primera que diga: Soy la función 1 | ||
+ | |||
+ | Para la función 2, pedir un parámetro desde el programa principal, pasárselo a la función 2 y mostrar: Soy la función 2 y me has llamado con el parámetro {x} | ||
+ | |||
+ | Tercera función: introducir un nuevo parámetro y mostrar la longitud de dicho parámetro. | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | '''== Python avançat ==''' | ||
+ | |||
+ | |||
+ | 22. Regne de Dracs | ||
En aquest joc, el jugador es troba en una terra de dracs. Els dracs viuen en coves i hi ha de dos tipus: els bons que volen compartir els seus tesors amb tu i els dolents molt cobdiciosos i afamats que no dubtaran a menjar-se tot aquell que provi d'accedir a la seva cova. El jugador es troba davant de dues coves, en una el drac amigable i en l'altre el drac dolent. El jugador a d'escollir... | En aquest joc, el jugador es troba en una terra de dracs. Els dracs viuen en coves i hi ha de dos tipus: els bons que volen compartir els seus tesors amb tu i els dolents molt cobdiciosos i afamats que no dubtaran a menjar-se tot aquell que provi d'accedir a la seva cova. El jugador es troba davant de dues coves, en una el drac amigable i en l'altre el drac dolent. El jugador a d'escollir... | ||
Línia 26: | Línia 377: | ||
</source> | </source> | ||
− | + | 23. Construir un Quadrat màgic. Un quadrat màgic és una matriu quadrada (mateix nombre de files que de columnes), amb un '''nombre senar de files i columnes''' on la suma dels elements de totes les seves files i les seves columnes i les dues diagonals val igual. En aquest quadrat no hi ha cap número repetit, i els números que hi ha d'haver han d'anar | |
des de 1 fins a n<sup>2</sup> on n és el numero de files i columnes. | des de 1 fins a n<sup>2</sup> on n és el numero de files i columnes. | ||
Línia 69: | Línia 420: | ||
</source> | </source> | ||
− | + | 24. Mastermind | |
El Mastermind és un joc que consisteix en, mitjançant pistes, deduir un codi numèric de n xifres ocult (en el nostre cas de quatre xifres i generat aleatòriament). Dinàmica del joc: | El Mastermind és un joc que consisteix en, mitjançant pistes, deduir un codi numèric de n xifres ocult (en el nostre cas de quatre xifres i generat aleatòriament). Dinàmica del joc: | ||
Línia 89: | Línia 440: | ||
[[Imatge:m3_uf2_diagrama_flux_mastermind.png |400px|center| Diagrama flux "Mastermind"]] | [[Imatge:m3_uf2_diagrama_flux_mastermind.png |400px|center| Diagrama flux "Mastermind"]] | ||
− | + | 25. El Penjat | |
El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc: | El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc: | ||
Línia 159: | Línia 510: | ||
</pre> | </pre> | ||
− | + | 26. ==3 en ratlla== | |
El joc consisteix en posar 3 fitxes en línia en un tauler de 9 caselles abans que ho faci l'ordinador. | El joc consisteix en posar 3 fitxes en línia en un tauler de 9 caselles abans que ho faci l'ordinador. | ||
Línia 187: | Línia 538: | ||
print(' | |') | print(' | |') | ||
</pre> | </pre> | ||
+ | |||
+ | 27.Realitzar un programa que resolgui un tour del cavall per un tauler d'escacs, | ||
+ | és a dir, que mostri totes les caselles per on passarà el cavall (que han de ser totes). | ||
+ | Utilitzar la recursivitat. | ||
+ | |||
+ | 0 59 38 33 30 17 8 63 | ||
+ | 37 34 31 60 9 62 29 16 | ||
+ | 58 1 36 39 32 27 18 7 | ||
+ | 35 48 41 26 61 10 15 28 | ||
+ | 42 57 2 49 40 23 6 19 | ||
+ | 47 50 45 54 25 20 11 14 | ||
+ | 56 43 52 3 22 13 24 5 | ||
+ | 51 46 55 44 53 4 21 12 | ||
+ | |||
+ | Tenir en compte que hi pot haver més d'una solució, | ||
+ | aquesta funció imprimeix una de les solucions factibles. |
Revisió de 18:22, 23 nov 2023
1. Càlcul múltiple
Crea un programa que demani a l'usuari, per pantalla dos nombres enters i determineu si algun és múltiple de l'altre. Crea una funció anomenada CalMultiple que rebi i torni els dos números si el primer és múltiple del segon.
# Función CalMultiple: Recibe dos número e indica si el primero el múltiplo del
# segundo. Para ello calculo el resto de la división, si es 0 es múltiplo.
# Parámetros de entrada: dos números
# Dato devuelto: múltiplo: Valor lógico verdadero si el primero es múltiplo
# del segundo, Falso en caso contrario.
def CalMultiple(num1,num2):
if num1 % num2 == 0:
return True
else:
return False
numero1 = int(input("Número 1:"))
numero2 = int(input("Número 2:"))
if CalMultiple(numero1,numero2):
print(numero1,"es múltiplo de",numero2)
else:
print(numero1,"no es múltiplo de",numero2)
2. Càlcul temperatura mitjana
Crear un programa que sol·liciti les temperatures màximes i mínimes de cada dia i mostri la mitjana. El programa demanarà la quantitat de dies que cal introduir, i les temperatures màxima i mínima, calculant per mitjà d'una funció la temperatura mitjana del dia.
# Función calcularTemperaturaMedia: R
def calcularTemperaturaMedia(temp1,temp2):
return (temp1 + temp2)/2
# Crear una función que calcule la temperatura media de un día a partir de la
# temperatura máxima y mínima.
cantidad=int(input("¿Cuántas temperaturas vas a calcular?:"))
for indice in range(cantidad):
tmin = float(input("Introduce temperatura mínima:"))
tmax = float(input("Introduce temperatura máxima:"))
print("Temperatura media:",calcularTemperaturaMedia(tmin,tmax))
3. Cálculo de tiempo
Escribir un programa con dos funciones que permitan calcular:
1ª La cantidad de segundos en un período de tiempo determinado en términos de horas, minutos y segundos.
2º La cantidad de horas, minutos y segundos que componen un período de tiempo determinado en segundos. 2ª
Escribe un programa principal con un menú que permita convertir a segundos, convertir a horas, minutos y segundos o salir.
# Función Convertir_A_Segundos: Recibe una cantidad de horas, minutos y segundos
# y calcula a cuantos segundos corresponde.
# Parámetros de entrada: hora, minutos y segundos
# Dato devuelto: Segundos totales
def Convertir_A_Segundos(h,m,s):
return h * 3600 + m * 60 + s
# Función Convertir_A_HMS: Recibe una cantidad de segundos y debe calcular a
# que hora, minutos y segundos corresponde
# Parámetros de entrada: segundos
# Valores de salida: hora,minutos y segundos
def Convertir_A_HMS(seg):
# Horas = Divisíón entera de los segundos entre 3600
h = seg//3600
# Decremento los segundos que me quedan por convertir
seg = seg - h*3600
# Minutos = División entera de los segundos entre 60
m = seg//60
# Decremento los segundos que me quedan por convertir
seg = seg - m*60
# Lo que me quedan corresponden a los segundos
s = seg
return h,m,s
# Escribe un programa principal con un menú donde se pueda elegir la opción de
# convertir a segundos, convertir a horas,minutos y segundos o salir del programa.
while True:
print("1.- Convertir a segundos")
print("2.- Convertir a horas, minutos y segundos")
print("3.- Salir")
opcion = int(input())
if opcion == 1:
hor = int(input("Horas:"))
minu = int(input("Minutos:"))
seg = int(input("Segundos:"))
print("Corresponde a",Convertir_A_Segundos(hor,minu,seg),"segundos.")
elif opcion == 2:
segund=int(input("Segundos:"))
hor,minu,seg = Convertir_A_HMS(segund)
print("Corresponde a ",hor,":",minu,":",seg)
elif opcion == 3:
break
else:
print("Opción incorrecta")
4. Exercici: construir un joc " 'Guess The number' "
Demanar a l'usuari que introdueixi dos números entre 0 i 100. Fer que l'usuari endevini el nombre, el programa anirà fitant entre els números introduïts, reduint possibilitats, fins a trobar el nombre desitjat.
Exemple de com haurien de funcionar les peticions de dades per pantalla d'aquest programa: (Els números introduïts són teòrics, podrien ser uns altres) El número a buscar puede introducirse manualmente o bien ser aleatorio (Random) Quin és el límit inferior?: 0 Quin és el límit superior?: 100 Introduïu el número a endevinar entre 0 i 100 inclosos: 50 Endevineu el nombre entre 0 i 100 inclosos: 40 Massa petit Endevineu el número entre 41 i 100 inclosos: 60 Massa gran Endevineu el número entre 41 i 59 inclosos: 50 Ha guanyat! Podeu veure que el número a encert ho hem introduït nosaltres, en aquest cas 50, així podreu fer les proves més ràpidament, però en un joc real, el número a introduir hauria de ser a l'atzar. Notas: Utilitzar import sys Aquest programa s'ha de constituir mitjançant funcions: exemple: def pedir_numero, def pedir_numero_limite, def jugar_una_vez def jugar def decidir_limites def pedir_numero_incognita etc..
import sys import random MIN = 0 MAX = 99 minimo = '' maximo = '' def pedir_numero(invitacion): """ Esta función se contenta con comprobar que se obtiene un número """ while True: # Se entra en un bucle infinito # Se pide un número print(invitacion, end=": ") entrada = input() try: entrada = int(entrada) except: print("Solo están autorizados los caracteres [0-9].", file=sys.stderr) else: # Tenemos lo que queríamos, se sale del bucle saliendo de la función return entrada def pedir_numero_limite(invitacion, minimo=MIN, maximo=MAX): """ Esta función utiliza la anterior y agrega una post-condición sobre los límites del número a introducir """ while True: # Se entra en un bucle infinito # Se pide un número invitacion = "{} entre {} y {} incluidos".format(invitacion, minimo, maximo) entrada = pedir_numero(invitacion) if minimo <= entrada <= maximo: # Tenemos lo que queríamos, se sale del bucle saliendo de la función return entrada def jugar_una_vez(numero, minimo, maximo): intento = pedir_numero_limite("Adivine el número", minimo, maximo) # Se comprueba si el intento es correcto o no if intento < numero: print("Demasiado pequeño") minimo = intento + 1 victoria = False elif intento > numero: print("Demasiado grande") maximo = intento - 1 victoria = False else: print("¡Ha ganado!") victoria = True minimo = maximo = intento return victoria, minimo, maximo def decidir_limites(): while True: minimo = pedir_numero("¿Cuál es el límite inferior?") maximo = pedir_numero("¿Cuál es el límite superior?") if maximo > minimo: return minimo, maximo def pedir_numero_incognita(minimo, maximo): #return pedir_numero_limite("Introduzca el número a adivinar", # minimo, maximo) return random.randint(minimo, maximo) def jugar_una_PARTIDA(numero, minimo, maximo): while True: # Se entra en un bucle infinito # que permite jugar varias veces victoria, minimo, maximo = jugar_una_vez(numero, minimo, maximo) if (victoria): return def jugar(): minimo, maximo = decidir_limites() numero = pedir_numero_incognita(minimo, maximo) jugar_una_PARTIDA(numero, minimo, maximo) if __name__ == '__main__': print("Se ha ejecutado el módulo") jugar() else: print("Se ha importado el módulo")
5º Cobro multa, validar fecha, importe y DNI.
Introducir la fecha y validar si es correcta. Introducir el importe a pagar (150€), que debe existir en el sistema. Pide un DNI y comprueba que es correcto, será correcto si tiene 9 caracteres y la letra es correcta. Para calcular la letra se divide el número entre 23 y el resto indica la posición de la cadena de letras: "TRWAGMYFPDXBNJZSQVHLCKE".
Usar funciones para: Validar la fecha. Validar el importe introducido Validar el DNI y otra que te devuelva la letra del mismo """
def dni_correcto(dni): """ Valida el DNI. El DNI será válido cuando tenga nueve caracteres, los ocho primeros sean números y la letra sea correcta. """ return len(dni) == 9 and dni[:8].isdecimal() and letra_dni_correcta(dni) def letra_dni_correcta(dni): """ Valida la letra del DNI pasado como parámetro. La letra será válida si coincide con la letra resultante de usar el índice del resto de la división del número del DNI entre 23 para la cadena de letras: "TRWAGMYFPDXBNJZSQVHLCKE" """ num_dni = int(dni[:8]) letra_dni = dni[8].upper() return letra_dni == "TRWAGMYFPDXBNJZSQVHLCKE"[num_dni % 23] def comprobar_fecha(text): try: from datetime import datetime fecha = text datetime.strptime(fecha, '%Y/%m/%d') print("Fecha válida") except ValueError: print("Fecha inválida") # --------- # Principal # --------- print("Multa a pagar por escupir en la calle - Valor 150€") valor = 150 fecha = input("Dame una fecha (YYYY/MM/DD): ") impo = int(input("Entrar el importe a pagar: " )) dni = input("Dame un DNI: ") ret=(comprobar_fecha(fecha)) if ret != "ERROR": if impo == valor: if dni_correcto(dni): print("El DNI", dni, "es válido") print("Operación realizada con éxito") else: print("El DNI", dni, "es incorrecto") else: print("El importe a pagar debe ser", valor) else: print("El formato debe ser YYYY/MM/DD")
6º Llamada a funciones externas:.
Crear un programa que llame a tres funciones externas:
from paquets_funcions.misfuncions import * La primera que diga: Soy la función 1 Para la función 2, pedir un parámetro desde el programa principal, pasárselo a la función 2 y mostrar: Soy la función 2 y me has llamado con el parámetro {x} Tercera función: introducir un nuevo parámetro y mostrar la longitud de dicho parámetro.
== Python avançat ==
22. Regne de Dracs
En aquest joc, el jugador es troba en una terra de dracs. Els dracs viuen en coves i hi ha de dos tipus: els bons que volen compartir els seus tesors amb tu i els dolents molt cobdiciosos i afamats que no dubtaran a menjar-se tot aquell que provi d'accedir a la seva cova. El jugador es troba davant de dues coves, en una el drac amigable i en l'altre el drac dolent. El jugador a d'escollir...
- Mòduls a emprar:
from random import randint # per distribuir els dracs en les coves aleatoriament
from time import sleep # per fer més "emocionant" el final del joc
- El programa principal podria ser semblant a:
# Programa principal
fiJoc = False
while not fiJoc:
mostrarIntroduccio()
numeroDeCova = escollirCova()
explorarCova(numeroDeCova) # sleep(2) # randint(1, 2)
jugarDeNuevo = jugar()
23. Construir un Quadrat màgic. Un quadrat màgic és una matriu quadrada (mateix nombre de files que de columnes), amb un nombre senar de files i columnes on la suma dels elements de totes les seves files i les seves columnes i les dues diagonals val igual. En aquest quadrat no hi ha cap número repetit, i els números que hi ha d'haver han d'anar des de 1 fins a n2 on n és el numero de files i columnes.
Com construir-lo?
- El numero 1 el situarem en el quadrat superior al central (per exemple, per n=5, el quadrat central és (2,2) i el que està per sobre seu el (1,2).
- El següent número el situarem un quadrat a la dreta i un per sobre. Si un numero està a la posició (i,j), el següent el situarem en (i-1,j+1).
- Si resulta que al fer el moviment sortim per la dreta, entendrem que automàticament entrarem per l'esquerra, és a dir, és com si la matriu estigués enganxada la part esquerra amb la part dreta. El mateix passa amb dalt i baix. Si sortim per dalt, entrem per baix.
- A més ens podem trobar que la posició on toca anar un número ja es troba ocupada. Llavors el que farem és tornar a la posició on estàvem i fer el moviment que puja dos posicions (i-2, j ).
- Un exemple de quadrat màgic per a N=5 seria:
23 6 19 2 15 10 18 1 14 22 17 5 13 21 9 4 12 25 8 16 11 24 7 20 3
- El programa tindrà les següents funcions:
- llegirDimensio: Li demanem a l’usuari que ens indiqui la mida N de la matriu. Si el valor és correcte, la funció el retorna.
- inicialitzarQuadrat: Simplement posem tots els valors a 0
- calculaPosicioInicial: Segons la dimensió, calculem la primera posició
- assignaValor: Posa un valor en una posició
- calcularNovaPosicio: Retorna els valors de fila i columna vàlids per a col·locar el proper valor.
- imprimirQuadrat: Treu per pantalla el quadrat màgic,
- El programa serà semblant a aquest :
dim = llegirDimensio()
qm = inicialitzarQuadrat(dim)
pos = calculaPosicioInicial(dim)
limit = dim*dim;
for valor in range(1,limit+1):
assignaValor(qm,pos,valor)
pos = calcularNovaPosicio(qm, dim, pos)
imprimirQuadrat(qm)
24. Mastermind
El Mastermind és un joc que consisteix en, mitjançant pistes, deduir un codi numèric de n xifres ocult (en el nostre cas de quatre xifres i generat aleatòriament). Dinàmica del joc:
- El programa generà aleatòriament un codi numèric de quatre xifres (codi a endevinar).
- El jugador anirà proposant codis (intents) per tal de trobar el codi a endevinar.
- L'objectiu es trobar el codi en el menor número d'intents. Es pot limitar el número d'intents (per ex. a 7).
- Desprès de cada intent el programa donarà pistes que ajudin a deduir el codi:
- Encerts: quants números s'han encertat i es troben en la posició correcta .
- Coincidències: quants números s'han encertat però no es troben en la posició correcta.
- Exemple:
- codi: 7539
- proposta: 2590
- pistes: 1 encert i 1 coincidència.
- El joc finalitzarà quan s'hagi trobat el codi numèric o s'hagin exhaurit els intents.
- El programa permetrà tornar a jugar si així o vol el jugador.
- Diagrama de flux
25. El Penjat
El penjat consisteix en endevinar una paraula generada aleatòriament per l'ordinador. Dinàmica del joc:
- Es presenta una forca i un guio per a cada lletra de la paraula.
- El jugador proposa lletres (d'una en una) i:
- si la lletra es troba a la paraula es substitueixen els guions respectius per la lletra.
- sinó s'actualitza la forca en una part del cos (cap, tronc, braç esquerra, braç dret, cama esquerra i cama dreta).
- El joc finalitza quan es troben totes les lletres o quan ja no queden parts del cos.
- El programa permetre tornar a jugar si així o vol el jugador.
- Diagrama de flux
Podeu utilitzar:
PENJAT = [''' +---+ | | | | | | =========''', ''' +---+ | | O | | | | =========''', ''' +---+ | | O | | | | | =========''', ''' +---+ | | O | /| | | | =========''', ''' +---+ | | O | /|\ | | | =========''', ''' +---+ | | O | /|\ | / | | =========''', ''' +---+ | | O | /|\ | / \ | | ========='''] paraules = 'paraules donatius diccionari malaltia alemany escola impossible variable objectiu disseny reproductor escriptor llibertat revista llengua somni cistell maduixa gresca ignorant carquinyoli xisclar '.split()
26. ==3 en ratlla==
El joc consisteix en posar 3 fitxes en línia en un tauler de 9 caselles abans que ho faci l'ordinador.
- El jugador i l'ordinador alternen les jugades.
- El jugador escollirà el símbol que vol (X o O) i es farà un sorteig de qui comença la partida
- L'ordinador analitzarà la situació del tauler per cercar la millor jugada a fer.
- La partida finalitzarà en el moment que un dels jugadors aconsegueixi fer 3 fitxes en linia o quan el tauler estigui omplert.
- Cal informar del resultat de la partida: Guanya la persona, l'oridnador o hi ha hagut un empat.
- El programa permetrà tornar a jugar si així o vol el jugador.
# "tauler" és una llista de 10 cadenes (obviem la posició 0 de la llista) print(' 3 en ratlla') print() print(' | |') print(' ' + tauler[7] + ' | ' + tauler[8] + ' | ' + tauler[9]) print(' | |') print('-----------') print(' | |') print(' ' + tauler[4] + ' | ' + tauler[5] + ' | ' + tauler[6]) print(' | |') print('-----------') print(' | |') print(' ' + tauler[1] + ' | ' + tauler[2] + ' | ' + tauler[3]) print(' | |')
27.Realitzar un programa que resolgui un tour del cavall per un tauler d'escacs, és a dir, que mostri totes les caselles per on passarà el cavall (que han de ser totes). Utilitzar la recursivitat.
0 59 38 33 30 17 8 63 37 34 31 60 9 62 29 16 58 1 36 39 32 27 18 7 35 48 41 26 61 10 15 28 42 57 2 49 40 23 6 19 47 50 45 54 25 20 11 14 56 43 52 3 22 13 24 5 51 46 55 44 53 4 21 12
Tenir en compte que hi pot haver més d'una solució, aquesta funció imprimeix una de les solucions factibles.