Sie sind auf Seite 1von 16

Cadenas de caracteres en Turbo Pascal

Contenido.
Introduccin. Asignacin de strings. Concatenacin ("pegar" o "sumar") strings. Elementos individuales del string. Comparacin de strings. Funciones de manipulacin de Strings. o 6.1. Tamao o longitud. o 6.2. Posicin de una subcadena en un string. o 6.3. Copiar una subcadena de un string. 7. Procedimientos de manipulacin de Strings. o 7.1. Eliminar subcadena. o 7.2. Cortar una subcadena. o 7.3. Insertar una subcadena en un string. o 7.4. Convertir cadena numrica a valor numrico entero. o 7.5. Convertir un valor numrico a una cadena de caracteres. 8. Problemas con cadenas de caracteres resueltos. o 8.1. Quitar espacios en blanco al inicio de una cadena. o 8.2. Invertir el orden de nombre y apellido. o 8.3. Quitar todas las ocurrencias de un caracter dado de un string. o 8.4. Insertar un caracter nuevo cada 5 caracteres de la cadena. o 8.5. Invertir una cadena. o 8.6. Contar cuntas vocales hay en una oracin. o 8.7. Convertir todas las letras minsculas a maysculas y a la inversa. o 8.8 Quitar algunos caracteres de una cadena dada. o 8.9 Tomar un valor real, intercambiar su parte entera y decimal. 9. Analizar sintcticamente ("parsear") una cadena de caracteres.

1. 2. 3. 4. 5. 6.

1. Introduccin.
Las cadenas de caracteres (strings) son arreglos (vectores) de un largo mximo especfico. Los strings son tipos estructurado, esto es, pueden ser

divididos en sus componentes individuales, cada componente es un caracter y su tipo es char. Strings en Turbo Pascal 7.0 tienen 255 de tamao por omisin y se declaran con la palabra reservada String; de otra manera, su tamao mximo se declara cuando se definen. Los strings pueden crecer dinmicamente desde el tamao 0 (= "cadena vaca" o "cadena nula") hasta un mximo absoluto de 255. Ejemplos:
Type Nombre_Archivo = String[14]; Nombre_Empleado = String[30]; Var Nombre_Archivo_Entrada: Nombre_Archivo; Nombre_Emp: Nombre_Empleado; Linea: String; { Tam. Mximo = 255 } Write, { Tam. Mximo = 14 }

Se pueden leer y escribir strings con los procedimientos Read y modo que (usando los ejemplos anteriores), Read(Nombre_emp) y Writeln(Nombre_Archivo_Entrada) son sentencias vlidas. Hay muchos mtodos para modificar y comparar strings.

de

2. Asignacin de strings.
Los strings se pueden asignar usando el operador de asignacin Por ejemplo:
Nombre_Archivo_Entrada := 'A:\PROG006.OUT'; :=.

Notar que si se trata de hacer esto: Nombre_Archivo_Entrada el valor asignado a Nombre_Archivo_Entrada ser 'A:\OUTPUT\PROG' lo cual no sera lo esperado, porque lo que est a la derecha del operador de asignacin es ms grande que el tamao declarado del string a la izquierda.
:='A:\OUTPUT\PROG006.OUT',

3. Concatenacin ("pegar" o "sumar") strings.


Se usa el smbolo Por ejemplo:
Nombre_Archivo_Entrada := 'A:\' + 'PROG006' + '.OUT'; +

Tambin se pueden concatenar varios tipos string:


Unidad := 'A:\'; Nombre := 'PROG006'; Extension := '.OUT';

Nombre_Archivo_Entrada := Unidad + Nombre + Extension;

4. Elementos individuales del string.


Sintaxis: Ejemplo:
Writeln(Nombre_Archivo_Entrada[3]); Nombre_Archivo_Entrada[n]

donde

es de tipo byte.

Aqu se imprime el tercer caracter del string.

5. Comparacin de strings.
Smbolos: =, <,
<=, >, >=,

<> true

Estos operadores de comparacin devuelven falso). Sean


A = B A

