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)

alenbebote 18-05-2012 02:49:22

Programa de promedio
 
Hola acabo de iniciar en esto de delphi y me han dejado un programa que calcule el promedio de 6 edits, el programa si me funciona, pero el profesor dice que tambien saque el promedio de por ejemplo 3 edits solamente y al momento de correr el programa y solo rellenar 3 edits me marca un error no se como hacer que si lleno solo 2, 3, 4 o 5 edits tambien me saque el promedio y no me salga el error espero me puedan ayudar

procedure TPromediometal.Button2Click(Sender: TObject);
var
c1,c2,c3,c4,c5,c6: integer;
x: real;
begin
c1:=Strtoint (edit1.text);
c2:=Strtoint (edit2.text);
c3:=Strtoint (edit3.text);
c4:=Strtoint (edit4.text);
c5:=Strtoint (edit5.text);
c6:=Strtoint (edit6.text);
x:=(c1+c2+c3+c4+c5+c6) / 6;
end;
memo1.lines.clear;
memo1.lines.add (FormatFloat ('Tu promedio #.##!' ,x));
if x < 7 then
memo1.lines.add ('Reprobaste ¡Lo Sentimos!')
else
memo1.lines.add ('Aprobaste ¡Felicidades!');
end;

roman 18-05-2012 02:52:59

Por favor, usa etiquetas adecuadas para escribir código.

Necesariamente debes verificar Edit por Edit cuál se rellenó y contarlos pues, si sólo se escribieron tres números, entonces el promedio no puedes tomarlo dividiendo entre seis.

// Saludos

alenbebote 18-05-2012 02:57:31

Cita:

Empezado por roman (Mensaje 432858)
Por favor, usa etiquetas adecuadas para escribir código.

Necesariamente debes verificar Edit por Edit cuál se rellenó y contarlos pues, si sólo se escribieron tres números, entonces el promedio no puedes tomarlo dividiendo entre seis.

// Saludos

no tengo idea como verificar los edits, como le puedo hacer para que no me marque error, 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

ecfisa 18-05-2012 03:25:08

Hola alenbebote.

roman se refiere a que encierres tu código entre las etiquetas [delphi] tu_codigo [/delphi] para que se pueda leer más fácil.


Cita:

no tengo idea como verificar los edits, como le puedo hacer para que no me marque erro
Una forma, no la única pero sí sencilla, es que asignes este código al evento OnExit de cada uno de los Edits:
Código Delphi [-]
procedure TForm1.EditExit(Sender: TObject);
var
  cd: Double;
begin
  with Sender as TEdit do
  begin
    if not TryStrToFloat(Text, cd) then  // si no se puede convertir...
    begin
      ShowMessage('Error en la nota ingresada'); // mostrar mensaje de error
      SetFocus  // devolver el foco al Edit
    end
  end
end;

Saludos.

alenbebote 18-05-2012 03:35:26

Cita:

Empezado por ecfisa (Mensaje 432860)
Hola alenbebote.

roman se refiere a que encierres tu código entre las etiquetas [delphi] tu_codigo [/delphi] para que se pueda leer más fácil.



Una forma, no la única pero sí sencilla, es que asignes este código al evento OnExit de cada uno de los Edits:
Código Delphi [-]
procedure TForm1.EditExit(Sender: TObject);
var
  cd: Double;
begin
  with Sender as TEdit do
  begin
    if not TryStrToFloat(Text, cd) then  // si no se puede convertir...
    begin
      ShowMessage('Error en la nota ingresada'); // mostrar mensaje de error
      SetFocus  // devolver el foco al Edit
    end
  end
end;

Saludos.

ok pero no entiendo como poner este codigo debo de hacer una variable cd:double;
me podrias ayudar en un ejemplo de mi ejercicio, es mi examen final y no eh podido con
este programa mil gracias

ecfisa 18-05-2012 04:22:36

Hola.

Seleccioná todos los edits mediante el mouse o presionando la tecla Shift y haciendo click sobre cada uno de ellos hasta que estén todos seleccionados.

Luego anda al Object inspector, donde dirá: 6 items selected. Hace click sobre la pestaña Events y doble click sobre OnExit. Delphi automáticamente te generará la cabecera:
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin

end;
Agrega la declaración de variable y el código entre el begin/end que te puse en el mensaje anterior.

Saludos.

Casimiro Notevi 18-05-2012 04:26:46

Cita:

Empezado por alenbebote (Mensaje 432861)
ok pero no entiendo como poner este codigo debo de hacer una variable cd:double;
me podrias ayudar en un ejemplo de mi ejercicio, es mi examen final y no eh podido con
este programa mil gracias

¿Examen final?, una simple suma y división :confused:

Pues entonces, me temo que tu resultado será menor de 7, según tu ejemplo:

Código Delphi [-]
if x < 7 then
  memo1.lines.add ('Reprobaste ¡Lo Sentimos!')
else
  memo1.lines.add ('Aprobaste ¡Felicidades!');

alenbebote 18-05-2012 05:51:34

Cita:

Empezado por Casimiro Notevi (Mensaje 432864)
¿Examen final?, una simple suma y división :confused:

Pues entonces, me temo que tu resultado será menor de 7, según tu ejemplo:

Código Delphi [-]
if x < 7 then
  memo1.lines.add ('Reprobaste ¡Lo Sentimos!')
else
  memo1.lines.add ('Aprobaste ¡Felicidades!');

Ya hice la seleccion de los 6 edits y en onexit los selecciones con el unico boton que tengo button1, le inserto el codigo pero al momento de correrlo no puedo cambiar de casilla y me marca un error, gracias por la ayuda

ecfisa 18-05-2012 08:18:13

Hola.
Cita:

Empezado por alenbebote (Mensaje 432865)
Ya hice la seleccion de los 6 edits y en onexit los selecciones con el unico boton que tengo button1, le inserto el codigo pero al momento de correrlo no puedo cambiar de casilla y me marca un error, gracias por la ayuda

No no no no. Hacé lo siguiente:

Primero que nada borrá desde el editor toda linea que haga referencia a Edit1Exit, así como el código asociado al procedimiento, es decir cabecera de procedimiento y las líneas que que la siguen hasta el end; (incluído). También en el Object Inspector, el contenido de la casilla del evento OnExit de todos los Edits. Es decir, dejá todo como estaba antes.

Seleccioná los seis Edits (te vas a dar cuenta por que tienen una marca en gris en cada una de sus esquinas). Ya no tenes que entrar ni tocar mas el formulario, el evento OnExit no tiene nada que ver con el botón, así que tampoco toques nada allí.

Dirigite al Object Inspector, si no está visible hace View -> Object Inspector. En él verás dos pestañas, una de ellas dice Events, hacé click en ella y veras una lista con los eventos de los Edits.

Sobre el que dice OnExit hace doble click. Ya estarás en el editor y con la cabecera creada como te comente en el mensaje #6:
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject); // (verás TForm1 o el nombre de clase de tu form)
begin

end;
Borra las tres líneas que están debajo de la cabecera (desde el begin hasta el end).

Seleccioná y copiá el siguiente trozo de código tál cuál como está:
Código Delphi [-]
var
  cd: Double;
begin
  with Sender as TEdit do
  begin
    if not TryStrToFloat(Text, cd) then  // si no se puede convertir...
    begin
      ShowMessage('Error en la nota ingresada'); // mostrar mensaje de error
      SetFocus  // devolver el foco al Edit
    end
  end
end;
Y pegalo debajo de la cabecera (donde antes estaban las tres líneas que eliminaste).

Saludos.

Edito: Mucha suerte ;)

duilioisola 18-05-2012 13:39:32

También puedes ir acumulando y contando los valores válidos en la variable x y en otra variable contador:

Código Delphi [-]
procedure TPromediometal.Button2Click(Sender: TObject);
var
c1,c2,c3,c4,c5,c6: integer;
aux: real;
x: real;
contador : integer;
begin
   // En x voy acumulando los Edits válidos
   // En contador voy contanto cuantos Edits son válidos

   // Inicializo x y contador
   x := 0;
   contador := 0;

   // Me fijo si se puede convertir el Edit1. 
   // Si se puede la funcion devuelve True y aux contendrá el valor en formato Real
   if (TryStrToFloat(Edit1.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

   // Hago lo mismo con todos los Edits
   if (TryStrToFloat(Edit2.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

[...]

   // Para evitar una división por 0, si no se rellenó ningún Edit.
   if (contador <> 0) then
   begin
      // Aqui tienes el valor y puedes mostrarlo
      x := x / contador;
[...]
   end
   else
   begin
      // Si entramos aqué hay un error. No se han rellenado los Edits o se han rellenado con valores inválidos
[...]
   end;
end;

PD: Te he resuelto la taréa, solo porque veo que haz puesto empeño. (Hay otra gente que viene con el enunciado y espera que le des una función terminada y probada)
De todos modos, te veo un poco verde en el manejo de los componentes visuales y sus eventos (Edits, Botonoes, etc.).
Deberías leer un poco más sobre el tema. Aquí verás un ejemplo de como crear un botón y responder al evento OnClick (cuando se presiona).

Sigue practicando y diviértete mucho con Delphi!

alenbebote 18-05-2012 15:59:46

También puedes ir acumulando y contando los valores válidos en la variable x y en otra variable contador:

Código Delphi [-]
procedure TPromediometal.Button2Click(Sender: TObject);
var
c1,c2,c3,c4,c5,c6: integer;
aux: real;
x: real;
contador : integer;
begin
   // En x voy acumulando los Edits válidos
   // En contador voy contanto cuantos Edits son válidos

   // Inicializo x y contador
   x := 0;
   contador := 0;

   // Me fijo si se puede convertir el Edit1. 
   // Si se puede la funcion devuelve True y aux contendrá el valor en formato Real
   if (TryStrToFloat(Edit1.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

   // Hago lo mismo con todos los Edits
   if (TryStrToFloat(Edit2.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

[...]

   // Para evitar una división por 0, si no se rellenó ningún Edit.
   if (contador <> 0) then
   begin
      // Aqui tienes el valor y puedes mostrarlo
      x := x / contador;
[...]
   end
   else
   begin
      // Si entramos aqué hay un error. No se han rellenado los Edits o se han rellenado con valores inválidos
[...]
   end;
end;

PD: Te he resuelto la taréa, solo porque veo que haz puesto empeño. (Hay otra gente que viene con el enunciado y espera que le des una función terminada y probada)
De todos modos, te veo un poco verde en el manejo de los componentes visuales y sus eventos (Edits, Botonoes, etc.).
Deberías leer un poco más sobre el tema.

Sigue practicando y diviértete mucho con Delphi![/quote]

mil gracias lo hice igual pero al momento de correrlo me marca un error en if (TryStrToFloat(edit1.text, aux)) then en ,aux) aqui me lo marca que puede ser muchas gracias por la ayuda.

Nota: me sale esto there ins no overloaded version of 'trystrtofloat' that can be caller with these arguments

alenbebote 18-05-2012 16:26:50

Cita:

Empezado por duilioisola (Mensaje 432879)
También puedes ir acumulando y contando los valores válidos en la variable x y en otra variable contador:

Código Delphi [-]
procedure TPromediometal.Button2Click(Sender: TObject);
var
c1,c2,c3,c4,c5,c6: integer;
aux: real;
x: real;
contador : integer;
begin
   // En x voy acumulando los Edits válidos
   // En contador voy contanto cuantos Edits son válidos

   // Inicializo x y contador
   x := 0;
   contador := 0;

   // Me fijo si se puede convertir el Edit1. 
   // Si se puede la funcion devuelve True y aux contendrá el valor en formato Real
   if (TryStrToFloat(Edit1.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

   // Hago lo mismo con todos los Edits
   if (TryStrToFloat(Edit2.Text, aux)) then
   begin
      x := x + aux;
      contador := contador + 1;
   end;

[...]

   // Para evitar una división por 0, si no se rellenó ningún Edit.
   if (contador <> 0) then
   begin
      // Aqui tienes el valor y puedes mostrarlo
      x := x / contador;
[...]
   end
   else
   begin
      // Si entramos aqué hay un error. No se han rellenado los Edits o se han rellenado con valores inválidos
[...]
   end;
end;

PD: Te he resuelto la taréa, solo porque veo que haz puesto empeño. (Hay otra gente que viene con el enunciado y espera que le des una función terminada y probada)
De todos modos, te veo un poco verde en el manejo de los componentes visuales y sus eventos (Edits, Botonoes, etc.).
Deberías leer un poco más sobre el tema.

Sigue practicando y diviértete mucho con Delphi!


mil gracias lo hice igual pero al momento de correrlo me marca un error en if (TryStrToFloat(edit1.text, aux)) then en ,aux) aqui me lo marca que puede ser muchas gracias por la ayuda.

Nota: me sale esto there ins no overloaded version of 'trystrtofloat' that can be caller with these arguments

roman 18-05-2012 16:44:10

Declara x como Double en lugar de Real.

// Saludos

afxe 18-05-2012 16:49:26

Si no te funciona lo de "real" a "double" tendrías que chequear si haces un use de la librería SysUtils...

alenbebote 18-05-2012 17:05:12

Cita:

Empezado por roman (Mensaje 432888)
Declara x como Double en lugar de Real.

// Saludos

ya lo declare me sigue marcando el mismo error en la misma parte, no se que sea llevo dos dias con esto y no eh podido, gracias por la ayuda se los agradesco...

ecfisa 18-05-2012 17:17:52

Hola.

¿ Por que no nos pegas aquí todo el código que llevás echo ? Así es más fácil ver donde está el error.


Saludos. :)

roman 18-05-2012 17:32:19

Cita:

Empezado por alenbebote (Mensaje 432893)
ya lo declare me sigue marcando el mismo error en la misma parte, no se que sea llevo dos dias con esto y no eh podido, gracias por la ayuda se los agradesco...

Disculpa, dije x cuando debí decir aux. aux es la variable que debe declararse como Double.

// Saludos

ecfisa 18-05-2012 17:33:25

Hola

Pensándolo bién... no voy a ser haragán, aquí tenés el código completo:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    btnPromedio: TButton;
    procedure FormCreate(Sender: TObject);
    procedure EditExit(Sender: TObject);
    procedure btnPromedioClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.OnExit:= EditExit;
  Edit2.OnExit:= EditExit;
  Edit3.OnExit:= EditExit;
  Edit4.OnExit:= EditExit;
  Edit5.OnExit:= EditExit;
  Edit6.OnExit:= EditExit;
end;

procedure TForm1.EditExit(Sender: TObject);
var
  cd: Double;
begin
  with Sender as TEdit do
  begin
    if not TryStrToFloat(Text, cd) then
    begin
      ShowMessage('Error en la nota ingresada en ' + Name);      
      SetFocus
    end
  end
end;

procedure TForm1.btnPromedioClick(Sender: TObject);
var
  Prom: Double;
begin
  Prom:= (StrToFloat(Edit1.Text)+StrToFloat(Edit2.Text)+
          StrToFloat(Edit3.Text)+StrToFloat(Edit4.Text)+
          StrToFloat(Edit5.Text)+StrToFloat(Edit6.Text)) / 6;
  ShowMessage(Format('El promedio es: %8.2f',[Prom]));
end;

end.
Lo único que tenés que hacer es asignar FormCreate al evento OnCreate de Form1.


Saludos.

roman 18-05-2012 17:37:59

Cita:

Empezado por ecfisa (Mensaje 432897)
Hola

Pensándolo bién... no voy a ser haragán, aquí tenés el código completo:

Ojo: tu código no toma en cuenta la posibilidad de dejar vacío un Edit.

// Saludos

ecfisa 18-05-2012 17:48:28

Cita:

Empezado por roman (Mensaje 432898)
Ojo: tu código no toma en cuenta la posibilidad de dejar vacío un Edit.

// Saludos

Hola roman.

Bueno, eso es por que consideré que dejar vacío un edit es un error. Una nota debería ser algún valor numérico...

Saludos.


La franja horaria es GMT +2. Ahora son las 05:32:10.

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