Вы находитесь на странице: 1из 16

Traduciendo Pseudocdigo a Pascal y C++ estructurado

Fundamentos de Programacin
1 Introduccin
El pseudocdigo pretende ser un lenguaje de programacin de muy alto nivel, que permite desarrollar ideas sin necesidad de llegar al nivel de detalle de un lenguaje real, pero siendo, a la vez, muy sencillo realizar el paso final de traducir a cualquier lenguaje. El algoritmo del mximo divisor comn consiste en ir reduciendo al mayor de ambos con el otro, hasta llegar a un punto en el que no se pueda reducir ms. Supngase el siguiente algoritmo:
ALGORITMO mcd; VARIABLES a, b: Entero; INICIO LEER( a, b ); MIENTRAS a <> b SI a>b a a b SINO b b a FIN_SI FIN_MIENTRAS ESCRIBIR( MCD=, a ); FIN_ALGORITMO;

Podra ser codificado fcilmente en distintos lenguajes de programacin. Por ejemplo, a continuacin se muestra el algoritmo codificado en BASH (un lenguaje de scripting para UNIX):
#!/bin/bash echo n Introduce a: read a echo n Introduce b: read b while test ! $a -eq $b do if test $a -gt $b then a=`expr $a - $b` else b=`expr $b - $a` fi done echo El MCD es $a

El mismo algoritmo escrito en C++ estructurado sera:


#include <cstdio> int main() { int a, b; printf( "Introduce a: " ); scanf( "%d",&a ); printf( "Introduce b: " );

scanf( "%d",&b ); while ( a != b ){ if ( a > b ) a = a - b; else b = b - a; } printf( "El MCD es %d", a );

Por otra parte, en Pascal sera:


program mcd; var a, b: integer; begin write( 'Introduce a: ' ); readln( a ); write( 'Introduce b: ' ); readln( b ); while a <> b do if a > b then a := a - b else b := b - a; writeln( El MCD es ,a ); end.

En cuanto a lenguajes dinmicos, en Ruby sera:


print "Introduce a: a = gets.to_i print "Introduce b: b = gets.to_i while a != b if a > b a = a else b = b end print "El MCD es ", " "

b a end a, "\n"

Mientras que en Python, tendramos:


a = input( "Introduce b = input( "Introduce while ( a != b ): if ( a > b ): a = else: b = print "MCD = ", a a: " ) b: " ) a - b b - a

Lo que se pretende demostrar con esto es que los lenguajes estructurados emplean distintas notaciones para representar composiciones secuenciales, iterativas o de decisin. Sin embargo, todos los lenguajes tienen los mismos elementos que presentes la notacin algortmica.. En este sentido, dada la diferencia de los lenguajes y su carcter estricto, resulta muy interesante emplear una notacin algortmica que va a resultar ms flexible para poder construir los algoritmos y, una vez construido el algoritmo, fijarse en los detalles del lenguaje de programacin.

2 Traduccin automtica
Dado que el pseudocdigo no es ms que un lenguage genrico, y que todo lo que se puede hacer en pseudocdigo se puede hacer en cualquier lenguaje de programacin, la traduccin de uno a otro debera ser ms o menos automtica. En esta seccin, se comentarn las construcciones ms comunes en pseudocdigo, y se mostrar su equivalente a los lenguajes Pascal y C.

2.1 Comentarios, elementos bsicos, y literales.


Estos son los elementos ms bsicos disponibles en programacin. Muchos de estos elementos bsicos, smplemente, no tienen traduccin en algunos lenguajes de programacin, mientras otros requieren de ms lneas de cdigo. Pseudocdigo
{ comentario } ALGORITMO ejemplo Verdadero, V 'o T Falso, F a 5 ( a = 5 ) true false a = 5; ( a == 5 )

C
/* comentario */ -

Pascal
{ comentario } PROGRAM ejemplo; True False a := 5; ( a = 5 )

A continuacin se muestran algunos valores literales que pueden aparecer en un cualquier programa. Pseudocdigo
Esto es una cadena 5 3.14 'd'

Pascal

Ejemplo en C++

Esto es una 'Esto es una cadena' printf( Hola, mundo ); cadena 5 3.14 'd' 5 3.14 'd' x = 5; area = radio * radio * 3.14; char de = 'd';

2.2 Entrada y salida


Es necesario que un programa se comunique con el usuario. Para ello, normalmente se tienen determinadas funciones disponibles en la biblioteca estndar del lenguaje. Pseudocdigo
ESCRIBIR( Hola! ); LEER( x )

C
printf(); scanf();

Pascal
WriteLn(); ReadLn();