o false (verdadero o

variables de tipo string.

es true si y solo si los tamaos son iguales y cada elemento individual de A es igual a cada elemento individual de B (A[1] = B[1], B[2], etc...).

A[2] =

Cuando se comparan A y B, se lo hace en secuencia de acuerdo al valor ordinal en la tabla ASCII. Si los strings son de diferente tamao pero iguales caracter a caracter hasta e incluyendo el ltimo caracter del string ms corto, entonces el string ms corto se considera menor al ms largo. Ejemplos:
'A' < 'B' 'Z' < 'a' 'a' < 'B' 'TURBO' = 'TURBO' 'TURBO' = 'Turbo' 'turbo ' = 'turbo' 'turbo ' > 'turbo' TRUE TRUE FALSE TRUE FALSE FALSE TRUE

6. Funciones de manipulacin de Strings.


6.1. Tamao o longitud.
Sintaxis:
Length(Cad)

Devuelve el tamao actual del string 0..255). Ejemplo:


Var Cad: String[20]; ... Cad := ''; Tam := Length(Cad); Cad := Cad + 'Begin'; Tam := Length(Cad);

Cad

en un tipo

byte

(en el rango

Tam: Integer; { asingar null a Cad } { Tam vale 0 } { Tam vale 5 }

La posicin cero de un string (Cad[0]) guarda el tamao dinmico del string que es lo mismo que devuelve la funcin Length(). Sin embargo siempre es recomendable usar esta funcin para saber el tamao del string por razones de compatibilidad. Tambin es posible asingar un valor a Cad[0] de tipo byte, lo que causar que se modifique el tamao dinmico, pero esto es altamente no recomendable pues podra causar, bajo ciertas circunstancias, errores en tiempo de ejecucin u obtener resultados impredecibles.

6.2. Posicin de una subcadena en un string.


Sintaxis:
Pos(Patron, Objetivo)

La funcin Pos() busca el contenido de Patron en el string Objetivo y devuelve la posicin de la primera ocurrencia de Patron en Objetivo en un tipo byte (rango 0..255). Si Patron no est contenido en Objetivo, esta funcin devuelve el valor cero. Ejemplo:
Var Patron, Objetivo: String[20]; Posicion: Byte; ... Objetivo := 'ABRA KADABRA'; Patron := 'BR'; Posicion := Pos(Patron, Objetivo); { Posicion = 2 }

Si Si Si

Patron = 'ADA', Patron = 'br', Patron = ' ',

entonces

Posicion = 7.

entonces

Posicion = 0. ('br' <> 'BR')

entonces

Posicion = 0.

(no hay doble espacio en

Objetivo)

6.3. Copiar una subcadena de un string.


Sintaxis:
Copy(Fuente, Inicio, Tamano)

La funcion copy() devuelve una subcadena copiada desde el string Fuente comenzando desde la posicin Inicio y conteniendo los siguientes Tamano caracteres. Fuente debe ser un tipo string. Inicio y Tamano deben ser de tipo integer siempre que sean positivos. Si Inicio > Length(Fuente) (es decir, Inicio est fuera del string), copy() devuelve un string vaco. Si Inicio + Tamano > Length(Fuente), entonces se devuelven todos los caracteres comenzando desde Inicio y hasta el final de Fuente. Si Inicio est fuera del rango 1..255, ocurre un error en tiempo de ejecucin. Ejemplo:
Var ... Fuente := 'ABRA KADABRA'; Inicio := 6; Tamano := 3; Parte := Copy(Fuente, Inicio, Tamano); { Parte = 'KAD' } Fuente, Parte: String[20]; Inicio, Tamano: Integer;

Si Inicio = 13, entonces Parte = ''. (Inicio seala una posicin que est fuera del tamao dinmico actual de Fuente) Si
Inicio = 4

Tamano = 20,

entonces

Parte = 'A KADABRA'.

7. Procedimientos de manipulacin de Strings.


7.1. Eliminar subcadena.
Sintaxis:
Delete(Objetivo, Inicio, Tamano)

Este procedimiento modificar Objetivo eliminando Tamano caracteres a partir de la posicin Inicio. Si Inicio > Length(Objetivo), no se elimina ningn caracter de Objetivo. Si Inicio + Tamano > Length(Objetivo) se eliminan todos los caracteres a partir de la posicin Inicio y hasta el final de Objetivo. debe ser un tipo string, Inicio y Tamano deben ser de tipo siempre que sean positivos y estn en el rango 1..255.
Objetivo Var ... Objetivo := 'ABRA KADABRA'; Inicio := 6; Objetivo: String[20]; Inicio, Tamano: Integer; integer

Tamano := 3; Delete(Objetivo, Inicio, Tamano); { Objetivo = 'ABRA ABRA' }

Si Inicio = 15, entonces Objetivo no cambia. (Inicio est fuera el tamao dinmico actual de Objetivo) Si
Inicio = 2

Tamano = 20,

entonces

Objetivo = 'A'.

7.2. Cortar una subcadena.


No existe una funcin o procedimiento que recorte una porcin de una cadena. Con recortar se quiere decir tomar una parte de la cadena eliminndola del string y devolviendo la parte recortada en otra. Pero combinando las funciones y procedimientos anteriores es posible obtener ese comportamiento. Ejemplo:
Var Objetivo, Parte: String;

function Cortar(var S: string; Inicio, Tamano: integer): string; begin if Inicio <= Length(S) then begin Cortar:=Copy(S, Inicio, Tamano); Delete(S, Inicio, Tamano); end else Cortar:=''; end; begin Objetivo := 'ABRA KADABRA'; Parte := Cortar(Objetivo, 6, 3); { Parte = 'KAD', Objetivo = 'ABRA ABRA' } end.

7.3. Insertar una subcadena en un string.


Sintaxis:
Insert(Parte, Objetivo, Posicion)

El procedimiento Insert() inserta una copia del contenido del string Parte en el string Objetivo a la izquierda del caracter apuntado por Posicion del string Objetivo desplazando el resto de la cadena hacia la derecha. Por lo tanto Objetivo queda alterado. Si Posicion > Length(Objetivo) entonces Parte se concatenar al final de Objetivo (sera anlogo a hacer Objetivo := Objetivo + Parte;). Si Length(Objetivo) + Length(Parte) antes de hacerse la insercin es

mayor al tamao mximo declarado para Objetivo, entonces se pierden caracteres por la derecha de Objetivo al hacer la insercin. Ejemplo:
Var Parte, Objetivo: String[20]; ... Objetivo := 'ABRA KADABRA'; Parte := 'xyz'; Insert(Parte, Objetivo, 5); { Objetivo = 'ABRAxyz KADABRA' }

Si Parte = 'abcdefghijkl' y Posicion = 5, entonces Objetivo = 'ABRAabcdefghijkl KAD' ya que el tamao declarado para Objetivo es menor que el tamao de la cadena resultante luego de la insercin. Si
Posicion = 30,

entonces

Objetivo = 'ABRA KADABRAabcdefgh'.

7.4. Convertir cadena numrica a valor numrico entero.


Sintaxis:
Val(Cadena, Numero, Codigo_Error)

El propsito de este procedimiento es convertir la cadena de caracteres que contiene un nmero en forma de string al valor que representa. Si la conversin puede hacerse sin errores, entonces el valor es almacenado en Numero siempre que el valor convertido sea vlido para el tipo de dato que fue declarado Numero. En caso de xito, Codigo_Error valdr cero. En caso de que Cadena no contenga un valor que pueda ser convertido, no ser modificado y Codigo_Error contendr un valor mayor a cero que ser la posicin en Cadena del caracter que impide la conversin.
Numero Var CadNum: String[20]; RealNum: Real; IntNum, Error: Integer; ... CadNum := '23.45'; Val(CadNum, RealNum, Error); {RealNum = 23.45, Error = 0} Val(CadNum, IntNum, Error); {Error = 3; RealNum permanece en 23.45, el punto causa el error } CadNum := '256,78'; Val(CadNum, RealNum, Error); {RealNum = 23.45, Error = 4, la coma causa el error } CadNum := '23456'; Val(CadNum, IntNum, Error); {IntNum = 23456, Error = 0} Val(CadNum, RealNum, Error); {RealNum = 23456.0, Error = 0}

Tener en cuenta que Turbo Pascal usa la notacin anglosajona para los nmeros reales por lo tanto el punto, y no la coma, es el separador de decimales. Los espacios en blanco tambin invalidan la conversin. Son admisibles los caracteres '+' y '-' e indicaran el signo del nmero resultante siempre que estn al inicio de la cadena.
CadNum:='-12'; Val(CadNum, IntNum, Error); { IntNum = -12, Error = 0 } CadNum:='1-2'; Val(CadNum, IntNum, Error); { IntNum = -12, Error = 2 }

Por lo tanto, los caracteres que puede contener convertir a un tipo entero: '0'..'9' + '+' + '-'.

CadNum

seran, para poder

Para poder convertir a un tipo real adems de los caracteres vlidos indicados para enteros se agrega la letra 'E' (mayscula o minscula) para poder formar la notacin cientfica y el caracter punto '.' como separador de decimales: '0'..'9' + '.' + '+' + '-' + 'E' + 'e'.
CadNum:='1.2e+1'; { notacin cientfica de '12.0' } Val(CadNum, RealNum, Error); { RealNum = 12.0, Error = 0 }

7.5. Convertir un valor numrico a una cadena de caracteres.


Sintaxis:
Str(Numero, Cadena)

Este procedimiento hace lo inverso de val(), es decir, recibe un valor numrico (sea una constante numrica o una variable numerica como integer, byte, word, real, etc...) y lo convierte a su representacin en un string. El valor numrico puede formatearse como se hara al momento de imprimirse por pantalla. Ejemplos:
Var IntNum: Integer; RealNum: Real; Cadena: String; ... IntNum := -345; Str(IntNum, Cadena); RealNnum := 2345.678; Str(RealNum :0:6, Cadena); Str(RealNum :0:1, Cadena); Str(RealNum :10:2, Cadena); Str(RealNum, Cadena); (notacin cientfica) } { Cadena = '2345.678000' } { Cadena = '2345.7' } { Cadena = ' 2345.68' } { Cadena = ' 2.3456780000E+03' { Cadena = '-345' }

8. Problemas con cadenas de caracteres resueltos.


Para las soluciones que se muestran a continuacin se usa la siguiente declaracin de variables:
Const Espacio = ' '; Var Cad, Primero, Ultimo, Nuevo: String[80]; Posicion, Tam: Integer; Quitar: Char;

8.1. Quitar espacios en blanco al inicio de una cadena.


Quita los espacios en blanco al inicio de una cadena.
Cad := ' ahora es el momento'; while Pos(Espacio, Cad) = 1 do Delete(Cad, 1, 1);

8.2. Invertir el orden de nombre y apellido.


Dado un nombre y un apellido separados por un espacio, se invierte el rden de los mismos logrando primero el apellido y luego el nombre.
Cad := 'Diego Romero'; Posicion := Pos(Espacio, Cad); Tam := Length(Cad); { Posicion = 6 } { Tam = 12 }

Ultimo := Copy(Cad, 1, Posicion - 1); { Ultimo = 'Diego'} Primero := Copy(Cad, Posicion + 1, Tam - Posicion); { Primero = 'Romero' } Cad := Primero + Espacio + Ultimo; { Cad = 'Romero Diego' }

8.3. Quitar todas las ocurrencias de un caracter dado de un string.


Cad := 'Esxxxta xxxorxxacixon xxtixxene xxxdexxmaxsxiadxas exxquxis.'; Quitar := 'x'; Nuevo := ''; for Posicion := 1 to Length(Cad) do if Cad[Posicion] <> Quitar then Nuevo := Nuevo + Cad[Posicion];

Aunque la intuicin al ver el enunciado del problema podra hacernos pensar que se debe utilizar el procedimiento Delete() y resolver el problema as:
for Posicion := 1 to Length(Cad) do if Cad[Posicion] = Quitar then Delete(Cad, Posicion, 1);

Esto solo quitar ocurrencias aisladas de 'x'. En los casos en que aparezca 'xx' solo la primera se elimina pues Delete() 'acorta' el string desplazando la cadena a la izquierda y Posicion 'se saltea' un caracter a medida que avanza.

8.4. Insertar un caracter nuevo cada 5 caracteres de la cadena.


Se pretende insertar un caracter cualquiera cada 5 caracteres de otra cadena.
Cad := 'Abra Kadabra'; Nuevo := ''; { asigna vacio } for Posicion := 1 to Length(Cad) Do if Posicion MOD 5 = 0 then { es Posicion mltiplo de 5? } Nuevo := Nuevo + Cad[Posicion] + '?' { inserta el caracter '?' } else Nuevo := Nuevo + Cad[Posicion];

8.5. Invertir una cadena.


Dada una cadena se pretende obtener la misma cadena pero en orden inverso (de atrs para adelante).
Cad := 'Diego Romero'; Nuevo := ''; for Posicion := Length(Cad) downto 1 do Nuevo := Nuevo + Cad[Posicion]; { Nuevo = 'oremoR ogeiD' }

8.6. Contar cuntas vocales hay en una oracin.


Dada una oracin almacenada en un string, decir cuntas vocales hay en esa oracin. Se hace uso del tipo de dato set para resolverlo.
Var Cad, Nuevo: String[80]; Posicion: byte; Cont: byte; CarValidos: Set of Char; ...

Cont := 0; { inicializa el contador } CarValidos := ['A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u']; { Conjuto de vocales } Cad := 'Diego Romero dijo Abra Kadabra'; for Posicion := 1 to Length(Cad) do if Cad[Posicion] IN CarValidos then inc(Cont); { es lo mismo que Cont := Cont + 1; } Writeln('Hay ', Cont, ' vocales en ', Cad);

8.7. Convertir todas las letras minsculas a maysculas y a la inversa.


Dada una cadena de caracteres, encontrar todas las letras minsculas y convertirlas a maysculas. Tambin el proceso inverso, es decir, de maysculas a minsculas.
{ Convertir minsculas a maysculas } For Posicion := 1 to Length(Cad) Do Cad[Posicion] := Upcase(Cad[Posicion]);

La funcin Upcase() es estandar en Turbo Pascal, recibe un caracter, y si es una letra minscula, devuelve su mayscula. No funciona con vocales acentuadas.
{ Convertir maysculas a minsculas } CarValidos := ['A'..'Z']; { ver punto 8.6. ms arriba } for Posicion := 1 to Length(Cad) do if Cad[Posicion] IN CarValidos then Cad[Posicion] := Chr(Ord(Cad[Posicion]) + 32);

La funcin Chr() acepta un valor de tipo byte (rango 0..255) y devuelve el caracter de ese valor segn la tabla ASCII. La funcin Ord() acepta un caracter y devuelve su posicin en la tabla ASCII (estrictamente hablando hace ms que eso, en realidad Ord() devuelve la posicin ordinar de cualquier tipo ordinal, como el tipo Char que es un tipo ordinal). El truco, al combinar estas dos funciones, consiste en aprovecharse de la diferencia que hay entre las posiciones de las letras maysculas y minsculas en la tabla ASCII que es 32, es decir, la letra 'a' est 32 posiciones ms arriba que la letra 'A' y as sucesivamente. El cdigo no funciona con vocales acentuadas. Como se ha mencionado, ninguno de los cdigos funciona con letras acentuadas. El problema no es de Pascal, sino de la tabla ASCII. La tabla ASCII original no tiene letras acentuadas, es ms, sta solo abarca hasta la posicin 127. El resto de los caracteres es variable dependiendo de la tabla de cdigos de caracter cargada en el DOS (sistema operativo). Si el

cdigo de caracteres en el DOS es el 850 entonces la tabla ASCII s tiene vocales acentuadas.

8.8 Quitar algunos caracteres de una cadena dada.


Teniendo una cadena de caracteres se quiere quitar de ella las letras 'a', 'b' y 'c'.
Type TLetras = Set of 'A'..'z'; Var Quitar: TLetras; Nuevo: String[80]; Posicion: Integer; ... Quitar := ['a', 'b', 'c']; { las letras a quitar } Cad := 'Pablito clav un clavito.'; Nuevo := ''; For Posicion := 1 to Len(Cad) Do If not(Cad[Posicion] IN Quitar) then { si el caracter actual no est en el conjunto... } Nuevo := Nuevo + Cad[Posicion]; WriteLn(Nuevo);

8.9 Tomar un valor real, intercambiar su parte entera y decimal.


Dado un valor real, obtener otro valor real donde la parte entera ser la parte decimal del original y la parte decimal la parte entera del original.
Const DecSep = '.'; { separador de decimales } Cero = '0'; Var Posicion: byte; Tam, Error: Integer; PrimerReal, SegundoReal: Real; CadReal, CadInt, CadDec: String[30]; begin ReadLn(PrimerReal); Str(PrimerReal :0:8, CadReal); real a string } Posicion := Pos(DecSep, CadReal); posicin del separador de decimales } Tam := Length(CadReal); cadena } { convertir { tomar la { medir la

CadInt := Copy(CadReal, 1, Posicion - 1); parte entera }

{ copiar la

CadDec := Copy(CadReal, Posicion + 1, Tam - Posicion); { copiar la parte fraccionaria } Posicion := Length(CadDec); a la izquierda } While CadDec[Posicion] = Cero Do dec(Posicion); { es lo mismo que Posicion := Posicion - 1; } { si la parte decimal son todos ceros, ajustar la posicion } if Posicion = 0 then Posicion := 1; CadDec := Copy(CadDec, 1, Posicion); CadReal := CadDec + DecSep + CadInt; Val(CadReal, SegundoReal, Error); WriteLn(SegundoReal:0:8); end. { quitar ceros

9. Analizar sintcticamente ("parsear") una cadena de caracteres.


Este programa sirve para demostrar cmo analizar sintcticamente una cadena de caracteres ("parsear" un string). La cadena de caracteres consiste en una lista de valores enteros separados por el caracter '|' (ASCII 124). Por ejemplo:
'34|45|789'

Pero tambin podra contener esto:


'||3 | 48| 79|'

El objetivo del programa es extraer esos valores para procesamiento futuro. En este ejemplo, se acumulan en un sumador. Como se puede ver en el ejemplo, la lnea de texto puede no estar formateada apropiadamente, pudiendo contener "campos" vacos o con espacios en blanco por delante o por detrs del nmero. La idea bsica para procesar esto es tener un bucle While controlado por el tamao (longitud) del string. El string se acorta a medida que el bucle progresa porque partes del string sern removidos de l. Mientras el tamao del string es > 0

1. 2.

Borrar todos los espacios en blanco en el string. Encontrar la posicin del primer '|' en el string. 3. Copiar del string todos los caracteres desde el comienzo del string hasta e incluyendo el '|', almacenar la parte copiada en Parte. 4. Borrar los caracteres que estn en Parte del string original. 5. Contar hacia atrs desde el final de Parte, encontrar el ltimo dgito en Parte (si es que hay alguno). 6. Copiar de Parte la porcin que s contiene dgitos (o parece tenerlos). 7. Convertir el string resultante a un valor entero usando Val(). 8. Si la conversin es exitosa, imprimir el valor numrico y sumarlo a Sum. Cuando termina el proceso, mostrar el resultado de Sum.
Program Parse; Uses crt; Const Linea = ' 5996 '; | 23 | 478 |8| 8z7 | 2.3 |xvt| 987 |

Sep = '|'; { separador de campo } Espacio = ' '; Digitos: Set of Char = ['0'..'9']; Var X: String; { la cadena de trabajo } N, Error, Sum: Integer; Parte: String; Loc: Integer; begin clrscr; X := Linea; X := X + Sep; Sum := 0; while Length(X) > 0 do begin { Asegura que X termina con '|' }

{ Quitar todos los Espacios al inicio de X }

while Pos(Espacio, X) = 1 do Delete(X, 1, 1);

{ Borrar cualquier caracter que no sea un dgito. } while not(X[1] in Digitos) and (Length(X) >= 1) do Delete(X, 1, 1);

{ Encontrar la posicin del primer '|' en X, copiar todos los caracteres en X desde el principio hasta e incluyendo el '|' en Parte; borrar esos caracteres del principio de X } Loc := Pos(Sep, X); Parte := Copy(X, 1, Loc); Delete(X, 1, Loc);

{ Contar hacia atrs desde el final de Parte hasta que se encuentre un dgito } While not(Parte[Loc] in Digitos) and (Loc > 0) Do dec(Loc); { es lo mismo que Loc := Loc - 1; }

{ Hacer una nueva copia de Parte que consiste en los caracteres del principio de Parte hasta donde los dgitos fueron encontrados. Es posible que Loc = 0 si no se encontr ningn dgito, por ejemplo si el campo contiene solo espacios o caracteres que no son dgitos } Parte := Copy(Parte, 1, Loc);

{ Solo para controlar que todo est bien, mostrar Parte } if Length(Parte) > 0 then Writeln('Parte: ', Parte) else Writeln('Parte: (vaco)');

{ Convertir Parte un valor entero N } Val(Parte, N, Error); { Si Parte est vaco o contiene "basura", ignorar Error <> 0); N (o sea que

sino, sumar N a Sum e imprimir N } if Error = 0 then begin Writeln(N :4); Sum := Sum + N; end; end; { While }

Writeln('Suma total: '); Writeln(Sum :4); Readln; end.

http://www.driverop.com.ar/pascal/strings