



Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Fonaments d'Informàtica, Profesor: Pau Fernandez Duran, Carrera: Enginyeria de Sistemes Audiovisuals, Universidad: UPC
Tipo: Exámenes selectividad
1 / 5
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!




Una de les diferències importants entre tuples i taules és la possibilitat de copiar tuples o taules fent una assignació. És a dir, si tenim:
struct tTupla { int i; char c; string s; };
typedef bool tVector[100];
i tenim, també, dues variables de cada tipus:
tTupla A, B; tVector X, Y;
ens interessen les assignacions:
A = B; // es pot fer, igual que: A.i = B.i; A.c = B.c; A.s = B.s; X = Y; // NO es pot fer
En el cas de les tuples, podem fer l’assignació, i es farà una còpia de cada camp en paral·lel. En el cas de les taules, però, l’assignació no es pot fer. Ens veiem obligats a fer-ho a mà, tal com en el següent codi:
// copia la taula Y en X for (int k = 0; k < 100; k++) X[k] = Y[k];
En molts programes sorgeix la necessitat d’emmagatzemar dades d’un conjunt petit, d’uns quants elements. Exemples típics són els dies de la setmana, els colors d’un semàfor, l’estat civil d’una persona, etc. Fixem-nos en els dies de la setmana. Per fer programes que manipulin dies de la setmana sempre podem assignar a cada dia un número: 1 per dilluns, 2 per dimarts, 3 per dimecres, 4 per dijous, etc. Fent això podríem treballar amb els números com si representéssin dies de la setmana. El codi per fer que un dia fós dimecres, seria, doncs:
int dia = 3;
Tanmateix, aquesta l’assignació és poc clara, si estem uns dies sense treballar amb el programa, quan hi tornem ens costarà recordar quin dia era cada número. Inclús, si per algun motiu el codi és “extrany” (començant per 0, per exemple), cada cop que posem un dia en una variable haurem de pensar quina és la corresponendència entre enters i dies.
Per arreglar aquest problema, existeixen els tipus enumerats. Podem declarar petits conjunts d’enters a on cada enter té un nom, i en el programa fer servir el nom. Vegem una declaració per als dies de la setmana:
enum tDiaSetmana { dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge };
La declaració conté:
Un cop tenim aquest tipus declarat, podem declarar variables (que en realitat seran un enter) per treballar més còmodament amb valors dins d’aquest conjunt. Per exemple:
tDiaSetmana dia = dimecres; // ... dia = divendres;
La millora respecte als enters només és a nivell del codi del programa, si mostrem un enumerat per pantalla veurem que realment és un enter:
tDiaSetmana dia = dilluns; cout << "El dia ´es: " << dia << endl; // sortir`a: El dia ´es 0
Exercici 1
Declara un tipus enumerat tCardinal que permeti representar els 4 punts cardinals (Nord, Sud, Est i Oest).
De fet, si no diem res, quan es fa una declaració d’un tipus enumerat, s’assignen els enters que corresponen a cada membre de l’enumerat. Es fa sempre començant per 0. En el cas de tDiaSetmana, això implica que el programa:
cout << dilluns << ’ ’ << dimarts << ’ ’ << dimecres << ’ ’ << dijous << ’ ’ << divendres << ’ ’ << dissabte << ’ ’ << diumenge << endl;
treuria per pantalla:
Per forçar els valors del tipus enumerat, podem posar un ’=’ i un enter al costat de cada membre de l’enumerat. Per exemple:
enum tFranjaHora { mati = 1, tarda = 2, nit = 3 };
Així sabem que quan fem
cout << nit << endl;
sortirà un 3 per pantalla. Els nombres que posem no han de ser consecutius, és possible fer:
enum tEstacio { estiu = 0, hivern = 2, primavera = 5, tardor = 9 };
El fet que els nombres signifiquin alguna cosa ja té a veure amb l’ús que se’n faci, l’exemple de tEstacio és força arbitrari.
Exercici 2 Declara un tipus enumerat per emmagatzemar les 4 primeres lletres de l’alfabet de comunicacions aèries (“alfa”, “bravo”, “charlie”, “delta”), i assigna’ls el codi ASCII corresponent a les primeres 4 lletres de l’alfabet en minúscules.
Composició de tipus
Les tuples poden contenir taules i les caselles de les taules poden ser, també, tuples. Això ens permet construir tipus força elaborats.
Constants
Quan es fan programes que fan servir taules i s’escull un tamany màxim per una taula, és fàcil cometre errors. Si posem que una taula tindrà com a molt 500 elements i després ho volem canviar (perquè ens hem adonat que no serà suficient), això pot fer que haguem de canviar molt llocs del programa. Considera el següent programa:
typedef char tCodi[12];
// Llegeix un codi void codi_llegeix(tCodi C) { for (int i = 0; i < 12; i++) cin >> C[i]; }
// Mostra un codi per pantalla void codi_mostra(const tCodi& C) { for (int i = 0; i < 12; i++) cout << C[i]; }
// Copia un codi (to <- from) void codi_copia(const tCodi& to, tCodi& from) { for (int i = 0; i < 12; i++) to[i] = from[i]; }
// Comprova que certs codis siguin iguals bool codis_iguals(const tCodi& C1, const tCodi& C2) { bool trobat = true; int i = 0; while (i < 12 && !trobat) { if (C1[i] != C2[i]) trobat = false; else i++; } return trobat; }
// Mira que no hi hagi codis consecutius repetits int main() { tCodi c, uc, snt;
// Omplim el sentinella: ’000...0’ for (int i = 0; i < 12; i++) snt[i] = ’0’; codi_copia(uc, snt); // Posem el sentinella a ’uc’
bool repes = false; codi_llegeix(c); while (!codis_iguals(c, snt) && !repes) { if (codis_iguals(c, uc)) repes = true; else { codi_copia(uc, c); codi_llegeix(c); } } if (trobat) cout << "Hi "; else cout << "NO hi "; cout << "ha codis consecutius iguals" << endl; }
Aquest programa manipula uns codis de 12 caracters, com per exemple “ax3$mZ=r-9*X”. Els codis poden contenir qualsevol caracter, i s’ha optat per no fer servir strings, sino taules fixes de 12 caselles. El programa mira que en una seqüència de codis, no n’hi hagi 2 d’iguals consecutius (és un programa conegut, però a un nivell més alt).
Exercici 7 Determina a quants llocs apareix el tamany de la taula del tipus tCodi en el programa.
El problema amb posar el tamany de la taula tCodi és que si en algun moment el volem canviar, hem de canviar tots els llocs del programa a on aquest tamany apareix. Per evitar això es fa el següent:
const int TAM_CODI = 12; typedef char tCodi[TAM_CODI];
void codi_llegeix(tCodi C) { for (int i = 0; i < TAM_CODI; i++) cin >> C[i]; }
// Posar TAM_CODI a tot arreu on surti 12...
La constant és com una declaració de variable amb les següents característiques: té un prefix const, i apareix fora de qualsevol funció, a dalt de tot del programa (abans que algú la faci servir).
Es tracta, doncs, de que el valor de la constant estigui només en un punt del programa (que podem canviar còmodament). Si hem de canviar el tamany de la taula tCodi, podem canviar la constant, recompilem i ja està.
Exercici 8
Declara una taula de 1000 paraules (strings) per emmagatzemar una seqüència fent servir una constant MAX_PARAULES. Fes una funció per mostrar la seqüència de paraules per pantalla i fes servir la constant MAX_PARAULES.
Exercici 9
Canvia el programa de l’exemple (sobre els codis) per tal que faci servir la constant TAM_CODI i prova’l a l’ordinador. Assegura’t que entens perfectament aquest programa.
Generated on: 2008-11-17.