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


Segon Parcial Laboratori de programació, Exámenes de Informática

Segundo parcial de laboratorio de programación

Tipo: Exámenes

2018/2019

Subido el 07/02/2019

Arual7
Arual7 🇪🇸

4 documentos

1 / 9

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
ExàmenLP2onparcial2018‐19
Nom…………………………………………….Cognoms………………………………………………………………………….…
NIU……………………………………………..Grup…………….
Grups:41‐1(dm8:30);41‐2(12:30);43‐1(dm10:30);43‐2(12:30);45‐1(17dmsalaB);45‐2(17dmsalaA)
EXERCICI1.(3.pts)Ungrafnodirigitesdiuqueésbipartitsielsseusvèrtexsespodensepararendosconjunts
disjuntsilessevesarestessempreuneixenvèrtexsd’unconjuntambvèrtexsdel’altre.Perexemple:
Persabersiungrafésbipartit,podempintarelsseusvèrtexsded os color siass eg urar‐ no squet ot esles ar estes
sempreuneixenvèrtexsd’uncolorambvèrtexsd’unaltreimaidosvèrtexsdelmateixcolor.Així, l’exemple
anteriorpodriaquedardelasegüentforma:
Podemveurequealgrafdel’esquerratoteslesarestessónentreunnodedecolortaronjaiunnodedecolor
blau.Encanvi, algrafde ladretatenim duesarestesque uneixendosnodes decolorblau ipertant, aquest
grafnoésbipartit.
Perpintar‐loidecidirsiésbipartitonoespotutilitzarqualsevoldelsdosalgorismesquehemvistperrecórrer
ungraf.Durantelrecorreguthauremd’anarassignantalternativamentcolorsalsnodesqueanemrecorrent
(seguintl’exemple anterior,siestemenun nodeblau,elsveïnsquevisitemapartird’aquestnodes’hauran
d’etiquetarcomataronges,ial’inrevés).Sidurantelrecorreguttornemaunnodejavisitat,elnoucolorque
lihauríemd’assignarhadecoincidirambelcolorquejateniadelaprimeravisita.Sinocoincideix,elgrafno
potserbipartit.
pf3
pf4
pf5
pf8
pf9

Vista previa parcial del texto

¡Descarga Segon Parcial Laboratori de programació y más Exámenes en PDF de Informática solo en Docsity!

Exàmen LP 2on parcial 2018‐

Nom……………………………………………. Cognoms………………………………………………………………………….…

NIU…………………………………………….. Grup …………….

Grups: 41‐1(dm 8:30); 41‐2(12:30); 43‐1(dm 10:30); 43‐2(12:30); 45‐1(17 dm salaB); 45‐2(17 dm sala A)

EXERCICI 1. (3. pts) Un graf no dirigit es diu que és bipartit si els seus vèrtexs es poden separar en dos conjunts

disjunts i les seves arestes sempre uneixen vèrtexs d’un conjunt amb vèrtexs de l’altre. Per exemple:

Per saber si un graf és bipartit, podem pintar els seus vèrtexs de dos colors i assegurar‐nos que totes les arestes

sempre uneixen vèrtexs d’un color amb vèrtexs d’un altre i mai dos vèrtexs del mateix color. Així, l’exemple

anterior podria quedar de la següent forma:

Podem veure que al graf de l’esquerra totes les arestes són entre un node de color taronja i un node de color

blau. En canvi, al graf de la dreta tenim dues arestes que uneixen dos nodes de color blau i per tant, aquest

graf no és bipartit.

Per pintar‐lo i decidir si és bipartit o no es pot utilitzar qualsevol dels dos algorismes que hem vist per recórrer

un graf. Durant el recorregut haurem d’anar assignant alternativament colors als nodes que anem recorrent

(seguint l’exemple anterior, si estem en un node blau, els veïns que visitem a partir d’aquest node s’hauran

d’etiquetar com a taronges, i a l’inrevés). Si durant el recorregut tornem a un node ja visitat, el nou color que

li hauríem d’assignar ha de coincidir amb el color que ja tenia de la primera visita. Si no coincideix, el graf no