Ejemplo en C++
printf( Hola! ); scanf( %d, &x);

2.3 Constantes y variables


En programacin, las constantes y variables estn normalmente ligadas a un tipo de datos (aunque en posteriores cursos se estudiarn lenguajes no tipados). A continuacin, se muestran los tipos de datos fundamentales. La mayor parte de las veces, los lenguajes de programacin permiten escoger entre tipos de datos ms especficos, aunque todos permiten representar, al menos los fundamentales, que son los que se usan en pseudocdigo, y que se enumeran a continuacin.

Pseudocdigo
Entero int

C++

Pascal
integer

Ejemplo en C
int x; x = 5; int numRuedas = 4; float radio = 4.56; double distancia = 10.8967; bool hecho = true; char x = 'r'; char saludo[64]; strcpy( saludo, Hola, mundo! ); int x[20]; const double PI = 3.1415927;

Real Lgico Carcter Cadena Vector, Matriz Constantes

float, double bool char char [] [] const

Real Boolean char string Array [] of Const

Una nota aparte merecen, en el lenguaje C/C++, las cadenas y vectores. En cuanto a las cadenas, es necesario crear un vector de caracteres, con una longitud suficiente para albergarla. Finalmente, los vectores, al contrario que en lenguajes como Pascal, tienen siempre su primer elemento en 0, y lgicamente terminan en la posicin igual a la longitud del vector menos uno. As, un vector de 5 elementos presenta posiciones de 0, 1, 2, 3 y 4. Adems, en el caso particular de C, el modo de visualizacin y de peticin de variables depende del tipo de las mismas. As, es necesario normalmente especificar lo que se denomina una cadena de formato, que es dependiente del tipo del valor que se desea mostrar o pedir. Tipo
Entero Real Cadena Caracter

Tipo C++
int x; long int x; double r; float r; char cadena[]; char de = 'd';

Entrada
scanf( %d, &x ); scanf( %ld, &x ); scanf( %lf, &r); scanf( %f, &r); scanf( %s, cadena ); scanf( %c, &de );

Salida
printf( %d, x ); printf( %ld, x ); printf( %lf, r ); printf( %f, r ); printf( %s, cadena ); printf( %c, de );

