Pascal/Turbo Pascal - Problema con String

 
Vista:

Problema con String

Publicado por Lucia Vilar (17 intervenciones) el 09/01/2007 11:03:10
Buenos días,

A vr si me podeis ayudar, m estoy volviendo loca.
Tengo un fichero de texto con la siguiente estructura:
nombre*numeroNombre

evidentemente no sé cuántos caracteres tiene cada campo (Nombre, numero, nombre)

El Primer nombre soy capaz de rescatarlo perfectamente, y el ultimo a medias. Mi problema principal viene a la hora de coger el numero.

Lo primero que hago es leer todo de golpe y meterlo en un string auxiliar y a partir de ahí intento rescatar los campos. Para saber donde empezar a leer el numero he utilizado la función POS y hasta ahi va bien la cosa. Mi problema es que eso lo tengo almacenado en un string y yo necesito pasarlo a un array de enteros. Al principio cogía cada caracter numerico y después los concatenaba, pero el problema es que no sé cuántas cifras tiene ese numero, porque yo lo staba suponiendo con 2, pero en el momento que tiene 1 o 3 cifras ya no m funciona, y no se me ocurre otra manera de poder coger el numero, a mi m gustaria poder cogerlo directamente desde fichero indicandole a la sentencia read desde que posición tiene que leer, pero no sé como hacerlo... si me pudierais ayudar....sería genial. tengo que entregarlo este fin de semana y el resto de la práctica la tengo resuelta.

Gracias de antemano!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con String

Publicado por lucia Vilar (17 intervenciones) el 09/01/2007 11:09:58
Perdon, les adjunto el código de la declaracion de tipos por si pudiera servir de algo:

program principal (pedidos,plazas,output);

const
maxnom=26;
maxciu=30;
type
tnombre = string[26];
tciudad = string[30];
taux= string[80];

treg = record
nombre: Tnombre;
ciudad: Tciudad;
plaza: integer;
end;

tplaza = record
numero:integer;
ciudad:Tciudad;
end;

tclientes = Array [1..15] of treg;
tplazas = array [1..MaxCiu] of tplaza;

var
registro:treg;
pedidos,plazas:text;
billete: Tplazas;
cl: Tclientes;
aux: taux;
i: integer;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Alexis Ochoa (44 intervenciones) el 09/01/2007 21:22:20
Hola buenas tardes...
Hace algunas semanas termine de hacer un programa, que queria hacer desde hace tiempo y que se parece un poco al q tu estas haciendo, si es q lo entendi bien: "Sacar" de una cadena las subcadenas que la conforman...si es asi lo que te puedo adelantar, por los momentos, es lo siguiente:
En vez de utilizar Pos() utiliza Char() [posicion_cadena:=char('X',cad);] en donde posicion_cadena es una variable tipo numerica (byte,integer,real...) en la que se guarda la posicion del caracter X en la cedena, X el caracter especifico que quieres buscar en la cadena, y cad es la cadena donde ingresada por el usuario o bien introducida por ti en el codigo...
Espero que te sirva y de ser asi y necesites algo mas especifico me puedes mandar un correo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Diego Romero (996 intervenciones) el 10/01/2007 01:23:57
Desde mi punto de vista el problema es sencillo.

Pero antes tengo que decirle a Alexis que al menos en Turbo Pascal no existe la función "Char" y por lo que explicas la supuesta función "Char" hace exactamente lo mismo que Pos() que sí existe.

Pues veamos, quieres rescatar el campo que es numérico y es el último sin importar el tamaño que tenga, pues yo implemetaría algo así:

const
Numeros:set of char=['0','1','2','3','4','5','6','7','8','9'];


function TercerCampo(S: string): integer;
var
i: integer;
Result: integer;
Aux: string;
c: byte;
begin
Aux:='';
Result:=0;
i:=1;
while i<=Length(S) do
begin
if (S[i] in Numeros) then Aux:=Aux+S[i];
inc(i);
end;
if (Aux > '') then
Val(Result,Aux,c);
TercerCampo:=Result;
end;

