Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Programa de promedio (https://www.clubdelphi.com/foros/showthread.php?t=78808)

roman 18-05-2012 17:59:55

Claro, pero el poder dejar vacíos algunos Edits es justo la razón por la que alenbebote abrió el hilo:

Cita:

Empezado por alenbebote
el programa si me funciona, pero el profesor dice que tambien saque el promedio de por ejemplo 3 edits solamente

y lo corroboró en el mensaje #3:

Cita:

Empezado por alenbebote
mi profesor me dijo que no me faltaba mucho, realmente no se demasiado-- es que el profesor dijo que el puede rellenar el edit 3 con el 5 y con el 6 osea que seria c3+c5+c6 / 3 pero no se como hacer eso

// Saludos

champy 18-05-2012 18:22:22

Me parece que le estamos liando más que ayudando. ¿Que tal algo más simplificado en el evento OnClick del Button1?


Código Delphi [-]
Procedure Form1.Button1.OnClick(Sender: TObject);
var
   nota1, nota2, nota3, nota4, nota5, nota6: Integer; 
   NumeroDeExamenes : Integer;
   NotaPromedio : Double;
begin

If Edit1.Text <> '' then //Si el Edit1 tiene algo escrito...
begin
    NumeroDeExamenes := NumeroDeExamenes +1; // sumo 1 a NúmeroDeExamenes 
    Nota1 := StrToint(Edit1.Text); //y guardo su valor en Nota1
end;

 //Lo mismo con todos los demas
If Edit2.Text <> '' then
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota2 := StrToint(Edit2.Text);
end;

If Edit3.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota3 := StrToint(Edit3.Text);
end;

If Edit4.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota4 := StrToint(Edit4.Text);
end;

If Edit5.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota5 := StrToint(Edit5.Text);
end;

If Edit6.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota6 := StrToint(Edit6.Text);
end;

//Calculamos el promedio
NotaPromedio := (Nota1 + Nota2 + Nota3 + Nota4 + Nota5 + Nota6) / NumeroDeExamenes

//y mensaje en pantalla mostrando el resultado
ShowMessage(FormatFloat('#0.0', NotaPromedio));


end;

De esta forma puedes sacar el promedio de los 6 examenes, de 3, ó de 5 si te da la gana, solo tiene en cuenta aquellos que tienen algo escrito

ecfisa 18-05-2012 18:27:12

Hola roman.

Pues tenes razón, no había reparado en eso... En ese caso solamente habría que cambiar la línea:
Código Delphi [-]
   if not TryStrToFloat(Text, cd) then

Por:
Código Delphi [-]
  if not (TryStrToFloat(Text, cd) or (Text = '')) then

Saludos.:)

Edito: Y casi me olvido!!!, también el procedimiento asociado al botón:
Código Delphi [-]
procedure TForm1.btnPromedioClick(Sender: TObject);
var
  Prom: Double;
begin
  Prom:= (StrToFloatDef(Edit1.Text,0) + StrToFloatDef(Edit2.Text,0) +
          StrToFloatDef(Edit3.Text,0) + StrToFloatDef(Edit4.Text,0) +
          StrToFloatDef(Edit5.Text,0) + StrToFloatDef(Edit6.Text,0))  /  6;
  ShowMessage(Format('El promedio es: %8.2f',[Prom]));
end;

roman 18-05-2012 18:37:02

Cita:

Empezado por champy (Mensaje 432901)
Me parece que le estamos liando más que ayudando. ¿Que tal algo más simplificado en el evento OnClick del Button1?

Estoy de acuerdo. Lo que pones va más acorde a lo que él ya tenía programado. De ahí puede partir para agregar las validaciones que le han indicado. Lo que sí, en el código que pones habría que inicializar a ceros las variables Nota1, Nota2, etc, para no afectar el promedio con posibles valores basura que tengan.

// Saludos

alenbebote 21-05-2012 13:40:18

Cita:

Empezado por champy (Mensaje 432901)
Me parece que le estamos liando más que ayudando. ¿Que tal algo más simplificado en el evento OnClick del Button1?


Código Delphi [-]
Procedure Form1.Button1.OnClick(Sender: TObject);
var
   nota1, nota2, nota3, nota4, nota5, nota6: Integer; 
   NumeroDeExamenes : Integer;
   NotaPromedio : Double;
begin