Otra nota de atencin con respecto a C, es que la funcin scanf(), cuando encuentra espacios, para y deja la entrada preparada para otra llamada. As, para pedir cadenas, es probablemente ms til, en general, la funcin gets()1:
int main() { char buffer[ 1024 ]; printf( Dame tu nombre: ); gets( buffer ); printf( Tu nombre es: '%s', buffer );

2.4 Tipos
En el lenguaje pseudocdigo se utiliza una seccin denominada TIPOS. En el lenguaje de programacin C, se utiliza la construccin typedef. Esta construccin permite de hecho crear nuevos tipos, a partir de tipos ya existentes. Su uso consiste en poner esta palabra clave antes del
1 El manejo de cadenas se cubre con mayor profundidad en el apndice A.

tipo, como si se fuera a crear una variable con l, y al final, un identificador que ser a partir de ese momento el nombre del tipo. Por ejemplo:
TIPOS

Direccion = ( Norte, Sur, Este, Oeste ) Punto = REGISTRO x: Real y: Real FIN_REGISTRO

Se implantara en C++ como:


enum Direccion { Norte, Sur, Este, Oeste }; typedef struct { double x; double y; } Punto;

2.5 Partes del programa


Hemos visto que el pseudocdigo tiene una serie de partes fundamentales, que en el caso del lenguaje de programacin C++ son bastante ms flexibles. Es necesario tener en cuenta, en cualquier caso, que en el lenguaje de programacin C++ el punto de entrada del programa es una funcin denominada main(), siendo su primera instruccin la primera instruccin del programa.
ALGORITMO reaDelCirculo { Calcula el rea del crculo, pidiendo el radio por teclado } CONSTANTES PI: Real = 3.1415927 VARIABLES radio : Real INICIO ESCRIBIR( Introduzca el radio: ) LEER( radio ) ESCRIBIR( El resultado es: , radio * radio * PI ) FIN_ALGORITMO

La implantacin en C es la siguiente:
/* areacirculo.cpp reaDelCirculo Calcula el rea del crculo, pidiendo el radio por teclado */ #include <stdio.h> const double PI = 3.1415927; int main() { double radio; printf( Introduzca el radio: ); scanf( %lf, &radio ); printf( \nEl resultado es %f\n, radio * radio * PI ); }

La implantacin en Pascal es ms literal (si bien hay que tener en cuenta que las constantes con tipo no pertenecen al estndar):
Program reaDelCirculo

{ Calcula el rea del crculo, pidiendo el radio por teclado } Const PI: Real = 3.1415927; Var radio: Real; begin Write( Introduzca el radio: ); ReadLn( radio ); WriteLn( El resultado es , radio * radio * PI ); end.

2.6 Descripcin de las tres composiciones de programacin estructurada 2.6.1 Composicin secuencial
La composicin secuencia consiste, simplemete, en poner una instruccin a continuacin de la otra, como se observa a continuacin: Pseudocdigo C++ Pascal i 1; ESCRIBIR( i ) i = 1; printf( %d, i ); i := 1; WriteLn( i );

2.6.2 Composicin condicional


La composicin condicional, segunda caracterstica clave de la programacin estructurada, consiste en permitir realizar decisiones segn se cumpla una condicin o no. Pseudocdigo
SI x>10 x x - 1 j j + 1 FIN_SI

C++
if ( x > 10 ) { x = x + 1; j = j + 1; }

Pascal
if ( x > 10 ) then begin x := x + 1; j := j + 1; end;

SI x>y x x y SINO y y - x FIN_SI

if ( x > y ) { x = x y; } else { y = y x; }

if ( x > y ) then begin x := x y; end else begin y := y x; end;

Un caso particular de la composicin condicional es la seleccin entre varios valores simples (enteros, lgicos o enumerados), una posibilidad presente en muchos lenguajes de programacin.

Pseudocdigo

C++

Pascal
case x of 1, 2:begin x := x + 1; y := y - 1; end; 3: y := y + 1; else z := z 2 ;

CASO x SEA switch( x ) { 1, 2:INICIO case 1: case 2: x x + 1; x = x + y y - 1; FIN y = y 3: y y + 1; break; case 3: SINO: z z 2; y = y + FIN_CASO break; default: z = z }

1; 1; 1; 2;

2.6.3 Composicin iterativa


Finalmente, el tercer gran pilar de la programacin estructurada es la repticin. A continuacin se muestran las construcciones ms frecuentes y su traduccin, en C y Pascal. Pseudocdigo
MIENTRAS x > 5 x x / 2; y y 1; FIN_MIENTRAS

C++
while ( x > 5) { x = x / 2; y = y 1; }

Pascal
while x > 5 do begin x = x div 2; y = y 1; end;

REPETIR LEER( x ); HASTA x < 5;

do {

scanf( %d, &x ); } while( x >= 5 );

repeat ReadLn( x ); until x < 5;

DESDE i 1 HASTA 10 ESCRIBIR( i ) FIN_DESDE

for(i = 1; i <= 10; ++i) { printf( %d, i ); }

for i := 1 to 10 do begin WriteLn( i ); end; for i := 10 downto 1 do begin WriteLn( i ); end;

3 Programacin modular
En esta seccin se mostrar cmo traducir las capacidades de mdulos que se emplean en pseudocdigo, y cmo traducir estas a un lenguaje de programacin.

3.1 Paso por valor y paso por referencia en C 3.1.1 Paso por valor
El paso por valor es el ms sencillo de utilizar, ya que slo es necesario indicar el tipo de la variable, como se ve a continuacin:

int sqr(int x) { return x * x; } int main() { printf( El cuadrado de 2 es %d\n, sqr( 2 ) ); }

3.1.2 Paso por referencia


En C++, el paso por referencia se denota mediante un ampersand delante del identificador del parmetro formal. Si pasamos una variable como parmetro a una funcin, y se utiliza el ampersand marcando el parmetro formal, el valor de la variable habr cambiado al realizar el retorno desde la funcin, que es lo que se desea.
void sqr(int &x) { x = x * x; } int main() { int x = 2; sqr( x ); printf( El cuadrado de 2 es %d\n, x );

3.2 Funciones y procedimientos


Hay trozos de cdigo que se espera que se vayan a necesitar en varias ocasiones, por su utilidad. En lugar de repetirlo una y otra vez, es posible crear una funcin o procedimiento que lo abarque. Estas funciones y procedimientos pueden recibir datos en forma de parmetros, que se denominan formales en la propia funcin o procedimiento, ya que determinan el tipo del dato a recibir, y reales en el momento de la llamada. La diferencia entre funcin y procedimiento estriba, respectivamente, en si se retorna un valor o no. Existen tres modificadores posibles para un parmetro en pseudocdigo: E (parmetro de entrada), S (parmetro de salida), y E/S (parmetro de entrada y salida). A continuacin, un ejemplo de procedimientos con parmetros de salida:
{ Parmetros de Salida pasan a ser parmetros por referencia } procedimiento leerVector(S v: Vector; S numElementos: Entero); procedure leerVector(var v: Vector; var numElementos: Integer); void leerVector(Vector &v, int &numElementos);

Los parmetros de entrada pueden pasar a ser const, y pasarlos como punteros, de manera que el proceso siga siendo rpido, pero a la vez, no se pueda modificar la variable. Recurdese que en C, los vectores siempre se pasan como punteros (ya que, por definicin, el nombre de un vector es un puntero al primer elemento). { Parmetros de entrada pasan a ser const }

procedimiento escribirVector(E v: Vector, E numElementos: Entero); procedure escribirVector(const v: Vector; numElementos : Integer); void escribirVector(const Vector v, int numElementos );

Un ejemplo del mismo concepto con una funcin:


{ Parmetros de entrada pasan a ser const } funcin calcularMedia(E v: Vector; E n: Entero): Real; function calcularMedia(const v: Vector; n: Integer): Real; double calcularMedia(const Vector v, int numElementos);

En cuanto a los parmetros de E/S, son el ejemplo tpico del paso por referencia, sin revestir mayor dificultad.
{ Parmetros de Entrada/Salida pasan a ser parmetros } { pasados por referencia } procedimiento insertar(E/S v: Vector; E/S pos: Entero; E e: Elemento); procedure insertar(var v: Vector; pos: Entero; e: Elemento); void insertar(Vector v, int pos, Elemento e);

3.3 Manejo de mdulos


Los mdulos permiten reunir funciones y procedimientos en una sola entidad. Normalmente, se eligen aquellas funciones y procedimientos que comparten la misma o una finalidad parecida (alta cohesin), y a la vez se espera que ese mdulo pueda trabajar de manera independiente, es decir, que no precise entidades del resto del programa. Pseudocdigo
MODULO nombreModulo; USA modulo1, modulo2; INTERFAZ { ms cosas } IMPLEMENTACIN { ms cosas }

Pascal

C++

UNIT nombreModulo; /* nombremodulo.h USES modulo1, modulo2; nombreMdulo */ INTERFACE { ms cosas } #include modulo1.h IMPLEMENTATION #include modulo2.h { ms cosas } /* INTERFAZ */ /* prototipos y constantes */ /* nombremodulo.cpp nombreMdulo */ #include nombremodulo.h /* IMPLEMENTACIN */ /* definiciones de procedimientos y funciones */

En el lenguaje de programacin C++, al contrario que en el lenguaje de programacin Modula2 (popularizado por Borland Pascal), no existe un soporte explcito para mdulos, sino que, al igual que con el paso por referencia, es necesario construirlo. Para ello, es necesario dividir el cdigo del mdulo en dos archivos: el de interfaz, denominado de cabecera, que es un archivo .h, y el archivo de implantacin, que es un archivo .cpp. Los archivos de cabecera son includos por todos aquellos mdulos que precisen de esa funcionalidad.

4 Apndice A: Manejo de cadenas en pseudodcdigo y C++


En este documento se detallan las equivalencias entre el manejo de cadenas en pseudocdigo y en C++. Ntese que, en general, las libreras de cadenas apenas hacen alguna comprobacin, de que los parmetros pasados sean correctos. Por ejemplo, strcpy() (asignar()) no comprueba que la cadena destino tenga suficiente espacio para albergar los caracteres contenidos en la cadena de origen. Para cada funcionalidad, se ofrece el procedimiento que se emplea en pseudocdigo, y el equivalente en C++.

4.1 Leer cadenas


PROCEDIMIENTO LEER(S cad: cadena[N]) PROCEDIMIENTO gets(S cad: cadena[N])
#include <cstring> #include <cstdio>

const int MAX = 100; int main() { char cadena[MAX]; } gets( cadena );

4.2 Asignar cadenas


PROCEDIMIENTO asignar(S cad1 : cadena[N]; E cad2: cadena[M]) PROCEDIMIENTO strcpy(S cad1 : cadena[N]; E cad2: cadena[M])
#include <cstring> #include <cstdio> const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); strcpy( cadena1, cadena2 );

4.3 Escribir cadenas


PROCEDIMIENTO ESCRIBIR(E cad: cadena[N]) PROCEDIMIENTO puts(E cad: cadena[N])
#include <cstring> #include <cstdio> const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX];

strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); strcpy( cadena1, cadena2 ); puts( cadena1 ); }

