EDITORIAL C - Mètode · 10101; això és, en codi binari. Created Date: 11/19/2018 11:19:22 AM ...
FONAMENTS D'INFORMÀTICA - cs.upc.edumiquel/fi/prob.pdf · en l'entorn Windows/DOS. 1.2.1 Convertiu...
-
Upload
hoangxuyen -
Category
Documents
-
view
222 -
download
0
Transcript of FONAMENTS D'INFORMÀTICA - cs.upc.edumiquel/fi/prob.pdf · en l'entorn Windows/DOS. 1.2.1 Convertiu...
FONAMENTS D'INFORMÀTICA
Diplomatura d'Estadística
(Facultat de Matemàtiques i Estadística, FME)
Problemes
Miquel Sànchez i Marrè
Departament de Llenguatges i Sistemes Informàtics
Setembre de 2008
1. INTRODUCCIÓ A LA INFORMÀTICA
Un usuari d'un entorn informàtic té estructurada la seva zona de treball (directori) tal i com s'indica en el següent gràfic:
W:\f7945694
FI AL AN1 PROB EN
P1 P2 P3 P4
Suposant que per a cadascun dels exercicis següents sempre es parteix de la mateixa situació original: el directori per defecte (on està situat l'usuari) és l'arrel de la jerarquia, escriviu les comandes (en Unix i en DOS) que li permetran realitzar les següents tasques: 1.1.1 Crear un nou subdirectori de nom 'PROVA'. 1.1.2 Copiar els fitxers de text del subdirectori 'AN' al subdirectori 'P1'. 1.1.3 Esborrar el fitxer 'DADEST.DAT' del subdirectori 'EN'. 1.1.4 Canviar el nom del fitxer 'C.DAT' pel de 'CC.DAT', que està situat en el directori 'AL'. 1.1.5 Imprimir 3 còpies del fitxer 'RES1.TXT' a la cua 'RALPH1', sabent que el fitxer és al subdirectori 'P2'. 1.1.6 Canviar el directori per defecte al subdirectori 'P1'. I després canviar al 'AL'?. 1.1.7 Executar un programa de nom 'JOC.EXE' que està situat al directori 'W:\FME\DE'. 1.1.8 Veure el contingut del subdirectori 'CP'. 1.1.9 Eliminar les versions anteriors del fitxer 'GUAI.PAS' que no se sap on és.
3
1.1.10 Copiar els fitxers de programes Fortran del subdirectori 'P1' al directori arrel. 1.1.11 Repetiu tots els exercicis anteriors, però ara sense partir de la mateixa situació original. És a dir, inicialment esteu situats al directori arrel, però la situació inicial d'un exercici es correspon amb la final de l'exercici anterior. 1.1.12 Practiqueu els exercicis anteriors, els que es puguin, tan en l'entorn Linux/Unix com en l'entorn Windows/DOS.
——————————————
1.2.1 Convertiu els següents números decimals al sistema binari: 1984, 4000, 8192, 1992. 1.2.2 Una targeta perforada ordinària té 80 columnes de 12 posicions cadascuna. Quina mida ha de tenir el conjunt de caràcters representables si es vol que cadascun es representi amb una columna que tingui com a molt 3 perforacions?. 1.2.3 Quin número és 10001101001 (en binari) en el sistema decimal ?. I en base 8?. I en base 16?. 1.2.4 Estimeu quants caràcters conté un llibre, incloent els espais. Quants bits es necessiten per a codificar un llibre en codi ASCII amb bit de paritat ?. Quantes cintes magnètiques de 1600 bpi de densitat i 2400 peus (1 peu = 12 polsades) es necessiten per a emmagatzemar una biblioteca de 106 llibres ?. 1.2.5 Quants enters positius es poden expressar amb k dígits usant números en base r ?. 1.2.6 Feu una estimació de la capacitat màxima d’emmagatzemament del cervell humà usant les següents suposicions: * Tota la memòria es codifica en forma de molècula d'ADN. * Una molècula d'ADN és una seqüència lineal de nucleòtids. * Hi ha 4 nucleòtids: A, C, G i T. Donat el pes mig d'un nucleòtid (10‐20 grams) i el pes mig del cervell (1500 grams), deduïu la capacitat en bits del cervell per a aquesta forma de codificació. Nota: Aquest càlcul és només una fita superior de la capacitat d'informació, perquè el cervell té moltes cèl∙lules que realitzen funcions diferents a la de la memòria i a més a més, no tota la seva matèria és ADN. 1.2.7 Feu els següents càlculs en números de 8 bits en complement a 2: a) 00101101 + 01101111 = ? b) 11111111 + 11111111 = ?
4
c) 00000000 ‐ 11111111 = ? d) 11110111 ‐ 11110111 = ? 1.2.8 Suposant que treballem amb un sistema de representació binari, on els valors enters ocupen 2 bytes, efectueu els següents càlculs: a) Convertiu el número 23412 al sistema binari.
b) Convertiu el número binari 1011 0101 1100 1001 al valor enter sense signe que representa, en el sistema decimal. c) Convertiu el número binari 1011 0101 1100 1001 al valor enter amb signe (en complement a 2) que representa, en el sistema decimal. d) Efectueu els següents càlculs amb números enters amb signe (en complement a 2):
• 0110 1111 0101 0001 + 1001 0000 1101 1000 = ? • 1001 1110 1011 0101 ‐ 0111 1111 0110 0010 = ? 1.2.9 Suposant que treballem amb un sistema de representació binari, on els valors enters ocupen 2 bytes, efectueu els següents càlculs: a) Convertiu el número 17013 al sistema binari.
b) Convertiu el número binari 1000 1110 0101 0011 en el número que representa en el sistema decimal, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el número binari 1000 1110 0101 0011 en el número que representa en el sistema decimal, interpretant‐lo com si fos un valor enter amb signe (i per tant, en complement a 2). d) Efectueu els següents càlculs amb números enters amb signe (en complement a 2):
• 0111 1001 0000 1101 + 0101 1110 1110 1010 = ? • 1011 0011 0110 0001 ‐ 1100 0010 1001 1001 = ? e) Convertiu el número 21731 al sistema octal (base 8). 1.2.10 Quines de les següents memòries principals són possibles en un computador ?. Quines són raonables ?. Expliqueu‐ho. a) 10 bits en el MAR (Memory Address Register) 1024 paraules de memòria 8 bits per paraula b) 10 bits en el MAR
5
1024 paraules de memòria 12 bits per paraula c) 9 bits en el MAR 1024 paraules de memòria 10 bits per paraula d) 11 bits en el MAR 1024 paraules de memòria 10 bits per paraula e) 10 bits en el MAR 10 paraules de memòria 1024 bits per paraula f) 1024 bits en el MAR 10 paraules de memòria 10 bits per paraula 1.2.11 Convertiu aquests números decimals al sistema binari en complement a 2: ‐321, +467, +666, ‐1234, +90, ‐556. 1.2.12 L'empresa Softest S. A., dedicada a les aplicacions estadístiques ha decidit encarregar a la casa Chip Inc. la construcció d'un computador per a processar eficientment les dades de les enquestes: sí, no i no sap‐no contesta, basat en una memòria ternària, on la unitat bàsica d'informació és el trit que pot adoptar els estats 0, 1 o 2. Quants trits es necessiten per a emmagatzemar un número de 6 bits ? Obteniu una expressió per al nombre de trits necessaris per a representar n bits. 1.2.13 Un computador està equipat amb 262 144 bytes de memòria principal. Per què ha escollit aquest nombre el fabricant, en lloc d'un més normal i fàcil de 250 000 ?. 1.2.14 Mediu la vostre velocitat de lectura i compareu‐la amb la velocitat de transmissió d'una línia telefònica de 300 bps. 1.2.15 El director del LCFIB ha decidit retirar definitivament les perforadores de targetes i les lectores de targetes. Abans però, vol copiar tots els paquets de fitxes perforades en una cinta magnètica. Si l'espai entre enregistraments físics o blocs de les cintes de 1600 bpi és de 0.25 polsades i s'escriuen 15 targetes de 80 columnes per enregistrament físic o bloc. Quantes caixes de 2000 targetes caben en una cinta de 2400 peus ?. 1.2.16 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions: a) Convertiu el nombre enter 9592 del sistema decimal al sistema binari.
6
b) Convertiu el nombre binari 1010 1100 1000 0101 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. Feu el mateix, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). c) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): • 0110 1010 0111 0001 + 1001 1100 0101 1111 = ?? • 0111 0001 1011 1101 – 1111 0001 1010 0110 = ?? d) Donada la configuració següent d'un computador, expliqueu raonadament si és possible o si és raonable o cap de les dues opcions:
14 bits en el MAR (Memory Address Register, o registre d'adreces de memòria), 12 bits en el MBR (Memory Buffer Register, o registre de dades de memòria), 4096 paraules de memòria i 14 bits d'amplada de memòria.
1.2.17 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.:
20 bits en el MAR (Memory Address Register, o registre d'adreces de memòria) 22 bits en el MBR (Memory Buffer Register, o registre de dades de memòria)
1 024 000 paraules de memòria 20 bits d'amplada de memòria
1.2.18 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre enter sense signe 28365, del sistema decimal al sistema binari.
b) Convertiu el nombre binari 1101 0101 1001 1101 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1101 0101 1001 1101 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1101 0010 0101 1001 + 1000 1110 1101 0011 = ?? * 0101 1101 0001 1000 – 1011 1011 0010 1001 = ??
1.2.19 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
7
a) Convertiu el nombre 28365 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1010 1111 0001 1010 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1010 1111 0001 1010 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1000 1111 0111 1011 + 1110 0101 1000 1011 = ?? * 1100 0001 1001 1001 – 0111 0011 1110 1000 = ??
1.2.20 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.: 18 bits en el MAR (Memory Address Register, o registre d'adreces de memòria) 18 bits en el MBR (Memory Buffer Register, o registre de dades de memòria) 64 K paraules de memòria Les paraules de memòria tenen 2 bytes d'amplada 1.2.21 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 9592 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1100 0011 1001 0110 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1100 0011 1001 0110 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1001 1001 1000 0011 + 1000 1111 0010 0010 = ?? * 1000 1001 1010 0110 – 0110 0001 1100 1101 = ??
1.2.22 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.: 10 bits en el MAR (Memory Address Register, o registre d'adreces de memòria)
8
12 bits en el MBR (Memory Buffer Register, o registre de dades de memòria) 2 K paraules de memòria Les paraules de memòria tenen 12 bits d'amplada 1.2.23 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 17584 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1011 0101 0111 1010 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1011 0101 0111 1010 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1100 1101 1001 1001 + 0010 1011 1010 1010 = ?? * 0110 1100 0001 1010 – 1100 1001 0010 0101 = ??
1.2.24 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 2198 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1011 1111 0101 1010 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1011 1111 0101 1010 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 0011 0101 1010 0101 + 0110 1010 0110 1000 = ?? * 0010 1001 1010 0110 – 1110 1000 1100 1101 = ??
1.2.25 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.:
12 bits en el MAR (Memory Address Register, o registre d'adreces de memòria) 14 bits en el MBR (Memory Buffer Register, o registre de dades de memòria)
9
16 K paraules de memòria Les paraules de memòria tenen 12 bits d'amplada
1.2.26 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 29998 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1100 1100 1101 0001 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1100 1100 1101 0001 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 0110 0101 0110 0101 + 0111 0011 0011 0110 = ?? * 1010 1111 1001 1110 – 1010 1000 1011 0001 = ??
1.2.27 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.:
12 bits en el MAR (Memory Address Register, o registre d'adreces de memòria) 12 bits en el MBR (Memory Buffer Register, o registre de dades de memòria)
8 K paraules de memòria Les paraules de memòria tenen 8 bits d'amplada
1.2.28 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 9915 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1100 1010 1110 0001 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1100 1010 1110 0001 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 0100 1101 0011 1101 + 1100 1110 1000 0010 = ??
10
* 1110 0111 0110 1001 – 0101 0001 1010 0001 = ?? 1.2.29 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 17592 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1011 1011 0001 1011 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1011 1011 0001 1011 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 0010 1101 0111 0100 + 0101 1010 1010 1011 = ?? * 0100 1010 1000 1010 – 0110 1001 0011 1001 = ??
1.2.30 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 14100 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1001 0001 0101 1000 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1001 0001 0101 1000 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1001 0101 1010 0101 + 0111 1010 0010 1001 = ?? * 1010 0101 1100 1110 – 0111 1000 1000 1001 = ??
1.2.31 Donades les característiques següents d'un computador, expliqueu raonadament si aquesta configuració és possible o no, si és raonable o no, etc.:
* 17 bits en el MAR (Memory Address Register, o registre d'adreces de memòria) * 16 bits en el MBR (Memory Buffer Register, o registre de dades de memòria) * 64 K paraules de memòria * Les paraules de memòria tenen 12 bits d'amplada
11
1.2.32 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 6666 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1000 1100 1111 1111 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Convertiu el nombre binari 1000 1100 1111 1111 al número que representa en base 10, però ara interpretant‐lo com un valor enter amb signe (i per tant, expressat en complement a 2). d) Efectueu les operacions següents interpretant els números com a valors enters amb signe (i per tant, en complement a 2): * 1011 0100 1010 1011 + 1000 1111 0010 0001 = ?? * 0101 1111 1011 0110 – 0111 1101 1101 0011 = ??
1.2.33 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 28082 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1100 1010 1000 1110 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe.
1.2.34 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 19645 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1010 0111 0000 1001 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe.
1.2.35 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 32178 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1001 1101 0100 0101 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Expliqueu breu i precisament què és i de què està composat el hardware.
12
d) Expliqueu breu i precisament què és un perifèric, i doneu algun exemple. 1.2.36 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 27064 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1101 0001 1101 0001 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Expliqueu breu i precisament quins nivells es poden distingir típicament en l’arquitectura d’un computador?. d) Expliqueu breu i precisament què és un paràmetre i quins tipus de paràmetres hi ha.
1.2.37 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 21012 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1000 1101 0001 1011 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Expliqueu breu i precisament què és una acció i què és una funció. Expliciteu les seves semblances i les seves diferències. d) Expliqueu breu i precisament en què consisteix el disseny descendent, i poseu‐ne un exemple.
1.2.38 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 40004 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1010 0001 1000 0100 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Expliqueu breu i precisament què és un paràmetre i quins tipus hi ha. d) Expliqueu breu i precisament en què consisteix un sistema operatiu.
1.2.39 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
13
a) Convertiu el nombre 27182 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1111 0000 1011 0101 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Expliqueu breu i precisament què és internet d) Expliqueu breu i precisament en què consisteix la memòria d’un computador. És volàtil o permanent ?
1.2.40 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 17592 del sistema decimal al sistema binari, com a enter sense signe.
b) Convertiu el nombre binari 1011 0000 1110 0101 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Definiu breu i precisament el concepte de tipus d’una variable. d) Expliqueu breu i precisament què és internet, i expliqueu 2 dels serveis que ofereix.
1.2.41 Suposant que treballéssiu amb un computador on els valors enters ocupen 2 bytes, efectueu els següents càlculs i respongueu les següents qüestions:
a) Convertiu el nombre 16108 del sistema decimal al sistema binari, com a enter sense signe. b) Convertiu el nombre binari 1100 1001 0000 1001 al número que representa en base 10, interpretant‐lo com si fos un valor enter sense signe. c) Definiu breu i precisament els conceptes dels dos serveis d’internet següents: blog i wiki. d) Expliqueu breu i precisament què és una acció i què és una funció, i expliqueu‐ne les diferències.
14
2. INTRODUCCIÓ A L’ALGORÍSMICA 2.1.1 Dissenyeu un algorisme que descrigui el treball a realitzar, per a pelar les suficients patates per a fer un sopar, sabent que es tenen com a accions primàries o elementals: pelar_una_patata omplir_cistell i com a condicions lògiques: cistell_buit? prou_patates? . 2.1.2 Dissenyeu un algorisme que descrigui el treball a realitzar per a fregar el terra d'un pis, tenint com a accions primàries: fregar_troç omplir_cubell_d'aigua buidar_cubell tirar_lleixiu_al_cubell nova_habitació i les condicions lògiques: pis_fregat? aigua_bruta? cubell_buit? habitació_fregada? . 2.1.3 Dissenyeu un algorisme que codifiqui la tasca que seguiu per anar de casa vostre a la Facultat, tenint les primitives següents: agafar_bus agafar_metro agafar_cotxe baixar_autobus baixar_metro baixar_cotxe esperar caminar . . . i les condicions lògiques: línia_autobus_correcta? línia_metro_correcta?
15
meu_cotxe? Facultat? correspondència_amb_línia_X? parada_baixada? estació_baixada? . . . 2.1.4 Dissenyeu un algorisme que descrigui com trobar un llibre en una biblioteca, tenint en compte que pot estar o no a la biblioteca, estar o no als prestatges, estar en préstec o no, etc. Utilitzeu les accions primitives i condicions lògiques que creieu necessàries. 2.1.5 Dissenyeu un algorisme que descrigui el procés de matriculació que heu seguit aquest any. Utilitzeu les accions primitives i condicions lògiques que creieu necessàries. 2.1.6 Dissenyeu un algorisme que descrigui com obtenir una conferència telefònica internacional, tenint en compte que podeu saber o no el número de l'abonat, hi ha línia o no, la línia està ocupada o no, etc. Utilitzeu les accions primitives i condicions lògiques que creieu necessàries. 2.1.7 Dissenyeu un algorisme que descrigui el procés d'elaboració d'una truita de patata i ceba, per a 10 invitats. Utilitzeu les accions primitives i condicions lògiques que creieu necessàries.
——————————————
2.2.1 Poseu parèntesis a les següents expressions de forma que es mantingui l'ordre d'avaluació: x + y + z x ‐ y * z x div y div z x * y + z ‐x + y div z x div y * y + x mod y x + y * z x * y div z x div y + z + w
2.2.2 Avalueu les següents expressions: 2 * 3 ‐ 4 * 5 15 div 4 * 4 3 * 1 div 3 1 div 3 * 3 80 div 5 div 3 2 div 3 * 2 cert i fals o cert i no cert cert i (fals o cert) i no (cert o fals) no (cert i fals o (cert o fals) i fals) o cert i fals
2.2.3 Avalueu les següents expressions: a) 3 * 5 + 6 div 2 mod 3 + 4 b) no (3 < 2) i no (25 > 4) o ('a' en ['b'..'e']) c) 9 = 27 div 3 = (13 ≤ 51 mod 14) d) [3,2,1] * [4,5,6] + [1..10] = [1..20] ‐ [11..19]
16
2.2.4 Escriviu les negacions de les següents expressions (on a, b, c són variables enteres i p, q, r són variables booleanes): p i q o r p i (p o r) no p i q o no r (a = b) o (a = 0) (a < b) i (b < c) no (a ≠ b) o (a + b = 7) no p o no q o (a = b + c) (a div b = 0) o (a = c)
2.2.5 Avalueu les següents expressions: a) 7 * 5 div 4 + 8 mod 3 ‐ 1 b) 60 mod 3 < 5 * ( 90 div 4 ) = ( 'a' < succ('b') ) c) 24 div 6 = 23 mod 5 = ( 17 ≤ ( codi('3') ‐ codi('0') ) ) d) not ( 'a' = pred('b') ) or ( ( 4 * 3 > 35 mod 11 ) < ( 3 = 5 mod 2) ) and true 2.2.6 Donats els valors inicials de les següents variables enteres i booleanes, { a = 3, b = 5, c = 7, p = cert, q = fals, r = cert }, indiqueu els valors que tindran aquestes variables després de les següents assignacions: a ← 3 * b ; b ← a + c ; p ← p i (c > b) ; q ← p o q ; r ← a = b ; a ← a + 1 ; b ← b ‐ 2 ; a ← ‐ a ; b ← b div 2 + c mod 3
2.2.7 Essent a, b, c, d variables numèriques, escriviu l'expressió lògica corresponent a: a) Els valors de b i c són tots dos superiors al valor de d. b) Els valors d'a, b i c són idèntics. c) Els valors d'a, b i c són idèntics però diferents del valor de d. d) El valor de b està comprès, estrictament, entre els valors de c i d.
e) El valor de b està comprès, estrictament, entre els valors de c i d, i el valor de c és més petit que el valor de d.
f) Hi ha, com a mínim, dos valors idèntics entre a, b i c. g) Hi ha dos valors idèntics entre a, b i c, i tan sols dos. h) Hi ha, com a màxim, dos valors idèntics entre a, b i c.
2.2.8 En un algorisme que analitza els resultats d'exàmens, hi ha 5 variables definides: la variable OPCIO, de tipus caràcter, indica el tipus de l'alumne ('c' per a ciències i 'l' per a lletres) i les variables NL, NC, NM, NF que indiquen respectivament (per a un alumne en particular) les notes de literatura, català, matemàtiques i física. Totes les notes estan calculades sobre 10 i totes tenen el mateix coeficient. Escriviu les expressions lògiques corresponents a:
17
a) La mitjana de les quatre notes és superior a 5. b) Les notes de matemàtiques i català són superiors a la mitjana de les quatre notes.
c) Hi ha, com a mínim, una nota superior a 5. d) Totes les notes són superiors a 5. e) La mitjana de les notes de l'opció és superior a 5 (NL i NC / NM i NF).
f) La mitjana de les 4 notes és superior o igual a 5 i la mitjana de les notes de l'opció també.
2.2.9 Siguin a, b, c i d variables enteres. Donada la següent construcció: si (((a > 0) o (b > a)) i (c ≠ d)) llavors a ← c; b ← 0 sinó c ← d+c; si c = 0 llavors c ← c+b sinó c ← c‐a fsi; b ← a+c+d fsi
Calculeu els valors finals d'a, b, c i d per a cada situació inicial següent: 1) { a = 0, b = 0, c = 5, d = 3 } 2) { a = 2, b = 1, c = 5, d = 3 } 3) { a = 2, b = 1, c = 2, d = 2 } 4) { a = 2, b = 1, c = 0, d = 0 }
2.2.10 Simplifiqueu la següent estructura si és possible: si x mod 3 = 0 llavors n ← x; y ← x div 3; i ← i+y; x ← 3*i; k ← x*x sinó n ← x; y ← −y; i ← i+y; x ← x*3+1; k ← x*x fsi
2.2.11 Simplifiqueu, en la mesura que sigui possible, les següents estructures algorísmiques, on les variables han estat definides de la següent forma, var a, b, c, d són enter fvar: a) a ← 3; b ← a + 2;
18
c ← a * b; a ← a div 2; b ← c; a ← c; c ← 4 div 3; a ← 80 div 5; b ← c + 1 b) si a mod 2 = 0 llavors b ← 2 * a; c ← 3 * c; d ← d div 2 + b sinó b ← 2 * a; c ← 3 * c; d ← d * 2 + b fsi c) a ← 20; b ← 1; mentre (a < 40) i (b ≤ 50) fer a ← a + 1; b ← b + 2 fmentre
2.2.12 Calculeu l'estat final de l'entorn en executar les següents instruccions, partint de l'estat inicial, { i = 2, j = 4, k = 1 }, i suposant que les variables han estat definides de la següent forma, var i, j, k, a, b, c són enter fvar: mentre i < 40 fer a ← 2 * i; j ← i; mentre j < 20 fer b ← 2 * j + 1; k ← i + j; mentre k ≤ 10 fer c ← a + b; k ← k + 1 fmentre; j ← j + 1 fmentre; i ← i * 2 fmentre
19
2.2.13 Calculeu l'estat final de l'entorn en executar les següents instruccions suposant que les variables han estat definides de la següent forma, var x,y,a,j són enter fvar: mentre x > 0 fer y ← x div 2; j ← y; si y mod 2 = 1 llavors j ← y+1 fsi; a ← 7; mentre j < x fer a ← a * j; j ← j + 1 fmentre; x ← y fmentre 2.2.14 Resoleu els següents apartats:
a) Avalueu les següents expressions: 7 * 8 mod 3 < succ(codi('5') ‐ codi('2')) div 2 no ('a' > succ('h')) i (3 = 7 div 2) o (cert = fals) b) Calculeu l'estat final de l'entorn, suposant que les variables han estat definides correctament com, var a,b,c,j,k són enter fvar mentre j < 10 fer a ← b+3; c ← a div 2; k ← j; mentre k > 0 fer k ← k‐1 fmentre; j ← j+1 fmentre
2.2.15 Resoleu els següents apartats:
a) Avalueu les següents expressions: 20 div 4 mod 3 < (codi('5') ‐ codi('2')) div 2 = (24.0 / 3.0 ≤ 8.0) no (no ('c' > car (codi('c') + 1)) i (3 = 7 div 2)) o ( 7 < 14 div 2 = fals) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri és
20
const vi val 0; fi val 0 fconst var n, mx, my, s, c són enter fvar s ← vi; c ← vi; escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir (n); mx ← n; my ← n; mentre n ≠ fi fer si n > mx llavors mx ← n fsi; si n < my llavors my ← n fsi; s ← s+n; c ← c+1; llegir (n) fmentre; si c > 0 llavors escriure (c, my, mx, s/c) fsi falgorisme { R ?? }
2.2.16 Resoleu els següents apartats: a) Avalueu les següents expressions: (40 * 3 mod 5 > (49 mod 7 + (codi('B') ‐ codi('A'))) div 2) i (12.0 / 6.0 ≥ 2.0) (succ('y') > 'a') i no (4 = 8 div 9) = (pred('1') = '9') o fals < (8 mod 3 = 2) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri96 és const vi val 0; marca val '.'; espai val ' ' fconst var c és caràcter; nll, npp són enter fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); nll ← vi; npp ← vi; llegir (c); sb(c, espai); mentre c ≠ marca fer tp(c, nll, npp, espai, marca); sc(c, espai) fmentre; opció cas npp > 0 fer escriure (nll/npp)
21
cas npp = 0 fer escriure (npp) fopció falgorisme { R ?? } acció sc (ent/sort car és caràcter; ent tc és caràcter) és mentre car = tc fer llegir (car) fmentre facció acció tp (ent/sort car és caràcter; ent/sort nl, np són enter; ent esp, mar són caràcter) és mentre (car ≠ esp) i (car � mar) fer nl ← nl+1; llegir (car) fmentre; np ← np+1 facció c) Dissenyeu un algorisme que satisfaci la següent especificació: Q ≡ { n ≥ 0 ∧ n = N } algorisme n
R ≡ { r = ∑ (1/i!) ∧ n = N }
i=1 2.2.17 Resoleu els següents apartats:
a) Avalueu la següent expressió: (20 div 2 mod 4 < (codi(‘d’) ‐ codi(‘b’))) o no (18.0 / 3.0 ≥ 4.0) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri97 és const vi val 0; marca val '.'; cb val 'o' fconst var c és caràcter; cmp són enter fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); cmp ← vi; llegir (c); mentre c ≠ marca fer
22
si tr?(c,cb) llavors cmp ← cmp + 1 fsi; llegir(c) fmentre; escriure (cmp) falgorisme { R ?? } funció tr? (ent car, carb és caràcter) retorna booleà és retorna (car = carb) ffunció c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 7; b ← 12; c ← 4; caixa_negra(a,b,c) falgorisme { a= ??, b= ??, c= ?? } acció caixa_negra (ent p1 és enter; ent/sort p2 és enter; sort p3 és enter) és p3 ← 0; p1 ← p2 + p3; p2 ← 20; p3 ← p1 + p2 facció
2.2.18 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri97bis és const vi val 0; marca val ‘.’; sep val ‘ ‘ fconst var c és caràcter; cmp és enter fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); cmp ← vi; llegir (c); mentre c ≠ marca fer sl_bln(sep, c); sl_crt(sep, marca, c, cmp) fmentre; escriure (cmp) falgorisme { R ?? }
23
acció sl_bln (ent sep és caracter; ent/sort car és caràcter) és mentre car = sep fer llegir(car) fmentre facció
acció sl_crt (ent sep, fi és caracter; ent/sort car és caràcter; ent/sort cmp és enter) és si car ≠ fi llavors cmp ← cmp + 1 fsi; mentre (car ≠ sep) i (car ≠ fi) fer llegir(car) fmentre; facció b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_qualsevol és var a, b són enter; c,d són booleà fvar . . . a ← 7; b ← 12; c ← fals; d ← cert; caixa_negra2(a,b,c,d); a ← b + 3; d ← no d o c falgorisme { a= ??, b= ??, c= ??, d= ?? }
acció caixa_negra2 (sort p1 és enter; ent p2 és enter; ent/sort p3, p4 són booleà) és
p1 ← 10; p3 ← no p3; p1 ← p2 ‐ p1; p4 ← p3 o p4; p2 ← p2 * 2; p3 ← p4 i p3 facció
2.2.19 Resoleu els següents apartats:
a) Avalueu la següent expressió: (60 div (2 + 3) mod 5 < (codi(‘9’) ‐ codi(‘7’))) i no (27.0 / 9.0 ≥ 3.0) o (‘a’ = car(codi(‘A’))) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri98 és const vi val 0; marca val '.'; vc val 'e' fconst var c1,c2 són caràcter; cmp és enter fvar
24
escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); cmp ← vi; c1 ← ' ‘ ; llegir (c2); mentre c2 ≠ marca fer si tr?(c1,vc) i (c2 = ‘ ‘) llavors cmp ← cmp + 1 fsi; c1 ← c2; llegir(c2) fmentre; si tr?(c1,vc) llavors cmp ← cmp + 1 fsi escriure (cmp) falgorisme { R ?? } funció tr? (ent car, carb és caràcter) retorna booleà és retorna (car = carb) ffunció d) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 13; b ← 5; c ← 7; caixa_negra1(a,b,c) falgorisme { a= ??, b= ??, c= ?? } acció caixa_negra1 (ent p1 és enter; ent/sort p2 és enter; sort p3 és enter) és p3 ← 5; p1 ← p2 + p3; p2 ← caixa_negra2(p1, p3); p3 ← p1 + p2; facció funció caixa_negra2 (ent p11, p22 són enter) retorna enter és var aux és enter fvar aux ← p11 * 2; retorna (aux + p22) ffunció
2.2.20 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri98bis és
25
const marca val 0 fconst var cr és booleà; n1,n2 són enter fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un valor igual a 0:'); in(cr,n1,n2); mentre cr i (n2 ≠ marca) fer act(n1,n2,cr); sgn(n1,n2) fmentre; escriure (cr) falgorisme { R ?? } acció in(sort cr és booleà; sort n1,n2 són enter) és cr ← cert; llegir (n1); si n1≠0 llavors llegir(n2) sinó n2 ← n1 fsi; facció acció act (ent n1,n2 són enter; sort cr és booleà) és cr ← n1 ≤ n2 facció acció sgn (sort n1 és enter; ent/sort n2 és enter) és n1 ← n2; llegir(n2) facció b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_qualsevol és var a, b són enter; c,d són booleà fvar . . . a ← 5; b ← 3; c ← cert; d ← fals; caixa_negra(b,a,c,d); a ← b + a; d ← no c o d falgorisme { a= ??, b= ??, c= ??, d= ?? }
acció caixa_negra (sort p1 és enter; ent p2 és enter; ent/sort p3, p4 són booleà) és p1 ← 7; p3 ← no p4; p1 ← p2 ‐ p1;
26
p4 ← p3 o p4; p2 ← p2 + 5; p3 ← p4 i p3 facció
2.2.21 Resoleu els següents apartats:
a) Avalueu la següent expressió:
no (24 * (7 mod 3) div 6 > codi(‘b’) – codi(‘a’) + 2) o (‘9’ = car(codi(‘/’)) i (3.0 * 4.0 / 6.0 > 1.8) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri99 és const marca val '.' fconst var c, pll són caràcter; ok és booleà fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); ok ← cert; llegir (c); sb(c); pll ← c; mentre (c ≠ marca) i ok fer sc(marca,c); sb(c); ok ← (c=pll) o (c=marca) fmentre; escriure (ok) falgorisme { R ?? }
acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre facció acció sc (ent mfs és caràcter; ent/sort car és caràcter) és mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer llegir(car) fmentre facció c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 1; b ← 3;
27
caixa_negra1(a+b,b,c) falgorisme { a= ??, b= ??, c= ?? } acció caixa_negra1 (ent p1 és enter; ent/sort p2 és enter; sort p3 és enter) és p3 ← 5; p2 ← caixa_negra2(p3, p1); p3 ← caixa_negra2(p2, p3) + p1; p1 ← p3 – p2; facció funció caixa_negra2 (ent p11, p22 són enter) retorna enter és var aux és enter fvar aux ← p11 * 2; retorna (aux ‐ p22) ffunció
2.2.22 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri99bis és const marca val 0 fconst var cm és booleà; n1,n2 són enter fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un valor igual a 0:'); in(cm,n1,n2); mentre cm i (n2 ≠ marca) fer act(n1,n2,cm); sgn(n1,n2) fmentre; escriure (cm) falgorisme { R ?? } acció in(sort cm és booleà; sort n1,n2 són enter) és cm ← cert; llegir (n1); si n1≠0 llavors llegir(n2) sinó n2 ← n1 fsi; facció acció act (ent n1,n2 són enter; sort cm és booleà) és cm ← (n2 = 2*n1) facció
28
acció sgn (sort n1 és enter; ent/sort n2 és enter) és n1 ← n2; llegir(n2) facció b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_qualsevol és var a, b són enter; c,d són booleà fvar . . . a ← 4; b ← 2; c ← fals; d ← cert; caixa_negra(b,a,c,d); a ← b ‐ a; d ← no c o d falgorisme { a= ??, b= ??, c= ??, d= ?? } acció caixa_negra (sort p1 és enter; ent p2 és enter; ent/sort p3, p4 són booleà) és p1 ← 3; p4 ← no p3; p1 ← p2 ‐ p1 + 5; p3 ← p3 o p4; p2 ← (p2 + 4) mod 3; p4 ← p4 i p3 facció
2.2.23 Resoleu els següents apartats:
a) Avalueu la següent expressió:
no (48 * (30 mod 3) div 6 > codi(‘d’) – codi(‘a’) + 2) o (‘7’ = car(codi(‘&’))) i (6.0 * 4.0 / 2.0 > 12.0) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2000 és const marca val 0 fconst var n, pr són enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir(n); pr ← n; ok ← cert; mentre (n ≠ marca) i ok fer
29
llegir(n); ok ← ig(pr,n,marca) fmentre; escriure (ok) falgorisme { R ?? }
funció ig (ent n1,n2, mfs són enter) retorna booleà és retorna ((n1=n2) o (n2=mfs)) ffunció
c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . b ← 2; c ← 7; a ← caixa_negra1(b+c, c‐b, 2*b*c); caixa_negra2_(a, b, c) falgorisme { a= ??, b= ??, c= ?? } acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p22 ← p11 * 3 + p22; p33 ← p11; p33 ← 5 * p33; p11 ← p33 – p22 facció funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 és enter fvar aux1 ← p1 * p2 – p3; caixa_negra2(p2‐p1, aux1, aux2); retorna (aux2 + aux1 ‐ p2) ffunció
2.2.24 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2000bis és const marca val '.' fconst var c, ull, ull2 són caràcter; ok és booleà fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:');
30
ok ← cert; llegir (c); sb(c); sc(marca,c,ull); mentre (c ≠ marca) i ok fer sb(c); si c ≠ marca llavors sc(marca,c,ull2); ok ← (ull2=ull) fsi fmentre; escriure (ok) falgorisme
{ R ?? } acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre facció acció sc (ent mfs és caràcter; ent/sort car és caràcter; sort ll és caràcter) és mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer ll ← car; llegir(car) fmentre facció
b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_qualsevol és var a, b són enter; c,d són booleà fvar . . . a ← 3; b ← ‐1; c ← cert; d ← cert; caixa_negra(b‐2,a,c,d); a ← b * a ‐ 2; d ← no c i d falgorisme { a= ??, b= ??, c= ??, d= ?? } acció caixa_negra (ent p1 és enter; sort p2 és enter; ent/sort p3, p4 són booleà) és p2 ← 1; p4 ← no p3; p1 ← p2 ‐ p1 ‐ 2; p3 ← p3 i p4; p2 ← (p1 + 4) mod 2; p4 ← p4 o p3 facció
2.2.25 Resoleu els següents apartats:
a) Avalueu la següent expressió:
31
(‘:’ = car(codi(‘;’))) i no (48 * (31 mod 3) div 6 > codi(‘5’) – codi(‘1’) + 4) o ((8.0 + 4.0) / 2.0 < 6.0)
b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2001 és const marca val 0 fconst var n és enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir(n); ok ← cert; mentre (n ≠ marca) i ok fer ok ← pr(n); llegir(n) fmentre; escriure (ok) falgorisme { R ?? } funció pr (ent n1 és enter) retorna booleà és retorna (n1 mod 2 = 0) ffunció c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . b ← 3; c ← 4; a ← caixa_negra1(4, c+b, b*c*2); caixa_negra2(a, b, c) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← 2* p1 * p2 – p3; aux2 ← p1 + p3; retorna (aux2 + aux1 – p2) ffunció acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p22 ← p11 * 2 – p22; p33 ← p22;
32
p33 ← 4 * p33 – 2 * p11; p11 ← p22 – 2 * p33 + p11 facció
2.2.26 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2001bis és const marca val 0 fconst var n és enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir(n); ok ← cert; mentre (n ≠ marca) i ok fer ok ← pr(n); llegir(n) fmentre; escriure (ok) falgorisme { R ?? }
funció pr (ent n1 és enter) retorna booleà és var mt, compt és enter fvar mt ← n1 div 2; compt ← 2; mentre (n1 mod compt ≠ 0) i (compt ≤ mt) fer compt ← compt +1 fmentre; retorna (n1 mod compt ≠ 0) ffunció
b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_misteri2001bis és var a, b són enter; c,d són booleà fvar . . . a ← 2; b ← ‐3; c ← cert; d ← fals; caixa_negra(b+8,a,d,c); a ← b * a div 2; d ← no c i d falgorisme { a= ??, b= ??, c= ??, d= ?? }
33
acció caixa_negra (ent p1 és enter; sort p2 és enter; ent/sort p3, p4 són booleà) és p2 ← 10; p4 ← no p3; p1 ← p2 * p1 + 2; p3 ← p3 o p4; p2 ← (p1 + p2) mod 2; p4 ← p4 i p3
facció 2.2.27 Resoleu els següents apartats:
a) Avalueu la següent expressió:
no (‘$’ = car(codi(‘€’))) i ((2.0 + 3.0) / 2.5 < 2.0) o (10 * 14 div 7 mod 6 > codi(‘5’) – codi(‘2’) – 1) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2002 és const marca val ‘.’; maxc val 20 fconst tipus p és vector [1..maxc] de caràcter ftipus var m és p; c és caràcter; ln és enter fvar escriure‐saltar ('Doneu un text (espais i lletres) finalitzat amb un punt:'); llegir(c); ln ← 0; sb(c); mentre c ≠ marca fer mt(marca,c,m,ln); sb(c) fmentre; si ln ≠ 0 llavors esc (p,ln) fsi falgorisme { R ?? }
acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre facció acció mt (ent mfs és caràcter; ent/sort car és caràcter; sort m és p; sort ln és enter) és ln ← 0;
mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer m[ln+1] ← car; llegir(car); ln ← ln+1 fmentre
facció
34
acció esc (ent m és p; ent ln és enter) és per i ← 1 ascendent fins a ln fer escriure(m[i]) fper facció
c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 5; b ← 3; c ← 2; a ← caixa_negra1(2, a‐b, b*c); caixa_negra2(a, b, c) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← p1 * p2 – 2 * p3; aux2 ← p1 – p2; retorna (aux2 * aux1 – p3) ffunció acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p33 ← p11 * 2 – p22; p11 ← p33 – 2 * p22 – p11 p22 ← p33 + 1; p22 ← 2 * p33 – p11; facció
2.2.28 Resoleu els següents apartats:
a) Avalueu la següent expressió:
(codi(‘4’) – codi(‘1’) – 1 < 12 * 5 div 6 mod 6) o ((5.0 ‐ 1.0) / 2 ≤ 2.0) i no (‘#’ = car(codi(‘@’))) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2003 és const marca val ‘.’ fconst var c,ul és caràcter fvar ul ← ‘ ‘; escriure‐saltar ('Doneu un text (espais i lletres) finalitzat amb un punt:'); llegir(c); mentre c ≠ marca fer
35
sb(c); tp(marca,c,,ul); fmentre; si ul ≠ ‘ ‘ llavors escriure (ul) sinó escriure (‘el text no té paraules’) fsi falgorisme { R ?? }
acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre facció acció tp (ent mfs és caràcter; ent/sort car és caràcter; ent/sort u és caràcter) és mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer u ← car; llegir(car) fmentre facció c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 2; b ← 5; c ← 4; caixa_negra2(b, c, a); b ← caixa_negra1(3, a+c, b*a) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← p3 * p1 – 3 * p2; aux2 ← 2* (p2 – p3); retorna (aux2 + aux1 * p2) ffunció acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p33 ← p22 + 1; p22 ← p11 – 2 * p33 – p22; p11 ← p33 * 2 – p22; p22 ← 3 * p11 – p22 facció
36
2.2.29 Resoleu els següents apartats:
a) Avalueu la següent expressió:
no (car(codi(‘/’)) = ‘\’) i (codi(‘9’) – codi(‘5’) – 1 < (3 + 4) * (8 + 2) div 7 mod 7) o (6.0 / 2.0 ≤ 2.0) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2004 és const marca val ‘.’ fconst var c, pr és caràcter fvar pr ← ‘ ‘; escriure‐saltar ('Doneu un text (espais i lletres) finalitzat amb un punt:'); llegir(c); mentre c ≠ marca fer sb(c); tp(marca,c,pr); fmentre; si pr ≠ ‘ ‘ llavors escriure (pr) sinó escriure (‘el text és buit’) fsi falgorisme { R ?? }
acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre facció acció tp (ent mfs és caràcter; ent/sort car és caràcter; ent/sort p és caràcter) és si (car ≠ ‘ ‘) i (car ≠ mfs) llavors p ← car fsi; mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer llegir(car) fmentre facció c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← 1; b ← ‐1; c ← 2;
37
b ← caixa_negra1(2, a+c, b*a); caixa_negra2(b, c, a) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← p3 * p1 – 3 * p2; aux2 ← 2* (p2 – p3); retorna (aux2 + aux1 * p2) ffunció acció caixa_negra2 (ent p1 és enter; ent/sort p2 és enter; sort p3 és enter) és p3 ← p2 + 1; p2 ← p1 – 2 * p3 – p2; p1 ← p3 * 2 – p2; p2 ← 3 * p1 – p2 facció
2.2.30 Resoleu els següents apartats:
a) Avalueu la següent expressió:
(codi(‘C’) – codi(‘A’) < (3 + 2) * (9 + 1) div 5 mod 5) o no (car(codi(‘€’)) = ‘€’) i (18.0 / 9.0 ≤ 2.0) b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2005 és const marca val ‘.’ fconst var c és caràcter; nm és enter fvar nm ← 0; escriure‐saltar ('Doneu un text (espais i lletres) finalitzat amb un punt:'); llegir(c); mentre c ≠ marca fer sb(c); si c ≠ marca llavors nm ← nm + 1 fsi; sp(marca,c) fmentre; escriure (nm) falgorisme { R ?? }
acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car)
38
fmentre facció acció sp (ent mfs és caràcter; ent/sort car és caràcter) és mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer llegir(car) fmentre facció
2.2.31 Resoleu els següents apartats:
a) Avalueu la següent expressió:
no (no ('c' > car (codi('c') + 1)) i (3 = 7 div 2)) o ( 7 < 14 div 2 = fals) i (3.0 * 4.0 / 2.0 ≥ 6.0) b) Calculeu la precondició i la postcondició d'aquest algorisme:
{ Q ?? } algorisme misteri2006 és const marca val 0 fconst var n, pr són enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir(n); pr ← n; ok ← cert; mentre (n ≠ marca) i ok fer llegir(n); ok ← ig(pr,n,marca) fmentre; escriure (ok) falgorisme { R ?? }
funció ig (ent n1,n2, mfs són enter) retorna booleà és retorna ((n1=n2) o (n2=mfs)) ffunció
c) Quin valor final tenen les variables enteres a, b i c ?
{ Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . a ← ‐3; b ← 4; c ← ‐2; caixa_negra2(b, c, a);
39
a ← caixa_negra1(2*a‐c, a+c, b*a) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← p3 * p1 – p2 mod 2; aux2 ← (p2 – p3) div 2; retorna (aux2 + aux1 * p2) ffunció acció caixa_negra2 (sort p1 és enter; ent/sort p2 és enter; ent p3 és enter) és p3 ← p2 ‐ 4; p2 ← p1 – p3 mod 3 – p2; p1 ← p3 * 3 – p2; p2 ← 4 * p1 – p2 facció
2.2.32 Resoleu els següents apartats:
a) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2006bis és const marca val '.' fconst var c són caràcter; spr, ssn són enter; pr és booleà fvar escriure‐saltar ('Doneu un text (seqüència de caràcters: espais en blanc o lletres), finalitzat amb un punt:'); pr ← cert; spr ← 0; ssn ← 0; llegir (c); sb(c); mentre c ≠ marca fer tc(marca,c, cmp); pr ← no pr; si pr llavors spr ← spr + cmp sinó ssn ← ssn + cmp fsi; sb(c); fmentre; escriure (spr, ssn) falgorisme
{ R ?? } acció sb (ent/sort car és caràcter) és mentre car = ‘ ‘ fer llegir(car) fmentre
40
facció acció sc (ent mfs és caràcter; ent/sort car és caràcter; sort nl és enter) és nl ← 0; mentre (car ≠ ‘ ‘) i (car ≠ mfs) fer nl ← nl+1; llegir(car) fmentre facció
b) Quin valor final tenen les variables a, b, c i d ? { Q } algorisme algorisme_qualsevol_2006 és var a, b són enter; c,d són booleà fvar . . . a ← 3; b ← 4; c ← fals; d ← cert; caixa_negra(b‐2,a,c,d); a ← b * a ‐ 6; c ← no c i d falgorisme { a= ??, b= ??, c= ??, d= ?? }
acció caixa_negra (ent p1 és enter; sort p2 és enter; ent/sort p3, p4 són booleà) és p2 ← 5; p4 ← no p3; p1 ← p2 ‐ p1 + 4; p4 ← p3 i p4; p2 ← (p1 + 1) mod 2; p4 ← p4 o p3 facció
2.2.33 Resoleu els següents apartats:
a) Avalueu la següent expressió:
(‘:’ = car(codi(‘;’))) i no (48 * (31 mod 3) div 6 > codi(‘E’) – codi(‘A’) + 4) o ((8.0 + 4.0) / 2.0 ≤ 6.0)
b) Calculeu la precondició i la postcondició d'aquest algorisme: { Q ?? } algorisme misteri2007 és const marca val 0 fconst var n és enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:');
41
llegir(n); ok ← cert; mentre (n ≠ marca) i ok fer ok ← sn(n); llegir(n) fmentre; escriure (ok) falgorisme { R ?? }
funció sn (ent n1 és enter) retorna booleà és retorna (n1 mod 2 = 1) ffunció
c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . b ← 3; c ← 4; a ← caixa_negra1(4, c+b, b*c*2); caixa_negra2(a, b, c) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← 2* p1 * p2 – p3; aux2 ← p1 + p3; retorna aux2 ‐ aux1 – p2 ffunció acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p22 ← p11 * 2 – p22; p33 ← p22; p33 ← 4 * p33 – 2 * p11; p11 ← p22 – 2 * p33 + p11 facció
2.2.34 Resoleu els següents apartats:
a) Avalueu la següent expressió:
(‘!’ = car(codi(‘=’))) o no (18 * (31 mod 3) div 6 > codi(‘6’) – codi(‘0’) ‐ 3) o ((9.0 + 5.0) / 2.0 ≤ 3.0)
b) Calculeu la precondició i la postcondició d'aquest algorisme:
42
{ Q ?? } algorisme misteri2008 és const marca val 0 fconst var n és enter; ok és booleà fvar escriure‐saltar ('Doneu una seqüència de nombres enters finalitzada amb un zero:'); llegir(n); ok ← cert; mentre (n ≠ marca) i ok fer ok ← pr(n); llegir(n) fmentre; escriure (ok) falgorisme { R ?? }
funció pr (ent n1 és enter) retorna booleà és retorna n1 mod 2 = 0 ffunció
c) Quin valor final tenen les variables enteres a, b i c ? { Q } algorisme algorisme_qualsevol és var a, b, c són enter fvar . . . b ← 1; c ← 1; a ← caixa_negra1(10, c+b, b*c*2); caixa_negra2(a, b, c) falgorisme { a= ??, b= ??, c= ?? } funció caixa_negra1 (ent p1, p2, p3 són enter) retorna enter és var aux1, aux2 són enter fvar aux1 ← 2* p1 * p2 – p3; aux2 ← p1 + p3; retorna aux2 ‐ aux1 – p2 ffunció acció caixa_negra2 (ent p11 és enter; ent/sort p22 és enter; sort p33 és enter) és p22 ← p11 * 2 – p22; p33 ← p22; p33 ← 4 * p33 – 2 * p11; p11 ← p22 – p33 div 2 + p11 facció
——————————————
43
2.3.1 Dissenyeu un algorisme que intercanviï els valors de 2 variables enteres.
2.3.2 Repetiu l'exercici anterior, però sense utilitzar una variable auxiliar.
2.3.3 Dissenyeu un algorisme que donades tres variables enteres x, y i z amb valors inicials a, b i c respectivament, permuti els seus valors de forma circular.
2.3.4 Dissenyeu un algorisme que calculi el reste i el quocient de la divisió de l'enter A per l'enter B.
2.3.5 Dissenyeu un algorisme que calculi l'equivalent en hores, minuts i segons d'un valor que expressa una quantitat de temps en segons.
2.3.6 Dissenyeu un algorisme que calculi el valor més gran d'entre els de 2 variables enteres.
2.3.7 Dissenyeu un algorisme que calculi el valor més petit d'entre els de 3 variables enteres.
2.3.8* Dissenyeu un algorisme que calculi el nombre de valors iguals d'entre quatre variables enteres A, B, C i D.
2.3.9 Dissenyeu un algorisme que calculi el factorial d'un nombre enter n, n ≥ 0.
2.3.10 Dissenyeu un algorisme que calculi les potències positives d'un enter donat ab (ab, b ≥ 0).
2.3.11 Les taxes actuals d'una companyia ferroviària pel 1992 consideren que els nens menors de 4 anys viatgen sense bitllet i que els nens de 4 a 11 (inclusiu) han de pagar mig bitllet. Aquesta reducció del 50% és acumulativa a les possibles reduccions "targeta_familiar" i "família_nombrosa" que tot seguit es detallen:
"Targeta_familiar": tota família que té com a mínim un fill pot gaudir‐ne. Aquesta targeta dóna dret, en viatges de varis membres de la família a aquestes reduccions:
* la primera persona paga el seu bitllet amb taxa normal (si hi ha adults la primera persona és obligatòriament un adult). * les altres persones tenen una reducció del 50% sobre el preu que haurien de pagar normalment.
"Família_nombrosa": cada membre d'una família de tres o més fills pot beneficiar‐se d'una reducció del 30% sobre el preu que hauria de pagar normalment (encara que viatgi sol).
Per un mateix viatge, una família de tres o més fills no pot acumular les avantatges de la "Targeta_familiar" i de la "Família_nombrosa" i per tant ha d'escollir la taxa que li resulti més avantatjosa. Per exemple, si un membre de la família viatja sol, adoptarà la taxa de
44
"Família_nombrosa"; però una família amb tres nens de 5, 7 i 9 anys preferirà la "Targeta_familiar".
Dissenyeu un algorisme que dialogui (faci preguntes sobre el nombre de viatgers de cada tipus) amb famílies de tres o més fills i els indiqui la taxa més profitosa (els viatgers poden ser des d'un fins a tots els membres de la família). Feu‐ho per un preu base de 100 pessetes el viatge.
2.3.12 Dissenyeu un algorisme que permeti resoldre equacions de segon grau.
2.3.13 Dissenyeu un algorisme que calculi el producte de dos enters sense usar l'operació producte.
2.3.14 Dissenyeu un algorisme que calculi x div y, i x mod y sense usar ni l'operació div ni la mod.
2.3.15 Dissenyeu un algorisme que calculi tots els divisors d'un nombre enter.
2.3.16 Dissenyeu un algorisme que determini si un nombre enter positiu és primer o no.
2.3.17 Els nombres de Fibonacci. Dissenyeu un algorisme que calculi el n‐èssim terme de la successió de Fibonacci definida tal i com segueix: f0 = 1 f1 = 1 fn = fn‐1 + fn‐2, n ≥ 2 L’usuari especificarà el valor n, que indica el terme de la successió a calcular. Per exemple, si n = 7 el resultat ha de ser 21. 2.3.18 Dissenyeu un algorisme que determini la part entera de l'arrel quadrada d'un nombre natural donat.
2.3.19 Repetiu l'exercici anterior sabent que la suma dels n primers nombres senars és n2. 2.3.20 L’invers. Dissenyeu un algorisme, que donat un nombre enter positiu n, calculi el seu invers, inv(n). L'invers d'un nombre és un altre nombre que té les mateixes xifres, però en ordre invers. Per exemple, si n = 2653 llavors inv(n) = 3562 2.3.21 La popular cerveseria Heidelberg es coneguda arreu del món per la qualitat de la seva cervesa i per la gran quantitat de varietats que n'ofereix. A més a més és única pel fet que guarden les copes de cervesa en unes piles triangulars que els hi facilita el servei de la cervesa, i dóna un toc d'originalitat al local:
45
Y Y Y Y Y Y
Però tenen un problema a l'hora de colocar‐les, doncs no qualsevol nombre de copes poden apilar‐se triangularment. Per exemple, 9 copes no es poden apilar. Ajudeu‐los tot dissenyant un algorisme, que donat un nombre enter positiu de copes calculi si poden apilar‐se o no. 2.3.22 Dissenyeu un algorisme que calculi el màxim comú divisor de dos nombres enters positius, tot i utilitzant l’algorisme d’Euclides, que es basa en l’aplicació de les següents propietats: P1) si a ≥ b, mcd (a , b) = mcd (b , r) on a = b * q + r, amb 0 ≤ r < b P2) mcd (a , 0) = a P3) mcd (a , b) = mcd (b , a) Per exemple, si els nombres fossin 44 i 60, llavors el mcd (44 , 60) = 4 2.3.23 El gran parell. Dissenyeu un algorisme que donat un nombre enter positiu que introduirà l’usuari, ens digui si el nombre és un gran parell. Un nombre és un gran parell si té totes les seves xifres parells. Intenteu cercar una solució que superi el possible problema d’overflow. Per exemple, si el nombre fos 7481 ens diria que no, i en canvi, si fos 24628 ens diria que sí. 2.3.24 El doble parell. Dissenyeu un algorisme que donat un nombre enter positiu que introduirà l’usuari, ens digui si el nombre és un doble parell. Un nombre és un doble parell si és parell i a més té un nombre parell de xifres. Intenteu cercar una solució que superi el possible problema d’overflow. Per exemple, si el nombre fos 8213 ens diria que no, si fos 74432 ens diria que no, i en canvi, si fos 746282 ens diria que sí. 2.3.25 Els múltiples. Dissenyeu un algorisme que calculi tots els nombres enters més grans que 1 i més petits que 10000, que siguin cap‐i‐cua i múltiples de 13. 2.3.26 HB. La més popular cerveseria de München, anomenada HoffBrau (HB), vol fer la competència a la seva gran rival anomenada Heidelberg. Ambdues cerveseries són conegudes arreu del món per la gran qualitat i varietat de les cerveses que ofereixen. Però a la cerveseria Heidelberg tenen l’especialitat de guardar les copes de cervesa en unes piles triangulars que els hi facilita el servei de la cervesa, i li dóna un toc d’originalitat al local i un punt més d’atracció per a la clientela. Per això, a HB volen fer‐li la competència, i han decidit que ells també apilaran les copes de cervesa, però en lloc de triangles, ells formaran quadrats:
46
Y Y Y Y Y Y Y Y Y
Però se’ls hi presenta un problema semblant al de la cerveseria Heidelberg. No qualsevol nombre de copes poden apilar‐se de forma quadrangular. Per exemple 9 copes sí que es poden apilar, però en canvi 8 no. Ajudeu‐los dissenyant un algorisme que donat un nombre enter positiu de copes que donarà l’usuari, calculi quantes i quines agrupacions quadrangulars diferents es poden formar amb el nombre de copes especificat. Per exemple, amb 11 copes es poden formar 3 agrupacions diferents: de 1 copa, de 4 copes o de 9 copes. Només es poden utilitzar els operadors aritmètics bàsics: suma, resta, multiplicació, quocient i residu de la divisió. 2.3.27 HB (2). La més popular cerveseria de München, anomenada HoffBrau (HB) és coneguda arreu del món per la gran qualitat i varietat de les cerveses que ofereix. A la cerveseria HB tenen l’especialitat de guardar les copes de cervesa en unes piles quadrangulars (amb el nombre de copes > 1), que els hi facilita el servei de la cervesa, i li dóna un toc d’originalitat al local i un punt més d’atracció per a la clientela. Per exemple:
Y Y Y Y Y Y Y Y Y Y Y Y Y
Però se’ls hi presenta un problema. No qualsevol nombre de copes poden apilar‐se de forma quadrangular. Per exemple 9 copes sí que es poden apilar, però en canvi 8 no. Ajudeu‐los dissenyant un algorisme que donat un nombre enter positiu de copes que donarà l’usuari, calculi quantes i quines agrupacions quadrangulars es poden formar amb el nombre exacte de copes especificat que minimitzin el nombre d'agrupacions a efectuar i maximitzi el nombre de copes utilitzades, tot calculant el nombre de copes sobrants. Per exemple, amb 11 copes es pot formar 1 agrupació de 9 copes, i en sobren 2. Amb 24 copes, es pot formar 1 agrupació de 16 copes i 2 agrupacions de 4 copes, i no en sobre cap. Si us cal podeu utitilitzar la funció ent, que donat un nombre real, calcula la part entera del nombre. 2.3.28 Els múltiples variables. Dissenyeu un algorisme que donat un nombre enter n (n > 0) que proporcionarà l’usuari, calculi tots els nombres enters més grans que 1 i més petits que 100000, que siguin cap‐i‐cua i múltiples de n.
47
3. ALGORISMES SEQÜENCIALS i ANÀLISI DESCENDENT Per als exercicis que tracten dues o més seqüències podeu suposar que cadascuna està emmagatzemada en un dispositiu perifèric d'entrada diferent. Així doncs, es pot llegir de qualsevol dispositiu, utilitzant les instruccions de lectura d'aquesta forma: llegir (Seq1,<variable1>), llegir (Seq2,<variable2>), etc.
3.1.1 Donada una seqüència de nombres enters acabada en zero, dissenyeu un algorisme que calculi la seva suma.
3.1.2 Donada una seqüència de valors d'una variable aleatòria X, dissenyeu un algorisme que compti el nombre d'elements mancants o invàlids (missing values) que venen identificats pel codi 99999, i el nombre d'elements vàlids o útils.
3.1.3 Donada una seqüència de caràcters acabada en un punt ('.'), dissenyeu un algorisme que compti el nombre de caràcters 'A' que hi apareixen. 3.1.4 Donada una seqüència de caràcters acabada en un punt, dissenyeu un algorisme que trobi la primera vocal que apareix en el text.
3.1.5 Donada una seqüència de nombres reals positius acabada per un zero, dissenyeu un algorisme que calculi la mitjana, la variància i la desviació tipus dels mateixos.
3.1.6 Donada una seqüència de caràcters acabada en un punt, dissenyeu un algorisme que compti el nombre de parelles ('L', 'A') que hi ha en el text.
3.1.7 Donada una seqüència de caràcters acabada en un punt, dissenyeu un algorisme que calculi el nombre de mots que hi apareixen.
3.1.8 Donada una seqüència de nombres enters acabada en 0, dissenyeu un algorisme que calculi la seqüència de les sumes parcials.
3.1.9 Dissenyeu un algorisme que faci la còpia d'un text acabat en un punt, eliminant tots els espais en blanc que contingui.
3.1.10 Donada una seqüència de nombres enters acabada en 0, dissenyeu un algorisme que determini si només està formada per nombres positius.
3.1.11 Donada una seqüència de valors d'una variable aleatòria X de tipus categòric, que indica el sexe en codificació alfanumèrica ('M' o 'F'), dissenyeu un algorisme que la reponderi en una seqüència on la codificació sigui numèrica (1 o 2).
3.1.12 Donada una seqüència d'enters acabada en 0:
a) Escriviu un algorisme que decideixi si un valor donat v pertany o no a la seqüència.
49
b) Resoleu l'apartat anterior suposant que la seqüència és creixent.
3.1.13 Dissenyeu un algorisme que calculi el nombre de caràcters que segueixen a un donat en un text. S'ha de mostrar un missatge especial en cas que aquest caràcter no pertanyi a la seqüència.
3.1.14 Dissenyeu un algorisme que decideixi si una seqüència d'enters acabada en 0 compleix alguna de les següents propietats: a) És creixent. b) És estrictament monòtona. c) És monòtona.
3.1.15 Dissenyeu un algorisme que determini si totes les paraules d'un text (acabat en '.'), comencen per la mateixa lletra.
3.1.16 Dissenyeu un algorisme que calculi el nombre de valors diferents que té una seqüència creixent de nombres enters (acabada en 0).
3.1.17 Dissenyeu un algorisme que calculi el nombre de paraules d'un text que acaben en 'S'.
3.1.18 Dissenyeu un algorisme que elimini tots els espais en blanc inútils d'un text. Un blanc no és necessari quan en precedeix a un altre, o bé si es troba a l'inici o a la fi del text.
3.1.19 Donada una seqüència de caràcters acabada en un punt, dissenyeu un algorisme que compti el nombre de vegades que apareix el mot LES.
3.1.20 Donada una seqüència de caràcters acabada en un punt, dissenyeu un algorisme que compti el nombre de mots que acaben en ‐CIO.
3.1.21 Donades les seqüències de caràcters S1 i S2, dissenyeu un algorisme que determini si són iguales.
3.1.22 Dissenyeu un algorisme que faci el següent tractament a un text: • Elimini les vocals tret d'aquelles que formin part d'un grup de vocals consecutives a l'inici de paraula. • Col∙lapsi els segments formats per una mateixa consonant de longitud més gran que 1, en un de longitud 1.
Suposarem que una consonant és un caràcter que no és una vocal, ni és un '.' ni un ' '. 3.1.23 Dissenyeu un algorisme que determini si dues seqüències numèriques creixents tenen cap element en comú.
50
3.1.24 Siguin F i G dues seqüències estrictament creixents de nombres enters. Dissenyeu un algorisme que calculi el nombre de valors que apareixen a ambdues seqüències.
3.1.25 Siguin F i G dues seqüències estrictament creixents de nombres enters. Dissenyeu un algorisme que determini si existeixen f ∈ F i g ∈ G tal que |f–g|<9.
3.1.26 Siguin F i G dues seqüències creixents de nombres enters. Dissenyeu un algorisme que calculi la distància entre F i G. Definim la distància entre dues seqüències com: mín { |f – g|: f ∈ F, g ∈ G }
3.1.27 Repetiu l'exercici anterior, però ara sense suposar que siguin creixents.
3.1.28 Donades tres seqüències creixents de nombres enters F, G i H que tenen si més no un element comú, dissenyeu un algorisme que calculi el mínim comú.
3.1.29 Donada una seqüència d'enters, dissenyeu un algorisme que calculi el nombre de segments creixents maximals de la mateixa (un segment és una tira d'elements consecutius de la seqüència; un segment és creixent maximal quan no està inclòs en cap segment creixent més llarg).
3.1.30 Donada una seqüència d'enters, dissenyeu un algorisme que calculi la longitud més gran dels segments (veure exercici anterior) formats pel mateix valor. Exemple: Si la seqüència fos 3, 4, 4, 4, 1, 5, 5, 5, 5, 0 llavors la longitud màxima seria 4.
3.1.31 Considerem la successió de potències de 2: 1, 2, 4, 8, ... Dissenyeu els algorismes que permetin resoldre els següents problemes:
a) Donats x i y tal que 0 ≤ x ≤ y, escriure les potències de 2 que estiguin compreses entre aquests dos valors.
b) Per un cert x > 0 donat, calcular la part entera de log2(x), és a dir, l'enter m tal que 2m
≤ x < 2m+1.
3.1.32 En una cinta tenim una seqüència xn xn‐1 ... x1 x0 ‐1 de zeros i uns acabada per un ‐1. Aquesta seqüència és la representació binària del número xn 2n + xn‐1 2n‐1 + ... + x1 2 + x0
Dissenyeu un algorisme que calculi el número representat sense utilitzar vectors.
3.1.33 Dissenyeu un algorisme que determini si un enter positiu és perfecte, és a dir, si coincideix amb la suma dels seus divisors (diferents al valor donat). Per exemple, 6 és un número perfecte perquè 1 + 2 + 3 = 6.
3.1.34 Dissenyeu un algorisme que donada una seqüència de valors enters acabada en 0, determini si tots els elements són cap‐i‐cua. No es poden utilitzar vectors.
51
3.1.35 Dissenyeu un algorisme que donat un text (seqüència de caràcters acabada en un punt), calculi la llargària mitjana de les paraules del text. El text només conté espais en blanc i lletres de l'alfabet. 3.1.36 Dissenyeu un algorisme que donat un text (seqüència de caràcters acabada en un punt), calculi quantes paraules hi ha que tinguin la mateixa longitud de la primera paraula. El text només conté espais en blanc i lletres de l'alfabet. Es pot suposar que com a mínim hi ha una paraula. 3.1.37 Anàlisi estadística descriptiva simple. Dissenyeu un algorisme que donada una seqüència de nombres reals finalitzada amb un 9999.0, i que representa una mostra d'una variable aleatòria, faci unà anàlisi estadística descriptiva simple de la seqüència. S'haurà de calcular el valor mínim, el valor màxim, el nombre de valors de la seqüència i la mitjana mostral de la seqüència.
——————————————
3.2.1 El poema (1). Donada una seqüència de caràcters acabada en un punt tal que els seus caràcters representen un poema, dissenyeu un algorisme que calculi si tots els versos tenen el mateix nombre de síl∙labes. Considerarem que una síl∙laba és un grup de vocals consecutives o bé una vocal i que l'accentuació no influeix. Així mateix tampoc hi ha sinalefes. Els versos estan separats pel caràcter '/'.
3.2.2 Donada una seqüència d'enters acabada per 0, dissenyeu un algorisme que calculi la suma dels nombres primers i la dels no primers.
3.2.3 Dissenyeu un algorisme que implementi el joc de l'oca (per a 6 jugadors) amb un nivell d'abstracció adequat.
3.2.4 Dissenyeu un algorisme que calculi el factorial dels nombres primers d'una seqüència d'enters acabada en 0.
3.2.5 Dissenyeu una funció que donat un número natural, proporcionat per l'usuari, calculi la seva arrel digital. Per a obtenir aquesta arrel digital es procedeix de la següent manera: es calcula un nou nombre natural resultant de sumar els dígits que el componen i el procés es repeteix fins que el resultat obtingut té un sol dígit. Per exemple, Arrel_Digital (761365) = 1 3.2.6 Dissenyeu una funció que calculi la suma dels n primers termes de la successió: (ai) = i, i ≥ 0.
3.2.7 Dissenyeu una funció que calculi la suma dels n primers termes de la successió: (ai) = i2, i ≥ 0.
52
3.2.8 Dissenyeu una funció que calculi el producte dels n primers termes de la successió: (ai) = i, i ≥ 1.
3.2.9 Dissenyeu una funció que calculi la suma dels n primers termes de la successió: (ai) = 1/(i!), i ≥ 0.
3.2.10 Dissenyeu una funció que calculi la suma dels n primers termes de la successió: (ai) = 1/i, i ≥ 0.
3.2.11 Dissenyeu funcions per als dos exercicis anteriors que sumin la successió en un ordre diferent ( d'esquerra a dreta o de dreta a esquerra). Per què s'obtenen resultats diferents per a grans valors de n. Quin dels procediments és el més adequat?
3.2.12 Els codis secrets. Durant la Segona guerra mundial es va tornar a posar de moda el tema de la criptografia (codis, codificacions, xifrats, descodificacions, ...). Els agents de cadascun dels bàndols usaven missatges xifrats en un codi secret ‐en principi‐ per a comunicar‐se sense que l'altre bàndol el podés descodificar. Però heus ací que amb els esforços de Jean Moulin, etc. els aliats van descobrir el codi dels alemanys i aquestos el dels aliats. Dissenyeu un algorisme que permeti xifrar una seqüència de codis i missatges que rep com a entrada i generi la seqüència de missatges (un a cada línia) ja codificats, com a sortida. La seqüència de codis i missatges començarà i acabarà amb el caràcter '*'. Cada parell de codi i missatge associat estan separats del següent parell pel caràcter '/'. Cada codi i el seu missatge associat estan separats pel caràcter '#'. Un missatge pot estar format per lletres, espais en blanc i els signes de puntuació següents ('.', ',', ';', '?'). També pot ser buit, i per tant, generarà una línia en blanc a la sortida. La codificació es farà canviant cadascuna de les lletres del missatge per la lletra que s'obté desplaçant tantes posicions (segons indiqui el codi associat corresponent) a la dreta o a l'esquerra de la lletra original dins l'alfabet (ABCDEFGHIJKLMNOPQRSTUVWXYZ) de forma cíclica. Els espais en blanc i els signes de puntuació es deixaran tal cual. Els codis poden ser: R —> Indica 1 desplaçament cap a la dreta (Right) RR —> Indica 2 desplaçaments cap a la dreta RRR —> Indica 3 desplaçaments cap a la dreta L —> Indica 1 desplaçament cap a l'esquerra(Left) LL —> Indica 2 desplaçaments cap a l'esquerra LLL —> Indica 3 desplaçaments cap a l'esquerra També pot haver‐hi un codi buit, el qual voldrà dir que el missatge corresponent s'ha de deixar tal i com està. Per exemple,
53
*R#TROPES I MATERIAL DE GUERRA?/LL#MOVIMENT DE SOLDATS. ANEU A NORMANDIA/RRR#/# ADEU.* Ha de generar, ——————————————————————— USPQFT J NBUFSJBM EF HVFSSB? KMTGKCLR BC QMJBYRQ. YLCS Y LMPKYLBGY ADEU. ——————————————————————— 3.2.13 La calculadora. Es vol que dissenyeu un algorisme que permeti fer càlculs senzills com una calculadora de butxaca. Es tracta de que es pugui avaluar una sèrie d'expressions numèriques (concretament de tipus enter) que l'usuari donarà. Un cop avaluada cadascuna de les expressions, s'ha de donar el resultat de la seva avaluació (tal i com ho feria una calculadora). Cada expressió finalitza amb el caràcter #. Hi haurà una expressió especial –no numèrica– que consisteix en la paraula FI, que indica que s'ha acabat la seqüència d'expressions a avaluar. Les expressions numèriques enteres estan en notació infixa. Tots els operadors tindran la mateixa prioritat, i per tant, s'avaluaran d'esquerra a dreta. Pot ser que l'expressió només consisteixi en un valor enter (sense cap operador). Els quatre operadors binaris que poden aparèixer són: + (suma entera) – (diferència entera) * (producte enter) : (quocient de la divisió entera) Per exemple: 13 # –> 13 15 + 4# –> 19 2 : 3 * 4 – 5 * 3 + 30 # –> 15 4 + 7 : 2 # –> 5 FI # Podeu suposar que els números seran prou petits i no hi haurà overflow. Així mateix, també suposarem que no hi haurà cap error en la sintaxi de les expressions.
54
3.2.14 El Doble o res. Darrerament, els jugadors del Casino de Montecarlo juguen a un nou joc que està causant un gran impacte aquesta temporada: el Doble o res, on els jugadors aposten gran quantitat de diners (en forma de fitxes), i sempre han de doblar l'aposta de la jugada anterior, o bé deixar el joc. Per tal de controlar que la seqüència d'apostes que fan segueix les normes del joc, dissenyeu un algorisme que donat un text (seqüència de caràcters acabada en un punt) que representa les fitxes apostades per un jugador, verifiqui si el text segueix o no les normes del joc. El text està format únicament per espais en blanc i '*'. El text consisteix en una sèrie de seqüències formades per caràcters '*' consecutius (les fitxes apostades en una jugada), que estan separades entre elles per un o més espais en blanc. L'algorisme ha de analitzar el text i decidir si es compleix la normativa del joc, facilitant així la feina dels croupiers del Casino. Per exemple, pels dos textos següents els resultats haurien de ser: *** ****** ************ ************************. Sí * ** *** **** ******** . No 3.2.15 La codificació *. Dissenyeu un algorisme que permeti recodificar un text (seqüència de caràcters finalitzada amb un punt) que estarà format per parelles de números enters positius (entre 0 i 9) i les paraules següents, que vindran afectades per la recodificació que indica el número. El número indicarà la posició de la lletra corresponent de la paraula següent, que ha de ser substituïda per un ‘*’ en el text recodificat. Els números i les paraules estaran separades per un o més blancs. Si el número és més gran que la longitud de la paraula, no es realitzarà cap canvi en la paraula corresponent. Si el número fos 0, tampoc es realitzarà cap canvi. Per exemple, si la seqüència d’entrada fos: 2 el 7 dissabte 1 a 5 les 3 quatre 2 de 1 la 5 tarda 1 és 1 un 2 bon 3 dia 0 i 1 una 4 bona 1 hora 4 per 1 a 3 fer 6 exàmens . La sortida seria: e* dissab*e * les cu*tre d* *a tard* *s *n b*n di* i *na bon* *ora per * fe* exáme*s . 3.2.16 Els parèntesis. Dissenyeu un algorisme tal que, donada una expressió, que es llegeix del dispositiu d’entrada per defecte, ens indiqui si l’expressió està ben parentitzada. Es a dir, si els parèntesis estan ben posats. L’expressió vindrà finalitzada amb un punt. Per exemple, són expressions vàlides:
(a) ((a + 1) * (8 ‐ b)) (f(a) + f(b)) / 2
i en canvi aquestes altres no ho són:
55
((x + y) (4 * 3) (f(x))) ‐ (7 ‐ b * 2) g(y ‐ 2) * 4) )b(
3.2.17 El text creixent. Dissenyeu un algorisme que permeti decidir si un text (seqüència de caràcters finalitzada amb un punt) és un text creixent o no. Un text es diu que és creixent si la longitud de cadascuna de les paraules forma una seqüència de nombres creixent. El text estarà format per lletres, i espais en blanc. Per exemple: la taula estava trencada . → És creixent la bicicleta era blanca . → No és creixent el gos era molt ferotge . → És creixent 3.2.18 El text enllaçat. Dissenyeu un algorisme tal que donat un text (seqüència de lletres i espais) finalitzat amb un punt, ens indiqui si el text està enllaçat o no. Un text està enllaçat si la primera lletra de cada paraula coincideix amb la darrera lletra de la paraula anterior. Per exemple,
Un noi il∙luminava amb la lot. → No Un noi il∙luminava amb bombetes . → Sí El camí estava desert . → No El lloro oferia ametlles . → Sí 3.2.19 Els telegrames. Dissenyeu un algorisme que calculi i imprimeixi la facturació d’una seqüència de telegrames. La seqüència de telegrames és un text que finalitza amb un punt, i els telegrames estan separats amb el caràcter ‘*’. Els telegrames estan formats per paraules i espais en blanc. L’algorisme ha d’escriure per cada telegrama la següent informació: el número del telegrama, el nombre de paraules que té i el preu del telegrama. El preu del telegrama es comptarà a partir del nombre de paraules de que consta. El preu de cada paraula serà de 0.12 euros. Al final de processar tots els telegrames, ha de donar un resum de la facturació que constarà del nombre total de telegrames, el nombre total de paraules i el preu total en euros. Per exemple, si la seqüència fos: HOLA MARIA TINC MOLTA FEINA *JOAN PLEGARÉ TARD * ENS VEÏEM DEMÀ . Donaria lloc a: Telegrama 1 No. de paraules: 5 Preu: 0.6 EUR Telegrama 2 No. de paraules: 3 Preu: 0.36 EUR Telegrama 3 No. de paraules: 3 Preu: 0.36 EUR
56
TOTAL No. de telegrames: 3 No. de paraules: 11 Preu: 1.32 EUR 3.2.20 El text cap‐i‐cua. Dissenyeu un algorisme tal que donat un text sense accents (seqüència de lletres i espais) finalitzat amb un punt, ens indiqui si el text és cap‐i‐cua o no. Un text és cap‐i‐cua si la primera lletra de la primera paraula coincideix amb la darrera lletra de la darrera paraula. Per exemple,
Això es massa. → Sí Avui fa calor . → No La Facultat ampliara la superficie . → No En Ramon no ho te . → Sí 3.2.21 Les síl∙labes. Dissenyeu un algorisme que donada una frase, l’analitzi i compti el nombre de síl∙labes de cada paraula de la frase, i del total de la frase. La frase és un text (format per lletres i espais en blanc) que finalitza amb un punt. Considereu que una síl∙laba és un grup de vocals (una o més) consecutives. L’algorisme ha d’escriure per cada paraula la següent informació: el número correlatiu de la paraula i el nombre de síl∙labes que té. Al final de processar totes les paraules, ha de donar el nombre total de paraules de la frase, el nombre total de síl∙labes de la frase, i el nombre promig de síl∙labes per paraula. Per exemple, si la seqüència fos: Endevina quantes síllabes tindrà aquesta frase tan eixerida. La sortida hauria de ser: Paraula 1 No. de síl∙labes: 4 Paraula 2 No. de síl∙labes: 2 Paraula 3 No. de síl∙labes: 3 Paraula 4 No. de síl∙labes: 2 Paraula 5 No. de síl∙labes: 3 Paraula 6 No. de síl∙labes: 2 Paraula 7 No. de síl∙labes: 1 Paraula 8 No. de síl∙labes: 4
TOTAL No. de paraules: 8 No. de síl∙labes: 21 No. promig de síl∙labes: 2.625 3.2.22 El text ordenat. Dissenyeu un algorisme tal que donat un text sense accents (seqüència de lletres i espais), però amb lletres en majúscules o minúscules que finalitza amb un punt, ens indiqui si el text és ordenat o no. Un text és ordenat si les primeres lletres de
57
cada paraula formen una seqüència de lletres ordenada lexicogràficament creixent o decreixent. Per exemple,
Això es massa. → Sí Vigila que fas . → Sí En Ignasi va a Viena. → No Mira qui ve . → Sí Tira el paper. → No Avui fa calor . → No Això agrada a Amelia . → Sí 3.2.23 La paraula més gran. Dissenyeu un algorisme que calculi quina és la paraula més gran d’un text i quina és aquesta longitud màxima. El text està format per lletres i espais en blanc, i finalitza amb un punt. Les paraules tenen com a molt 20 caràcters. Si hi ha més d’una paraula d’igual longitud, l’algorisme donarà com a resultat la primera que hagi trobat. Per exemple, si la seqüència fos: No sabem quin és el mot més llarg de la frase . La sortida hauria de ser: Paraula més llarga: sabem Longitud: 5 3.2.24 El text cap‐i‐cua (2). Dissenyeu un algorisme tal que donat un text sense accents (seqüència de lletres i espais) finalitzat amb un punt, ens indiqui si el text és cap‐i‐cua o no. Un text és cap‐i‐cua si totes les seves paraules són cap‐i‐cua. Una paraula és cap‐i‐cua si la primera i la darrera lletra de la paraula coincideixen. Per exemple, Apa. → Sí Apa quina calor que fa . → No Pep ampliara superficies . → Sí No ho tinc. → No 3.2.25 El text cap‐i‐cua (3). Dissenyeu un algorisme que calculi si un text és cap‐i‐cua o no. El text està format per lletres i espais en blanc, i finalitza amb un punt. Un text és cap‐i‐cua si la primera i la darrera paraula tenen la mateixa longitud. Com a mínim hi ha una paraula en el text. Per exemple: La guerra sembla inevitable . → NO Quan vindrà en Joan . → SÍ
58
La casa es molt maca. → NO Doncs no crec que pugui venir. → SÍ Avui acabarem la feina . → NO Senyores i senyors estigueu atents a la pantalla . → SÍ 3.2.26 El text homosil∙làbic. Dissenyeu un algorisme que calculi si un text és homosil∙làbic o no, i en el cas que ho sigui, ens digui cuantes síl∙labes tenen. El text està format per lletres, sense accents, i espais en blanc, i finalitza amb un punt. Un text és homosil∙làbic si totes les paraules tenen el mateix nombre de síl∙labes. Considereu que una síl∙laba és una agrupació de una o més vocals consecutives. Com a mínim hi ha una paraula en el text. Tota paraula té com a mínim 1 síl∙laba. Per exemple: Que tingueu sort . → NO és homosil∙làbic Cap nen té son . → SÍ és homosil∙làbic. Totes tenen 1 síl∙laba La casa es molt maca. → NO és homosil∙làbic Moltes capses estan netes . → SÍ és homosil∙làbic. Totes tenen 2 síl∙labes 3.2.27 El text homovocàlic. Dissenyeu un algorisme que calculi si un text és homovocàlic o no, i en el cas que ho sigui, ens digui cuantes vocals tenen. El text està format per lletres, i espais en blanc, i finalitza amb un punt. Un text és homovocàlic si totes les paraules tenen el mateix nombre de vocals. Per exemple: Hola noi . → SÍ és homovocàlic. Totes tenen 2 vocals Que tingueu sort . → NO és homovocàlic Cap nen té son . → SÍ és homovocàlic. Totes tenen 1 vocal La casa és molt maca. → NO és homovocàlic Moltes capses estan netes . → SÍ és homovocàlic. Totes tenen 2 vocals 3.2.28 El text sil∙làbic creixent. Dissenyeu un algorisme que calculi si el text és sil∙làbic creixent. És a dir, si la seqüència formada pels nombres de síl∙labes corresponents a cada paraula formen una seqüència creixent. Considereu que una síl∙laba és un grup d’una o més vocals consecutives i que l'accentuació no influeix. Així mateix tampoc hi ha sinalefes. El text està format per lletres, i espais en blanc, i finalitza amb un punt. Per exemple: El noi està tranquil . → SÍ és sil∙làbic creixent Que tingueu sort avui . → NO és sil∙làbic creixent Cap nen té son . → SÍ és sil∙làbic creixent La casa és molt maca. → NO és sil∙làbic creixent Vindreu vosaltres seguidament. → SÍ és sil∙làbic creixent. 3.2.29 El text bicreixent. Dissenyeu un algorisme tal que donat un text sense accents (seqüència de lletres i espais), que finalitza amb un punt, ens indiqui si el text és bicreixent o no. Un text és bicreixent si tant la seqüència formada per les longituds de cada paraula en posició parell com la seqüència formada per les longituds de cada paraula en posició parell són seqüències creixents. Per exemple, amb les següents entrades, les sortides serien:
59
Aixo es massa. → Sí Vigila que fas . → No En Jan ve ara. → Sí El noi està dret → Sí El nen voldria anar deslligat sempre . → Sí Na Maria està sola . → No Aixo agrada a Amelia . → No 3.2.30 El poema homoestròfic. Dissenyeu un algorisme que calculi si un poema és homoestròfic. És a dir, si totes les estrofes del poema tenen el mateix nombre de síl∙labes. Les síl∙labes d’una estrofa estan constituïdes per les síl∙labes de tots els versos que la formen. El poema està organitzat en estrofes, i les estrofes en versos. Considereu que una síl∙laba és un grup d’una o més vocals consecutives i que l'accentuació no influeix. Així mateix tampoc hi ha sinalefes. El text està format per lletres, comes, i espais en blanc, i finalitza amb un punt. Els versos estan separats pel caràcter ‘/’ i les estrofes pel caràcter ‘*’. Per exemple: El meu somni lent / de la gran pau blanca / sota el cel clement * Passo pels camins / encalmats que porten / la claror dels cims * És un temps parat / a les vinyes altes, / per damunt del mar * He parat el temps / i records que estimo / guardo de l'hivern . → NO és homoestròfic Adéu siau, turons, per sempre adéu‐ siau / oh serres desiguals que allí en la pàtria mia / dels núvols e del cel de lluny vos distingia / per lo repòs etern, per lo color més blau * Adéu tu, vell Montseny, que, des ton alt palau / com guarda vigilant, cobert de boira e neu / guaites per un forat la tomba del jueu / e almig del mar immens la mallorquina nau. → SÍ és homoestròfic
60
4. CONSTRUCTORS DE TIPUS i ALGORISMES
4.1.1 Considereu les dues accions següents: acció swap1(ent x, y són real) és acció swap2(ent/sort x, y són real) és var t és real fvar var t és real fvar t ← x; x ← y; y ← t t ← x; x ← y; y ← t facció facció
Si a té el valor 1.2 i b té el valor 1.5, quin és el resultat de les dues crides següents ? swap1(a,b) swap2(a,b)
4.1.2 Donada la següent acció: acció silly(ent x és enter; ent/sort y és enter) és var z és enter fvar x ← 5; y ← 6; z ← 7 facció
Quina és la sortida que es produeix a l'executar les tres línies de codi següents ? x ← 1; y ← 2; z ← 3; silly(y,x); writeln(x,y,z)
4.1.3 Considereu la següent funció: funció F(ent/sort x és enter) retorna enter és retorna (x) ; x ← x+1 ffunció Són iguals els valors de les expressions lògiques: x = F(x) i F(x) = x ?
4.1.4 Escriviu un subprograma que calculi el valor d'una inversió I, després de N anys d’interès a un R per cent compost. Que ha de ser el subprograma; una acció o una funció ? Els paràmetres s'han de passar per valor o per referència ? 4.1.5 Dissenyeu una funció parametritzada que donat un vector que conté una seqüència de caràcters (com a molt 20 i finalitzada en un punt), i una variable de tipus caràcter (car), retorni: a) 0, si el contingut de car no apareix en la seqüència. b) i, essent i la primera aparició del contingut de car en la seqüència.
4.1.6 Dissenyeu una funció amb paràmetres n, x que retorni el valor de la següent suma:
61
∑ (‐1)i x2i / (2i)! 0≤i≤n 4.1.7 Dissenyeu una funció que calculi una aproximació de la integral: x
∫ e‐u2 du = x ‐ x3 / 3 * 1! + x5 / 5 * 2! ‐ x7 / 7 * 3! + . . . 0
4.1.8 Dissenyeu una funció que calculi una aproximació d'ex. Recordeu que: ex = 1 + x + x2 / 2! + x3 / 3! + x4 / 4! + . . .
4.1.9 Dissenyeu una funció dig(n,k) que retorni el valor del k‐èssim dígit de la dreta del número n. Per exemple: dig(32534,3) = 5 dig(321,6) = 0
4.1.10 Dissenyeu una funció que integri una funció F(x) real i de variable real, entre dos punts a i b. Integrar una funció vol dir trobar l'àrea total entre aquests dos punts per sota de la corba. Una forma de fer‐ho és aproximant l'àrea mitjançant una sèrie de rectangles. La funció ha de poder integrar una funció arbitrària F, entre dos punts qualsevol a i b.
——————————————
4.2.1 Dissenyeu un algorisme que compti el nombre de vegades que apareix el primer mot d'una seqüència de caràcters acabada en un punt ('.'), utilitzant només un vector.
4.2.2 Dissenyeu un algorisme que donada una seqüència d'enters acabada en 0 (com a molt constituïda per 50 números), llegeixi la seqüència, la posi en un vector i doni la volta al vector.
4.2.3 Dissenyeu un algorisme que donada una frase o text (seqüència de caràcters acabada en un punt) calculi el nombre de mots palíndroms (cap‐i‐cua) que conté. Un mot és cap‐i‐cua si es llegeix igual d'esquerra a dreta que de dreta a esquerra.
4.2.4 Donat un vector f d'enters definit sobre 1..n, dissenyeu un algorisme que escrigui la seqüència d'elements de f suprimint els redundants. Un element de f és redundant si és igual a un element anterior del vector. No podeu utilitzar un vector intermig per a crear la seqüència. a) Estudieu el cas suposant que f no està ordenat. b) Suposeu ara que f està ordenat creixentment. c) Repetiu els dos apartats anteriors escrivint la seqüència en el mateix vector.
4.2.5 Donat un text, dissenyeu un algorisme que compti el nombre de cops que es repeteix cada lletra de l'alfabet (freqüències).
62
4.2.6 Repetiu l'exercici anterior, però ara per a qualsevol caràcter que apareixi al text. Considereu els caràcters en codi ASCII estès, on hi ha 256 caràcters diferents. 4.2.7 Siguin a i b dos vectors que representen dos conjunts A i B de nombres enters. Dissenyeu un algorisme que emmagatzemi en un altre vector: a) La intersecció de A i B.
b) La unió de A i B. c) Repetiu els apartats anteriors però ara suposant que els vectors estan ordenats.
4.2.8 Siguin A i B vectors de nombres enters sobre 1..n i 1..m respectivament que estan ordenats creixentment. Dissenyeu un algorisme que calculi el nombre de components i,j tal que A[i] + B[j] > 0.
4.2.9 Dissenyeu un programa que generi quadrats màgics d'un nombre senar de dimensions, m. Un quadrat màgic és un tauler on a cadascuna de les caselles hi ha un número natural n diferent, 1 ≤ n ≤ m2, amb la propietat que cada fila i cada columna sumen el mateix i les dues diagonals també. Seguiu l'algorisme de Batcher: 1. Poseu un 1 a la casella superior a la central
4. Avanceu posant el número següent (2, 3, 4, ...) a la casella situada a la dreta i amunt de l'actual. 3. Si la casella fos ocupada, reboteu a partir de la casella ocupada cap amunt i a l'esquerra.
4. Si s'escau, considereu que el tauler és cíclic. 5. Mai es rebotarà dues vegades.
4.2.10 Dissenyeu un algorisme que transformi un vector de caràcters a l'enter que representen (el deixi en una variable entera).
4.2.11 Dissenyeu un algorisme que transformi un enter en un vector de caràcters que representen els dígits de l'enter.
4.2.12 Dissenyeu un algorisme que donat un valor n enter, 0 ≤ n ≤ 9999, el passi a la codificació en caràcters romans (I, II, III, IV, V, ..., X, ..., L, ..., C, ..., D, ..., M, ..., N, ..., P), on N representa el 5000 i P el 10000.
4.2.13 Dissenyeu un algorisme que donat un número en caràcters romans el passi a l'enter equivalent.
4.2.14 Dissenyeu un algorisme que calculi el producte de dues matrius A (m x n) i B (r x s) de nombres reals.
4.2.15 Sigui A un vector sobre 1..n que pren només els valors 0 i 1. Dissenyeu una acció que ordeni A en sentit creixent; l'única operació que es permet sobre el vector és l'intercanvi de dues components. Resoleu el problema realitzant un únic recorregut del vector.
63
4.2.16 Dissenyeu una acció que generi en ordre creixent sobre un vector, els 500 primers números naturals que en la seva descomposició en factors primers només hi apareixin els números 2, 3 i 5.
4.2.17 Donats n valors enters ordenats continguts en un vector A, dissenyeu un algorisme que escrigui tots els valors diferents continguts al vector.
4.2.18 Dissenyeu un algorisme que calculi tots els números múltiples de 7 i cap‐i‐cua entre 0 i 10000. 4.2.19 Dissenyeu un algorisme que calculi An, ∀n ≥ 0, essent A una matriu de dimensions m x m.
4.2.20 Dissenyeu un algorisme que calculi exp(A) = ∑ Ai / i !, essent A una 1≤i≤n
matriu quadrada de dimensions m x m. 4.2.21 Donada una seqüència de 100 valors numèrics que representen una variable aleatòria X amb valors mancants, dissenyeu un algorisme que imputi als valors mancants, el valor: mitjana dels valors útils.
4.2.22 Donada una seqüència de 100 valors numèrics que representen una variable aleatòria contínua X, dissenyeu un algorisme que la recodifiqui en una variable ordinal segons uns límits fixats interactivament per l'usuari i que compti quantes observacions cauen en cada interval. 4.2.23 Dissenyeu un algorisme que donat un text, recodifiqui els caràcters segons el codi: 'A' ——> 'C' 'J' ——> 'R' 'S' ——> 'P' 'B' ——> 'N' 'K' ——> 'H' 'T' ——> 'E' 'C' ——> 'U' 'L' ——> 'S' 'U' ——> 'Z' 'D' ——> 'G' 'M' ——> 'X' 'V' ——> 'K' 'E' ——> 'M' 'N' ——> 'J' 'W' ——> 'Y' 'F' ——> 'V' 'O' ——> 'O' 'X' ——> 'Q' 'G' ——> 'A' 'P' ——> 'B' 'Y' ——> 'W' 'H' ——> 'F' 'Q' ——> 'I' 'Z' ——> 'D' 'I' ——> 'L' 'R' ——> 'T'
4.2.24 Dissenyeu un algorisme que donat un text calculi el nombre de mots que són prefixos del primer.
4.2.25 Dissenyeu un algorisme que cerqui en un vector d'enters de 50 posicions, el màxim d'entre ells.
4.2.26 Repetiu l'exercici anterior però suposant ara que el vector està ordenat creixentment.
4.2.27 Sigui A una matriu de nombres enters de n files i m columnes que verifica: ∀j : 1 ≤ j ≤ m : A[i, j] ≥ A[i+1, j] per i = 1 .. n‐1
64
∀i : 1 ≤ i ≤ n : A[i, j] ≤ A[i, j+1] per j = 1 .. m‐1
Sigui x un número enter per al que existeixen r i s tal que x = A[r, s]. Dissenyeu un algorisme que donat x com a entrada calculi r i s.
4.2.28 Dissenyeu algorismes que determinin per a una matriu donada de números enters, A, amb n files i m columnes, el nombre de components que són positives o nul∙les, sota les següents consideracions: a) No sabeu res més d'A. b) A[i, j] és decreixent com s funció de i, i creixent com a funció de j.
4.2.29 Donat un vector A sobre 1..n de nombres enters tal que ∀i : 1 ≤ i ≤ n : A[i] > 0, dissenyeu un algorisme que calculi el nombre de parelles j i k, que verifiquin:
∑ A[i] = ∑ A[i] 1≤i≤j k≤i≤n
4.2.30 Sigui S una seqüència de nombres enters. Dissenyeu un algorisme que calculi la longitud màxima dels segments si si+1 ... sn‐1 sn tal que ∀ j : i ≤ j ≤ n : si ≤ sj.
4.2.31 Dissenyeu un algorisme que llegeixi fila a fila, una matriu de n x n elements on n és un paràmetre d'entrada. L'algorisme ha de determinar si la matriu s'ajusta a algun d'aquests casos: a) Simètrica: Aij = Aji ∀i,j b) Triangular superior: Aij = 0 per j = 1, ..., n‐1 i = j+1, ..., n c) Diagonal: Aij = 0 sempre que i ≠ j
4.2.32 Una matriu dispersa o espaiada (sparse matrix) es defineix com una matriu en la que la majoria d'elements són 0. Queda clar que s'està utilitzant molt espai de memòria, per a emmagatzemar elements amb informació molt poc significativa. Un sistema més eficient per a representar una matriu dispersa de m x n elements és una matriu de k x 3 components (representació reduïda) en la que es emmagatzema la fila, la columna i els valors diferents de zero de la matriu original. Dissenyeu un algorisme que llegeixi una matriu dispersa, fila a fila, obtingui la seva representació reduïda i la imprimeixi en el format adequat.
4.2.33 Dissenyeu un algorisme que llegeixi una matriu, A, de valors enters per files (on les dimensions, m files i n columnes, seran valors a llegir prèviament) i calculi si la matriu és columna‐ordenada. És a dir,
(∀j : 1 ≤ j ≤ n : (∀i : 1 ≤ i < m : Ai,j ≤ Ai+1,j)).
65
4.2.34 Donat un text constituït per frases (seqüència de mots) separades pel caràcter '*', dissenyeu un algorisme que escrigui la frase que conté més mots. Una frase com a màxim conté 100 caràcters.
4.2.35 Donada una seqüència de valors numèrics de 100 elements, dissenyeu un algorisme que calculi el valor mínim, el valor màxim, la mediana, i el primer i el tercer quartil (Q1 i Q3).
4.2.36 Dissenyeu un algorisme que recodifiqui la seqüència numèrica de l'exercici anterior segons els límits: Vmín, Q1, mediana, Q3 i Vmàx.
4.2.37 Dissenyeu un algorisme que prenent com a entrada la seqüència recodificada de l'exercici anterior, calculi per a cada tram de la nova variable definida, la mitjana dels valors originals.
4.2.38 Dissenyeu un algorisme que sumi dues matrius donades de dimensions n x m.
4.2.39 Un segment [p, q] d'un vector A definit sobre 1..n diem que és un segment "suau" si verifica:
1 ≤ p < q ≤ n, ∀i,j : p ≤ i, j ≤q : |A[i]–A[j]| ≤ 1
Dissenyeu un algorisme que calculi la longitud màxima dels segments suaus d'A.
4.2.40 Donat un vector creixent de nombres enters A definit sobre 1..n i un número enter k, k ≥ 0, dissenyeu un algorisme que calculi el nombre de parelles (i,j) tal que: 1 ≤ i ≤ j ≤ n, A[j] – A[i] ≤ k
4.2.41 Donada una matriu A de números enters de n x m components que és estrictament creixent per files i per columnes, dissenyeu una funció que calculi el nombre de components A[i, j] que verifiquen: 0 ≤ A[i, j] < 25.
4.2.42 Donada una seqüència S de nombres enters de longitud n, dissenyeu un algorisme que calculi la suma màxima dels segments de S.
4.2.43 Dissenyeu un algorisme que calculi la longitud màxima dels segments monòtons d'una seqüència S de nombres enters de longitud n. 4.2.44 Els polinomis. Dissenyeu les estructures de dades adients i un algorisme que calculi el producte de 2 polinomis (de grau inferior o igual a n) amb coeficients enters. L’algorisme haurà de llegir els dos polinomis segons el format, [<signe>] <coeficient> X <grau> {<signe> <coeficient> X <grau>}* per exemple, +8x3‐2x1 que representa el polinomi 8 x3 ‐ 2 x 3x2‐1x0 que representa el polinomi 3 x2 ‐ 1 i calcular el producte donant el polinomi resultant. En el cas de l’exemple,
66
24x5‐14x3+2x1 que representa el polinomi 24x5 ‐ 14 x3 + 2 x 4.2.45 Producte de números. Dissenyeu un algorisme que calculi el producte a*b, per a uns valors enters positius donats, a i b. Els valors enters a i b s'especificaran i llegiran amb el següent format: a#B1 b#B2 Els números a i b, podran ser donats en qualsevol base Bi (1 < Bi ≤ 10). El resultat s'ha de donar en base 10. Per exemple, 2102#3 106#7 Ha de donar 3575#10 Podeu suposar que no hi haurà problemes d'overflow en efectuar el càlcul. Si no féssim aquesta suposició, expliqueu com ho resoldríeu. 4.2.46 El barquer de Puigcerdà. El barquer del llac de Puigcerdà, ja fa temps que rumia si amb les noves tecnologies informàtiques, el seu treball seria una mica més fàcil. La seva feina consisteix en llogar i vigilar les seves 20 barques, durant tot el dia. El barquer s'apunta en un quadern les hores de sortida i d'arribada de cadascuna de les barques, per tal de fer una estadística –en acabar el dia– del temps d'ocupació de cadascuna de les barques i de totes en conjunt. Evidentment una mateixa barca es pot llogar vàries vegades el mateix dia. Dissenyeu un algorisme que rebi com a dades d'entrada la seqüència d'informacions de les hores de sortida i arribada de les barques (cada unitat d'informació en una línia), en aquest format:
<número de la barca> <hora> <minut> <arribada/sortida> El número de la barca (entre 1 i 20) i l'hora i el minut (de sortida o arribada) seran valors enters. L'arribada o sortida es codificarà amb un caràcter: 'A' per l'arribada i 'S' per la sortida. La seqüència finalitzarà amb un codi de barca igual a 0. Per exemple,
3 9 0 S 12 9 10 S 3 9 30 A 5 9 43 S
… 7 20 56 A
0 El resultat ha de ser el càlcul del temps d'ocupació de cada barca i el de totes, en conjunt. Suposarem que no hi ha cap mena d'incoherències: una barca no pot sortir/tornar si abans no ha tornat/sortit, les hores i minuts són correctes, etc. 4.2.47 La calculadora polonesa. Certes marques de calculadores de butxaca fan servir, per a representar i avaluar les expressions numèriques, la notació polonesa inversa (RPN). Aquesta consisteix en col∙locar els operadors en notació post‐fixa (és a dir, després dels operands),
67
contràriament a la notació infixa habitual, on els operadors són enmig dels operands. Així les expressions en notació infixa següents serien equivalents en notació post‐fixa a:
7 + 3 ≡ 7 3 + (7 + 3) * (4 ‐ 2) ≡ 7 3 + 4 2 ‐ * 7 + (3 * 4) ‐ 2 ≡ 7 3 4 * + 2 ‐
Fixeu‐vos que amb aquesta notació no calen mai parèntesis. Dissenyeu un algorisme que avaluï expressions numèriques enteres –que l'usuari introduirà– formades per operands sempre positius i sense signe, i per operadors binaris, en notació polonesa inversa (RPN o post‐fixa). Les expressions només podran tenir els 4 operadors numèrics binaris bàsics: + –– suma ‐ –– diferència * –– multiplicació / –– quocient de la divisió entera Quan l'usuari ja no vulgui avaluar més introduirà el mot FI. Per exemple: CLC> 7 3 + 10 CLC> 7 3 + 4 2 ‐ * 20 CLC> 8 4 / 5 ‐ 1 + ‐2 CLC> 7 3 4 * + 2 ‐ 17 ... CLC> FI Podeu suposar que les expressions són correctes i que no hi haurà overflow. 4.2.48 La loteria prehistòrica. Una de les primeres loteries de les que es tenen notícies és la loteria prehistòrica, que ha arribat fins a nosaltres gràcies a unes pintures rupestres trobades a la localitat de Santa Lot de la Roca. Pel que sembla, aquesta loteria es jugava la nit del solstici d’estiu en la tribu prehistòrica de l’esmentada vila, que estava formada per unes 100 persones. Per a poder jugar, les persones de la tribu interessades havien de donar una certa quantitat de diners, joies i altres productes valuosos al cap de la tribu. Els participants (m) s’anaven numerant (1,2,3, etc.) i es posaven formant un cercle al voltant del foc i anaven ballant. Llavors el bruixot de la tribu els hi comunicava el nombre màgic de la nit (n). Llavors, començaven a comptar a partir del primer, i cada n participants eren eliminats del joc. El procés es repetia fins que només en quedava un, que era el guanyador i rebia de mans del cap de la tribu tots els diners, joies, etc. Per exemple, per a m = 11 i n = 4, la successió del joc seria: 4 8 1 6 11 7 3 2 5 10 9. Dissenyeu un algorisme que donats els valors de m i n, calculi la successió del joc, i la imprimeixi, tot indicant qui és el guanyador.
68
4.2.49 La tenda dels patins. L’encarregat de la famosa tenda de patins SKATE‐OLÍMPIC creu que es pot informatitzar força feina de la que realitza en la botiga, i que a més a més, es poden fer anàlisis estadístiques, molt profitoses per al negoci. A la botiga lloguen patins per un cert temps. Hi ha patins de 4 tipus, i de cada tipus en disposen de 30. Per a poder fer un control del desgast dels patins, fa poc que han instal∙lat un comptaquilòmetres per cada parell de patins. Així podran saber exactament quan un patí arriba a la fi de la seva vida útil. També els hi interessa quantes hores lloguen els patins, quins tipus de patins són més sol∙licitats, etc. L’encarregat s'apunta en un quadern les hores de sortida i d'arribada, el que marca el comptaquilòmetres per a cadascun dels patins en ser llogats i en ser retornats a la botiga, per tal de fer una estadística –en acabar el dia– del temps d'utilització i quilometratge de cadascun dels patins, temps d’utilització de tots en conjunt i el quilometratge total per cada tipus de patí. Evidentment els mateixos patins es poden llogar vàries vegades el mateix dia. Dissenyeu un algorisme que rebi com a dades d'entrada la seqüència d'informacions sobre el tipus de patí, les hores de sortida o arribada dels patins, el valor del comptaquilòmetres (cada unitat d'informació en una línia), en aquest format: <tipus de patí> <número del patí> <hora> <minut> <comptaquilòmetres> <arribada/sortida> El tipus de patí (1 o 2 o 3 o 4), el número del patí (entre 1 i 30), l'hora i el minut (de sortida o arribada), i el valor del comptaquilòmetres seran valors enters. L'arribada o sortida es codificarà amb un caràcter: 'A' per l'arribada i 'S' per la sortida. La seqüència finalitzarà amb un codi de patí igual a 0. Per exemple,
2 3 9 0 0 S 1 12 9 10 0 S 2 3 9 30 6 A 4 5 9 43 0 S
… 1 12 20 56 64 A
0 El resultat ha de ser el càlcul del temps d'utilització i quilometratge de cadascun dels patins, temps d’utilització de tots en conjunt i el quilometratge total per cada tipus de patí. Suposarem que no hi ha cap mena d'incoherències: uns patins no poden sortir/tornar si abans no ha tornat/sortit, les hores i minuts són correctes, el comptaquilòmetres està inicialitzat a 0 a l’inici del dia, etc. 4.2.50 El circuit de Catalunya. L’encarregat de les curses del circuit de Montmeló està intentant automatitzar la preparació de les graelles de sortida dels diferents Grans Premis, ja sigui de motociclisme o bé d’automobilisme. En una cursa no participen mai més de 60 pilots. Els pilots de cada cursa són diferents als de les altres. Les graelles de sortida estan formades per una sèrie de línies de sortida. Cadascuna de les línies de sortida està formada per 4 pilots en les curses de motociclisme i per 2 pilots en les d’automobilisme. A la primera línia de sortida hi han els pilots que han obtingut els millors temps en els entrenaments, a la segona els pilots amb els següents millors temps, etc., fins els de la darrera línia, que són els que han obtingut els pitjors temps. Dins de cada línia, els pilots també s’ordenen de millor a pitjor temps. La configuració de les graelles de sortida es realitza a partir dels temps dels entrenaments. Durant els entrenaments un pilot va fent un nombre variable de temps,
69
resultants de la cronometració del seu pas per l’arribada, a cada volta. Així, per cada pilot s’escull el temps millor (el més ràpid) dels que ha efectuat, i és el que s’utilitzarà per a decidir la configuració de les diferents línies en la graella de sortida. Dissenyeu un algorisme que rebi com a dades d'entrada un codi de la cursa (un caràcter) per saber si la cursa és de motociclisme (‘M’) o d’automobilisme (‘A’) i la seqüència d'informacions sobre els diferents temps fets en els entrenaments pels diferents pilots, que constarà del nom del pilot, el número del pilot, el temps efectuat (cada unitat d'informació en una línia) separats per espais en blanc, en aquest format: <codi cursa> [<número del pilot> <nom del pilot> <minuts> <segons> <centèssimes de segon>]* El número del pilot pot ser qualsevol valor enter (> 0), el nom del pilot és una seqüència de caràcters, els minuts i els segons són valors enters (≤ 0 i < 60), i les centèssimes és també un valor enter (≤ 0 i < 100). La seqüència finalitzarà amb un número de pilot igual a 0. Per exemple,
M 8 Checa 1 02 56 4 Crivillé 1 01 34 8 Checa 1 01 87 1 Doohan 1 01 47 21 Biaggi 1 00 97 4 Crivillé 0 59 98 … 2 Harada 1 00 15 0
El resultat ha de ser un llistat on hi hagi la configuració de la graella de sortida (classificació dels pilots segons el seu millor temps), especificant per a cada línia de sortida, el número d’ordre del pilot a la sortida, el nom i el número del pilot i el seu millor temps en els entrenaments. Suposarem que no hi ha cap mena d'error en les dades d’entrada: els minuts, segons i centèssimes són correctes, etc. 4.2.51 El concurs de calçots de Valls. L'organitzador del concurs anual de calçots de Valls vol controlar informàticament els resultats del concurs. El concurs consisteix en què els diferents participants van menjant plats de calçots mentre poden. Cada plat de calçots té un nombre de calçots especificat pel concursant. És a dir, que unes vegades en pot menjar més i d'altres menys, segons el seu estat d'ànim i el seu estómac. Hi ha un jurat que va puntuant cadascun dels plats que es mengen els participants. El jurat valora no només la quantitat de calçots que mengen a cada plat, sinó també l'elegància en el menjar, el ritme d'endrapament, etc. En el concurs no participen mai més de 40 concursants. Cadascun dels concursants té un dorsal amb el seu número. El concursant que guanya és aquell que obté una millor puntuació mitjana dels plats que s'ha menjat, i en cas d'empat es té en compte el nombre total de calçots endrapats. Dissenyeu un algorisme que rebi com a dades d'entrada la seqüència d'informacions sobre les diferents puntuacions dels diferents plats de calçots que mengen els diferents concursants. Aquesta informació constarà del número del concursant, el nom del
70
concursant, el nombre de calçots del plat i la puntuació del plat (cada unitat d'informació en una línia) separats per espais en blanc, en el següent format: [<nº concursant> <nom concursant> <nº calçots del plat> <puntuació plat>]* El número del concursant pot ser qualsevol valor enter (> 0 i ≤ 40), el nom del concursant és una seqüència de caràcters, el nombre de calçots d'un plat pot ser qualsevol enter (> 0), i la puntuació del plat és un valor real (≥ 0.0 i ≤ 10.0). La seqüència finalitzarà amb un número de concursant igual a 0. Per exemple,
3 Miquel 8 7.5 2 Maria 10 8.5 17 Carme 6 7.0 1 Josep 5 5.5 9 Anna 7 6.5 3 Miquel 12 9.5 17 Carme 10 9.0 … 2 Maria 5 6.0 0
El resultat ha de ser un llistat on hi hagi la classificació final del concurs (llistat de tots els concursants segons la puntuació mitjana, i en cas d'empat segons el nombre total de calçots), especificant per a cada línia de sortida, el número d’ordre de la classificació, el nom i el número del concursant, la seva puntuació mitjana i el nombre de total de calçots. Suposarem que no hi ha cap mena d'error en les dades d’entrada: els noms, números, puntuacions són correctes, etc. 4.2.52 L’empresa STRESSANT. L’empresa de petita escala STRESSANT, que té una política flexible d’horaris tant en les hores d’entrada i sortida com en els dies de treball, vol portar un control estricte dels horaris laborals dels seus empleats, per a detectar fraus, així com saber quins són els seus millors empleats. L’empresa té 100 empleats. De moment no estan gaire informatitzats, i el control d’horaris l’efectua un/a administratiu/va que controla els fulls d’horaris dels empleats. En els fulls d’horaris, els treballadors apunten cada dia la hora d’arribada i la hora de sortida junt amb el seu número d’empleat, el seu nom i el dia de la setmana. Cada certs temps (setmanal, quinzenal, etc.), l’administratiu fa un cert control d’horaris a petició del cap de personal de la empresa. Les hores treballades els dissabtes i els diumenges són considerades hores extres. El gerent, però, vol informatitzar el procés per a fer‐ne un control més estricte. Podeu suposar que els empleats treballant totes les hores d’un mateix dia seguides. Dissenyeu un algorisme que rebi com a dades d'entrada la seqüència d'informacions sobre els diferents horaris laborals diaris dels diferents empleats de l’empresa durant un cert període de temps. Aquesta informació constarà del número d’empleat, el nom de l’empleat, l’hora d’arribada (hora i minut), l’hora de sortida (hora i minut) i el dia de la setmana (cada unitat d'informació en una línia) separats per espais en blanc, en el següent format:
<nº empleat> <nom empleat> <hora d’arribada > <hora de sortida> <dia de la setmana>
71
El número d’empleat pot ser qualsevol valor enter (> 0 i ≤ 100), el nom de l’empleat és una seqüència de caràcters, l’hora d’arribada són un parell d’enters que expressen la hora i els minuts de l’arribada a l’empresa (0 ≤ hora ≤ 23 i 0 ≤ minuts < 60), l’hora de sortida són un parell d’enters que expressen la hora i els minuts de la sortida de l’empresa (0 ≤ hora ≤ 23 i 0 ≤ minuts < 60) i el dia de la setmana és un valor alfabètic (dilluns, dimarts, ... diumenge). La seqüència finalitzarà amb un número d’empleat igual a 0. Per exemple,
32 Joan 8 45 17 45 dimarts 21 Maria 8 58 19 27 dilluns 74 Elisenda 7 50 20 0 dilluns 89 Hipòlit 7 47 13 53 dimecres 32 Joan 8 40 17 59 dilluns 21 Maria 8 35 19 5 dissabte … 74 Elisenda 10 5 13 47 diumenge 0
El resultat ha de ser un llistat on hi hagi el ranking descendent dels empleats segons el promig diari d’hores totals treballades, i en cas d'empat segons el nombre d’hores extres treballades, durant un cert període de temps. Per a cada línia de sortida s’especificarà, el número d’ordre del ranking, el total d’hores treballades durant el període, el nom de l’empleat, el seu promig diari d’hores treballades, el nombre de dies treballats i el nombre d’hores extres treballades. Podeu suposar que no hi ha cap mena d'error en les dades d’entrada: els noms, números, hores, dies són correctes, etc. 4.2.53 Anàlisi de freqüència. Dissenyeu un algorisme que analitzi la freqüència de les longituds de les paraules que formen un text, per a propòsits estadístics. El text està format per lletres i espais en blanc, i finalitza amb un punt. No hi ha paraules de més de 20 caràcters. L’algorisme donarà com a resultat una taula on apareixerà, per a cada possible longitud, el nombre de vegades que s’ha donat en el text. Per exemple, si el text d’entrada fos: A Europa es viu la febre de la moneda única amb una eufòria notable . La sortida hauria de ser: No. paraules de longitud 1: 1 No. paraules de longitud 2: 4 No. paraules de longitud 3: 3 No. paraules de longitud 4: 0 No. paraules de longitud 5: 2 No. paraules de longitud 6: 2 No. paraules de longitud 7: 2 . . . No. paraules de longitud 20: 0
72
4.2.54 El catering. El gerent de la nova empresa de catering BO‐i‐FET us vol encarregar la confecció d'un sistema informàtic que analitzi estadísticament la venda dels diferents productes que comercialitza (plats principals, begudes, entrants, postres, aperitius, etc.) als diferents clients que està començant a tenir. De moment tenen una gamma de 20 productes, i com a molt tenen 15 clients, ara per ara. Durant el dia es van rebent les diferents comandes de productes dels diversos clients, per a l’endemà. Aquestes comandes s’apunten en una llibreta. Al vespre, s'engega el sistema informàtic d'anàlisi estadística. Totes aquestes dades es processen, i així ja tenen feta l’anàlisi estadística i tenen la planificació per al repartiment dels encàrrecs per a l’endemà. Dissenyeu un algorisme que rebi com a dades d'entrada, que introduirà l’encarregat de l’empresa pel teclat, la seqüència de comandes dels diversos productes fetes pels diversos clients durant l’horari d’obertura de la botiga de BO‐i‐FET. Cada informació relativa a la comanda d’un client està formada per una tripleta de valors que consisteixen en el nom del client (una cadena), el codi de producte (un enter entre 1 i 20), i el nombre d’unitats que vol del producte (un enter, que potser positiu o negatiu). Un nombre d’unitats negatiu significa que vol unitats de menys de la seva comanda anterior. La seqüència finalitzarà amb la cadena “FI”. Per exemple, una seqüència d'entrada d'un dia qualsevol podria ser la següent:
FME‐UPC 4 80 FME‐UPC 10 80 La‐Caixa 7 400 La‐Caixa 2 400 ZurichSA 1 130 La‐Caixa 4 400 ZurichSA 3 130 Planeta 14 300 Planeta 17 280 ZurichSA 3 70 Planeta 14 ‐20 FME‐UPC 4 ‐10 … AGBAR 5 600 FI
Els resultats de l’anàlisi han de ser dos llistats per pantalla:
‐ Un llistat que descrigui, per a cada producte, el nombre total d’unitats d’aquell producte demanades per a l’endemà, entre tots els clients. ‐ Un llistat ordenat que descrigui, per a cada client, tots els productes i les quantitats respectives demanades per a l’endemà, per aquell client, ordenats decreixentment segons la quantitat demanada.
Podeu suposar que no hi ha errors a les dades d'entrada.
73
5. JAVA, UN LLENGUATGE ORIENTAT ALS OBJECTES I DISTRIBUÏT
5.1 Expresseu en la sintaxi de Java les següents constants: a) π b) e c) 16/32 d) 6.02 1023 e) el número 7 d) el caràcter 7
5.2 Quines de les següents declaracions de constants són correctes ? Identifiqueu el(s) error(s) en cadascuna de les declaracions incorrectes: a) static final int highvalue = 200; b) const lowvalue = 0 | 1 | 2; c) static final char firstchar : 'A'; d) static final float greatest = 200.0; least = 100.0;
5.3 Escriviu una declaració de constants per a cadascun dels següents valors: a) El caràcter finalitzador '.'. b) La constant entera 80 que representa la màxima longitud d'una línia.
c) Les constants reals 0 i 100 que representen el rang de les notes d'un examen.
5.4 Quines de les següents declaracions són correctes ? Identifiqueu el(s) error(s) en cadascuna de les declaracions incorrectes: a) char 1a, 2a, 3a ; b) char a1=’0’, a2, a3; real b1; integer a3; c) int a; int b; int c ; float abc; d) double resulta, resultb; int count; char ci; real x=1., y=1.;
5.5 Escolliu noms raonables i escriviu una sola declaració per a cadascun dels següents valors: a) Els tres coeficients reals d'una equació quadràtica. b) Les dues arrels reals d'aquesta equació. c) Un valor que indiqui si té solució o no.
d) Un valor enter que indiqui el nombre de conjunts de dades a processar.
5.6 Escolliu noms raonables i escriviu una sola declaració per a cadascun dels següents valors: a) Un número d'identificació de 6 dígits, per als estudiants. b) Un codi d'un sol dígit que indiqui el curs ( 1= 1er, ...). c) L'any de llicenciatura/diplomatura. d) La nota mitjana. e) Una variable que indiqui si les taxes de matrícula s'han pagat o no.
75
5.7 Quin és l'objectiu d'un comentari en un programa en Java? Com s'escriu un comentari? Afegiu els comentaris apropiats a les declaracions var dels dos exercicis anteriors per a que algú no relacionat amb el tema pugui entendre la funció de cadascuna de les variables.
5.8 Avalueu cadascuna de les següents expressions en Java: a) 3 > (9 % 2) ‐ 5 b) (1.6 + 1.9/2.0 + 3.0) c) 1 ‐ 2 ‐ 3 ‐ 4 ‐ 5 d) ((9 / 3) + (9 / 4) + (9 / 5)) % 4
5.9 Suposeu que les següents variables han estat declarades i tenen els següents valors: { a = 7, b = ‐6, c = 30, d = 10.8600, e = 1.E3, f = '*', g = true }.
Quin és el valor de cadascuna de les següents expressions ? a) a b / (d) + 3 b) d ‐ 0.75 / (e 140.0) 70.0 c) math.sqrt (math.abs (b ‐ a) + c ‐ 20) d) 10 * a % math.pow(b,2) e) ! ((a >= b) & g) f) ((b>=a) | (math.pow(b,2) > c)) & (g & ! ( math.abs(b) != 6))
5.10 Siguin a, b i c variables booleanes que tenen els següents valors: { a = true, b = false, c = true }. Avalueu les següents expressions: a) a & (b | c) b) (a & b) | (a & c) c) (! a) | (! c) d) a & ! b | ! c
5.11 Determineu si les següents expressions Java són la traducció correcte de les següents expressions matemàtiques. Si no ho són, corretgiu‐les. a) ((a + b) / c)1/2 ——> math.sqrt(a+b/c) b) ax2 + bx + c ——> a * x * x + b * x + c c) (6.02 x 1027) (ln (1 + e(x‐1.))) ——> 6.02E27(math.ln(1+math.exp(x)‐1.))
5.12 Traduïu a Java les següents expressions, mitjançant sentències d'assignació correctes: a) La base imposable bruta és sou brut ‐ 11$ x núm. de dependents ‐ 14$ b) La contingència és (X2 / (N + X2))1/2 c) La mitjana ponderada és (k * suma de notes) / ( N ‐ valors invàlids) d) L'amplada és A/2 sinus(2 π (fc + fm) t ‐ π/2)
76
e) TEST és cert si VALOR està entre 1 i 10 inclosiu. D'altra forma és fals.
5.13 Suposem que tenim tres targetes de dades (o tres línies) amb els següents valors: 53 78 6 110 Z 59 ‐8
i les declaracions: int x, y, z; char ch;
Quins valors assignaran a les variables les següents operacions d'entrada: a) x=System.in.read(); y=System.in.read(); ch=System.in.read(); b) x=System.in.readln(); y=System.in.readln(); ch=System.in.readln(); c) x=System.in.readln(); y=System.in.read(); ch=System.in.readln(); z=System.in.read(); d) ch=System.in.read(); x=System.in.readln(); x=System.in.read();
5.14 Escriviu les instruccions d'entrada necessàries per a llegir les següents dades:
a) Una targeta que conté el núm. de seguretat social i un identificador del departament (valors enters sobre un empleat). Després segueix una altra targeta d'horaris que indica el número total d'hores treballades durant la setmana (real).
b) Una targeta d'estudiant que tingui les seves notes i quatre lletres separades per blancs que indiquin les notes (E=Excel.lent, N=Notable, ...)
5.15 Què imprimiran les següents sentències, partint dels valors inicials: { x = 1.0, y = 2, z = 3.0 } ? a) System.out.println(x,y,z) b) System.out.print(x); System.out.println(y); System.out.println(z) c) System.out.println(x,y); System.out.println(z)
5.16 Escriviu un programa complet en Java que calculi totes les solucions enteres de l'equació: 3X + 2Y ‐ 7Z = 5
per a tots els valors 0 ≤ x, y, z ≤ 100.
5.17 Siguin V1 i V2 dues variables booleanes i S1, S2 i S3 sentències Java. Aquestes seqüències seran executades segons els valors de V1 i V2 tal i com mostra la taula:
77
V2
true false
true
false
S1 S3
S2
S3V1
Dissenyeu una sentència condicional/alternativa que aconsegueixi aquests fets.
5.18 Escriure un programa complet en Java que calculi el mínim nombre de bitllets i monedes necessàries per a tornar el canvi respecte d'una quantitat determinada. El cost de l'article comprat i la quantitat lliurada per al seu pagament s'han de llegir com a dades. El programa ha d'indicar quantes monedes i bitllets de cada tipus són necessàries per a tornar el canvi. Disposarem de les següents monedes i bitllets: Monedes : 1, 2, 5, 10, 20, 50 cèntims i 1, 2 euros Bitllets : 5, 10, 20, 50, 100, 200 i 500 euros
5.19 L'àrea d'un cercle de radi 1 és π i l'àrea del quadrat que el conté és justament 4. Per tant si escollim a l'atzar un gran nombre de punts del quadrat, la fracció de punts que caiguin dins el cercle serà aproximadament π/4. Suposada l'existència d'una funció random, que dóna com a resultat un número pseudoaleatori uniformement distribuït en l'interval (0,1), dissenyeu un programa en Java que calculi una aproximació de π.
5.20 Suposant que random és la funció definida en l’exercici anterior, dissenyeu un programa que calculi, per aproximació, les probabilitats d'aconseguir els números del 2 al 12 amb dos daus.
5.21 Quins identificadors respecten la sintaxi de la següent gramàtica BNF (Backus Naur Form), <identificador> ::= <P> | <Q> | <PQ> <PQ> ::= Ø | a <PQ> b <P> ::= a <P> | Ø <Q> ::= <Q> b | Ø ?
5.22 Dissenyeu un programa en llenguatge Java que permeti jugar al nombre màgic. Aquest joc consisteix en endevinar un número (entre MIN i MAX) seleccionat aleatòriament pel computador, en el mínim nombre de passos. El computador dóna informació per a cada tirada de si el nombre màgic és més petit o més gran que la aproximació del jugador. Els
78
79
límits MIN i MAX els ha de fixar interactivament l'usuari. El programa ha d'informar al final del nombre de passos emprats. 5.23 Donada la següent gramàtica BNF que descriu la sintaxi dels identificadors d'un cert llenguatge de programació d'alt nivell, obteniu el conjunt d'aquests identificadors vàlids: <IDENT> ::= a <E> | <D> z | a <ED> z <E> ::= a <E> | Ø <D> ::= <D> z | Ø <ED> ::= a <ED> z | <DIGIT> | Ø <DIGIT> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 5.24 Codifiqueu els algorismes corresponents als exercicis parells del capítol 2 en llenguatge Java.