If Edit1.Text <> '' then //Si el Edit1 tiene algo escrito...
begin
    NumeroDeExamenes := NumeroDeExamenes +1; // sumo 1 a NúmeroDeExamenes 
    Nota1 := StrToint(Edit1.Text); //y guardo su valor en Nota1
end;

 //Lo mismo con todos los demas
If Edit2.Text <> '' then
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota2 := StrToint(Edit2.Text);
end;

If Edit3.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota3 := StrToint(Edit3.Text);
end;

If Edit4.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota4 := StrToint(Edit4.Text);
end;

If Edit5.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota5 := StrToint(Edit5.Text);
end;

If Edit6.Text <> '' then 
begin
    NumeroDeExamenes := NumeroDeExamenes +1;
    Nota6 := StrToint(Edit6.Text);
end;

//Calculamos el promedio
NotaPromedio := (Nota1 + Nota2 + Nota3 + Nota4 + Nota5 + Nota6) / NumeroDeExamenes

//y mensaje en pantalla mostrando el resultado
ShowMessage(FormatFloat('#0.0', NotaPromedio));


end;

De esta forma puedes sacar el promedio de los 6 examenes, de 3, ó de 5 si te da la gana, solo tiene en cuenta aquellos que tienen algo escrito

Ya puse el codigo al parecer si funciona pero me marca error en ShowMessage(FormatFloat('#0.0', NotaPromedio)); en la parte de showmessage pero al parecer si funciona que puedo hacerle muchas gracias eh intentando cambiar el nombre de las variables y tambien que mande el mensaje a un memo pero me sigue marcando el error que podra ser gracias

ecfisa 21-05-2012 14:09:28

Hola.

Bueno, si no vamos a ser exquisitos con las comprobaciones y sólo importan aquellos Edits en que se ingresó un dato válido, basta con que hagas:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Format('%8.2f',
    [(StrToFloatDef(Edit1.Text,0)+StrToFloatDef(Edit2.Text,0)+
      StrToFloatDef(Edit3.Text,0)+StrToFloatDef(Edit4.Text,0)+
      StrToFloatDef(Edit5.Text,0)+StrToFloatDef(Edit6.Text,0))/6]));
end;

Saludos.

roman 21-05-2012 18:09:49

Cita:

Empezado por ecfisa (Mensaje 433075)
Hola.

Bueno, si no vamos a ser exquisitos con las comprobaciones y sólo importan aquellos Edits en que se ingresó un dato válido, basta con que hagas:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Format('%8.2f',
    [(StrToFloatDef(Edit1.Text,0)+StrToFloatDef(Edit2.Text,0)+
      StrToFloatDef(Edit3.Text,0)+StrToFloatDef(Edit4.Text,0)+
      StrToFloatDef(Edit5.Text,0)+StrToFloatDef(Edit6.Text,0))/6]));
end;

Saludos.

Pedro no. Así no funciona: siempre estarías promediando ceros con los valores no llenados. No es lo mismo esto:

Código:

(10 + 10 + 10) / 3
que esto:

Código:

(10 + 10 + 10 + 0 + 0 + 0) / 6
En el primer caso tomas el promedio de las tres calificaciones asentadas mientras que en el segundo proporcionas cero a las no asentadas. ¡Imagínate! ¡En lugar de diez le pones 5!

// Saludos

ecfisa 21-05-2012 19:50:01

Tenes razón, estoy empecinado con la idea de los seis valores... :D

Pero de todos modos sigo pensando que evaluando en el evento OnExit, se logra un código mas sencillo y compacto que haciéndolo todo al finalizar:
Código Delphi [-]
var
  Cont: Integer = 0;

procedure TForm1.EditExit(Sender: TObject);
var
  cd: Double;
begin
 if TryStrToFloat(TEdit(Sender).Text, cd) then
   Inc(Cont);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Prom: Double;
begin
  Prom:= (StrToFloatDef(Edit1.Text,0) + StrToFloatDef(Edit2.Text,0) +
          StrToFloatDef(Edit3.Text,0) + StrToFloatDef(Edit4.Text,0) +
          StrToFloatDef(Edit5.Text,0) + StrToFloatDef(Edit6.Text,0));
  if Prom > 0 then
    ShowMessage(Format('El promedio es: %8.2f', [Prom/Cont]))
  else
    ShowMessage('Nada que promediar');
  Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit6.Clear;
  Cont:= 0;
end;

Saludos.

marcoszorrilla 21-05-2012 19:56:01

