ASIX-M3-UF2-A1.1-Exercicis disseny descendent

De wikiserver
Dreceres ràpides: navegació, cerca

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
Diagrama flux "Mastermind"

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
Diagrama flux "El Penjat"

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.