PROCEDIMIENTO printf(E cadFmt: cadena[N], E cad: cadena[N])


#include <cstring> #include <cstdio> const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); strcpy( cadena1, cadena2 ); puts( cadena1 ); printf( %s, cadena2 ); }

4.4 Obtener la longitud de una cadena


NOTA: La funcin strlen() implica recorrer toda la cadena. FUNCION longitud(E cad: cadena[N]): entero FUNCION strlen(E cad: cadena[N]): entero
#include <cstring> #include <cstdio>

const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); printf( Longitudes de las cadenas: %d y %d, strlen( cadena1 ), strlen( cadena2 ) );

4.5 Comparar dos cadenas


FUNCION comparar(E cad1,cad2: cadena[N]): entero FUNCION strcmp(E cad1,cad2: cadena[N]): entero
#include <cstring> #include <cstdio> const int MAX = 100; int main() { char cadena1[MAX];

char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); if ( strcmp( cadena1, cadena2 ) == 0 printf( Son iguales. ); else printf( Son distintas. ); } ){

4.6 Concatenar dos cadenas


PROCEDIMIENTO concatenar(E cad1, cad2:cadena[N];S cad3:cadena[N]) PROCEDIMIENTO strcat(S cad1: cadena[N], E cad2: cadena[N])
#include <cstring> #include <cstdio>

const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, ); puts( Dame tu nombre: ); gets( cadena2 ); strcat( cadena1, cadena2 ); puts( cadena1 ); }

4.7 Procedimientos no estndar


Los siguientes procedimientos de manejo de cadenas no son estndar, sino que es necesario utilizar el mdulo strutil, para poder contar con ellos.

4.7.1 Extraer subcadena


PROCEDIMIENTO subcadena (E cad:cadena[N]; E inicio, numCar: Entero; S subcad:cadena[N]) PROCEDIMIENTO strsubstring (E cad:cadena[N]; S subcad:cadena[N]; E inicio, numCar: Entero)
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); strsubstring( cadena1, cadena2, 6, 5 ); puts( cadena2 ); // imprime mundo

4.7.2 Buscar una cadena dentro de otra


FUNCION posicion (E cadenaBuscada, cadenaFuente: cadena[N]):Entero

FUNCION strpos (E cadenaFuente, cadenaBuscada: cadena[N]):Entero


#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; char fmt[MAX]; int pos; gets( cadena1 ); gets( cadena2 ); pos = strpos( if ( pos >= 0 strcpy( else strcpy( } cadena1, cadena2 ); ) fmt, %s est en %s\n, cadena2, cadena1 ); fmt, %s no est en %s\n, cadena2, cadena1 );

printf( fmt, cadena2, cadena1 );

4.7.3 Insertar una cadena en otra


PROCEDIMIENTO insertar (E cadIns:cadena[N]; E/S cad:cadena[N]; E pos:Entero); PROCEDIMIENTO strinsert(E cadIns:cadena[N]; E/S cad:cadena[N]; E pos:Entero);
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; char cadena2[MAX]; strcpy( cadena1, Hola, ); strcpy( cadena2, mundo! ); strinsert( cadena1, cadena2, 0 ); puts( cadena2 );

4.7.4 Borrar parte de una cadena


PROCEDIMIENTO borrar (E/S cad:cadena[Max]; E pos, numCar:Entero) PROCEDIMIENTO strdel (E/S cad:cadena[Max]; E pos, numCar:Entero)
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; strcpy( cadena1, esto no es una prueba ); strdel( cadena1, 4, 3 );

puts( cadena1 );

4.7.5 Reemplezar una subcadena por otra dentro de una cadena


PROCEDIMIENTO reemplazar(E/S cad:cadena[N]; E cad1, cad2:cadena[N]) PROCEDIMIENTO strreplace(E/S cad:cadena[N]; E cad1, cad2:cadena[N])
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; strcpy( cadena1, esto no es una prueba ); strreplacel( cadena1, S, Z ); puts( cadena1 );

4.7.6 Eliminar los espacios delanteros y traseros en una cadena


PROCEDIMIENTO strtrim(E/S cad:cadena[N])
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; strcpy( cadena1, strtrim( cadena1 ); puts( cadena1 ); esto no es una prueba );

4.7.7 Convertir una cadena a maysculas


PROCEDIMIENTO strtoupper(E/S cad:cadena[N])
#include <cstring> #include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; strcpy( cadena1, strtrim( cadena1 ); strtoupper( cadena1 ); puts( cadena1 ); } esto no es una prueba );

4.7.8 Convertir una cadena a minsculas


PROCEDIMIENTO strtolower(E/S cad:cadena[N])
#include <cstring>

#include <cstdio> #include strutil.h const int MAX = 100; int main() { char cadena1[MAX]; strcpy( cadena1, strtrim( cadena1 ); strtolower( cadena1 ); puts( cadena1 ); esto no es una prueba );

Вам также может понравиться