PDA

Ver la Versión Completa : tengo un problema con el comando VAL


perudelphi
07-12-2004, 19:38:38
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:


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:

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


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:


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:

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:


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

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.