[ Foro de Pascal ]

Problemita

12-Dec-2008 05:18
bettina cantero
3 Respuestas

Buenaaassss....Necesito ayuda con este código...Quiero obtener los totales, pero no puedo....Hay algo que no estoy haciendo bien...¿Qué es??? (Aclaro que recien estoy aprendiendo Procedimientos) 


program soporte1;
uses crt;
var edad,cont_jov:integer;
var eleccion:char;
var j,g,am,ami:integer;
var tot_ju,tot_ga,tot_ag,tot_am:integer;
var b_1,b_2,b_3,b_4:integer;

PROCEDURE ingreso_de_datos(dato:char;
                           beb1,beb2,beb3,beb4:integer;
                           c_beb1,c_beb2,c_beb3,c_beb4:integer; {10}
                           var c_1,c_2,c_3,c_4:integer);
begin
        writeln('ingrese el numero correspondiente a la bebida que usted consume');
        writeln('1.--------> jugo');
        writeln('2.--------> gaseosa');
        writeln('3.--------> amargo');
        writeln('4.--------> agua mineral');
        readln(dato);
        if (dato='1') then {20}
            begin
            beb1:=beb1+1;
            c_beb1:=c_beb1+beb1;
            end
            else
                if (dato='2') then
                    begin
                    beb2:=beb2+1;
                    c_beb2:=c_beb2+beb2;
                    end                 {30}
                    else
                        if (dato='3') then
                           begin
                           beb3:=beb3+1;
                           c_beb3:=c_beb3+beb3;
                           end
                           else
                               if (dato='4') then
                               begin
                               beb4:=beb4+1;  {40}
                               c_beb4:=c_beb4+beb4;
                               end;
end;
BEGIN
CLRSCR;
     while cont_jov<4 do{50}
     begin
     writeln('ingrese su edad');
     readln(edad);
           if (edad>=15) or (edad<=30) then
           begin
           cont_jov:=cont_jov+1;
           ingreso_de_datos(eleccion,j,g,am,ami,tot_ju,tot_ga,tot_ag,tot_am,b_1,b_2,b_3,b_4);
           end;
     end;
ingreso_de_datos(eleccion,j,g,am,ami,tot_ju,tot_ga,tot_ag,tot_am,b_1,b_2,b_3,b_4);{60}
writeln('jugos: ',j);
writeln('gaseosas: ',g);
writeln('amargos: ',am);
writeln('agua mineral: ',ami);
readln;
END.{66}


13-Dec-2008 00:42
Nacho Cabanes (+32)

Hay varios problemas.

- Por una parte, no queda claro lo que es cada variable: ¿qué diferencia hay entre "c_beb3" y "beb3"?

- Por otra parte, recuerda que si modificas un parámetro de una función, no se guardan los cambios, a no ser que tengan delante la palabra "VAR" para indicar que está pasando esos datos por referencia, no por valor.

- Además, las variables no tienen valor inicial: si beb3 tiene basura, beb3+1 también tendrá basura.

- Y también, quizá no estés sumando como deberías: si haces c_beb3 = c_beb3+beb3, en la primera pasada estarás sumando 1, en la segunda sumarás 2, en la siguiente 3, y así sucesivamente. No sé si es eso lo que quieres, porque no entiendo lo que hace tu programa, pero es fácil que no sea esa tu intención.


13-Dec-2008 05:49
alfredo mercado

mira tenes varios problemitas,en tu procedimiento si queres que los cambios surtan efecto tenes que pasar los parametros por referencia,ademas para mi gusto usas muchos parametros ignecesarios!en el procedimiento.

PROCEDURE ingreso_de_datos(   parametros          );             

    begin
        beb1:=0;beb2:=0;beb3:=0;beb4:=0;{te falto inicializartusparametros}   writeln('ingrese el numero correspondiente a la bebida que usted consume');
        writeln('1.--------> jugo');
        writeln('2.--------> gaseosa');
        writeln('3.--------> amargo');
        writeln('4.--------> agua mineral');
        readln(dato);
        if (dato='1') then {20}{todos estos if anidados los podes reemplazar} 
            begin{por un case}
            beb1:=beb1+1;
            c_beb1:=c_beb1+beb1;{estos contadores parese que estan de mas}
            end
            else
                if (dato='2') then
                    begin
                    beb2:=beb2+1;
                    c_beb2:=c_beb2+beb2;
                    end
   cualquier cosa mando el enunciado de tu problema para que te pueda ayudar mejor!saludos!!                


13-Dec-2008 12:29
Angel Bravo

Yo cambiaría esta estructura de "Ifs"anidada por otra, no ya por cuestion de eficiencia, sino más que nada, por hacerlo más legible, de modo que el:

if (dato='1') then {20}
begin
beb1:=beb1+1;
c_beb1:=c_beb1+beb1;
end
else
if (dato='2') then
begin
beb2:=beb2+1;
c_beb2:=c_beb2+beb2;
end {30}
else
if (dato='3') then
begin
beb3:=beb3+1;
c_beb3:=c_beb3+beb3;
end
else
if (dato='4') then
begin
beb4:=beb4+1; {40}
c_beb4:=c_beb4+beb4;
end;

Yo lo pondría algo parecido a ésto:

case dato of

1 : begin
beb1:=beb1+1;
c_beb1:=c_beb1+beb1;
end; {case '1'}

2 : begin
beb2:=beb2+1;
c_beb2:=c_beb2+beb2;
end; {case '2'}

3 : begin
beb3:=beb3+1;
c_beb3:=c_beb3+beb3;
end; {case '3'}

4 : begin
beb4:=beb4+1; {40}
c_beb4:=c_beb4+beb4;
end; {case '4'}

end {case of}

Aunque eso sí, no sé exactamente lo que quieres hacer, así que no me meto en la validez o no de lo que hace cada "case of".

Edito: parece ser que no has supuesto el caso de que no se pulse ninguna de esas teclas...¿que hace el programa si yo pulso el 8, por ejemplo? esto tendrías que considerarlo...






(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.)