Advertisement
paulogp

Conjuntos (v. 1.0.4)

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