pot ser bipartit.

Modifica només un dels dos algorismes de recorregut , DFS o BFS (el que prefereixis) perquè ens retorni si un

graf no dirigit és bipartit o no.

A continuació tens un exemple amb la crida a l’algorisme DFS modificat i els codis originals dels dos algorismes

de recorreguts que haureu de modificar.

int main()

int numNodes = 8;

vector nomsNodes;

nomsNodes.resize(numNodes);

nomsNodes = {"0","1","2","3","4","5","6","7"};

vector<vector> arestes;

arestes = { {0,1},{1,2},{1,3},{2,3},{2,4},{6,3},{5,4},{5,6},{5,7},{6,7}};

Graf g(nomsNodes, arestes, false);

queue recorregut;

bool bipartit = g.DFS("4", recorregut);

if (bipartit)

cout << "aquest graf es bipartit" << endl;

else

cout << "aquest graf no es bipartit" << endl;

return 0;

void Graf::BFS(string nodeInicial, queue& recorregut)

vector::iterator itNode =

find(m_nodes.begin(), m_nodes.end(), nodeInicial);

vector visitat;

visitat.resize(m_numNodes, false);

queue pendents;

if (itNode != m_nodes.end())

int pos = distance(m_nodes.begin(), itNode);

visitat[pos] = true;

pendents.push(pos);

while (!pendents.empty())

int nodeActual = pendents.front();

pendents.pop();

recorregut.push(m_nodes[nodeActual]);

for (int col=0; col<m_numNodes; col++)

if((m_matriuAdj[nodeActual][col]!=0)&& (!visitat[col]))

pendents.push(col);

visitat[col] = true;

void Graf::DFSRec(int pos, queue& recorregut, vector& visitat)

{ visitat[pos] = true;

recorregut.push(m_nodes[pos]);

for (int col=0; col<m_numNodes;col++)

if ((m_matriuAdj[pos][col]!=0) &&(!visitat[col]))

DFSRec(col, recorregut, visitat);

Si modifiquen DFS:

bool Graf::DFSRec(int pos, queue& recorregut, vector& visitat, vector& color) { bool bipartit = true; int nou_color = (color[pos] + 1) % 2; visitat[pos] = true; recorregut.push(m_nodes[pos]); // Recur for all the vertices adjacent // to this vertex int col = 0; while ((col < m_numNodes)&&(bipartit)) { if (m_matriuAdj[pos][col] != 0) { if (!visitat[col]) { color[col] = nou_color; bipartit = DFSRec(col, recorregut, visitat,color); } else { if (color[col] != nou_color) bipartit = false; } } col++; } return bipartit; } bool Graf::DFS(string nodeInicial, queue& recorregut) { bool bipartit; vector::iterator itNode = find(m_nodes.begin(), m_nodes.end(), nodeInicial); vector visitat; visitat.resize(m_numNodes, false); vector color; color.resize(m_numNodes, 2); if (itNode != m_nodes.end()) { int pos = distance(m_nodes.begin(), itNode); color[pos] = 0; bipartit = DFSRec(pos, recorregut, visitat,color); } return bipartit; }

EXERCICI 2. (2.5 pts) A partir de la classe de TreeRB donada a classe volem que implementeu el mètode

esborra, que esborrarà un node de l’arbre RedBlack d’un node.

void esborra(const T& val);

Per esborrar primer haurem de cercar el valor i un cop trobat el node a l’arbre, esborrar el node. Per

simplificar‐ho només implementarem un cas particular i per la resta cridarem al mètode esborraAltresCasos()

que suposarem que ja tenim implementat.

El cas que implementarem és quan el node esborrat sigui una fulla negra i no sigui l’arrel. El seu germà també

ha de ser negre i a més tenir com a mínim el seu fill dret vermell. El fill esquerre del germà no ens importa ni

el color ni que existeixi. Quan es compleixen aquestes condicions farem el següent:

a) Canviar el color del fill dret del germà a negre. L’altre fill (si existeix) no el toquem.

b) Esborrar el node.

c) Fer rotació esquerra del seu pare. Penseu que això ho fa el mètode rotaEsq(pnode) que ja teniu