Yo compartiría el evento OnKeyPress de los 6 edit, para evitar las comprobaciones.

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in [#8,'0'..'9','+','-']) then
 key:=#0;
end;

Un Saludo.

ecfisa 21-05-2012 19:59:52

Hola.

Y me quedé pensando...:rolleyes:

Se puede simplificar aún más:
Código Delphi [-]
var
  Cont: Integer = 0;
  Prom: Double = 0;

procedure TForm1.EditExit(Sender: TObject);
var
  cd: Double;
begin
  if TryStrToFloat(TEdit(Sender).Text, cd) then
  begin
    Prom:= Prom + cd;
    Inc(Cont);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Prom > 0 then
    ShowMessage(Format('El promedio es: %8.2f',[Prom/Cont]))
  else
    ShowMessage('Nada que promediar');
  Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit6.Clear;
  Prom:= 0;
  Cont:= 0;
end;

Saludos.

roman 21-05-2012 20:57:31

Cita:

Empezado por ecfisa (Mensaje 433113)
Y me quedé pensando...:rolleyes:

Ya dejar de rizar el rizo :D

El método que propones está bien... Siempre y cuando el usuario no tenga la osadía de regresar a algún edit a cambiar un valor o algo así :)

// Saludos

champy 21-05-2012 21:34:49

¿Que error es el que ta Alen? Porque no debería darte ninguno. Lo único que se me ocurre que pudiese fallarte es que por la configuración regional, tu ordenador tenga asignado como separador decimal la coma ',' y no el punto '.'

Prueba con


Código Delphi [-]
ShowMessage(FormatFloat('#0,0', NotaPromedio));

De todas maneras, si nos pones el error será muchísimo mas facil ayudarte.

Ah! y como dice Roman con mucha razón, acuerdate de inicializar las variables a 0 para evitar el posible error de que se creen con valores basura.

Código Delphi [-]
nota1:=0;nota2:=0;nota3:=0;nota4:=0;nota5:=0;nota6:=0;
NumeroDeExamenes :=0;

ecfisa 21-05-2012 21:38:06

Cita:

Empezado por roman (Mensaje 433117)
Ya dejar de rizar el rizo :D

Creo que tenes razón, tratar de arreglarlo lo va a complicar mucho más... :)

En realidad la primera propuesta que había pensado hacía la media aritmética al finalizar:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i,Cont: Integer;
  Prom,cd: Double;
begin
  Cont:= 0;
  Prom:=0;
  for i:= 0 to ComponentCount - 1 do
   if Components[i] is TEdit then
     if TryStrToFloat(TEdit(Components[i]).Text, cd) then
     begin
       Prom:= Prom + cd;
       Inc(Cont);
     end;
  if Cont > 0 then
    ShowMessage(Format('El promedio es: %8.2f',[Prom/Cont]))
  else
    ShowMessage('Nada que promediar');
end;
Pero pensé que no correspondía al nivel del ejercicio. Luego me embarullé tratando de simplificar...

Saludos.:)

champy 21-05-2012 21:47:55

Todo las formas que le estais explicando son fantásticas, seguramente así es como lo hariamos la mayoría.

Pero si le están pidiendo que haga un promedio del valor de 6 variables, supongo que su profesor se morirá de un espasmo si le ve usar ComponentCount, TryStrTofloat y otras funciones similares que es improbable que conozca (Seguramente FormatFloat ya estaría de sobra). Seamos consecuentes que el nivel del ejercicio que le están pidiendo.

alenbebote 22-05-2012 02:27:37

Cita:

Empezado por ecfisa (Mensaje 433127)
Creo que tenes razón, tratar de arreglarlo lo va a complicar mucho más... :)

En realidad la primera propuesta que había pensado hacía la media aritmética al finalizar:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i,Cont: Integer;
  Prom,cd: Double;
begin
  Cont:= 0;
  Prom:=0;
  for i:= 0 to ComponentCount - 1 do
   if Components[i] is TEdit then
     if TryStrToFloat(TEdit(Components[i]).Text, cd) then
     begin
       Prom:= Prom + cd;
       Inc(Cont);
     end;
  if Cont > 0 then
    ShowMessage(Format('El promedio es: %8.2f',[Prom/Cont]))
  else
    ShowMessage('Nada que promediar');
end;
Pero pensé que no correspondía al nivel del ejercicio. Luego me embarullé tratando de simplificar...

Saludos.:)

demonios mil gracias ya no marca el error solo mande el mensaje a un memo ya quedo mil gracias :D :) :)


La franja horaria es GMT +2. Ahora son las 23:13:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi