Advertisement
juanesperanza

TAD UrnaElectrónica. Corregido por Profesora

Dec 11th, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.                              ************************************
  2.                              ********* C O M P L E T O **********
  3.                              ************************************
  4.                              Corregido hoy martes 11/12 por prof.
  5.                              ************************************
  6.                              
  7.     A) Implemente el TAD UrnaElectronica, cuya interface se muestra a continuación. Tener en cuenta al momento de implementar que una
  8.     UrnaElectronica puede manejar a lo sumo 50 agrupaciones.  
  9.      
  10.     TAD UrnaElectronica; type exportado urna;
  11.     procedure CrearUrna (var u:urna; nombre: string; cant_Agrupaciones:integer)  
  12.     // Crea la urna con nombre “nombre”, los códigos de las agrupaciones enumeradas de 1 a cant_Agrupaciones y sin votos
  13.     function cantidadAgrupacionesPosibles(u:urna): integer;
  14.     // Retorna la cantidad de agrupaciones disponibles para votar.
  15.     function numeroAgrupacionValida (u: urna, num: integer) : boolean;
  16.     // Retorna si el número que ingresa como parámetro corresponde a una agrupación válida.
  17.     procedure votarPorAgrupacion(var u: urna; num_Agrupacion: integer) ;
  18.     // Actualiza la urna sumando 1 a la agrupación cuyo número ingresa como parámetro.
  19.     procedure votarEnBlanco(var u:urna);
  20.     // Actualiza la urna sumando 1 al contador de votos en blanco.
  21.     function cantidadDeVotosEnBlanco(u:urna): integer;
  22.     // Retorna la cantidad de votos en blanco que se emitieron.
  23.     function cantidadDeVotosPorAgrupacion(u: urna; num_Agrupacion: integer);
  24.     // Retorna la cantidad de votos que recibió la agrupación cuyo número ingresa como parámetro.
  25.      
  26.     B) Utilizando el TAD UrnaElectronica resolver el siguiente problema:
  27.      
  28.     La facultad de Informática va a implementar las elecciones por medio de voto electrónico. Para ello dispone de una estructura
  29.     eficiente que representa el padrón de alumnos  que cumplen las condiciones necesarias para votar en las elecciones estudiantiles
  30.     de la facultad. De cada alumno se conoce: Número de Alumno, DNI y Apellido y Nombre. La estructura se encuentra ordena por el DNI
  31.     del alumno.
  32.      
  33.      
  34.      
  35.     {Implementación}
  36.      
  37.     Implementation
  38.      
  39.             urna = record     // urna es el tipo exportado.
  40.               nombreurna:string;
  41.             agrupaciones:vector;
  42.            votosenblanco:integer;
  43.          cantidaddeagrup:integer;
  44.                    end;
  45.            
  46.             vector = array [1..50] of integer // Cada posición es el código de la agrupación
  47.            
  48.      
  49.     procedure CrearUrna (var u:urna; nombre: string; cant_Agrupaciones:integer)  
  50.     // Crea la urna con nombre “nombre”, los códigos de las agrupaciones enumeradas de 1 a cant_Agrupaciones y sin votos
  51.        
  52.     var
  53.         i:integer;
  54.    
  55.     begin
  56.         u.nombreurna:=nombre;
  57.         u.cantidaddeagrup:=cant.Agrupaciones;
  58.         u.votosenblanco:=0;
  59.         for i:=1 to cant_Agrupaciones do {cant_Agrupaciones lo uso como mi dimensión lógica}
  60.             u.agrupaciones[i]:=0; {u.agrupaciones es de tipo vector}
  61.     end;
  62.    
  63.    
  64.     function cantidadAgrupacionesPosibles(u:urna): integer;
  65.         // Retorna la cantidad de agrupaciones disponibles para votar.
  66.     begin
  67.         cantidaddeAgrupacacionesPosible:=u.cantidaddeagrup;
  68.     end;
  69.    
  70.    
  71.     function numeroAgrupacionValida (u: urna, num: integer) : boolean;
  72.        // Retorna si el número que ingresa como parámetro corresponde a una agrupación válida.
  73.     var
  74.         aux:boolean;
  75.    
  76.     begin
  77.         if (u.cantidaddeagrup > num) and (num >= 1) then {num >= 1 agregado por el prof. para evitar que entre si se introduce un número negativo}
  78.             aux:=FALSE;
  79.         else
  80.             aux:=TRUE;
  81.         numeroAgrupacionValida:=aux;
  82.     end;
  83.    
  84.    
  85.     procedure votarPorAgrupacion(var u: urna; num_Agrupacion: integer) ;
  86.         // Actualiza la urna sumando 1 a la agrupación cuyo número ingresa como parámetro.
  87.    
  88.     begin
  89.         u.agrupaciones[num_Agrupacion]:=u.agrupaciones[num_Agrupacion] + 1;
  90.     end;
  91.    
  92.    
  93.     procedure votarEnBlanco(var u:urna);
  94.         // Actualiza la urna sumando 1 al contador de votos en blanco.
  95.  
  96.     begin
  97.         u.votosenblanco:=u.votosenblanco + 1;
  98.     end;
  99.  
  100.    
  101.     function cantidadDeVotosEnBlanco (u:urna) : integer;
  102.         // Retorna la cantidad de votos en blanco que se emitieron.
  103.    
  104.     begin
  105.         cantidadDeVotosEnBlanco:=u.votosenblanco;
  106.     end;
  107.    
  108.    
  109.     function cantidadDeVotosPorAgrupacion(u: urna; num_Agrupacion: integer);
  110.         // Retorna la cantidad de votos que recibió la agrupación cuyo número ingresa como parámetro.
  111.    
  112.     begin
  113.         cantidadDeVotosPorAgrupacion:=u.agrupaciones[num_Agrupacion];  
  114.     end;
  115.  
  116.  
  117.  
  118.  
  119.          
  120.          
  121.     {Programa Principal}
  122.      
  123.     program Elecciones_Ejercicio_6_Práctica17Repaso;
  124.      
  125.     uses UrnaElectronica; // nombre del TAD
  126.      
  127.     type
  128.      
  129.             arbol=^nodo_arbol;
  130.             nodo_arbol=record
  131.              datosalumno : padron;
  132.                       dni:integer;   // Ver Nota 1)
  133.                         izq:arbol;
  134.                       der:arbol;
  135.              end;
  136.              
  137.             padron=record
  138.                     nro_alumno:integer;
  139.                     apellido:string;
  140.                     nombre:string;
  141.                     voto:boolean;
  142.             end;
  143.      
  144.    
  145.  
  146.     procedure Crear_la_Urna (var u:urna);
  147.     var
  148.         cant_agrup:integer;
  149.         nombreurna:integer;
  150.    
  151.     begin
  152.         writeln ('Ingrese el nombre de la Urna a crear:');
  153.         readln (nombreurna);
  154.         writeln ('Ingrese la cantidad de agrupaciones de la Urna');
  155.         readln (cant_agrup);
  156.         crearUrna (u,nombreurna,cant_agrup);
  157.     end;
  158.    
  159.    
  160.     procedure votacion (var A:arbol; var u:urna);
  161.     var
  162.         dni:integer;
  163.         voto:integer;
  164.     begin
  165.         writeln ('Ingrese su D.N.I.:');
  166.         readln (dni);
  167.         while (dni <> 0) then
  168.             if (esvalido(A,dni) then begin
  169.                 writeln ('Ingrese el código de la Agrupación elegida:');
  170.                 readln ('Si elije votar en blanco, ingrese 0');
  171.                 readln (voto);
  172.                 if (voto = 0) then
  173.                     votarenBlanco (u);
  174.                 else
  175.                     if (numeroAgrupacionValida(voto)) then
  176.                         votarporAgrupacion (u,voto);
  177.                     else
  178.                         writeln ('La agrupación elegida no existe');
  179.             end
  180.             else
  181.                 writeln ('Invalido');
  182.             writeln ('Ingrese su D.N.I.:');
  183.             readln (dni);
  184.         end;
  185.     end;
  186.    
  187.    
  188.     function esvalido (A:arbol; dni:integer) : boolean;
  189.  
  190.     begin
  191.         if (A <> nil) then
  192.             if (A^.dni > dni) then
  193.                 esvalido:=esvalido(A^.izq, dni);
  194.             else
  195.                 if (A^.dni < dni) then
  196.                     esvalido:=esvalido(A^.der, dni);
  197.                 else {es igual}
  198.                     if (A^.padron.voto = FALSE) then
  199.                         A^.padron.voto:=TRUE; {S/ Prof. es necesario hacerlo aquí}
  200.                         esvalido:=TRUE;
  201.                     else
  202.                         esvalido:=FALSE;
  203.         else
  204.             esvalido:=FALSE;
  205.     end;   
  206.    
  207.        
  208.     procedure recuento_votos (u:urna);
  209.     var
  210.         max:integer;
  211.         i:integer;
  212.         agrupacionganadora:integer;
  213.         cantidadagrup:integer;
  214.    
  215.     begin
  216.         max:=-1;
  217.         cantidadagrup:=cantidadAgrupacionesPosibles(u);
  218.         for i:=1 to cantidadagrup do
  219.             if (cantidadDeVotosPorAgrupacion(u,i) > max) then begin
  220.                 max:=cantidadDeVotosPorAgrupacion(u,i);
  221.                 agrupacionganadora:=i;
  222.             end;
  223.         end;
  224.         writeln ('La Agrupación ganadora es:',agrupacionganadora);
  225.     end;
  226.    
  227.    
  228.    
  229.     var
  230.         u:urna;
  231.         A:arbol;
  232.    
  233.     begin
  234.         A := nil;
  235.         cargardatos (A);              //Se dispone
  236.         CrearUrna (u);
  237.         votacion (A, u);
  238.         recuento_votos (u);
  239.     end.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.     Nota 1)
  247.     Según la prof. es indistinto que este DNI en el arbol, puede estar en el padron y cuando recorro el árbol, accedo directamente desde el registro      (arbol^.datosalumno.dni), puesto que, esta ordenado por DNI y esta estructura ya se dispone.
  248.     Sino otra forma también valida es:
  249.      
  250.     {Otra forma de declarar la estructura}
  251.      
  252.     (...)
  253.      
  254.             arbol=^nodo_arbol;
  255.             nodo_arbol=record                
  256.             datosalumno:padron; // Si ponemos también DNI aquí y en el registro, estaría duplicado y por ende, incorrecto.
  257.                     izq:arbol;
  258.                     der:arbol;
  259.              end;
  260.              
  261.             padron=record
  262.                    DNI:integer; // Esto cambia
  263.             nro_alumno:integer;
  264.               apellido:string;
  265.                 nombre:string;
  266.                   voto:boolean;
  267.             end;
  268.            
  269.     Las dos formas de hacerlo son válidas.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement