Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1 - Introduccin
Una de las mayores dificultades con las que se encuentran los
hispanoparlantes que empiezan a programar es el idioma.
Por una parte, la mayora de lenguajes de programacin se basan en el ingls,
por lo que un estudiante de habla hispana tiene que aprender que "write" o
"print" son las palabras equivalentes a "escribir".
Adems, la mayora de lenguajes tienen rdenes que realmente son
abreviaturas de una o varias palabras inglesas, de modo que el aprendiz tiene
que entender o memorizar palabras como "printf" o "writeln" incluso para
realizar las tareas ms sencillas.
Para colmo, la mayora de entornos de programacin estn tambin en ingls
(mens, mensajes de error y aviso, etc).
Por eso, una herramienta habitual para ayudar a los que empiezan es el
"Pseudocdigo", algo as como un falso lenguaje de programacin en
espaol, que ayuda a asimilar con ms facilidad las ideas bsicas.
El pseudocdigo soluciona el primer problema: no hace falta aprender ingls
para entender los conceptos bsicos. Pero "histricamente" no solucionaba el
problema del "entorno de programacin": no existan entornos para programar
en pseudocdigo, as que tpicamente ha sido una herramienta para usar "con
lapiz y papel".
Algunas universidades han creado sus propios "intrpretes de pseudocdigo",
para ayudar a los alumnos de primer curso a crear los programas "pensando
en espaol", pero permitindoles adems probar esos programas desde un
entorno "casi real".
Existen varios de estos "intrpretes de pseudocdigo", que permiten teclear
nuestro programa y ver cual sera el resultado, pero hay uno que me parece
especialmente bueno: PSEINT, que adems realza con colores la sintaxis de
nuestros programas para ayudar a detectar errores, tiene autocompletado para
permitir ganar tiempo, est disponible para Windows y Linux, es gratuito (1), etc.
ste es el que usaremos en este curso introductorio.
Eso s, no existe un estndar claro en cuanto a pseudocdigo, puede que la
sintaxis que empleen en tu universidad o centro de estudios sea ligeramente
diferente a la que veremos aqu. Aun as, esperamos poder ayudarte a coger
con facilidad las nociones bsicas.
(1) PSEINT realmente es "de cdigo abierto": cualquiera puede ver cmo est creado, de
forma que incluso si su autor perdiera el inters por el proyecto, otras personas podran
retomarlo, lo que le garantiza una vida mucho mayor.
2 - Toma de contacto
Vamos a empezar por lo ms sencillo: escribir en pantalla.
Si queremos crear un programa que escriba algo en pantalla, usaremos la
orden ESCRIBIR. A continuacin de esta palabras, entre comillas, escribiremos
el texto que queremos que aparezca en pantalla.
Escribir "Hola"
3 - Variables
Vamos a hacer algo un poco ms complejo: vamos a sumar dos nmeros que
no estn prefijados dentro del programa, sino que deber teclear el usuario.
Para eso, usaremos la orden "Leer", que nos permite leer lo que el usuario
teclee y dejarlo guardado para utilizarlo despus. Debemos dar un nombre
temporal a estos datos que leemos del usuario. Parece razonable que el primer
n mero que teclee el usuario se llame algo como " primerNumero", y el
segundo sea algo como "segundoNumero ". El resultado que queremos
obtener ser la suma de ese primer nmero y ese segundo nmero, as que
nuestro programa podra quedar as:
Proceso Ejemplo003
Escribir "Dime un numero"
Leer primerNumero
Escribir "Dime otro numero"
Leer segundoNumero
Escribir "Su suma es ", primerNumero + segundoNumero
FinProceso
Por otra parte, no siempre querremos que el valor de una variable lo introduzca
el usuario. Habr veces que seamos nosotros mismos los que demos el valor
inicial a una variable desde nuestro programa, bien para usarlo en una serie de
clculos posteriores, o bien por legibilidad (es ms fcil entender algo como
"longitudCircunferencia = 2 * pi * radio" que algo como "longitudCircunferencia
= 6.28 * radio".
La forma de dar un valor a una variable es con la secuencia de smbolos "<-":
radio <- 3
longitudCircunferencia <- 2 * pi * radio
Y qu ocurre si usamos una variable sin haberle dado valor? Esto pasa a
veces por despiste, si tecleamos mal el nombre de una variable, como en este
fragmento de programa:
primerNumero <- 2
Escribir
primerNmero
Si lees ese fragmento con cuidado, vers que el nombre de la variable que
aparece en la segunda lnea es incorrecto, falta la letra "u". Qu sucede en
ese caso? En algunos lenguajes (pocos, afortunadamente) se da por sentado
que es una variable nueva, y se le da el valor 0; en el caso de PseInt, igual que
en la mayora de lenguajes actuales, obtendremos un mensaje de error que
nos dir que estamos usando una variable que no tena valor.
Ejercicio de repaso propuesto 3.1: Crea un programa que escriba el
resultado de multiplicar los dos nmeros que introduzca el usuario
Ejercicio de repaso propuesto 3.2: Crea un programa que calcule la
superficie de un rectngulo a partir de su base y su altura, y que despus
muestre el valor de dicha superficie.
Ejercicio de repaso propuesto 3.3: Crea un programa que calcule la
superficie de un crculo a partir de su radio (la frmula es "PI * radio 2") y que
despus muestre el valor de dicha superficie (pista: para calcular el cuadrado
de un nmero basta con multiplicar el nmero por l mismo: x 2=x*x).
pasos_a_dar_si_es_falso
FinSi
El bloque "Si No" es opcional: podemos optar por no indicar lo que queremos
que se haga cuando no se cumpla la condici n.
Para ayudarnos a planificar el comportamiento de una secuencia de
instrucciones, se suele usar como ayuda los llamados "diagramas de flujo". En
estos diagramas, una condicin se representa como un rombo, del que salen
dos flechas: una para la secuencia de acciones a realizar si se cumple la
condicin y otra para cuando no se cumple:
Slo tenemos que escribir la condicin que realmente nos interesa, y la serie
de pasos a dar si se cumple y si no se cumple, de modo que nuestro programa
podra quedar as :
Proceso Ejemplo004
FinProceso
En ese ejemplo hemos comparado si un valor es mayor que el otro ( >). Los
operadores de comparacin que tenemos disponibles son:
Operador relacional
Significado
Ejemplo
>
Mayor que
3>2
<
Menor que
"ABC"<"abc"
Igual que
4=3
<=
"a"<="b"
>=
4>=5
Significado
Ejemplo
&Y
Conjuncin (y).
|O
Disyuncin (o).
~ NO
Negacin (no).
~(2<5) //falso
El bloque "De Otro Modo" es opcional: si detallamos todos los valores posibles,
no sera necesario utilizarlo.
El nmero de valores que podemos probar es indefinido: no tiene por qu ser 3,
sino que pueden ser menos casos o muchos ms.
Segn la variante de pseudocdigo (o el lenguaje de programacin) que
empleemos, puede haberrestricciones en el tipo de datos que es aceptable.
Por ejemplo, en el caso de PseInt, la variable tiene que tener un valor
numrico, no puede ser un texto.
Al igual que ocurra con la orden SI, existe un s mbolo que podemos usar en
los diagramas de flujo para ayudarmos a planificar nuestro programa (aunqe
este smbolo est menos extendido que el de SI):
Slo tenemos que escribir la condicin que realmente nos interesa, y la serie
de pasos a dar si se cumple y si no se cumple, de modo que nuestro programa
podra quedar as :
Proceso EjemploCasos
Escribir "Introduzca la nota";
Leer nota;
Segun nota Hacer
10:
Pero no siempre habr que comprobar condiciones una nica vez. Es muy
frecuente que haya que hacerlo de forma repetitiva. Por ejemplo, "pedir una
contrasea al usuario hasta que sea la correcta", o an ms cercano al mundo
real, "pedir una contrasea al usuario hasta que sea la correcta o agote sus
intentos". De eso hablaremos en la prxima entrega.
Ejercicio de repaso propuesto 5.1: Crea un programa que pida un nmero al
usuario un nmero de mes (por ejemplo, el 4) y escriba el nombre del mes
correspondiente (por ejemplo, "abril").
Por ejemplo, un programa capaz de sumar muchos nmeros, todos los que el
usuario quisiera, y en el que hubiera que escribir "0" para indicar que queremos
terminar, podra ser as:
Proceso Mientras01
Escribir "Dime un numero";
Leer x;
suma <- 0;
Mientras x <> 0 Hacer
suma <- suma + x;
Escribir "Hasta ahora, la suma es ", suma;
Escribir "Dime otro numero";
Leer x;
FinMientras
Escribir "Terminado";
FinProceso
Por ejemplo, un programa que pida al usuario una clave de acceso, y que no le
permita seguir hasta que la introduzca correctamente, se podra hacer as:
Proceso Repetir01
Repetir
Escribir "Dime tu clave de acceso";
Leer clave;
Si clave <> 1234 Entonces
Escribir "Clave incorrecta";
FinSi
Hasta Que clave=1234
Escribir "Bienvenido!";
FinProceso
Por ejemplo, un programa que mostrara los nmeros del 1 al 10, podra ser:
Proceso Para01
Para x <- 1 Hasta 10 Hacer
Escribir x;
FinPara
FinProceso
Y obtendramos:
Hemos visto casi todas las construcciones que podremos encontrar en los
lenguajes de programacin convencionales (y, por tanto, al planificarlos usando
pseudocdigo). En la prxima entrega veremos alguna otra posibilidad, como el
manejo de matrices y las funciones matemticas, para pasar despus a
algunos ejemplos completos.
Ejercicio de repaso propuesto 8.1: Crea un programa que escriba los
mltiplos del 3, desde el 3 hasta el 30.
Ejercicio de repaso propuesto 8.2: Crea un programa que escriba los
nmeros del 20 al 10, descendiendo.
Ejercicio de repaso propuesto 8.3: Crea un programa que escriba la tabla de
multiplicar del 5: desde "5 x 0 = 0" hasta "5 x 10 = 50"
9 - Matrices
Cuando necesitamos manejar muchos datos, generalmente hay soluciones
ms efectivas que tener muchas variables. Por ejemplo, si hay que guardar 100
nmeros, suele ser ms eficiente almacenar esos 100 datos "juntos", formando
una "matriz", en vez de usar 100 variables distintas.
Dimension datos[6]
FinProceso
10 - Funciones matemticas.
Casi cualquier lenguaje de programacin tiene incorporadas ciertas funciones
matemticas, de modo que nos permita calcular races cuadradas, logaritmos,
senos y cosenos, etc.
Lo mismo ocurre en muchas variantes de pseudocdigo. Por ejemplo, PseInt
incluye las siguientes funciones matemticas:
Funcin
Significado
RC(X)
Raz Cuadrada de X
ABS(X)
Valor Absoluto de X
LN(X)
Logaritmo Natural de X
EXP(X)
Funcin Exponencial de X
SEN(X)
Seno de X
COS(X)
Coseno de X
TAN(X)
Tangente de X
ASEN(X)
Arco seno de X
ACOS(X)
Arco coseno de X
ATAN(X)
Arco tangente de X
TRUNC(X)
Parte entera de X
REDON(X)
Entero ms cercano a X
AZAR(X)
11 - Ejercicios resueltos
a) Enunciados
1.- Crear un algoritmo que escriba "Hola" cinco veces.
2.- Crear un algoritmo que pida al usuario un nmero y le diga si es positivo,
negativo o cero.
3.- Crear un algoritmo que pida al usuario 5 datos y muestre su suma.
4.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca
el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de
error y volver a pedirlo (tantas veces como sea necesario).
5.- Crear un algoritmo que pida al usuario un nmero y un smbolo, y dibuje un
cuadrado usando ese smbolo. El cuadrado tendr el tamao que ha indicado
el usuario. Por ejemplo, si el usuario introduce 4 como tamao y * como
smbolo, deber escribirse algo como:
****
****
****
****
Proceso Resuelto01
Para x <- 1 Hasta 5 Hacer
Escribir "Hola";
FinPara
FinProceso
Proceso Resuelto02
Escribir "Dime un numero";
Leer x;
Si x > 0 Entonces
Escribir "Es positivo";
Sino
Si x < 0 Entonces
Escribir "Es negativo";
Sino
Escribir "Es cero";
FinSi
FinSi
FinProceso
Proceso Resuelto03
suma <- 0
Para x <- 1 Hasta 5 Hacer
Escribir "Dime un dato";
Leer x;
suma <- suma + x;
FinPara
Escribir "Su suma es ", suma;
FinProceso
Proceso Resuelto03
Dimension dato[5]
suma <- 0
4.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca
el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de
error y volver a pedirlo (tantas veces como sea necesario).
// 4.- Crear un algoritmo que calcule la raz cuadrada del nmero
// que introduzca el usuario. Si se introduce un nmero negativo,
// debe mostrar un mensaje de error y volver a pedirlo
// (tantas veces como sea necesario).
Proceso Resuelto04
Repetir
Escribir "Dime un numero";
Leer x;
Si x < 0 Entonces
Escribir "No puede ser negativo";
FinSi
Hasta Que x >= 0
FinProceso
Proceso Resuelto05
Escribir "Dime el lado";
Leer lado;
Escribir "";
FinPara
FinProceso
12 - Ejercicios propuestos
1.- Crear un algoritmo que pida al usuario 10 datos y muestre su promedio.
2.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca
el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de
error y volver a pedirlo (tantas veces como sea necesario).
3.- Crear un algoritmo que pida al usuario 3 datos y diga cual es el mayor de
los tres.
4.- Crear un algoritmo que pida al usuario 5 datos, luego le pida un valor con el
que comparar, y finalmente diga cuales de esos 5 datos son mayores que el
valor de comparacin.
5.- Crear un algoritmo que resuelva una ecuacin de segundo grado del tipo
ax2+bx+c=0. Las soluciones son x1 = (- b + raiz (b2 - 4ac)) / (2 a) , x2 = (- b - raiz
(b2 - 4ac)) / (2 a)
6.- Crear un algoritmo que genere un nmero al azar entre el 1 y el 1000, y d
al usuario la oportunidad de acertarlo en 10 intentos. Tras cada intento se le
dir si ha acertado (y en ese caso terminar la ejecucin), si se ha quedado
corto o si se ha pasado.
7.- Crear un algoritmo que pida al usuario una cantidad no definida de datos y
calcule su suma. Debe estar preparado para un mximo de 100 nmeros, que
pedir de uno en uno. Cuando se introduzca un valor 0, mostrar la suma de
todos los anteriores y terminar la ejecucin.
8.- Crear un algoritmo que pida al usuario que introduzca una frase, y diga
cuntas veces contiene la letra A (ya sea en maysculas o en minsculas).
Para resolver problemas reales de computacin, hay otras dos funciones que
dan mucho ms juego: una nos dicen la longitud de una cadena y otra permite
extraer una subcadena, desde cierta posicin inicial hasta cierta posicin final:
Proceso Cadenas02
Escribir "Dime tu nombre"
Leer texto
(Si dejamos las opciones de PseInt sin modificar, las posiciones dentro de la
cadena se empezarn a contar desde uno; ya sabemos, como vimos en el
apartado sobre "Matrices", que en muchos otros lenguajes de programacin se
empieza a contar desde cero).
Tambin tenemos la posibilidad de "concatenar" dos cadenas, para formar una
nueva cadena a partir de esas dos seguidas. As el quinto ejercicio resuelto se
podra plantear tambin creando una Pero todava no est tan bien como
debera: siempre estamos escribiendo 20 guiones, aunque el texto sea ms
largo o ms corto. En la mayora de lenguajes de programacin se puede
indicar detalles adicionales ("parmetros") para que se puedan utilizar desde
dentro de esa subrutina. Por ejemplo, en nuestro caso podramos indicarle qu
texto queremos escribir y qu longitud queremos que tenga la secuencia de
guiones:
// Crear un algoritmo que pida al usuario un nmero y un smbolo,
// y dibuje un cuadrado usando ese smbolo. El cuadrado tendr el
// tamao que ha indicado el usuario.
Proceso Resuelto05b
Escribir "Dime el lado"
Leer lado
Leer simbolo
FinProceso
Ejercicios propuestos:
1. Crea un programa que pida su nombre al usuario y lo escriba al revs (de
principio a fin)
2. Crea un programa que pida su nombre al usuario y lo escriba alternando letras
maysculas y minsculas (por ejemplo, "Nacho" se mostrara como "NaChO"
3. Crea un programa que pida su nombre al usuario y diga cuntas vocales
contiene
14 - Creacin de funciones y
procedimientos (subprocesos)
En muchos casos, nos encontraremos con tareas que tenemos que repetir
varias veces en distintos puntos de nuestro programa. Si tecleamos varias
veces el mismo fragmento de programa no slo tardaremos ms en escribir:
adems el programa final resultar menos legible, ser ms tambin ser ms
fcil que cometamos algn error alguna de las veces que volvemos a teclear el
fragmento repetitivo, o que decidamos hacer una modificacin y olvidemos
hacerla en alguno de los fragmentos. Por eso, conviene evitar que nuestro
Proceso SubProcesos02
Escribir " Primer ejemplo"
Subrayar
Subproceso Subrayar
Para x <- 1 Hasta 20 Hacer
Escribir Sin Saltar "-"
FinPara
Escribir ""
FinSubproceso
Mucho ms legible. Pero todava no est tan bien como debera: siempre
estamos escribiendo 20 guiones, aunque el texto sea ms largo o ms corto.
En la mayora de lenguajes de programacin se puede indicar detalles
adicionales ("parmetros") para que se puedan utilizar desde dentro de esa
subrutina. Por ejemplo, en nuestro caso podramos indicarle qu texto
queremos escribir y qu longitud queremos que tenga la secuencia de guiones:
Proceso SubProcesos03
EscribirSubrayado(" Primer ejemplo", 16)
EscribirSubrayado(" Segundo ejemplo", 17)
EscribirSubrayado(" Tercer ejemplo", 16)
FinProceso
FinPara
Escribir ""
FinSubproceso
Subproceso EscribirSubrayado(texto)
Escribir texto
Para x <- 1 Hasta Longitud(texto) Hacer
Escribir Sin Saltar "-"
FinPara
Escribir ""
FinSubproceso
Entonces
resultado <- n1
Sino
resultado <- n2
FinSi
FinFuncion
Proceso Funciones01
Escribir "El mximo de 5 y 12 es:"
Escribir Maximo(5,12);
Escribir "El mximo de 25 y 12 es:"
Escribir Maximo(25,12);
Finproceso
Este programa crea una funcin que calcula cul es el mayor de los dos
nmeros que se le indican como parmetro, y la usa dos veces, para mostrar el
mximo de dos valores prefijados.
No slo pdemos devolver valores numricos; tambin podemos devolver
cadenas (como las funciones que vimos en el apartado 13) o "valores de
verdad" (verdadero, falso). Por ejemplo, podemos crear una funcin que diga si
un nmero es primo o no (lo vamos a hacer de la forma ms simple pero
tambin de la menos eficiente: aplicar la definicin, probando a dividir entre
todos los nmeros que hay entre 1 y n; si hemos encontrado dos divisores -o
menos, para el nmero uno-, entonces el nmero es primo):
SubProceso resultado <- Primo ( num )
cantidadDivisores <- 0
Para cont <- 1 Hasta num Hacer
Si num % cont = 0 Entonces
cantidadDivisores <- cantidadDivisores + 1
FinSi
Fin Para
Si cantidadDivisores <= 2 Entonces
resultado <- verdadero
Sino
resultado <- falso
Fin Si
Fin SubProceso
Proceso PrimosDel1Al30
Para n <- 1 hasta 30
si Primo(n) Entonces
Imprimir n
FinSi
FinPara
FinProceso
Ejercicios propuestos:
1. Crea un subproceso que reciba como parmetro un texto y lo escriba centrado
en pantalla (suponiendo una anchura de 80 columnas)
2. Crea una funcin que reciba un nmero entero y devuelva la cantidad de
divisores (por ejemplo, para el nmero 16, sus divisores son 1, 2, 4, 8, 16,
luego la respuesta debera ser 5).
3. Crea un programa que pida dos nmero enteros al usuario y diga si alguno de
ellos es mltiplo del otro. Crea una funcin EsMultiplo que te ayude a que el
proceso principal sea legible.