Sie sind auf Seite 1von 20

Conjunto (set)

O tipo estruturado set representa, em Pascal, um conjunto de objectos de um dado tipo; O tipo de dados tem por base um tipo simples (enumervel); a Na verdade, um set representa o conjunto de todos os subconjuntos dos elementos do conjunto base.

Diagrama sinttico para o tipo conjunto: a set of tipo simples

Exemplos: type CorPrimaria = ( Vermelho, Amarelo, Azul); Cor = set of CorPrimaria; ConjMinusc = set of a..z; ConjDigitos = set of 0..9; var preto, roxo, castanho, verde :Cor; letras, vogais, consoantes :ConjMinusc; decimal :ConjDigitos;

Notas: O Pascal impe um limte para o nmero mximo de elementos que um set pode o u a conter; O set pode ser manipulado como uma estrutura unica; As operaes habituais esto comtempladas na linguagem Pascal standard. co a Construo de conjuntos: ca verde := [amarelo, azul]; castanho := [vermelho, amarelo, azul]; preto := [ ]; vogais := [a, e, i, o, u];

Diagrama sinttico para construo de conjuntos: a ca

Exemplos de conjuntos (CONSTANTES): [] [7] [a, e, i, o, u] [vermelho .. azul] [a..e, w] [a..a] = [a] [vermelho, succ(amarelo)] [1, 2, 1, 3] = [2, 1, 3] = = [1, 2, 3] [3, 2, 1] conjunto do tipo ConjDigito com 3 elementos conjunto vazio (de qualquer tipo) conjunto singular do tipo ConjDigito conjunto do tipo ConjMinusc com 5 elementos conjunto do tipo Cor com 3 elementos conjunto do tipo ConjMinusc com 6 elementos conjunto singular do tipo ConjMinusc conjunto do tipo Cor com 2 elementos

Operadores sobre conjuntos: 1. Operadores binrios: a reunio (+), interseco (*) e diferena ou complementaridade (-) a ca c Exemplos: [a, b] + [z] [a..d] + [ ] [1, 2, 7, 8, 9] [3, 4, 5, 6, 7, 8] [c,d] [ ] [vermelho, azul, amarelo] [azul] [a, b, z] [a, b, c, d] [7, 8] [] [vermelho, amarelo]

var aa, bb, cc :ConjMinusc; c : char; . . . { inicializar uma variavel do tipo ConjMinusc } aa := [ ]; bb := [ ]; { inserir um elemento num conjunto} aa := a + [a]; { reunir dois conjuntos} aa := a + [b..w]; { inserir todos os elementos do ConjMinusc } for c := a to z do bb := bb + [c]; { complementar de aa em relacao a bb } cc := bb - aa; { retirar um elemento a um conjunto} cc := cc - [y];

