Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Apunts Tuples 2, Exámenes selectividad de Informática

Asignatura: Fonaments d'Informàtica, Profesor: Pau Fernandez Duran, Carrera: Enginyeria de Sistemes Audiovisuals, Universidad: UPC

Tipo: Exámenes selectividad

Antes del 2010

Subido el 04/12/2008

dushka
dushka 🇪🇸

5

(1)

10 documentos

1 / 5

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Apunts Fonaments d’Informàtica (c) 2008, Pau Fernández 1
Tuples 2
Còpia de tuples i taules
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];
Tipus enumerats
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 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é:
La paraula reservada enum.
El nom del tipus, seguint la convenció per a noms de C++.
pf3
pf4
pf5

Vista previa parcial del texto

¡Descarga Apunts Tuples 2 y más Exámenes selectividad en PDF de Informática solo en Docsity!

Tuples 2

Còpia de tuples i taules

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];

Tipus enumerats

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é:

  • La paraula reservada enum.
  • El nom del tipus, seguint la convenció per a noms de C++.
  • Una llista entre claus de noms (també seguina la convenció de C++), separats per comes, de tots els elements necessaris.

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).

Correspondència enters-enumerat

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:

  • Es declara una constant global (a la mateixa part del programa a on es declaren els tipus), i aquesta constant llavors es fa servir en comptes del nombre directe a tot arreu, així:

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.