Lo que hace esta función es tomar como parámetro un string, y luego ciclo dentro de la cadena tomando solo los caracteres numéricos para formar otro string hasta que se termine la cadena. Luego convierto la cadena a integer y devuelvo el resultado.
La función asume que todos los caracteres que forman el número son contínuos y probablemente al final.
Si quisieras ciclar a partir de una posición dada deberías hacer:
function TercerCampo(P: byte; S: string): integer;
var
i: integer;
Result: integer;
Aux: string;
c: byte;
begin
Aux:='';
Result:=0;
i:=P;
while i<=Length(S) do
begin
if (S[i] in Numeros) then Aux:=Aux+S[i];
inc(i);
end;
if (Aux > '') then
Val(Result,Aux,c);
TercerCampo:=Result;
end;

Si quisieras que la función misma determine dónde comienza el tercer campo sería:

function TercerCampo(S: string): integer;
var
i: integer;
Result: integer;
Aux: string;
P, c: byte;
begin
Aux:='';
Result:=0;
I:=1;
while not (S[i] in Numeros) do inc(i);
while i<=Length(S) do
begin
Aux:=Aux+S[i];
inc(i);
end;
if (Aux > '') then
Val(Result,Aux,c);
TercerCampo:=Result;
end;

Aquí asume que el campo numérico tiene sus caracteres contínuos y es el último (hasta que se termine la cadena).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Lucia Vilar (17 intervenciones) el 10/01/2007 14:24:44
Muchas Gracias Diego, ya lo tengo resuelto, lo resolví con Carlos ayer con una función a la que hemos llamado descomponer y que sólo tiene en cuenta el asterisco, recorremos la linea caracter a caracter y se va metiendo en el array correspondiente.

gracias de todas formas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Alexis (44 intervenciones) el 10/01/2007 21:08:51
2 cosas.....1º pido disculpa a Lucia por haberme equivocado con "LA ESTRUCTURA" Char...2º dicha ESTRUCTURA si existe Diego y lo que hace es "copiar" un caracter de una cadena...¿Cómo intentaba explicarselo a Lucia? Con un simple ciclo For..to..do

for i := 1 to length(cadena) do
begin
cad:=char(i);
if (
cad='0' or
cad='1' or
cad='2' or
.....
)
then
...

Para este ejemplo se puede verificar q una cadena introducida por el usuario es un numero....
Para verificar si se trata de una cadena sin numeros solo hay q hacer otro ciclo for..to..do q vaya desde el caracter al q pertenece la letra "a" en la tabla ASCII hasta el caracter de la letra "z". (Si se piensa un poquito no hace falta hacer dos ciclos for..to..do para las minisculas y las mayuscula)
Por ultimo, felicito a Lucia por haber realizado su programa y nuevamente le pido disculpa...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Diego Romero (996 intervenciones) el 10/01/2007 23:18:12
Me temo que también estás errando los términos en esta ocación. Hacer esto:

var
I:byte;
C: char;

begin
C:=Char(I);
end.

se llama "typecasting" y es una forma muy peligrosa de trabajar con Pascal. Se trata de calificar un tipo de dato como si fuera de otro tipo. Hay que tener en cuenta el ancho físico que ocupa un tipo sobre el otro. Además es inútil puesto que lo mismo puede realizarse usando la función chr();

Por otro lado el pedazo de código que has posteado no hace lo que espera que se haga. Lo analizo.

for i := 1 to length(cadena) do

La variable I toma valor uno y va aumentando hasta el largo de la cadena "cadena". ¿Cierto?. Supongamos que estamos en el primer ciclo, o sea I vale uno.

begin
cad:=char(i);

Aquí conviertes el valor de I en su correspondiente valor en la tabla ASCII como caracter, pero I vale uno, y el caracter uno en la tabla ASCII *no es el caracter "1"*. Por lo tanto...

if (
cad='0' or
cad='1' or
cad='2' or
.....
)
then

... este if nunca se cumple.

Y por último ¿de qué sirve convertir el índice de la cadena si lo que se quieres es convertir cada caracter *de la cadena*.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con String

Publicado por Lucia Vilar (17 intervenciones) el 12/01/2007 16:51:53
Hola Alexis, gracias por las disculpas!! No te preocupes, todos somos humanos y todos nos podemos equivocar, además muchos de los que estamos aquí estamos para aprender, y no hay mejor forma que equivocándose!
disculpas aceptadas,pero vamos, que no hacían falta jeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar