PDA

Ver la Versión Completa : Programa de promedio


alenbebote
18-05-2012, 02:49:22
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
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 tu_codigo para que se pueda leer más fácil.


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:

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
Hola alenbebote.

roman se refiere a que encierres tu código entre las etiquetas tu_codigo 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:

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:

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
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:

if x < 7 then
memo1.lines.add ('Reprobaste ¡Lo Sentimos!')
else
memo1.lines.add ('Aprobaste ¡Felicidades!');

alenbebote
18-05-2012, 05:51:34
¿Examen final?, una simple suma y división :confused:

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

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.
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:

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á:

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:


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í (http://www.delphibasics.co.uk/Article.asp?Name=FirstPgm) 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:


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
También puedes ir acumulando y contando los valores válidos en la variable x y en otra variable contador:


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
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
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:

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

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:


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:


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?



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:

if not TryStrToFloat(Text, cd) then


Por:

if not (TryStrToFloat(Text, cd) or (Text = '')) then


Saludos.:)

Edito: Y casi me olvido!!!, también el procedimiento asociado al botón:

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
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
Me parece que le estamos liando más que ayudando. ¿Que tal algo más simplificado en el evento OnClick del Button1?



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:

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
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:

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:


(10 + 10 + 10) / 3


que esto:


(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:

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.

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:

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
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


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.

nota1:=0;nota2:=0;nota3:=0;nota4:=0;nota5:=0;nota6:=0;
NumeroDeExamenes :=0;

ecfisa
21-05-2012, 21:38:06
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:

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
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:

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 :) :)