Advertisement
paulogp

Conjuntos (v. 1.0.5)

Aug 7th, 2011
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 9.96 KB | None | 0 0
  1. { paulogp }
  2. { mac os 7 }
  3. program Ada29p;
  4.  
  5. uses
  6.     MemTypes, QuickDraw, OSIntf;
  7.  
  8. type
  9.     TipoApontElementoLista = ^TipoElementoLista;
  10.     TipoElementoLista = record
  11.                       valor: real;
  12.                       proximo: TipoApontElementoLista;
  13.                      end;
  14.  
  15. var
  16.     i: integer;
  17.  
  18. procedure ListaNula(var Lista: TipoApontElementoLista);
  19. begin
  20.     Lista:= nil;
  21. end;
  22.  
  23. function ExisteValorLista(Lista: TipoApontElementoLista; valor: real): boolean;
  24. begin
  25.     if Lista <> nil then
  26.     begin
  27.         if valor = Lista^.valor then ExisteValorLista:= true else
  28.         ExisteValorLista:= ExisteValorLista(Lista^.proximo, valor);
  29.     end
  30.     else ExisteValorLista:= false;
  31. end;
  32.  
  33. procedure InsereValorOrdenadoLista3(var Lista: TipoApontElementoLista; valornovo: real);
  34. var
  35.     ListaAux, ListaAnt, ListaInd: TipoApontElementoLista;
  36.     localizado: boolean;
  37.  
  38. begin
  39.     ListaAnt:= nil;
  40.     ListaAux:= Lista;
  41.     localizado:= false;
  42.     while not localizado and (ListaAux <> nil) do
  43.     if ListaAux^.valor > valornovo then localizado:= true else
  44.     begin
  45.         ListaAnt:= ListaAux;
  46.         ListaAux:= ListaAux^.proximo;
  47.     end;
  48.     new(ListaInd);
  49.     ListaInd^.valor:= valornovo;
  50.     ListaInd^.proximo:= ListaAux;
  51.     if ListaAnt = nil then Lista:= ListaInd else ListaAnt^.proximo:= ListaInd;
  52. end;
  53.  
  54. procedure ContaValorLista(Lista: TipoApontElementoLista; var contador: integer);
  55. begin
  56.     contador:= 0;
  57.     while Lista <> nil do
  58.     begin
  59.         contador:= contador + 1;
  60.         Lista:= Lista^.proximo;
  61.     end;
  62. end;
  63.    
  64. procedure ImprimeValorLista(Lista: TipoApontElementoLista);
  65. begin
  66.     while Lista <> nil do
  67.     begin
  68.         write(Lista^.valor: 2, ' ');
  69.         Lista:= Lista^.proximo;
  70.     end;
  71. end;
  72.  
  73. function RemovePrimeiroValorLista(var Lista: TipoApontElementoLista; var valorremovido: real): boolean;
  74. begin
  75.     if Lista = nil then RemovePrimeiroValorLista:= false else
  76.     begin
  77.         Lista:= Lista^.proximo;
  78.         valorremovido:= Lista^.valor;
  79.         dispose(Lista);
  80.     end;
  81. end;
  82.  
  83. procedure RemoveValorLista(var Lista: TipoApontElementoLista; valorremovido: real);
  84. var
  85.     ListaAux: TipoApontElementoLista;
  86.  
  87. begin
  88.     if Lista <> nil then
  89.     begin
  90.         if Lista^.valor = valorremovido then
  91.         begin
  92.             ListaAux:= Lista;
  93.             Lista:= Lista^.proximo;
  94.             if Lista <> nil then dispose(Lista) else
  95.             begin
  96.                 Lista:= ListaAux;
  97.                 Lista:= nil;
  98.             end;
  99.         end;
  100.         if Lista <> nil then RemoveValorLista(Lista^.proximo, valorremovido);
  101.     end;
  102. end;
  103.  
  104. function RemoveLista(var Lista: TipoApontElementoLista): boolean;
  105. var
  106.     ListaAux: TipoApontElementoLista;
  107.  
  108. begin
  109.     if Lista = nil then RemoveLista:= false else
  110.     while Lista <> nil do
  111.     begin
  112.         ListaAux:= Lista;
  113.         dispose(ListaAux);
  114.         Lista:= Lista^.proximo;
  115.     end;
  116. end;
  117.  
  118. procedure ReuniaoListas(ListaA, ListaB: TipoApontElementoLista; var ListaC: TipoApontElementoLista);
  119. begin
  120.     while ListaA <> nil do
  121.     begin
  122.         InsereValorOrdenadoLista3(ListaC, ListaA^.valor);
  123.         ListaA:= ListaA^.proximo;
  124.     end;
  125.     while ListaB <> nil do
  126.     begin
  127.         if not ExisteValorLista(ListaC, ListaB^.valor) then
  128.             InsereValorOrdenadoLista3(ListaC, ListaB^.valor);
  129.         ListaB:= ListaB^.proximo;
  130.     end;
  131. end;
  132.  
  133. procedure InterseccaoListas(ListaA, ListaB: TipoApontElementoLista; var ListaC: TipoApontElementoLista);
  134. begin
  135.     while (ListaA <> nil) and (ListaB <> nil) do
  136.     begin
  137.         if ExisteValorLista(ListaA, ListaB^.valor) then
  138.             InsereValorOrdenadoLista3(ListaC, ListaB^.valor);
  139.         ListaA:= ListaA^.proximo;
  140.         ListaB:= ListaB^.proximo;
  141.     end;
  142. end;
  143.  
  144. procedure DiferencaListas(ListaA, ListaB: TipoApontElementoLista; var ListaC: TipoApontElementoLista);
  145. begin
  146.     while (ListaA <> nil) and (ListaB <> nil) do
  147.     begin
  148.         if not ExisteValorLista(ListaA, ListaB^.valor) then
  149.             InsereValorOrdenadoLista3(ListaC, ListaB^.valor);
  150.         ListaA:= ListaA^.proximo;
  151.         ListaB:= ListaB^.proximo;
  152.     end;
  153. end;
  154.  
  155. {* design da página *}
  156. {** coloca o título na janela **}
  157. procedure Titulo(x: integer; nome: string);
  158. begin
  159.     clearscreen;
  160.     i:= 0;
  161.     gotoxy(x, 2);
  162.     writeln(nome);
  163.     gotoxy(x, 3);
  164.     for i:= 1 to Length(nome) do write('~');
  165. end;
  166.  
  167. {** desenha uma barra informativa **}
  168. procedure Barra(nome: string);
  169. begin
  170.     gotoxy(2, 23);
  171.     for i:= 1 to 78 do write('-');
  172.     gotoxy(2, 24);
  173.     writeln(nome);
  174. end;
  175.  
  176. {** alinha os menus **}
  177. procedure alinha(y: integer; nome: string);
  178. begin
  179.     gotoxy(30, y);
  180.     write(nome);
  181. end;
  182.  
  183. {** obtem a opcao válida do utilizador **}
  184. procedure opcao(x, y: integer; var tecla: string);
  185. begin
  186.     gotoxy(x, y);
  187.     write('Opcao: ');
  188.     readln(tecla);
  189.     uprstring(tecla, true);
  190. end;
  191.  
  192. {** pausa **}
  193. procedure Pausa;
  194. begin
  195.     Barra('Prima uma tecla para continuar');
  196.     gotoxy(32, 24);
  197.     readln;
  198. end;
  199.  
  200. {* indicacao dos erro *}
  201. procedure Erro(texto: string);
  202. begin
  203.     writeln;
  204.     writeln('erro: ', texto);
  205.     writeln;
  206. end;
  207.  
  208. {* Lista com parenteses *}
  209. procedure VerConjunto(Lista: TipoApontElementoLista);
  210. begin
  211.     writeln;
  212.     write('{ ');
  213.     ImprimeValorLista(Lista);
  214.     write(' }');
  215.     writeln;
  216. end;
  217.  
  218. {* janela de Criar Conjunto *}
  219. procedure CriarConjunto(var CriaLista: TipoApontElementoLista);
  220. var
  221.     n: integer;
  222.     valor: real;
  223.  
  224. begin
  225.     Titulo(34, 'Criar Conjunto');
  226.     i:= 0;
  227.     if RemoveLista(CriaLista) then writeln;
  228.     writeln;
  229.     writeln;
  230.     repeat
  231.         write('Número de valores a serem inseridos: ');
  232.         readln(n);
  233.     until n >= 0;
  234.     if n > 0 then
  235.     begin
  236.         writeln;
  237.         repeat
  238.             write('v[', i + 1, ']: ');
  239.             readln(valor);
  240.             if not ExisteValorLista(CriaLista, valor) then
  241.             begin
  242.                 InsereValorOrdenadoLista3(CriaLista, valor);
  243.                 i:= i + 1;
  244.             end else
  245.             Erro('valor repetido!');
  246.         until i = n;
  247.     end;
  248. end;
  249.  
  250. {* janela ApagaConjunto *}
  251. procedure ApagaConjunto(var ApagaLista: TipoApontElementoLista);
  252. begin
  253.     Titulo(33, 'Apagar Conjunto');
  254.     writeln;
  255.     writeln;
  256.     writeln('Antes');
  257.     VerConjunto(ApagaLista);
  258.     writeln;
  259.     if RemoveLista(ApagaLista) then writeln('Lista apagada');
  260.     writeln;
  261.     writeln('Depois');
  262.     VerConjunto(ApagaLista);
  263.     pausa;
  264. end;
  265.  
  266. {* janela InsereValor *}
  267. procedure InsereValor(var InsereLista: TipoApontElementoLista);
  268. var
  269.     verdade: boolean;
  270.     valor: real;
  271.  
  272. begin
  273.     Titulo(34, 'Inserir Valor');
  274.     writeln;
  275.     writeln('Antes');
  276.     VerConjunto(InsereLista);
  277.     Barra('');
  278.     gotoxy(1, 8);
  279.     verdade:= false;
  280.     repeat
  281.         write('Valor a inserir: ');
  282.         readln(valor);
  283.         if not ExisteValorLista(InsereLista, valor) then
  284.         begin
  285.             InsereValorOrdenadoLista3(InsereLista, valor);
  286.             verdade:= true;
  287.         end else
  288.         Erro('valor repetido!');
  289.     until verdade;
  290.     writeln;
  291.     writeln('Depois');
  292.     VerConjunto(InsereLista);
  293.     Pausa;
  294. end;
  295.  
  296. {* janela RemoveValor *}
  297. procedure RemoveValor(var RemoveLista: TipoApontElementoLista);
  298. var
  299.     contador: integer;
  300.     valor: real;
  301.  
  302. begin
  303.     Titulo(34, 'Remover Valor');
  304.     Barra('');
  305.     gotoxy(1, 4);
  306.     writeln('Antes');
  307.     VerConjunto(RemoveLista);
  308.     writeln;
  309.     ContaValorLista(RemoveLista, contador);
  310.     if contador = 0 then Erro('lista vazia!') else
  311.     begin
  312.         writeln;
  313.         write('Valor a remover: ');
  314.         readln(valor);
  315.         if ExisteValorLista(RemoveLista, valor) then
  316.         RemoveValorLista(RemoveLista, valor) else
  317.         Erro('nao existe valor!');
  318.     end;
  319.     writeln;
  320.     writeln('Depois');
  321.     VerConjunto(RemoveLista);
  322.     Pausa;
  323. end;
  324.  
  325. {* janela VerConjunto *}
  326. Procedure VisualizarConjunto(VerLista: TipoApontElementoLista);
  327. begin
  328.     Titulo(30, 'Visualizar Conjunto');
  329.     writeln;
  330.     VerConjunto(VerLista);
  331.     pausa;
  332. end;
  333.  
  334. {* facilidade no trabalho de listas *}
  335. procedure TrabalharLista(Nome: Char; var Lista: TipoApontElementoLista);
  336. var
  337.     tecla: string;
  338.     escolha: char;
  339.     valor: real;
  340.     n, contador: integer;
  341.     verdade: boolean;
  342.     LAux: TipoApontElementoLista;
  343.  
  344. begin
  345.     repeat
  346.         Titulo(36, 'CONJUNTO ' + Nome);
  347.         Barra('S - Menu Principal');
  348.         Alinha(6, 'A - Criar Lista');
  349.         Alinha(7, 'B - Apagar Lista');
  350.         Alinha(9, 'C - Inserir Valor');
  351.         Alinha(10, 'D - Remover Valor');
  352.         Alinha(12, 'E - Visualizar');
  353.         gotoxy(52, 24);
  354.         ContaValorLista(Lista, contador);
  355.         write('conjunto ',Nome,': ',contador,' elemento(s)');
  356.         Opcao(30, 20, tecla);
  357.         escolha:= tecla[1];
  358.         case escolha of
  359.             'A': CriarConjunto(Lista);
  360.             'B': ApagaConjunto(Lista);
  361.             'C': InsereValor(Lista);
  362.             'D': RemoveValor(Lista);
  363.             'E': VisualizarConjunto(Lista);
  364.         end;
  365.     until escolha = 'S';
  366. end;
  367.  
  368. {* conjuntos *}
  369. procedure ConjuntoReuniao(ListaA, ListaB: TipoApontElementoLista);
  370. var
  371.     Reuniao: TipoApontElementoLista;
  372.  
  373. begin
  374.     ListaNula(Reuniao);
  375.     Titulo(33, 'Conjunto Reuniao');
  376.     writeln;
  377.     writeln;
  378.     ReuniaoListas(ListaA, ListaB, Reuniao);
  379.     VerConjunto(Reuniao);
  380.     if RemoveLista(Reuniao) then writeln;
  381.     Pausa;
  382. end;
  383.  
  384. procedure ConjuntoInterseccao(ListaA, ListaB: TipoApontElementoLista);
  385. var
  386.     Interseccao: TipoApontElementoLista;
  387.  
  388. begin
  389.     ListaNula(Interseccao);
  390.     Titulo(31, 'Conjunto Interseccao');
  391.     writeln;
  392.     writeln;
  393.     InterseccaoListas(ListaA, ListaB, Interseccao);
  394.     VerConjunto(Interseccao);
  395.     if RemoveLista(Interseccao) then writeln;
  396.     Pausa;
  397. end;
  398.  
  399. procedure ConjuntoDiferenca(ListaA, ListaB: TipoApontElementoLista);
  400. var
  401.     Diferenca: TipoApontElementoLista;
  402.  
  403. begin
  404.     ListaNula(Diferenca);
  405.     Titulo(31, 'Conjunto Diferenca');
  406.     writeln;
  407.     writeln;
  408.     DiferencaListas(ListaA, ListaB, Diferenca);
  409.     VerConjunto(Diferenca);
  410.     if RemoveLista(Diferenca) then writeln;
  411.     Pausa;
  412. end;
  413.  
  414. {* corpo principal *}
  415. var
  416.     ListaA, ListaB: TipoApontElementoLista;
  417.     tecla: string;
  418.     escolha: char;
  419.  
  420. begin
  421.     ListaNula(ListaA);
  422.     ListaNula(ListaB);
  423.  
  424.     repeat
  425.         Titulo(34, 'Menu Principal');
  426.         Alinha(6, 'Editor de conjuntos');
  427.         Alinha(8, ' A - Conjunto A');
  428.         Alinha(9, ' B - Conjunto B');
  429.         Alinha(12, 'Operacoes com conjuntos');
  430.         Alinha(14, ' C - Conjunto reuniao');
  431.         Alinha(15, ' D - Conjunto interceccao');
  432.         Alinha(16, ' E - Conjunto diferenca');
  433.         Barra('"S" - Saír');
  434.         repeat
  435.             Opcao(30, 20, tecla);
  436.             escolha:= tecla[1];
  437.         until (escolha >= 'A') and (escolha <= 'E') or (escolha = 'S');
  438.         case escolha of
  439.             'A': TrabalharLista('A', ListaA);
  440.             'B': TrabalharLista('B', ListaB);
  441.             'C': ConjuntoReuniao(ListaA, ListaB);
  442.             'D': ConjuntoInterseccao(ListaA, ListaB);
  443.             'E': ConjuntoDiferenca(ListaA, ListaB);
  444.         end;
  445.     until tecla = 'S';
  446.     if RemoveLista(ListaA) then writeln('Ok');
  447.     if RemoveLista(ListaB) then writeln('Ok');
  448. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement