[ Foro de Pascal ]

SUMAR TIEMPOS TOTALES SIN INCLUIR CEROS....

07-May-2012 21:05
oscar gomez
2 Respuestas

Cordial saludo a todos.
esperando su ayuda y agradeciendoles de ante mano.

tengo la siguiente situacion en un array de registros:

                      codigos
                  110     115      125
                  ---     ---      ---
          t        20       30       50
          i        50        0       20
          e      10       10       20
          m      70       80       90
          s       0       140      150

necesito sumar por cada codigo los tiempos obtenidos,( ejemplo para el codigo 110 debo sumar: 20 + 50 + 10 + 70 + 0 ) pero cumpliendo la condicion de que solo se sumaran los tiempos de aquellos codigos donde no existan valores 0, es decir en este caso para los codigos 110  y 115 que registran respectivamente algun tiempo 0 no se tendran en cuenta , solo se tendria encuenta para la impresion el codigo 125 que no posee ningun tiempo 0 en su columna y debera mostrarse entonces la suma total de sus tiempos parciales esto es: 50+20+20+90+150

bien yo le resuelvo y me dan los resultados esperados, tanto para el ejemplo como para otros, sin embargo tengo mis dudas si lo que hago es correcto o redundante hacerlo, y espero me sepan corregir:

las definiciones y demas no importan dado que mi pregunta sera muy especifica y esta centrada en el siguiente procedimiento de mi solucion:

...

procedure clasificacion(t:tabla;var p:personas;var numpersonas:integer);
{El procedimiento devuelve en numpersonas  el número de personas {con sus tiempos completos, es decir sin ningun cero}

  var i,j,suma,participant:integer;
  begin
   numpersonas:=0;
   for i:=1 to cantidadcodigos do en el ejemplo sera de 1 to 3
    begin
{ sumo los tiempos de cada codigo , por columnas}
       suma:=0;
       j:=0;{ manejara el indice de cada tiempo de cada codigo}
       repeat
        j:=j+1;
        if t[j,i] <>0 then
         begin
           suma:=suma + t[j,i];
         end;
         until (t[j,i] = 0) or (j=tiempos); { repetir hasta que se halle un cero o se haya llegado al final de los tiempos de cada codigo de persona

OOOOJJJJOOOOO , AQUI ESTA MI DUDA, ES CORRECTO EL SIGUIENTE IF:
ES DECIR ES NECESARIA LA CONDICION DEL  AND t[j,i]<>0, es que lo he probado  solo como: (if( j= tiempos)  then) pero asi no me dan los resultados esperados, encambio si lo hago asi si que me va:
     if (j=tiempos) and (t[j,i] <> 0)  then
       begin
        numpersonas:=numpersonas +1;
        participant:=c[i].codigo;
         c[numpersonas].dorsal:=participant;
        write(c[numpersonas].dorsal);
        c[numpersonas].tiempo:=suma;
        writeln;
        writeln(c[numpersonas].tiempo);
      end;
  end;


espero sus ayudas y observaciones, o si algun compañero o quiza el profesor nacho pueda darme una mejor forma de solucion en codigo, se los agradeceria.


11-May-2012 12:40
oscar gomez

cordial saludo profesor nacho.
profesor he solucionado este problema de otra forma utilizando una funcion booleana que devuelve true si todos los elementos tiempo de cada uno de los codigos son distintos de cero y tambien me funciona ok, al igual que el codigo que te comente anterioremente, solo que me queda la gran duda profesor si es correcto hacer if (j=tiempos) and (t[j,i] <> 0)  then ... solo necesito la una explicacion al respecto, pues como te digo encontre otra forma de hacerlo, sin embargo insisto pues la solucion que te comente en el post anterior tambien me salian los resultados esperados, pero me queda la duda si es correcto o si estoy errando en algo en mi primer intento de solucion.

se que estamos en el ejercicio de las cadenas profesor, pero de este ejercicio solo me es importante el saber si estoy haciendo algo mal o equivocado, espero me sepas entender y recibir una explicacion de tu parte.muy agradecido profesor.


12-May-2012 10:17
Nacho Cabanes (+30)

Veamos...

Por una parte, lo que estás haciendo no es un array de registros, que mencionas al principio, sino un array de dos dimensiones, así que si es un ejercicio que tengas que entregar, quizá lo estés planteando mal.

Por otra parte, a lo que preguntas sobre si es correcto "if (j=tiempos) and (t[j,i] <> 0)  then ..." no te puedo contestar sin ver cómo es la solución definitiva, pero suena a que está mal:

Recuerda que muchas cosas como "hay algún cero" se deben hacer de forma repetitiva con la ayuda de un "boolean", porque hasta que no recorras todos los datos, no sabes si alguno de ellos cumple la condición:

 
suma := 0;
encontradoCero := false;
for i:=1 to cantidadcodigos do
begin
    if t[j,i] = 0 then encontradoCero := true;
    suma:=suma + t[j,i];
end;
if not encontradoCero then ...
 








(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)