Carta =================================================================================================================================== Una empresa utilitza plantilles de cartes que envia personalitzades als seus clients. Una plantilla de carta es composa de text ordinari i de símbols que s'han de substituir per les dades concretes dels clients. Els símbols son paraules que comencen amb el caràcter '@'. Per exemple una plantilla de carta seria com la següent: *@benvinguda @tractament @nomclient\\nEn aquesta data assenyalada, TTT S.A. li desitja moltes felicitats\\n\\nAlex Perez\\nGerent\\n* on: - *@benvinguda* és un símbol que s'ha de substituir per 'Benvolgut' o 'Benvolguda' depenent del genere del client - *@tractament* és un símbol que s'ha de substituir per 'senyor' o 'senyora' depenent del genere del client - *@nomclient* és un símbol que s'ha de substituir pel nom del client #. Dissenyeu la funció *esSimbol(paraula)* que donat un string retorni True si és un símbol (si comença amb '@') i False en cas contrari. #. Dissenyeu la funció *substitueixSimbol(simbol, nomclient, eshome)* que donat un string que conté un simbol, donat un string que representa el nom del client i donat un booleà que té per valor True si el client és un home i False si és una dona, retorna un string que substitueix el símbol pel valor personalitzat. Suposeu que el símbol només pot ser un dels tres símbols descrits amunt. #. Dissenyeu la funció *personalitzaCarta (plantilla, nomclient, eshome)* que, donat un string que conté una plantilla de carta, donat un string que representa el nom del client i donat un booleà que té per valor True si el client és un home i False si és una dona, retorna un string que representa la carta personalitzada. Suposeu que el string de plantilla conté com a possibles símbols únicament els tres símbols descrits amunt. Cal utilitzar la funció *substitueixSimbol*. Suposeu també que totes les paraules de la plantilla estan separades per un únic espai, que no hi ha espais en blanc al principi i al final de cada línia. Sí que hi pot haver un o més salts de línia a la plantilla. #. Un string que representa un client està estructurat de la manera següent: el primer caràcter és la lletra 'H' (home) o bé la lletra 'D' (dona), el segon caràcter és un espai en blanc i els caràcters següents són el nom i cognoms del client separats per un espai en blanc. Per exemple: *D Maria Fuertes Montroig* o *H Roger Pallés Montero*. Dissenyeu la funció *obteNomiGenere(client)* que donat un string estructurat com s'acaba de descriure, retorna un booleà que tingui per valor True si és un home i False si és una dona i un string que contingui únicament el nom complet del client. Per exemple, ''obteNomiGenere('D Maria Fuertes Montroig') ha de retornar (False, 'Maria Fuertes Montroig'). #. Dissenyeu la funció *tractaClients(plantilla, llista)* que, donat un string que conté una plantilla de carta i donada una llista de clients, retorni una llista de cartes personalitzades. La llista de clients està formada per strings estructurats com s'ha descrit a la pregunta anterior (genere i nom). Cal utilitzar les dues funcions anteriors. #. Dissenyeu la funció *llegirPlantilla(nomfitxer)* que donat el nom d'un fitxer de text que conté una plantilla de carta, retorni un string que tingui per valor aquesta plantilla. #. Dissenyeu la funció *llegirClients(nomfitxer)* que donat el nom d'un fitxer de text que conté per cada línia el gènere i nom d'un client, retorni una llista de strings estructurada com s'ha descrit a la pregunta 2. #. Dissenyeu la funció *tractaLlistaClients(fitxerplantilla, fitxerclients)* que, donats els noms del fitxer de plantilla i del fitxer de clients, retorni una llista de cartes personalitzades per cada client de la llista. #. Dissenyeu una segona versió de les funcions anterior utilitzant un diccionari que tingui com a clau els símbols i com a valors els strings pels que han de ser substituïts.