Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   tengo un problema con el comando VAL (https://www.clubdelphi.com/foros/showthread.php?t=16692)

perudelphi 07-12-2004 19:38:38

tengo un problema con el comando VAL
 
holas a todos
mi problema es el siguiente
me piden sacar promedio de notas de varios alumnos el detalle está en que el nombre y las notas del alumno se ingresan como cadena:
POR EJM:
JUANCARLOS,13,14,20

ya borré el nombre ahora tengo:

,13,14,20
pero ¿como usar VAL? si se supone que desconozco el valor de las notas ingresadas

osea para usar val debe ser asi
VAL(cad,num,code)

donde:cad es la cadena
num es el valor numerico
code error

el problema esta en 'num' pues se supone que yo tengo que poner un numero ,,, pero ¿cual? poner si desconozco el valor del numero que el ususario va a ingresar (soy novato si necesito un comando que desconozco por favor pongan tambien como se utiliza ese NUEVO COMANDO)

muchas gracias perudelphi

Nbull 07-12-2004 20:01:24

No se para que quieres usar Val, pero yo para sacar el promedio de las Notas pasaria la cadena a entero, Supongo que cuando tu pones:

Cita:

se ingresan como cadena:
POR EJM:
JUANCARLOS,13,14,20
Es todo la misma cadena ¿No?,y dices que ya te has quedado con los número solo, pues yo utilizaria el siguiente Código:
Código Delphi [-]
Str:=',13,14,20';//Me guardo la cadena en la varible Str del tipo String
Aux1:=Copy(Str,1,2);//Me copio el 13 en aux1 que sera de tipo String
//El 1 es el caracter 1 y el 2 porque es una cadena de 2 caracteres
Nota1:=Strtoint(Aux1);//Paso la cadena '13' a entero Nota 1 debe ser integer
 
//Hago lo mismo con la segunda nota
Aux2:=Copy(Str,4,2);
Nota2:=Strtoint(Aux2);
 
//Y lo mismo con la tercera
//...Despues Opero lo que quiero por que ya tengo enteros
Espero que te sirva yo lo haria asi, si no entiendes me lo dices.Ya me diras algo.
Un Saludo;)

perudelphi 07-12-2004 20:56:31

entendi pero......
 
Nota1:=Strtoint(Aux1);

:confused: que cosa haces ahi????
strtoint ¿es un comando?,no creo pues me pide ke declare strtoint
probé escribiendo str to int (aux1) ,por ke seguro talvees te habias confundido pero nada


ojo: el copy(Cad,PosIni,NumCar)
donde Cad: es la cadena donde se va a aejecutar el copy
PosIni: es la POSICION desde donde se va a copiar
NumCar: es la cantidad de caracteres a copiar
observa parte de mi codigo:

begin
repeat //asi es como borro el nombre del alumno
delete(a,1,1);
x:=pos(',',a);
until x=1; //hasta aca es la logica para borrar el nombre
str:=a; //aqui cominzo lo que me dices
aux1:=copy(str,2,2); //observa el copy
write(' ',aux1,' '); //esto es solo para confimar que voy bien
nota1:=str to int (aux1);//aqui aparece un error que dice:[Error] alumnado.dpr(18): Incompatible types: 'Integer' and 'String'


write(' ',nota1,' '); //esto ya no importa
readln;
end.

muchas gracias por la ayuda pues aprendi que una variable string puede contener una cadena ,, nunca se me habia ocurrido hacer eso :) :)
porfa respondeme la pregunta y gracias.

perudelphi 07-12-2004 20:58:50

olvidaba
 
ese codigo es parte de mi procedimiento

y la letra 'a' es una cadena ,donde estan las notas a modo de cadena

perudelphi 07-12-2004 21:12:52

otro problema
 
:D tengo otro problema

'a' es un cadena

long:length(a);
for n:= 1 to (long/2) do


si a 'n' la declaro como byte sale de error:
[Error] letraspares.dpr(20): Incompatible types: 'Byte' and 'Extended'


si a 'n' la declaro como integer sale de error:
[Error] letraspares.dpr(20): Incompatible types: 'Integer' and 'Extended'


si a 'n' la declaro como real sale de error:

[Error] letraspares.dpr(20): Incompatible types: 'Integer' and 'Extended'

perudelphi 07-12-2004 21:18:37

el ultimo error estaba mal


[Error] letraspares.dpr(20): For loop control variable must have ordinal type

entonces que hacer

for n:= 1 to (long/2) do
for s:= (2*n) to long do
write(' ',nombre[s],' ');

con este codigo lo ke quiero es escribir las letras pares de una cadena
nombre es un vector que tiene 20 espacios (max de caracteres) y en cada espacio del vector esta una letra de la cadena
pero el problema es la 'n' dado que no puedo poner byte no integer pues long esta dividido pero tampoco puede ser real por ke dice que un loop debe ser un numero ordinal ¿que hacer? :confused:

Nbull 07-12-2004 21:23:21

A ver StrToint lo que hace es pasarte un dato del tipo cadena a un dato de tipo entero, por ejemplo si yo tengo '13' y lo quiero tener 13 lo que hago es :

Código Delphi [-]
 Notas1:=strtoint('13');

Mira he echo un ejemplo muy simple con dos edit y un boton, dandole dos veces alboton entras en el evento oNCLICK del boton y escribes el siguiente código:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
Notas1:integer;
Notas2:integer;
aux1:integer;
begin
     Notas1:=  Strtoint(Edit1.text);
     aux1:=Notas1+2;
     Edit2.Text:=inttostr(aux1);
end;

Si ejecutas este programa y escribes numeros enteros en el edit1 y luego le das al boton te sumara 2 y te lo pondra en el edit 2.

Para tu programa ocurre igual, una vez que hemos pasado la cadena que queremos a la variable aux1 la transformamos en entero y se lo asignamos a Nota 1, te quedaria de la siguiente forma:
Código Delphi [-]
Procedure.....
Var
Str,Aux1,Aux2:string
Notas1,Notas2,NotaFinal:integer;
Begin
Str:=',13,14,20';//Me guardo la cadena en la varible Str del tipo String
Aux1:=Copy(Str,1,2);//Me copio el 13 en aux1 que sera de tipo String
//El 1 es el caracter 1 y el 2 porque es una cadena de 2 caracteres
Notas1:=Strtoint(Aux1);//Paso la cadena '13' a entero Nota 1 debe ser integer
 
//Hago lo mismo con la segunda nota
Aux2:=Copy(Str,4,2);
Notas2:=Strtoint(Aux2);
//Y ahora puedo hacer lo siguiente
NotaFinal:=(Notas1+Notas2)/2
end;
Espero que te haya quedado mas claro, ya me contaras.

Un Saludo.:)

Nbull 07-12-2004 21:28:05

A ver el For se declara en delphi asi:

Código Delphi [-]
For n=0 to (long/2) do begin
//las setencias que quieras introducir en t bucle...
end;

A ver si asi te funciona:D

<Sergio> 08-12-2004 03:31:30

Noten que uso el div (división entera) en lugar de "/"
por que esa es división en flotante.

Y prefiero bajar el "begin".
Código Delphi [-]
for n:=0 to (long div 2) do
begin//Lugar adecuado para algunos comentarios 
  Procedimiento1;
end;//for

Usando val tienes el caracter erróneo en code, con strtoint
utilizas excepciones que tienes que capturar, sino la capturas
sale un mensajito que puede que no te guste.

Tienes que definir una variable code.
No es necesario inicializar code o num, sólo cad.

val(cad,num,code);

Luego obtienes el número contenido en cad en num
(que puede ser entero o flotante). Si ocurrio un error
en code devuelve la posición del caracter que no va.
Asi que luego puedes tener por ejemplo un:

if code<>0 then num:=ValorPredeterminado;

O simplemente ignorar el valor de num y seguir con el
siguiente número de tu lista.


La franja horaria es GMT +2. Ahora son las 10:41:45.

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