2. Relaes binrias: igualdade (=), desigualdade (<>), incluso (` direita, <= e ` co a a a a esquerda, (>=) Exemplos: [a, b] <= [z] [1..9] >= [ ] [1, 2, 7, 8, 9] <> [3, 4, 5, 6, 7, 8] [c,d] = [ ] [azul] <= [vermelho, azul, amarelo] false true true false true

Crivo de Eratstenes o
Problema: Determinar todos os nmeros primos que existem at um dado inteiro u e positivo n. Estratgia: Dado o conjunto de todos os inteiros positivos de 2 a n, e
2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... n

como o nmero 2 primo, retir-lo para um conjunto de primos e retirar todos os seus u e a mltiplos: u
2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... n

Repetir este procedimento at o crivo car vazio: e


3 3 5 5 7 7 5 5 7 7 11 11 9 9 13 13 11 13 11 17 17 15 13 19 19 17 15 23 23 19 17 25 25 21 19 29 31 29 23 21 ... 31 ... ... 23 n ... n

n n

. . .

Tipos de dados: Dado n, usar conjuntos de nmeros inteiros positivos para representar o u crivo (2 a n) e o conjunto de primos resultante do algoritmo. Tipo de dados principal: set of 2..LIMITE;

program eratostenes (input, output); {*Crivo de Eratostenes: determinar todos os primos de 2 a um dado n <= LIMITE*} const LIMITE = 255; type IntPos2 = 2..LIMITE; var crivo, primos :set of IntPos2; n, num, proxnum :IntPos2; procedure abertura(var num:IntPos2); {* indica o proposito do programa e pede um numero positivo no dominio IntPos2, valida-o e devolve *} begin . . . end; begin{ programa principal } abertura(n); crivo := [2..n]; primos := [ ]; proxnum := 2; repeat { procurar o "primeiro elemento" do crivo } while not( proxnum in crivo ) do proxnum := proxnum+1;

{ proxnum encontrado e primo } primos := primos+[proxnum]; { retirar proxnum do crivo bem como todos os seus multiplos } num := proxnum; while num <= n do begin crivo := crivo-[num]; num := num+proxnum; end; until crivo = [ ]; { todos os primos estao no conj. "primos": escrever "primos" } writeln(Nos. primos que existem entre 2 e ,n:3,:); for num:= 2 to n do if num in primos then write( , num:3); end.

Problema: Calcular o nmero de d u gitos distintos de um dado inteiro no-negativo, n a Estratgia: Sucessivamente determinar os d e gitos do nmero dado e contar a quantidade u de d gitos diferentes Algoritmo: Dado um nmero inteiro no-negativo n, enquanto n for no-nulo, u a a retirar prximo d o gito; se for diferente dos d gitos anteriores, incluir no conjunto de digitos distintos e contar mais um digito diferente . . . type IntNNeg = 0..MAXINT; . . . function dig_distintos( num :IntNNeg ):IntNNeg; {* dado num>=0, devolve o no. de digitos distintos que contem *} var conta :IntNNeg; digito :0..9; anteriores :set of 0..9; begin{ dig_distintos } anteriores := [ ];

conta := 0; while num <> 0 do begin { retirar proximo digito e actualizar dividendo } digito := num mod 10; num := num div 10; if not (digito in anteriores) then begin { +1 digito diferente } conta := conta+1; anteriores := anteriores+[digito]; end; end; { while } dig_distintos := conta; end;{ dig_distintos }

Nota: E se o n mero dado for zero? u

. . . conta := 0; repeat { retirar proximo digito e actualizar dividendo } digito := num mod 10; num := num div 10; if not (digito in anteriores) then begin { +1 digito diferente } conta := conta+1; anteriores := anteriores+[digito]; end; until num=0; { repeat } dig_distintos := conta; end;{ dig_distintos }

Problema: (Colorir um mapa) Dadas 4 cores (vermelho, azul, verde e amarelo), e um mapa (relaes de fronteira), atribuir uma cor a cada pa de modo a que co s, pa vizinhos no quem com a mesma cor. ses a

Teorema: 4 cores so sucientes para colorir qualquer mapa plano a Algoritmo para pintar um pa Dados um pa (estepais) e os seus vizinhos s: s directos, Para cada cor (estacor): se estacor no foi usada para um vizinho directo ento: a a escolher estacor para este estepa s se estepa o ultimo pa terminar e escrever soluo s e s, ca caso contrrio, pintar outro pa a s

Tipos de dados Cores:S conjunto (set) com 4 cores Pa registo (set) com s: o nome do pa s conjunto de vizinhos cor a usar Mapa: tabela de pa ses program PintarMapa(input,output); label 99; const NUMMAX = 50; type Indice = 1..NUMMAX; TipoCor = (Branco, Vermelho, Azul, Verde, Amarelo);

Pais = record nome :string(25); vizinhos :set of Indice; cor :TipoCor; end; var lista :array [Indice] of Pais; { mapa } procedure ler_mapa; var i, j, m :Indice; k :1..25; car :char; begin{ ler_mapa } for i:=1 to NUMMAX do begin read(j); { indice de pais para por na tabela } with lista[j] do begin for k:=1 to 25 do read(nome[k]); { construir o conj. de vizinhos deste pais }

vizinhos := [ ]; for m:=1 to NUMMAX do begin read(car); if car=1 {ent~ao e vizinho } then vizinhos := vizinhos+[m]; end;{for m} end;{ with lista[j] } end;{ for i } end;{ ler_mapa } procedure pintar_pais(ind: Indice); var k :Indice; color : TipoCor; corlivre : boolean;

begin{ pintar_pais } with lista[i] do for color := Vermelho to Amarelo do begin corlivre := true; { verificar se vizinho tem esta cor } for k:= 1 to NPAISES do { percorre todos } if (k in vizinhos) and (lista[k].cor = color) then corlivre := false; if corlivre then begin cor := color; if ind = NPAISES then escrever_mapa {e termina!} else pintar_pais(ind+1); { chamada recorrente } { se chegou aqui, esta cor nao serve } cor := Branco; end; { if livre } end;{ for color + with } end;{ pintar_pais }

procedure escrever_mapa; var i :Indice; begin{ escrever_mapa } writeln( Mapa Colorido); writeln; for i:=1 to NUMMAX do with lista[i] do begin write(nome, ); case cor of Branco : writeln( Erro?!!!!!); Vermelho : writeln( vermelho); Azul : writeln( azul); Verde : writeln( verde); Amarelo : writeln( amarelo); end;{ case } end;{ with lista } goto 99; end;{ escrever_mapa }

begin { programa principal } ler_mapa; pintar_pais(1); writeln( Nao foi encontrada solucao para pintar o mapa com , NCORES:1, !!); 99 : {* instrucao nula *} end.

Das könnte Ihnen auch gefallen