Escolar Documentos
Profissional Documentos
Cultura Documentos
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