Ingeniero Técnico en Informática de Sistemas
Pascal
PRÁCTICA DE METODOLOGÍA
Librería de cadenas de caracteres
Índice
Apartado Páginas
Índice 1
Enunciado de la práctica 2
Descripción del problema 3
Comentario sobre la solución elegida 4
Pseudocódigo 5
Código comentado 13
Explicación de la implantación de la librería 25
Descripción del problema
Tenemos que construir una librería o Unit (según el lenguaje Pascal) que trabaje con variables de tipo string. Nuestra librería está compuesta de varios procedimientos y funciones, que son las siguientes:
Función mi_Concat(string1,string2): string.
Función mi_Copy(string, índice, ncar): string.
Procedimiento mi_Delete(string,índice,ncar)
Procedimiento mi_Insert(string,string,index)
Función mi_Length(string):integer
Función mi_Pos(string,string): integer
Procedimiento mi_Str(numero,string)
Procedimiento mi_Val(string,numero,coderr)
Procedimiento Tkstr(string,ncar)
Procedimiento Tkint(numero,ndigitos)
Función StrUpcase(string)
Comentario sobre la solución
Para solucionar el problema planteado, he creado una unidad especial llamada Mi_Unit que trabaja con variables de tipo string.
Dicha unidad está compuesta por una serie de funciones y procedimientos, también creados por mí que nos permiten realizar una serie de operaciones sobre los strings dentro de cualquier programa de Pascal, sin necesidad de definir dichas funciones cada vez que las necesitemos en un futuro programa de Pascal.
Pseudocódigo
-
Función mi_concat: string;
Variables
i: integer;
aux: string;
Parámetros
string1, string2: string;
Para i:= 1 hasta (ord(string1{0}) + ord (string2{0})) hacer
si i<= ord(string1{0}) entonces
aux{i}:= string1{i}
sino
aux{i}:= string2{i-ord(string1{0})}
finsi;
finpara;
aux{0}:= chr(ord(string1{0})+ord(string2{0}));
mi_concat:= aux;
-
Función mi_copy: string;
Variables
i: integer;
aux: string,
Parámetros
string1: string;
indice: integer;
ncar: integer;
Para i:= 1 hasta ncar hacer
aux{1}:= string1{indice+i-1}
finpara
Si indice+ncar <= ord (string1{0}) entonces
aux{0}:= chr(ncar)
sino
aux{0}:= chr(ord(string1{0})-indice+1)
finsi
mi_copy:= aux
-
Procedimiento mi_delete;
Variables
i: integer;
Parámetros
string1: string;
indice: integer;
ncar: integer;
Para i:= ncar+indice hasta length(string1) hacer
string1{i-ncar}:= string1{i}
finpara
string1{0}:= chr(ord(string1{0})-ncar)
-
Procedimiento mi_insert;
Variables
i,j: integer;
aux: string;
Parámetros
string1: string;
string2: string;
index: integer;
j:= 0
Para i:= index + ord(string1{0}) to ord(string2{0}) hacer
j:= j+1
aux{j}:= string2{i}
finpara
Para i:= 1 to ord(string1{0}) hacer
string2{index+i-1}:= string1{i}
finpara
Para i:= 1 to ord(aux{0}) hacer
string2{index+ord(string1{0})+i-1}:= aux{i}
finpara
string2{0}:= chr(index+ord(string1{0})-1)
-
Función mi_length: integer;
Parámetros
string1: string;
mi_length:= ord(string1{0})
-
Función mi_pos: integer;
Variables
encontrado: boolean;
pcad,pscad: integer;
Parámetros
string1,string2: string;
Pcad:= 1
Pscad:= 1
Encontrado:= false;
Mientras (not encontrado) y (pcad<= ord(string2{0})) hacer
Si string2{pcad}<> string1{pscad} entonces
pcad:= pcad+1
pscad:= 1
sino
si pscad = ord(string1{0}) entonces
encontrado:= true
sino
pcad:= pcad+1;
pscad:= pscad+1
finsi
finsi
finmientras
Mi_pos:= (pcad-pscad)+1
-
Procedimiento mi_str;
Variables
aux, a, pos, i, cont: integer;
parado: boolean;
Parámetros
numero: integer,
string1: string;
I:= 0
Cont:= 10000
Parado:= false
Mientras (i<=5) and (not parado) hacer
a:= numero div cont
Si a<> 0 entonces
parado:= true
pos:= 5-i
finsi
cont:= cont div 10
i:= i+1
finmientras
Cont:= 1
Si pos>1 entonces
Para i:= 1 hasta pos-1 hacer
cont:= cont*10
finpara
finsi
Aux:= numero
Para i:= 1 hasta pos hacer
string1{i}:= chr((aux div cont) + 48)
aux:= aux - ((ord(string1{i})-48)*cont)
cont:= cont div 10
finpara
string1{0}:= chr(pos)
Procedimiento mi_val;
Variables
i: integer;
error: boolean;
Parámetros
string1: string;
numero: integer;
coderr: integer;
Cd:= 0
Numero:= 0
I:= 1
Error:= false
Mientras (i<= ord(string1{0})) and (not error) hacer
Si (ord(string1{i})>= 48) y (ord(string1{i})<=57) entonces
numero:= numero*10+(ord(string1{i})-48)
sino
si (string1{1}<>`-') entonces
numero:= 0
coderr:= i
error:= true
finsi
finsi
i:= i+1
finmientras
Si (string1{1}=`-') entonces
numero:= -numero
-
Procedimiento Tkstr;
Variables
i: integer;
c: char;
Parámetros
string1: string;
cifras: integer;
Repetir
c:= readkey
hasta (ord(c) = 45) o ((ord(c)>= 65) y (ord(c)<=90)) o ((ord(c)>= 97) y (ord(c)<=122)) o ((ord(c)>= 128) y (ord(c)<=165)) o (ord(c)=13) o (ord(c)=8)
I:= 1
String1:= `'
Mientras (c<>chr(13)) hacer
Si ord(c)= 8 entonces
Si i>1 entonces
i:= i-1
escribir(chr(8))
escribir(chr(32))
escribir(8)
finsi
sino
Si i<= cifras entonces
string1{i}:= c
escribir(c)
i:= i+1
sino
sound(6000)
delay(100)
nosound
finsi
finsi
Repetir
c:= readkey
hasta (ord(c) = 45) o ((ord(c)>= 65) y (ord(c)<=90)) o ((ord(c)>= 97) y (ord(c)<=122)) o ((ord(c)>= 128) y (ord(c)<=165)) o (ord(c)=13) o (ord(c)=8)
finmienras
string1{0}:= chr{i-1}
-
Procedimiento Tkint;
Variables
ca: string;
e,i: integer;
c: char;
Parámetros
numero: integer;
ndigitos: integer;
Repetir
c:= readkey
hasta (ord(c) = 45) o ((ord(c)>=48) y (ord(c)<= 57)) o (ord(c)= 13) o (ord(c)= 8)
I:= 1
Ca:= `'
Mientras (c<> chr(13)) hacer
Si c=`-' entonces
Si i= 1 entonces
ca{i}:= c
escribir(c)
i:= i+1
finsi
sino
Si ord(c) =8 entonces
Si i>1 entonces
i:= i-1
escribir (chr(8))
escribir (chr(32))
escribir (chr(8))
finsi
sino
Si i<= cifras entonces
ca{i}:= c
escribir(c)
i:= i+1
sino
sound(5000)
delay(100)
nosound
finsi
finsi
finsi
Repetir
c:= readkey
hasta (ord(c) = 45) o ((ord(c)>=48) y (ord(c)<= 57)) o (ord(c)= 13) o (ord(c)= 8)
finmientras
Ca{0}:= chr(i-1)
Mi_val(ca,numer,e)
-
Función StrUpcase: string;
Variables
i: integer;
aux: string;
Parámetros
string1: string;
Para i:= 1 hasta ord(string1{0}) hacer
aux{i}:= upcase(string1{i})
finpara
Ord(aux{0}):= ord(string1{0});
String1:= aux
Código comentado
Unit mi_unit;
Interface
Uses crt;
-
Function mi_concat(string1,string2: string): string;
{Nombre: mi_concat
Descripción: nos devolverá en una string la concatenación de todas las
cadenas
Parámetros de entrada:
- string1,string2: las dos cadenas a concatenar
Variables locales:
- i : el contador de la posición de la frase final
- aux: en esta frase guardaremos la concatenación de las anteriores}
-
Function mi_Copy(string1: string;indice:integer;ncar: integer): string;
{Nombre: mi_Copy
Descripción: muestra de la cadena, a partir de inicio, tantos caracteres como
indique l
Parámetros de entrada:
- string1: es la frase principal de la que vamos a mostrar los caracteres.
- índice : es la posición a partir de la cual vamos a mostrarlos
- ncar : es el número de caracteres a mostrar
Variables locales:
- i : es el contador de los caracteres que vamos copiando
- aux: es la frase en la que nos apoyamos para copiar las letras}
-
Procedure mi_delete(string1: string;indice: integer;ncar: integer);
{Nombre: MI_DELETE.
Descripción: Borra l caracteres en una cadena a partir de la posición ini,
introducida por teclado.
Parámetros de entrada:
indice: Indica la posición a partir de la cual borrar.
ncar: Indica el número de caracteres a borrar.
Parámetros de salida:
string1: Es la cadena principal sobre la cual vamos a borrar.
Variables locales:
i: Indice.}
-
Procedure mi_insert(string1,string2: string;index: integer);
{Nombre: mi_insert
Descripción: insertamos la subcadena 'nuevo' en 'cadena' en la posición
'inicio'
Parámetros de entrada:
- string1 : subcadena que insertamos
- Index: posición de la cadena principal en la cual insertamos
Parámetros de salida:
- string2: frase en la cual insertamos.
Variables locales:
- j : posición de la frase auxiliar
- i : posición de la cadena principal
- aux: la utilizamos para guardar la parte siguiente a donde insertamos}
-
Function mi_length(string1: string): integer;
{Nombre: mi_length
Descripción: nos da el tamaño de la frase
Parámetros de entrada:
- string1: es la frase de la que hayamos su tamaño.}
-
Function mi_pos(string1,string2: string): integer;
{Nombre: mi_pos
Descripción: busca la posición en la que se encuentra la subcadena dentro
de la cadena principal
Parámetros de entrada:
- string1: es la cadena a buscar dentro de la principal
- string2: es la frase principal
Variables locales:
- pcad : es el contador de la posición de la cadena principal que esta
mos comparando con la primera letra de la subcadena.
- pscad : es el contador de la posición de la subcadena que estamos
comparando con la principal.
- encontrado: nos confirma que hemos encontrado la posición de la subcadena}
-
Procedure mi_str(numero: integer;string1: string);
{Nombre: MI_STR.
Descripción: Convierte una variable de tipo integer en una de tipo string.
Parámetros de entrada:
numero: Número de tipo integer que vamos a transformar.
Parámetros de salida:
string1: Variable de tipo string en la que almacenaremos el número.
Variables locales:
aux: Variable de tipo integer que utilizamos para guardar el número
a transformar y poder operar con él.
a: Variable que usamos para apoyarnos al hallar el número de dígitos
de subnum.
cont: Contador que usamos para ir haciendo sucesivas divisiones por
10, 100, etc.. y hallar las unidades, decenas, etc...
i: Indice.
parado: Boolean que nos dice en el primer while cuando hemos
hallado el número de cifras de subnum y que hay que parar.}
-
Procedure mi_val(string1: string; numero: integer; coderr: integer);
{Nombre: mi_val
Descripción: convierte una cadena de caracteres numéricos en un entero
Parámetros de entrada:
- string1: es la cadena que debemos convertir en número
Parámetros de salida:
- numero: es el número que hemos hallado
- cd : nos indica la posición del error
Variables locales:
- i : contador de la posición del string de caracteres
- error: nos indica si en el string hay algún carácter no numérico}
-
Procedure tkstr (var string1: string; cifras:integer);
{Nombre: tkstr
Descripción: devolverá una cadena en la variable pasada como primer parámetro,
que como máximo deberá tener cifras caracteres.
Parámetros de entrada:
- cifras: nos indica la longitud máxima del integer que vamos a insertar
Parámetros de salida:
- string1: es la frase que vamos creando.
Variables locales:
- i : es la longitud del string que vamos creando
- c : es el carácter que vamos insertando}
-
Procedure tkint(cifras:integer;var numer:integer);
{Nombre: tkint
Descripción:
Parámetros de entrada:
- cifras: nos indica la longitud máxima del integer que vamos a insertar
Parámetros de salida:
- numer: es el integer creado
Variables locales:
- ca: es el string en el que vamos creando
- i : es la longitud del string que vamos creando
- c : es el carácter que vamos insertando
- e: lo utilizamos para que no halla problemas con el procedure mi_val}
-
Function strupcase(string1: string): string;
{Nombre: strupcase
Descripción: devuelve la cadena pasada como parámetro en mayúsculas.
Parámetros de entrada:
- string1: es la frase que vamos a convertir en mayúsculas
Variables locales:
- i: posición de la palabra
- aux: frase auxiliar en la que nos apoyamos}
Implementation
-
Function mi_concat;
Var
i: integer;
aux: string;
begin
For i:= 1 to (ord(string1[0]) + ord(string2[0])) do
if i<= ord(string1[0]) then
aux[i]:= string1[i]
else
aux[i]:= string2[i-ord(string1[0])];
aux[0]:= chr(ord(string1[0])+ord(string2[0]));
mi_concat:= aux
end;
-
Function mi_copy;
Var
i: integer;
aux: string;
begin
For i:= 1 to ncar do
aux[i]:= string1[indice+i-1];
if indice+ncar<=ord(string1[0]) then
aux[0]:= chr(ncar)
else
aux[0]:= chr(ord(string1[0])-indice+1);
mi_copy:= aux;
end;
-
Procedure mi_delete;
var
i:integer;
{- Consiste simplemente en desplazar l posiciones hacia la izquierda los
caracteres que queden a la derecha de l+ini.}
begin
for i:=ncar+indice to length(string1) do
string1[i-ncar]:=string1[i];
string1[0]:=chr(ord(string1[0])-ncar);
end;
-
Procedure mi_insert;
var
i,j: integer;
aux: string;
begin
j:= 0;
For i:= index+ ord(string1[0]) to ord(string2[0]) do
begin
j:= j+1;
aux[j]:= string2[i]
end;
For i:= 1 to ord(string1[0]) do
string2[index+i-1]:= string1[i];
For i:= 1 to ord(aux[0]) do
string2[index+ord(string1[0])+i-1]:= aux[i];
string2[0]:= chr(index+ord(string1[0])-1);
end;
-
Function mi_length;
begin
mi_length:= ord(string1[0]);
end;
-
Function mi_pos;
Var
encontrado:boolean;
pcad,pscad:integer;
Begin
pcad:=1;
pscad:=1;
encontrado:=false;
while (not encontrado) and (pcad<=ord(string2[0])) do
begin
if string2[pcad]<>string1[pscad] then
begin
pcad:=pcad+1;
pscad:=1
end
else
if pscad=ord(string1[0]) then
encontrado:=true
else
begin
pcad:=pcad+1;
pscad:=pscad+1
end
end;
mi_pos:=(pcad-pscad)+1
End;
-
Procedure mi_str;
var
aux,a,pos,i,cont:integer;
parado:boolean;
{- Primero hallamos el número de digitos que tiene subnum utilizando un
while y haciendo sucesivas divisiones entre 10.000, 1.000, etc.. hasta
que sea distinto de 0. Entonces 5-i nos indicará el número de cifras.
- Luego inicializamos el contador dependiendo del número de cifras de subnum.
- Despues con un for desde i=1 hasta el número de cifras de subnum, le
asignamos a subc[i] el caracter que corresponde al auxiliar dividido
entre el contador, y le restamos al auxiliar el contador multiplicado
por el resultado de la primera división, quedando así un número con una
cifra menos por la izquierda.
- Luego se divide el contador entre 10 y se procede sucesivamente hasta
terminar por las unidades.
- Al final se le asigna a la cadena subc el número de posiciones que le
corresponda.}
begin
i:=0;
cont:=10000;
parado:=false;
while (i<=5) and (not parado) do
begin
a:=numero div cont;
if a<>0 then
begin
parado:=true;
pos:=5-i;
end;
cont:=cont div 10;
i:=i+1;
end;
cont:=1;
if pos>1 then
for i:=1 to pos-1 do
cont:=cont*10;
aux:=numero;
for i:=1 to pos do
begin
string1[i]:=chr((aux div cont)+48);
aux:=aux-((ord(string1[i])-48)*cont);
cont:=cont div 10;
end;
string1[0]:=chr(pos);
end;
-
Procedure mi_val;
var
i: integer;
error: boolean;
begin
cd:= 0;
numero:= 0;
i:= 1;
error:= false;
While (i<= ord(string1[0])) and (not error) do
begin
if (ord(string1[i])>=48) and (ord(string1[i])<=57) then
numero:= numero*10+(ord(string1[i])-48)
else
begin
if (string1[1] <> '-') then
begin
numero:= 0;
coderr:= i;
error:= true
end
end;
i:= i+1
end;
if (string1[1]= '-') then
numero:= -numero
end;
-
Procedure tkstr;
var
i:integer;
c:char;
begin
repeat
c:=readkey;
Until (ord (c) = 45) or ((ord(c)>=65) and (ord(c)<=90)) or ((ord(C)>=97) and (ord(c)<= 122))
or ((ord(c)>=128) and (ord(c)<= 165)) or (ord(c)=13) or (ord(c)=8);
i:=1;
string1:='';
while (c<>chr(13)) do
begin
if ord(c)=8 then
begin
if i>1 then
begin
i:=i-1;
write(chr(8));
write(chr(32));
write(chr(8))
end
end
else
begin
If i <=cifras then
begin
string1[i]:=c;
write(c);
i:=i+1
end
else
begin
sound (6000);
delay (100);
nosound;
end;
end;
repeat
c:=readkey;
Until (ord (c) = 45) or ((ord(c)>=65) and (ord(c)<=90)) or ((ord(C)>=97) and (ord(c)<= 122))
or ((ord(c)>=128) and (ord(c)<= 165)) or (ord(c)=13) or (ord(c)=8);
end;
string1[0]:=chr(i-1);
end;
-
Procedure tkint;
var
ca:string;
e,i:integer;
c:char;
begin
repeat
c:=readkey;
Until (ord (c) = 45) or ((ord(c)>=48) and (ord(c)<=57)) or (ord(c)=13) or (ord(c)=8);
i:=1;
ca:='';
while (c<>chr(13)) do
begin
if c='-' then
begin
if i=1 then
begin
ca[i]:=c;
write(c);
i:=i+1
end
end
else
if ord(c)=8 then
begin
if i>1 then
begin
i:=i-1;
write(chr(8));
write(chr(32));
write(chr(8))
end
end
else
begin
If i <=cifras then
begin
ca[i]:=c;
write(c);
i:=i+1
end
else
begin
sound (6000);
delay (100);
nosound;
end;
End;
Repeat
c:=readkey;
Until (ord (c) = 45) or ((ord(c)>=48) and (ord(c)<=57)) or (ord(c)=13) or (ord(c)=8);
end;
ca[0]:=chr(i-1);
mi_val(ca,numer,e);
end;
-
Function StrUpcase;
Var
i: integer;
aux: string;
Begin
For i:= 1 to ord(string1{0}) do
aux[i}:= upcase(string1{i});
ord(aux{0}):= ord(string1{0});
string1:= aux
end;
End.
Explicación de la implantación de la librería
Tras escribir el programa en Pascal, debemos guardar el archivo con el mismo nombre físico que el que le hemos dado al definir la unidad. El lugar en el que guardaremos el archivo será el mismo directorio en el cual se encuentran las unidades (en nuestro caso, c:\compi\pascal\units).
Por último y para conseguir que Pascal convierta el archivo en una librería debemos ir al menú Compiler y hacer click con el mouse donde pone Destination Memory pasando a convertirlo en Destination Disk. Una vez hecho esto debemos compilar el archivo, pulsando F9. De esta manera, Pascal, al leer en la cabecera del programa la palabra Unit en lugar de Program, convierte nuestro archivo en una unidad más que pueden utilizar los usuarios del programa.
Si queremos utilizar nuestra librería para un futuro programa de Pascal, en dicho programa, a la hora de definir las librerías a utilizar deberemos incluir Uses mi_unit. A partir de ese momento, trabajaremos con las funciones y procedimientos de dicha librería como si fuesen propios de Pascal.
Descargar
Enviado por: | Aitor Bilbao |
Idioma: | castellano |
País: | España |