|
Fonaments de programació.
Llenguatge C/C++ |
|
Projecte fi de curs. Propostes |
|
|
|
1. Sopa de
lletres Aquest
projecte es basa en la pràctica d'ampliació del mòdul 6. Es tracta de fer un
programa que permeti construir sopes de lletres i buscar paraules en una sopa
de lletres definida prèviament. El programa
tindrà dues parts: 1.
Construcció de sopes de lletres. ·
Aquesta opció demanarà a l'usuari la dimensió de
la taula (que pot no ser quadrada) i el nombre de paraules a amagar. El
nombre de files i de columnes de la taula, i el nombre de paraules a amagar,
no serà en cap cas superior a 50. ·
L'usuari haurà de decidir on vol amagar la
paraula. Una vegada introduïda la paraula, haurà d'indicar la fila i columna
de la primera lletra de la paraula i la direcció de lectura amb el següent
conveni: o hd
horitzontal d'esquerra a dreta. o he
horitzontal de dreta a esquerra. o vb
vertical de dalt a baix. o vd
vertical de baix a dalt. o db
diagonal d'esquerra a dreta i de dalt a baix. o dd
diagonal d'esquerra a dreta i de baix a dalt. o eb
diagonal de dreta a esquerra i de dalt a baix. o ed
diagonal de dreta a esquerra i de baix a dalt. Per exemple: programa 0 0
db
·
Una vegada introduïda la paraula, la posició de
la primera lletra i la direcció, el programa haurà de comprovar si és
possible, és a dir, si la paraula cap en el tauler i si és compatible amb les
paraules introduïdes amb anterioritat. ·
Una vegada introduïdes totes les paraules, el
programa omplirà les posicions buides amb lletres a l'atzar. ·
S'ha de permetre guardar una sopa així construïda
en disc. L'arxiu ha de contenir la dimensió, la llista de paraules que estan
amagades i tota la taula. L'arxiu no guadarà la posició ni la direcció
on s'amaguen les paraules. 2. Cerca de
paraules ·
Aquesta serà la part similar a la pràctica
d'ampliació del mòdul 6. El programa haurà de llegir un arxiu en el mateix
format comentat abans. ·
Una vegada que es trobi la sopa de lletres en
memòria haurà de cercar les paraules en les 8 direccions possibles i mostrar
en pantalla la llista de paraules amagades i la sopa de lletres amb les
paraules amagades en majúscules. 2.
Laberints Aquest
projecte està basat en un dels exercicis de la 1ª Pre-Olimpíada Informàtica
Catalana que es va celebrar a Barcelona el 21 d'abril de 2001. Considerem un
taulell quadriculat com el de la figura en el qual cada casella està
representada per les seves coordenades (fila, columna). En aquest
taulell hi podem trobar algunes caselles negres com les caselles (0,0) i
(1,2). De les
caselles que no són negres, hi ha dues que s'han representat d'un color
diferent i s'han marcat amb les lletres A i B. A representarà la casella inicial
i B la casella final. Es tracta de
cercar un camí, sense passar per caselles negres que ens porti de la casella
A a la casella B. Els camins poden unir dues caselles no negres que tinguin
un costat o un vèrtex comú, és a dir, podem considerar camins horitzontals,
verticals o en diagonal. El programa podria millorar-se si pogués trobar el
camí que satisfaci alguna d'aquestes dues condicions: 1.
Que passi per un nombre mínim de caselles. 2.
Que contingui un nombre mínim de traços rectes. A
l'exemple del dibuix, el camí trobat conté 4 traços: horitzontal, diagonal,
vertical i, de nou, horitzontal. En aquesta
figura pot semblar que el programa no serà molt interessant, però proveu amb
un tauler de 50 x 50 caselles i veureu com a ma (sense ajuda del programa) no
serà fàcil trobar el camí més curt entre dues caselles.
La forma
d'introduir les dades pot triar-se lliurement d'entre vàries possibilitats.
Una d'aquestes possibilitats es fer servir un arxiu d'entrada i un arxiu de
sortida. L'arxiu d'entrada tindrà la següent informació: 1.
Nombre total de files. 2.
Nombre total de columnes. 3.
Nombre total de caselles negres. 4.
Coordenades de les caselles negres. 5.
Coordenades de les caselles inicial i final (A i
B). 6.
Si s'escau, algun paràmetre que indiqui quin camí
ha de buscar: un camí qualsevol, un camí amb un mínim de caselles o un camí
amb un mínim de traços. L'arxiu de
sortida contindrà la llista de totes les caselles del camí trobat començant
per la casella A i acabant per la casella B. En el cas que el camí no sigui
possible, també l'haurà d'indicar. 3.
Comparació d'algorismes d'integració numèrica Quan es
trobem amb el problema del càlcul d'àrees limitats per funcions contínues ens
veiem obligats a calcular integrals d'aquestes funcions. Molts altres
problemes que aparentment no tenen res a veure amb el càlcul d'àrees també es
poden resoldre amb el càlcul d'integrals definides. En molts casos no és
possible un càlcul analític exacte d'aquestes inte grals i ens
veiem en l'obligació de recórrer a un mètode numèric. En aquest projecte es
proposa implementar els algorismes més coneguts de càlcul numèric d'integrals
i fer una comparació d'aquests en quant a temps de càlcul i precisió. Mètode dels
rectangles El primer i
més intuïtiu dels mètodes numèrics d'integració és el mètode dels rectangles
que consisteix en aproximar l'àrea tancada per la funció que volem integrar i
l'eix d'abscisses per una suma d'àrees de rectangles.
Per això es
divideix l'interval d'integració [a,b] en n parts iguals de
longitud (b-a)/n i s'agafen els rectangles que tenen com a base
cadascú d'aquests subintervals i d'alçada la imatge de la funció en el extrem
esquerre ( o dret). Les fórmules són: Mètode dels
trapezis Aquest mètode consisteix en aproximar l'àrea no per rectangles sinó per
trapezis, tal i com es pot observar a la figura: L'àrea d'un
trapezi de bases f(xk) i f(xk+1) i
distància entre bases (b-a)/2 és igual a: La suma de
totes aquestes àrees és: Es pot
comprovar molt fàcilment que el mètode dels trapezis dóna la mitjana
aritmètica dels valors (I) i (II) del mètode anterior. Mètode de
Simpson El mètode de
Simpson consisteix en aproximar la funció per arcs de paràbola determinats
per tres punts consecutius. Després d'un
desenvolupament una mica més llarg que en els mètodes anteriors es pot trobar
que :
Per tal de
fer servir el mètode de Simpson és necessari que n sigui parell. Es pot fer
que la introducció de la funció es pugui fer de dues formes: ·
Un arxiu amb els valors tabulats de la funció. És
necessari en aquest cas aquestes dades: o extrem
esquerre (a) o longitud
del subinterval ((b-a)/n) o llista
dels n+1 valors f(xk) ·
Una funció externa que es pugui modificar i
tornar a compilar cada vegada. Aquesta funció començaria: double f(double x){
return (..); } En aquest últim cas és necessari la
introducció del valor n. 4.
Comparació d'algorismes d'ordenació Com a
ampliació de la pràctica d'ampliació 2 del mòdul 3, es proposa en aquest
projecte cercar més informació sobre els diferents mètodes d'ordenació i fer
una aplicació C/C++ que mostri de forma comparada els dos mètodes ja
explicats més un o dos mètodes més. Es recorda
que els mètodes que es van tractar en la pràctica d'ampliació 2 del mòdul 3
són els mètodes de la bombolla i el de selecció.
A més es podria estudiar i implementar un mètode d'ordenació per inserció.
Aquest últim consisteix en ordenar les dades inserint els elements en una
estructura ja ordenada de dades. A més
d'aquests tres mètodes simples, es podria considerar també els següents
mètodes més sofisticats: Ordenació Shell i Ordenació
ràpida (QSORT). El projecte
no consistiria només en la implementació dels tres o quatre algorismes
d'integració sinó que ha de permetre fer un estudi comparatiu de tots tres o
tots quatre. Aquest estudi ha de consistir en: ·
Velocitat de l'ordenació en un cas promig. ¿Com
augmenta aquesta velocitat al augmentar el nombre de dades? (Només un estudi
experimental) ·
Velocitat en el pitjor i el millor dels casos. ·
¿Té l'algorisme un comportament natural o antinatural?
Es diu que un algorisme té un comportament natural si treballa poc si la
llista està gairebé ordenada. 5.
Analitzador d'expressions aritmètiques en notació polonesa. Les piles Una pila
és un tipus d'estructura de dades que fa servir el mètode d'accés LIFO (Last
in, first out), és a dir, la última dada en entrar és també la primera en
sortir. Podem imaginar una pila de plats que es posen un a sobre d'un altre.
El primer plat, el que es troba a sota de tot, és l'últim en fer-lo servir, i
el de sobre, l'últim que es va posar, és el primer en fer-lo servir. Les piles es
fan servir molt en software de sistemes. El mateix compilador de C fa servir
una pila per passar arguments a funcions. Les úniques
accions que es poden fer amb una pila és afegir una dada, que
es posarà a sobre de tot, i treure una dada, que s'agafarà de
sobre de tot. Una aplicació
útil i senzilla alhora de les piles són els analitzadors d'expressions en
notació polonesa. Aquesta és la lògica operacional típica de les calculadores
de la marca HP. L'avantatge
principal d'aquest mètode és que no es necessita parèntesis ni la necessitat
de suposar cap prioritat entre les operacions. Aquest sistema fa que es
minimitzi tant el nombre de tecles presses com el nombre real d'operacions. Per tal
d'explicar aquest mètode operacional imaginem que hem de fer aquesta
operació: 3+4*5 Aquesta
expressió s'introduiria com: 3, 4, 5, *, + o bé: 4, 5, *, 3, + Aquestes dues
expressions només contenen números, els símbols d'operació :+ *, i el símbol
, (coma) que separa els diferents tokens. El programa
analitzador d'aquesta expressió comença llegint l'expressió pel caràcter de
l'esquerra i fa el següent: ·
Si és un número l'escriu a la pila. ·
El caràcter ',' serveix per separar dos tokens
diferents. (s'anomena token a un número o un operador) ·
Si és un símbol: +, -, *, / fa l'operació binària
corresponent, esborra els dos operadors i posa el resultat corresponent a la
pila. Per tal de
distingir entre l'operador binari '-' que representa la resta i l'operador
unari '-' que representa canviar el signe, aquest últim operador sempre anirà
a l'esquerra del número sense separar per comes. També pot ser útil reservar
un símbol diferent per aquest operador, com pot ser 'n'. Exemple: -3+(2*(-5)) seria: -3,2,-5,*,+ o: 3,n,2,5,n,*,+ Per tal de
veure el funcionament de l'analitzador veurem el contingut de la pila amb la
següent expressió: 3, 4,5, *,+
Veiem un
exemple una mica més sofisticat: 3,3,2,4,+,*,-,3,5,-,/,1,2,/,+,2,1,3,1,-,/,+,/
Es pot veure que és molt fàcil
avaluar expressions d'aquests tipus, només fa falta que el programa pugui
extraure els tokens de l'expressió que estan separats per comes. Si el
token és un número ha de cridar a una funció que afegeixi aquest número a la
pila. Si el token és un operador (per simplificar només considerarem +,-,*,/)
fa l'operació binària amb els dos últims números emmagatzemats en la pila i
els substitueix pel resultat, per tant, en cada operació, el nivell de la
pila baixa en una posició. Feu que el programa pugui llegir del
teclat o d'un arxiu una expressió aritmètica i doni el resultat. Podeu perfeccionar aquest senzill
analitzador d'expressions afegint altres operadors binaris com l'exponenciació
i unaris com funcions trigonomètriques, logarítmiques i exponencials. Podeu
permetre també l'ús de variables (de moment una o dues variables serà
suficient). Si l'analitzador troba el nom d'una variable afegeix a la pila el
contingut d'aquesta variable. L'objectiu final d'aquest projecte
podria ser construir un programa que, donada una funció que es pot introduir
per teclat o mitjançant un arxiu pugui tabular la funció entre dos valors
determinats i amb un increment determinat. Per exemple: Si volem tabular la funció: entre els valors 0 i 1 amb un
increment 0.1: Les dades serien: ·
Funció:
x,x,*,n,exp,x,x*,exp,+,2,/ ·
dada inicial:
0 ·
dada
final: 1 ·
increment:
0.1 L'avantatge dels analitzadors
d'expressions és que no és necessari haver de compilar el programa de nou per
tabular una altra funció. 6. Anàlisi criptogràfic d'un
missatge. Substitució monogràfica. Els mètodes elementals de
criptografia consisteixen en substituir unes lletres per unes altres. Si la
substitució es fa lletra a lletra i el missatge és suficientment llarg com
per tenir unes freqüències de símbols significatius, la comparació d'aquestes
freqüències amb les freqüències de les lletres en el idioma en que està
escrit el missatge ens permetrà desxifrar-lo. Un conjunt de programes per tal
d'obtenir missatges xifrats i desxifrar-los seria un senzill projecte que
podria desenvolupar-se de la següent forma: Un programa que permeti xifrar
missatges. El programa podrà optar per diferents opcions: ·
Xifrat Juli Cèsar (fa falta introduir un número). ·
Xifrat monoalfabètic determinat (fa falta
introduir la correspondència de cada lletra. Aquesta serà la clau i es pot
introduir mitjançant un arxiu que contingui una permutació qualsevol de les
27 lletres) ·
Xifrat monoalfabètic aleatori (la clau la
decideix aleatòriament el programa i no la mostra, per tant serà una bona
forma de provar els programes per desxifrar. En qualssevol cas, la llargada del
missatge ha de ser suficient per tal de que les freqüències de les seves
lletres siguin significatives (mínim 1000 lletres). Un programa que permeti obtenir les
freqüències de les diferents lletres de qualsevol text en format ASCII.
Aquest programa ens servirà per determinar la freqüència de les lletres en el
idioma dels textos. Amb aquest programa es pot estudiar si aquestes
freqüències depenen no només de l'idioma sinó també del tipus de text, de
l'autor, de l'època, del tema, etc. Amb aquest programa determinarem tant
les freqüències de les lletres en el idioma determinat sinó també les
freqüències de les lletres en el missatge xifrat. Aquestes freqüències
sortiran en un arxiu que servirà d'entrada pel tercer programa. El tercer programa agafarà com a
dades el text xifrat i les freqüències trobades de les lletres en el idioma i
el el missatge. S'ha de cercar alguns criteris automàtics de substituir
lletres amb freqüència similar i intercalar-los amb criteris manuals. 7. Anàlisi criptogràfic d'un
missatge. Substitució digràfica. Una variant d'aquest mètode de
substitució consisteix en agrupar les lletres de dues en dues i substituir
cada grup de dues lletres per un símbol que habitualment és un altre conjunt
de dues lletres. El primer que s'ha de fer per
desxifrar un missatge xifrat amb aquest mètode és disposar d'una taula de
freqüències de tots els parells de lletres. La primera part d'aquest projecte
serà per tant, construir un programa que permeti comptabilitzar aquestes
freqüències pels 27x27=729 parelles possibles de dues lletres. S'ha de
disposar abans d'un conjunt de textos suficients per tal d'obtenir unes dades
significatives. Aquests textos estaran en format ASCII. Això és pot fer amb
qualsevol processador de textos com Word o AmiPro. Una vegada es disposi d'aquesta taula
de freqüències, s'ha d'establir també una taula de freqüències dels parells
de lletres del missatge xifrat. Això es farà amb el mateix programa anterior. Després s'ha de fer un programa que
permeti substituir unes seqüències de lletres per unes altres. Podeu
establir, com en la proposta anterior, alguns criteris automàtics i
alternar-los amb criteris manuals. Evidentment falta un tercer programa
que pugui xifrar un text amb aquest mètode. Aquest programa és necessari per
tal d'obtenir un missatge a desxifrar. Busqueu formes d'indicar com fer
aquesta substitució (fórmules de qualsevol forma) i també és possible una
correspondència a l'atzar. 8. Joc de les dites. Una variant d'aquest mètode de
substitució consisteix en agrupar les lletres de dues en dues. El joc consisteix en endevinar
una dita amagada a sota de les cel·les d’un taulell de 5 fileres per 20
columnes. El jugador pot indicar caràcter
a caràcter o be si creu que ja la sap, escriure la dita sencera. En funció del temps emprat el
programa donarà una puntuació de 0 a 10. El programa ha de permetre: A) Jugar B) Introduir
una nova dita. C) Respondre
caràcter. D) Respondre
tota la dita
Les dites es
troben emmagatzemades dins l’arxiu “dites.dat” . Dins l’arxiu
una dita acaba en “.*” i el
final del fitxer amb “.*/”
Exemple
d’arxiu dites.dat L'abril mullat
fa créixer l'herba per al ramat.*Per l'abril neteja les armes i mata
les rates.*Abril finit el camp florit.*No t'embarquis per l'abril si
no vols estar en perill.*Per l'abril, abriló ous al ponedor.*Per l'abril
cada gota val per mil i el blat s'estira com un fil.*Abril,abriló de
cada cent, un de bo la vella que això deia en tenia cent un i no n'havia
vist mai ni un.*No hi ha mal any si l'abril és bo.*L'abril diu al maig
jo no he pogut tu plou a raig.*Abril ploraner maig rialler.*Abril finit
hivern passat.*No donis l'hivern per passat fins que l'abril no s'hagi
acabat.*Per l'abril no et treguis ni un fil.*Per l'abril cada ocell
canta en son niu.*A l'abril aigües mil.*D'abril un de bo entre mil.*Per
l'abril, llibres i roses mil.*Rient i plorant, l'abril va passant.*/ 9. Joc del set i mig. És un joc prou conegut per tots. El programa va repartint una a una les
cartes als jugadors i a ell mateix
que fa de banca. En el seu torn, el jugador fa una aposta i demana carta o es planta. Si
es planta el torn passa al següent jugador. Si desitja demanar carta
el programa mostrarà (en el nostre cas el número, no la figura) l’última
carta d’aquest jugador. Quan es demana carta o al plantar-se es pot fer una
nova aposta sense passar un límit que posarà el programa.
1. El
valor total de la carta superi set punts i mig. En aquest cas el jugador ha
perdut i la seva aposta se la queda la banca i les seves cartes van al munt
de les cartes per poder ser utilitzades. Després d’acabar el torn dels jugadors arriba el
torn de la banca.
En tot moment en el monitor es mostraran les següents
dades: . Saldo actual de cada jugador. . Aposta de la jugada. Després
de la jugada s’hauran d’actualitzar les dades *Es pot genera un numero
aleatori 0 , 1 de tal forma que si surt 0 no demana i cas contrari si surt 1
. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|