implementat.

Si no es compleixen aquestes condicions cridarem al mètode: void esborraAltresCasos(TreeRB*& node);

passant l’apuntador del node que volem esborrar.

Per fer aquest exercici és possible que necessiteu implementar el mètode TreeRB* germa(); que cridat

des d’un node ens retorni un apuntador al seu germà. Aquest mètode no el teniu implementat i l’hauríeu

d’afegir vosaltres en cas que el necessiteu utilitzar. També tingueu en compte que treballeu amb apuntadors

i no podem accedir al contingut d’un apuntador que apunti a NULL.

template class TreeRB { public: TreeRB(); TreeRB(string nomFitxer); TreeRB(const TreeRB& t); ~TreeRB(); bool isLeave() const { return ((m_left == NULL) && (m_right == NULL)); } bool cerca(const T& val, TreeRB& valTrobat); bool esFillDret(); bool esFillEsq(); void insert(T& val); void esborra(const T& val); private: enum COLOR { RED, BLACK }; TreeRB m_left; TreeRB* m_right; TreeRB* m_father; T* m_data; COLOR m_color; void rotaEsq(TreeRB* pNode); void rotaDreta(TreeRB* pNode); _void esborraAltresCasos(TreeRB& node);_* };

EXERCICI 3. (1.5 pts) Donada la classe Heap vista a classe volem afegir el mètode preordre que escrigui els

valors dels nodes del heap en preordre o no escrigui res si el heap està buit.

template class Heap { public: Heap() { m_act = ‐1; m_max = 0; }; Heap(Heap& h); ~Heap() {}; Heap& operator=(const Heap& h); T& min() { return &(m_data[0]); } int mida() { return m_act; } void read(string nomFitxer); friend std::ostream& operator<<(std::ostream& out, const Heap& h); void insert(T el); void delMin(); void preOrdre(); private: vector m_data; int m_max; //indica nombre total de nodes: array va de 0 a m_max‐ 1 int m_act; //indica posicio ultima ocupada: inicialment ‐ 1 int pare(int pos) const { return ((pos ‐ 1) / 2); } int fillEsq(int pos) const { return ((2 * pos) + 1); } int fillDret(int pos) const { return ((2 * pos) + 2); } void intercanvia(int pos1, int pos2) { T aux = m_data[pos1]; m_data[pos1] = m_data[pos2]; m_data[pos2] = aux;} std::ostream& printRec(std::ostream& out,int pos,int n) const; void descendir(int pos); };

SOLUCIO

template void Heap::preOrdre() { if (m_act > ‐1) { preOrdreRec(0); cout << endl; } } template void Heap::preOrdreRec(int pos) { if (pos <= m_act) {//Pintem arbre preOrdre cout << m_data[pos] << " : "; preOrdreRec(fillEsq(pos)); preOrdreRec(fillDret(pos)); } }

EXERCICI 4. (3 pts) Implementeu els següents exercicis en Python.

a) Volem crear un diccionari que ens permeti saber el nº de vegades que apareix cada paraula en un fitxer

de text. Hem d’escriure una funció en Python que rebi com a paràmetre el nom d’un fitxer i retorni un

diccionari que contingui, per cada paraula que apareix al fitxer, quantes vegades es repeteix.

SOLUCIÓ

def creaDiccionari(nomFitxer):

diccionari = dict()

fitxer = open(nomFitxer, "rt" )

for linia in fitxer:

paraules = linia.split()

for paraula in paraules:

if paraula in diccionari:

diccionari[paraula] = diccionari[paraula] + 1

else :

diccionari[paraula] = 1

return diccionari

b) Escriure una funció en Python que rebi com a paràmetre un diccionari com el que es crea a l’apartat

anterior i retorni una llista amb totes les paraules que es repeteixen més d’un determinat nombre de

vegades (valor que també es passa com a paràmetre a la funció).

SOLUCIÓ

def filtreParaules(diccionari, nRepeticions):

llista = [paraula for (paraula, freq) in diccionari.items() if freq >=

nRepeticions]

return llista