Академический Документы
Профессиональный Документы
Культура Документы
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
b a end a, "\n"
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.
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';
C
printf(); scanf();
Pascal
WriteLn(); ReadLn();
Ejemplo en C++
printf( Hola! ); scanf( %d, &x);
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;
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
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 );
C++
if ( x > 10 ) { x = x + 1; j = j + 1; }
Pascal
if ( x > 10 ) then begin x := x + 1; j := j + 1; end;
if ( x > y ) { x = x y; } else { y = y x; }
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;
C++
while ( x > 5) { x = x / 2; y = y 1; }
Pascal
while x > 5 do begin x = x div 2; y = y 1; end;
do {
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:
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 );
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);
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.
const int MAX = 100; int main() { char cadena[MAX]; } gets( cadena );
strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); strcpy( cadena1, cadena2 ); puts( cadena1 ); }
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 ) );
char cadena2[MAX]; strcpy( cadena1, Hola, Mundo ); gets( cadena2 ); if ( strcmp( cadena1, cadena2 ) == 0 printf( Son iguales. ); else printf( Son distintas. ); } ){
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 ); }
puts( cadena1 );
#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 );