E.T.S.I. Telecomunicación. Int. Comp. Sexta Práctica Sexta Práctica Curso 2004-2005 Introducción a los Computadores 1o A de Ingenierı́a Técnica de Telecomunicación (Sistemas Electrónicos) UNIVERSIDAD DE MÁLAGA E.T.S.I. TELECOMUNICACIÓN Un conjunto de números enteros puede implementarse mediante arrays de registros. Cada componente del array contendrá un número entero y un campo booleano que indique si esa posición del array (y el número que en ella se guarda) es o no válida. En base a esta estructura de datos, se debe implementar en C++ y probar cada una de las siguientes operaciones sobre conjuntos de números enteros. /* Implementación del tipo CONJUNTO con arrays */ CONST N MaxElementos = 100 TIPOS REGISTRO TElemento Z dato B libre FINREGISTRO TElemento ConjuntoZ[1..MaxElementos] ALGORITMO Crear(S ConjuntoZ a) // Inicializa a VAR N i INICIO PARA i=1 HASTA MaxElementos HACER a[i].libre = VERDADERO FIN FIN Crear ALGORITMO N Cardinalidad(E ConjuntoZ a) // Devuelve número de elementos de a VAR N i, cuenta INICIO cuenta = 0 PARA i=1 HASTA MaxElementos HACER SI NO(a[i].libre) ENTONCES cuenta = cuenta+1 FINSI FIN DEVOLVER cuenta FIN Cardinalidad 1 E.T.S.I. Telecomunicación. Int. Comp. Sexta Práctica ALGORITMO B Pertenece(E ConjuntoZ a; E Z elem) // Devuelve VERDADERO si "elem" está en a VAR N i; B esta INICIO esta = FALSO; i=1 MIENTRAS (NO esta) Y (i<=MaxElementos) HACER SI (NO a[i].libre) Y (a[i].dato==elem) ENTONCES esta = VERDADERO FINSI i = i+1 FINMIENTRAS DEVOLVER esta FIN Pertenece ALGORITMO B Incluido(E ConjuntoZ a, b) // Devuelve VERDADERO si cada elemento de b está en a VAR N i; B vale INICIO vale = VERDADERO i = 1 MIENTRAS vale Y (i<=MaxElementos) HACER SI NO(b[i].libre) Y NO Pertenece(a, b[i].dato) ENTONCES vale = FALSO FINSI i = i+1 FINMIENTRAS DEVOLVER vale FIN Incluido ALGORITMO B Incluir(ES ConjuntoZ a; E Z elem) // Incluye "elem" en a si no está ya. Devuelve // FALSO si no hay sitio para el nuevo elemento VAR N i; B vale INICIO vale = VERDADERO SI NO Pertenece(a, elem) ENTONCES // evita elementos repetidos i = 1 MIENTRAS NO a[i].libre Y (i<=MaxElementos) HACER i = i+1 FINMIENTRAS SI i<=MaxElementos ENTONCES // hay sitio a[i].dato = elem a[i].libre = FALSO SINO vale = FALSO FINSI FINSI DEVOLVER vale FIN Incluir 2 E.T.S.I. Telecomunicación. Int. Comp. Sexta Práctica ALGORITMO Excluir(ES ConjuntoZ a; E Z elem) // Excluye "elem" si está en a VAR N i; B encontrado INICIO encontrado = FALSO; i = 1 MIENTRAS NO encontrado Y (i<=MaxElementos) HACER SI NO(a[i].libre) Y (a[i].dato==elem) ENTONCES encontrado = VERDADERO a[i].libre = VERDADERO FINSI i = i+1 FINMIENTRAS FIN Excluir /* Inicializa "a" con los elementos de "b". */ ALGORITMO Duplicar(S ConjuntoZ a; E ConjuntoZ b) INICIO a = b // se copia toda la estructura de datos FIN Duplicar /* * Une dos conjuntos. */ ALGORITMO Union(E ConjuntoZ a, b; S ConjuntoZ u) VAR N j=1; B hay_sitio INICIO Duplicar(u, a) // inicializa "u" con "a" MIENTRAS j<=MaxElementos HACER SI NO b[j].libre Y NO Pertenece(u, b[j].dato) ENTONCES hay_sitio = Incluir(u, b[j].dato) SI NO hay_sitio ENTONCES Escribir("Espacio insuficiente al unir") FINSI FINSI j = j+1 FINMIENTRAS FIN Union /* * Intersecta dos conjuntos. */ ALGORITMO Interseccion(E ConjuntoZ a,b;S ConjuntoZ i) VAR N j=1 INICIO Duplicar(i, a) // inicializa "i" con "a" MIENTRAS j<=MaxElementos HACER SI NO a[j].libre Y NO Pertenece(b, a[j].dato) ENTONCES Excluir(u, a[j].dato) FINSI j = j+1 FINMIENTRAS FIN Interseccion 3