VinBR

LP 19/10/2011

Oct 27th, 2011
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.51 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. // Vamos falar hoje sobre TADs
  9.  
  10. Como definir um tipo?
  11.  
  12. É uma descrição de um objeto feito através de seus atributos.
  13.  
  14. Porém um tipo "pessoa" é complexo demais para se listar uma a uma cada possível caracteristica.
  15.  
  16. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  17.  
  18. Assim um TAD é uma tipo simplificado, voltado para um conjunto de características juntamente com um conjunto de capacidades.
  19.  
  20. Como definir um conjunto em c?
  21.  
  22. seja um .h:
  23.  
  24. #ifndef SET H
  25. #define SET H
  26.  
  27. #define INTBITS 32
  28.  
  29. typedef struct
  30. {
  31. unsigned* vector;
  32. unsigned size;
  33. } set;
  34.  
  35. void new(set*, unsigned);
  36. void add(set*, unsigned);
  37. void del(set*, unsigned);
  38. int contains(set*, unsigned);
  39.  
  40. #endif
  41.  
  42. Agora seja o .c:
  43.  
  44. #include <stdlib.h>
  45. #include "set.h"
  46.  
  47. void new(set* s, unsigned capacity)
  48. {
  49. s->vector = calloc(1+capacity/INT_BITS, sizeof(unsigned));
  50. s->size = capacity;
  51. }
  52.  
  53. void add(set* s, unsigned e)
  54. {
  55. unsined index = e/INT_BITS;
  56. unsined offset = e%INT_BITS;
  57. unsined bit = 1 << offset;
  58. s -> vector [index] |= bit;
  59. }
  60.  
  61. int contains(set* s, unsigned e)
  62. {
  63. unsined index = e/INT_BITS;
  64. unsined offset = e%INT_BITS;
  65. unsined bit = 1 << offset;
  66. return s->vector[index] & bit;
  67. }
  68.  
  69. // Assim terminamos nosso TAD de unsined integers.
  70.  
  71. (um mapa de bits que é o que estamos fazendo acima é um arranjo de bits, onde 0 indica que o elemento de seu indice não está presente)
  72.  
  73. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  74.  
  75. Em C não há meios de se esconder detalhes de implementação do usuário.
  76. Ex: eu posso chamar set s; s.size para saber o tamanho, ou acessar o vector diretamente também.
  77.  
  78. Qual o problema disso e porque pode ser vantajoso esconder esses detalhes do usuário e permitir apenas o uso das funções declaradas para interface?
  79.  
  80. Supondo que eu queria mudar a implementação, se eu não tiver certeza de que nenhum dos meus usuários precisa dos detalhes de implementação antigas,
  81. eu não poderei apagar esses detalhes, e troca-los por sistemas mais eficientes, em outras palavras, eu fico acorrentado a detalhes pouco importantes.
  82.  
  83. Assim um TAD é um pouco pior que classes e interfaces pois ele não é capaz de esconder estes detalhes.
  84.  
  85. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86.  
  87. Existe um modo de se mudar a interface ( o .h ) adicionando mais detalhes a interface sem alterar a interface original?
  88. Existem linguagens que permitem extender a interface com outra, em java isso é o extend por exemplo.
  89.  
  90. SML Também.
  91. ex:
  92.  
  93. signature SET =
  94. sig
  95. type set
  96. val new : set
  97. val add : set -> int -> set
  98. val contains : set -> int -> bool
  99. val del : set -> int -> set
  100. end ;
  101.  
  102. // note que o :> é o implements do SML.
  103. structure FunSet :> SET =
  104. struct
  105. type set = int -> bool
  106. val new = fn x => false
  107. fun add f i = fn x => if x = i then true else f x
  108. fun contains f i = f i
  109. fun del f i = fn x => if x = i then false else f x
  110. end ;
  111.  
  112. // Essa implementação apesar de muito elegante é muito ineficiente né, temos de concordar.
  113.  
  114. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  115.  
  116. // nao sei bem pra q isso abaixo se eu for usar eu fico feliz da silva =]
  117. structure S = FunSet ;
  118.  
  119. val s = S.new ;
  120.  
  121. val s = S.add
  122.  
  123. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  124.  
  125. bitSet.py:
  126.  
  127. INT_BITS = 32
  128.  
  129. def getIndex (element) :
  130. index = element / INT_BITS
  131. offset = element % INT_BITS
  132. bit = << offset
  133. return (index, bit)
  134.  
  135. // Espaço de nomes é um sobrenome para os nomes definidos por exemplo em uma determinada classe, assim para referencialos uso o "nome da classe.nome do objeto"
  136.  
  137. class Set:
  138. def init (self, capacity):
  139. self.vector = range (1+capacity/INT_BITS)
  140. for i in range(len(self.vector)):
  141. self.vector[i] = 0
  142.  
  143. def add (self, e):
  144. (index, bit) = getIndex(e)
  145. self.vector[index] |= bit
  146.  
  147. def delete (self, e):
  148. (index, bit) = getIndex(e)
  149. self.vector[index] &= ~bit
  150.  
  151. def contains (self, e):
  152. (index, bit) = getIndex(e)
  153. return self.vector[index] & bit
  154.  
  155. // Acabamos de criar uma tabela inteligente, formada por um conjunto de funções que opera sobre o próprio tipo Set
  156. // E ela consegue enchergar o próprio escopo.
  157.  
  158. pode-se fazer quas qualquer coisa com essa tabela.
  159.  
  160. s = Set(60)
  161. s.add(4)
  162. print "Contem 4?", s.contains(4)
  163. print "Contem 5?", s.contains(5)
  164. s.delete(4)
  165. print "Contem 4?", s.contains(4)
  166.  
  167. // Em pyton:
  168. // s.vector[0] é o mesmo que: s["vector"][0]
  169.  
  170. pode-se acessar membros internos de um objeto, assim como em c. na forma que demonstrei acima.
  171.  
  172. s.vector[0]=2, é uma operação válida.
  173.  
  174.  
  175. outro arquivo:
  176.  
  177. from Set import INT_BITS, getIndex, Set
  178.  
  179. def errorAdd(self, e):
  180. if(e > self.capacity):
  181. raise IndexError("Arghhhh")
  182. else:
  183. (index, bit) = getIndex(element)
  184. self.vector[index] |= bit
  185. print "Sucesso!"
  186.  
  187. Set.add = errorAdd
  188. // note que isso é mudar a implementação de uma das funções de Set!
  189. s = Set(33)
  190. s.add(32)
  191. s.add(33)
  192. (repare que error Add recebe dois parâmetros, no caso um deles seria o próprio s)
  193.  
  194. def fill(set, b, e, s):
  195. for i in range(b, e, s):
  196. set.add(i)
  197.  
  198. // com a funçào acima pode-se fazer:
  199. fill(s, 1, 10, 3)
  200.  
  201. class Num:
  202. def init (self, num):
  203. self.n = num
  204. def add(self, num):
  205. self.n += num
  206. def str (self):
  207. return str(self.n)
  208.  
  209. é possivel fazer isso:
  210. n = Num(4)
  211. n.add(5)
  212. fill(n, 1, 10, 3)
  213.  
  214. Sim, assim estarei somando a n os elementos de 1 a 9 pulando de 3 em 3.
  215.  
  216. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  217.  
  218. java:
  219. // Note que esse E é um template, chamado de gerics em java
  220. public interface Set<E>
  221. {
  222. void add(E element);
  223. void del (E element);
  224. boolean contain (E element);
  225. }
  226.  
  227. // ele mostrou que aqui diferente de python temos como colocar variaveis privadas, e protegidas.
  228. // em java essas tabelas são estaticas e portanto nào mutaveis como em python
  229.  
  230. public class BoudedBitSet...
  231.  
  232. em qualquer situação em que se deseja uma classe, pode-se passar um filho dessa classe. Esse é um principio de num sei quem.
  233.  
  234. para se modificar uma função de uma classe, voce pode re-escrever a classe, fazendo-a herdar todas as classes de Set, e re-implementando as funções que forem do seu
  235. interesse.
  236.  
  237. é analogo ao que foi feito em python com uma atribuição de função, dentro da tabela da "classe" (acho q em python isso nao chama classe)
  238.  
  239. Assim se eu busco na nova classe por um errorset que é filho de set, por uma função que não está lá minha busca é delegada para set, pois provavelmente é lá
  240. que encontrarei a função.
  241.  
  242. // a aula acabou aqui.
  243.  
  244. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Advertisement
Add Comment
Please, Sign In to add comment