Antes de iniciarmos nosso estudo sobre manipulao de conjuntos em Pascal, vamos analisar os tipos de dados da linguagem. Esta anlise ser importante para voc entender a forma de trabalharmos com conjuntos no free pascal. Vamos l ento?
Tipos de Dados
Basicamente temos dois tipos de dados na linguagem Pascal
Este tipos de dados pode ser divididos em: 1. Primitivos ou Elementares 2. Compostos ou Estruturados
1. Tipos de dados primitivos: no existe uma estrutura sobre seus valores Ex: boolean, integer, char, etc... 2. Tipos de dados estruturados: existe uma relao estrutural intrnseca entre seus valores Ex: arrays(vetores), registros e conjuntos
2. Conjuntos
3. Registros ( ser visto no Segundo semestre)
Interessa-nos estudar agora os conjuntos (Tipo Estruturado Conjunto), os demais assuntos sero vistos no prximo semestre. Contudo fique a vontade se deseja estudar estes conceitos antecipadamente.
Exemplos: [1,3,5,7,9,11,13] [3..7] [3,4,5,6,7] ['A'..'Z'] [gol,passat,fusca] [] - alguns inteiros - inteiros entre 3 e 7 (ou seja 3,4,5,6,7) - equivalente ao anterior - caracteres alfabticos maisculos - marcas de carro - conjunto vazio
TIPO SET
A linguagem Pascal possui um tipo de dado pr-definido capaz de armazenar, sem indexaes, elementos de um conjunto, permitindo, com variveis deste tipo, a realizao de unies, intersees e diferenas como definido na matemtica, e a verificao do fato de que um dado elemento est ou no armazenado na varivel.
Declarao
A forma geral para definio de conjuntos :
Exemplos 02:
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; Construo de conjuntos: verde := [amarelo, azul]; castanho := [vermelho, amarelo, azul]; preto := [ ]; vogais := [a, e, i, o, u];
Exemplos 03:
Type ingredientes = (morango, banana, napolitano, chocolate, nata, cobertura); sorvete = set of ingredientes; var sundae, casquinha : sorvete; {referncias e operaes } casquinha:= [morango, cobertura]; sundae:= casquinha + [banana, chocolate]; sundae:= sundae - [chocolate];
ATENO: Do mesmo modo que variveis de tipos definidos pelo usurio (Type), variveis do tipo set no podem ser "lidas" nem "escritas". O armazenamento de elementos numa varivel do tipo set s pode ser feito, portanto, atravs de um comando de atribuio, podendo ser utilizada uma das seguintes formas: 1. Enumerao explcita dos elementos entre colchetes: Conj := [1, 2, 3, 4, 5, 6, 7, 8, 9]; 2. Especificao, entre colchetes, de uma faixa do tipo base: Conj := [1..9]; 3. Combinao das formas anteriores: OutroConj := [1..9, 21..30, 41, 43, 45, 47, 49];. O conjunto vazio tambm pode ser "armazenado" numa varivel do tipo set. Vazio := [ ];
+ (unio)
O operador unio representado pelo sinal '+'. A unio entre dois conjuntos resulta num terceiro conjunto, constitudo dos elementos dos dois conjuntos. Exemplo: a := [1,2,3]; b := [2,3,4,5]; c := a+b; resulta c = [1,2,3,4,5] ex: [a, b] + [z] = [a, b, z]
* (interseo)
Representada pelo sinal '*'. A interseco entre dois conjuntos, resulta num terceiro conjunto, constitudo pelos elementos que fazem parte tanto de um como do outro conjunto. Exemplo: a := [1,2,3]; b := [2,3,4,5]; c := a*b; resulta c = [2,3]
- (diferena).
Representada pelo sinal '-'. Retorna um conjunto, cujos elementos esto num conjunto mas no no outro. a := [1,2,3,6]; b := [2,3,4,5]; c := a-b; resulta c = [1,6] c := b-a; resulta c = [4,5]
ex: [vermelho, azul, amarelo] [azul] = [vermelho, amarelo]
O operador in
O operador in verifica se um elemento do tipo base est armazenado no conjunto. Este operador muito utilizado para que o programa se proteja de entradas de dados indesejveis. Por exemplo, se uma varivel Letra, do tipo char deve receber uma letra, pode-se utilizar uma estrutura como a seguinte: repeat readln(Letra); until Letra in ['a'..'z', 'A'..'Z']; O operador in tambm utilizado em expresses lgicas de comandos if quando o nmero de valores possveis para a varivel que definir a deciso no pequeno. Por exemplo, pretendendo-se verificar se uma varivel Letra uma vogal, pode-se usar: if UpCase(LETRA) in ['A', 'E', 'I', 'O', 'U']; then ...
Operadores relacionais:
a = b todos elementos esto em ambos conjuntos a <> b alguns ou todos elementos no esto em ambos conjuntos
ex: [1, 2, 7, 8, 9] <> [3, 4, 5, 6, 7, 8] ser true
a IN b a um elemento do conjunto b
do mesmo tipo base do conjunto b)
Exemplo de cdigos:
Exemplo 01: program Campeonato_Baiano; //tipo baianao que um tipo conjunto o qual os valores possveis(tipo base) esto //Definidos como sendo Bahia, Catuense, Camacari, Vitria, Juazeiro, Ipitanga TYPE Baianao = SET OF (Bahia, catuense, Camacari , Vitoria, Juazeiro, Ipitanga); //variveis VAR GrupoA, GrupoB : Baianao; Begin //Valores podem ser atribudos por: GrupoA := [Bahia, Catuense, Camacari]; GrupoB := [Vitoria..Ipitanga]; End.
Var tecla : Char; Begin ClrScr; Repeat Read(kbd,tecla); Write(tecla); Until tecla IN ['s','S','n','N']; End. Exemplo 03: Program Exemplo03; Uses CRT; {l uma tecla e diz se nmero, letra maiscula ou letra minscula at que se leia um '?'} Type smbolos = Set of Char; Var Maiusc, Minusc, Nmeros : smbolos; tecla : char; Begin ClrScr; Maiusc := ['A'..'Z']; Minusc := ['a'..'z']; Numeros := ['0'..'9']; Repeat Read(kbd,tecla); If tecla IN Maiusc Then Writeln('MAIUSCULA') Else if tecla IN minusc Then Writeln('minuscula') else if tecla IN numeros Then Writeln('numero') else Writeln('nada'); Until tecla = '?'; End.
Exemplo 04: Program Exemplo04; Uses CRT; {Programa que conta o nmero de vogais, nmero de consoantes e de brancos numa frase lida do teclado} Type smbolos = set of char; Var Alfabeto, vogais, consoantes : smbolos; frase : string[50]; v,c,b,x : integer; Begin Vogais:=['a','e','i','o','u','A','E','I','O','U']; alfabeto:=['a'..'z']+['A'..'Z']; consoantes:=alfabeto-vogais; Clrscr; Write('Digite uma frase --> '); Readln(frase); b:=0;c:=0;v:=0; (* a funo length() devolve o nmero de caracteres que o parmetro tem *) For x:=1 to length(frase) do if frase[x] in vogais then v:=v+1 else if frase[x] in consoantes then c:=c+1 else if frase[x] = ' ' then b:=b+1; Writeln; writeln(b,' brancos'); Writeln(c,' consoantes'); Writeln(v,' vogais'); End.
Exemplo final
O objetivo do exemplo um programa que permita sorteio eletrnico de um bingo. Para isto,ele utiliza um conjunto Urna contendo as "pedras" de 1 (um) a 75 (setenta e cinco), sendo o sorteio realizado pela funo Random dentro de uma estrutura de repetio para que uma pedra no seja sorteada mais de uma vez. Quando o sorteio realizado, a "pedra" sorteada retirada da urna, utilizando-se para isto a diferena entre conjuntos.
program Bingo; type TPedras = 1..75; var Urna : set of TPedras; NumPedra, Pedra : integer; Bateu : char; begin Urna := [1..75]; NumPedra := 0; Bateu := 'N'; Randomize; writeln('Pedras sorteadas : '); while (Urna <> []) and (Bateu <> 'S' ) do begin writeln('Alguem bateu? (S/N)'); readln(Bateu); Bateu := UpCase(Bateu); if Bateu <> 'S then begin repeat Pedra := Random(75) + 1; until Pedra in Urna; writeln('Pedra sorteada: ', Pedra ); NumPedra := NumPedra + 1; writeln('Numero de pedras: ', NumPedra); Urna := Urna - [Pedra]; end; //fim do if end; //fim do while end. // fim programa
REFERNCIAS:
http://www.nuperc.unifacs.br/Members/thales.castro/arquivos/aulas/TiposDeDados.ppt http://oprofessorleandro.files.wordpress.com/2009/08/apost-turbo-pascal-ampliada1.doc